Jet模板引擎全局函数和高级定制

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提供了一些方法,允许你进行扩展。使用这些功能可以提供模板的渲染性能。

下面通过实例来演示每一种用法。

快速函数

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" }}