From 048e07422d6706ec9277d47cdec4900b79cbf0d5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Pedersen?= Date: Mon, 21 Mar 2016 11:10:57 +0100 Subject: [PATCH] Add Scratch to shortcode Fixes #2000 --- docs/content/extras/scratch.md | 7 ++++--- hugolib/shortcode.go | 6 +++++- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/docs/content/extras/scratch.md b/docs/content/extras/scratch.md index dce53574b..0b93747ec 100644 --- a/docs/content/extras/scratch.md +++ b/docs/content/extras/scratch.md @@ -14,8 +14,7 @@ weight: 80 `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 @@ weight: 80 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 diff --git a/hugolib/shortcode.go b/hugolib/shortcode.go index c0993cc2b..b81c95394 100644 --- a/hugolib/shortcode.go +++ b/hugolib/shortcode.go @@ -36,6 +36,7 @@ type ShortcodeWithPage struct { Page *Page Parent *ShortcodeWithPage IsNamedParams bool + scratch *Scratch } func (scp *ShortcodeWithPage) Site() *SiteInfo { @@ -51,7 +52,10 @@ func (scp *ShortcodeWithPage) RelRef(ref string) (string, error) { } 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{} {