From 18f2ffaaa95077a0199a298a4c712b91293e7f01 Mon Sep 17 00:00:00 2001 From: William Petit Date: Fri, 24 Jan 2020 13:09:16 +0100 Subject: [PATCH] template: add layout loading API --- go.mod | 1 + template/html/provider.go | 2 +- template/html/service.go | 54 +++++++++++++++++++++++++++++---------- 3 files changed, 43 insertions(+), 14 deletions(-) diff --git a/go.mod b/go.mod index 8cae12c..3eba97c 100644 --- a/go.mod +++ b/go.mod @@ -3,6 +3,7 @@ module gitlab.com/wpetit/goweb go 1.12 require ( + github.com/davecgh/go-spew v1.1.0 github.com/go-chi/chi v4.0.2+incompatible github.com/go-playground/locales v0.12.1 // indirect github.com/go-playground/universal-translator v0.16.0 // indirect diff --git a/template/html/provider.go b/template/html/provider.go index 1329fde..92263a3 100644 --- a/template/html/provider.go +++ b/template/html/provider.go @@ -6,7 +6,7 @@ import "gitlab.com/wpetit/goweb/service" // the HTML template service implementation func ServiceProvider(templateDir string, funcs ...OptionFunc) service.Provider { templateService := NewTemplateService(funcs...) - err := templateService.LoadTemplates(templateDir) + err := templateService.LoadTemplatesDir(templateDir) return func(container *service.Container) (interface{}, error) { if err != nil { return nil, err diff --git a/template/html/service.go b/template/html/service.go index 71b7211..cc05848 100644 --- a/template/html/service.go +++ b/template/html/service.go @@ -3,6 +3,7 @@ package html import ( "fmt" "html/template" + "io/ioutil" "net/http" "path/filepath" @@ -16,35 +17,62 @@ type TemplateService struct { helpers template.FuncMap } -// LoadTemplates loads the templates used by the service -func (t *TemplateService) LoadTemplates(templatesDir string) error { +func (t *TemplateService) LoadLayout(name string, layout string, blocks []string) error { + tmpl := template.New(name) + tmpl.Funcs(t.helpers) - layouts, err := filepath.Glob(filepath.Join(templatesDir, "layouts", "*.tmpl")) + for _, b := range blocks { + if _, err := tmpl.Parse(b); err != nil { + return err + } + } + + tmpl, err := tmpl.Parse(layout) if err != nil { return err } - blocks, err := filepath.Glob(filepath.Join(templatesDir, "blocks", "*.tmpl")) + t.templates[name] = tmpl + + return nil +} + +// LoadTemplatesDir loads the templates used by the service +func (t *TemplateService) LoadTemplatesDir(templatesDir string) error { + + layoutFiles, err := filepath.Glob(filepath.Join(templatesDir, "layouts", "*.tmpl")) if err != nil { return err } - // Generate our templates map from our layouts/ and blocks/ directories - for _, layout := range layouts { + blockFiles, err := filepath.Glob(filepath.Join(templatesDir, "blocks", "*.tmpl")) + if err != nil { + return err + } - var err error - files := append(blocks, layout) + blockTemplates := make([]string, 0, len(blockFiles)) - tmpl := template.New("") - tmpl.Funcs(t.helpers) - - tmpl, err = tmpl.ParseFiles(files...) + for _, f := range blockFiles { + templateData, err := ioutil.ReadFile(f) if err != nil { return err } - t.templates[filepath.Base(layout)] = tmpl + blockTemplates = append(blockTemplates, string(templateData)) + } + // Generate our templates map from our layouts/ and blocks/ directories + for _, f := range layoutFiles { + templateData, err := ioutil.ReadFile(f) + if err != nil { + return err + } + + templateName := filepath.Base(f) + + if err := t.LoadLayout(templateName, string(templateData), blockTemplates); err != nil { + return err + } } return nil