diff --git a/common/maps/maps_test.go b/common/maps/maps_test.go index b4f9c5a3d..40c8ac824 100644 --- a/common/maps/maps_test.go +++ b/common/maps/maps_test.go @@ -73,10 +73,14 @@ func TestPrepareParams(t *testing.T) { for i, test := range tests { t.Run(fmt.Sprint(i), func(t *testing.T) { // PrepareParams modifies input. + prepareClone := PrepareParamsClone(test.input) PrepareParams(test.input) if !reflect.DeepEqual(test.expected, test.input) { t.Errorf("[%d] Expected\n%#v, got\n%#v\n", i, test.expected, test.input) } + if !reflect.DeepEqual(test.expected, prepareClone) { + t.Errorf("[%d] Expected\n%#v, got\n%#v\n", i, test.expected, prepareClone) + } }) } } diff --git a/common/maps/params.go b/common/maps/params.go index a8cbba555..819f796e4 100644 --- a/common/maps/params.go +++ b/common/maps/params.go @@ -303,7 +303,7 @@ func toMergeStrategy(v any) ParamsMergeStrategy { } // PrepareParams -// * makes all the keys in the given map lower cased and will do so +// * makes all the keys in the given map lower cased and will do so recursively. // * This will modify the map given. // * Any nested map[interface{}]interface{}, map[string]interface{},map[string]string will be converted to Params. // * Any _merge value will be converted to proper type and value. @@ -343,3 +343,42 @@ func PrepareParams(m Params) { } } } + +// PrepareParamsClone is like PrepareParams, but it does not modify the input. +func PrepareParamsClone(m Params) Params { + m2 := make(Params) + for k, v := range m { + var retyped bool + lKey := strings.ToLower(k) + if lKey == MergeStrategyKey { + v = toMergeStrategy(v) + retyped = true + } else { + switch vv := v.(type) { + case map[any]any: + var p Params = cast.ToStringMap(v) + v = PrepareParamsClone(p) + retyped = true + case map[string]any: + var p Params = v.(map[string]any) + v = PrepareParamsClone(p) + retyped = true + case map[string]string: + p := make(Params) + for k, v := range vv { + p[k] = v + } + v = p + PrepareParams(p) + retyped = true + } + } + + if retyped || k != lKey { + m2[lKey] = v + } else { + m2[k] = v + } + } + return m2 +} diff --git a/resources/page/pagemeta/page_frontmatter.go b/resources/page/pagemeta/page_frontmatter.go index 21789909e..60ba0e00a 100644 --- a/resources/page/pagemeta/page_frontmatter.go +++ b/resources/page/pagemeta/page_frontmatter.go @@ -158,8 +158,11 @@ func (p *PageConfig) Compile(basePath string, pagesFromData bool, ext string, lo if p.Params == nil { p.Params = make(maps.Params) + } else if pagesFromData { + p.Params = maps.PrepareParamsClone(p.Params) + } else { + maps.PrepareParams(p.Params) } - maps.PrepareParams(p.Params) if p.Content.Markup == "" && p.Content.MediaType == "" { if ext == "" {