summaryrefslogtreecommitdiff
path: root/src/dompa/templates.cljc
diff options
context:
space:
mode:
Diffstat (limited to 'src/dompa/templates.cljc')
-rw-r--r--src/dompa/templates.cljc48
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)