apply
マップ、配列、またはスライスを指定すると、 apply
は関数が適用された新しいスライスを返します。
apply
は、適用される関数に応じて、少なくとも以下の 3 つのパラメータを必要とします。
- 最初のパラメーターは、操作するシーケンスです。
- 第 2 パラメータは、文字列としての関数名で、有効な Hugo 関数 の名前でなければなりません。
- その後には、適用する関数のパラメータを、関数を適用するシーケンスの各要素を表す文字列
"."
とともに指定します。
以下は、フロントマター フィールドとして names:
を持つコンテンツファイルの例です。
そして、以下のように apply
を使用することができます。
{{ apply .Params.names "urlize" "." }}
上記のコードの結果は、以下のようになります。
"derek-perkins", "joe-bergevin", "tanner-linsley"
これは、range で以下を使用するのと ほぼ 同等です。
{{ range .Params.names }}{{ . | urlize }}{{ end }}
ただし、範囲の出力を delimit
関数
に与えることはできないので、それを apply
する必要があります。
post-tag-list.html
と post-tag-link.html
が パーシャル
であれば、それぞれ以下のようなスニペットを使うことが*できます。
{{ with .Params.tags }}
<div class="tags-list">
Tags:
{{ $len := len . }}
{{ if eq $len 1 }}
{{ partial "post-tag-link.html" (index . 0) }}
{{ else }}
{{ $last := sub $len 1 }}
{{ range first $last . }}
{{ partial "post-tag-link.html" . }},
{{ end }}
{{ partial "post-tag-link.html" (index . $last) }}
{{ end }}
</div>
{{ end }}
<a class="post-tag post-tag-{{ . | urlize }}" href="/tags/{{ . | urlize }}">{{ . }}</a>
これは機能しますが、post-tag-list.html
の複雑さはかなり高いです。 Hugo テンプレートは、タグが 1 つしかない場合に特別な動作を実行する必要があり、最後のタグを特別なものとして扱う必要があります。 さらに、HTML が生成され、ブラウザによって解釈される方法により、タグリストは Tags: tag1 , tag2 , tag3
のようにレンダリングされます。
この最初のバージョンの layouts/partials/post-tag-list.html
は、読みやすくするためにすべての操作を分離しています。 以下に、より DRY な統合バージョンを示します。
{{ with .Params.tags }}
<div class="tags-list">
Tags:
{{ $sort := sort . }}
{{ $links := apply $sort "partial" "post-tag-link.html" "." }}
{{ $clean := apply $links "chomp" "." }}
{{ delimit $clean ", " }}
</div>
{{ end }}
完成版では、タグをソートし、layouts/partials/post-tag-link.html
でタグをリンクに変換し、 chomp
で不要な改行を削除し、タグを区切りリストで結合して表示することができるようになりました。先ほどの例をさらに DRY にしたものを、以下に示します。
{{ with .Params.tags }}
<div class="tags-list">
Tags:
{{ delimit (apply (apply (sort .) "partial" "post-tag-link.html" ".") "chomp" ".") ", " }}
</div>
{{ end }}