ref: 11a19e0760e55c31a8ba11eefe50c2b2b6520257
parent: df734bc18aec19ede36402dca88e4f95a761aafc
author: bep <[email protected]>
date: Wed Feb 4 16:27:27 EST 2015
Build PageMenus only once
--- a/hugolib/page.go
+++ b/hugolib/page.go
@@ -71,6 +71,8 @@
Source
Position
Node
+ pageMenus PageMenus
+ pageMenusInit sync.Once
}
type Source struct {
@@ -569,56 +571,57 @@
}
func (page *Page) Menus() PageMenus {
- ret := PageMenus{}
+ page.pageMenusInit.Do(func() {
+ page.pageMenus = PageMenus{}
- if ms, ok := page.Params["menu"]; ok {
- link, _ := page.RelPermalink()
+ if ms, ok := page.Params["menu"]; ok {
+ 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
- mname, err := cast.ToStringE(ms)
+ // Could be the name of the menu to attach it to
+ mname, err := cast.ToStringE(ms)
- 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 {
+ if err == nil {
me.Menu = mname
- ret[mname] = &me
- return ret
+ page.pageMenus[mname] = &me
+ return
}
- }
- // Could be a structured menu entry
- menus, err := cast.ToStringMapE(ms)
+ // Could be a slice of strings
+ mnames, err := cast.ToStringSliceE(ms)
- if err != nil {
- jww.ERROR.Printf("unable to process menus for %q\n", page.Title)
- }
+ if err == nil {
+ for _, mname := range mnames {
+ me.Menu = mname
+ page.pageMenus[mname] = &me
+ return
+ }
+ }
- for name, menu := range menus {
- menuEntry := MenuEntry{Name: page.LinkTitle(), Url: link, Weight: page.Weight, Menu: name}
- jww.DEBUG.Printf("found menu: %q, in %q\n", name, page.Title)
+ // Could be a structured menu entry
+ menus, err := cast.ToStringMapE(ms)
- ime, err := cast.ToStringMapE(menu)
if err != nil {
jww.ERROR.Printf("unable to process menus for %q\n", page.Title)
}
- menuEntry.MarshallMap(ime)
- ret[name] = &menuEntry
+ for name, menu := range menus {
+ menuEntry := MenuEntry{Name: page.LinkTitle(), Url: link, Weight: page.Weight, Menu: name}
+ jww.DEBUG.Printf("found menu: %q, in %q\n", name, page.Title)
+
+ 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 ret
- }
+ })
- return nil
+ return page.pageMenus
}
func (p *Page) Render(layout ...string) template.HTML {