Add support for directory structured templates
This commit is contained in:
parent
6a63c7cc76
commit
7ed387dee5
59
server.go
59
server.go
|
@ -5,6 +5,8 @@ import (
|
||||||
"net/http"
|
"net/http"
|
||||||
"os"
|
"os"
|
||||||
"path"
|
"path"
|
||||||
|
"fmt"
|
||||||
|
"io/ioutil"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
@ -65,15 +67,67 @@ func (s *Server) wrapper(handle func(c *Context)) http.HandlerFunc {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// This is a bit different then the standard template.parseFiles code in that it gives us hiarchial templates
|
||||||
|
// header.html
|
||||||
|
// mydirectory/service.html ...
|
||||||
|
func (s *Server) parseTemplates(t *template.Template, filenames ...string) (*template.Template, error) {
|
||||||
|
//if err := t.checkCanParse(); err != nil {
|
||||||
|
// return nil, err
|
||||||
|
//}
|
||||||
|
|
||||||
|
if len(filenames) == 0 {
|
||||||
|
// Not really a problem, but be consistent.
|
||||||
|
return nil, fmt.Errorf("html/template: no files named in call to ParseFiles")
|
||||||
|
}
|
||||||
|
for _, filename := range filenames {
|
||||||
|
b, err := ioutil.ReadFile(filename)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
data := string(b)
|
||||||
|
name := strings.TrimPrefix(filename, s.templates+"/")
|
||||||
|
log.Println("Template:", name)
|
||||||
|
|
||||||
|
// First template becomes return value if not already defined,
|
||||||
|
// and we use that one for subsequent New calls to associate
|
||||||
|
// all the templates together. Also, if this file has the same name
|
||||||
|
// as t, this file becomes the contents of t, so
|
||||||
|
// t, err := New(name).Funcs(xxx).ParseFiles(name)
|
||||||
|
// works. Otherwise we create a new template associated with t.
|
||||||
|
var tmpl *template.Template
|
||||||
|
if t == nil {
|
||||||
|
t = template.New(name)
|
||||||
|
}
|
||||||
|
if name == t.Name() {
|
||||||
|
tmpl = t
|
||||||
|
} else {
|
||||||
|
tmpl = t.New(name)
|
||||||
|
}
|
||||||
|
_, err = tmpl.Parse(data)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return t, nil
|
||||||
|
}
|
||||||
|
|
||||||
func (s *Server) loadTemplates() *template.Template {
|
func (s *Server) loadTemplates() *template.Template {
|
||||||
tmpl := template.New("")
|
tmpl := template.New("")
|
||||||
|
|
||||||
err := filepath.Walk(path.Join(s.path, s.templates), func(path string, info os.FileInfo, err error) error {
|
err := filepath.Walk(path.Join(s.path, s.templates), func(path string, info os.FileInfo, err error) error {
|
||||||
if strings.Contains(path, ".html") {
|
if strings.Contains(path, ".html") {
|
||||||
|
_,err := s.parseTemplates(tmpl, path)
|
||||||
|
if err != nil {
|
||||||
|
log.Println(err)
|
||||||
|
}
|
||||||
|
/*
|
||||||
_, err = tmpl.ParseFiles(path)
|
_, err = tmpl.ParseFiles(path)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Println(err)
|
log.Println(err)
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
}
|
}
|
||||||
return err
|
return err
|
||||||
})
|
})
|
||||||
|
@ -97,7 +151,10 @@ func (s *Server) getTemplates() *template.Template {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *Server) render(w http.ResponseWriter, tmpl string, content interface{}) {
|
func (s *Server) render(w http.ResponseWriter, tmpl string, content interface{}) {
|
||||||
s.getTemplates().ExecuteTemplate(w, tmpl, content)
|
err := s.getTemplates().ExecuteTemplate(w, tmpl, content)
|
||||||
|
if err != nil {
|
||||||
|
log.Warn(err)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *Server) reply(w http.ResponseWriter, msg string) {
|
func (s *Server) reply(w http.ResponseWriter, msg string) {
|
||||||
|
|
Loading…
Reference in New Issue