shithub: hugo

Download patch

ref: a5606b06ca6144542b4201a73c5b6c262f946ed3
parent: 471fb1ff699473d7821812490b0ee472ecebb8b2
author: spf13 <[email protected]>
date: Thu Oct 24 11:24:47 EDT 2013

Adding support for ordering content in indexes by other than date (weighted indexes)

--- a/hugolib/index.go
+++ b/hugolib/index.go
@@ -30,7 +30,9 @@
 
 type IndexedPages []WeightedIndexEntry
 
-func (p IndexedPages) Len() int { return len(p) }
+func (p IndexedPages) Len() int      { return len(p) }
+func (p IndexedPages) Swap(i, j int) { p[i], p[j] = p[j], p[i] }
+func (p IndexedPages) Sort()         { sort.Sort(p) }
 func (p IndexedPages) Less(i, j int) bool {
 	if p[i].Weight == p[j].Weight {
 		return p[i].Page.Date.Unix() > p[j].Page.Date.Unix()
@@ -38,10 +40,14 @@
 		return p[i].Weight > p[j].Weight
 	}
 }
-func (p IndexedPages) Swap(i, j int) { p[i], p[j] = p[j], p[i] }
 
-// TODO eliminate unnecessary things
-func (p IndexedPages) Sort() { sort.Sort(p) }
+func (ip IndexedPages) Pages() Pages {
+	pages := make(Pages, len(ip))
+	for i, _ := range ip {
+		pages[i] = ip[i].Page
+	}
+	return pages
+}
 
 type Index map[string]IndexedPages
 type IndexList map[string]Index
--- a/hugolib/site.go
+++ b/hugolib/site.go
@@ -288,12 +288,16 @@
 		s.Indexes[plural] = make(Index)
 		for _, p := range s.Pages {
 			vals := p.GetParam(plural)
+			weight := p.GetParam(plural + "_weight")
+			if weight == nil {
+				weight = 0
+			}
 
 			if vals != nil {
 				v, ok := vals.([]string)
 				if ok {
 					for _, idx := range v {
-						x := WeightedIndexEntry{0, p}
+						x := WeightedIndexEntry{weight.(int), p}
 
 						s.Indexes[plural].Add(idx, x)
 					}
@@ -403,7 +407,7 @@
 			n.RSSlink = permalink(s, url+".xml")
 			n.Date = o[0].Page.Date
 			n.Data[singular] = o
-			n.Data["Pages"] = o
+			n.Data["Pages"] = o.Pages()
 			layout := "indexes/" + singular + ".html"
 
 			var base string
@@ -458,7 +462,7 @@
 		n.Permalink = permalink(s, n.Url)
 		n.RSSlink = permalink(s, section+".xml")
 		n.Date = data[0].Page.Date
-		n.Data["Pages"] = data
+		n.Data["Pages"] = data.Pages()
 		layout := "indexes/" + section + ".html"
 
 		err := s.render(n, section, layout, "_default/indexes.html")
--- a/hugolib/site_test.go
+++ b/hugolib/site_test.go
@@ -380,3 +380,72 @@
 		t.Errorf("Pages in unexpected order. Second should be '%s', got '%s'", "Three", s.Sections["sect"][1].Page.Title)
 	}
 }
+
+var PAGE_WITH_WEIGHTED_INDEXES_2 = []byte(`+++
+tags = [ "a", "b", "c" ]
+tags_weight = 22
+categories = ["d"]
+title = "foo"
+categories_weight = 44
++++
+Front Matter with weighted tags and categories`)
+
+var PAGE_WITH_WEIGHTED_INDEXES_1 = []byte(`+++
+tags = [ "a" ]
+tags_weight = 33
+title = "bar"
+categories = [ "d", "e" ]
+categories_weight = 11
+alias = "spf13"
+date = 1979-05-27T07:32:00Z
++++
+Front Matter with weighted tags and categories`)
+
+var PAGE_WITH_WEIGHTED_INDEXES_3 = []byte(`+++
+title = "bza"
+categories = [ "e" ]
+categories_weight = 11
+alias = "spf13"
+date = 2010-05-27T07:32:00Z
++++
+Front Matter with weighted tags and categories`)
+
+func TestWeightedIndexes(t *testing.T) {
+	files := make(map[string][]byte)
+	target := &target.InMemoryTarget{Files: files}
+	sources := []source.ByteSource{
+		{"sect/doc1.md", PAGE_WITH_WEIGHTED_INDEXES_1, "sect"},
+		{"sect/doc2.md", PAGE_WITH_WEIGHTED_INDEXES_2, "sect"},
+		{"sect/doc3.md", PAGE_WITH_WEIGHTED_INDEXES_3, "sect"},
+	}
+	indexes := make(map[string]string)
+
+	indexes["tag"] = "tags"
+	indexes["category"] = "categories"
+	s := &Site{
+		Target: target,
+		Config: Config{BaseUrl: "http://auth/bub/", Indexes: indexes},
+		Source: &source.InMemorySource{sources},
+	}
+	s.initializeSiteInfo()
+
+	if err := s.CreatePages(); err != nil {
+		t.Fatalf("Unable to create pages: %s", err)
+	}
+
+	if err := s.BuildSiteMeta(); err != nil {
+		t.Fatalf("Unable to build site metadata: %s", err)
+	}
+
+	if s.Indexes["tags"]["a"][0].Page.Title != "bar" {
+		t.Errorf("Pages in unexpected order, 'bar' expected first, got '%v'", s.Indexes["tags"]["a"][0].Page.Title)
+	}
+
+	if s.Indexes["categories"]["d"][0].Page.Title != "foo" {
+		t.Errorf("Pages in unexpected order, 'foo' expected first, got '%v'", s.Indexes["categories"]["d"][0].Page.Title)
+	}
+
+	if s.Indexes["categories"]["e"][0].Page.Title != "bza" {
+		t.Errorf("Pages in unexpected order, 'bza' expected first, got '%v'", s.Indexes["categories"]["e"][0].Page.Title)
+	}
+}