shithub: hugo

Download patch

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