shithub: hugo

Download patch

ref: 1fbcaf927920f7e94eef42f152722c957a7922cb
parent: 226bc8f59fc9bfeef44f4b9df657d8ed05502560
author: spf13 <[email protected]>
date: Mon Nov 4 19:28:08 EST 2013

Buffers instead of pipes

--- a/hugolib/site.go
+++ b/hugolib/site.go
@@ -31,6 +31,8 @@
 	"time"
 )
 
+var _ = transform.AbsURL
+
 var DefaultTimer *nitro.B
 
 func MakePermalink(base *url.URL, path *url.URL) *url.URL {
@@ -55,19 +57,19 @@
 //
 // 5. The entire collection of files is written to disk.
 type Site struct {
-	Config      Config
-	Pages       Pages
-	Tmpl        bundle.Template
-	Indexes     IndexList
-	Source      source.Input
-	Sections    Index
-	Info        SiteInfo
-	Shortcodes  map[string]ShortcodeFunc
-	timer       *nitro.B
-	Target      target.Output
-	Alias       target.AliasPublisher
-	Completed   chan bool
-	RunMode     runmode
+	Config     Config
+	Pages      Pages
+	Tmpl       bundle.Template
+	Indexes    IndexList
+	Source     source.Input
+	Sections   Index
+	Info       SiteInfo
+	Shortcodes map[string]ShortcodeFunc
+	timer      *nitro.B
+	Target     target.Output
+	Alias      target.AliasPublisher
+	Completed  chan bool
+	RunMode    runmode
 }
 
 type SiteInfo struct {
@@ -167,7 +169,6 @@
 	s.timerStep("render and write aliases")
 	s.ProcessShortcodes()
 	s.timerStep("render shortcodes")
-	s.timerStep("absolute URLify")
 	if err = s.RenderIndexes(); err != nil {
 		return
 	}
@@ -580,7 +581,6 @@
 		section, _ = page.RelPermalink()
 	}
 
-
 	absURL, err := transform.AbsURL(s.Config.BaseUrl)
 	if err != nil {
 		return
@@ -587,28 +587,29 @@
 	}
 
 	transformer := transform.NewChain(
-		append(absURL, transform.NavActive(section, "hugo-nav")...)...
+		append(absURL, transform.NavActive(section, "hugo-nav")...)...,
 	)
 
-	renderReader, renderWriter := io.Pipe()
-	go func() {
-		err = s.renderThing(d, layout, renderWriter)
-		if err != nil {
-			// Behavior here should be dependent on if running in server or watch mode.
-			fmt.Println(fmt.Errorf("Rendering error: %v", err))
-			if !s.Running() {
-				os.Exit(-1)
-			}
-		}
-	}()
+	var RenderBuffer *bytes.Buffer
 
-	trReader, trWriter := io.Pipe()
-	go func() {
-		transformer.Apply(trWriter, renderReader)
-		trWriter.Close()
-	}()
+	if strings.HasSuffix(out, ".xml") {
+		RenderBuffer = s.NewXMLBuffer()
+	} else {
+		RenderBuffer = new(bytes.Buffer)
+	}
 
-	return s.WritePublic(out, trReader)
+	err = s.renderThing(d, layout, RenderBuffer)
+	if err != nil {
+		// Behavior here should be dependent on if running in server or watch mode.
+		fmt.Println(fmt.Errorf("Rendering error: %v", err))
+		if !s.Running() {
+			os.Exit(-1)
+		}
+	}
+
+	var outBuffer = new(bytes.Buffer)
+	transformer.Apply(outBuffer, RenderBuffer)
+	return s.WritePublic(out, outBuffer)
 }
 
 func (s *Site) findFirstLayout(layouts ...string) (layout string) {
@@ -620,16 +621,16 @@
 	return ""
 }
 
-func (s *Site) renderThing(d interface{}, layout string, w io.WriteCloser) error {
+func (s *Site) renderThing(d interface{}, layout string, w io.Writer) error {
 	// If the template doesn't exist, then return, but leave the Writer open
 	if s.Tmpl.Lookup(layout) == nil {
 		return fmt.Errorf("Layout not found: %s", layout)
 	}
-	defer w.Close()
+	//defer w.Close()
 	return s.Tmpl.ExecuteTemplate(w, layout, d)
 }
 
-func (s *Site) whyNewXMLBuffer() *bytes.Buffer {
+func (s *Site) NewXMLBuffer() *bytes.Buffer {
 	header := "<?xml version=\"1.0\" encoding=\"utf-8\" standalone=\"yes\" ?>\n"
 	return bytes.NewBufferString(header)
 }