shithub: hugo

Download patch

ref: 19cb6c7819baa0daa7c6d6f0c23481578171ead8
parent: 2176d2c197aeb265b7c51aae1d007eaf11690520
author: Noah Campbell <[email protected]>
date: Tue Oct 1 15:58:15 EDT 2013

Move writing next to rendering

All render(Thing) calls have a WritePublic call directly after it.  This
refactor creates one function that makes the specific call sequence.

--- a/hugolib/site.go
+++ b/hugolib/site.go
@@ -376,14 +376,10 @@
 			layout = p.Layout()
 		}
 
-		content, err := s.renderThingOrDefault(p, layout, "_default/single.html")
+		err := s.render(p, layout, "_default/single.html", p.TargetPath())
 		if err != nil {
 			return err
 		}
-		err = s.WritePublic(p.TargetPath(), content)
-		if err != nil {
-			return err
-		}
 	}
 	return nil
 }
@@ -402,14 +398,10 @@
 			n.Data[singular] = o
 			n.Data["Pages"] = o
 			layout := "indexes/" + singular + ".html"
-			x, err := s.renderThing(n, layout)
-			if err != nil {
-				return err
-			}
 
 			var base string
 			base = plural + "/" + k
-			err = s.WritePublic(base+".html", x)
+			err := s.render(n, layout, "_default/indexes.html", base+".html")
 			if err != nil {
 				return err
 			}
@@ -444,15 +436,10 @@
 			n.Data["Index"] = s.Indexes[plural]
 			n.Data["OrderedIndex"] = s.Info.Indexes[plural]
 
-			x, err := s.renderThing(n, layout)
+			err := s.render(n, layout, "_default/indexesindexes.html", plural+"/index.html")
 			if err != nil {
 				return err
 			}
-
-			err = s.WritePublic(plural+"/index.html", x)
-			if err != nil {
-				return err
-			}
 		}
 	}
 	return
@@ -469,14 +456,10 @@
 		n.Data["Pages"] = data
 		layout := "indexes/" + section + ".html"
 
-		content, err := s.renderThingOrDefault(n, layout, "_default/index.html")
+		err := s.render(n, layout, "_default/index.html", section)
 		if err != nil {
 			return err
 		}
-		err = s.WritePublic(section, content)
-		if err != nil {
-			return err
-		}
 
 		if a := s.Tmpl.Lookup("rss.xml"); a != nil {
 			// XML Feed
@@ -508,14 +491,10 @@
 			n.Data["Pages"] = s.Pages[:9]
 		}
 	}
-	x, err := s.renderThing(n, "index.html")
+	err := s.render(n, "index.html", "_default/index.html", "/")
 	if err != nil {
 		return err
 	}
-	err = s.WritePublic("/", x)
-	if err != nil {
-		return err
-	}
 
 	if a := s.Tmpl.Lookup("rss.xml"); a != nil {
 		// XML Feed
@@ -524,7 +503,7 @@
 		n.Permalink = permalink(s, "index.xml")
 		y := s.NewXMLBuffer()
 		s.Tmpl.ExecuteTemplate(y, "rss.xml", n)
-		err = s.WritePublic(".xml", y)
+		err = s.WritePublic("index.xml", y)
 		if err != nil {
 			return err
 		}
@@ -534,14 +513,7 @@
 		n.Url = helpers.Urlize("404.html")
 		n.Title = "404 Page not found"
 		n.Permalink = permalink(s, "404.html")
-		x, err := s.renderThing(n, "404.html")
-		if err != nil {
-			return err
-		}
-		err = s.WritePublic("404.html", x)
-		if err != nil {
-			return err
-		}
+		return s.render(n, "404.html", "_default/404.html", "404.html")
 	}
 
 	return nil
@@ -573,6 +545,19 @@
 		Data: make(map[string]interface{}),
 		Site: s.Info,
 	}
+}
+
+func (s *Site) render(d interface{}, layout, defaultLayout, out string) (err error) {
+	r, err := s.renderThingOrDefault(d, layout, defaultLayout)
+	if err != nil {
+		return err
+	}
+
+	err = s.WritePublic(out, r)
+	if err != nil {
+		return err
+	}
+	return
 }
 
 func (s *Site) renderThing(d interface{}, layout string) (*bytes.Buffer, error) {
--- a/hugolib/site_test.go
+++ b/hugolib/site_test.go
@@ -114,7 +114,11 @@
 	}
 }
 
-func TestrenderThingOrDefault(t *testing.T) {
+func HTML(in string) string {
+	return fmt.Sprintf("<html><head></head><body>%s</body></html>", in)
+}
+
+func TestRenderThingOrDefault(t *testing.T) {
 	tests := []struct {
 		content  string
 		missing  bool
@@ -121,13 +125,17 @@
 		template string
 		expected string
 	}{
-		{PAGE_SIMPLE_TITLE, true, TEMPLATE_TITLE, "simple template"},
-		{PAGE_SIMPLE_TITLE, true, TEMPLATE_FUNC, "simple-template"},
-		{PAGE_SIMPLE_TITLE, false, TEMPLATE_TITLE, "simple template"},
-		{PAGE_SIMPLE_TITLE, false, TEMPLATE_FUNC, "simple-template"},
+		{PAGE_SIMPLE_TITLE, true, TEMPLATE_TITLE, HTML("simple template")},
+		{PAGE_SIMPLE_TITLE, true, TEMPLATE_FUNC, HTML("simple-template")},
+		{PAGE_SIMPLE_TITLE, false, TEMPLATE_TITLE, HTML("simple template")},
+		{PAGE_SIMPLE_TITLE, false, TEMPLATE_FUNC, HTML("simple-template")},
 	}
 
-	s := new(Site)
+	files := make(map[string][]byte)
+	target := &target.InMemoryTarget{Files: files}
+	s := &Site{
+		Target: target,
+	}
 	s.prepTemplates()
 
 	for i, test := range tests {
@@ -141,12 +149,11 @@
 			t.Fatalf("Unable to add template")
 		}
 
-		var html *bytes.Buffer
 		var err2 error
 		if test.missing {
-			html, err2 = s.renderThingOrDefault(p, "missing", templateName)
+			err2 = s.render(p, "missing", templateName, "out")
 		} else {
-			html, err2 = s.renderThingOrDefault(p, templateName, "missing_default")
+			err2 = s.render(p, templateName, "missing_default", "out")
 		}
 
 		if err2 != nil {
@@ -153,8 +160,8 @@
 			t.Errorf("Unable to render html: %s", err)
 		}
 
-		if string(html.Bytes()) != test.expected {
-			t.Errorf("Content does not match.  Expected '%s', got '%s'", test.expected, html)
+		if string(files["out"]) != test.expected {
+			t.Errorf("Content does not match. Expected '%s', got '%s'", test.expected, files["out"])
 		}
 	}
 }