A闪的 BLOG 技术与人文
Jet提供了一些全局函数,你可以在任意模板中使用它们。
{{ lower("TEST") }} <!-- outputs "test" -->
你也可以使用管道的方式调用。
{{ "test"|upper|trimSpace }} <!-- outputs "TEST" -->
isset()
{{ isset(.Title) ? .Title : "Title not set" }}
它还可以用于检查密钥是否存在。
{{isset(.["non_existant_key"]) ? "key does exist" : "key does not exist"}}
<!-- will print "key does not exist" -->
len()
计算array, channel, slice, map,和字符串的长度,如果作用在struct上,则返回字段数。
**来自golang中 strings 包的函数
escape helper
创建map
高级扩展
Jet提供了一些方法,允许你进行扩展。使用这些功能可以提供模板的渲染性能。
func(jet.Arguments) reflect.Value
实现jet.Ranger
定制迭代器jet.Renderer
定时渲染器func(io.Writer, []byte)
注入SafeWriter函数,实现字符转义。下面通过实例来演示每一种用法。
快速函数
var views = jet.NewHTMLSet("./views")
views.AddGlobalFunc("base64", func(a jet.Arguments) reflect.Value {
a.RequireNumOfArguments("base64", 1, 1)
buffer := bytes.NewBuffer(nil)
fmt.Fprint(buffer, a.Get(0))
return reflect.ValueOf(base64.URLEncoding.EncodeToString(buffer.Bytes()))
})
你应该告诉Jet当前函数需要多少个参数,如果在模板中使用不正确,它抛出一个Error。也可以通过Get
方法传入索引来获取参数。
自定义渲染器
type tTODO struct {
Text string
Done bool
}
// Render implements jet.Renderer interface
func (t *tTODO) Render(r *jet.Runtime) {
done := "yes"
if !t.Done {
done = "no"
}
r.Write([]byte(fmt.Sprintf("TODO: %s (done: %s)", t.Text, done)))
}
自定义迭代器
在github代码仓中有相关示例。
自定义SafeWriter
当使用自Jet自定义转义是,实例化jet.Set
是传递给SafeWrite函数。使用jet.NewHTMLSet("your/views/directory")
时,默认调用的为Go标注库中的template.HTMLEscape
函数。如果你关闭该功能,可以使用下面方法。
func RawWriter(w io.Writer, b []byte) {
w.Write(b)
}
var views = jet.NewSet(jet.SafeWriter(RawWriter), "./views")
使用转义功能的另外一个用处是做为过滤使用。
var views = jet.NewHTMLSet("./views")
views.AddGlobal("specialEscape", jet.SafeWriter(func(w io.Writer, b []byte) {
// special escape handling
// then write your bytes into the writer:
w.Write(b)
}))
使用你自己的模板过滤器
{{ "funky user-generated content in need of escaping"|specialEscape }}
{{ specialEscape: "funky user-generated content in need of escaping" }}