Mermaid,用簡單的方法畫出好看的流程圖!

前陣子在介紹流程圖
那麼現在就來介紹在 Markdown 裡面畫流程圖鼎鼎大名的 Mermaid 吧!
Mermaid
Mermaid 是一個 JavaScript 的套件可以畫出各種圖形出來,像是流程圖、時序圖、Class diagrams、圓餅圖、甘特圖….等,但這裡主要會介紹流程圖,有興趣的可以到 Mermaid 官網看說明。
這邊偷偷放一個用 Mermaid 做的 Pie Chart,我去內政部戶政司人口統計查了一下十五歲以上人口婚姻狀況,然後製作成下圖的 Pie Chart。
民國111年 - 臺灣15歲以上人口婚姻狀況
流程圖
在 Mermaid 中,宣告一個流程圖基本就是如下:
---
title: Node
---
flowchart LR
node
流程圖的方向也可以改變,上方的例子是 LR。
- TB - top to bottom
- TD - top-down/ same as top to bottom
- BT - bottom to top
- RL - right to left
- LR - left to right
主題
Mermaid 有提供以下幾個主題:
- default
- neutral
- dark
- forest
使用方法:
例如要設定為 forest 在最前面加上這行
%%{init: {'theme': 'forest'} }%%
符號介紹
- Terminal 終端:
([]) - Process 程式:
[] - flowline 流程線:
--> - Input/Output 輸入輸出:
[//] - Database資料庫:
[()] - Defined Process 函式:
[[]] - Loop Initialization 迴圈初始化:
{{}} - Decision 決策判斷:
{}
%% 終端 ([])
start([Start])
%% 程式 []
process[Process]
%% 流程線 -->
start --> process
%% 輸入輸出 [//]
inout[/Input\nOutput/]
%% 資料庫 [()]
db[(Database)]
%% 函示 [[]]
def[[Defined Process]]
%% 迴圈初始化 {{}}
loop{{Loop Initialization}}
%% 決策判斷 {}
decision{Decision}
連接的線條也可以做一些改變,甚至可以加上說明文字,像是這樣:
- 實心箭頭:
--> - 實心箭頭 + 文字:
-- text -->-->|text|
- 實線:
--- - 實線 + 文字:
-- text ------|text|
- 虛線箭頭:
-.-> - 虛線箭頭+文字:
-. text .-> - 粗實心箭頭:
==> - 粗實心箭頭 + 文字:
== text ==>
%% 實心箭頭 -->
start --> process
%% 實心箭頭+文字
%% -- text -->
%% -->|text|
start1 -- I'm a text. --> process1
start1 -->|I'm a text.| process1
%% 實線 ---
start2 --- process2
%% 實線+文字
%% -- text ---
%% ---|text|
start3 -- I'm a text. --- process3
start3 ---|I'm a text.| process3
%% 虛線箭頭 -.->
start4 -.-> process4
%% 虛線箭頭+文字
%% -. text .->
start5 -. I'm a text. .-> process5
%% 粗實心箭頭 ==>
start6 ==> process6
%% 粗實心箭頭+文字
%% == text ==>
start7 == I'm a text. ==> process7
所以如果是決策判斷就可以畫成這樣:
%%{init: {'theme': 'forest'} }%%
flowchart TD
B{Tired ?}
B -- Yes --> C[Sleep]
B -- No --> D[Play Games]
HTML
Mermaid 會渲染所有 pre 元素上 class 是 mermaid 的內容,所以流程圖要放在這個裡面,如下圖。
<pre class="mermaid">
flowchart LR
A --> B
</pre>
接著引入 js,要使用 ESM 的方式,如下圖。
<script type="module">
import mermaid from 'https://cdn.jsdelivr.net/npm/mermaid@10/dist/mermaid.esm.min.mjs';
</script>
最後整合在一起就會變成這樣:
<!DOCTYPE html>
<html lang="en">
<body>
<pre class="mermaid">
flowchart LR
A --> B
</pre>
<script type="module">
import mermaid from 'https://cdn.jsdelivr.net/npm/mermaid@10/dist/mermaid.esm.min.mjs';
</script>
</body>
</html>
Mermaid Live Editor
在 Mermaid Live Editor 上面可以直接編輯你的流程圖,旁邊會即時顯示渲染出來的結果。
甚至也可以直接匯出圖片或是向量圖檔,如下圖:
Mermaid Ink
除了在 HTML 裡面放流程圖之外,我們也可以在 Markdown 上面放流程圖,有些地方的 Markdown 內建有支援 Mermaid,沒有支援的話,也可以用 Mermaid Live Editor 下載成圖片,但如果剛好沒有支援,也不想下載成圖片的話,我們可以使用 Mermaid Ink 來幫我們達成。
-
首先,我們一樣到 Mermaid Live Editor 製作我們的流程圖。
-
點開左下方的 Action。
-
接著選擇要 PNG 或是 SVG 檔案,並按下按鈕。
-
會開啟一個新的網頁,該網頁的網址大概會長如下這樣。
https://mermaid.ink/svg/pako:eNpVkMFqwzAMhl9F-LRB8gI5DNak66Vjg_W0JAeRKLVZbRlboZQk7z43YbDqJP3__wmhSXXckyrUcOFrpzEInKrGQarXutTBRLEYW8jzl_lAApYd3WbYPR0YombvjTs_b_ndPQTldLzHCEQb97NsVrnyH45mqOojemHf_ndOV55hX5tPndY_OjpQot7qAYsB8w4DlBhalSlLwaLp0-nTBjRKNFlqVJHagQNFaVTjlpTFUfjr5jpVSBgpU6PvUagyeA5oH8V9b4TDn0br9L69aP1Upjy6b-aEDXiJtPwC14ZpEQ -
我們就可以複製該網頁的連結到 Markdown 當作線上圖片使用了,像這樣:

運用 Mermaid Ink 的方式也有很多種,像是我可以在 Python 中製作我的流程圖,Mermaid Ink 可以製作一般圖片或是 SVG 的檔案,那後面看到的一長串的就是我們的流程圖的編碼,有支援 pako 和 base64 兩種編碼的方式。
我們還可以更改背景顏色,如果是要改成#123456,在結尾加上?bgColor=123456:
# SVG
https://mermaid.ink/svg/...?bgColor=
# 圖片
https://mermaid.ink/img/...?bgColor=
這邊示範用 base64 的方式來製作流程圖:
import base64
import requests
from PIL import Image
def png(graph, bg = None):
graphbytes = graph.encode("ascii")
base64_bytes = base64.b64encode(graphbytes)
base64_string = base64_bytes.decode("ascii")
url = "https://mermaid.ink/img/" + base64_string
if bg is not None:
url += "?bgColor=" + bg
im = Image.open(requests.get(url, stream=True).raw)
im.save('flow.png')
def svg(graph, bg = None):
graphbytes = graph.encode("ascii")
base64_bytes = base64.b64encode(graphbytes)
base64_string = base64_bytes.decode("ascii")
url = "https://mermaid.ink/svg/" + base64_string
if bg is not None:
url += "?bgColor=" + bg
with open('flow.svg', 'w') as f:
f.write(requests.get(url).text)
g = """
graph LR;
A--> B & C & D;
B--> A & E;
C--> A & E;
D--> A & E;
E--> B & C & D;
"""
png(g, '123456')
svg(g, 'FF0000')
Mermaid CLI
還有專門為了 Mermaid 推出的 CLI 版本,如果是喜歡用 CLI 版本的人呢,可以用這個。
安裝方式:
npm install -g @mermaid-js/mermaid-cli
我們可以將 Mermaid 的流程圖寫在 `input.mmd` 裡面,然後用下方的指令輸出成 SVG 圖片。
mmdc -i input.mmd -o output.svg
一樣可以調整主題和透明。
mmdc -i input.mmd -o output.png -t dark -b transparent
如果說我的 Markdown 裡面有用到 Mermaid,我們也可以將 Mermaid 的部分圖片渲染出來儲存成檔案,並幫我將 Markdown 內的 Mermaid 改成儲存的圖片連結。
mmdc -i readme.template.md -o readme.md
這是 readme.template.md
# Test
```mermaid
flowchart LR
A --> B
```
執行上方的指令後,同個資料夾內多了個檔案 readme-1.svg,以下是 readme.md 的內容:
# Test

Reference
如果你覺得這篇文章有用 可以考慮贊助飲料給大貓咪




