Skip to content

Commit

Permalink
hubolib: Refactor site rendering with an "output format context"
Browse files Browse the repository at this point in the history
  • Loading branch information
bep committed May 9, 2017
1 parent d1eac54 commit bff6287
Show file tree
Hide file tree
Showing 2 changed files with 43 additions and 2 deletions.
40 changes: 38 additions & 2 deletions hugolib/site.go
Expand Up @@ -22,6 +22,7 @@ import (
"net/url"
"os"
"path/filepath"
"sort"
"strconv"
"strings"
"sync"
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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")

Expand Down
5 changes: 5 additions & 0 deletions hugolib/site_render.go
Expand Up @@ -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
Expand Down

0 comments on commit bff6287

Please sign in to comment.