/
pongo.go
60 lines (52 loc) · 1.28 KB
/
pongo.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
package template
import (
"bytes"
"errors"
"fmt"
"github.com/flosch/pongo2"
"github.com/labstack/echo"
"io"
"path/filepath"
)
type pongoRenderer struct {
templates *pongo2.TemplateSet
}
func (t *pongoRenderer) Render(w io.Writer, name string, data interface{}, c echo.Context) error {
tmpl, err := t.templates.FromCache(name)
if err != nil {
return err
}
d, ok := data.(map[string]interface{})
if !ok {
return errors.New("Incorrect data format. Should be map[string]interface{}")
}
return tmpl.ExecuteWriter(pongo2.Context(d), w)
}
type pongoLoaderProxy struct {
files []File
}
func (p *pongoLoaderProxy) Abs(base, name string) string {
if filepath.IsAbs(name) || base == "" {
return name
}
if name == "" {
return base
}
return filepath.Clean(filepath.Dir(base) + string(filepath.Separator) + name)
}
func (p *pongoLoaderProxy) Get(path string) (io.Reader, error) {
for _, f := range p.files {
if f.Name == path {
return bytes.NewReader(f.Content), nil
}
}
return nil, errors.New(fmt.Sprintf("%s template not found", path))
}
// Pongo returns pongo2 renderer
func Pongo(loader Loader) echo.Renderer {
files, err := loader.Load()
if err != nil {
panic(err.Error())
}
return &pongoRenderer{templates: pongo2.NewSet("templates", &pongoLoaderProxy{files: files})}
}