ref: a4a1e39a512d8b91ba24e86bb02596aff4c09896
parent: 4f75ec985dd91eb4e2f5e8e58cad5ab8ecb15937
author: spf13 <steve.francia@gmail.com>
date: Wed May 14 14:01:13 EDT 2014
Fixing issue when two menu items have the same name.
--- a/docs/layouts/chrome/menu.html
+++ b/docs/layouts/chrome/menu.html
@@ -20,7 +20,7 @@
<a href="#" class="dropdown-toggle" data-toggle="dropdown">{{.Name}} <b class="caret"></b></a><ul class="dropdown-menu">
{{ range .Children }}- <li{{if $currentNode.IsMenuCurrent "main" .Name}} class="active"{{end}}><a href="{{.Url}}"> {{ .Name }} </a> </li>+ <li{{if $currentNode.IsMenuCurrent "main" . }} class="active"{{end}}><a href="{{.Url}}"> {{ .Name }} </a> </li> {{ end }}</ul>
{{else}}@@ -39,7 +39,7 @@
<a href="#" class="dropdown-toggle" data-toggle="dropdown">{{.Name}} <b class="caret"></b></a><ul class="dropdown-menu">
{{ range .Children }}- <li{{if $currentNode.IsMenuCurrent $menu .Name}} class="active"{{end}}><a href="{{.Url}}"> {{ .Name }} </a> </li>+ <li{{if $currentNode.IsMenuCurrent $menu . }} class="active"{{end}}><a href="{{.Url}}"> {{ .Name }} </a> </li> {{ end }}</ul>
{{else}}--- a/hugolib/menu.go
+++ b/hugolib/menu.go
@@ -21,14 +21,15 @@
)
type MenuEntry struct {- Url string
- Name string
- Menu string
- PreName string
- PostName string
- Weight int
- Parent string
- Children Menu
+ Url string
+ Name string
+ Menu string
+ Identifier string
+ PreName string
+ PostName string
+ Weight int
+ Parent string
+ Children Menu
}
type Menu []*MenuEntry
@@ -44,6 +45,27 @@
return me.Children != nil
}
+func (me *MenuEntry) KeyName() string {+ if me.Identifier != "" {+ return me.Identifier
+ }
+ return me.Name
+}
+
+func (me *MenuEntry) hopefullyUniqueId() string {+ if me.Identifier != "" {+ return me.Identifier
+ } else if me.Url != "" {+ return me.Url
+ } else {+ return me.Name
+ }
+}
+
+func (me *MenuEntry) IsEqual(inme *MenuEntry) bool {+ return me.hopefullyUniqueId() == inme.hopefullyUniqueId() && me.Parent == inme.Parent
+}
+
func (me *MenuEntry) MarshallMap(ime map[string]interface{}) { for k, v := range ime {loki := strings.ToLower(k)
@@ -54,24 +76,13 @@
me.Weight = cast.ToInt(v)
case "name":
me.Name = cast.ToString(v)
+ case "identifier":
+ me.Identifier = cast.ToString(v)
case "parent":
me.Parent = cast.ToString(v)
}
}
}
-
-//func (me *MenuEntry) RelUrl() string {-//link, err := p.permalink()
-//if err != nil {-//return "", err
-//}
-
-//link.Scheme = ""
-//link.Host = ""
-//link.User = nil
-//link.Opaque = ""
-//return link.String(), nil
-//}
func (m Menu) Add(me *MenuEntry) Menu { app := func(slice Menu, x ...*MenuEntry) Menu {--- a/hugolib/node.go
+++ b/hugolib/node.go
@@ -39,7 +39,7 @@
func (n *Node) HasMenuCurrent(menu string, me *MenuEntry) bool {return false
}
-func (n *Node) IsMenuCurrent(menu string, name string) bool {+func (n *Node) IsMenuCurrent(menu string, me *MenuEntry) bool {return false
}
--- a/hugolib/page.go
+++ b/hugolib/page.go
@@ -405,7 +405,7 @@
if m, ok := menus[menu]; ok { if me.HasChildren() { for _, child := range me.Children {- if child.Name == m.Name {+ if child.IsEqual(m) {return true
}
}
@@ -416,11 +416,11 @@
}
-func (page *Page) IsMenuCurrent(menu string, name string) bool {+func (page *Page) IsMenuCurrent(menu string, inme *MenuEntry) bool {menus := page.Menus()
if me, ok := menus[menu]; ok {- return me.Name == name
+ return me.IsEqual(inme)
}
return false
--- a/hugolib/site.go
+++ b/hugolib/site.go
@@ -419,7 +419,7 @@
menuConfig := s.getMenusFromConfig()
for name, menu := range menuConfig { for _, me := range *menu {- flat[twoD{name, me.Name}] = me+ flat[twoD{name, me.KeyName()}] = me}
}
@@ -426,7 +426,10 @@
//creating flat hash
for _, p := range s.Pages { for name, me := range p.Menus() {- flat[twoD{name, me.Name}] = me+ if _, ok := flat[twoD{name, me.KeyName()}]; ok {+ jww.ERROR.Printf("Two or more menu items have the same name/identifier in %q Menu. Identified as %q.\n Rename or set a unique identifier. \n", name, me.KeyName())+ }
+ flat[twoD{name, me.KeyName()}] = me}
}
--
⑨