shithub: hugo

Download patch

ref: 1bb00b8c194266d5cf3e7497dd383fd43adff9c0
parent: 1de19926640ffc2baa43a9691b5d277a7f22cf49
author: Ross Lawley <[email protected]>
date: Tue Aug 27 06:09:50 EDT 2013

Refactored added RenderThingOrDefault and tests

Signed-off-by: Noah Campbell <[email protected]>

Conflicts:
	hugolib/site.go

--- a/hugolib/site.go
+++ b/hugolib/site.go
@@ -447,13 +447,9 @@
 
 func (s *Site) RenderPages() error {
 	for i, _ := range s.Pages {
-		content, err := s.RenderThing(s.Pages[i], s.Pages[i].Layout())
+		content, err := s.RenderThingOrDefault(s.Pages[i], s.Pages[i].Layout(), "_default/single.html")
 		if err != nil {
-			var err2 error
-			content, err2 = s.RenderThing(s.Pages[i], "_default/single.html")
-			if err2 != nil {
-				return err
-			}
+			return err
 		}
 		s.Pages[i].RenderedContent = content
 	}
@@ -549,11 +545,11 @@
 		n.Data["Pages"] = data
 		layout := "indexes/" + section + ".html"
 
-		x, err := s.RenderThing(n, layout)
+		content, err := s.RenderThingOrDefault(n, layout, "_default/index.html")
 		if err != nil {
 			return err
 		}
-		s.WritePublic(section+"/index.html", x.Bytes())
+		s.WritePublic(section+"/index.html", content.Bytes())
 
 		if a := s.Tmpl.Lookup("rss.xml"); a != nil {
 			// XML Feed
@@ -637,6 +633,18 @@
 	buffer := new(bytes.Buffer)
 	err := s.Tmpl.ExecuteTemplate(buffer, layout, d)
 	return buffer, err
+}
+
+func (s *Site) RenderThingOrDefault(d interface{}, layout string, defaultLayout string) (*bytes.Buffer, error) {
+	content, err := s.RenderThing(d, layout)
+	if err != nil {
+		var err2 error
+		content, err2 = s.RenderThing(d, defaultLayout)
+		if err2 == nil {
+			return content, err2
+		}
+	}
+	return content, err
 }
 
 func (s *Site) NewXMLBuffer() *bytes.Buffer {
--- a/hugolib/site_test.go
+++ b/hugolib/site_test.go
@@ -2,6 +2,7 @@
 
 import (
 	"fmt"
+	"bytes"
 	"strings"
 	"testing"
 )
@@ -104,8 +105,8 @@
 			t.Fatalf("Unable to add template")
 		}
 
-		html, err := s.RenderThing(p, templateName)
-		if err != nil {
+		html, err2 := s.RenderThing(p, templateName)
+		if err2 != nil {
 			t.Errorf("Unable to render html: %s", err)
 		}
 
@@ -114,3 +115,47 @@
 		}
 	}
 }
+
+func TestRenderThingOrDefault(t *testing.T) {
+	tests := []struct {
+		content  string
+		missing  bool
+		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"},
+	}
+
+	s := new(Site)
+	s.prepTemplates()
+
+	for i, test := range tests {
+		p, err := ReadFrom(strings.NewReader(PAGE_SIMPLE_TITLE), "content/a/file.md")
+		if err != nil {
+			t.Fatalf("Error parsing buffer: %s", err)
+		}
+		templateName := fmt.Sprintf("default%d", i)
+		err = s.addTemplate(templateName, test.template)
+		if err != nil {
+			t.Fatalf("Unable to add template")
+		}
+
+		var html *bytes.Buffer
+		var err2 error
+		if test.missing {
+			html, err2 = s.RenderThingOrDefault(p, "missing", templateName)
+		} else {
+			html, err2 = s.RenderThingOrDefault(p, templateName, "missing_default")
+		}
+
+		if err2 != nil {
+			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)
+		}
+	}}