shithub: hugo

Download patch

ref: 52c089ffbddfa7b3192b4cd3f3e10773c7a6e30c
parent: ddad1e04ac1fcbda6bbe70fb39a4a60864f49faf
author: spf13 <[email protected]>
date: Fri Aug 2 23:09:28 EDT 2013

Added support for indexes of indexes & ordered indexes

--- a/hugolib/index.go
+++ b/hugolib/index.go
@@ -17,10 +17,15 @@
 	"sort"
 )
 
+type IndexCount struct {
+	Name  string
+	Count int
+}
+
 type Index map[string]Pages
 type IndexList map[string]Index
 
-type OrderedIndex []*Pages
+type OrderedIndex []IndexCount
 type OrderedIndexList map[string]OrderedIndex
 
 // KeyPrep... Indexes should be case insensitive. Can make it easily conditional later.
@@ -35,24 +40,21 @@
 	i[key] = append(i[key], p)
 }
 
-func (l IndexList) BuildOrderedIndexList() *OrderedIndexList {
+func (l IndexList) BuildOrderedIndexList() OrderedIndexList {
 	oil := make(OrderedIndexList, len(l))
 	for idx_name, index := range l {
 		i := 0
 		oi := make(OrderedIndex, len(index))
-		for _, e := range index {
-			oi[i] = &e
+		for name, pages := range index {
+			oi[i] = IndexCount{name, len(pages)}
 			i++
 		}
-		oi.Sort()
+		sort.Sort(oi)
 		oil[idx_name] = oi
 	}
-	return &oil
+	return oil
 }
 
-func (idx OrderedIndex) Len() int { return len(idx) }
-
-func (idx OrderedIndex) Less(i, j int) bool       { return len(*idx[i]) < len(*idx[j]) }
-func (idx OrderedIndex) Swap(i, j int)            { idx[i], idx[j] = idx[j], idx[i] }
-func (idx OrderedIndex) Sort()                    { sort.Sort(idx) }
-func (idx OrderedIndex) Limit(n int) OrderedIndex { return idx[0:n] }
+func (idx OrderedIndex) Len() int           { return len(idx) }
+func (idx OrderedIndex) Less(i, j int) bool { return idx[i].Count > idx[j].Count }
+func (idx OrderedIndex) Swap(i, j int)      { idx[i], idx[j] = idx[j], idx[i] }
--- a/hugolib/site.go
+++ b/hugolib/site.go
@@ -45,7 +45,7 @@
 
 type SiteInfo struct {
 	BaseUrl    template.URL
-	Indexes    *OrderedIndexList
+	Indexes    OrderedIndexList
 	Recent     *Pages
 	LastChange time.Time
 	Title      string
@@ -94,6 +94,7 @@
 	site.AbsUrlify()
 	site.timer.Step("absolute URLify")
 	site.RenderIndexes()
+	site.RenderIndexesIndexes()
 	site.timer.Step("render and write indexes")
 	site.RenderLists()
 	site.timer.Step("render and write lists")
@@ -263,6 +264,7 @@
 	}
 
 	s.Info.Indexes = s.Indexes.BuildOrderedIndexList()
+
 	if len(s.Pages) == 0 {
 		return errors.New(fmt.Sprintf("Unable to build site metadata, no pages found in directory %s", s.c.ContentDir))
 	}
@@ -348,6 +350,27 @@
 				s.Tmpl.ExecuteTemplate(y, "rss.xml", n)
 				s.WritePublic(base+".xml", y.Bytes())
 			}
+		}
+	}
+}
+
+func (s *Site) RenderIndexesIndexes() {
+	layout := "indexes" + slash + "index.html"
+	if s.Tmpl.Lookup(layout) != nil {
+		for singular, plural := range s.c.Indexes {
+			n := s.NewNode()
+			n.Title = strings.Title(plural)
+			url := Urlize(plural)
+			n.Url = url + "/index.html"
+			n.Permalink = template.HTML(MakePermalink(string(n.Site.BaseUrl), string(n.Url)))
+			n.Data["Singular"] = singular
+			n.Data["Plural"] = plural
+			n.Data["Index"] = s.Indexes[plural]
+			n.Data["OrderedIndex"] = s.Info.Indexes[plural]
+			fmt.Println(s.Info.Indexes)
+
+			x := s.RenderThing(n, layout)
+			s.WritePublic(plural+slash+"index.html", x.Bytes())
 		}
 	}
 }