return p, nil
}
+func (l PermalinkExpander) normalizeEscapeSequences(result string) string {
+ return strings.ReplaceAll(result, "\\:", ":")
+}
+
// ExpandPattern expands the path in p with the specified expand pattern.
func (l PermalinkExpander) ExpandPattern(pattern string, p Page) (string, error) {
expander, err := l.getOrParsePattern(pattern)
return "", err
}
- return expander(p)
+ result, err := expander(p)
+ if err != nil {
+ return "", err
+ }
+ return l.normalizeEscapeSequences(result), nil
}
// Expand expands the path in p according to the rules defined for the given key.
return "", nil
}
- return expand(p)
+ result, err := expand(p)
+ if err != nil {
+ return "", err
+ }
+ return l.normalizeEscapeSequences(result), nil
}
// Allow " " and / to represent the root section.
callbacks := make([]pageToPermaAttribute, len(matches))
replacements := make([]string, len(matches))
for i, m := range matches {
- replacement := m[0]
+ replacement := m[1]
attr := replacement[1:]
replacements[i] = replacement
callback, ok := l.callback(attr)
// can return a string to go in that position in the page (or an error)
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 {
}
for _, match := range matches {
- k := match[0][1:]
+ k := match[1][1:]
if _, ok := l.callback(k); !ok {
return false
}
{"/:sections/", true, "/a/b/c/"}, // Sections
{"/:sections[last]/", true, "/c/"}, // Sections
{"/:sections[0]/:sections[last]/", true, "/a/c/"}, // Sections
+ {"/\\:filename", true, "/:filename"}, // Escape sequence
+ {"/special\\::slug/", true, "/special:the-slug/"}, // Escape sequence
// Failures
{"/blog/:fred", false, ""},
"posts": "/:slug",
"blog": "/:section/:year",
"recipes": "/:slugorfilename",
+ "special": "/special\\::slug",
},
}
expander, err := NewPermalinkExpander(urlize, permalinksConfig)
expanded, err = expander.Expand("recipes", page_slug_fallback)
c.Assert(err, qt.IsNil)
c.Assert(expanded, qt.Equals, "/page-filename")
+
+ expanded, err = expander.Expand("special", page)
+ c.Assert(err, qt.IsNil)
+ c.Assert(expanded, qt.Equals, "/special:the-slug")
}
func TestPermalinkExpansionConcurrent(t *testing.T) {