URI: 
       Allow non-markdown content in content directory - hugo - [fork] hugo port for 9front
  HTML git clone git@git.drkhsh.at/hugo.git
   DIR Log
   DIR Files
   DIR Refs
   DIR Submodules
   DIR README
   DIR LICENSE
       ---
   DIR commit 311e10222301d47422f970c460383879ad78f681
   DIR parent 5374242ff7b6cc1677baf9a1dd2b835d8ee6d18f
  HTML Author: Noah Campbell <noahcampbell@gmail.com>
       Date:   Wed, 18 Sep 2013 14:21:27 -0700
       
       Allow non-markdown content in content directory
       
       Allow content that is not markdown and does not need to be rendered to
       exists in the content directory.  Currently any valid html or xml
       document can exist.  Templates are applied to these documents as well.
       If you need to have content that doesn't have templates or AbsUrlify
       like operations, then continue to put this content in static and it will
       be copied over.
       
       Diffstat:
         M hugolib/page.go                     |      23 +++++++++++++++++++----
         M hugolib/page_test.go                |       6 +++---
         M hugolib/planner.go                  |       4 ++--
         M hugolib/site.go                     |      18 +++++++++++++++---
         M hugolib/site_test.go                |      59 ++++++++++++++++++++++++++++++-
       
       5 files changed, 97 insertions(+), 13 deletions(-)
       ---
   DIR diff --git a/hugolib/page.go b/hugolib/page.go
       @@ -90,8 +90,7 @@ func newPage(filename string) *Page {
                page := Page{contentType: "",
                        File:   File{FileName: filename, Extension: "html"},
                        Node:   Node{Keywords: make([]string, 10, 30)},
       -                Params: make(map[string]interface{}),
       -                Markup: "md"}
       +                Params: make(map[string]interface{})}
                page.Date, _ = time.Parse("20060102", "20080101")
                page.guessSection()
                return &page
       @@ -361,6 +360,18 @@ func (p *Page) ExecuteTemplate(layout string) *bytes.Buffer {
                return buffer
        }
        
       +func (page *Page) guessMarkupType() string {
       +        if page.Markup != "" {
       +                return page.Markup
       +        }
       +
       +        if strings.HasSuffix(page.FileName, ".md") {
       +                return "md"
       +        }
       +
       +        return "unknown"
       +}
       +
        func (page *Page) parse(reader io.Reader) error {
                p, err := parser.ReadFrom(reader)
                if err != nil {
       @@ -383,11 +394,15 @@ func (page *Page) parse(reader io.Reader) error {
                        }
                }
        
       -        switch page.Markup {
       -        case "md":
       +        switch page.guessMarkupType() {
       +        case "md", "markdown", "mdown":
                        page.convertMarkdown(bytes.NewReader(p.Content()))
                case "rst":
                        page.convertRestructuredText(bytes.NewReader(p.Content()))
       +        case "html":
       +                fallthrough
       +        default:
       +                page.Content = template.HTML(p.Content())
                }
                return nil
        }
   DIR diff --git a/hugolib/page_test.go b/hugolib/page_test.go
       @@ -170,7 +170,7 @@ func checkPageDate(t *testing.T, page *Page, time time.Time) {
        }
        
        func TestCreateNewPage(t *testing.T) {
       -        p, err := ReadFrom(strings.NewReader(SIMPLE_PAGE), "simple")
       +        p, err := ReadFrom(strings.NewReader(SIMPLE_PAGE), "simple.md")
                if err != nil {
                        t.Fatalf("Unable to create a page with frontmatter and body content: %s", err)
                }
       @@ -182,7 +182,7 @@ func TestCreateNewPage(t *testing.T) {
        }
        
        func TestPageWithDelimiter(t *testing.T) {
       -        p, err := ReadFrom(strings.NewReader(SIMPLE_PAGE_WITH_SUMMARY_DELIMITER), "simple")
       +        p, err := ReadFrom(strings.NewReader(SIMPLE_PAGE_WITH_SUMMARY_DELIMITER), "simple.md")
                if err != nil {
                        t.Fatalf("Unable to create a page with frontmatter and body content: %s", err)
                }
       @@ -195,7 +195,7 @@ func TestPageWithDelimiter(t *testing.T) {
        }
        
        func TestPageWithMoreTag(t *testing.T) {
       -        p, err := ReadFrom(strings.NewReader(SIMPLE_PAGE_WITH_SUMMARY_DELIMITER_SAME_LINE), "simple")
       +        p, err := ReadFrom(strings.NewReader(SIMPLE_PAGE_WITH_SUMMARY_DELIMITER_SAME_LINE), "simple.md")
                if err != nil {
                        t.Fatalf("Unable to create a page with frontmatter and body content: %s", err)
                }
   DIR diff --git a/hugolib/planner.go b/hugolib/planner.go
       @@ -18,8 +18,8 @@ func (s *Site) ShowPlan(out io.Writer) (err error) {
                                fmt.Fprintf(out, " (renderer: n/a)")
                        }
                        if s.Tmpl != nil {
       -                fmt.Fprintf(out, " (layout: %s, exists: %t)", p.Layout(), s.Tmpl.Lookup(p.Layout()) != nil)
       -        }
       +                        fmt.Fprintf(out, " (layout: %s, exists: %t)", p.Layout(), s.Tmpl.Lookup(p.Layout()) != nil)
       +                }
                        fmt.Fprintf(out, "\n")
                        fmt.Fprintf(out, " canonical => ")
                        if s.Target == nil {
   DIR diff --git a/hugolib/site.go b/hugolib/site.go
       @@ -286,7 +286,7 @@ func (s *Site) setUrlPath(p *Page) error {
                x := strings.Split(y, "/")
        
                if len(x) <= 1 {
       -                return fmt.Errorf("Zero length page name")
       +                return fmt.Errorf("Zero length page name.  filename: %s", y)
                }
        
                p.Section = strings.Trim(x[1], "/")
       @@ -400,9 +400,21 @@ func (s *Site) RenderAliases() error {
                return nil
        }
        
       -func (s *Site) RenderPages() error {
       +func (s *Site) RenderPages() (err error) {
                for _, p := range s.Pages {
       -                content, err := s.RenderThingOrDefault(p, p.Layout(), "_default/single.html")
       +                var layout string
       +
       +                if !p.IsRenderable() {
       +                        layout = "__" + p.FileName
       +                        _, err := s.Tmpl.New(layout).Parse(string(p.Content))
       +                        if err != nil {
       +                                return err
       +                        }
       +                } else {
       +                        layout = p.Layout()
       +                }
       +
       +                content, err := s.RenderThingOrDefault(p, layout, "_default/single.html")
                        if err != nil {
                                return err
                        }
   DIR diff --git a/hugolib/site_test.go b/hugolib/site_test.go
       @@ -188,6 +188,63 @@ func TestSetOutFile(t *testing.T) {
                }
        }
        
       +func TestSkipRender(t *testing.T) {
       +        files := make(map[string][]byte)
       +        target := &InMemoryTarget{files: files}
       +        sources := []byteSource{
       +                {"sect/doc1.html", []byte("---\nmarkup: markdown\n---\n# title\nsome *content*")},
       +                {"sect/doc2.html", []byte("<!doctype html><html><body>more content</body></html>")},
       +                {"sect/doc3.md", []byte("# doc3\n*some* content")},
       +                {"sect/doc4.md", []byte("---\ntitle: doc4\n---\n# doc4\n*some content*")},
       +                {"sect/doc5.html", []byte("<!doctype html><html>{{ template \"head\" }}<body>body5</body></html>")},
       +        }
       +
       +        s := &Site{
       +                Target: target,
       +                Config: Config{BaseUrl: "http://auth/bub/"},
       +                Source: &inMemorySource{sources},
       +        }
       +        s.initializeSiteInfo()
       +        s.prepTemplates()
       +
       +        must(s.addTemplate("_default/single.html", "{{.Content}}"))
       +        must(s.addTemplate("head", "<head><script src=\"script.js\"></script></head>"))
       +
       +        if err := s.CreatePages(); err != nil {
       +                t.Fatalf("Unable to create pages: %s", err)
       +        }
       +
       +        if err := s.BuildSiteMeta(); err != nil {
       +                t.Fatalf("Unable to build site metadata: %s", err)
       +        }
       +
       +        if err := s.RenderPages(); err != nil {
       +                t.Fatalf("Unable to render pages. %s", err)
       +        }
       +
       +        tests := []struct {
       +                doc      string
       +                expected string
       +        }{
       +                {"sect/doc1.html", "<html><head></head><body><h1>title</h1>\n\n<p>some <em>content</em></p>\n</body></html>"},
       +                {"sect/doc2.html", "<!DOCTYPE html><html><head></head><body>more content</body></html>"},
       +                {"sect/doc3.html", "<html><head></head><body><h1>doc3</h1>\n\n<p><em>some</em> content</p>\n</body></html>"},
       +                {"sect/doc4.html", "<html><head></head><body><h1>doc4</h1>\n\n<p><em>some content</em></p>\n</body></html>"},
       +                {"sect/doc5.html", "<!DOCTYPE html><html><head><script src=\"http://auth/bub/script.js\"></script></head><body>body5</body></html>"},
       +        }
       +
       +        for _, test := range tests {
       +                content, ok := target.files[test.doc]
       +                if !ok {
       +                        t.Fatalf("Did not find %s in target. %v", test.doc, target.files)
       +                }
       +
       +                if !bytes.Equal(content, []byte(test.expected)) {
       +                        t.Errorf("%s content expected:\n%q\ngot:\n%q", test.doc, test.expected, string(content))
       +                }
       +        }
       +}
       +
        func TestAbsUrlify(t *testing.T) {
                files := make(map[string][]byte)
                target := &InMemoryTarget{files: files}
       @@ -219,6 +276,6 @@ func TestAbsUrlify(t *testing.T) {
        
                expected := "<html><head></head><body><a href=\"http://auth/bub/foobar.jpg\">Going</a></body></html>"
                if string(content) != expected {
       -                t.Errorf("Expected: %q, got: %q", expected, string(content))
       +                t.Errorf("AbsUrlify content expected:\n%q\ngot\n%q", expected, string(content))
                }
        }