summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAsko Nõmm <asko@nmm.ee>2025-09-23 22:46:16 +0300
committerAsko Nõmm <asko@nmm.ee>2025-09-23 22:46:16 +0300
commitd2b8b9424ffd40b8703ad61438430f3491a33249 (patch)
treed7445ad2d7e93bb9dfe01b5abd5126e07ad6cfb9
parent20fa62ab90ed87e143bf9b140ba4b7708f1e91ee (diff)
Improvements to the utils macros.
-rw-r--r--deps.edn4
-rw-r--r--src/dompa/nodes.cljc21
-rw-r--r--src/dompa/utils.cljc62
3 files changed, 46 insertions, 41 deletions
diff --git a/deps.edn b/deps.edn
index 024a763..6e121a7 100644
--- a/deps.edn
+++ b/deps.edn
@@ -1 +1,3 @@
-{:deps {}} \ No newline at end of file
+{:deps {}
+ :paths ["src" "resources"]
+ :aliases {:dev {:extra-deps {clj-kondo/clj-kondo {:mvn/version "2025.07.28"}}}}} \ No newline at end of file
diff --git a/src/dompa/nodes.cljc b/src/dompa/nodes.cljc
index 9ecc95f..dfd93bc 100644
--- a/src/dompa/nodes.cljc
+++ b/src/dompa/nodes.cljc
@@ -13,18 +13,19 @@
(defn- node->html-reducer-fn
[void-nodes nodes->html-fn]
(fn [html node]
- (let [node-name (-> node :node/name name)
- node-attrs (reduce-kv node-attrs-reducer "" (-> node :node/attrs))]
- (cond
- (= (-> node :node/name) :dompa/text)
- (str html (-> node :node/value))
+ (when-not (nil? node)
+ (let [node-name (-> node :node/name name)
+ node-attrs (reduce-kv node-attrs-reducer "" (-> node :node/attrs))]
+ (cond
+ (= (-> node :node/name) :dompa/text)
+ (str html (-> node :node/value))
- (contains? void-nodes (-> node :node/name))
- (str html "<" node-name node-attrs">")
+ (contains? void-nodes (-> node :node/name))
+ (str html "<" node-name node-attrs">")
- :else
- (let [value (nodes->html-fn (-> node :node/children))]
- (str html "<" node-name node-attrs ">" value "</" node-name ">"))))))
+ :else
+ (let [value (nodes->html-fn (-> node :node/children))]
+ (str html "<" node-name node-attrs ">" value "</" node-name ">")))))))
(defn traverse
"Recursively traverses given tree of `nodes` with a `traverser-fn`
diff --git a/src/dompa/utils.cljc b/src/dompa/utils.cljc
index ea25d68..74185b5 100644
--- a/src/dompa/utils.cljc
+++ b/src/dompa/utils.cljc
@@ -1,40 +1,42 @@
(ns dompa.utils
(:require [dompa.nodes :as nodes]))
-(defmacro defhtml [name & args-and-elements]
+(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 $ [name & opts]
- (if (string? name)
- {:node/name :dompa/text
- :node/value (str name (apply str opts))}
- (let [node {:node/name name}
- attrs? (not (get (first opts) :node/name))
- attrs (if attrs? (first opts) {})
- children (if attrs? (rest opts) opts)]
- (merge
- node
- (when attrs?
- {:node/attrs attrs})
- (when-not (empty? children)
- {:node/children children})))))
+(defn- flattench [children]
+ (mapcat #(if (sequential? %) (flattench %) [%]) children))
-(defhtml page
- [test]
- ($ :!doctype {:html true})
- ($ :html {:lang "en"}
- ($ :head
- ($ :meta {:charset "utf-8"})
- ($ :link {:rel "stylesheet" :href "style.css"}))
- ($ :body
- ($ :span {:class "test"})
- ($ :span {:class "test2"}
- ($ "hello" test)))))
+(defmacro $
+ {:clj-kondo/lint-as 'clojure.core/list}
+ [name & opts]
+ `(if (string? ~name)
+ {:node/name :dompa/text
+ :node/value (apply str ~name ~opts)}
+ (let [name# ~name
+ opts-list# (list ~@opts)
+ first-opt# (first opts-list#)
+ attrs?# (and (map? first-opt#)
+ (not (contains? first-opt# :node/name)))
+ attrs# (if attrs?# first-opt# {})
+ children# (if attrs?# (rest opts-list#) opts-list#)]
+ (merge
+ {:node/name name#}
+ (when attrs?# {:node/attrs attrs#})
+ (when (seq children#) {:node/children (flattench children#)})))))
-(prn (page "world"))
-
-(comment
+(defhtml page [who]
($ :div {:class "test"}
- ($ "asdasd" "asd"))) \ No newline at end of file
+ ($ "hello world")
+ (let [n "who"]
+ ($ n))
+ (for [x ["1" "2" "3"]]
+ ($ x))
+ ($ who)
+ (mapv #($ %) ["a" "b" "c"])))
+
+(page "world") \ No newline at end of file