summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>2025-04-14 11:41:56 +0200
committerBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>2025-04-14 14:38:22 +0200
commitcf9e6904cc0850b20f9e4e378b12851bb72f44dd (patch)
treeacba41abd8725beee3321a47b460ae606e97eff2
parent8a2830f2dcbf2c9b799ff8d1db9601da58f98494 (diff)
downloadhugo-cf9e6904cc0850b20f9e4e378b12851bb72f44dd.tar.gz
hugo-cf9e6904cc0850b20f9e4e378b12851bb72f44dd.zip
tpl: Fix the case for a shortcode in a nested folder only
Fixes #13605
-rw-r--r--hugolib/shortcode.go8
-rw-r--r--tpl/tplimpl/templatestore.go18
-rw-r--r--tpl/tplimpl/templatestore_integration_test.go22
3 files changed, 38 insertions, 10 deletions
diff --git a/hugolib/shortcode.go b/hugolib/shortcode.go
index 3ac0940e2..cc8a145d9 100644
--- a/hugolib/shortcode.go
+++ b/hugolib/shortcode.go
@@ -677,13 +677,7 @@ Loop:
// Used to check if the template expects inner content,
// so just pick one arbitrarily with the same name.
- q := tplimpl.TemplateQuery{
- Path: "",
- Name: sc.name,
- Category: tplimpl.CategoryShortcode,
- Consider: nil,
- }
- templ := s.s.TemplateStore.LookupShortcode(q)
+ templ := s.s.TemplateStore.LookupShortcodeByName(sc.name)
if templ == nil {
return nil, fmt.Errorf("%s: template for shortcode %q not found", errorPrefix, sc.name)
}
diff --git a/tpl/tplimpl/templatestore.go b/tpl/tplimpl/templatestore.go
index 7544b5625..99e8c4839 100644
--- a/tpl/tplimpl/templatestore.go
+++ b/tpl/tplimpl/templatestore.go
@@ -122,6 +122,7 @@ func NewStore(opts StoreOptions, siteOpts SiteOptions) (*TemplateStore, error) {
treeMain: doctree.NewSimpleTree[map[nodeKey]*TemplInfo](),
treeShortcodes: doctree.NewSimpleTree[map[string]map[TemplateDescriptor]*TemplInfo](),
templatesByPath: maps.NewCache[string, *TemplInfo](),
+ shortcodesByName: maps.NewCache[string, *TemplInfo](),
cacheLookupPartials: maps.NewCache[string, *TemplInfo](),
// Note that the funcs passed below is just for name validation.
@@ -419,9 +420,10 @@ type TemplateStore struct {
siteOpts SiteOptions
htmlFormat output.Format
- treeMain *doctree.SimpleTree[map[nodeKey]*TemplInfo]
- treeShortcodes *doctree.SimpleTree[map[string]map[TemplateDescriptor]*TemplInfo]
- templatesByPath *maps.Cache[string, *TemplInfo]
+ treeMain *doctree.SimpleTree[map[nodeKey]*TemplInfo]
+ treeShortcodes *doctree.SimpleTree[map[string]map[TemplateDescriptor]*TemplInfo]
+ templatesByPath *maps.Cache[string, *TemplInfo]
+ shortcodesByName *maps.Cache[string, *TemplInfo]
dh descriptorHandler
@@ -576,6 +578,15 @@ func (s *TemplateStore) LookupPartial(pth string) *TemplInfo {
return ti
}
+func (s *TemplateStore) LookupShortcodeByName(name string) *TemplInfo {
+ name = strings.ToLower(name)
+ ti, _ := s.shortcodesByName.Get(name)
+ if ti == nil {
+ return nil
+ }
+ return ti
+}
+
func (s *TemplateStore) LookupShortcode(q TemplateQuery) *TemplInfo {
q.init()
k1 := s.key(q.Path)
@@ -1039,6 +1050,7 @@ func (s *TemplateStore) insertShortcode(pi *paths.Path, fi hugofs.FileMetaInfo,
m1[d] = ti
+ s.shortcodesByName.Set(k2, ti)
s.setTemplateByPath(pi.Path(), ti)
if fi != nil {
diff --git a/tpl/tplimpl/templatestore_integration_test.go b/tpl/tplimpl/templatestore_integration_test.go
index 4644c9639..b302f5bb3 100644
--- a/tpl/tplimpl/templatestore_integration_test.go
+++ b/tpl/tplimpl/templatestore_integration_test.go
@@ -1127,6 +1127,28 @@ single.html
b.AssertFileContent("public/s3/index.html", "single.html") // fail
}
+func TestIssue13605(t *testing.T) {
+ t.Parallel()
+
+ files := `
+-- hugo.toml --
+disableKinds = ['home','rss','section','sitemap','taxonomy','term']
+-- content/s1/p1.md --
+---
+title: p1
+---
+{{< sc >}}
+-- layouts/s1/_shortcodes/sc.html --
+layouts/s1/_shortcodes/sc.html
+-- layouts/single.html --
+{{ .Content }}
+`
+
+ b := hugolib.Test(t, files)
+
+ b.AssertFileContent("public/s1/p1/index.html", "layouts/s1/_shortcodes/sc.html")
+}
+
func TestSkipDotFiles(t *testing.T) {
t.Parallel()