Skip to content

Commit

Permalink
Consider root and current section's content type if set in front matter
Browse files Browse the repository at this point in the history
This should allow for less duplication of templates. Before this commit it was possible to override the content page of a given page/section, but only one page at a time.

Full "template sets" can now be inherited by setting `type: blog` etc. in the section content page's front matter, and that type will be considered when looking for layouts for all pages in that section.

For nested sections, it will use consider both `type` set in the current section first, then `type` set in the first section below home, e.g. `/docs`.

This commit also adds a new Page method: `FirstSection`. This navigates up to the first section below home (e.g. `/docs`). For the home page it will return itself.

Fixes #4891
  • Loading branch information
bep committed Jun 30, 2018
1 parent 554553c commit c790029
Show file tree
Hide file tree
Showing 5 changed files with 67 additions and 7 deletions.
24 changes: 19 additions & 5 deletions hugolib/page.go
Original file line number Diff line number Diff line change
Expand Up @@ -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,
}
}

Expand Down
23 changes: 23 additions & 0 deletions hugolib/site_sections.go
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down
4 changes: 4 additions & 0 deletions hugolib/site_sections_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -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)
Expand Down
14 changes: 14 additions & 0 deletions output/layout.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
}
Expand Down Expand Up @@ -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")
Expand Down
9 changes: 7 additions & 2 deletions output/layout_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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},
Expand Down

0 comments on commit c790029

Please sign in to comment.