mirror of
https://github.com/gohugoio/hugo.git
synced 2025-08-17 21:01:26 +02:00
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:
@@ -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 {
|
||||||
|
@@ -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))
|
||||||
|
@@ -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 --
|
||||||
|
Reference in New Issue
Block a user