hugolib: Cache the value of Page's RelPermalink

This commit is contained in:
Bjørn Erik Pedersen 2017-02-20 08:51:18 +01:00
parent 7e0fa13faa
commit fe9fd0acf4

View file

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