ref: 048e07422d6706ec9277d47cdec4900b79cbf0d5
parent: de8fc8761aa507ca25fae9163374ec59c5f585ce
author: Bjørn Erik Pedersen <[email protected]>
date: Mon Mar 21 07:10:57 EDT 2016
Add Scratch to shortcode Fixes #2000
--- a/docs/content/extras/scratch.md
+++ b/docs/content/extras/scratch.md
@@ -14,8 +14,7 @@
`Scratch` -- a "scratchpad" for your node- or page-scoped variables. In most cases you can do well without `Scratch`, but there are some use cases that aren't solvable with Go's templates without `Scratch`'s help, due to scoping issues.
-
-`Scratch` is added to both `Node` and `Page` -- with following methods:
+`Scratch` is added to both `Node` and `Page` and `Shortcode` -- with following methods:
* `Set` and `Add` takes a `key` and the `value` to add.
* `Get` returns the `value` for the `key` given.
* `SetInMap` takes a `key`, `mapKey` and `value`
@@ -25,7 +24,9 @@
For single values, `Add` accepts values that support Go's `+` operator. If the first `Add` for a key is an array or slice, the follwing adds will be appended to that list.
-The scope of the backing data is global for the given `Node` or `Page`, and spans partial and shortcode includes.
+The scope of the backing data is global for the given `Node`, `Page` or `Shortcode`, and spans partial and shortcode includes.
+
+Note that `.Scratch` from a shortcode will return the shortcode's `Scratch`, which in most casses is what you want. If you want to store it in the page scroped Scratch, then use `.Page.Scratch`.
## Sample usage
--- a/hugolib/shortcode.go
+++ b/hugolib/shortcode.go
@@ -36,6 +36,7 @@
Page *Page
Parent *ShortcodeWithPage
IsNamedParams bool
+ scratch *Scratch
}
func (scp *ShortcodeWithPage) Site() *SiteInfo {
@@ -51,7 +52,10 @@
}
func (scp *ShortcodeWithPage) Scratch() *Scratch {
- return scp.Page.Scratch()
+ if scp.scratch == nil {
+ scp.scratch = newScratch()
+ }
+ return scp.scratch
}
func (scp *ShortcodeWithPage) Get(key interface{}) interface{} {