Fix it so e.g. de in layouts/_shortcodes/de.html is not interpreted as a language code

Fixes #13740
This commit is contained in:
Bjørn Erik Pedersen
2025-05-26 10:22:13 +02:00
parent f47193669d
commit 9ad26b69ad
3 changed files with 18 additions and 8 deletions

View File

@@ -120,11 +120,11 @@ func (pp *PathParser) parse(component, s string) (*Path, error) {
return p, nil return p, nil
} }
func (pp *PathParser) parseIdentifier(component, s string, p *Path, i, lastDot int) { func (pp *PathParser) parseIdentifier(component, s string, p *Path, i, lastDot, numDots int) {
if p.posContainerHigh != -1 { if p.posContainerHigh != -1 {
return return
} }
mayHaveLang := p.posIdentifierLanguage == -1 && pp.LanguageIndex != nil mayHaveLang := numDots > 1 && p.posIdentifierLanguage == -1 && pp.LanguageIndex != nil
mayHaveLang = mayHaveLang && (component == files.ComponentFolderContent || component == files.ComponentFolderLayouts) mayHaveLang = mayHaveLang && (component == files.ComponentFolderContent || component == files.ComponentFolderLayouts)
mayHaveOutputFormat := component == files.ComponentFolderLayouts mayHaveOutputFormat := component == files.ComponentFolderLayouts
mayHaveKind := p.posIdentifierKind == -1 && mayHaveOutputFormat mayHaveKind := p.posIdentifierKind == -1 && mayHaveOutputFormat
@@ -167,7 +167,6 @@ func (pp *PathParser) parseIdentifier(component, s string, p *Path, i, lastDot i
if langFound { if langFound {
p.identifiersKnown = append(p.identifiersKnown, id) p.identifiersKnown = append(p.identifiersKnown, id)
p.posIdentifierLanguage = len(p.identifiersKnown) - 1 p.posIdentifierLanguage = len(p.identifiersKnown) - 1
} }
} }
@@ -234,19 +233,21 @@ func (pp *PathParser) doParse(component, s string, p *Path) (*Path, error) {
p.s = s p.s = s
slashCount := 0 slashCount := 0
lastDot := 0 lastDot := 0
lastSlashIdx := strings.LastIndex(s, "/")
numDots := strings.Count(s[lastSlashIdx+1:], ".")
for i := len(s) - 1; i >= 0; i-- { for i := len(s) - 1; i >= 0; i-- {
c := s[i] c := s[i]
switch c { switch c {
case '.': case '.':
pp.parseIdentifier(component, s, p, i, lastDot) pp.parseIdentifier(component, s, p, i, lastDot, numDots)
lastDot = i lastDot = i
case '/': case '/':
slashCount++ slashCount++
if p.posContainerHigh == -1 { if p.posContainerHigh == -1 {
if lastDot > 0 { if lastDot > 0 {
pp.parseIdentifier(component, s, p, i, lastDot) pp.parseIdentifier(component, s, p, i, lastDot, numDots)
} }
p.posContainerHigh = i + 1 p.posContainerHigh = i + 1
} else if p.posContainerLow == -1 { } else if p.posContainerLow == -1 {

View File

@@ -563,11 +563,20 @@ func TestParseLayouts(t *testing.T) {
c.Assert(p.Type(), qt.Equals, TypePartial) c.Assert(p.Type(), qt.Equals, TypePartial)
}, },
}, },
{
"Shortcode lang in root",
"/_shortcodes/no.html",
func(c *qt.C, p *Path) {
c.Assert(p.Type(), qt.Equals, TypeShortcode)
c.Assert(p.Lang(), qt.Equals, "")
c.Assert(p.NameNoIdentifier(), qt.Equals, "no")
},
},
} }
for _, test := range tests { for _, test := range tests {
c.Run(test.name, func(c *qt.C) { c.Run(test.name, func(c *qt.C) {
if test.name != "Baseof" { if test.name != "Shortcode lang in root" {
// return // return
} }
test.assert(c, testParser.Parse(files.ComponentFolderLayouts, test.path)) test.assert(c, testParser.Parse(files.ComponentFolderLayouts, test.path))

View File

@@ -730,16 +730,16 @@ SHORTCODE
b.Assert(err.Error(), qt.Contains, `no compatible template found for shortcode "mymarkdown" in [/_shortcodes/mymarkdown.md]; note that to use plain text template shortcodes in HTML you need to use the shortcode {{% delimiter`) b.Assert(err.Error(), qt.Contains, `no compatible template found for shortcode "mymarkdown" in [/_shortcodes/mymarkdown.md]; note that to use plain text template shortcodes in HTML you need to use the shortcode {{% delimiter`)
} }
func TestShortcodeOnlyLanguageInBaseIssue13699(t *testing.T) { func TestShortcodeOnlyLanguageInBaseIssue13699And13740(t *testing.T) {
t.Parallel() t.Parallel()
files := ` files := `
-- hugo.toml -- -- hugo.toml --
baseURL = 'https://example.org/' baseURL = 'https://example.org/'
disableLanguages = ['de']
[languages] [languages]
[languages.en] [languages.en]
weight = 1 weight = 1
disableLanguages = ['de']
[languages.de] [languages.de]
weight = 2 weight = 2
-- layouts/_shortcodes/de.html -- -- layouts/_shortcodes/de.html --