mirror of
https://github.com/gohugoio/hugo.git
synced 2024-11-21 20:46:30 -05:00
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
This commit is contained in:
parent
e85c057f99
commit
f2795d4d2c
4 changed files with 46 additions and 14 deletions
|
@ -87,6 +87,37 @@ tags_weight: %d
|
||||||
`weightedPages:2::page.WeightedPages:[WeightedPage(10,"Page") WeightedPage(20,"Page")]`)
|
`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) {
|
func TestAppendFunc(t *testing.T) {
|
||||||
assert := require.New(t)
|
assert := require.New(t)
|
||||||
|
|
||||||
|
|
|
@ -1584,7 +1584,7 @@ func (s *Site) assembleTaxonomies() error {
|
||||||
// last one will win, e.g. "hugo" vs "Hugo".
|
// last one will win, e.g. "hugo" vs "Hugo".
|
||||||
n.term = term
|
n.term = term
|
||||||
|
|
||||||
w := page.NewWeightedPage(weight, p, n.getOwner)
|
w := page.NewWeightedPage(weight, p, n.owner)
|
||||||
|
|
||||||
s.Taxonomies[plural].add(key, w)
|
s.Taxonomies[plural].add(key, w)
|
||||||
|
|
||||||
|
|
|
@ -175,7 +175,7 @@ type taxonomyNodeInfo struct {
|
||||||
parent *taxonomyNodeInfo
|
parent *taxonomyNodeInfo
|
||||||
|
|
||||||
// Either of Kind taxonomyTerm (parent) or taxonomy
|
// Either of Kind taxonomyTerm (parent) or taxonomy
|
||||||
owner page.Page
|
owner *page.PageWrapper
|
||||||
}
|
}
|
||||||
|
|
||||||
func (t *taxonomyNodeInfo) UpdateFromPage(p page.Page) {
|
func (t *taxonomyNodeInfo) UpdateFromPage(p page.Page) {
|
||||||
|
@ -185,17 +185,12 @@ func (t *taxonomyNodeInfo) UpdateFromPage(p page.Page) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (t *taxonomyNodeInfo) TransferValues(p *pageState) {
|
func (t *taxonomyNodeInfo) TransferValues(p *pageState) {
|
||||||
t.owner = p
|
t.owner.Page = p
|
||||||
if p.Lastmod().IsZero() && p.Date().IsZero() {
|
if p.Lastmod().IsZero() && p.Date().IsZero() {
|
||||||
p.m.Dates.UpdateDateAndLastmodIfAfter(t.dates)
|
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.
|
// Maps either plural or plural/term to a taxonomy node.
|
||||||
// TODO(bep) consolidate somehow with s.Taxonomies
|
// TODO(bep) consolidate somehow with s.Taxonomies
|
||||||
type taxonomyNodeInfos map[string]*taxonomyNodeInfo
|
type taxonomyNodeInfos map[string]*taxonomyNodeInfo
|
||||||
|
@ -216,6 +211,7 @@ func (t taxonomyNodeInfos) GetOrCreate(plural, termKey, term string) *taxonomyNo
|
||||||
plural: plural,
|
plural: plural,
|
||||||
termKey: termKey,
|
termKey: termKey,
|
||||||
term: term,
|
term: term,
|
||||||
|
owner: &page.PageWrapper{}, // Page will be assigned later.
|
||||||
}
|
}
|
||||||
|
|
||||||
t[key] = n
|
t[key] = n
|
||||||
|
|
|
@ -38,11 +38,11 @@ func (p WeightedPages) Page() Page {
|
||||||
first := p[0]
|
first := p[0]
|
||||||
|
|
||||||
// TODO(bep) fix tests
|
// TODO(bep) fix tests
|
||||||
if first.getOwner == nil {
|
if first.owner == nil {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
return first.getOwner()
|
return first.owner.Page
|
||||||
}
|
}
|
||||||
|
|
||||||
// A WeightedPage is a Page with a weight.
|
// A WeightedPage is a Page with a weight.
|
||||||
|
@ -50,15 +50,20 @@ type WeightedPage struct {
|
||||||
Weight int
|
Weight int
|
||||||
Page
|
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
|
// manual .Site.GetPage lookups. It is implemented in this roundabout way
|
||||||
// because we cannot add additional state to the WeightedPages slice
|
// because we cannot add additional state to the WeightedPages slice
|
||||||
// without breaking lots of templates in the wild.
|
// without breaking lots of templates in the wild.
|
||||||
getOwner func() Page
|
owner *PageWrapper
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewWeightedPage(weight int, p Page, getOwner func() Page) WeightedPage {
|
// PageWrapper wraps a Page.
|
||||||
return WeightedPage{Weight: weight, Page: p, getOwner: getOwner}
|
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 {
|
func (w WeightedPage) String() string {
|
||||||
|
|
Loading…
Reference in a new issue