Add .RegularPagesRecursive

Fixes #6411
This commit is contained in:
Bjørn Erik Pedersen 2020-03-16 11:37:57 +01:00
parent 94fb4dc3dd
commit 03b93bb988
8 changed files with 100 additions and 2 deletions

View file

@ -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) {

View file

@ -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()

View file

@ -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 {
@ -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

View file

@ -141,4 +141,6 @@ type pagePages struct {
regularPagesInit sync.Once
regularPages page.Pages
regularPagesRecursiveInit sync.Once
regularPagesRecursive page.Pages
}

View file

@ -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.
`)
}

View file

@ -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
}

View file

@ -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
}

View file

@ -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
}