/
tmpl.go
100 lines (86 loc) · 1.96 KB
/
tmpl.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
package tmpl
import (
"embed"
"errors"
"fmt"
"net/url"
"strings"
"text/template"
"time"
)
//go:embed tmpls/*
var fs embed.FS
var embedTemplates map[string]*template.Template
var customTemplates map[string]*template.Template
var funcMap template.FuncMap
func init() {
// func
funcMap = template.FuncMap{
"date": func(dt time.Time, zone string) string {
loc, err := time.LoadLocation(zone)
if err != nil {
return err.Error()
}
dt = dt.In(loc)
return dt.Format("2006-01-02 15:04:05")
},
"isNonZeroDate": func(dt time.Time) bool {
return !(dt == time.Time{})
},
"in": func(m map[string]string, key string) bool {
_, ok := m[key]
return ok
},
"toUpper": strings.ToUpper,
"toLink": func(s string) string {
return fmt.Sprintf("[%s](%s)", s, s)
},
"displayKV": func(k, v string) string {
_, err := url.ParseRequestURI(v)
if err != nil {
return fmt.Sprintf("%s:%s", k, v)
}
return fmt.Sprintf("[%s](%s)", k, v)
},
"contains": strings.Contains,
}
// embed
dir, err := fs.ReadDir("tmpls")
if err != nil {
panic(err)
}
embedTemplates = make(map[string]*template.Template)
for _, entry := range dir {
if entry.IsDir() {
continue
}
filename := entry.Name()
if !strings.HasSuffix(filename, ".tmpl") {
continue
}
t, err := template.New(filename).Funcs(funcMap).ParseFS(fs, "tmpls/"+filename)
if err != nil {
panic(err)
}
embedTemplates[t.Name()] = t
}
// custom
customTemplates = make(map[string]*template.Template)
}
func GetEmbedTemplate(filename string) (*template.Template, error) {
if t, ok := embedTemplates[filename]; ok {
return t, nil
}
return nil, errors.New("template not found")
}
func GetCustomTemplate(filename string) (*template.Template, error) {
if t, ok := customTemplates[filename]; ok {
return t, nil
}
t, err := template.New(filename).Funcs(funcMap).ParseFiles(filename)
if err != nil {
return nil, err
}
customTemplates[filename] = t
return t, nil
}