ref: 1e4d082cf5b92fedbc60b1b4f0e9d1ee6ec45e33
parent: 1d70aa9826776e7c38a72864565daeb34a55ca52
author: Bjørn Erik Pedersen <[email protected]>
date: Fri Apr 28 05:40:50 EDT 2017
hubolib: Refactor site rendering with an "output format context" Fixes #3397
--- a/hugolib/site.go
+++ b/hugolib/site.go
@@ -22,6 +22,7 @@
"net/url"
"os"
"path/filepath"
+ "sort"
"strconv"
"strings"
"sync"
@@ -118,6 +119,16 @@
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:"-"`
@@ -124,6 +135,26 @@
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 @@
}
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")
--- a/hugolib/site_render.go
+++ b/hugolib/site_render.go
@@ -81,6 +81,11 @@
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