From 79639c981cf69193fb21d97773d928c089714750 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Pedersen?= Date: Wed, 28 Jun 2023 10:01:44 +0200 Subject: [PATCH] Fix output formats and media type per language config regression Fixes #11159 --- config/allconfig/alldecoders.go | 32 ++++++++++++++++------ hugolib/config_test.go | 42 +++++++++++++++++++++++++++++ tpl/collections/integration_test.go | 37 ++++++++++--------------- 3 files changed, 80 insertions(+), 31 deletions(-) diff --git a/config/allconfig/alldecoders.go b/config/allconfig/alldecoders.go index 4d9ef4f85..bda3122d3 100644 --- a/config/allconfig/alldecoders.go +++ b/config/allconfig/alldecoders.go @@ -138,8 +138,8 @@ var allDecoderSetups = map[string]decodeWeight{ return err }, }, - "mediaTypes": { - key: "mediaTypes", + "mediatypes": { + key: "mediatypes", decode: func(d decodeWeight, p decodeConfig) error { var err error p.c.MediaTypes, err = media.DecodeTypes(p.p.GetStringMap(d.key)) @@ -168,8 +168,8 @@ var allDecoderSetups = map[string]decodeWeight{ return nil }, }, - "outputFormats": { - key: "outputFormats", + "outputformats": { + key: "outputformats", decode: func(d decodeWeight, p decodeConfig) error { var err error p.c.OutputFormats, err = output.DecodeConfig(p.c.MediaTypes.Config, p.p.Get(d.key)) @@ -221,9 +221,9 @@ var allDecoderSetups = map[string]decodeWeight{ // key = '...' // To sucessfully be backward compatible, "default" patterns need to be set for both page and term - p.c.Permalinks["page"][k] = v; - p.c.Permalinks["term"][k] = v; - + p.c.Permalinks["page"][k] = v + p.c.Permalinks["term"][k] = v + case maps.Params: // [permalinks.key] // xyz = ??? @@ -234,7 +234,7 @@ var allDecoderSetups = map[string]decodeWeight{ switch v2 := v2.(type) { case string: p.c.Permalinks[k][k2] = v2 - + default: return fmt.Errorf("permalinks configuration invalid: unknown value %q for key %q for kind %q", v2, k2, k) } @@ -410,3 +410,19 @@ var allDecoderSetups = map[string]decodeWeight{ }, }, } + +func init() { + for k, v := range allDecoderSetups { + // Verify that k and v.key is all lower case. + if k != strings.ToLower(k) { + panic(fmt.Sprintf("key %q is not lower case", k)) + } + if v.key != strings.ToLower(v.key) { + panic(fmt.Sprintf("key %q is not lower case", v.key)) + } + + if k != v.key { + panic(fmt.Sprintf("key %q is not the same as the map key %q", k, v.key)) + } + } +} diff --git a/hugolib/config_test.go b/hugolib/config_test.go index 56a03c6df..f87d8b936 100644 --- a/hugolib/config_test.go +++ b/hugolib/config_test.go @@ -1144,6 +1144,48 @@ LanguageCode: {{ .Site.LanguageCode }}|{{ site.Language.LanguageCode }}| } +// See #11159 +func TestConfigOutputFormatsPerLanguage(t *testing.T) { + t.Parallel() + + files := ` +-- hugo.toml -- +[languages] +[languages.en] +title = "English Title" +[languages.sv] +title = "Swedish Title" +[languages.sv.outputFormats.html] +path = "foo" +[languages.sv.mediatypes."text/html"] +suffixes = ["bar"] + +-- layouts/index.html -- +Home. + + +` + b := NewIntegrationTestBuilder( + IntegrationTestConfig{ + T: t, + TxtarString: files, + }, + ).Build() + + b.AssertFileContent("public/index.html", "Home.") + + enConfig := b.H.Sites[0].conf + m, _ := enConfig.MediaTypes.Config.GetByType("text/html") + b.Assert(m.Suffixes(), qt.DeepEquals, []string{"html"}) + + svConfig := b.H.Sites[1].conf + f, _ := svConfig.OutputFormats.Config.GetByName("html") + b.Assert(f.Path, qt.Equals, "foo") + m, _ = svConfig.MediaTypes.Config.GetByType("text/html") + b.Assert(m.Suffixes(), qt.DeepEquals, []string{"bar"}) + +} + func TestConfigMiscPanics(t *testing.T) { t.Parallel() diff --git a/tpl/collections/integration_test.go b/tpl/collections/integration_test.go index 829aee355..80d2f043a 100644 --- a/tpl/collections/integration_test.go +++ b/tpl/collections/integration_test.go @@ -87,21 +87,16 @@ func TestAppendSliceToASliceOfSlices(t *testing.T) { {{ $obj }} - ` - for i := 0; i < 4; i++ { + b := hugolib.NewIntegrationTestBuilder( + hugolib.IntegrationTestConfig{ + T: t, + TxtarString: files, + }, + ).Build() - b := hugolib.NewIntegrationTestBuilder( - hugolib.IntegrationTestConfig{ - T: t, - TxtarString: files, - }, - ).Build() - - b.AssertFileContent("public/index.html", "[[a] [b] [c]]") - - } + b.AssertFileContent("public/index.html", "[[a] [b] [c]]") } @@ -120,18 +115,14 @@ func TestAppendNilToSlice(t *testing.T) { ` - for i := 0; i < 4; i++ { + b := hugolib.NewIntegrationTestBuilder( + hugolib.IntegrationTestConfig{ + T: t, + TxtarString: files, + }, + ).Build() - b := hugolib.NewIntegrationTestBuilder( - hugolib.IntegrationTestConfig{ - T: t, - TxtarString: files, - }, - ).Build() - - b.AssertFileContent("public/index.html", "[a <nil>]") - - } + b.AssertFileContent("public/index.html", "[a <nil>]") }