ref: 9ce0a1fb7011bd75eb0e2262e35354c49ce98ac5
parent: ab9214768de4ce10032d3fe7ec8c7b2932ead892
author: Bjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
date: Thu Dec 13 06:52:26 EST 2018
hugolib: Restore taxonomy term path separation Fixes #5513
--- a/hugolib/hugo_sites.go
+++ b/hugolib/hugo_sites.go
@@ -16,6 +16,7 @@
import (
"errors"
"io"
+ "path"
"path/filepath"
"sort"
"strings"
@@ -520,6 +521,15 @@
func (h *HugoSites) createMissingPages() error {var newPages Pages
+ singularPlural := func(p *Page) (string, string) {+ slen := len(p.sections)
+ singular := p.sections[slen-1]
+ singular = p.s.PathSpec.MakePathSanitized(singular)
+ plural := path.Join((p.sections[:slen-1])...)
+
+ return singular, plural
+ }
+
for _, s := range h.Sites { if s.isEnabled(KindHome) {// home pages
@@ -544,6 +554,7 @@
if len(taxonomies) > 0 {taxonomyPages := s.findPagesByKind(KindTaxonomy)
taxonomyTermsPages := s.findPagesByKind(KindTaxonomyTerm)
+
for _, plural := range taxonomies { if s.isEnabled(KindTaxonomyTerm) {foundTaxonomyTermsPage := false
@@ -570,11 +581,10 @@
key = s.PathSpec.MakeSegment(key)
}
for _, p := range taxonomyPages {- // Some people may have /authors/MaxMustermann etc. as paths.
- // p.sections contains the raw values from the file system.
- // See https://github.com/gohugoio/hugo/issues/4238
- singularKey := s.PathSpec.MakePathSanitized(p.sections[1])
- if p.sections[0] == plural && singularKey == key {+
+ singularKey, pluralKey := singularPlural(p)
+
+ if pluralKey == plural && singularKey == key {foundTaxonomyPage = true
break
}
--- a/hugolib/hugo_sites_build_test.go
+++ b/hugolib/hugo_sites_build_test.go
@@ -100,8 +100,8 @@
// Check list pages
b.AssertFileContent(pathMod("public/fr/sect/index.html"), "List", "Bonjour") b.AssertFileContent("public/en/sect/index.html", "List", "Hello")- b.AssertFileContent(pathMod("public/fr/plaques/frtag1/index.html"), "List", "Bonjour")- b.AssertFileContent("public/en/tags/tag1/index.html", "List", "Hello")+ b.AssertFileContent(pathMod("public/fr/plaques/frtag1/index.html"), "Taxonomy List", "Bonjour")+ b.AssertFileContent("public/en/tags/tag1/index.html", "Taxonomy List", "Hello")// Check sitemaps
// Sitemaps behaves different: In a multilanguage setup there will always be a index file and
--- a/hugolib/page.go
+++ b/hugolib/page.go
@@ -1774,8 +1774,8 @@
case KindHome:
pages = s.RegularPages
case KindTaxonomy:
- plural := p.sections[0]
- term := p.sections[1]
+ plural := path.Join(p.sections[:len(p.sections)-1]...)
+ term := p.sections[len(p.sections)-1]
if s.Info.preserveTaxonomyNames { if v, ok := s.taxonomiesOrigKey[fmt.Sprintf("%s-%s", plural, term)]; ok {@@ -1792,7 +1792,7 @@
p.data["Term"] = term
pages = taxonomy.Pages()
case KindTaxonomyTerm:
- plural := p.sections[0]
+ plural := path.Join(p.sections...)
singular := s.taxonomiesPluralSingular[plural]
p.data["Singular"] = singular
--- a/hugolib/site.go
+++ b/hugolib/site.go
@@ -22,6 +22,7 @@
"mime"
"net/url"
"os"
+ "path"
"path/filepath"
"sort"
"strconv"
@@ -1586,11 +1587,28 @@
}
}
+func (s *Site) singularPluralAll(sections []string) (string, string, string) {+ slen := len(sections)
+ singular := sections[slen-1]
+ plural := path.Join((sections[:slen-1])...)
+ all := path.Join(sections...)
+
+ return singular, plural, all
+}
+
func (s *Site) kindFromSections(sections []string) string { if len(sections) == 0 {return KindSection
}
+ _, plural, all := s.singularPluralAll(sections)
+
+ if _, ok := s.Taxonomies[all]; ok {+ return KindTaxonomyTerm
+ } else if _, ok := s.Taxonomies[plural]; ok {+ return KindTaxonomy
+ }
+
if _, isTaxonomy := s.Taxonomies[sections[0]]; isTaxonomy { if len(sections) == 1 {return KindTaxonomyTerm
@@ -1876,8 +1894,10 @@
}
func (s *Site) newTaxonomyPage(plural, key string) *Page {+ sections := strings.Split(plural, "/")
+ sections = append(sections, key)
- p := s.newNodePage(KindTaxonomy, plural, key)
+ p := s.newNodePage(KindTaxonomy, sections...)
if s.Info.preserveTaxonomyNames {p.title = key
@@ -1901,7 +1921,7 @@
}
func (s *Site) newTaxonomyTermsPage(plural string) *Page {- p := s.newNodePage(KindTaxonomyTerm, plural)
+ p := s.newNodePage(KindTaxonomyTerm, strings.Split(plural, "/")...)
p.title = s.titleFunc(plural)
return p
}
--- a/hugolib/taxonomy_test.go
+++ b/hugolib/taxonomy_test.go
@@ -243,3 +243,44 @@
th.assertFileContent(pathFunc("public/empties/index.html"), "Terms List", "Empties")}
+
+// https://github.com/gohugoio/hugo/issues/5513
+func TestTaxonomyPathSeparation(t *testing.T) {+ t.Parallel()
+
+ config := `
+baseURL = "https://example.com"
+
+[taxonomies]
+"news/tag" = "news/tags"
+"news/category" = "news/categories"
+`
+
+ pageContent := `
++++
+title = "foo"
+"news/categories" = ["a", "b", "c"]
++++
+
+Content.
+
+
+`
+
+ b := newTestSitesBuilder(t)
+ b.WithConfigFile("toml", config)+ b.WithContent("page.md", pageContent)+ b.WithContent("news/categories/b/_index.md", `+---
+title: "This is B"
+---
+
+`)
+
+ b.CreateSites().Build(BuildCfg{})+
+ b.AssertFileContent("public/news/categories/index.html", "Taxonomy Term Page 1|News/Categories|Hello|https://example.com/news/categories/|")+ b.AssertFileContent("public/news/categories/a/index.html", "Taxonomy List Page 1|A|Hello|https://example.com/news/categories/a/|")+ b.AssertFileContent("public/news/categories/b/index.html", "Taxonomy List Page 1|This is B|Hello|https://example.com/news/categories/b/|")+
+}
--- a/hugolib/testhelpers_test.go
+++ b/hugolib/testhelpers_test.go
@@ -420,12 +420,15 @@
"content/sect/doc1.nn.md", contentTemplate,
}
+ listTemplateCommon = "{{ $p := .Paginator }}{{ $p.PageNumber }}|{{ .Title }}|{{ i18n \"hello\" }}|{{ .Permalink }}|Pager: {{ template \"_internal/pagination.html\" . }}"+
defaultTemplates = []string{ "_default/single.html", "Single: {{ .Title }}|{{ i18n \"hello\" }}|{{.Lang}}|{{ .Content }}",- "_default/list.html", "{{ $p := .Paginator }}List Page {{ $p.PageNumber }}: {{ .Title }}|{{ i18n \"hello\" }}|{{ .Permalink }}|Pager: {{ template \"_internal/pagination.html\" . }}",+ "_default/list.html", "List Page " + listTemplateCommon,
"index.html", "{{ $p := .Paginator }}Default Home Page {{ $p.PageNumber }}: {{ .Title }}|{{ .IsHome }}|{{ i18n \"hello\" }}|{{ .Permalink }}|{{ .Site.Data.hugo.slogan }}|String Resource: {{ ( \"Hugo Pipes\" | resources.FromString \"text/pipes.txt\").RelPermalink }}", "index.fr.html", "{{ $p := .Paginator }}French Home Page {{ $p.PageNumber }}: {{ .Title }}|{{ .IsHome }}|{{ i18n \"hello\" }}|{{ .Permalink }}|{{ .Site.Data.hugo.slogan }}|String Resource: {{ ( \"Hugo Pipes\" | resources.FromString \"text/pipes.txt\").RelPermalink }}",-
+ "_default/terms.html", "Taxonomy Term Page " + listTemplateCommon,
+ "_default/taxonomy.html", "Taxonomy List Page " + listTemplateCommon,
// Shortcodes
"shortcodes/shortcode.html", "Shortcode: {{ i18n \"hello\" }}",// A shortcode in multiple languages
--
⑨