diff options
author | Bjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com> | 2020-10-05 20:01:52 +0200 |
---|---|---|
committer | Bjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com> | 2020-10-06 14:06:10 +0200 |
commit | c63db7f1f6774a2d661af1d8197c6fe377e3ad25 (patch) | |
tree | bbeccc7dd4f41acdcc1cfd584ea351e6284869d5 /hugolib/page__meta.go | |
parent | 5e2a547cb594b31ecb0f089b08db2e15c6dc381a (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.go | 61 |
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 { |