From bd6b5962cb981a0593277d3b286d50fa441134c4 Mon Sep 17 00:00:00 2001 From: gered Date: Tue, 4 Mar 2014 12:10:43 -0500 Subject: [PATCH] add support for template function aliases --- src/clj_jtwig/functions.clj | 28 ++++++++++++++++++++++------ 1 file changed, 22 insertions(+), 6 deletions(-) diff --git a/src/clj_jtwig/functions.clj b/src/clj_jtwig/functions.clj index ccc78d4..42d9ac0 100644 --- a/src/clj_jtwig/functions.clj +++ b/src/clj_jtwig/functions.clj @@ -25,25 +25,41 @@ (catch FunctionNotFoundException ex false))) +(defn- make-aliases-array [aliases] + (let [n (count aliases) + array (make-array String n)] + (doseq [index (range n)] + (aset array index (nth aliases index))) + array)) + (defn add-function! "adds a new template function using the name specified. templates can call the function by the - name specified and passing in the same number of arguments accepted by f. the return value of - f is returned to the template. + name specified (or one of the aliases specified) and passing in the same number of arguments + accepted by f. the return value of f is returned to the template. if this function has no aliases + then nil can be specified for the aliases arg. prefer to use the 'deftwigfn' macro when possible." - [name f] + [name aliases f] (let [handler (reify JtwigFunction (execute [_ arguments] (try (clojure->java (apply f (map java->clojure arguments))) (catch Exception ex (throw (new FunctionException ex))))))] - (.add @functions handler name (make-array String 0)) + (.add @functions handler name (make-aliases-array aliases)) (.retrieve @functions name))) (defmacro deftwigfn "adds a new template function. templates can call it by by the name specified and passing in the same number of arguments as in args. the return value of the last form in body is returned to the - template." + template. functions defined this way have no aliases and can only be called by the name given." [fn-name args & body] `(do - (add-function! ~fn-name (fn ~args ~@body)))) + (add-function! ~fn-name nil (fn ~args ~@body)))) + +(defmacro defaliasedtwigfn + "adds a new template function. templates can call it by by the name specified (or one of the + aliases specified) and passing in the same number of arguments as in args. the return value of + the last form in body is returned to the template." + [fn-name args aliases & body] + `(do + (add-function! ~fn-name ~aliases (fn ~args ~@body)))) \ No newline at end of file