forked from devfeel/dotweb
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathrender.go
More file actions
101 lines (90 loc) · 2.59 KB
/
render.go
File metadata and controls
101 lines (90 loc) · 2.59 KB
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
package dotweb
import (
"errors"
"github.com/devfeel/dotweb/framework/file"
"html/template"
"io"
"io/ioutil"
"path/filepath"
)
// Renderer is the interface that wraps the render method.
type Renderer interface {
//set default template path, support multi path
//模板查找顺序从最后一个插入的元素开始往前找
//默认添加base、base/templates、base/views
SetTemplatePath(path ...string)
Render(io.Writer, string, interface{}, Context) error
}
type innerRenderer struct {
templatePaths []string
}
// Render render view use http/template
func (r *innerRenderer) Render(w io.Writer, tpl string, data interface{}, ctx Context) error {
t, err := r.parseFile(tpl)
if err != nil {
return err
}
return t.Execute(w, data)
}
// SetTemplatePath set default template paths, support multi path
// 模板查找顺序从最后一个插入的元素开始往前找
// 默认添加base、base/templates、base/views
func (r *innerRenderer) SetTemplatePath(path ...string) {
r.templatePaths = append(r.templatePaths, path...)
}
// 定义函数unescaped
func unescaped(x string) interface{} { return template.HTML(x) }
// return http/template by gived file name
func (r *innerRenderer) parseFile(filename string) (*template.Template, error) {
var t *template.Template
findlog := filename
realTempFile := filename
isExist := false
//多级检查
if !file.Exist(filename) {
tmpFileName := filename
for i := len(r.templatePaths) - 1; i >= 0; i-- {
tmpFileName = r.templatePaths[i] + "/" + filename
findlog += "\r\n" + tmpFileName
if file.Exist(tmpFileName) {
realTempFile = tmpFileName
isExist = true
break
}
}
} else {
isExist = true
}
if !isExist {
return nil, errors.New("not found template file=>\r\n " + findlog)
}
b, err := ioutil.ReadFile(realTempFile)
if err != nil {
return nil, err
}
s := string(b)
name := filepath.Base(realTempFile)
t = template.New(name)
t = registeTemplateFunc(t)
_, err = t.Parse(s)
if err != nil {
return nil, err
}
return t, nil
}
// registeTemplateFunc registe default support funcs
func registeTemplateFunc(t *template.Template) *template.Template {
return t.Funcs(template.FuncMap{"unescaped": unescaped})
//TODO:add more func
}
// NewInnerRenderer create a inner renderer instance
func NewInnerRenderer() *innerRenderer {
r := new(innerRenderer)
r.templatePaths = make([]string, 3)
//添加基础路径
//base、base/templates、base/views
r.templatePaths[0] = file.GetCurrentDirectory()
r.templatePaths[1] = file.GetCurrentDirectory() + "/templates"
r.templatePaths[2] = file.GetCurrentDirectory() + "/views"
return r
}