独自構文のテキストから、各種のダイアグラムを生成できるMermaidという便利なライブラリがありますが、現時点ではHugoでサポートされていません。
このため通常、
language-mermaid
クラスの要素を変換対象として指定するなどの実装が多かったと思うのですが、公式サイトを調べていたところv0.93.0からサポートされたcodeブロックに対するレンダーフックを用いた例が載っており、よりスマートに実装できそうでした。
ここでは公式サイトのレンダーフックを用いたMermaidの組み込み方法を説明します。
codeブロックに対するレンダーフックを定義するには、
layouts/_default/_markup/render-codeblock-言語名.html
というファイルを作成します。今回ファイル名を、
layouts/_default/_markup/render-codeblock-mermaid.html
とすることで、
|
|
というような、言語にmermaidを指定したコードブロックに対してレンダーフックが起動します。レンダーフックの内容は以下の通りです。
|
|
<div class="mermaid">
でコードブロックの内容を囲むhasMermaid
フラグをtrueにするテンプレートについては、
など、Mermaidのコンテンツを表示したいテンプレートへ以下の内容を追加します。私の場合、通常エントリでのみ表記できれば良いためsingle.htmlへ追加しました。
|
|
このコードはhasMermaid
フラグがtrueの場合のみ、MermaidのJavascscript読み込みと初期化を行います。これにより、Mermaidの記述がないページではコードが展開されずムダな処理を抑止できるわけです。
上記処理をテンプレートへ追記する場合の注意点としては、.Content
が出現する箇所より下へ書く必要があるということです。Hugoでは.Content
が実行(評価)されるまではレンダーフックは処理されないためです。
このサイトはオープンソースの静的サイトジェネレーターHugoで制作しています。