summaryrefslogtreecommitdiffstats
path: root/hugolib/page__meta.go
diff options
context:
space:
mode:
authorBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>2020-10-05 20:01:52 +0200
committerBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>2020-10-06 14:06:10 +0200
commitc63db7f1f6774a2d661af1d8197c6fe377e3ad25 (patch)
treebbeccc7dd4f41acdcc1cfd584ea351e6284869d5 /hugolib/page__meta.go
parent5e2a547cb594b31ecb0f089b08db2e15c6dc381a (diff)
Allow cascade to be a slice with a _target discriminator
Fixes #7782
Diffstat (limited to 'hugolib/page__meta.go')
-rw-r--r--hugolib/page__meta.go61
1 files changed, 53 insertions, 8 deletions
diff --git a/hugolib/page__meta.go b/hugolib/page__meta.go
index 0e16292f0..c7a8db3d5 100644
--- a/hugolib/page__meta.go
+++ b/hugolib/page__meta.go
@@ -308,12 +308,22 @@ func (p *pageMeta) Weight() int {
func (pm *pageMeta) mergeBucketCascades(b1, b2 *pagesMapBucket) {
if b1.cascade == nil {
- b1.cascade = make(map[string]interface{})
+ b1.cascade = make(map[page.PageMatcher]maps.Params)
}
+
if b2 != nil && b2.cascade != nil {
for k, v := range b2.cascade {
- if _, found := b1.cascade[k]; !found {
+
+ vv, found := b1.cascade[k]
+ if !found {
b1.cascade[k] = v
+ } else {
+ // Merge
+ for ck, cv := range v {
+ if _, found := vv[ck]; !found {
+ vv[ck] = cv
+ }
+ }
}
}
}
@@ -332,14 +342,44 @@ 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 {
- p.bucket.cascade = maps.ToStringMap(cv)
+ switch v := cv.(type) {
+ case []map[string]interface{}:
+ 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
+ }
+
+ }
+ default:
+ p.bucket.cascade = map[page.PageMatcher]maps.Params{
+ page.PageMatcher{}: maps.ToStringMap(cv),
+ }
+ }
+
}
}
} else {
frontmatter = make(map[string]interface{})
}
- var cascade map[string]interface{}
+ var cascade map[page.PageMatcher]maps.Params
if p.bucket != nil {
if parentBucket != nil {
@@ -351,9 +391,14 @@ func (pm *pageMeta) setMetadata(parentBucket *pagesMapBucket, p *pageState, fron
cascade = parentBucket.cascade
}
- for k, v := range cascade {
- if _, found := frontmatter[k]; !found {
- frontmatter[k] = v
+ for m, v := range cascade {
+ if !m.Matches(p) {
+ continue
+ }
+ for kk, vv := range v {
+ if _, found := frontmatter[kk]; !found {
+ frontmatter[kk] = vv
+ }
}
}
@@ -466,7 +511,7 @@ func (pm *pageMeta) setMetadata(parentBucket *pagesMapBucket, p *pageState, fron
case "outputs":
o := cast.ToStringSlice(v)
if len(o) > 0 {
- // Output formats are exlicitly set in front matter, use those.
+ // Output formats are explicitly set in front matter, use those.
outFormats, err := p.s.outputFormatsConfig.GetByNames(o...)
if err != nil {