shithub: hugo

Download patch

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 {