From: Bjørn Erik Pedersen Date: Fri, 23 Apr 2021 11:40:05 +0000 (+0200) Subject: Make the shortcode template lookup for output formats stable X-Git-Tag: v0.83.0~22 X-Git-Url: http://git.maquefel.me/?a=commitdiff_plain;h=0d86a32d8f3031e2124c8005b680b597f3c0e558;p=brevno-suite%2Fhugo Make the shortcode template lookup for output formats stable Fixes #7774 --- diff --git a/hugolib/shortcode_test.go b/hugolib/shortcode_test.go index bce95b52..41f4eddb 100644 --- a/hugolib/shortcode_test.go +++ b/hugolib/shortcode_test.go @@ -1347,3 +1347,49 @@ title: "No Inner!" err := b.BuildE(BuildCfg{}) b.Assert(err.Error(), qt.Contains, `failed to extract shortcode: shortcode "noinner" has no .Inner, yet a closing tag was provided`) } + +func TestShortcodeStableOutputFormatTemplates(t *testing.T) { + t.Parallel() + + for i := 0; i < 5; i++ { + + b := newTestSitesBuilder(t) + + const numPages = 10 + + for i := 0; i < numPages; i++ { + b.WithContent(fmt.Sprintf("page%d.md", i), `--- +title: "Page" +outputs: ["html", "css", "csv", "json"] +--- +{{< myshort >}} + +`) + } + + b.WithTemplates( + "_default/single.html", "{{ .Content }}", + "_default/single.css", "{{ .Content }}", + "_default/single.csv", "{{ .Content }}", + "_default/single.json", "{{ .Content }}", + "shortcodes/myshort.html", `Short-HTML`, + "shortcodes/myshort.csv", `Short-CSV`, + ) + + b.Build(BuildCfg{}) + + //helpers.PrintFs(b.Fs.Destination, "public", os.Stdout) + + for i := 0; i < numPages; i++ { + b.AssertFileContent(fmt.Sprintf("public/page%d/index.html", i), "Short-HTML") + b.AssertFileContent(fmt.Sprintf("public/page%d/index.csv", i), "Short-CSV") + b.AssertFileContent(fmt.Sprintf("public/page%d/index.json", i), "Short-HTML") + + } + + for i := 0; i < numPages; i++ { + b.AssertFileContent(fmt.Sprintf("public/page%d/styles.css", i), "Short-HTML") + } + + } +} diff --git a/tpl/tplimpl/template.go b/tpl/tplimpl/template.go index 60e3b7df..75f25eda 100644 --- a/tpl/tplimpl/template.go +++ b/tpl/tplimpl/template.go @@ -19,6 +19,7 @@ import ( "path/filepath" "reflect" "regexp" + "sort" "strings" "sync" "time" @@ -814,6 +815,24 @@ func (t *templateHandler) postTransform() error { } } + for _, v := range t.shortcodes { + sort.Slice(v.variants, func(i, j int) bool { + v1, v2 := v.variants[i], v.variants[j] + name1, name2 := v1.ts.Name(), v2.ts.Name() + isHTMl1, isHTML2 := strings.HasSuffix(name1, "html"), strings.HasSuffix(name2, "html") + + // There will be a weighted selection later, but make + // sure these are sorted to get a stable selection for + // output formats missing specific templates. + // Prefer HTML. + if isHTMl1 || isHTML2 && !(isHTMl1 && isHTML2) { + return isHTMl1 + } + + return name1 < name2 + }) + } + return nil }