summaryrefslogtreecommitdiffstats
path: root/hugolib/page__tree.go
diff options
context:
space:
mode:
Diffstat (limited to 'hugolib/page__tree.go')
-rw-r--r--hugolib/page__tree.go212
1 files changed, 106 insertions, 106 deletions
diff --git a/hugolib/page__tree.go b/hugolib/page__tree.go
index 8b02667f1..e54d596bc 100644
--- a/hugolib/page__tree.go
+++ b/hugolib/page__tree.go
@@ -14,169 +14,121 @@
package hugolib
import (
- "path"
+ "context"
+ "fmt"
"strings"
+ "github.com/gohugoio/hugo/common/paths"
"github.com/gohugoio/hugo/common/types"
+ "github.com/gohugoio/hugo/hugolib/doctree"
"github.com/gohugoio/hugo/resources/kinds"
"github.com/gohugoio/hugo/resources/page"
)
+// pageTree holds the treen navigational method for a Page.
type pageTree struct {
p *pageState
}
-func (pt pageTree) IsAncestor(other any) (bool, error) {
- if pt.p == nil {
- return false, nil
- }
-
- tp, ok := other.(treeRefProvider)
+func (pt pageTree) IsAncestor(other any) bool {
+ n, ok := other.(contentNodeI)
if !ok {
- return false, nil
+ return false
}
- ref1, ref2 := pt.p.getTreeRef(), tp.getTreeRef()
- if ref1 != nil && ref2 != nil && ref1.key == ref2.key {
- return false, nil
+ if n.Path() == pt.p.Path() {
+ return false
}
- if ref1 != nil && ref1.key == "/" {
- return true, nil
- }
-
- if ref1 == nil || ref2 == nil {
- if ref1 == nil {
- // A 404 or other similar standalone page.
- return false, nil
- }
+ return strings.HasPrefix(n.Path(), paths.AddTrailingSlash(pt.p.Path()))
+}
- return ref1.n.p.IsHome(), nil
+func (pt pageTree) IsDescendant(other any) bool {
+ n, ok := other.(contentNodeI)
+ if !ok {
+ return false
}
- if strings.HasPrefix(ref2.key, ref1.key) {
- return true, nil
+ if n.Path() == pt.p.Path() {
+ return false
}
- return strings.HasPrefix(ref2.key, ref1.key+cmBranchSeparator), nil
+ return strings.HasPrefix(pt.p.Path(), paths.AddTrailingSlash(n.Path()))
}
func (pt pageTree) CurrentSection() page.Page {
- p := pt.p
-
- if p.IsHome() || p.IsSection() {
- return p
+ if kinds.IsBranch(pt.p.Kind()) {
+ return pt.p
}
- return p.Parent()
-}
-
-func (pt pageTree) IsDescendant(other any) (bool, error) {
- if pt.p == nil {
- return false, nil
+ dir := pt.p.m.pathInfo.Dir()
+ if dir == "/" {
+ return pt.p.s.home
}
- tp, ok := other.(treeRefProvider)
- if !ok {
- return false, nil
+ _, n := pt.p.s.pageMap.treePages.LongestPrefix(dir, true, func(n contentNodeI) bool { return n.isContentNodeBranch() })
+ if n != nil {
+ return n.(page.Page)
}
- ref1, ref2 := pt.p.getTreeRef(), tp.getTreeRef()
- if ref1 != nil && ref2 != nil && ref1.key == ref2.key {
- return false, nil
- }
+ panic(fmt.Sprintf("CurrentSection not found for %q in lang %s", pt.p.Path(), pt.p.Lang()))
+}
- if ref2 != nil && ref2.key == "/" {
- return true, nil
+func (pt pageTree) FirstSection() page.Page {
+ s := pt.p.m.pathInfo.Dir()
+ if s == "/" {
+ return pt.p.s.home
}
- if ref1 == nil || ref2 == nil {
- if ref2 == nil {
- // A 404 or other similar standalone page.
- return false, nil
+ for {
+ k, n := pt.p.s.pageMap.treePages.LongestPrefix(s, true, func(n contentNodeI) bool { return n.isContentNodeBranch() })
+ if n == nil {
+ return nil
}
- return ref2.n.p.IsHome(), nil
- }
-
- if strings.HasPrefix(ref1.key, ref2.key) {
- return true, nil
- }
-
- return strings.HasPrefix(ref1.key, ref2.key+cmBranchSeparator), nil
-}
+ // /blog
+ if strings.Count(k, "/") < 2 {
+ return n.(page.Page)
+ }
-func (pt pageTree) FirstSection() page.Page {
- ref := pt.p.getTreeRef()
- if ref == nil {
- return pt.p.s.home
- }
- key := ref.key
+ if s == "" {
+ return nil
+ }
- if !ref.isSection() {
- key = path.Dir(key)
- }
+ s = paths.Dir(s)
- _, b := ref.m.getFirstSection(key)
- if b == nil {
- return nil
}
- return b.p
}
-func (pt pageTree) InSection(other any) (bool, error) {
+func (pt pageTree) InSection(other any) bool {
if pt.p == nil || types.IsNil(other) {
- return false, nil
+ return false
}
- tp, ok := other.(treeRefProvider)
+ p, ok := other.(page.Page)
if !ok {
- return false, nil
+ return false
}
- ref1, ref2 := pt.p.getTreeRef(), tp.getTreeRef()
-
- if ref1 == nil || ref2 == nil {
- if ref1 == nil {
- // A 404 or other similar standalone page.
- return false, nil
- }
- return ref1.n.p.IsHome(), nil
- }
-
- s1, _ := ref1.getCurrentSection()
- s2, _ := ref2.getCurrentSection()
-
- return s1 == s2, nil
-}
-
-func (pt pageTree) Page() page.Page {
- return pt.p
+ return pt.CurrentSection() == p.CurrentSection()
}
func (pt pageTree) Parent() page.Page {
- p := pt.p
-
- if p.parent != nil {
- return p.parent
- }
-
if pt.p.IsHome() {
return nil
}
- tree := p.getTreeRef()
+ dir := pt.p.m.pathInfo.ContainerDir()
- if tree == nil || pt.p.Kind() == kinds.KindTaxonomy {
+ if dir == "" {
return pt.p.s.home
}
- _, b := tree.getSection()
- if b == nil {
- return nil
+ _, n := pt.p.s.pageMap.treePages.LongestPrefix(dir, true, nil)
+ if n != nil {
+ return n.(page.Page)
}
-
- return b.p
+ return nil
}
func (pt pageTree) Ancestors() page.Pages {
@@ -190,9 +142,57 @@ func (pt pageTree) Ancestors() page.Pages {
}
func (pt pageTree) Sections() page.Pages {
- if pt.p.bucket == nil {
+ var (
+ pages page.Pages
+ currentBranchPrefix string
+ s = pt.p.Path()
+ prefix = paths.AddTrailingSlash(s)
+ tree = pt.p.s.pageMap.treePages
+ )
+
+ w := &doctree.NodeShiftTreeWalker[contentNodeI]{
+ Tree: tree,
+ Prefix: prefix,
+ }
+ w.Handle = func(ss string, n contentNodeI, match doctree.DimensionFlag) (bool, error) {
+ if !n.isContentNodeBranch() {
+ return false, nil
+ }
+ if currentBranchPrefix == "" || !strings.HasPrefix(ss, currentBranchPrefix) {
+ if p, ok := n.(*pageState); ok && p.IsSection() && p.m.shouldList(false) && p.Parent() == pt.p {
+ pages = append(pages, p)
+ } else {
+ w.SkipPrefix(ss + "/")
+ }
+ }
+ currentBranchPrefix = ss + "/"
+ return false, nil
+ }
+
+ if err := w.Walk(context.Background()); err != nil {
+ panic(err)
+ }
+
+ page.SortByDefault(pages)
+ return pages
+}
+
+func (pt pageTree) Page() page.Page {
+ return pt.p
+}
+
+func (p pageTree) SectionsEntries() []string {
+ sp := p.SectionsPath()
+ if sp == "/" {
+ return nil
+ }
+ entries := strings.Split(sp[1:], "/")
+ if len(entries) == 0 {
return nil
}
+ return entries
+}
- return pt.p.bucket.getSections()
+func (p pageTree) SectionsPath() string {
+ return p.CurrentSection().Path()
}