ref: 11a19e0760e55c31a8ba11eefe50c2b2b6520257
parent: df734bc18aec19ede36402dca88e4f95a761aafc
author: bep <bjorn.erik.pedersen@gmail.com>
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 {--
⑨