diff options
author | Bjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com> | 2016-10-16 19:28:21 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2016-10-16 19:28:21 +0200 |
commit | 40b1b8f70373dacf2458fbd9a67be32fc6830f91 (patch) | |
tree | fb03f4cde8daecd30c5e85c989a38a9fde5a2b3c /helpers | |
parent | 4d6cd3cb2aa46df781adde8debf9f64d50973365 (diff) |
Fix case issue Viper vs Blackfriday config
There are still work to be done in the case department, but that will have to be another day.
Fixes #2581
See https://github.com/spf13/viper/issues/261
Diffstat (limited to 'helpers')
-rw-r--r-- | helpers/content.go | 21 | ||||
-rw-r--r-- | helpers/general.go | 23 | ||||
-rw-r--r-- | helpers/general_test.go | 53 |
3 files changed, 90 insertions, 7 deletions
diff --git a/helpers/content.go b/helpers/content.go index 516fc72b9..aa1327d74 100644 --- a/helpers/content.go +++ b/helpers/content.go @@ -27,7 +27,6 @@ import ( "github.com/miekg/mmark" "github.com/mitchellh/mapstructure" "github.com/russross/blackfriday" - "github.com/spf13/cast" bp "github.com/spf13/hugo/bufferpool" jww "github.com/spf13/jwalterweatherman" "github.com/spf13/viper" @@ -60,7 +59,8 @@ type Blackfriday struct { // NewBlackfriday creates a new Blackfriday filled with site config or some sane defaults. func NewBlackfriday(c ConfigProvider) *Blackfriday { - combinedParam := map[string]interface{}{ + + defaultParam := map[string]interface{}{ "smartypants": true, "angledQuotes": false, "fractions": true, @@ -73,17 +73,24 @@ func NewBlackfriday(c ConfigProvider) *Blackfriday { "sourceRelativeLinksProjectFolder": "/docs/content", } + ToLowerMap(defaultParam) + siteParam := c.GetStringMap("blackfriday") - if siteParam != nil { - siteConfig := cast.ToStringMap(siteParam) - for key, value := range siteConfig { - combinedParam[key] = value + siteConfig := make(map[string]interface{}) + + for k, v := range defaultParam { + siteConfig[k] = v + } + + if siteParam != nil { + for k, v := range siteParam { + siteConfig[k] = v } } combinedConfig := &Blackfriday{} - if err := mapstructure.Decode(combinedParam, combinedConfig); err != nil { + if err := mapstructure.Decode(siteConfig, combinedConfig); err != nil { jww.FATAL.Printf("Failed to get site rendering config\n%s", err.Error()) } diff --git a/helpers/general.go b/helpers/general.go index b420bfa2c..ba828ed8c 100644 --- a/helpers/general.go +++ b/helpers/general.go @@ -119,6 +119,29 @@ func ReaderToBytes(lines io.Reader) []byte { return bc } +// ToLowerMap makes all the keys in the given map lower cased and will do so +// recursively. +// Notes: +// * This will modify the map given. +// * Any nested map[interface{}]interface{} will be converted to map[string]interface{}. +func ToLowerMap(m map[string]interface{}) { + for k, v := range m { + switch v.(type) { + case map[interface{}]interface{}: + v = cast.ToStringMap(v) + ToLowerMap(v.(map[string]interface{})) + case map[string]interface{}: + ToLowerMap(v.(map[string]interface{})) + } + + lKey := strings.ToLower(k) + if k != lKey { + delete(m, k) + } + m[lKey] = v + } +} + // ReaderToString is the same as ReaderToBytes, but returns a string. func ReaderToString(lines io.Reader) string { if lines == nil { diff --git a/helpers/general_test.go b/helpers/general_test.go index 089bb9b1a..8afdb59eb 100644 --- a/helpers/general_test.go +++ b/helpers/general_test.go @@ -291,3 +291,56 @@ func TestDoArithmetic(t *testing.T) { } } } + +func TestToLowerMap(t *testing.T) { + + tests := []struct { + input map[string]interface{} + expected map[string]interface{} + }{ + { + map[string]interface{}{ + "abC": 32, + }, + map[string]interface{}{ + "abc": 32, + }, + }, + { + map[string]interface{}{ + "abC": 32, + "deF": map[interface{}]interface{}{ + 23: "A value", + 24: map[string]interface{}{ + "AbCDe": "A value", + "eFgHi": "Another value", + }, + }, + "gHi": map[string]interface{}{ + "J": 25, + }, + }, + map[string]interface{}{ + "abc": 32, + "def": map[string]interface{}{ + "23": "A value", + "24": map[string]interface{}{ + "abcde": "A value", + "efghi": "Another value", + }, + }, + "ghi": map[string]interface{}{ + "j": 25, + }, + }, + }, + } + + for i, test := range tests { + // ToLowerMap modifies input. + ToLowerMap(test.input) + if !reflect.DeepEqual(test.expected, test.input) { + t.Errorf("[%d] Expected\n%#v, got\n%#v\n", i, test.expected, test.input) + } + } +} |