diff --git a/hugolib/page_paths.go b/hugolib/page_paths.go index 4033ba4b3..55c770ac8 100644 --- a/hugolib/page_paths.go +++ b/hugolib/page_paths.go @@ -86,7 +86,7 @@ func (p *Page) initTargetPathDescriptor() error { PathSpec: p.s.PathSpec, Kind: p.Kind, Sections: p.sections, - UglyURLs: p.s.Info.uglyURLs, + UglyURLs: p.s.Info.uglyURLs(p), Dir: filepath.ToSlash(p.Source.Dir()), URL: p.URLPath.URL, IsMultihost: p.s.owner.IsMultihost(), diff --git a/hugolib/site.go b/hugolib/site.go index 71a4083ef..771ee5914 100644 --- a/hugolib/site.go +++ b/hugolib/site.go @@ -357,7 +357,7 @@ type SiteInfo struct { BuildDrafts bool canonifyURLs bool relativeURLs bool - uglyURLs bool + uglyURLs func(p *Page) bool preserveTaxonomyNames bool Data *map[string]interface{} @@ -413,6 +413,9 @@ func newSiteInfo(cfg siteBuilderCfg) SiteInfo { multilingual: newMultiLingualForLanguage(cfg.language), PageCollections: cfg.pageCollections, Params: make(map[string]interface{}), + uglyURLs: func(p *Page) bool { + return false + }, } } @@ -1035,6 +1038,24 @@ func (s *Site) initializeSiteInfo() { multilingual = s.owner.multilingual } + var uglyURLs = func(p *Page) bool { + return false + } + + v := s.Cfg.Get("uglyURLs") + if v != nil { + if vv, ok := v.(bool); ok { + uglyURLs = func(p *Page) bool { + return vv + } + } else { + m := cast.ToStringMapBool(v) + uglyURLs = func(p *Page) bool { + return m[p.Section()] + } + } + } + s.Info = SiteInfo{ Title: lang.GetString("title"), Author: lang.GetStringMap("author"), @@ -1052,7 +1073,7 @@ func (s *Site) initializeSiteInfo() { BuildDrafts: s.Cfg.GetBool("buildDrafts"), canonifyURLs: s.Cfg.GetBool("canonifyURLs"), relativeURLs: s.Cfg.GetBool("relativeURLs"), - uglyURLs: s.Cfg.GetBool("uglyURLs"), + uglyURLs: uglyURLs, preserveTaxonomyNames: lang.GetBool("preserveTaxonomyNames"), PageCollections: s.PageCollections, Menus: &s.Menus, diff --git a/hugolib/site_url_test.go b/hugolib/site_url_test.go index 479967673..4839c5e63 100644 --- a/hugolib/site_url_test.go +++ b/hugolib/site_url_test.go @@ -87,3 +87,40 @@ func TestPageCount(t *testing.T) { } } } + +func TestUglyURLsPerSection(t *testing.T) { + t.Parallel() + + assert := require.New(t) + + const dt = `--- +title: Do not go gentle into that good night +--- + +Wild men who caught and sang the sun in flight, +And learn, too late, they grieved it on its way, +Do not go gentle into that good night. + +` + + cfg, fs := newTestCfg() + + cfg.Set("uglyURLs", map[string]bool{ + "sect2": true, + }) + + writeSource(t, fs, filepath.Join("content", "sect1", "p1.md"), dt) + writeSource(t, fs, filepath.Join("content", "sect2", "p2.md"), dt) + + s := buildSingleSite(t, deps.DepsCfg{Fs: fs, Cfg: cfg}, BuildCfg{SkipRender: true}) + + assert.Len(s.RegularPages, 2) + + notUgly := s.getPage(KindPage, "sect1/p1.md") + assert.NotNil(notUgly) + assert.Equal("/sect1/p1/", notUgly.RelPermalink()) + + ugly := s.getPage(KindPage, "sect2/p2.md") + assert.NotNil(ugly) + assert.Equal("/sect2/p2.html", ugly.RelPermalink()) +}