shithub: hugo

Download patch

ref: c95069990795965c34059b6844fe9fa5125be7c1
parent: 6c5ef71368edfae8ffc77224ff6a9ec240c39626
author: Anton Staaf <[email protected]>
date: Sun Mar 5 07:24:14 EST 2017

hugolib: Populate the taxonomy term Pages list

Previously this was left empty, but it is very handy to have a list
of term pages for a given taxonomy.  This list can now be paginated
like other page lists.  It makes it possible to render summary
content from each terms index page for instance.  It also makes it
possible to sort the term pages in the same way that other page
lists can be sorted.  An RSS feed is now generated for
KindTaxonomyTerm pages as well.

This also fixes a bug in HugoSites.createMissingPages.  Previously
it would only check for existing KindTaxonomyTerm pages if the
taxonomy had any terms defined.  So for a taxonomy with no terms
but a taxonomy terms page it would generate a second empty terms
page.

--- a/docs/content/templates/rss.md
+++ b/docs/content/templates/rss.md
@@ -48,6 +48,14 @@
 * /themes/`THEME`/layouts/\_default/rss.xml
 * [Embedded rss.xml](#the-embedded-rss-xml:eceb479b7b3b2077408a2878a29e1320)
 
+### Taxonomy Terms RSS
+
+* /layouts/taxonomy/`SINGULAR`.terms.rss.xml
+* /layouts/\_default/rss.xml
+* /themes/`THEME`/layouts/taxonomy/`SINGULAR`.terms.rss.xml
+* /themes/`THEME`/layouts/\_default/rss.xml
+* [Embedded rss.xml](#the-embedded-rss-xml:eceb479b7b3b2077408a2878a29e1320)
+
 
 ## Configuring RSS
 
--- a/docs/content/templates/terms.md
+++ b/docs/content/templates/terms.md
@@ -57,6 +57,7 @@
 
 * **.Data.Singular** The singular name of the taxonomy
 * **.Data.Plural** The plural name of the taxonomy
+* **.Data.Pages** (or as **.Pages**) The taxonomy Terms index pages
 * **.Data.Terms** The taxonomy itself
 * **.Data.Terms.Alphabetical** The Terms alphabetized
 * **.Data.Terms.ByCount** The Terms ordered by popularity
@@ -121,7 +122,7 @@
 
 ## Ordering
 
-Hugo can order the meta data in two different ways. It can be ordered:
+Hugo can order the term meta data in two different ways. It can be ordered:
 
 * by the number of contents assigned to that key, or
 * alphabetically.
@@ -162,3 +163,14 @@
     </section>
 
     {{ partial "footer.html" . }}
+
+Hugo can also order and paginate the term index pages in all the normal ways.
+
+### Example terms.html snippet (paginated and ordered by date)
+
+    <h1 id="title">{{ .Title }}</h1>
+    <ul>
+      {{ range .Paginator.Pages.ByDate.Reverse }}
+        <li><a href="{{ .Permalink }}">{{ .Title }}</a> {{ $.Data.Terms.Count .Data.Term }}</li>
+      {{ end }}
+    </ul>
--- a/hugolib/node_as_page_test.go
+++ b/hugolib/node_as_page_test.go
@@ -176,7 +176,10 @@
 		"Lastmod: 2009-01-15",
 	)
 
-	// There are no pages to paginate over in the taxonomy terms.
+	// Check taxonomy terms paginator
+	th.assertFileContent(expectedFilePath(ugly, "public", "categories", "page", "2"),
+		"Taxonomy Terms Title: Taxonomy Term Categories",
+		"Pag: Taxonomy Web")
 
 	// RSS
 	th.assertFileContent(filepath.Join("public", "customrss.xml"), "Recent content in Home Sweet Home! on Hugo Rocks", "<rss")
@@ -184,6 +187,7 @@
 	th.assertFileContent(filepath.Join("public", "sect2", "customrss.xml"), "Recent content in Section2 on Hugo Rocks", "<rss")
 	th.assertFileContent(filepath.Join("public", "categories", "hugo", "customrss.xml"), "Recent content in Taxonomy Hugo on Hugo Rocks", "<rss")
 	th.assertFileContent(filepath.Join("public", "categories", "web", "customrss.xml"), "Recent content in Taxonomy Web on Hugo Rocks", "<rss")
+	th.assertFileContent(filepath.Join("public", "categories", "customrss.xml"), "Recent content in Taxonomy Term Categories on Hugo Rocks", "<rss")
 
 }
 
@@ -792,6 +796,10 @@
 	writeSource(t, fs, filepath.Join("layouts", "_default", "terms.html"), `
 Taxonomy Terms Title: {{ .Title }}
 Taxonomy Terms Content: {{ .Content }}
+# Pages: {{ len .Data.Pages }}
+{{ range .Paginator.Pages }}
+	Pag: {{ .Title }}
+{{ end }}
 {{ range $key, $value := .Data.Terms }}
 	k/v: {{ $key | lower }} / {{ printf "%s" $value }}
 {{ end }}
--- a/hugolib/page.go
+++ b/hugolib/page.go
@@ -681,7 +681,8 @@
 		singular := p.s.taxonomiesPluralSingular[p.sections[0]]
 		return []string{"taxonomy/" + singular + ".rss.xml", "_default/rss.xml", "rss.xml", "_internal/_default/rss.xml"}
 	case KindTaxonomyTerm:
-	// No RSS for taxonomy terms
+		singular := p.s.taxonomiesPluralSingular[p.sections[0]]
+		return []string{"taxonomy/" + singular + ".terms.rss.xml", "_default/rss.xml", "rss.xml", "_internal/_default/rss.xml"}
 	case KindPage:
 		// No RSS for regular pages
 	}
@@ -1591,6 +1592,7 @@
 		p.Data[singular] = taxonomy
 		p.Data["Singular"] = singular
 		p.Data["Plural"] = plural
+		p.Data["Term"] = term
 		pages = taxonomy.Pages()
 	case KindTaxonomyTerm:
 		plural := p.sections[0]
@@ -1602,6 +1604,13 @@
 		// keep the following just for legacy reasons
 		p.Data["OrderedIndex"] = p.Data["Terms"]
 		p.Data["Index"] = p.Data["Terms"]
+
+		// A list of all KindTaxonomy pages with matching plural
+		for _, p := range s.findPagesByKind(KindTaxonomy) {
+			if p.sections[0] == plural {
+				pages = append(pages, p)
+			}
+		}
 	}
 
 	p.Data["Pages"] = pages
--- a/hugolib/site.go
+++ b/hugolib/site.go
@@ -2037,7 +2037,7 @@
 func (s *Site) setPageURLs(p *Page, in string) {
 	p.URLPath.URL = s.PathSpec.URLizeAndPrep(in)
 	p.URLPath.Permalink = s.Info.permalink(p.URLPath.URL)
-	if p.Kind != KindPage && p.Kind != KindTaxonomyTerm {
+	if p.Kind != KindPage {
 		p.RSSLink = template.URL(s.Info.permalink(in + ".xml"))
 	}
 }
--- a/hugolib/site_render.go
+++ b/hugolib/site_render.go
@@ -72,7 +72,7 @@
 		}
 
 		// Taxonomy terms have no page set to paginate, so skip that for now.
-		if p.IsNode() && p.Kind != KindTaxonomyTerm {
+		if p.IsNode() {
 			if err := s.renderPaginator(p); err != nil {
 				results <- err
 			}
--- a/hugolib/taxonomy_test.go
+++ b/hugolib/taxonomy_test.go
@@ -15,7 +15,6 @@
 
 import (
 	"fmt"
-	"html/template"
 	"path/filepath"
 	"reflect"
 	"testing"
@@ -127,9 +126,24 @@
 
 	s := h.Sites[0]
 
-	// Issue #1302
-	term := s.getPage(KindTaxonomyTerm, "others")
-	require.Equal(t, template.URL(""), term.RSSLink)
+	// Make sure that each KindTaxonomyTerm page has an appropriate number
+	// of KindTaxonomy pages in its Pages slice.
+	taxonomyTermPageCounts := map[string]int{
+		"tags":       2,
+		"categories": 2,
+		"others":     2,
+		"empties":    0,
+	}
+
+	for taxonomy, count := range taxonomyTermPageCounts {
+		term := s.getPage(KindTaxonomyTerm, taxonomy)
+		require.NotNil(t, term)
+		require.Len(t, term.Pages, count)
+
+		for _, page := range term.Pages {
+			require.Equal(t, KindTaxonomy, page.Kind)
+		}
+	}
 
 	// Issue #3070 preserveTaxonomyNames
 	if preserveTaxonomyNames {