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")
+ }
+
+ }
+}
"path/filepath"
"reflect"
"regexp"
+ "sort"
"strings"
"sync"
"time"
}
}
+ 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
}