forked from jiaoge/sjet
-
Notifications
You must be signed in to change notification settings - Fork 0
/
sjet.go
128 lines (105 loc) · 2.91 KB
/
sjet.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
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
package sjet
import (
"bytes"
"net/http"
"strings"
"github.com/CloudyKit/jet/v6"
"github.com/gin-gonic/gin"
"github.com/shoppehub/sjet/context"
"github.com/shoppehub/sjet/engine"
"github.com/sirupsen/logrus"
"github.com/shoppehub/sjet/function"
)
var customFunc = make(map[string]CustomFunc)
// 创建文件路径的模板引擎
func CreateWithFile(dir string) *engine.TemplateEngine {
e := engine.CreateWithFile(dir)
function.InitGlobalFunc(e)
return e
}
// 创建内存存储的模板引擎
func CreateWithMem() *engine.TemplateEngine {
e := engine.CreateWithMem()
function.InitGlobalFunc(e)
return e
}
func RenderHTMLTemplate(eng *engine.TemplateEngine, c *gin.Context) {
templateContext := context.InitTemplateContext(eng, c)
err := templateContext.FindTemplate(eng)
if err != nil {
logrus.Error(gin.Mode(), err.Error())
if gin.Mode() == gin.ReleaseMode {
c.Redirect(http.StatusFound, "/error/404")
} else {
logrus.Debug("非 Release 环境,不自动跳转404")
c.JSON(http.StatusNotFound, gin.H{
"err": err.Error(),
})
}
return
}
for key, v := range customFunc {
templateContext.Vars.SetFunc(key, v(c))
}
defer func() { // 必须要先声明defer,否则不能捕获到panic异常
if err := recover(); err != nil {
if strings.HasPrefix(err.(string), "redirect::::") {
p := strings.ReplaceAll(err.(string), "redirect::::", "")
c.Redirect(302, p)
return
}
if strings.HasPrefix(err.(string), "exit::::") {
return
}
logrus.Error(err)
}
}()
buf := bytes.NewBufferString("")
err = templateContext.Template.Execute(buf, *templateContext.Vars, nil)
c.Status(200)
c.Header("Content-Type", "text/html; charset=utf-8")
if err != nil {
c.Writer.WriteString(err.Error())
return
}
c.Writer.Write(buf.Bytes())
}
func RenderMemTemplate(eng *engine.TemplateEngine, templateContext *context.TemplateContext, c *gin.Context, fnName string, fnTemplate string) (string, error) {
loader := *eng.Loader
if !loader.Exists(fnName) {
loader.Set("/"+fnName+".jet", fnTemplate)
}
view, err := eng.Views.GetTemplate(fnName)
// view, err := views.Parse(fnName, fun.Template)
if err != nil {
logrus.Error(err)
return "", err
}
for key, v := range customFunc {
templateContext.Vars.SetFunc(key, v(c))
}
defer func() { // 必须要先声明defer,否则不能捕获到panic异常
if err := recover(); err != nil {
if strings.HasPrefix(err.(string), "redirect::::") {
p := strings.ReplaceAll(err.(string), "redirect::::", "")
c.Redirect(302, p)
return
}
if strings.HasPrefix(err.(string), "exit::::") {
return
}
logrus.Error(err)
}
}()
var resp bytes.Buffer
err = view.Execute(&resp, *templateContext.Vars, nil)
if err != nil {
return "", err
}
return resp.String(), nil
}
type CustomFunc func(c *gin.Context) jet.Func
// 注册自定义的函数
func RegCustomFunc(funcName string, v CustomFunc) {
customFunc[funcName] = v
}