Hugo テンプレート内で辞書変数を定義すると、キーと値のマップ情報を管理することができます。
マップを定義する (dict)
dict 関数 のパラメータに、キーと値のペアを並べていくと、マップ変数を作成することができます。 下記の例では、3 つのキー&値を持つマップを定義して、その内容を出力しています。
☝️ ワンポイント
関数名が
dict
なので、「辞書」と訳したほうがよいのかもしれませんが、内部的には Go の map
オブジェクトなので、ここでは「マップ」と呼ぶことにします。
Go のテンプレート内で使用できる文法は、Go 言語の文法とは異なっています。
Go 言語でマップを定義する ときは map
を使用しますが、Hugo のテンプレート内でマップ(辞書)を定義するときは dict
関数を使用しなければいけないことに注意してください。マップの要素を参照する (index)
マップ変数の後ろに、ドットで繋げてキー名を指定すると、そのキーに対応する要素の値を参照することができます(存在しないキーを指定した場合は何も出力されません)。
ただし、このようにドットを使ってキーを指定する方法は、キー名がアルファベット(やアンダースコア)で始まっている場合にしか使用できません。 より汎用的なキー(数字始まりなど)を使用して、マップ内の要素を参照するには、index 関数 を使用します。
☝️ ワンポイント
index
関数は、配列(スライス)変数内の要素を参照するときにも使用します(例: {{ index $arr 0 }}
)。違いは、第 2 引数が文字列か数値かだけです。マップをループで処理する (range)
マップ内のすべての要素を、range
を使ってループ処理することができます。
次の例では、マップ内のキーと値を順番に取り出しています。
あまり使い道はないかもしれませんが、次のようにキー用の変数を省略して記述すると、値だけを取り出しながらループ処理することができます。
{{ $d := dict "key1" 100 "key2" 200 "key3" 300 }}
<ul>
{{- range $val := $d }}
<li>{{ $val }}
{{- end }}
</ul>
マップをパーシャルテンプレートの引数として渡す
Hugo の本家サイトには、下記のようなパーシャルテンプレートのパラメータとしてマップを受け取る例が掲載されています(本家のコードは細かい間違いが多いので若干修正してます)。 このパーシャルテンプレートは、指定された色、サイズで外部リンクアイコンを表示します。
パーシャルテンプレートに渡されたマップの要素は、下記のようにキーを指定することで参照することができます。
{{ .fill }}
このパーシャルテンプレートを使用するテンプレート側では、下記のように記述します。
パーシャルテンプレートはこんな感じで SVG 画像を生成するのにも利用できるんですね。