Hugo 0.43 以降で使える Scratch についてご紹介いたします。

Scratch とは

Scratch は ブロックをまたいだ変数を扱うための機能 で、公式には次の説明があります。

Acts as a “scratchpad” to allow for writable page- or shortcode-scoped variables.

https://gohugo.io/functions/scratch/

ドキュメントはこちらです。

Hugo
FUNCTIONS > .Scratch
https://gohugo.io/functions/scratch/

Usage

A Scratch is also added to both Page and Shortcode.

https://gohugo.io/functions/scratch/

というように、宣言しなくても、テンプレートからすぐに使えます。

Set

キーと値を宣言します。

1{{ $.Scratch.Set "SnsCount" 0 }}

Add

キーに加算を行います。

1{{ $.Scratch.Add "SnsCount" 10 }}
2{{ $.Scratch.Add "SnsCount" 7 }}

公式を見ると、文字列の結合もできるようです。

Get

キーを指定して値を取り出します。

1{{ .Scratch.Get "SnsCount" }}

このサンプルでは「 0 + 10 + 7 」で、17 が出力されます。

Delete

キーを削除します。

1{{ .Scratch.Delete "SnsCount" }}

当サイトでの実装例

[Hugo] 記事にシェア数を表示する
Hugoで「記事別のシェア数」を表示する方法をご紹介いたします。
atuweb 開発ブログ

上の記事で紹介している「ツイート数などの表示」に、 Scratch を使っていました。

各記事のカウントは JSON ファイルに保存します。

テンプレートとでは、その JSON から数字をとってくる、という実装です。

1{{ $.Scratch.Set "SnsCount" 0 }}
2{{ $jsonPath := ( printf "/data/sns_count/%s.json" .File.BaseFileName ) }}
3{{ if (fileExists $jsonPath) -}}
4{{ $json := getJSON $jsonPath }}
5{{ $.Scratch.Add "SnsCount" $json.total }}
6{{- end }}
7{{ $snsCount := $.Scratch.Get "SnsCount" }}

Scratch を使わなくても実装はできるのですが、

Scratch で、変数の取り回しを柔軟にすることで、

カウント数をとってくるパート

カウント数を表示するパート

をきれいに分けることができました。

便利だよね

私が普段書いている PHP や JavaScript はスコープがゆるゆるです。

Hugo、Golang はまともなスコープを持っているため、この違いで困ることがありました、正直に。

「シンプルで高速」という、 Hugo の思想 ? に反するかもしれませんが、

ちょっと複雑なことをしたいときは、Scratch を知っていくと実装表現の幅が広がっていい感じです。


Hugo を検索すると HUGO BOSS ばっかりがヒットするー

HUGO BOSS Black Mens Chronograph Watch

種類: メンズ ムーブメント: クオーツ ディスプレイ: クロノグラフ ケース直径: 44 mm 文字盤カラー: ブラック

Amazonで詳細を見る