tpl: Fix the case for a shortcode in a nested folder only - hugo - [fork] hugo port for 9front
HTML git clone git@git.drkhsh.at/hugo.git
DIR Log
DIR Files
DIR Refs
DIR Submodules
DIR README
DIR LICENSE
---
DIR commit cf9e6904cc0850b20f9e4e378b12851bb72f44dd
DIR parent 8a2830f2dcbf2c9b799ff8d1db9601da58f98494
HTML Author: Bjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Date: Mon, 14 Apr 2025 11:41:56 +0200
tpl: Fix the case for a shortcode in a nested folder only
Fixes #13605
Diffstat:
M hugolib/shortcode.go | 8 +-------
M tpl/tplimpl/templatestore.go | 18 +++++++++++++++---
M tpl/tplimpl/templatestore_integrat… | 22 ++++++++++++++++++++++
3 files changed, 38 insertions(+), 10 deletions(-)
---
DIR diff --git 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)
}
DIR diff --git 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 {
DIR diff --git 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()