Scratchは便利

こんにちはnasustです。

今回は、.Scratchについて解説します。 Hugoのテンプレートの変数はスコープの関係で使いにくい場合が多いです。 しかし .ScratchはPageのスコープなので使いやすくなります。

変数の初期化

Hugoの変数が設定されているか判断する場合は、変数の初期値をif判定がfalseとなる値にします。

.Scratchを使わない

{{ $var := 0 }}
{{ if .IsPage }}
    {{ $var = "hoge" }}
{{ end }}
{{ with $var }}
    {{ $var }}
{{ end }}
html

.Scratchを使う

{{ if .IsPage }}
    {{ .Scratch.Set "var" "hoge" }}
{{ end }}
{{ whit .Scratch.Get "var" }}
    {{ . }}
{{ end }}
html

スライスの追加が簡単

.Scratchを使用するとスライスの追加が簡単になります。

.Scratchを使わない

{{ $slice := 0 }}
{{ range xxx }}
    {{ if not $slice  }}
        {{ $slice = (slice xx) }}
    {{ else }}
        {{ &slice = $slice | appned xx }}
    {{ end }}
{{ end }}
html

.Scratchを使う

{{ range xxx }}
    {{ .Scratch.Add "slice" (slice xx) }}
{{ end}}
html

.Scratchを使用すると簡単になります。

.ScratchはPageのスコープなので別のテンプレートでも変数を取得できる

{{ partial "xxx" . }}.はPageを渡しています。 つまり部分テンプレート内で、.Scratch.Get で呼び出し元で Set した値を呼びだす事が出来ます。

HTMLとAMPの共通テンプレートで処理を分けたい場合など使えます。

<!-- html template -->
{{ .Scratch.Set "output-format" "html" }}
html
<!-- amp template -->
{{ .Scratch.Set "output-format" "amp" }}
html

部分テンプレート内部で、.Scratch.Get "output-format"をifで判定することによって、 HTML,AMPの処理を分ける事ができます。

<!-- partials template -->
{{ if eq .Scratch.Get "output-format") "html" }}
    HTMLの処理
{{ end }}
{{ if eq .Scratch.Get "output-format") "amp" }}
    AMPの処理
{{ end }}
html

他にもdefineによる部分テンプレートで処理を行って、.Scratchに結果を格納するなども出来ます。.Scratch.Get "Value"defineがレンダリングされます。

{{ template "define_template" . }}

{{ .Scratch.Get "Value" }}

{{ define "define_template" }}
    {{ .Scratch.Set "Value" "define" }}
{{ end }}
html

この様に .Scratch は便利です。

.Scratch | Hugo

prevnext