if category == CategoryMarkup {
// We store all template nodes for a given directory on the same level.
k1 = strings.TrimSuffix(k1, "/_markup")
- parts := strings.Split(d.LayoutFromTemplate, "-")
- if len(parts) < 2 {
+ v, found := strings.CutPrefix(d.LayoutFromTemplate, "render-")
+ if !found {
return "", "", 0, TemplateDescriptor{}, fmt.Errorf("unrecognized render hook template")
}
- // Either 2 or 3 parts, e.g. render-codeblock-go.
- d.Variant1 = parts[1]
- if len(parts) > 2 {
- d.Variant2 = parts[2]
+ hyphenIdx := strings.Index(v, "-")
+
+ d.Variant1 = v
+ if hyphenIdx > 0 {
+ d.Variant1 = v[:hyphenIdx]
+ d.Variant2 = v[hyphenIdx+1:]
}
+
d.LayoutFromTemplate = "" // This allows using page layout as part of the key for lookups.
}
}
}
+func TestCodeblockIssue13864(t *testing.T) {
+ t.Parallel()
+
+ files := `
+-- hugo.toml --
+disableKinds = ['page','rss','section','sitemap','taxonomy','term']
+-- content/_index.md --
+---
+title: home
+---
+
+~~~
+LANG: none
+~~~
+
+~~~go
+LANG: go
+~~~
+
+~~~go-html-template
+LANG: go-html-template
+~~~
+
+~~~xy
+LANG: xy
+~~~
+
+~~~x-y
+LANG: x-y
+~~~
+-- layouts/home.html --
+{{ .Content }}
+-- layouts/_markup/render-codeblock.html --
+{{ .Inner }} LAYOUT: render-codeblock.html|
+-- layouts/_markup/render-codeblock-go.html --
+{{ .Inner }} LAYOUT: render-codeblock-go.html|
+-- layouts/_markup/render-codeblock-go-html-template.html --
+{{ .Inner }} LAYOUT: render-codeblock-go-html-template.html|
+-- layouts/_markup/render-codeblock-xy.html --
+{{ .Inner }} LAYOUT: render-codeblock-xy.html|
+-- layouts/_markup/render-codeblock-x-y.html.html --
+{{ .Inner }} LAYOUT: render-codeblock-x-y.html|
+`
+
+ b := hugolib.Test(t, files)
+
+ b.AssertFileContent("public/index.html",
+ "LANG: none LAYOUT: render-codeblock.html|", // pass
+ "LANG: go LAYOUT: render-codeblock-go.html|", // fail: uses render-codeblock-go-html-template.html
+ "LANG: go-html-template LAYOUT: render-codeblock-go-html-template.html|", // fail: uses render-codeblock.html
+ "LANG: xy LAYOUT: render-codeblock-xy.html|", // pass
+ "LANG: x-y LAYOUT: render-codeblock-x-y.html|", // fail: uses render-codeblock.html
+ )
+}
+
func TestRenderCodeblockSpecificity(t *testing.T) {
files := `
-- hugo.toml --