🧜‍♀️

【Elixir】ExDocでMermaidを利用する

2022/12/16に公開

Elixirのドキュメンテーションのツール ExDocに関する小ネタです。

ExDocでは任意のHTMLを挿入できる

ExDocの設定で before_closing_body_tag という設定を加えると、mix docs で生成されるHTMLに対して、bodyタグの末尾に任意のHTMLを挿入できます。

https://github.com/elixir-lang/ex_doc#extensions

ここでタイトル回収ですが、この機構を利用することでExDocでもMermaid記法が使えます。「ExDocがMermaidに対応している!」という感じではなく、cdnから任意のスクリプトを取得してなんでも出来るという感じですね。

設定方法

私の拙い説明より、実際に世で使われているコードを見た方が一発です。Nerves関連のOSSで見つけたコードを貼っておきます。

https://github.com/nerves-networking/vintage_net/blob/5ac948ac2758cad6e57f2cc363880b514b6931af/mix.exs#L125

実装の流れは以下の通りです。

  • docs の設定で before_closing_body_tag にarity=1の関数を設定する
  • 関数を :html_(任意の値) にマッチするようにパターンマッチで実装する

記述しているHTML自体はExDocのREADMEにも記述があります

個人的には mix.exs にDOMが登場するのがちょっと辛いなと思うのですが、やむなしですね。

使用例

この設定を入れた状態で、mermaidのコードブロックを書いてドキュメントを生成すると、良い感じに図形がレンダリングされています🎉

# Sample

```mermaid
sequenceDiagram
    participant Alice
    participant Bob
    Alice->>John: Hello John, how are you?
    loop Healthcheck
        John->>John: Fight against hypochondria
    end
    Note right of John: Rational thoughts <br/>prevail!
    John-->>Alice: Great!
    John->>Bob: How about you?
    Bob-->>John: Jolly good!
```

debbacec-c06e-4acb-8c68-5aaf4c2eb66a.png

mermaidで書いておけばGitHub上でもレンダリングされるメリットが大きいですね。

ede7d888-9154-4976-b549-e5805d5af667.png

まとめ

ExDocでMermaidを使う方法を解説しました。ざっと調べて日本語の情報が少なかったので改めて書いてみました。簡単な図であればMermaidでサクッと済ませられると楽ですので、機会があれば是非お試しください。

余談

そこまで新しい機能でもなく、CHANGELOGを見ると去年の11月の段階でREADMEに設定方法の記述が追加されていたようです。この辺はあまり触らないと置いてかれちゃいますね。

https://github.com/elixir-lang/ex_doc/blob/main/CHANGELOG.md#v0260-2021-11-21

Discussion