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:
authorBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>2021-07-09 12:52:03 +0300
committerBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>2021-07-10 12:13:41 +0300
commit5cb52c23150032b3fdb211a095745c512369b463 (patch)
tree3b0c83c462e15e4e55acdf674b70c6ef140291c0 /hugolib
parent30eea3915b67f72611a3b2f4547146d4c6a96864 (diff)
Add config.cascade
This commit adds support for using the `cascade` keyword in your configuration file(s), e.g. `config.toml`. Note that * Every feature of `cascade` is available, e.g. `_target` to target specific page sets. * Pages, e.g. the home page, can overwrite the cascade defined in config. Fixes #8741
Diffstat (limited to 'hugolib')
-rw-r--r--hugolib/cascade_test.go65
-rw-r--r--hugolib/content_map_page.go3
-rw-r--r--hugolib/page__meta.go32
-rw-r--r--hugolib/site.go22
4 files changed, 91 insertions, 31 deletions
diff --git a/hugolib/cascade_test.go b/hugolib/cascade_test.go
index 78409a4b1..000b641e5 100644
--- a/hugolib/cascade_test.go
+++ b/hugolib/cascade_test.go
@@ -20,6 +20,8 @@ import (
"strings"
"testing"
+ "github.com/gohugoio/hugo/common/maps"
+
qt "github.com/frankban/quicktest"
"github.com/gohugoio/hugo/parser"
"github.com/gohugoio/hugo/parser/metadecoders"
@@ -50,6 +52,69 @@ func BenchmarkCascade(b *testing.B) {
}
}
+func TestCascadeConfig(t *testing.T) {
+ c := qt.New(t)
+
+ // Make sure the cascade from config gets applied even if we're not
+ // having a content file for the home page.
+ for _, withHomeContent := range []bool{true, false} {
+ testName := "Home content file"
+ if !withHomeContent {
+ testName = "No home content file"
+ }
+ c.Run(testName, func(c *qt.C) {
+ b := newTestSitesBuilder(c)
+
+ b.WithConfigFile("toml", `
+baseURL="https://example.org"
+
+[cascade]
+img1 = "img1-config.jpg"
+imgconfig = "img-config.jpg"
+
+`)
+
+ if withHomeContent {
+ b.WithContent("_index.md", `
+---
+title: "Home"
+cascade:
+ img1: "img1-home.jpg"
+ img2: "img2-home.jpg"
+---
+`)
+ }
+
+ b.WithContent("p1.md", ``)
+
+ b.Build(BuildCfg{})
+
+ p1 := b.H.Sites[0].getPage("p1")
+
+ if withHomeContent {
+ b.Assert(p1.Params(), qt.DeepEquals, maps.Params{
+ "imgconfig": "img-config.jpg",
+ "draft": bool(false),
+ "iscjklanguage": bool(false),
+ "img1": "img1-home.jpg",
+ "img2": "img2-home.jpg",
+ })
+ } else {
+ b.Assert(p1.Params(), qt.DeepEquals, maps.Params{
+ "img1": "img1-config.jpg",
+ "imgconfig": "img-config.jpg",
+ "draft": bool(false),
+ "iscjklanguage": bool(false),
+ })
+
+ }
+
+ })
+
+ }
+
+}
+
func TestCascade(t *testing.T) {
allLangs := []string{"en", "nn", "nb", "sv"}
diff --git a/hugolib/content_map_page.go b/hugolib/content_map_page.go
index 74dd0e029..278d24766 100644
--- a/hugolib/content_map_page.go
+++ b/hugolib/content_map_page.go
@@ -462,10 +462,13 @@ func (m *pageMap) assembleSections() error {
if parent != nil {
parentBucket = parent.p.bucket
+ } else if s == "/" {
+ parentBucket = m.s.siteBucket
}
kind := page.KindSection
if s == "/" {
+
kind = page.KindHome
}
diff --git a/hugolib/page__meta.go b/hugolib/page__meta.go
index 759fadd2d..3b31cb299 100644
--- a/hugolib/page__meta.go
+++ b/hugolib/page__meta.go
@@ -340,34 +340,10 @@ func (pm *pageMeta) setMetadata(parentBucket *pagesMapBucket, p *pageState, fron
if p.bucket != nil {
// Check for any cascade define on itself.
if cv, found := frontmatter["cascade"]; found {
- if v, err := maps.ToSliceStringMap(cv); err == nil {
- p.bucket.cascade = make(map[page.PageMatcher]maps.Params)
-
- for _, vv := range v {
- var m page.PageMatcher
- if mv, found := vv["_target"]; found {
- err := page.DecodePageMatcher(mv, &m)
- if err != nil {
- return err
- }
- }
- c, found := p.bucket.cascade[m]
- if found {
- // Merge
- for k, v := range vv {
- if _, found := c[k]; !found {
- c[k] = v
- }
- }
- } else {
- p.bucket.cascade[m] = vv
- }
-
- }
- } else {
- p.bucket.cascade = map[page.PageMatcher]maps.Params{
- {}: maps.ToStringMap(cv),
- }
+ var err error
+ p.bucket.cascade, err = page.DecodeCascade(cv)
+ if err != nil {
+ return err
}
}
}
diff --git a/hugolib/site.go b/hugolib/site.go
index 2e7e1d7f9..fe7305b91 100644
--- a/hugolib/site.go
+++ b/hugolib/site.go
@@ -103,7 +103,7 @@ import (
type Site struct {
// The owning container. When multiple languages, there will be multiple
- // sites.
+ // sites .
h *HugoSites
*PageCollections
@@ -113,7 +113,8 @@ type Site struct {
Sections Taxonomy
Info *SiteInfo
- language *langs.Language
+ language *langs.Language
+ siteBucket *pagesMapBucket
siteCfg siteConfigHolder
@@ -388,6 +389,7 @@ func (s *Site) reset() *Site {
frontmatterHandler: s.frontmatterHandler,
mediaTypesConfig: s.mediaTypesConfig,
language: s.language,
+ siteBucket: s.siteBucket,
h: s.h,
publisher: s.publisher,
siteConfigConfig: s.siteConfigConfig,
@@ -539,9 +541,23 @@ But this also means that your site configuration may not do what you expect. If
enableEmoji: cfg.Language.Cfg.GetBool("enableEmoji"),
}
- s := &Site{
+ var siteBucket *pagesMapBucket
+ if cfg.Language.IsSet("cascade") {
+ var err error
+ cascade, err := page.DecodeCascade(cfg.Language.Get("cascade"))
+ if err != nil {
+ return nil, errors.Errorf("failed to decode cascade config: %s", err)
+ }
+ siteBucket = &pagesMapBucket{
+ cascade: cascade,
+ }
+
+ }
+
+ s := &Site{
language: cfg.Language,
+ siteBucket: siteBucket,
disabledKinds: disabledKinds,
outputFormats: outputFormats,