Skip to main content

マップ、配列、またはスライスを指定すると、 apply は関数が適用された新しいスライスを返します。

apply は、適用される関数に応じて、少なくとも以下の 3 つのパラメータを必要とします。

  1. 最初のパラメーターは、操作するシーケンスです。
  2. 第 2 パラメータは、文字列としての関数名で、有効な Hugo 関数 の名前でなければなりません。
  3. その後には、適用する関数のパラメータを、関数を適用するシーケンスの各要素を表す文字列 "." とともに指定します。

以下は、フロントマター フィールドとして names: を持つコンテンツファイルの例です。

そして、以下のように apply を使用することができます。

{{ apply .Params.names "urlize" "." }}

上記のコードの結果は、以下のようになります。

"derek-perkins", "joe-bergevin", "tanner-linsley"

これは、range で以下を使用するのと ほぼ 同等です。

{{ range .Params.names }}{{ . | urlize }}{{ end }}

ただし、範囲の出力を delimit関数 に与えることはできないので、それを apply する必要があります。

post-tag-list.htmlpost-tag-link.htmlパーシャル であれば、それぞれ以下のようなスニペットを使うことが*できます。

layouts/partials/post-tag-list.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 }}
layouts/partials/post-tag-link.html
<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 にしたものを、以下に示します。

layouts/partials/post-tag-list.html
{{ with .Params.tags }}
  <div class="tags-list">
    Tags:
    {{ delimit (apply (apply (sort .) "partial" "post-tag-link.html" ".") "chomp" ".") ", " }}
  </div>
{{ end }}