mirror of
https://github.com/gohugoio/hugo.git
synced 2024-11-21 20:46:30 -05:00
Make the shortcode template lookup for output formats stable
Fixes #7774
This commit is contained in:
parent
65c502cc81
commit
0d86a32d8f
2 changed files with 65 additions and 0 deletions
|
@ -1347,3 +1347,49 @@ title: "No Inner!"
|
||||||
err := b.BuildE(BuildCfg{})
|
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`)
|
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")
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -19,6 +19,7 @@ import (
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"reflect"
|
"reflect"
|
||||||
"regexp"
|
"regexp"
|
||||||
|
"sort"
|
||||||
"strings"
|
"strings"
|
||||||
"sync"
|
"sync"
|
||||||
"time"
|
"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
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue