-
Notifications
You must be signed in to change notification settings - Fork 6
/
ext.clj
53 lines (42 loc) · 1.65 KB
/
ext.clj
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
(ns hbs.ext
(:use [hbs.core :only [*hbs*]])
(:import [com.github.jknack.handlebars Handlebars Helper Options])
(:import [java.util Date])
(:import [java.text SimpleDateFormat MessageFormat]))
(defmacro defhelper [name argvec & body]
(let [argvec (into [] (concat [(gensym)] argvec))]
`(.registerHelper ^Handlebars *hbs*
~(str name)
(reify Helper
(^CharSequence apply ~argvec ~@body)))))
(defhelper ifequals [^Object ctx ^Options options]
(if (= ctx (.hash options "compare"))
(.fn options ctx)
(.inverse options ctx)))
(defhelper ifgreater [^Object ctx ^Options options]
(if (> ctx (.hash options "compare"))
(.fn options ctx)
(.inverse options ctx)))
(defhelper ifless [^Object ctx ^Options options]
(if (< ctx (.hash options "compare"))
(.fn options ctx)
(.inverse options ctx)))
(defhelper ifcontains [^Object ctx ^Options options]
(if (or (contains? ctx (.hash options "item"))
(contains? ctx (keyword (.hash options "item"))))
(.fn options ctx)
(.inverse options ctx)))
(defhelper uppercase [^Object ctx ^Options options]
(clojure.string/upper-case ctx))
(defhelper lowercase [^Object ctx ^Options options]
(clojure.string/lower-case ctx))
(defhelper or [^Object ctx ^Options options]
(str (or ctx (.param options 0))))
(defhelper count [^Object ctx ^Options options]
(str (count ctx)))
(defhelper format-date [^Object ctx ^Options options]
(let [formatter (SimpleDateFormat. (.hash options "pattern"))]
(.format ^SimpleDateFormat formatter ^Date ctx)))
(defhelper format [^Object ctx ^Options options]
(let [pattern (.hash options "pattern")]
(format pattern ctx)))