diff --git a/hugolib/site.go b/hugolib/site.go index 5c8cfe4f8..d6e6368c6 100644 --- a/hugolib/site.go +++ b/hugolib/site.go @@ -447,13 +447,9 @@ func (s *Site) RenderAliases() error { 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 @@ func (s *Site) RenderLists() error { 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 @@ -639,6 +635,18 @@ func (s *Site) RenderThing(d interface{}, layout string) (*bytes.Buffer, error) 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 { header := "\n" return bytes.NewBufferString(header) diff --git a/hugolib/site_test.go b/hugolib/site_test.go index eea725c8f..984b1545f 100644 --- a/hugolib/site_test.go +++ b/hugolib/site_test.go @@ -2,6 +2,7 @@ package hugolib import ( "fmt" + "bytes" "strings" "testing" ) @@ -104,8 +105,8 @@ func TestRenderThing(t *testing.T) { 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 TestRenderThing(t *testing.T) { } } } + +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) + } + }}