给博客增加支持mermaid语法和mindmap语法

给博客增加支持mermaid语法和mindmap语法

有时候感觉画个流程图或者思维导图更直观。

使用 Hugo 的 Render Hook 功能(渲染钩子)来支持 Mermaid 流程图。

在 根目录\layouts_default_markup 新建 render-codeblock-mermaid.html

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
<div class="mermaid">
  {{ .Inner | safeHTML }}
</div>

{{ if not (.Page.Scratch.Get "mermaidLoaded") }}
  {{ .Page.Scratch.Set "mermaidLoaded" true }}
  <script type="module">
    import mermaid from 'https://cdn.jsdelivr.net/npm/mermaid/dist/mermaid.esm.min.mjs';
    mermaid.initialize({ startOnLoad: true });
  </script>
{{ end }}

增加支持markmap/mindmap

同样的位置创建 render-codeblock-markmap.html

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
<div class="markmap" style="height: 300px; width: 100%;">
  <script type="text/template">
    {{ .Inner }}
  </script>
</div>

{{ if not (.Page.Scratch.Get "markmapLoaded") }}
  {{ .Page.Scratch.Set "markmapLoaded" true }}
  <script src="https://cdn.jsdelivr.net/npm/d3@7"></script>
  <script src="https://cdn.jsdelivr.net/npm/markmap-view@0.15.4"></script>
  <script src="https://cdn.jsdelivr.net/npm/markmap-lib@0.15.4/dist/browser/index.min.js"></script>
  
  <script>
    document.addEventListener("DOMContentLoaded", () => {
      const { Transformer } = window.markmap;
      const { Markmap, loadCSS, loadJS } = window.markmap;
      const transformer = new Transformer();
      
      document.querySelectorAll('.markmap').forEach((container) => {
        const template = container.querySelector('script[type="text/template"]');
        const markdown = template.textContent;
        // 转换 Markdown 为思维导图数据
        const { root, features } = transformer.transform(markdown);
        
        // 如果有样式和脚本依赖,这里加载
        if (features.styles) loadCSS(features.styles);
        if (features.scripts) loadJS(features.scripts);

        // 渲染,清空容器先
        template.remove(); 
        const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');
        svg.style.width = '100%';
        svg.style.height = '100%';
        container.appendChild(svg);
        
        Markmap.create(svg, null, root);
      });
    });
  </script>
{{ end }}
Licensed under CC BY-NC-SA 4.0
使用 Hugo 构建
主题 StackJimmy 设计