-
Notifications
You must be signed in to change notification settings - Fork 0
/
template.go
95 lines (90 loc) · 2.72 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
package builtin_libs
import (
htpl "html/template"
"io"
"strings"
ttpl "text/template"
. "github.com/zgg-lang/zgg-go/runtime"
)
var (
// templateLoaderClass ValueType
)
func libTemplate(c *Context) ValueObject {
rv := NewObject()
rv.SetMember("renderHtml", NewNativeFunction("template.renderHtml", func(c *Context, this Value, args []Value) Value {
var (
templateSrc ValueStr
params Value
writer Value
)
EnsureFuncParams(c, "template.renderHtml", args,
ArgRuleRequired("templateSrc", TypeStr, &templateSrc),
ArgRuleOptional("params", TypeAny, ¶ms, NewObject()),
ArgRuleOptional("writer", TypeGoValue, &writer, nil),
)
t, err := htpl.New("tpl").Parse(templateSrc.Value())
if err != nil {
c.RaiseRuntimeError("renderHtml: parse template error %s", err)
}
if writer != nil {
if w, ok := writer.ToGoValue().(io.Writer); ok {
if err := t.Execute(w, params.ToGoValue()); err != nil {
c.RaiseRuntimeError("renderHtml: execute template error %s", err)
}
} else {
c.RaiseRuntimeError("invalid writer %+v", writer.ToGoValue())
}
return Undefined()
} else {
var b strings.Builder
if err := t.Execute(&b, params.ToGoValue()); err != nil {
c.RaiseRuntimeError("renderHtml: execute template error %s", err)
}
return NewStr(b.String())
}
}), c)
rv.SetMember("renderText", NewNativeFunction("template.renderText", func(c *Context, this Value, args []Value) Value {
var (
templateSrc ValueStr
params Value
writer Value
)
EnsureFuncParams(c, "template.renderText", args,
ArgRuleRequired("templateSrc", TypeStr, &templateSrc),
ArgRuleOptional("params", TypeAny, ¶ms, NewObject()),
ArgRuleOptional("writer", TypeGoValue, &writer, nil),
)
t, err := ttpl.New("tpl").Parse(templateSrc.Value())
if err != nil {
c.RaiseRuntimeError("renderThml: parse template error %s", err)
}
if writer != nil {
if w, ok := writer.ToGoValue().(io.Writer); ok {
if err := t.Execute(w, params.ToGoValue()); err != nil {
c.RaiseRuntimeError("renderText: execute template error %s", err)
}
} else {
c.RaiseRuntimeError("invalid writer %+v", writer.ToGoValue())
}
return Undefined()
} else {
var b strings.Builder
if err := t.Execute(&b, params.ToGoValue()); err != nil {
c.RaiseRuntimeError("renderText: execute template error %s", err)
}
return NewStr(b.String())
}
}), c)
return rv
}
func init() {
// templateLoaderClass = NewClassBuilder("Loader").
// Constructor(func(c *Context, this ValueObject, args []Value) {
// var root ValueStr
// EnsureFuncParams(c, "template.Loader.__init__", args,
// ArgRuleRequired("root", TypeStr, &root),
// )
// this.SetMember
// }).
// Build()
}