summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>2018-06-30 13:03:26 +0200
committerBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>2018-06-30 13:10:04 +0200
commitc790029e1dbb0b66af18d05764bd6045deb2e180 (patch)
tree6273e53cc6f6910b6a43d317178dcafc8506d3fb
parent554553c09c7657d28681e1fa0638806a452737a0 (diff)
Consider root and current section's content type if set in front matter
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
-rw-r--r--hugolib/page.go24
-rw-r--r--hugolib/site_sections.go23
-rw-r--r--hugolib/site_sections_test.go4
-rw-r--r--output/layout.go14
-rw-r--r--output/layout_test.go9
5 files changed, 67 insertions, 7 deletions
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},