From 9c57af1351c26631fcca9213db8778b056f8600d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Pedersen?= Date: Sun, 27 Jul 2025 12:02:21 +0200 Subject: [PATCH] Fix regression with hyphenated codeblock templates, e.g. render-codeblock-go-html-template.html Fixes #13864 Co-authored-by: Joe Mooring --- tpl/tplimpl/templatestore.go | 15 +++-- tpl/tplimpl/templatestore_integration_test.go | 55 +++++++++++++++++++ 2 files changed, 64 insertions(+), 6 deletions(-) diff --git a/tpl/tplimpl/templatestore.go b/tpl/tplimpl/templatestore.go index 008b743c7..caf53c005 100644 --- a/tpl/tplimpl/templatestore.go +++ b/tpl/tplimpl/templatestore.go @@ -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. } diff --git a/tpl/tplimpl/templatestore_integration_test.go b/tpl/tplimpl/templatestore_integration_test.go index 9da959350..13c4d5af9 100644 --- a/tpl/tplimpl/templatestore_integration_test.go +++ b/tpl/tplimpl/templatestore_integration_test.go @@ -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 --