diff options
author | Frédéric Guillot <fred@miniflux.net> | 2018-02-04 15:45:07 -0800 |
---|---|---|
committer | Frédéric Guillot <fred@miniflux.net> | 2018-02-04 15:45:07 -0800 |
commit | 3884a33b3623ee5166f8254a0919e65be9bfb49b (patch) | |
tree | 9155305707f4d834df03391fd4fc0e74ee998eb3 /template/engine.go | |
parent | b5b1930599190e2d7a6613db8779d9bbb970a1f7 (diff) |
Move template functions outside engine (refactoring)
Diffstat (limited to 'template/engine.go')
-rw-r--r-- | template/engine.go | 69 |
1 files changed, 69 insertions, 0 deletions
diff --git a/template/engine.go b/template/engine.go new file mode 100644 index 0000000..7d19c8f --- /dev/null +++ b/template/engine.go @@ -0,0 +1,69 @@ +// Copyright 2017 Frédéric Guillot. All rights reserved. +// Use of this source code is governed by the Apache 2.0 +// license that can be found in the LICENSE file. + +package template + +import ( + "bytes" + "html/template" + "io" + + "github.com/miniflux/miniflux/config" + "github.com/miniflux/miniflux/locale" + "github.com/miniflux/miniflux/logger" + + "github.com/gorilla/mux" +) + +// Engine handles the templating system. +type Engine struct { + templates map[string]*template.Template + translator *locale.Translator + funcMap *funcMap +} + +func (e *Engine) parseAll() { + commonTemplates := "" + for _, content := range templateCommonMap { + commonTemplates += content + } + + for name, content := range templateViewsMap { + logger.Debug("[Template] Parsing: %s", name) + e.templates[name] = template.Must(template.New("main").Funcs(e.funcMap.Map()).Parse(commonTemplates + content)) + } +} + +// SetLanguage change the language for template processing. +func (e *Engine) SetLanguage(language string) { + e.funcMap.Language = e.translator.GetLanguage(language) +} + +// Execute process a template. +func (e *Engine) Execute(w io.Writer, name string, data interface{}) { + tpl, ok := e.templates[name] + if !ok { + logger.Fatal("[Template] The template %s does not exists", name) + } + + var b bytes.Buffer + err := tpl.ExecuteTemplate(&b, "base", data) + if err != nil { + logger.Fatal("[Template] Unable to render template: %v", err) + } + + b.WriteTo(w) +} + +// NewEngine returns a new template engine. +func NewEngine(cfg *config.Config, router *mux.Router, translator *locale.Translator) *Engine { + tpl := &Engine{ + templates: make(map[string]*template.Template), + translator: translator, + funcMap: newFuncMap(cfg, router, translator.GetLanguage("en_US")), + } + + tpl.parseAll() + return tpl +} |