From c63db7f1f6774a2d661af1d8197c6fe377e3ad25 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Pedersen?= Date: Mon, 5 Oct 2020 20:01:52 +0200 Subject: Allow cascade to be a slice with a _target discriminator Fixes #7782 --- hugolib/page__meta.go | 61 ++++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 53 insertions(+), 8 deletions(-) (limited to 'hugolib/page__meta.go') 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 { -- cgit v1.2.3