Hugo テンプレートの中で、if
アクションや with
アクションを使用することで、分岐処理を行うことができます。
if による分岐処理
if の構文
Hugo のテンプレート内で分岐処理を行うには、下記のように if
~ end
を使用します。
必要に応じて、else
や else if
を挟むことができます。
{{ if ● }} ... {{ end }}
{{ if ● }} ... {{ else }} ... {{ end }}
{{ if ● }} ... {{ else if ▲ }} ... {{ end }}
{{ if ● }} ... {{ else if ▲ }} ... {{ else }} ... {{ end }}
{{
と }}
で囲まれた部分は、Go のテンプレートでは アクション と呼ばれている部分で、基本的に 1 つのアクションだけを記述することができます(関数をパイプで結んだりすることはできる)。
if
による条件式を記述する部分と、end
でブロックを閉じる部分は、上記のように分けて記述する必要があるため、若干まわりくどくなってしまうケースがあるかもしれませんが、そこは我慢するしかありません。
if
の条件式(上記の ● の部分)において「偽」とみなされる値は、空値 (empty value) です。
空値となるのは下記のような値です。
false
0
とみなされる数値(0.0
も含む)- サイズ 0 の配列、スライス、マップ
- 空文字列 (
""
) nil
ポインタ
条件式の部分で、値の比較を行いたい場合は、下記のような eq
や ne
といった二値関数 (boolean functions) を使用します。
比較する 2 つの値は、後ろに続けて記述することに注意してください。
記述方法 | いつ真とみなすか? | リファレンス |
---|---|---|
eq ARG1 ARG2 | ARG1 = ARG2 のとき | eq 関数 |
ne ARG1 ARG2 | ARG1 ≠ ARG2 のとき | ne 関数 |
lt ARG1 ARG2 | ARG1 < ARG2 のとき | lt 関数 |
le ARG1 ARG2 | ARG1 ≦ ARG2 のとき | le 関数 |
gt ARG1 ARG2 | ARG1 > ARG2 のとき | gt 関数 |
ge ARG1 ARG2 | ARG1 ≧ ARG2 のとき | ge 関数 |
if の使用例
次の例では、数値変数の値が 100 より大きいかを、gt
関数を使用して調べています。
文字列変数の比較 にも eq
(等しい)や ne
(等しくない)を使用することができます。
with による分岐処理
with の構文
if
アクションの代わりに、with
アクションを使用して分岐処理を記述すると、ブロックの中のコンテキスト(ドット .
)を、条件式で評価した値に置き換えることができます。
{{ with ● }} ... {{ end }}
{{ with ● }} ... {{ else }} ... {{ end }}
使い方は、例を見たほうが分かりやすいかもしれません。
次の例では、with
アクションの条件式で Maku
という文字列が指定されているため、ブロックの中でドット (.
) を参照することで、Maku
という文字列を取得することができます。
通常、ドット (.
) はトップレベルのコンテキスト(Hugo のレイアウトファイルの中では通常 Page
オブジェクト)を表しますが、上記のように with
アクションを使用することで、コンテキストを切り替えて、ブロック内の記述をシンプルにすることができます。
逆に、with
ブロックでコンテキストを切り替えた後に、トップレベルのコンテキストを明示的に参照したい場合は、次のように $
プレフィックスを指定して参照します。
with の使用例
下記のサンプルコードは、Web サイトの設定ファイル (config.toml
) に、サイトの説明文や作者が設定されている場合に、それを meta 要素として出力する例です。
クォーテーションマークが、出力箇所のコンテキストに応じて、自動的にエスケープ処理されてますね。Cool!