]> git.maquefel.me Git - brevno-suite/hugo/commitdiff
tpl: Fix the case for a shortcode in a nested folder only
authorBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Mon, 14 Apr 2025 09:41:56 +0000 (11:41 +0200)
committerBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Mon, 14 Apr 2025 12:38:22 +0000 (14:38 +0200)
Fixes #13605

hugolib/shortcode.go
tpl/tplimpl/templatestore.go
tpl/tplimpl/templatestore_integration_test.go

index 3ac0940e2cd4e4ed3594fcd10d08dae45a963ec2..cc8a145d995d304843e2f360fd338b2ba185cd3b 100644 (file)
@@ -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)
                        }
index 7544b562556330942c396a7bbfe2d9b4a987e3a5..99e8c4839d1e0015b0a02be72bef8f19f146db93 100644 (file)
@@ -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 {
index 4644c96395801cd13bebc75a41a555c17eca2c12..b302f5bb30558b552703027026a6324595a70524 100644 (file)
@@ -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()