diff options
Diffstat (limited to 'src/dompa/templates.cljc')
| -rw-r--r-- | src/dompa/templates.cljc | 48 |
1 files changed, 48 insertions, 0 deletions
diff --git a/src/dompa/templates.cljc b/src/dompa/templates.cljc new file mode 100644 index 0000000..8a7aae9 --- /dev/null +++ b/src/dompa/templates.cljc @@ -0,0 +1,48 @@ +(ns dompa.templates + (:require [dompa.nodes :as nodes])) + +(defmacro defhtml + {:clj-kondo/lint-as 'clojure.core/defn} + [name & args-and-elements] + (let [[args & elements] args-and-elements] + `(defn ~name ~args + (nodes/->html (vector ~@elements))))) + +(defn ->flat-xf [] + (fn [rf] + (letfn [(step [result input] + (if (sequential? input) + (reduce step result input) + (rf result input)))] + (fn + ([] (rf)) + ([result] (rf result)) + ([result input] (step result input)))))) + +(defn ->flat [children] + (into [] (->flat-xf) children)) + +(defmacro $ + [name & opts] + `(if (string? ~name) + {:node/name :dompa/text + :node/value (str ~name ~@opts)} + (let [opts# (list ~@opts) + first-opt# (first opts#) + attrs?# (and (map? first-opt#) + (not (contains? first-opt# :node/name))) + attrs# (if attrs?# first-opt# {}) + children# (if attrs?# (rest opts#) opts#)] + (cond-> {:node/name ~name} + attrs?# (assoc :node/attrs attrs#) + (seq children#) (assoc :node/children (->flat children#)))))) + +(defhtml test-page [] + (let [n 123] + ($ :<> + ($ :div + ($ "hello world" n)) + ($ "hello") + ($ :div)))) + +(test-page) |
