ref: 06976ebb8778e08fea89dbd9fcb875f6c8d650d4
parent: 555a5612b2641075b3e1b3b7af8ce9b5aba9f200
author: Cameron Moore <moorereason@gmail.com>
date: Fri Sep 14 00:35:26 EDT 2018
hugolib: Normalize permalink path segments When constructing permalinks, ensure that path segments are normalized with PathSpec.MakeSegment instead of PathSpec.URLize. Fixes #4926
--- a/hugolib/permalinks.go
+++ b/hugolib/permalinks.go
@@ -154,7 +154,7 @@
func pageToPermalinkTitle(p *Page, _ string) (string, error) {// Page contains Node which has Title
// (also contains URLPath which has Slug, sometimes)
- return p.s.PathSpec.URLize(p.title), nil
+ return p.s.PathSpec.MakeSegment(p.title), nil
}
// pageToPermalinkFilename returns the URL-safe form of the filename
@@ -166,7 +166,7 @@
_, name = filepath.Split(dir)
}
- return p.s.PathSpec.URLize(name), nil
+ return p.s.PathSpec.MakeSegment(name), nil
}
// if the page has a slug, return the slug, else return the title
@@ -181,7 +181,7 @@
if strings.HasSuffix(p.Slug, "-") {p.Slug = p.Slug[0 : len(p.Slug)-1]
}
- return p.s.PathSpec.URLize(p.Slug), nil
+ return p.s.PathSpec.MakeSegment(p.Slug), nil
}
return pageToPermalinkTitle(p, a)
}
@@ -188,13 +188,23 @@
func pageToPermalinkSection(p *Page, _ string) (string, error) {// Page contains Node contains URLPath which has Section
- return p.Section(), nil
+ return p.s.PathSpec.MakeSegment(p.Section()), nil
}
func pageToPermalinkSections(p *Page, _ string) (string, error) {// TODO(bep) we have some superflous URLize in this file, but let's
// deal with that later.
- return path.Join(p.CurrentSection().sections...), nil
+
+ cs := p.CurrentSection()
+ if cs == nil {+ return "", errors.New("\":sections\" attribute requires parent page but is nil")+ }
+
+ sections := make([]string, len(cs.sections))
+ for i := range cs.sections {+ sections[i] = p.s.PathSpec.MakeSegment(cs.sections[i])
+ }
+ return path.Join(sections...), nil
}
func init() {--- a/hugolib/permalinks_test.go
+++ b/hugolib/permalinks_test.go
@@ -19,36 +19,26 @@
)
// testdataPermalinks is used by a couple of tests; the expandsTo content is
-// subject to the data in SIMPLE_PAGE_JSON.
+// subject to the data in simplePageJSON.
var testdataPermalinks = []struct {spec string
valid bool
expandsTo string
}{- //{"/:year/:month/:title/", true, "/2012/04/spf13-vim-3.0-release-and-new-website/"},- //{"/:title", true, "/spf13-vim-3.0-release-and-new-website"},- //{":title", true, "spf13-vim-3.0-release-and-new-website"},- //{"/blog/:year/:yearday/:title", true, "/blog/2012/97/spf13-vim-3.0-release-and-new-website"},+ {":title", true, "spf13-vim-3.0-release-and-new-website"}, {"/:year-:month-:title", true, "/2012-04-spf13-vim-3.0-release-and-new-website"},- {"/blog/:year-:month-:title", true, "/blog/2012-04-spf13-vim-3.0-release-and-new-website"},- {"/blog-:year-:month-:title", true, "/blog-2012-04-spf13-vim-3.0-release-and-new-website"},- //{"/blog/:fred", false, ""},- //{"/:year//:title", false, ""},- //{- //"/:section/:year/:month/:day/:weekdayname/:yearday/:title",
- //true,
- //"/blue/2012/04/06/Friday/97/spf13-vim-3.0-release-and-new-website",
- //},
- //{- //"/:weekday/:weekdayname/:month/:monthname",
- //true,
- //"/5/Friday/04/April",
- //},
- //{- //"/:slug/:title",
- //true,
- //"/spf13-vim-3-0-release-and-new-website/spf13-vim-3.0-release-and-new-website",
- //},
+
+ {"/:year/:yearday/:month/:monthname/:day/:weekday/:weekdayname/", true, "/2012/97/04/April/06/5/Friday/"}, // Dates+ {"/:section/", true, "/blue/"}, // Section+ {"/:title/", true, "/spf13-vim-3.0-release-and-new-website/"}, // Title+ {"/:slug/", true, "/spf13-vim-3-0-release-and-new-website/"}, // Slug+ {"/:filename/", true, "/test-page/"}, // Filename+ // TODO(moorereason): need test scaffolding for this.
+ //{"/:sections/", false, "/blue/"}, // Sections+
+ // Failures
+ {"/blog/:fred", false, ""},+ {"/:year//:title", false, ""},}
func TestPermalinkValidation(t *testing.T) {@@ -75,7 +65,7 @@
page, err := s.NewPageFrom(strings.NewReader(simplePageJSON), "blue/test-page.md")
if err != nil {- t.Fatalf("failed before we began, could not parse SIMPLE_PAGE_JSON: %s", err)+ t.Fatalf("failed before we began, could not parse simplePageJSON: %s", err)}
for _, item := range testdataPermalinks { if !item.valid {--
⑨