# FlowChart 流程圖
流程圖是一種視覺化工具,用於描述和表示一個流程、系統或過程中各個步驟、活動、決策和連接的有序圖形呈現方式。它通常以圖形方式展示,並用於清晰地展示和解釋複雜的流程或程序,以便讓人們更容易理解、分析和管理。
例如以下是一個 Mermaid 流程圖範例:
```mermaid
graph LR;
A((起點)) --> B(事件)
B --> C{決策}
C -->|是| D[結果 1] --> F
C -->|否| E[結果 2] --> F
F((結束))
```
## Mermaid 語法
### 定義作圖方向
定義流程圖的關鍵語法為 `graph` 或 `flowchart`
使用 `TB` 或 `LR` 定義作圖方向為 垂直 或者 左右。
```
flowchart 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
### 定義節點
流程圖每個節點稱作 node,任何字元都能代表一個節點。
```
flowchart LR;
A
```
```mermaid
flowchart LR;
A
```
#### 節點描述
在節點後接 `[]` 用以描述節點。
用 `[""]` 以多行文字內容描述。
顯示時,將以描述內容顯示節點。
```
flowchart LR;
A[Dog]
B["Hello
world"]
A --> B
```
```mermaid
flowchart LR;
A[Dog]
B["Hello
world"]
A --> B
```
#### 節點形狀
使用不同括弧來表達不同節點:
```
flowchart TB;
DB[(資料庫)]
round(圓角矩形)
circle((圓形))
Double-circle(((雙重圓)))
rect[方形]
subroutine[[子程序]]
stadium-shaped([膠囊形])
asymmetric>旗幟]
rhombus{選擇}
hexagon{{六邊形}}
Parallelogram[/平行四邊形/]
Parallelogram-alt[\平行四邊形\]
Trapezoid[/梯形\]
Trapezoid-alt[\倒梯形/]
```
```mermaid
flowchart TB;
DB[(資料庫)]
round(圓角矩形) ---
circle((圓形)) ---
DC(((雙重圓)))
rect[方形] ---
subroutine[[子程序]]
stadium-shaped([膠囊形])
asymmetric>旗幟]
rhombus{選擇} ---
hexagon{{六邊形}}
rect --- R1[/平行四邊形/]
rect --- R2[\平行四邊形\]
rect --- R3[/梯形\]
rect --- R4[\倒梯形/]
```
### 定義連線
兩個節點之間的連線,使用三個橫線 `---` 代表。
```
flowchart LR;
A --- B
```
```mermaid
flowchart LR;
A --- B
```
#### 線形
使用不同的線來連接節點,使用 `&` 來連接到多個節點,透過增加中間字元可以任意增減長度:
例如:`-->` 可以用 `---->` 表達更長的箭頭。
```
flowchart LR;
A === B
B --> C & D & E
C --x E
D --o F
E o--o G
F x----x H
H <--> G
G -.- I
G -...-> J
G -.-o K
```
```mermaid
flowchart LR;
A === B
B --> C & D & E
C --x E
D --o F
E o--o G
F x----x H
H <--> G
G -.- I
G -...-> J
G -.-o K
```
#### 文字描述
使用 `| 描述 |` 來為線段添加描述文字,可以加在線段後方,或是線段中間:
1. `-->|是|`
2. `--否-->`
```mermaid
flowchart LR;
A -->|是| B
A --否--> C
```
### 定義樣式
使用 `style` 關鍵字,針對單一節點定義樣式。
使用 `classDef` 關鍵字定義 Style Class。
使用 `:::` 套用 Class 樣式。
```
flowchart LR
A:::className --> B
classDef className stroke:#FF0,stroke-width:1px;
style B fill:#D52
```
```mermaid
flowchart LR
A:::className --> B
classDef className stroke:#FF0,stroke-width:1px;
style B fill:#D52
```
> 使用 `classDef default fill:#f9f,stroke:#333,stroke-width:4px;` 來修改預設樣式,沒有套用 Class 樣式的節點都會套上預設樣式。
> `classDef node` 會修改全部節點樣式(具有覆蓋效果)。
#### 定義線段樣式
由於線段無法像 node 那樣使用 Id 來選取用以定義樣式,因此使用「順序」來指定。
例如:
```
linkStyle 1,3,5 stroke:#ff3,stroke-width:4px,color:red;
```
或是用 default 對全部線段定義:
```
linkStyle default stroke:#ff3,stroke-width:4px,color:red;
```
#### 定義曲線樣式
使用 Configuration 來定義曲線如何渲染:
```
%%{ init: { 'flowchart': { 'curve': 'stepBefore' } } }%%
```
可用的選項有:`basis`, `bumpX`, `bumpY`, `cardinal`, `catmullRom`, `linear`, `monotoneX`, `monotoneY`, `natural`, `step`, `stepAfter`, and `stepBefore`。
有關可用曲線的完整列表,包括自訂曲線的說明,請參閱 [d3-shape](https://github.com/d3/d3-shape/) 專案中的 [Shapes 文件](https://github.com/d3/d3-shape/blob/main/README.md#curves)。
### 子圖形
使用關鍵字 `subgraph` 來定義子圖形,`end` 來表示子圖形結束。
```
subgraph 標題
圖形描述
end
```
例如:
```mermaid
flowchart TB;
A-->B
subgraph A系統
A-->a
end
subgraph B系統
b-->B
end
subgraph 子系統
b-->b1-->b2 & b3
end
```
### 註解
```
%% 註解內容
```