Skip to content

Commit

Permalink
Make the shortcode template lookup for output formats stable
Browse files Browse the repository at this point in the history
Fixes #7774
  • Loading branch information
bep committed Apr 23, 2021
1 parent 65c502c commit 0d86a32
Show file tree
Hide file tree
Showing 2 changed files with 65 additions and 0 deletions.
46 changes: 46 additions & 0 deletions hugolib/shortcode_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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")
}

}
}
19 changes: 19 additions & 0 deletions tpl/tplimpl/template.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ import (
"path/filepath"
"reflect"
"regexp"
"sort"
"strings"
"sync"
"time"
Expand Down Expand Up @@ -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
}

Expand Down

0 comments on commit 0d86a32

Please sign in to comment.