Hugo のテンプレートで、ページの種類によって条件分岐するコードを記述するには、レンダリング時のコンテキストにおいて、.Kind の値や .IsPage などの値がどう変化するかを知っておく必要があります。
| ページ種類 | .RelPermalink の例 | .Section | .Type | .Kind | .IsHome | .IsNode | .IsPage | .IsSection |
|---|---|---|---|---|---|---|---|---|
| ホームページ | / | nil | page | home | true | true | false | false |
| セクションページ(第 1 階層) | /sec1/ | sec1 | sec1 | section | false | true | false | true |
| セクションページ(第 2 階層) | /sec1/sec2/ | sec1 | sec1 | section | false | true | false | true |
| タクソノミーターム | /tags/ | tags | tags | taxonomy ※ | false | true | false | false |
| タクソノミーリスト | /tags/xxx/ | tags | tags | term ※ | false | true | false | false |
| 404 ページ | nil | nil | page | 404 | false | true | false | false |
| 記事ページ(第 1 階層) | /mypage/ | nil | page | page | false | false | true | false |
| 記事ページ(第 2 階層) | /sec1/mypage/ | sec1 | sec1 | page | false | false | true | false |
| 記事ページ(第 3 階層) | /sec1/sec2/mypage/ | sec1 | sec1 | page | false | false | true | false |
☝️ ※ taxonomy と term という名前
Hugo v0.73 において
taxonomyTerm → taxonomy、taxonomy → term という .Kind 値の変更が入っているので、バージョンアップ時はご注意ください。上記の値は、次のようなテンプレートコードを、ベーステンプレート (layouts/_default/baseof.html) に記述して調べています(2020-04-27: .IsSection を追記、.URL (deprecated) を .RelPermalink に変更)。
<pre>
.RelPermalink = {{ .RelPermalink }}
.Section = {{ .Section }}
.Type = {{ .Type }}
.Kind = {{ .Kind }}
.IsHome = {{ .IsHome }}
.IsNode = {{ .IsNode }}
.IsPage = {{ .IsPage }}
.IsSection = {{ .IsSection }}
</pre>
これらの情報を使って分岐処理するときの方針としては、まずは、大まかに .IsHome、.IsNode、.IsPage、.IsSection の値で分岐できないかを考え、もう少し細かい分岐処理が必要であれば、.Kind の値を利用する、という感じにするとよいでしょう。
次の例では、title 要素のテキストを構築するときに、.IsHome の値を使って分岐処理しています。
ホームページの場合は「サイト名」だけを表示し、その他のページでは「ページタイトル|サイト名」のように連結して表示するようにしています。
<title>{{ if not .IsHome }}{{ .Title }}|{{ end }}{{ .Site.Title }}</title>
あるいは、cond 関数を利用して次のように書くこともできます。
<title>{{ cond .IsHome .Site.Title (print .Title "|" .Site.Title)}}</title>
