shithub: hugo

Download patch

ref: b4c507287a67d806832893029648219d5830fd7d
parent: 77074127e073328a376b41933bd807e074ca4f37
author: spf13 <[email protected]>
date: Fri Jan 30 06:51:06 EST 2015

site's XML generation using BBP

--- a/hugolib/site.go
+++ b/hugolib/site.go
@@ -27,8 +27,11 @@
 	"sync"
 	"time"
 
+	"sync/atomic"
+
 	"bitbucket.org/pkg/inflect"
 	"github.com/spf13/cast"
+	bp "github.com/spf13/hugo/bufferpool"
 	"github.com/spf13/hugo/helpers"
 	"github.com/spf13/hugo/hugofs"
 	"github.com/spf13/hugo/source"
@@ -38,7 +41,6 @@
 	jww "github.com/spf13/jwalterweatherman"
 	"github.com/spf13/nitro"
 	"github.com/spf13/viper"
-	"sync/atomic"
 )
 
 var _ = transform.AbsURL
@@ -1015,15 +1017,10 @@
 			n.Url = s.permalinkStr(base + "/index.xml")
 			n.Permalink = s.permalink(base)
 			rssLayouts := []string{"taxonomy/" + t.singular + ".rss.xml", "_default/rss.xml", "rss.xml", "_internal/_default/rss.xml"}
-			b, err := s.renderXML("taxonomy "+t.singular+" rss", n, s.appendThemeTemplates(rssLayouts)...)
-			if err != nil {
+
+			if err := s.renderAndWriteXML("taxonomy "+t.singular+" rss", base+"/index.xml", n, s.appendThemeTemplates(rssLayouts)...); err != nil {
 				results <- err
 				continue
-			} else {
-				err := s.WriteDestFile(base+"/index.xml", b)
-				if err != nil {
-					results <- err
-				}
 			}
 		}
 	}
@@ -1127,13 +1124,9 @@
 			n.Url = s.permalinkStr(section + "/index.xml")
 			n.Permalink = s.permalink(section)
 			rssLayouts := []string{"section/" + section + ".rss.xml", "_default/rss.xml", "rss.xml", "_internal/_default/rss.xml"}
-			b, err := s.renderXML("section "+section+" rss", n, s.appendThemeTemplates(rssLayouts)...)
-			if err != nil {
+			if err := s.renderAndWriteXML("section "+section+" rss", section+"/index.xml", n, s.appendThemeTemplates(rssLayouts)...); err != nil {
 				return err
 			}
-			if err := s.WriteDestFile(section+"/index.xml", b); err != nil {
-				return err
-			}
 		}
 	}
 	return nil
@@ -1207,13 +1200,10 @@
 		}
 
 		rssLayouts := []string{"rss.xml", "_default/rss.xml", "_internal/_default/rss.xml"}
-		b, err := s.renderXML("homepage rss", n, s.appendThemeTemplates(rssLayouts)...)
-		if err != nil {
+
+		if err := s.renderAndWriteXML("homepage rss", "index.xml", n, s.appendThemeTemplates(rssLayouts)...); err != nil {
 			return err
 		}
-		if err := s.WriteDestFile("index.xml", b); err != nil {
-			return err
-		}
 	}
 
 	n.Url = helpers.Urlize("404.html")
@@ -1274,13 +1264,10 @@
 	}
 
 	smLayouts := []string{"sitemap.xml", "_default/sitemap.xml", "_internal/_default/sitemap.xml"}
-	b, err := s.renderXML("sitemap", n, s.appendThemeTemplates(smLayouts)...)
-	if err != nil {
+
+	if err := s.renderAndWriteXML("sitemap", "sitemap.xml", n, s.appendThemeTemplates(smLayouts)...); err != nil {
 		return err
 	}
-	if err := s.WriteDestFile("sitemap.xml", b); err != nil {
-		return err
-	}
 
 	if optChanged {
 		s.PageTarget().(*target.PagePub).UglyUrls = viper.GetBool("UglyUrls")
@@ -1328,20 +1315,29 @@
 	return found
 }
 
-func (s *Site) renderXML(name string, d interface{}, layouts ...string) (io.Reader, error) {
-	renderBuffer := s.NewXMLBuffer()
+func (s *Site) renderAndWriteXML(name string, dest string, d interface{}, layouts ...string) error {
+	renderBuffer := bp.GetBuffer()
+	defer bp.PutBuffer(renderBuffer)
+	renderBuffer.WriteString("<?xml version=\"1.0\" encoding=\"utf-8\" standalone=\"yes\" ?>\n")
+
 	err := s.render(name, d, renderBuffer, layouts...)
 
-	var outBuffer = new(bytes.Buffer)
-
 	absURLInXML, err := transform.AbsURLInXML(viper.GetString("BaseUrl"))
 	if err != nil {
-		return nil, err
+		return err
 	}
 
+	outBuffer := bp.GetBuffer()
+	defer bp.PutBuffer(outBuffer)
+
 	transformer := transform.NewChain(absURLInXML...)
 	transformer.Apply(outBuffer, renderBuffer)
-	return outBuffer, err
+
+	if err == nil {
+		err = s.WriteDestFile(dest, outBuffer)
+	}
+
+	return err
 }
 
 func (s *Site) renderPage(name string, d interface{}, layouts ...string) (io.Reader, error) {