Skip to content

Commit

Permalink
Add .RegularPagesRecursive
Browse files Browse the repository at this point in the history
  • Loading branch information
bep committed Mar 16, 2020
1 parent 94fb4dc commit f91a828
Show file tree
Hide file tree
Showing 8 changed files with 100 additions and 2 deletions.
13 changes: 13 additions & 0 deletions hugolib/content_map.go
Original file line number Diff line number Diff line change
Expand Up @@ -941,6 +941,19 @@ func (c *contentTreeRef) collectPages() page.Pages {
return pas
}

func (c *contentTreeRef) collectPagesRecursive() page.Pages {
var pas page.Pages
c.m.collectPages(c.key+cmBranchSeparator, func(c *contentNode) {
pas = append(pas, c.p)
})
c.m.collectPages(c.key+"/", func(c *contentNode) {
pas = append(pas, c.p)
})
page.SortByDefault(pas)

return pas
}

func (c *contentTreeRef) collectPagesAndSections() page.Pages {
var pas page.Pages
c.m.collectPagesAndSections(c.key, func(c *contentNode) {
Expand Down
6 changes: 6 additions & 0 deletions hugolib/content_map_page.go
Original file line number Diff line number Diff line change
Expand Up @@ -803,6 +803,12 @@ func (b *pagesMapBucket) getPages() page.Pages {
return b.pages
}

func (b *pagesMapBucket) getPagesRecursive() page.Pages {
pages := b.owner.treeRef.collectPagesRecursive()
page.SortByDefault(pages)
return pages
}

func (b *pagesMapBucket) getPagesAndSections() page.Pages {
b.pagesAndSectionsInit.Do(func() {
b.pagesAndSections = b.owner.treeRef.collectPagesAndSections()
Expand Down
26 changes: 26 additions & 0 deletions hugolib/page.go
Original file line number Diff line number Diff line change
Expand Up @@ -171,6 +171,14 @@ func (p *pageState) getPages() page.Pages {
return b.getPages()
}

func (p *pageState) getPagesRecursive() page.Pages {
b := p.bucket
if b == nil {
return nil
}
return b.getPagesRecursive()
}

func (p *pageState) getPagesAndSections() page.Pages {
b := p.bucket
if b == nil {
Expand All @@ -179,6 +187,24 @@ func (p *pageState) getPagesAndSections() page.Pages {
return b.getPagesAndSections()
}

func (p *pageState) RegularPagesRecursive() page.Pages {
p.regularPagesRecursiveInit.Do(func() {
var pages page.Pages
switch p.Kind() {
case page.KindSection:
pages = p.getPagesRecursive()
default:
pages = p.RegularPages()
}
p.regularPagesRecursive = pages
})
return p.regularPagesRecursive
}

func (p *pageState) PagesRecursive() page.Pages {
return nil
}

func (p *pageState) RegularPages() page.Pages {
p.regularPagesInit.Do(func() {
var pages page.Pages
Expand Down
6 changes: 4 additions & 2 deletions hugolib/page__common.go
Original file line number Diff line number Diff line change
Expand Up @@ -139,6 +139,8 @@ type pagePages struct {
pagesInit sync.Once
pages page.Pages

regularPagesInit sync.Once
regularPages page.Pages
regularPagesInit sync.Once
regularPages page.Pages
regularPagesRecursiveInit sync.Once
regularPagesRecursive page.Pages
}
39 changes: 39 additions & 0 deletions hugolib/pagecollections_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -383,3 +383,42 @@ func TestShouldDoSimpleLookup(t *testing.T) {
c.Assert(shouldDoSimpleLookup("docs/foo.md"), qt.Equals, false)

}

func TestRegularPagesRecursive(t *testing.T) {
b := newTestSitesBuilder(t)

b.WithConfigFile("yaml", `
baseURL: "http://example.org/"
title: "My New Hugo Site"
`)

b.WithContent(
"docs/1.md", "\n---title: docs1\n---",
"docs/sect1/_index.md", "\n---title: docs_sect1\n---",
"docs/sect1/ps1.md", "\n---title: docs_sect1_ps1\n---",
"docs/sect1/ps2.md", "\n---title: docs_sect1_ps2\n---",
"docs/sect1/sect1_s2/_index.md", "\n---title: docs_sect1_s2\n---",
"docs/sect1/sect1_s2/ps2_1.md", "\n---title: docs_sect1_s2_1\n---",
"docs/sect2/_index.md", "\n---title: docs_sect2\n---",
"docs/sect2/ps1.md", "\n---title: docs_sect2_ps1\n---",
"docs/sect2/ps2.md", "\n---title: docs_sect2_ps2\n---",
"news/1.md", "\n---title: news1\n---",
)

b.WithTemplates("index.html", `
{{ $sect1 := site.GetPage "sect1" }}
Sect1 RegularPagesRecursive: {{ range $sect1.RegularPagesRecursive }}{{ .Kind }}:{{ .RelPermalink}}|{{ end }}|End.
`)

b.Build(BuildCfg{})

b.AssertFileContent("public/index.html", `
Sect1 RegularPagesRecursive: page:/docs/sect1/ps1/|page:/docs/sect1/ps2/|page:/docs/sect1/sect1_s2/ps2_1/||End.
`)

}
4 changes: 4 additions & 0 deletions resources/page/page.go
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,10 @@ type ChildCareProvider interface {
// use RegularPages.
RegularPages() Pages

// RegularPagesRecursive returns all regular pages below the current
// section.
RegularPagesRecursive() Pages

Resources() resource.Resources
}

Expand Down
4 changes: 4 additions & 0 deletions resources/page/page_nop.go
Original file line number Diff line number Diff line change
Expand Up @@ -294,6 +294,10 @@ func (p *nopPage) RegularPages() Pages {
return nil
}

func (p *nopPage) RegularPagesRecursive() Pages {
return nil
}

func (p *nopPage) Paginate(seq interface{}, options ...interface{}) (*Pager, error) {
return nil, nil
}
Expand Down
4 changes: 4 additions & 0 deletions resources/page/testhelpers_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -364,6 +364,10 @@ func (p *testPage) RegularPages() Pages {
panic("not implemented")
}

func (p *testPage) RegularPagesRecursive() Pages {
panic("not implemented")
}

func (p *testPage) Paginate(seq interface{}, options ...interface{}) (*Pager, error) {
return nil, nil
}
Expand Down

0 comments on commit f91a828

Please sign in to comment.