mermaid.html 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. {{ $version := .Site.Params.mermaid.version | default "latest" -}}
  2. {{ $cdnurl := printf "https://cdn.jsdelivr.net/npm/mermaid@%s/dist/mermaid.esm.min.mjs" $version -}}
  3. {{ with try (resources.GetRemote $cdnurl) -}}
  4. {{ with .Err -}}
  5. {{ errorf "Could not retrieve mermaid script from CDN. Reason: %s." . -}}
  6. {{ end -}}
  7. {{ else -}}
  8. {{ errorf "Invalid Mermaid version %s, could not retrieve this version from CDN." $version -}}
  9. {{ end -}}
  10. <script type="module" async>
  11. import mermaid from "{{ $cdnurl }}";
  12. (function ($) {
  13. if ($('.mermaid').length == 0) {
  14. mermaid.initialize({ startOnLoad: false });
  15. return;
  16. }
  17. var params = {{ with .Site.Params.mermaid }}{{ . | jsonify | safeJS }}{{ else }}{}{{- end }};
  18. // Site params are stored with lowercase keys; lookup correct casing
  19. // from Mermaid default config.
  20. var norm = function (defaultConfig, params) {
  21. var result = {};
  22. for (const key in defaultConfig) {
  23. const keyLower = key.toLowerCase();
  24. if (defaultConfig.hasOwnProperty(key) && params.hasOwnProperty(keyLower)) {
  25. if (typeof defaultConfig[key] === "object") {
  26. result[key] = norm(defaultConfig[key], params[keyLower]);
  27. } else {
  28. result[key] = params[keyLower];
  29. }
  30. }
  31. }
  32. return result;
  33. };
  34. var settings = norm(mermaid.mermaidAPI.defaultConfig, params);
  35. settings.startOnLoad = true;
  36. if ($('html[data-bs-theme="dark"]').length) {
  37. settings.theme = 'dark';
  38. }
  39. mermaid.initialize(settings);
  40. // Handle light/dark mode theme changes
  41. const lightDarkModeThemeChangeHandler = function (mutationsList, observer) {
  42. for (const mutation of mutationsList) {
  43. if (mutation.type === 'attributes' && mutation.attributeName === 'data-bs-theme') {
  44. // Mermaid doesn't currently support reinitialization, see
  45. // https://github.com/mermaid-js/mermaid/issues/1945. Until then,
  46. // just reload the page.
  47. location.reload();
  48. }
  49. }
  50. };
  51. const observer = new MutationObserver(lightDarkModeThemeChangeHandler);
  52. observer.observe(document.documentElement, {
  53. attributes: true,
  54. attributeFilter: ['data-bs-theme']
  55. });
  56. // observer.disconnect();
  57. })(jQuery);
  58. </script>