hugolib: Init the content and shortcodes early

In most cases we could delay the content init until rendering time, but there could be use cases where the templates would depend on state set in the shortcodes (.Page.Scratch.Set), so we  need to do this early.

See #4632
This commit is contained in:
Bjørn Erik Pedersen 2018-04-22 11:18:39 +02:00
parent 47e7788b3c
commit 19084eaf74

View file

@ -560,22 +560,40 @@ func (h *HugoSites) setupTranslations() {
} }
func (s *Site) preparePagesForRender(cfg *BuildCfg) { func (s *Site) preparePagesForRender(cfg *BuildCfg) {
pageChan := make(chan *Page)
wg := &sync.WaitGroup{}
numWorkers := getGoMaxProcs() * 4
for i := 0; i < numWorkers; i++ {
wg.Add(1)
go func(pages <-chan *Page, wg *sync.WaitGroup) {
defer wg.Done()
for p := range pages {
p.setContentInit(cfg)
// In most cases we could delay the content init until rendering time,
// but there could be use cases where the templates would depend
// on state set in the shortcodes (.Page.Scratch.Set), so we
// need to do this early. This will do the needed recursion.
p.initContent()
}
}(pageChan, wg)
}
for _, p := range s.Pages { for _, p := range s.Pages {
p.setContentInit(cfg) pageChan <- p
// The skip render flag is used in many tests. To make sure that they
// have access to the content, we need to manually initialize it here.
if cfg.SkipRender {
p.initContent()
}
} }
for _, p := range s.headlessPages { for _, p := range s.headlessPages {
p.setContentInit(cfg) pageChan <- p
if cfg.SkipRender {
p.initContent()
}
} }
close(pageChan)
wg.Wait()
} }
// Pages returns all pages for all sites. // Pages returns all pages for all sites.