为 hugo-theme-even 提供 mermaid 支持.md
俺如何为 hugo-theme-even 提供 mermaid 支持
如上是一个利用 mermaid 绘制的 SVG 图形 ,相比于直接在某些软件绘制好再截图,显然利用 mermaid 绘图具备诸多优点:
- 网站保存的是带 mermaid的markdown文件,不涉及到图片存储。存储占用小。
- 渲染出图是 SVG格式,上面的文字可以直接拷贝。
- 网站数据传输时是使用 mermaid源码,而不是图片,可以有效减少网站加载过程产生的流量耗费。
如何为你的 Hugo 博客引入 mermaid 支持?
虽然由于 even theme 更新过慢,似乎久已无更多维护,因此本站已经开始使用 LoveIt 作为主题。
但是对于 even theme 而言,本方法应当依旧适用。
对于这一点,俺可以说前人之述备矣。反手就是一堆参考资料:
这些解决方案引入 mermaid 的方法简单素雅,这一套流程可以总结为:
- 
在博客中加载 mermaidJS。具体方法有:- 直接在一定会加载的 HTML文件中引入<script>标签,加载mermaid。
- 在部分支持自定义 JavaScript的主题中,引入JavaScript文件。
 
- 直接在一定会加载的 
- 
自定义 ShortCodes,依靠ShortCodes实现标签替换。
但是习惯了通过 typora 之类的 MarkDown 拓展编辑器,他们无一例外都支持按照如下风格进行渲染:
```mermaid
... 图表内容 ...
```
能不能实现它,从而实现更加一颗赛艇的编辑体验呢?
能的。
实现原理
通过阅读 mermaid 的 API 咱们可以得知 mermaidAPI 渲染 mermaid 图形的大致流程:
上述的特定标签是指<div class="mermaid">的 HTML 标签。通过检查页面元素,咱们会发现如今的大部分博客将代码块渲染成如下式样:
|  |  | 
也就是说咱们只需要找到形如:
|  |  | 
的代码块,并将其替换成<div class="mermaid">即可。
在 even theme 中的实现
本博客使用的是 even theme. 但是俺相信参照本文在其他博客中进行实现也会大差不差。
俺在自己实现了此种风格之后即向 hugo-theme-even 提出了 PR,even theme 的用户应该可以在不久以后在新版本中得到 mermaid 支持。
导入 mermaid.min.js
实现应当遵循原理的指示精神,首先咱们需要拥有 mermaid 库。通过观察源码猜测 even 主题在 /static/layouts/partials/scripts.html 中进行 JS 的载入。于是咱们向其中插入能够引入 mermaid 模块的 script 标签。(实际上只要是会被加载的 HTML 文件都可以插)
这个标签在 HTML 文件里随便找个地方插就完事了,如果完全不懂,建议怼到 HTML 文件末尾。
通过 CDN 导入
为了保持文章的时效性,俺不会直接提供该 script 标签,但是你可以在 jsdelivr.com 中找到你中意版本的 mermaid.min.js 并按下右边的 Copy HTML + SRI 按钮即可获得对应的标签。
通过本地文件导入
由于房间里的大象太大挡住了境外CDN的信号,所以你也可以选择本地文件。在网上找到你中意版本的 mermaid.min.js, 下载下来并放在 /static/lib/mermaid/ 目录下(没有就新建一个),这时可以得到对应的 script 标签如下:
|  |  | 
本人对境外 CDN 在内地的稳定性持悲观态度,建议中国大陆用户使用此方法。
替换 HTML 标签
观察 even 主题的源码,咱们可以在 /assets/js/ 目录下发现 main.js 和 even.js。在 even.js 中插入如下代码段:
|  |  | 
在 main.js 中插入:
|  |  | 
现在你应该可以在自己的博客中写 mermaid 了。
工具推荐
- 
写 MarkDown 咋能少得了 「Typora」? 
- 
俺写这篇文章用的无所不能的编辑器,建议添加插件: - Markdown All in One
- Markdown Preview Enhanced
- Mermaid Markdown Syntax Highlighting
 之所以用 Visual Studio Code,很大程度上是因为它的 Vim 拓展。 “2021年了不会还有人不会用 Vim 吧?” - vim