shithub: hugo

Download patch

ref: bdf7cd9f9d8c393e9850375d1b4d45c3096561f8
parent: ac82fe32af2d3f9a5ff56a9b7153da958a23c959
author: spf13 <[email protected]>
date: Thu Apr 24 12:11:08 EDT 2014

Creating site menu configuration and have the docs site use it

--- /dev/null
+++ b/docs/config.toml
@@ -1,0 +1,27 @@
+baseurl = "http://hugo.spf13.com"
+
+[indexes]
+  tag = "tags"
+  group = "groups"
+
+[[menu.main]]
+    name = "getting started"
+    weight = -100
+[[menu.main]]
+    name = "content"
+    weight = -90
+[[menu.main]]
+    name = "layout"
+    weight = -80
+[[menu.main]]
+    name = "taxonomy"
+    weight = -70
+[[menu.main]]
+    name = "extras"
+    weight = -60
+[[menu.main]]
+    name = "community"
+    weight = -50
+[[menu.main]]
+    name = "tutorials"
+    weight = -40
--- a/docs/config.yaml
+++ /dev/null
@@ -1,5 +1,0 @@
-indexes:
-  tag: 'tags'
-  group: 'groups'
-baseurl: 'http://hugo.spf13.com'
-...
--- a/hugolib/menu.go
+++ b/hugolib/menu.go
@@ -13,8 +13,13 @@
 
 package hugolib
 
-import "sort"
+import (
+	"sort"
+	"strings"
 
+	"github.com/spf13/cast"
+)
+
 type MenuEntry struct {
 	Url      string
 	Name     string
@@ -37,6 +42,22 @@
 
 func (me *MenuEntry) HasChildren() bool {
 	return me.Children != nil
+}
+
+func (me *MenuEntry) MarshallMap(ime map[string]interface{}) {
+	for k, v := range ime {
+		loki := strings.ToLower(k)
+		switch loki {
+		case "url":
+			me.Url = cast.ToString(v)
+		case "weight":
+			me.Weight = cast.ToInt(v)
+		case "name":
+			me.Name = cast.ToString(v)
+		case "parent":
+			me.Parent = cast.ToString(v)
+		}
+	}
 }
 
 //func (me *MenuEntry) RelUrl() string {
--- a/hugolib/page.go
+++ b/hugolib/page.go
@@ -490,18 +490,7 @@
 				jww.ERROR.Printf("unable to process menus for %q\n", page.Title)
 			}
 
-			for k, v := range ime {
-				loki := strings.ToLower(k)
-				switch loki {
-				case "weight":
-					menuEntry.Weight = cast.ToInt(v)
-				case "name":
-					menuEntry.Name = cast.ToString(v)
-				case "parent":
-					menuEntry.Parent = cast.ToString(v)
-				}
-			}
-
+			menuEntry.MarshallMap(ime)
 			ret[name] = &menuEntry
 		}
 		return ret
--- a/hugolib/site.go
+++ b/hugolib/site.go
@@ -362,6 +362,40 @@
 	return
 }
 
+func (s *Site) getMenusFromConfig() Menus {
+
+	ret := Menus{}
+
+	if menus := viper.GetStringMap("menu"); menus != nil {
+		for name, menu := range menus {
+			m, err := cast.ToSliceE(menu)
+			if err != nil {
+				jww.ERROR.Printf("unable to process menus in site config\n")
+				jww.ERROR.Println(err)
+			} else {
+				for _, entry := range m {
+					jww.DEBUG.Printf("found menu: %q, in site config\n", name)
+
+					menuEntry := MenuEntry{Menu: name}
+					ime, err := cast.ToStringMapE(entry)
+					if err != nil {
+						jww.ERROR.Printf("unable to process menus in site config\n")
+						jww.ERROR.Println(err)
+					}
+
+					menuEntry.MarshallMap(ime)
+					if ret[name] == nil {
+						ret[name] = &Menu{}
+					}
+					*ret[name] = ret[name].Add(&menuEntry)
+				}
+			}
+		}
+		return ret
+	}
+	return ret
+}
+
 func (s *Site) assembleMenus() {
 
 	type twoD struct {
@@ -369,6 +403,13 @@
 	}
 	flat := map[twoD]*MenuEntry{}
 	children := map[twoD]Menu{}
+
+	menuConfig := s.getMenusFromConfig()
+	for name, menu := range menuConfig {
+		for _, me := range *menu {
+			flat[twoD{name, me.Name}] = me
+		}
+	}
 
 	//creating flat hash
 	for _, p := range s.Pages {