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())
}
}
}