You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

mermaid.js 1.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. const {mermaidMaxSourceCharacters} = window.config;
  2. function displayError(el, err) {
  3. el.closest('pre').classList.remove('is-loading');
  4. const errorNode = document.createElement('div');
  5. errorNode.setAttribute('class', 'ui message error markup-block-error mono');
  6. errorNode.textContent = err.str || err.message || String(err);
  7. el.closest('pre').before(errorNode);
  8. }
  9. export async function renderMermaid() {
  10. const els = document.querySelectorAll('.markup code.language-mermaid');
  11. if (!els.length) return;
  12. const {default: mermaid} = await import(/* webpackChunkName: "mermaid" */'mermaid');
  13. mermaid.initialize({
  14. mermaid: {
  15. startOnLoad: false,
  16. },
  17. flowchart: {
  18. useMaxWidth: true,
  19. htmlLabels: false,
  20. },
  21. theme: 'neutral',
  22. securityLevel: 'strict',
  23. });
  24. for (const el of els) {
  25. if (mermaidMaxSourceCharacters >= 0 && el.textContent.length > mermaidMaxSourceCharacters) {
  26. displayError(el, new Error(`Mermaid source of ${el.textContent.length} characters exceeds the maximum allowed length of ${mermaidMaxSourceCharacters}.`));
  27. continue;
  28. }
  29. let valid;
  30. try {
  31. valid = mermaid.parse(el.textContent);
  32. } catch (err) {
  33. displayError(el, err);
  34. }
  35. if (!valid) {
  36. el.closest('pre').classList.remove('is-loading');
  37. continue;
  38. }
  39. try {
  40. mermaid.init(undefined, el, (id) => {
  41. const svg = document.getElementById(id);
  42. svg.classList.add('mermaid-chart');
  43. svg.closest('pre').replaceWith(svg);
  44. });
  45. } catch (err) {
  46. displayError(el, err);
  47. }
  48. }
  49. }