shithub: hugo

Download patch

ref: 8125b4b03d10eb73f8aea3f9ea41172aba8df082
parent: 87217d1d0a96ffcea0cd1904c89805367bc16ccf
author: Vas Sudanagunta <[email protected]>
date: Sun Jan 21 09:40:58 EST 2018

Tighten page kind logic, introduce tests

--- a/hugolib/page.go
+++ b/hugolib/page.go
@@ -759,7 +759,7 @@
 func (s *Site) newPageFromFile(fi *fileInfo) *Page {
 	return &Page{
 		pageInit:    &pageInit{},
-		Kind:        kindFromFilename(fi.Path()),
+		Kind:        kindFromFileInfo(fi),
 		contentType: "",
 		Source:      Source{File: fi},
 		Keywords:    []string{}, Sitemap: Sitemap{Priority: -1},
@@ -2010,24 +2010,16 @@
 	return strings.Split(dirname, helpers.FilePathSeparator)
 }
 
-const (
-	regularPageFileNameDoesNotStartWith = "_index"
-
-	// There can be "my_regular_index_page.md but not /_index_file.md
-	regularPageFileNameDoesNotContain = helpers.FilePathSeparator + regularPageFileNameDoesNotStartWith
-)
-
-func kindFromFilename(filename string) string {
-	if !strings.HasPrefix(filename, regularPageFileNameDoesNotStartWith) && !strings.Contains(filename, regularPageFileNameDoesNotContain) {
-		return KindPage
+func kindFromFileInfo(fi *fileInfo) string {
+	if fi.TranslationBaseName() == "_index" {
+		if fi.Dir() == "" {
+			return KindHome
+		}
+		// Could be index for section, taxonomy, taxonomy term
+		// We don't know enough yet to determine which
+		return kindUnknown
 	}
-
-	if strings.HasPrefix(filename, "_index") {
-		return KindHome
-	}
-
-	// We don't know enough yet to determine the type.
-	return kindUnknown
+	return KindPage
 }
 
 func (p *Page) setValuesForKind(s *Site) {
--- a/hugolib/page_test.go
+++ b/hugolib/page_test.go
@@ -1010,6 +1010,60 @@
 	}
 }
 
+func TestPageKind(t *testing.T) {
+	t.Parallel()
+	const sep = helpers.FilePathSeparator
+	var tests = []struct {
+		file string
+		kind string
+	}{
+		{"_index.md", KindHome},
+		{"about.md", KindPage},
+		{"sectionA" + sep + "_index.md", KindSection},
+		{"sectionA" + sep + "about.md", KindPage},
+		{"categories" + sep + "_index.md", KindTaxonomyTerm},
+		{"categories" + sep + "categoryA" + sep + "_index.md", KindTaxonomy},
+		{"tags" + sep + "_index.md", KindTaxonomyTerm},
+		{"tags" + sep + "tagA" + sep + "_index.md", KindTaxonomy},
+
+		// nn is configured as a language
+		{"_index.nn.md", KindHome},
+		{"about.nn.md", KindPage},
+		{"sectionA" + sep + "_index.nn.md", KindSection},
+		{"sectionA" + sep + "about.nn.md", KindPage},
+
+		// should NOT be categorized as KindHome
+		{"_indexNOT.md", KindPage},
+
+		// To be consistent with FileInfo.TranslationBaseName(),
+		// language codes not explicitly configured for the site
+		// are not treated as such. "fr" is not configured as
+		// a language in the test site, so ALL of the
+		// following should be KindPage
+		{"_index.fr.md", KindPage}, //not KindHome
+		{"about.fr.md", KindPage},
+		{"sectionA" + sep + "_index.fr.md", KindPage}, // KindSection
+		{"sectionA" + sep + "about.fr.md", KindPage},
+	}
+
+	for _, test := range tests {
+		s := newTestSite(t, "languages.nn.languageName", "Nynorsk")
+		taxonomies := make(map[string]string)
+		taxonomies["tag"] = "tags"
+		taxonomies["category"] = "categories"
+		s.Taxonomies = make(TaxonomyList)
+		for _, plural := range taxonomies {
+			s.Taxonomies[plural] = make(Taxonomy)
+		}
+
+		p, _ := s.NewPage(test.file)
+		p.setValuesForKind(s)
+		if p.Kind != test.kind {
+			t.Errorf("for %s expected p.Kind == %s, got %s", test.file, test.kind, p.Kind)
+		}
+	}
+}
+
 func TestDegenerateInvalidFrontMatterShortDelim(t *testing.T) {
 	t.Parallel()
 	var tests = []struct {