mirror of
https://github.com/gohugoio/hugo.git
synced 2024-11-21 20:46:30 -05:00
parent
b1b3bbcdbd
commit
a2f666b586
2 changed files with 37 additions and 38 deletions
|
@ -156,9 +156,6 @@ func init() {
|
||||||
|
|
||||||
func (l PermalinkExpander) getOrParsePattern(pattern string) (func(Page) (string, error), error) {
|
func (l PermalinkExpander) getOrParsePattern(pattern string) (func(Page) (string, error), error) {
|
||||||
return l.patternCache.GetOrCreate(pattern, func() (func(Page) (string, error), error) {
|
return l.patternCache.GetOrCreate(pattern, func() (func(Page) (string, error), error) {
|
||||||
if !l.validate(pattern) {
|
|
||||||
return nil, &permalinkExpandError{pattern: pattern, err: errPermalinkIllFormed}
|
|
||||||
}
|
|
||||||
var normalized bool
|
var normalized bool
|
||||||
pattern, normalized = l.normalizeEscapeSequencesIn(pattern)
|
pattern, normalized = l.normalizeEscapeSequencesIn(pattern)
|
||||||
|
|
||||||
|
@ -234,37 +231,6 @@ type pageToPermaAttribute func(Page, string) (string, error)
|
||||||
|
|
||||||
var attributeRegexp = regexp.MustCompile(`:\w+(\[.+?\])?`)
|
var attributeRegexp = regexp.MustCompile(`:\w+(\[.+?\])?`)
|
||||||
|
|
||||||
// validate determines if a PathPattern is well-formed
|
|
||||||
func (l PermalinkExpander) validate(pp string) bool {
|
|
||||||
if len(pp) == 0 {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
fragments := strings.Split(pp[1:], "/")
|
|
||||||
bail := false
|
|
||||||
for i := range fragments {
|
|
||||||
if bail {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
if len(fragments[i]) == 0 {
|
|
||||||
bail = true
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
matches := attributeRegexp.FindAllStringSubmatch(fragments[i], -1)
|
|
||||||
if matches == nil {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
for _, match := range matches {
|
|
||||||
k := match[0][1:]
|
|
||||||
if _, ok := l.callback(k); !ok {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
type permalinkExpandError struct {
|
type permalinkExpandError struct {
|
||||||
pattern string
|
pattern string
|
||||||
err error
|
err error
|
||||||
|
@ -274,10 +240,7 @@ func (pee *permalinkExpandError) Error() string {
|
||||||
return fmt.Sprintf("error expanding %q: %s", pee.pattern, pee.err)
|
return fmt.Sprintf("error expanding %q: %s", pee.pattern, pee.err)
|
||||||
}
|
}
|
||||||
|
|
||||||
var (
|
var errPermalinkAttributeUnknown = errors.New("permalink attribute not recognised")
|
||||||
errPermalinkIllFormed = errors.New("permalink ill-formed")
|
|
||||||
errPermalinkAttributeUnknown = errors.New("permalink attribute not recognised")
|
|
||||||
)
|
|
||||||
|
|
||||||
func (l PermalinkExpander) pageToPermalinkDate(p Page, dateField string) (string, error) {
|
func (l PermalinkExpander) pageToPermalinkDate(p Page, dateField string) (string, error) {
|
||||||
// a Page contains a Node which provides a field Date, time.Time
|
// a Page contains a Node which provides a field Date, time.Time
|
||||||
|
|
|
@ -18,6 +18,7 @@ import (
|
||||||
|
|
||||||
"github.com/bep/logg"
|
"github.com/bep/logg"
|
||||||
qt "github.com/frankban/quicktest"
|
qt "github.com/frankban/quicktest"
|
||||||
|
"github.com/gohugoio/hugo/htesting"
|
||||||
"github.com/gohugoio/hugo/hugolib"
|
"github.com/gohugoio/hugo/hugolib"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -232,3 +233,38 @@ slug: custom-recipe-2
|
||||||
b.AssertFileContent("public/delicious-recipe/recipe-1/index.html", "Single|page|/delicious-recipe/recipe-1/")
|
b.AssertFileContent("public/delicious-recipe/recipe-1/index.html", "Single|page|/delicious-recipe/recipe-1/")
|
||||||
b.AssertFileContent("public/delicious-recipe/custom-recipe-2/index.html", "Single|page|/delicious-recipe/custom-recipe-2/")
|
b.AssertFileContent("public/delicious-recipe/custom-recipe-2/index.html", "Single|page|/delicious-recipe/custom-recipe-2/")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Issue 12948.
|
||||||
|
func TestPermalinksWithEscapedColons(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
|
||||||
|
if htesting.IsWindows() {
|
||||||
|
t.Skip("Windows does not support colons in paths")
|
||||||
|
}
|
||||||
|
|
||||||
|
files := `
|
||||||
|
-- hugo.toml --
|
||||||
|
disableKinds = ['home','rss','section','sitemap','taxonomy','term']
|
||||||
|
[permalinks.page]
|
||||||
|
s2 = "/c\\:d/:slug/"
|
||||||
|
-- content/s1/p1.md --
|
||||||
|
---
|
||||||
|
title: p1
|
||||||
|
url: "/a\\:b/:slug/"
|
||||||
|
---
|
||||||
|
-- content/s2/p2.md --
|
||||||
|
---
|
||||||
|
title: p2
|
||||||
|
---
|
||||||
|
-- layouts/_default/single.html --
|
||||||
|
{{ .Title }}
|
||||||
|
`
|
||||||
|
|
||||||
|
b := hugolib.Test(t, files)
|
||||||
|
|
||||||
|
b.AssertFileExists("public/a:b/p1/index.html", true)
|
||||||
|
|
||||||
|
// The above URL comes from the URL front matter field where everything is allowed.
|
||||||
|
// We strip colons from paths constructed by Hugo (they are not supported on Windows).
|
||||||
|
b.AssertFileExists("public/cd/p2/index.html", true)
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue