shithub: hugo

Download patch

ref: eaba04e82bdfc5d4c29e970f11b4aab9cc0efeaa
parent: 435e996c4fd48e9009ffa9f83a19fb55f0777dbd
author: Bjørn Erik Pedersen <[email protected]>
date: Sun Mar 6 10:44:17 EST 2016

Add list support in Scratch

--- a/docs/content/extras/scratch.md
+++ b/docs/content/extras/scratch.md
@@ -21,7 +21,9 @@
 * `SetInMap` takes a `key`, `mapKey` and `value`
 * `GetSortedMapValues` returns array of values from `key` sorted by `mapKey`
 
-`Set` and `SetInMap` can store values of any type. `Add` accepts values that support Go's `+` operator.
+`Set` and `SetInMap` can store values of any type. 
+
+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.
 
--- a/hugolib/scratch.go
+++ b/hugolib/scratch.go
@@ -15,6 +15,7 @@
 
 import (
 	"github.com/spf13/hugo/helpers"
+	"reflect"
 	"sort"
 )
 
@@ -23,16 +24,30 @@
 	values map[string]interface{}
 }
 
-// Add will add (using the + operator) the addend to the existing addend (if found).
+// For single values, Add will add (using the + operator) the addend to the existing addend (if found).
 // Supports numeric values and strings.
+//
+// If the first add for a key is an array or slice, then the next value(s) will be appended.
 func (c *Scratch) Add(key string, newAddend interface{}) (string, error) {
 	var newVal interface{}
 	existingAddend, found := c.values[key]
 	if found {
 		var err error
-		newVal, err = helpers.DoArithmetic(existingAddend, newAddend, '+')
-		if err != nil {
-			return "", err
+
+		addendV := reflect.ValueOf(existingAddend)
+
+		if addendV.Kind() == reflect.Slice || addendV.Kind() == reflect.Array {
+			nav := reflect.ValueOf(newAddend)
+			if nav.Kind() == reflect.Slice || nav.Kind() == reflect.Array {
+				newVal = reflect.AppendSlice(addendV, nav).Interface()
+			} else {
+				newVal = reflect.Append(addendV, nav).Interface()
+			}
+		} else {
+			newVal, err = helpers.DoArithmetic(existingAddend, newAddend, '+')
+			if err != nil {
+				return "", err
+			}
 		}
 	} else {
 		newVal = newAddend
--- a/hugolib/scratch_test.go
+++ b/hugolib/scratch_test.go
@@ -15,6 +15,7 @@
 
 import (
 	"github.com/stretchr/testify/assert"
+	"reflect"
 	"testing"
 )
 
@@ -43,6 +44,32 @@
 
 	if err == nil {
 		t.Errorf("Expected error from invalid arithmetic")
+	}
+
+}
+
+func TestScratchAddSlice(t *testing.T) {
+	scratch := newScratch()
+
+	_, err := scratch.Add("intSlice", []int{1, 2})
+	assert.Nil(t, err)
+	_, err = scratch.Add("intSlice", 3)
+	assert.Nil(t, err)
+
+	sl := scratch.Get("intSlice")
+	expected := []int{1, 2, 3}
+
+	if !reflect.DeepEqual(expected, sl) {
+		t.Errorf("Slice difference, go %q expected %q", sl, expected)
+	}
+
+	_, err = scratch.Add("intSlice", []int{4, 5})
+
+	sl = scratch.Get("intSlice")
+	expected = []int{1, 2, 3, 4, 5}
+
+	if !reflect.DeepEqual(expected, sl) {
+		t.Errorf("Slice difference, go %q expected %q", sl, expected)
 	}
 
 }