From 72e7593faf1b43bec02cfd5ac31145eb9e94c7b2 Mon Sep 17 00:00:00 2001 From: gered Date: Sun, 5 Oct 2014 15:01:16 -0400 Subject: [PATCH] add custom template function support --- src/clj_pebble/core.clj | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/src/clj_pebble/core.clj b/src/clj_pebble/core.clj index 8ca1696..e098449 100644 --- a/src/clj_pebble/core.clj +++ b/src/clj_pebble/core.clj @@ -2,7 +2,8 @@ (:import (java.io StringWriter) (com.mitchellbosecke.pebble PebbleEngine) (com.mitchellbosecke.pebble.loader DelegatingLoader ClasspathLoader FileLoader StringLoader) - (com.mitchellbosecke.pebble.template PebbleTemplate)) + (com.mitchellbosecke.pebble.template PebbleTemplate) + (com.mitchellbosecke.pebble.extension Function AbstractExtension Extension)) (:require [clojure.walk :refer [stringify-keys]])) (defonce classpath-loader (ClasspathLoader.)) @@ -17,6 +18,25 @@ (defn create-engine! [] (reset! engine (make-pebble-engine))) +(defn- get-sorted-args [args-map] + (->> args-map + (map + (fn [[k v]] + [(Integer/parseInt k) v])) + (sort-by first) + (map second))) + +(defn make-function [f] + (reify Function + (getArgumentNames [_] nil) + (execute [_ args] + (apply f (get-sorted-args args))))) + +(defmacro defpebblefn [fn-name args & body] + `(let [f# (fn ~args ~@body) + pebble-fn# (make-function f#)] + (.put (.getFunctions @engine) ~fn-name pebble-fn#))) + (defn prepare-context-map [context] (if context (stringify-keys context)