Zennが mermaid.js によるダイアグラム表記に対応したので試す

6 min read読了の目安(約6100字

Zenn で mermaid.js によるダイアグラムが表現できるようになりました。ZennのMarkdown記法一覧も更新されています。この記事では mermaid.js を使っていくつかの図をかいてみます。

  • 基本的な使い方
  • mermaid.jsのドキュメントを見ながらいろいろな図を書いてみる
  • 各種エディタでプレビュー

このあたりを記録します。

基本的な使い方

コードブロックで囲んで言語名を mermaid とすることで、自動的にレンダリングされます。いまのところ、mermaid.jsの8.10.xを読み込んで使っています。

```mermaid
graph TB
    A[Hard edge] -->|Link text| B(Round edge)
    B --> C{Decision}
    C -->|One| D[Result one]
    C -->|Two| E[Result two]
```

は以下のように表示されます。

graph TB
    A[Hard edge] -->|Link text| B(Round edge)
    B --> C{Decision}
    C -->|One| D[Result one]
    C -->|Two| E[Result two]

javascript などの言語がソースコードハイライトされるのと同じように、mermaidとなっていた場合は図がレンダリングされる動きです。ただしmermaidの場合は図のかわりに元のソースを表示する手段がないので、ソースコードも併記したい場合は上で示した例のように~~~で囲むか、シンプルに

```text
graph TB
  ...
```

としてください。

グラフの方向

図によっては伸びる方向を指定できるものがあります。Zennではmermaid.jsによる図の横幅がコンテンツ領域を超えないように設定しているので、大きなグラフは横長にするよりは縦長にするほうがおすすめです。例えばフローチャートではgraph TB(Top to Bottom)やgraph LR(Left to Right)を指定できるのですが、 graph LR を指定してどんどんエッジを加えていくと…

graph LR
    A[Hard edge] -->|Link text| B(Round edge)
    B --> C{Decision}
    C -->|One| D[Result one]
    C -->|Two| E[Result two]
    D --> F
    E --> F
    F --> G
    G --> H
    H --> I

このように図の文字やノードが小さくなります。もちろん場合によっては、左右に展開して一覧性をよくしたいというケースもあるので最後は執筆者の判断に委ねられます。記事はスマートフォン端末でも見られる可能性がある、という点だけご注意ください。

initディレクティブ

mermaid.js では initディレクティブ(Directives)で初期化パラメータを追加できます。ユースケースとしては、グラフのカラーテーマを変える、が考えられます。詳細は公式ドキュメントのDirectivesを参照してください。ここではテーマを変えてみる例を示します。

```mermaid
+%%{init: { 'theme': 'forest' } }%%
graph TB
    A[Hard edge] -->|Link text| B(Round edge)
    B --> C{Decision}
    C -->|One| D[Result one]
    C -->|Two| E[Result two]
```
%%{init: { 'theme': 'forest' } }%%
graph TB
    A[Hard edge] -->|Link text| B(Round edge)
    B --> C{Decision}
    C -->|One| D[Result one]
    C -->|Two| E[Result two]

先程とグラフの内容は同じですが、カラーテーマが変わっていることがわかります。なおディレクティブですが、比較的新しい機能であり、まだまだ破壊的変更がありえます。多用は控えることをおすすめします。

いろいろな図を書いてみる

ドキュメントを眺めつついろいろな図をかいてみましょう。

フローチャート

ノードエッジをもついわゆるグラフです。その名のとおりフローチャートを書いたり、あとは例えばダイクストラなどのグラフアルゴリズムの表現でも役に立つかもしれません。

graph LR
    A[Start] --> B{Is it?};
    B -->|Yes| C[OK];
    C --> D[Rethink];
    D --> B;
    B ---->|No| E[End];

シーケンス図

業務プロセスやITシステムにおける通信機器同士のやりとりを表現するのに役立ちます。あみだくじを書くときにも使えるかも…。

sequenceDiagram
    autonumber
    アリス->>ゆうた: Hello ゆうた, how are you?
    loop Healthcheck
        ゆうた->>ゆうた: Fight against hypochondria
    end
    Note right of ゆうた: Rational thoughts!
    ゆうた-->>アリス: Great!
    ゆうた->>テウ先生: How about you?
    テウ先生-->>ゆうた: Jolly good!

クラス図

最近は利用頻度は減った感触がありますが、オブジェクト指向言語におけるクラス同士の関係を表現するのに役立ちます。コードレビュー依頼で一緒に添えるとレビュアーが喜ぶかもしれません。

classDiagram
      Animal <|-- Duck
      Animal <|-- Fish
      Animal <|-- Zebra
      Animal : +int age
      Animal : +String gender
      Animal: +isMammal()
      Animal: +mate()
      class Duck{
          +String beakColor
          +swim()
          +quack()
      }
      class Fish{
          -int sizeInFeet
          -canEat()
      }
      class Zebra{
          +bool is_wild
          +run()
      }

状態図

こちらもWebシステムだとステートレスな設計も増えて登場頻度は減った感触ですが、業務設計におけるユーザーの状態(ログイン前、支払い済み、退会済み、など)であったり、組み込みシステムなどでの活用がありそうです。

stateDiagram-v2
    [*] --> Still
    Still --> [*]

    Still --> Moving
    Moving --> Still
    Moving --> Crash
    Crash --> [*]

ER図

なんだかんだでリレーショナルデータベースは使われ続けると思うので、在宅ワークも増えつつある現場では認識合わせなどでも役に立ちそうです。

erDiagram
    CUSTOMER ||--o{ ORDER : places
    CUSTOMER {
        string name
        string custNumber
        string sector
    }
    ORDER ||--|{ LINE-ITEM : contains
    ORDER {
        int orderNumber
        string deliveryAddress
    }
    LINE-ITEM {
        string productCode
        int quantity
        float pricePerUnit
    }

エディタでプレビューする

いろいろな図を表現できることがわかりました。あとは記事へ書いていきます。他の記法と基本の流れは同じです。エディタで記載して、プレビューで意図どおりにレンダリングされるか確認します。

zenn-cli preview

GitHub連携している場合はzenn-cliを使ったプレビューが便利です。下書きの記事にmermaid.jsの図をかいて、プレビューしてみましょう。まずは、執筆している作業ディレクトリでzenn-cliを最新版にアップグレードします。

yarn add zenn-cli@latest

その後、文法にのっとってmermaid.jsの図を書きます。

## ER図

なんだかんだでリレーショナルデータベースは使われ続けると思うので、在宅ワークも増えつつある現場では認識合わせなどでも役に立ちそうです。

```mermaid
erDiagram
    CUSTOMER ||--o{ ORDER : places
    CUSTOMER {
        string name
        string custNumber
        string sector
    }
    ORDER ||--|{ LINE-ITEM : contains
    ORDER {
        int orderNumber
        string deliveryAddress
    }
    LINE-ITEM {
        string productCode
        int quantity
        float pricePerUnit
    }
```

プレビューします。

yarn zenn preview
👀Preview on http://localhost:8000

http://localhost:8000 で mermaid.js の図がレンダリングされていれば成功です。

Zennのオンラインエディタ

ブラウザのエディタでも確認してみます。

こちらでもプレビュー表示できてそうです。

VSCode Zenn Editor Preview

negokazさんにより公開された VSCode 拡張も試しましょう。

プレビュー表示で mermaid.js の図がレンダリングされています。ありがとうございます。仕組みをあまりよくわかっていないのですが、内部的に http://localhost:8000にアクセスして表示しているでしょうか?とすると、手元の zenn-cli が最新版になっていればプレビューも自動的に新しくなってくれそうです(間違っていたらご指摘ください!)。

おわりに

Zennで新しく対応した mermaid.js を使ってみました。まだまだ発展途上のライブラリであり、今後も新しい図が追加されたり、文法の破壊的変更が入ることがありえますが、Zennで執筆する記事のクオリティ向上に寄与できれば幸いです。なにかフィードバックがありましたら以下のようにお願いできればと思います。

この記事に贈られたバッジ