aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMax Resnick <max@ofmax.li>2020-05-25 10:37:10 -0700
committerMax Resnick <max@ofmax.li>2020-05-25 10:37:10 -0700
commit4f306b947658694655e26f7dec3929ee6634d5f5 (patch)
treef286aaebd3cff05714d91f73caab7b8c1903e6cf
parent5037e703efbb709620faa5cc5b2c0eea8d5bb569 (diff)
downloadtmpl-4f306b947658694655e26f7dec3929ee6634d5f5.tar.gz
adds tmpl packagev0.0.1
-rw-r--r--main.go86
1 files changed, 86 insertions, 0 deletions
diff --git a/main.go b/main.go
new file mode 100644
index 0000000..0753321
--- /dev/null
+++ b/main.go
@@ -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
+}