Fixing issue when two menu items have the same name.

This commit is contained in:
spf13 2014-05-14 18:01:13 -04:00
parent 4f75ec985d
commit a4a1e39a51
5 changed files with 43 additions and 29 deletions

View file

@ -20,7 +20,7 @@
<a href="#" class="dropdown-toggle" data-toggle="dropdown">{{.Name}} <b class="caret"></b></a> <a href="#" class="dropdown-toggle" data-toggle="dropdown">{{.Name}} <b class="caret"></b></a>
<ul class="dropdown-menu"> <ul class="dropdown-menu">
{{ range .Children }} {{ 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 }} {{ end }}
</ul> </ul>
{{else}} {{else}}
@ -39,7 +39,7 @@
<a href="#" class="dropdown-toggle" data-toggle="dropdown">{{.Name}} <b class="caret"></b></a> <a href="#" class="dropdown-toggle" data-toggle="dropdown">{{.Name}} <b class="caret"></b></a>
<ul class="dropdown-menu"> <ul class="dropdown-menu">
{{ range .Children }} {{ 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 }} {{ end }}
</ul> </ul>
{{else}} {{else}}

View file

@ -21,14 +21,15 @@ import (
) )
type MenuEntry struct { type MenuEntry struct {
Url string Url string
Name string Name string
Menu string Menu string
PreName string Identifier string
PostName string PreName string
Weight int PostName string
Parent string Weight int
Children Menu Parent string
Children Menu
} }
type Menu []*MenuEntry type Menu []*MenuEntry
@ -44,6 +45,27 @@ func (me *MenuEntry) HasChildren() bool {
return me.Children != nil 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{}) { func (me *MenuEntry) MarshallMap(ime map[string]interface{}) {
for k, v := range ime { for k, v := range ime {
loki := strings.ToLower(k) loki := strings.ToLower(k)
@ -54,25 +76,14 @@ func (me *MenuEntry) MarshallMap(ime map[string]interface{}) {
me.Weight = cast.ToInt(v) me.Weight = cast.ToInt(v)
case "name": case "name":
me.Name = cast.ToString(v) me.Name = cast.ToString(v)
case "identifier":
me.Identifier = cast.ToString(v)
case "parent": case "parent":
me.Parent = cast.ToString(v) 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 { func (m Menu) Add(me *MenuEntry) Menu {
app := func(slice Menu, x ...*MenuEntry) Menu { app := func(slice Menu, x ...*MenuEntry) Menu {
n := len(slice) + len(x) n := len(slice) + len(x)

View file

@ -39,7 +39,7 @@ func (n *Node) Now() time.Time {
func (n *Node) HasMenuCurrent(menu string, me *MenuEntry) bool { func (n *Node) HasMenuCurrent(menu string, me *MenuEntry) bool {
return false return false
} }
func (n *Node) IsMenuCurrent(menu string, name string) bool { func (n *Node) IsMenuCurrent(menu string, me *MenuEntry) bool {
return false return false
} }

View file

@ -405,7 +405,7 @@ func (page *Page) HasMenuCurrent(menu string, me *MenuEntry) bool {
if m, ok := menus[menu]; ok { if m, ok := menus[menu]; ok {
if me.HasChildren() { if me.HasChildren() {
for _, child := range me.Children { for _, child := range me.Children {
if child.Name == m.Name { if child.IsEqual(m) {
return true return true
} }
} }
@ -416,11 +416,11 @@ func (page *Page) HasMenuCurrent(menu string, me *MenuEntry) bool {
} }
func (page *Page) IsMenuCurrent(menu string, name string) bool { func (page *Page) IsMenuCurrent(menu string, inme *MenuEntry) bool {
menus := page.Menus() menus := page.Menus()
if me, ok := menus[menu]; ok { if me, ok := menus[menu]; ok {
return me.Name == name return me.IsEqual(inme)
} }
return false return false

View file

@ -419,14 +419,17 @@ func (s *Site) assembleMenus() {
menuConfig := s.getMenusFromConfig() menuConfig := s.getMenusFromConfig()
for name, menu := range menuConfig { for name, menu := range menuConfig {
for _, me := range *menu { for _, me := range *menu {
flat[twoD{name, me.Name}] = me flat[twoD{name, me.KeyName()}] = me
} }
} }
//creating flat hash //creating flat hash
for _, p := range s.Pages { for _, p := range s.Pages {
for name, me := range p.Menus() { 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
} }
} }