diff --git a/hugolib/page.go b/hugolib/page.go index 322660647..458b96b28 100644 --- a/hugolib/page.go +++ b/hugolib/page.go @@ -405,12 +405,26 @@ func (p *Page) createLayoutDescriptor() output.LayoutDescriptor { default: } + var typeCurrentSection string + var typeRootSection string + curr := p.CurrentSection() + // Make sure we use the contentType only. This is the value from front matter. + if curr != nil { + typeCurrentSection = curr.contentType + } + first := p.FirstSection() + if first != nil { + typeRootSection = first.contentType + } + return output.LayoutDescriptor{ - Kind: p.Kind, - Type: p.Type(), - Lang: p.Lang(), - Layout: p.Layout, - Section: section, + Kind: p.Kind, + Type: p.Type(), + Lang: p.Lang(), + Layout: p.Layout, + Section: section, + TypeCurrentSection: typeCurrentSection, + TypeFirstSection: typeRootSection, } } diff --git a/hugolib/site_sections.go b/hugolib/site_sections.go index c8bca03e3..2537b5d24 100644 --- a/hugolib/site_sections.go +++ b/hugolib/site_sections.go @@ -58,6 +58,29 @@ func (p *Page) CurrentSection() *Page { return v.parent } +// FirstSection returns the section on level 1 below home, e.g. "/docs". +// For the home page, this will return itself. +func (p *Page) FirstSection() *Page { + v := p + if v.origOnCopy != nil { + v = v.origOnCopy + } + + if v.parent == nil || v.parent.IsHome() { + return v + } + + parent := v.parent + for { + current := parent + parent = parent.parent + if parent == nil || parent.IsHome() { + return current + } + } + +} + // InSection returns whether the given page is in the current section. // Note that this will always return false for pages that are // not either regular, home or section pages. diff --git a/hugolib/site_sections_test.go b/hugolib/site_sections_test.go index a1b80407c..9a75f65f9 100644 --- a/hugolib/site_sections_test.go +++ b/hugolib/site_sections_test.go @@ -176,6 +176,8 @@ PAG|{{ .Title }}|{{ $sect.InSection . }} active, err := home.InSection(home) assert.NoError(err) assert.True(active) + assert.Equal(p, p.FirstSection()) + }}, {"l1", func(p *Page) { assert.Equal("L1s", p.title) @@ -250,6 +252,8 @@ PAG|{{ .Title }}|{{ $sect.InSection . }} assert.NoError(err) assert.False(isAncestor) + assert.Equal(l1, p.FirstSection()) + }}, {"perm a,link", func(p *Page) { assert.Equal("T9_-1", p.title) diff --git a/output/layout.go b/output/layout.go index f83490d81..2483093b0 100644 --- a/output/layout.go +++ b/output/layout.go @@ -35,6 +35,12 @@ type LayoutDescriptor struct { Kind string Lang string Layout string + + // Any potential type set in the page's current section and the root section + // it lives in. + TypeFirstSection string + TypeCurrentSection string + // LayoutOverride indicates what we should only look for the above layout. LayoutOverride bool } @@ -127,6 +133,14 @@ func resolvePageTemplate(d LayoutDescriptor, f Format) []string { b.addTypeVariations(d.Type) } + if d.TypeCurrentSection != "" { + b.addTypeVariations(d.TypeCurrentSection) + } + + if d.TypeFirstSection != "" { + b.addTypeVariations(d.TypeFirstSection) + } + switch d.Kind { case "page": b.addLayoutVariations("single") diff --git a/output/layout_test.go b/output/layout_test.go index 4b958e9ff..6754ddb39 100644 --- a/output/layout_test.go +++ b/output/layout_test.go @@ -90,8 +90,13 @@ func TestLayout(t *testing.T) { []string{"_default/mylayout.amp.html", "_default/single.amp.html", "_default/mylayout.html", "_default/single.html"}, 4}, {"Page with layout and type", LayoutDescriptor{Kind: "page", Layout: "mylayout", Type: "myttype"}, "", ampType, []string{"myttype/mylayout.amp.html", "myttype/single.amp.html", "myttype/mylayout.html"}, 8}, - {"Page with layout and type with subtype", LayoutDescriptor{Kind: "page", Layout: "mylayout", Type: "myttype/mysubtype"}, "", ampType, - []string{"myttype/mysubtype/mylayout.amp.html", "myttype/mysubtype/single.amp.html", "myttype/mysubtype/mylayout.html"}, 8}, + {"Page with layout and type with subtype", LayoutDescriptor{Kind: "page", Layout: "mylayout", Type: "myttype/mysubtype", TypeCurrentSection: "cst"}, "", ampType, + []string{"myttype/mysubtype/mylayout.amp.html", "myttype/mysubtype/single.amp.html", "myttype/mysubtype/mylayout.html"}, 12}, + {"Page with type in section", LayoutDescriptor{Kind: "page", TypeCurrentSection: "cst"}, "", ampType, + []string{"cst/single.amp.html", "cst/single.html", "_default/single.amp.html", "_default/single.html"}, 4}, + {"Page with type in root section", LayoutDescriptor{Kind: "page", TypeFirstSection: "cst"}, "", ampType, + []string{"cst/single.amp.html", "cst/single.html", "_default/single.amp.html", "_default/single.html"}, 4}, + // RSS {"RSS Home", LayoutDescriptor{Kind: "home"}, "", RSSFormat, []string{"index.rss.xml", "home.rss.xml", "rss.xml"}, 15},