Hexo引入Mermaid
[toc]
利用 hexo-filter-mermaid-diagrams 插件引入 Mermaid 并通过 hexo 的 filter 解决语法冲突。
问题描述
虽然 sm 图床早就被墙娘推倒,但由于替身使者 smms.app 的存在以及之前 s2.loli.net 尚能访问,影响不是很大。但是最近访问图片链接的速度非常慢~,甚至连接失败,且直接插入图片的方式不够优雅,故决定今后能用动态生成解决的问题尽量不用静态图片。
Mermaids 是一款基于 JavaScript 的绘制图表的工具,启发自 Markdown 的文本标记特性,能够动态地创建和修改图表。
安装启用
自动版
如果使用的主题内置了 mermaid 模块,可根据主题文档进行设置。
ButterFly 内置了 mermaid,在 _config.yml 中设置:
1 | mermaid: |
手动版
如果使用的主题没有内置 mermaid 模块,则需要按照 hexo-filter-mermaid-diagrams 的文档进行自定义设置。
安装插件
1
npm install hexo-filter-mermaid-diagrams
在博客根目录下的 blog/_config.yml 添加:
1
2
3
4
5
6# mermaid chart
mermaid: ## mermaid url https://github.com/knsv/mermaid
enable: true # default true
version: "7.1.2" # default v7.1.2
options: # find more api options from https://github.com/knsv/mermaid/blob/master/src/mermaidAPI.js
#startOnload: true // default true在主题模板的 layout 文件夹下的如
after_footer.pug
,after-footer.ejs
,swig
等组件中任选一处添加代码。如果是
footer.swig
或其他 swig 文件1
2
3
4
5
6
7
8{% if theme.mermaid.enable %}
<script src='https://unpkg.com/mermaid@{{ theme.mermaid.version }}/dist/mermaid.min.js'></script>
<script>
if (window.mermaid) {
mermaid.initialize({{ JSON.stringify(theme.mermaid.options) }});
}
</script>
{% endif %}如果是
after_footer.pug
1
2
3
4
5
6
7if theme.mermaid.enable == true
script(type='text/javascript', id='maid-script' mermaidoptioins=theme.mermaid.options src='https://unpkg.com/mermaid@'+ theme.mermaid.version + '/dist/mermaid.min.js' + '?v=' + theme.version)
script.
if (window.mermaid) {
var options = JSON.parse(document.getElementById('maid-script').getAttribute('mermaidoptioins'));
mermaid.initialize(options);
}如果是
after-footer.ejs
1
2
3
4
5
6
7
8<% if (theme.mermaid.enable) { %>
<script src='https://unpkg.com/mermaid@<%= theme.mermaid.version %>/dist/mermaid.min.js'></script>
<script>
if (window.mermaid) {
mermaid.initialize({theme: 'forest'});
}
</script>
<% } %>如果不生效,尝试修改博客根目录的 blog/_config.yml 中的 external_link
使用 mermaid 画图
在 Typora 中使用 {% mermaid %}` 和 `{% endmermaid %}
包裹内容,如:
1 | {% mermaid %} |
但由于本地编辑器不认识 % 标签,只认识 ``` 标签,故在编辑器中使用 % 标签没有预览图像,尝试使用 hexo 的 filter 解决。
标签转换
在本地仍然使用 ``` 标签方便编辑与预览
在 hexo 开始渲染文章前转化为 % 标签。
在主题文件夹的 \scripts\filters 中新建一个 js 文件,文件名任意
1 | ; |
完成后 clean 并重新生成即可。
如下是一个用 ``` 标签绘制的图表
graph LR; subgraph A[大矩形框] B[小矩形框B]; C[小矩形框C]; D[小矩形框D]; end B --> E[小矩形框E]; E --> F[小矩形框F]; F --> C;
示例
1 | flowchart TB |
sequenceDiagram box Purple Alice 与 John participant A participant J end box Another Group participant B participant C end A->J: Hello John, how are you? J-->A: Great! C-xB: Hello? loop everyMin C--xB: Hello? end Note over B, C: something wrong Note right of A: A<br/> to B A->>B: Hello Bob, how is Charly ? B-->>C: Hello Charly, how are you? C--)B: Great! And you? B-)C: Great!
1 | flowchart TB |
flowchart TB c1-->a2(a2)==>id1[(Database)] subgraph one a1((a1))-.->a2 --> a3[/a3/] %% ~~~ 表示不画出来的联系 end subgraph two b1([b1])--ob2-->A[/b3\] end subgraph three c1 x--x c2{c2} end one --"pp"--> two three --> two two --> c2 -->c3((c3)) classDef someclass fill:#f96