diff --git a/docs/layouts/chrome/menu.html b/docs/layouts/chrome/menu.html index 445ae67aa..6ff80a589 100644 --- a/docs/layouts/chrome/menu.html +++ b/docs/layouts/chrome/menu.html @@ -20,7 +20,7 @@ {{.Name}} {{else}} @@ -39,7 +39,7 @@ {{.Name}} {{else}} diff --git a/hugolib/menu.go b/hugolib/menu.go index abbdf2811..060f3855c 100644 --- a/hugolib/menu.go +++ b/hugolib/menu.go @@ -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) diff --git a/hugolib/node.go b/hugolib/node.go index 1accd03ad..e7e524da2 100644 --- a/hugolib/node.go +++ b/hugolib/node.go @@ -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 } diff --git a/hugolib/page.go b/hugolib/page.go index 370a7a2e7..ca0ba630a 100644 --- a/hugolib/page.go +++ b/hugolib/page.go @@ -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 diff --git a/hugolib/site.go b/hugolib/site.go index bec1635f8..e77d48563 100644 --- a/hugolib/site.go +++ b/hugolib/site.go @@ -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 } }