ref: f2795d4d2cef30170af43327f3ff7114923833b1
parent: e85c057f99dc2eeb6994bf24105bc48196841b88
author: Bjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
date: Sat Apr 13 07:40:51 EDT 2019
Fix WeightedPages in union etc. We introduced a callback func() to get the owner Page in 0.55.0. Sadly, funcs is not comparable type in Go. This commit replaces the func with a struct pointer that wraps the Page. Fixes #5850
--- a/hugolib/collections_test.go
+++ b/hugolib/collections_test.go
@@ -87,6 +87,37 @@
`weightedPages:2::page.WeightedPages:[WeightedPage(10,"Page") WeightedPage(20,"Page")]`)
}
+func TestUnionFunc(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),+ "page3.md", fmt.Sprintf(pageContent, 30)).
+ WithTemplatesAdded("index.html", `+{{ $unionPages := first 2 .Site.RegularPages | union .Site.RegularPages }}+{{ $unionWeightedPages := .Site.Taxonomies.tags.blue | union .Site.Taxonomies.tags.green }}+{{ printf "unionPages: %T %d" $unionPages (len $unionPages) }} +{{ printf "unionWeightedPages: %T %d" $unionWeightedPages (len $unionWeightedPages) }}+`)
+ b.CreateSites().Build(BuildCfg{})+
+ assert.Equal(1, len(b.H.Sites))
+ require.Len(t, b.H.Sites[0].RegularPages(), 3)
+
+ b.AssertFileContent("public/index.html",+ "unionPages: page.Pages 3",
+ "unionWeightedPages: page.WeightedPages 6")
+}
+
func TestAppendFunc(t *testing.T) {assert := require.New(t)
--- a/hugolib/site.go
+++ b/hugolib/site.go
@@ -1584,7 +1584,7 @@
// last one will win, e.g. "hugo" vs "Hugo".
n.term = term
- w := page.NewWeightedPage(weight, p, n.getOwner)
+ w := page.NewWeightedPage(weight, p, n.owner)
s.Taxonomies[plural].add(key, w)
--- a/hugolib/taxonomy.go
+++ b/hugolib/taxonomy.go
@@ -175,7 +175,7 @@
parent *taxonomyNodeInfo
// Either of Kind taxonomyTerm (parent) or taxonomy
- owner page.Page
+ owner *page.PageWrapper
}
func (t *taxonomyNodeInfo) UpdateFromPage(p page.Page) {@@ -185,17 +185,12 @@
}
func (t *taxonomyNodeInfo) TransferValues(p *pageState) {- t.owner = p
+ t.owner.Page = p
if p.Lastmod().IsZero() && p.Date().IsZero() {p.m.Dates.UpdateDateAndLastmodIfAfter(t.dates)
}
}
-// callback sent to the child nodes.
-func (t *taxonomyNodeInfo) getOwner() page.Page {- return t.owner
-}
-
// Maps either plural or plural/term to a taxonomy node.
// TODO(bep) consolidate somehow with s.Taxonomies
type taxonomyNodeInfos map[string]*taxonomyNodeInfo
@@ -216,6 +211,7 @@
plural: plural,
termKey: termKey,
term: term,
+ owner: &page.PageWrapper{}, // Page will be assigned later.}
t[key] = n
--- a/resources/page/weighted.go
+++ b/resources/page/weighted.go
@@ -38,11 +38,11 @@
first := p[0]
// TODO(bep) fix tests
- if first.getOwner == nil {+ if first.owner == nil {return nil
}
- return first.getOwner()
+ return first.owner.Page
}
// A WeightedPage is a Page with a weight.
@@ -50,15 +50,20 @@
Weight int
Page
- // A callback used to fetch the owning Page. This avoids having to do
+ // Reference to the owning Page. This avoids having to do
// manual .Site.GetPage lookups. It is implemented in this roundabout way
// because we cannot add additional state to the WeightedPages slice
// without breaking lots of templates in the wild.
- getOwner func() Page
+ owner *PageWrapper
}
-func NewWeightedPage(weight int, p Page, getOwner func() Page) WeightedPage {- return WeightedPage{Weight: weight, Page: p, getOwner: getOwner}+// PageWrapper wraps a Page.
+type PageWrapper struct {+ Page
+}
+
+func NewWeightedPage(weight int, p Page, owner *PageWrapper) WeightedPage {+ return WeightedPage{Weight: weight, Page: p, owner: owner}}
func (w WeightedPage) String() string {--
⑨