// TODO(bep) output
func (p *Page) Render(layout ...string) template.HTML {
+ p.pageOutputInit.Do(func() {
+ // If Render is called in a range loop, the page output isn't available.
+ // So, create one.
+ outFormat := p.outputFormats[0]
+ pageOutput, err := newPageOutput(p, true, outFormat)
+
+ if err != nil {
+ p.s.Log.ERROR.Printf("Failed to create output page for type %q for page %q: %s", outFormat.Name, p, err)
+ return
+ }
+
+ p.mainPageOutput = pageOutput
+
+ })
+
return p.mainPageOutput.Render(layout...)
}
func pageRenderer(s *Site, pages <-chan *Page, results chan<- error, wg *sync.WaitGroup) {
defer wg.Done()
- var mainPageOutput *PageOutput
for page := range pages {
for i, outFormat := range page.outputFormats {
- pageOutput, err := newPageOutput(page, i > 0, outFormat)
+ var (
+ pageOutput *PageOutput
+ err error
+ )
+
+ if i == 0 {
+ page.pageOutputInit.Do(func() {
+ var po *PageOutput
+ po, err = newPageOutput(page, false, outFormat)
+ page.mainPageOutput = po
+ })
+ pageOutput = page.mainPageOutput
+ } else {
+ pageOutput, err = newPageOutput(page, true, outFormat)
+ }
if err != nil {
s.Log.ERROR.Printf("Failed to create output page for type %q for page %q: %s", outFormat.Name, page, err)
continue
}
- if i == 0 {
- mainPageOutput = pageOutput
- }
- page.mainPageOutput = mainPageOutput
var layouts []string