drawio.js 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. {{with .Site.Params.drawio}}
  2. {{if .enable }}
  3. (function () {
  4. var shade;
  5. var iframe;
  6. var insertFrame = function () {
  7. shade = document.createElement('div');
  8. shade.classList.add('drawioframe');
  9. iframe = document.createElement('iframe');
  10. shade.appendChild(iframe);
  11. document.body.appendChild(shade);
  12. }
  13. var closeFrame = function () {
  14. if (shade) {
  15. document.body.removeChild(shade);
  16. shade = undefined;
  17. iframe = undefined;
  18. }
  19. }
  20. var imghandler = function (img, imgdata) {
  21. var url = {{ .drawio_server | default "https://embed.diagrams.net/" | jsonify }};
  22. url += '?embed=1&ui=atlas&spin=1&modified=unsavedChanges&proto=json&saveAndEdit=1&noSaveBtn=1';
  23. var wrapper = document.createElement('div');
  24. wrapper.classList.add('drawio');
  25. img.parentNode.insertBefore(wrapper, img);
  26. wrapper.appendChild(img);
  27. var btn = document.createElement('button');
  28. btn.classList.add('drawiobtn');
  29. btn.insertAdjacentHTML('beforeend', '<i class="fas fa-edit"></i>');
  30. wrapper.appendChild(btn);
  31. btn.addEventListener('click', function (evt) {
  32. if (iframe) return;
  33. insertFrame();
  34. var handler = function (evt) {
  35. var wind = iframe.contentWindow;
  36. if (evt.data.length > 0 && evt.source == wind) {
  37. var msg = JSON.parse(evt.data);
  38. if (msg.event == 'init') {
  39. wind.postMessage(JSON.stringify({action: 'load', xml: imgdata}), '*');
  40. } else if (msg.event == 'save') {
  41. var fmt = imgdata.indexOf('data:image/png') == 0 ? 'xmlpng' : 'xmlsvg';
  42. wind.postMessage(JSON.stringify({action: 'export', format: fmt}), '*');
  43. } else if (msg.event == 'export') {
  44. const fn = img.src.replace(/^.*?([^/]+)$/, '$1');
  45. const dl = document.createElement('a');
  46. dl.setAttribute('href', msg.data);
  47. dl.setAttribute('download', fn);
  48. document.body.appendChild(dl);
  49. dl.click();
  50. dl.parentNode.removeChild(dl);
  51. }
  52. if (msg.event == 'exit' || msg.event == 'export') {
  53. window.removeEventListener('message', handler);
  54. closeFrame();
  55. }
  56. }
  57. };
  58. window.addEventListener('message', handler);
  59. iframe.setAttribute('src', url);
  60. });
  61. };
  62. document.addEventListener('DOMContentLoaded', function () {
  63. // find all the png and svg images that may have embedded xml diagrams
  64. for (const el of document.getElementsByTagName('img')) {
  65. const img = el;
  66. const src = img.getAttribute('src');
  67. if (!src.endsWith('.svg') && !src.endsWith('.png')) {
  68. continue;
  69. }
  70. const xhr = new XMLHttpRequest();
  71. xhr.responseType = 'blob';
  72. xhr.open("GET", src);
  73. xhr.addEventListener("load", function () {
  74. const fr = new FileReader();
  75. fr.addEventListener('load', function () {
  76. if (fr.result.indexOf('mxfile') != -1) {
  77. const fr = new FileReader();
  78. fr.addEventListener('load', function () {
  79. const imgdata = fr.result;
  80. imghandler(img, imgdata);
  81. });
  82. fr.readAsDataURL(xhr.response);
  83. }
  84. });
  85. fr.readAsBinaryString(xhr.response);
  86. });
  87. xhr.send();
  88. };
  89. });
  90. }());
  91. {{end}}
  92. {{end}}