diff options
| author | Max Resnick <max@ofmax.li> | 2020-05-25 10:37:10 -0700 |
|---|---|---|
| committer | Max Resnick <max@ofmax.li> | 2020-05-25 10:37:10 -0700 |
| commit | 4f306b947658694655e26f7dec3929ee6634d5f5 (patch) | |
| tree | f286aaebd3cff05714d91f73caab7b8c1903e6cf | |
| parent | 5037e703efbb709620faa5cc5b2c0eea8d5bb569 (diff) | |
| download | tmpl-4f306b947658694655e26f7dec3929ee6634d5f5.tar.gz | |
adds tmpl packagev0.0.1
| -rw-r--r-- | main.go | 86 |
1 files changed, 86 insertions, 0 deletions
@@ -0,0 +1,86 @@ +package tmpl + +import ( + "html/template" + "log" + "net/http" + "os" + "path" +) + +// Bundle map of templates +type Bundle map[string]*template.Template + +// Tmpl template renderer +type Tmpl interface { + GetTemplate(name string) *template.Template + Render(w http.ResponseWriter, templateName string, data interface{}) error +} + +// HTML rendering bundle +type HTML struct { + bundle Bundle +} + +// NewHTMLTmpl load a bundle +func NewHTMLTmpl(basePath string) (*HTML, error) { + print(basePath) + b, err := loadTemplates(basePath) + if err != nil { + return nil, err + } + return &HTML{ + b, + }, err +} + +func loadTemplates(basePath string) (Bundle, error) { + templates := make(Bundle) + baseTmplPath := path.Join(basePath, "parts", "_layout.tmpl") + baseTemplate := template.New("base") + baseTemplate, err := baseTemplate.ParseFiles(baseTmplPath) + if err != nil { + log.Fatal(err) + return nil, err + } + partsPath := path.Join(basePath, "pages") + partsDir, err := os.Open(partsPath) + if err != nil { + log.Fatal(err) + return nil, err + } + parts, err := partsDir.Readdir(-1) + if err != nil { + log.Fatal(err) + return nil, err + } + + for _, part := range parts { + t, err := baseTemplate.Clone() + if err != nil { + log.Fatal(err) + return nil, err + } + templates[part.Name()] = template.Must( + t.ParseFiles(path.Join(partsPath, part.Name()))) + } + return templates, nil +} + +// GetTemplate load template by name +func (b *HTML) GetTemplate(name string) *template.Template { + return b.bundle[name] +} + +// Render render templates +func (b *HTML) Render(w http.ResponseWriter, + templateName string, + data interface{}) error { + + tpl := b.GetTemplate(templateName) + err := tpl.ExecuteTemplate(w, "base", data) + if err != nil { + return err + } + return nil +} |