Fixing issue when two menu items have the same name.
authorspf13 <steve.francia@gmail.com>
Wed, 14 May 2014 22:01:13 +0000 (18:01 -0400)
committerspf13 <steve.francia@gmail.com>
Wed, 14 May 2014 22:08:11 +0000 (18:08 -0400)
docs/layouts/chrome/menu.html
hugolib/menu.go
hugolib/node.go
hugolib/page.go
hugolib/site.go

index 445ae67aa21873dce561238a9476d03cdd241909..6ff80a589c7e33b57482ca7ab2dee672ac040358 100644 (file)
@@ -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}}
index abbdf281145029deb0e38f578a4d840b81e15a2f..060f3855cd2c044dbc94012a280847718d981ba1 100644 (file)
@@ -21,14 +21,15 @@ import (
 )
 
 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 @@ func (me *MenuEntry) HasChildren() bool {
        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,25 +76,14 @@ func (me *MenuEntry) MarshallMap(ime map[string]interface{}) {
                        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 {
                n := len(slice) + len(x)
index 1accd03ad3e25e9311d10dca1e85323374fd7550..e7e524da2b3570130d8ab5f89833ca84816f7adf 100644 (file)
@@ -39,7 +39,7 @@ func (n *Node) Now() time.Time {
 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
 }
 
index 370a7a2e7b7cc902e65db83ec4848d5e211ca0f5..ca0ba630af125d1495f0f9ed88443a2e5cb6f9a4 100644 (file)
@@ -405,7 +405,7 @@ func (page *Page) HasMenuCurrent(menu string, me *MenuEntry) bool {
        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) 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()
 
        if me, ok := menus[menu]; ok {
-               return me.Name == name
+               return me.IsEqual(inme)
        }
 
        return false
index bec1635f8a3cd5190b78d0cad261e396f4de66d3..e77d4856320f79a05538ae652dbc28f661f2da59 100644 (file)
@@ -419,14 +419,17 @@ func (s *Site) assembleMenus() {
        menuConfig := s.getMenusFromConfig()
        for name, menu := range menuConfig {
                for _, me := range *menu {
-                       flat[twoD{name, me.Name}] = me
+                       flat[twoD{name, me.KeyName()}] = me
                }
        }
 
        //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
                }
        }