Fix regression with hyphenated codeblock templates, e.g. render-codeblock-go-html-template.html

Fixes #13864

Co-authored-by: Joe Mooring <joe.mooring@veriphor.com>
This commit is contained in:
Bjørn Erik Pedersen
2025-07-27 12:02:21 +02:00
parent d240a705d6
commit 9c57af1351
2 changed files with 64 additions and 6 deletions

View File

@@ -1762,15 +1762,18 @@ func (s *TemplateStore) toKeyCategoryAndDescriptor(p *paths.Path) (string, strin
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.
}

View File

@@ -393,6 +393,61 @@ Link: [Foo](/foo)
}
}
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 --