shithub: hugo

Download patch

ref: fe9fd0acf4b0fa972d3918d1abcdfcb21de45692
parent: 7e0fa13faab4b77427b4f9ac392fda252b7b50ab
author: Bjørn Erik Pedersen <[email protected]>
date: Mon Feb 20 03:51:18 EST 2017

hugolib: Cache the value of Page's RelPermalink

--- a/hugolib/page.go
+++ b/hugolib/page.go
@@ -189,7 +189,8 @@
 	RSSLink template.HTML
 
 	URLPath
-	permalink *url.URL
+	permalink    *url.URL
+	relPermalink string
 
 	paginator *Pager
 
@@ -213,6 +214,7 @@
 	plainWordsInit      sync.Once
 	renderingConfigInit sync.Once
 	pageURLInit         sync.Once
+	relPermalinkInit    sync.Once
 }
 
 // IsNode returns whether this is an item of one of the list types in Hugo,
@@ -927,34 +929,39 @@
 }
 
 func (p *Page) RelPermalink() string {
-	link := p.getPermalink()
+	p.relPermalinkInit.Do(func() {
+		link := p.getPermalink()
 
-	if p.s.Info.canonifyURLs {
-		// replacements for relpermalink with baseURL on the form http://myhost.com/sub/ will fail later on
-		// have to return the URL relative from baseURL
-		relpath, err := helpers.GetRelativePath(link.String(), string(p.Site.BaseURL))
-		if err != nil {
-			return ""
-		}
+		if p.s.Info.canonifyURLs {
+			// replacements for relpermalink with baseURL on the form http://myhost.com/sub/ will fail later on
+			// have to return the URL relative from baseURL
+			relpath, err := helpers.GetRelativePath(link.String(), string(p.Site.BaseURL))
+			if err != nil {
+				return
+			}
 
-		relpath = filepath.ToSlash(relpath)
+			relpath = filepath.ToSlash(relpath)
 
-		if relpath[0] == '.' {
-			relpath = relpath[1:]
-		}
+			if relpath[0] == '.' {
+				relpath = relpath[1:]
+			}
 
-		if !strings.HasPrefix(relpath, "/") {
-			relpath = "/" + relpath
+			if !strings.HasPrefix(relpath, "/") {
+				relpath = "/" + relpath
+			}
+
+			p.relPermalink = relpath
+			return
 		}
 
-		return relpath
-	}
+		link.Scheme = ""
+		link.Host = ""
+		link.User = nil
+		link.Opaque = ""
+		p.relPermalink = link.String()
+	})
 
-	link.Scheme = ""
-	link.Host = ""
-	link.User = nil
-	link.Opaque = ""
-	return link.String()
+	return p.relPermalink
 }
 
 var ErrHasDraftAndPublished = errors.New("both draft and published parameters were found in page's frontmatter")