forked from readdig/her
/
template.go
104 lines (95 loc) · 2.3 KB
/
template.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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
package her
import (
"html/template"
"io/ioutil"
"log"
"os"
"path/filepath"
"strings"
"time"
)
type TemplateFunc struct {
}
var (
funcMap = make(template.FuncMap)
templates *template.Template
)
func newTemplateFunc() *TemplateFunc {
return &TemplateFunc{}
}
func (t *TemplateFunc) FuncMap(tmplFunc map[string]interface{}) {
if len(tmplFunc) > 0 {
for k, v := range tmplFunc {
funcMap[k] = v
}
}
}
func loadTemplate() *template.Template {
templatePath := Config.String("TemplatePath")
if templatePath == "" {
return nil
}
for k, v := range templateFuncMap() {
funcMap[k] = v
}
t, err := buildTemplate(templatePath, funcMap)
if err != nil {
log.Printf("Can't read template file %v,", err)
}
return t
}
func templateFuncMap() template.FuncMap {
return template.FuncMap{
"set": func(renderArgs map[string]interface{}, key string, value interface{}) template.HTML {
renderArgs[key] = value
return template.HTML("")
},
"append": func(renderArgs map[string]interface{}, key string, value interface{}) template.HTML {
if renderArgs[key] == nil {
renderArgs[key] = []interface{}{value}
} else {
renderArgs[key] = append(renderArgs[key].([]interface{}), value)
}
return template.HTML("")
},
// Replaces newlines with <br>
"nl2br": func(text string) template.HTML {
return template.HTML(strings.Replace(template.HTMLEscapeString(text), "\n", "<br>", -1))
},
// Skips sanitation on the parameter. Do not use with dynamic data.
"raw": func(text string) template.HTML {
return template.HTML(text)
},
"datetime": func(date time.Time, format string) string {
return date.Format(format)
},
}
}
func buildTemplate(dir string, funcMap template.FuncMap) (*template.Template, error) {
var t *template.Template
return t, filepath.Walk(dir, func(path string, info os.FileInfo, err error) error {
if !info.IsDir() {
filetext, err := ioutil.ReadFile(path)
if err != nil {
return err
}
text := string(filetext)
name := path[len(dir)+1:]
name = strings.Replace(name, `\`, `/`, -1)
var tmpl *template.Template
if t == nil {
t = template.New(name)
}
if name == t.Name() {
tmpl = t
} else {
tmpl = t.New(name)
}
_, err = tmpl.Funcs(funcMap).Parse(text)
if err != nil {
return err
}
}
return nil
})
}