summaryrefslogtreecommitdiff
path: root/src/dompa/nodes.clj
diff options
context:
space:
mode:
Diffstat (limited to 'src/dompa/nodes.clj')
-rw-r--r--src/dompa/nodes.clj26
1 files changed, 26 insertions, 0 deletions
diff --git a/src/dompa/nodes.clj b/src/dompa/nodes.clj
new file mode 100644
index 0000000..53020ba
--- /dev/null
+++ b/src/dompa/nodes.clj
@@ -0,0 +1,26 @@
+(ns dompa.nodes)
+
+(defmacro $
+ "Creates a new node. Particularly useful
+ where you need compile-time composition over run-time, like when
+ combined with the `defhtml` macro to create HTML string outputs.
+
+ Usage:
+
+ ```clojure
+ ($ :div
+ ($ \"hello world\" ))
+ ```"
+ [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 children#)))))