]> git.maquefel.me Git - brevno-suite/hugo/commitdiff
tpl: Fix language handling in partials
authorBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Tue, 15 Apr 2025 07:05:24 +0000 (09:05 +0200)
committerBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Tue, 15 Apr 2025 09:25:54 +0000 (11:25 +0200)
We now use the same code path for all templates re this.

Fixes #13612

common/paths/pathparser.go
hugolib/content_map_page.go
tpl/tplimpl/templatestore.go
tpl/tplimpl/templatestore_integration_test.go

index 4b3feaa14922a676cdfdac1229161bfee4f6c67a..c04f2022e4f165504dd5fef20c1f709bc9722582 100644 (file)
@@ -724,7 +724,7 @@ func (p *Path) IsContentData() bool {
        return p.pathType == TypeContentData
 }
 
-func (p Path) ForBundleType(t Type) *Path {
+func (p Path) ForType(t Type) *Path {
        p.pathType = t
        return &p
 }
index b501cd9ea9489db7f8b1637baeca83e7806d8e82..c51b4a17ad39da8aab07712bec7552e64a959d53 100644 (file)
@@ -180,7 +180,7 @@ func (t *pageTrees) collectAndMarkStaleIdentities(p *paths.Path) []identity.Iden
 
        if p.Component() == files.ComponentFolderContent {
                // It may also be a bundled content resource.
-               key := p.ForBundleType(paths.TypeContentResource).Base()
+               key := p.ForType(paths.TypeContentResource).Base()
                tree = t.treeResources
                nCount = 0
                tree.ForEeachInDimension(key, doctree.DimensionLanguage.Index(),
index bb58c90831e81c0950d5ecf303b874a1ea99c1b2..4266e274aba30fe4cdd759dc2b86f363f7020660 100644 (file)
@@ -564,14 +564,21 @@ func (s *TemplateStore) LookupPagesLayout(q TemplateQuery) *TemplInfo {
 
 func (s *TemplateStore) LookupPartial(pth string) *TemplInfo {
        ti, _ := s.cacheLookupPartials.GetOrCreate(pth, func() (*TemplInfo, error) {
-               d := s.templateDescriptorFromPath(pth)
-               desc := d.Desc
-               if desc.LayoutFromTemplate != "" {
-                       panic("shortcode template descriptor must not have a layout")
+               pi := s.opts.PathParser.Parse(files.ComponentFolderLayouts, pth).ForType(paths.TypePartial)
+               k1, _, _, desc, err := s.toKeyCategoryAndDescriptor(pi)
+               if err != nil {
+                       return nil, err
+               }
+               if desc.OutputFormat == "" && desc.MediaType == "" {
+                       // Assume HTML.
+                       desc.OutputFormat = s.htmlFormat.Name
+                       desc.MediaType = s.htmlFormat.MediaType.Type
+                       desc.IsPlainText = s.htmlFormat.IsPlainText
                }
+
                best := s.getBest()
                defer s.putBest(best)
-               s.findBestMatchGet(s.key(path.Join(containerPartials, d.Path)), CategoryPartial, nil, desc, best)
+               s.findBestMatchGet(s.key(path.Join(containerPartials, k1)), CategoryPartial, nil, desc, best)
                return best.templ, nil
        })
 
@@ -1486,43 +1493,6 @@ type PathTemplateDescriptor struct {
        Desc TemplateDescriptor
 }
 
-// templateDescriptorFromPath returns a template descriptor from the given path.
-// This is currently used in partial lookups only.
-func (s *TemplateStore) templateDescriptorFromPath(pth string) PathTemplateDescriptor {
-       var (
-               mt media.Type
-               of output.Format
-       )
-
-       // Common cases.
-       dotCount := strings.Count(pth, ".")
-       if dotCount <= 1 {
-               if dotCount == 0 {
-                       // Asume HTML.
-                       of, mt = s.resolveOutputFormatAndOrMediaType("html", "")
-               } else {
-                       pth = strings.TrimPrefix(pth, "/")
-                       ext := path.Ext(pth)
-                       pth = strings.TrimSuffix(pth, ext)
-                       ext = ext[1:]
-                       of, mt = s.resolveOutputFormatAndOrMediaType("", ext)
-               }
-       } else {
-               path := s.opts.PathParser.Parse(files.ComponentFolderLayouts, pth)
-               pth = path.PathNoIdentifier()
-               of, mt = s.resolveOutputFormatAndOrMediaType(path.OutputFormat(), path.Ext())
-       }
-
-       return PathTemplateDescriptor{
-               Path: pth,
-               Desc: TemplateDescriptor{
-                       OutputFormat: of.Name,
-                       MediaType:    mt.Type,
-                       IsPlainText:  of.IsPlainText,
-               },
-       }
-}
-
 // resolveOutputFormatAndOrMediaType resolves the output format and/or media type
 // based on the given output format suffix and media type suffix.
 // Either of the suffixes can be empty, and the function will try to find a match
index b302f5bb30558b552703027026a6324595a70524..32e1248fe279d5eaf42d0f4476d6b3f83d9483cf 100644 (file)
@@ -1163,3 +1163,44 @@ All.
        // Just make sure it doesn't fail.
        hugolib.Test(t, files)
 }
+
+func TestPartialsLangIssue13612(t *testing.T) {
+       t.Parallel()
+
+       files := `
+-- hugo.toml --
+disableKinds = ['page','section','sitemap','taxonomy','term']
+
+defaultContentLanguage = 'ru'
+defaultContentLanguageInSubdir = true
+
+[languages.ru]
+weight = 1
+
+[languages.en]
+weight = 2
+
+[outputs]
+home = ['html','rss']
+
+-- layouts/_partials/comment.en.html --
+layouts/_partials/comment.en.html
+-- layouts/_partials/comment.en.xml --
+layouts/_partials/comment.en.xml
+-- layouts/_partials/comment.ru.html --
+layouts/_partials/comment.ru.html
+-- layouts/_partials/comment.ru.xml --
+layouts/_partials/comment.ru.xml
+-- layouts/home.html --
+{{ partial (print "comment." (default "ru" .Lang) ".html") . }}
+-- layouts/home.rss.xml --
+{{ partial (print "comment." (default "ru" .Lang) ".xml") . }}
+`
+
+       b := hugolib.Test(t, files)
+
+       b.AssertFileContent("public/en/index.html", "layouts/_partials/comment.en.html")
+       b.AssertFileContent("public/en/index.xml", "layouts/_partials/comment.en.xml")   // fail
+       b.AssertFileContent("public/ru/index.html", "layouts/_partials/comment.ru.html") // fail
+       b.AssertFileContent("public/ru/index.xml", "layouts/_partials/comment.ru.xml")   // fail
+}