Skip to content

Commit

Permalink
Fix WeightedPages in union etc.
Browse files Browse the repository at this point in the history
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
  • Loading branch information
bep committed Apr 13, 2019
1 parent e85c057 commit f2795d4
Show file tree
Hide file tree
Showing 4 changed files with 46 additions and 14 deletions.
31 changes: 31 additions & 0 deletions hugolib/collections_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,37 @@ tags_weight: %d
`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)

Expand Down
2 changes: 1 addition & 1 deletion hugolib/site.go
Original file line number Diff line number Diff line change
Expand Up @@ -1584,7 +1584,7 @@ func (s *Site) assembleTaxonomies() error {
// 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)

Expand Down
10 changes: 3 additions & 7 deletions hugolib/taxonomy.go
Original file line number Diff line number Diff line change
Expand Up @@ -175,7 +175,7 @@ type taxonomyNodeInfo struct {
parent *taxonomyNodeInfo

// Either of Kind taxonomyTerm (parent) or taxonomy
owner page.Page
owner *page.PageWrapper
}

func (t *taxonomyNodeInfo) UpdateFromPage(p page.Page) {
Expand All @@ -185,17 +185,12 @@ func (t *taxonomyNodeInfo) UpdateFromPage(p page.Page) {
}

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
Expand All @@ -216,6 +211,7 @@ func (t taxonomyNodeInfos) GetOrCreate(plural, termKey, term string) *taxonomyNo
plural: plural,
termKey: termKey,
term: term,
owner: &page.PageWrapper{}, // Page will be assigned later.
}

t[key] = n
Expand Down
17 changes: 11 additions & 6 deletions resources/page/weighted.go
Original file line number Diff line number Diff line change
Expand Up @@ -38,27 +38,32 @@ func (p WeightedPages) Page() Page {
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.
type WeightedPage struct {
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 {
Expand Down

0 comments on commit f2795d4

Please sign in to comment.