.Scratch
In most cases you can do okay without Scratch, but due to scoping issues, there are many use cases that aren’t solvable in Go Templates without Scratch’s help.
.Scratch is available as methods on Page and Shortcode. Since Hugo 0.43 you can also create a locally scoped Scratch using the template func newScratch.
Get a Scratch
From Hugo 0.43 you can also create a locally scoped Scratch by calling newScratch:
$scratch := newScratch
$scratch.Set "greeting" "Hello"
A Scratch is also added to both Page and Shortcode. Scratch has the following methods:
.Set
Set the given value to a given key
{{ .Scratch.Set "greeting" "Hello" }}
.Get
Get the value of a given key
{{ .Scratch.Set "greeting" "Hello" }}
----
{{ .Scratch.Get "greeting" }} > Hello
.Add
Will add a given value to existing value of the given key.
For single values, Add accepts values that support Go’s + operator. If the first Add for a key is an array or slice, the following adds will be appended to that list.
{{ .Scratch.Add "greetings" "Hello" }}
{{ .Scratch.Add "greetings" "Welcome" }}
----
{{ .Scratch.Get "greetings" }} > HelloWelcome
{{ .Scratch.Add "total" 3 }}
{{ .Scratch.Add "total" 7 }}
----
{{ .Scratch.Get "total" }} > 10
{{ .Scratch.Add "greetings" (slice "Hello") }}
{{ .Scratch.Add "greetings" (slice "Welcome" "Cheers") }}
----
{{ .Scratch.Get "greetings" }} > []interface {}{"Hello", "Welcome", "Cheers"}
.SetInMap
Takes a key, mapKey and value and add a map of mapKey and value to the given key.
{{ .Scratch.SetInMap "greetings" "english" "Hello" }}
{{ .Scratch.SetInMap "greetings" "french" "Bonjour" }}
----
{{ .Scratch.Get "greetings" }} > map[french:Bonjour english:Hello]
.GetSortedMapValues
Returns array of values from key sorted by mapKey
{{ .Scratch.SetInMap "greetings" "english" "Hello" }}
{{ .Scratch.SetInMap "greetings" "french" "Bonjour" }}
----
{{ .Scratch.GetSortedMapValues "greetings" }} > [Hello Bonjour]
.Delete
Removes the given key
{{ .Scratch.Delete "greetings" }}
.Values
Values returns the raw backing map. Note that you should just use this method on the locally scoped Scratch instances you obtain via newScratch, not
.Page.Scratch etc., as that will lead to concurrency issues.
Scope
The scope of the backing data is global for the given Page or Shortcode, and spans partial and shortcode includes.
Note that .Scratch from a shortcode will return the shortcode’s Scratch, which in most cases is what you want. If you want to store it in the page scoped Scratch, then use .Page.Scratch.