shithub: hugo

Download patch

ref: f2795d4d2cef30170af43327f3ff7114923833b1
parent: e85c057f99dc2eeb6994bf24105bc48196841b88
author: Bjørn Erik Pedersen <[email protected]>
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 {