Revel でテンプレートで使う関数を追加する

revel では最初から eq や append など便利な関数があるけど自分でも作ったものを使いたいよねということで調べてみた.一応成功例はあるけど詳しく調べてないので正しい方法かどうかはよくわからない.

ドキュメントを読んだ限りだと書いてないっぽいのでコード読んでみる. revel でテンプレートの関数を定義している部分.

(追記 書いてあった

template.go
 39 var (
 40         // The functions available for use in the templates.
 41         TemplateFuncs = map[string]interface{}{
 42                 "url": ReverseUrl,
 43                 "eq":  Equal,
...

定義した関数を使っているところ.

template.go
164 func (loader *TemplateLoader) Refresh() *Error {
...
227                                         templateSet = template.New(templateName).Funcs(TemplateFuncs)

自分でテンプレートの関数を定義して Revel 上で使いたい場合はおそらくここの TemplateFuncs に新しく追加すればよさそう. 追加のタイミングとしては var が呼び出されてから Refresh が呼び出されるまでの間のどこか. とりあえず init() を使ってみたら成功した.

コントローラ側

func init() {
        revel.TemplateFuncs["li"] = func(value string) template.HTML {
                return template.HTML("<li>" + value + "</li>")
        }
}

ビュー側

{{li "test"}}

出力

<li>value</li>

init() 使う場合で成功する理由はあまり良くわかってないので何らかの場合で不具合が発生するかもしれない.