diff options
author | Bjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com> | 2018-09-10 09:48:10 +0200 |
---|---|---|
committer | Bjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com> | 2018-09-14 10:12:08 +0200 |
commit | e27fd4c1b80b7acb43290ac50e9f140d690cf042 (patch) | |
tree | 34b0f36bde4598781f9b331b5956fae3b4b33866 /hugolib/collections_test.go | |
parent | b7ca3e1b3a83ef27bef841c319edb5b377cc4102 (diff) |
tpl/collections: Add collections.Append
Before this commit you would typically use `.Scratch.Add` to manually create slices in a loop.
With variable overwrite in Go 1.11, we can do better. This commit adds the `append` template func.
A made-up example:
```bash
{{ $p1 := index .Site.RegularPages 0 }}{{ $p2 := index .Site.RegularPages 1 }}
{{ $pages := slice }}
{{ if true }}
{{ $pages = $pages | append $p2 $p1 }}
{{ end }}
```
Note that with 2 slices as arguments, the two examples below will give the same result:
```bash
{{ $s1 := slice "a" "b" | append (slice "c" "d") }}
{{ $s2 := slice "a" "b" | append "c" "d" }}
```
Both of the above will give `[]string{a, b, c, d}`.
This commit also improves the type handling in the `slice` template function. Now `slice "a" "b"` will give a `[]string` slice. The old behaviour was to return a `[]interface{}`.
Fixes #5190
Diffstat (limited to 'hugolib/collections_test.go')
-rw-r--r-- | hugolib/collections_test.go | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/hugolib/collections_test.go b/hugolib/collections_test.go index 124a6ede7..9cf328a05 100644 --- a/hugolib/collections_test.go +++ b/hugolib/collections_test.go @@ -86,3 +86,57 @@ tags_weight: %d "pageGroups:2:hugolib.PagesGroup:Page(/page1.md)/Page(/page2.md)", `weightedPages:2::hugolib.WeightedPages:[WeightedPage(10,"Page") WeightedPage(20,"Page")]`) } + +func TestAppendFunc(t *testing.T) { + assert := require.New(t) + + pageContent := ` +--- +title: "Page" +tags: ["blue", "green"] +tags_weight: %d +--- + +` + b := newTestSitesBuilder(t) + b.WithSimpleConfigFile(). + WithContent("page1.md", fmt.Sprintf(pageContent, 10), "page2.md", fmt.Sprintf(pageContent, 20)). + WithTemplatesAdded("index.html", ` + +{{ $p1 := index .Site.RegularPages 0 }}{{ $p2 := index .Site.RegularPages 1 }} + +{{ $pages := slice }} + +{{ if true }} + {{ $pages = $pages | append $p2 $p1 }} +{{ end }} +{{ $appendPages := .Site.Pages | append .Site.RegularPages }} +{{ $appendStrings := slice "a" "b" | append "c" "d" "e" }} +{{ $appendStringsSlice := slice "a" "b" "c" | append (slice "c" "d") }} + +{{ printf "pages:%d:%T:%v/%v" (len $pages) $pages (index $pages 0) (index $pages 1) }} +{{ printf "appendPages:%d:%T:%v/%v" (len $appendPages) $appendPages (index $appendPages 0).Kind (index $appendPages 8).Kind }} +{{ printf "appendStrings:%T:%v" $appendStrings $appendStrings }} +{{ printf "appendStringsSlice:%T:%v" $appendStringsSlice $appendStringsSlice }} + +{{/* add some slightly related funcs to check what types we get */}} +{{ $u := $appendStrings | union $appendStringsSlice }} +{{ $i := $appendStrings | intersect $appendStringsSlice }} +{{ printf "union:%T:%v" $u $u }} +{{ printf "intersect:%T:%v" $i $i }} + +`) + b.CreateSites().Build(BuildCfg{}) + + assert.Equal(1, len(b.H.Sites)) + require.Len(t, b.H.Sites[0].RegularPages, 2) + + b.AssertFileContent("public/index.html", + "pages:2:hugolib.Pages:Page(/page2.md)/Page(/page1.md)", + "appendPages:9:hugolib.Pages:home/page", + "appendStrings:[]string:[a b c d e]", + "appendStringsSlice:[]string:[a b c c d]", + "union:[]string:[a b c d e]", + "intersect:[]string:[a b c d]", + ) +} |