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 {