diff --git a/config.go b/config.go index 042f84d..942be93 100644 --- a/config.go +++ b/config.go @@ -5,7 +5,6 @@ import ( "os" "path" "strings" - "text/template" "github.com/BurntSushi/toml" ) @@ -60,7 +59,7 @@ func (c *Config) LoadTemplates(path string) error { // Load templates c.Templates = NewTemplates() - c.Templates.Funcs(template.FuncMap{ + c.Templates.Funcs(map[string]interface{}{ "site": func() Site { return Site{ Title: c.Title, diff --git a/templates.go b/templates.go index 35480cf..9b46c3b 100644 --- a/templates.go +++ b/templates.go @@ -1,6 +1,8 @@ package main import ( + htemplate "html/template" + "io" "io/ioutil" "os" pathpkg "path" @@ -9,22 +11,27 @@ import ( "text/template" ) +// Template represents a template. +type Template interface { + Execute(io.Writer, interface{}) error +} + // Templates contains site templates. type Templates struct { - tmpls map[string]*template.Template - funcs template.FuncMap + tmpls map[string]Template + funcs map[string]interface{} } // NewTemplates returns a new Templates with the default templates. func NewTemplates() *Templates { t := &Templates{ - tmpls: map[string]*template.Template{}, + tmpls: map[string]Template{}, } return t } // Funcs sets the functions available to newly created templates. -func (t *Templates) Funcs(funcs template.FuncMap) { +func (t *Templates) Funcs(funcs map[string]interface{}) { t.funcs = funcs } @@ -36,6 +43,13 @@ func (t *Templates) LoadTemplate(path string, content []byte) { t.tmpls[path] = tmpl } +func (t *Templates) LoadHTMLTemplate(path string, content []byte) { + tmpl := htemplate.New(path) + tmpl.Funcs(htemplate.FuncMap(t.funcs)) + htemplate.Must(tmpl.Parse(string(content))) + t.tmpls[path] = tmpl +} + // Load loads templates from the provided directory func (t *Templates) Load(dir string) error { return filepath.Walk(dir, func(path string, info os.FileInfo, err error) error { @@ -49,14 +63,18 @@ func (t *Templates) Load(dir string) error { } // Remove directory from beginning of path path = strings.TrimPrefix(path, dir) - t.LoadTemplate(path, b) + if pathpkg.Ext(path) == ".html" { + t.LoadHTMLTemplate(path, b) + } else { + t.LoadTemplate(path, b) + } } return nil }) } // FindTemplate returns the template for the given path. -func (t *Templates) FindTemplate(path string, tmpl string) (*template.Template, bool) { +func (t *Templates) FindTemplate(path string, tmpl string) (Template, bool) { tmplPath := pathpkg.Join(path, tmpl) if t, ok := t.tmpls[tmplPath]; ok { return t, true @@ -69,7 +87,7 @@ func (t *Templates) FindTemplate(path string, tmpl string) (*template.Template, } // FindPartial returns the partial template of the given name. -func (t *Templates) FindPartial(name string) (*template.Template, bool) { +func (t *Templates) FindPartial(name string) (Template, bool) { if t, ok := t.tmpls[pathpkg.Join("/_partials", name)]; ok { return t, true }