diff --git a/common/maps/scratch.go b/common/maps/scratch.go index 4acd10c6cb2..7a3cd37485c 100644 --- a/common/maps/scratch.go +++ b/common/maps/scratch.go @@ -107,6 +107,15 @@ func (c *Scratch) Get(key string) interface{} { return val } +// 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. +func (c *Scratch) Values() map[string]interface{} { + c.mu.RLock() + defer c.mu.RUnlock() + return c.values +} + // SetInMap stores a value to a map with the given key in the Node context. // This map can later be retrieved with GetSortedMapValues. func (c *Scratch) SetInMap(key string, mapKey string, value interface{}) string { @@ -147,7 +156,7 @@ func (c *Scratch) GetSortedMapValues(key string) interface{} { return sortedArray } -// NewScratch returns a new instance Scratch. +// NewScratch returns a new instance of Scratch. func NewScratch() *Scratch { return &Scratch{values: make(map[string]interface{})} } diff --git a/common/maps/scratch_test.go b/common/maps/scratch_test.go index c2c436e403c..40df3bb6be2 100644 --- a/common/maps/scratch_test.go +++ b/common/maps/scratch_test.go @@ -47,6 +47,9 @@ func TestScratchAdd(t *testing.T) { scratch.Add("scratch", scratch) _, err := scratch.Add("scratch", scratch) + m := scratch.Values() + c.Assert(m, qt.HasLen, 5) + if err == nil { t.Errorf("Expected error from invalid arithmetic") } diff --git a/docs/content/en/functions/scratch.md b/docs/content/en/functions/scratch.md index 1a64bb2e336..10623b2cb3a 100644 --- a/docs/content/en/functions/scratch.md +++ b/docs/content/en/functions/scratch.md @@ -113,6 +113,11 @@ 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.