Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/gohugoio/hugo.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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},