hubolib: Refactor site rendering with an "output format context"

Fixes #3397
This commit is contained in:
Bjørn Erik Pedersen 2017-04-28 09:40:50 +02:00
parent 1d70aa9826
commit 1e4d082cf5
2 changed files with 43 additions and 2 deletions

View file

@ -22,6 +22,7 @@ import (
"net/url"
"os"
"path/filepath"
"sort"
"strconv"
"strings"
"sync"
@ -118,12 +119,42 @@ type Site struct {
outputFormatsConfig output.Formats
mediaTypesConfig media.Types
// We render each site for all the relevant output formats in serial with
// this rendering context pointing to the current one.
rc *siteRenderingContext
// The output formats that we need to render this site in. This slice
// will be fixed once set.
// This will be the union of Site.Pages' outputFormats.
// This slice will be sorted.
renderFormats output.Formats
// Logger etc.
*deps.Deps `json:"-"`
siteStats *siteStats
}
type siteRenderingContext struct {
output.Format
}
func (s *Site) initRenderFormats() {
formatSet := make(map[string]bool)
formats := output.Formats{}
for _, p := range s.Pages {
for _, f := range p.outputFormats {
if !formatSet[f.Name] {
formats = append(formats, f)
formatSet[f.Name] = true
}
}
}
sort.Sort(formats)
s.renderFormats = formats
}
type siteStats struct {
pageCount int
pageCountRegular int
@ -971,8 +1002,13 @@ func (s *Site) render() (err error) {
}
s.timerStep("render and write aliases")
if err = s.renderPages(); err != nil {
return
// TODO(bep) render consider this, ref. render404 etc.
s.initRenderFormats()
for _, rf := range s.renderFormats {
s.rc = &siteRenderingContext{Format: rf}
if err = s.renderPages(); err != nil {
return
}
}
s.timerStep("render and write pages")

View file

@ -81,6 +81,11 @@ func pageRenderer(s *Site, pages <-chan *Page, results chan<- error, wg *sync.Wa
pageOutput, err = page.mainPageOutput.copyWithFormat(outFormat)
}
if outFormat != page.s.rc.Format {
// Will be rendered ... later.
continue
}
if err != nil {
s.Log.ERROR.Printf("Failed to create output page for type %q for page %q: %s", outFormat.Name, page, err)
continue