add custom template function support

This commit is contained in:
Gered 2014-10-05 15:01:16 -04:00
parent 8cce00fb93
commit 72e7593faf

View file

@ -2,7 +2,8 @@
(:import (java.io StringWriter) (:import (java.io StringWriter)
(com.mitchellbosecke.pebble PebbleEngine) (com.mitchellbosecke.pebble PebbleEngine)
(com.mitchellbosecke.pebble.loader DelegatingLoader ClasspathLoader FileLoader StringLoader) (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]])) (:require [clojure.walk :refer [stringify-keys]]))
(defonce classpath-loader (ClasspathLoader.)) (defonce classpath-loader (ClasspathLoader.))
@ -17,6 +18,25 @@
(defn create-engine! [] (defn create-engine! []
(reset! engine (make-pebble-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] (defn prepare-context-map [context]
(if context (if context
(stringify-keys context) (stringify-keys context)