Build PageMenus only once

This commit is contained in:
bep 2015-02-04 21:27:27 +01:00
parent df734bc18a
commit 11a19e0760

View file

@ -71,6 +71,8 @@ type Page struct {
Source Source
Position Position
Node Node
pageMenus PageMenus
pageMenusInit sync.Once
} }
type Source struct { type Source struct {
@ -569,56 +571,57 @@ func (page *Page) IsMenuCurrent(menu string, inme *MenuEntry) bool {
} }
func (page *Page) Menus() PageMenus { func (page *Page) Menus() PageMenus {
ret := PageMenus{} page.pageMenusInit.Do(func() {
page.pageMenus = PageMenus{}
if ms, ok := page.Params["menu"]; ok { if ms, ok := page.Params["menu"]; ok {
link, _ := page.RelPermalink() link, _ := page.RelPermalink()
me := MenuEntry{Name: page.LinkTitle(), Weight: page.Weight, Url: link} me := MenuEntry{Name: page.LinkTitle(), Weight: page.Weight, Url: link}
// Could be the name of the menu to attach it to // Could be the name of the menu to attach it to
mname, err := cast.ToStringE(ms) mname, err := cast.ToStringE(ms)
if err == nil { if err == nil {
me.Menu = mname
ret[mname] = &me
return ret
}
// Could be an slice of strings
mnames, err := cast.ToStringSliceE(ms)
if err == nil {
for _, mname := range mnames {
me.Menu = mname me.Menu = mname
ret[mname] = &me page.pageMenus[mname] = &me
return ret return
} }
}
// Could be a structured menu entry // Could be a slice of strings
menus, err := cast.ToStringMapE(ms) mnames, err := cast.ToStringSliceE(ms)
if err != nil { if err == nil {
jww.ERROR.Printf("unable to process menus for %q\n", page.Title) for _, mname := range mnames {
} me.Menu = mname
page.pageMenus[mname] = &me
return
}
}
for name, menu := range menus { // Could be a structured menu entry
menuEntry := MenuEntry{Name: page.LinkTitle(), Url: link, Weight: page.Weight, Menu: name} menus, err := cast.ToStringMapE(ms)
jww.DEBUG.Printf("found menu: %q, in %q\n", name, page.Title)
ime, err := cast.ToStringMapE(menu)
if err != nil { if err != nil {
jww.ERROR.Printf("unable to process menus for %q\n", page.Title) jww.ERROR.Printf("unable to process menus for %q\n", page.Title)
} }
menuEntry.MarshallMap(ime) for name, menu := range menus {
ret[name] = &menuEntry menuEntry := MenuEntry{Name: page.LinkTitle(), Url: link, Weight: page.Weight, Menu: name}
} jww.DEBUG.Printf("found menu: %q, in %q\n", name, page.Title)
return ret
}
return nil ime, err := cast.ToStringMapE(menu)
if err != nil {
jww.ERROR.Printf("unable to process menus for %q\n", page.Title)
}
menuEntry.MarshallMap(ime)
page.pageMenus[name] = &menuEntry
}
}
})
return page.pageMenus
} }
func (p *Page) Render(layout ...string) template.HTML { func (p *Page) Render(layout ...string) template.HTML {