summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAsko Nõmm <asko@nmm.ee>2025-09-23 02:08:12 +0300
committerAsko Nõmm <asko@nmm.ee>2025-09-23 02:08:12 +0300
commit20fa62ab90ed87e143bf9b140ba4b7708f1e91ee (patch)
tree717c19e9e39adcd29f8e53f58dd9e71ee5447900
parent1cde4cbae25e4cd1a79e882f0858f44b664a453b (diff)
Make nodes have namespaces keys so that we could make `$` helper macro into a function instead.
-rw-r--r--src/dompa/coordinates.cljc8
-rw-r--r--src/dompa/nodes.cljc17
-rw-r--r--src/dompa/utils.cljc48
-rw-r--r--test/dompa/coordinates_test.cljc60
4 files changed, 70 insertions, 63 deletions
diff --git a/src/dompa/coordinates.cljc b/src/dompa/coordinates.cljc
index abaf233..4f9a436 100644
--- a/src/dompa/coordinates.cljc
+++ b/src/dompa/coordinates.cljc
@@ -259,13 +259,13 @@
[node-html node-children]
(let [node-name (html-str->node-name node-html)]
(merge
- {:name node-name}
+ {:node/name node-name}
(when (= node-name :dompa/text)
- {:value node-html})
+ {:node/value node-html})
(when-let [attrs (html-str->node-attrs node-html)]
- {:attrs attrs})
+ {:node/attrs attrs})
(when node-children
- {:children node-children}))))
+ {:node/children node-children}))))
(defn ->nodes
"Transform given `html` according to given `coordinates` into
diff --git a/src/dompa/nodes.cljc b/src/dompa/nodes.cljc
index cf79e21..9ecc95f 100644
--- a/src/dompa/nodes.cljc
+++ b/src/dompa/nodes.cljc
@@ -13,17 +13,17 @@
(defn- node->html-reducer-fn
[void-nodes nodes->html-fn]
(fn [html node]
- (let [node-name (-> node :name name)
- node-attrs (reduce-kv node-attrs-reducer "" (-> node :attrs))]
+ (let [node-name (-> node :node/name name)
+ node-attrs (reduce-kv node-attrs-reducer "" (-> node :node/attrs))]
(cond
- (= (-> node :name) :dompa/text)
- (str html (-> node :value))
+ (= (-> node :node/name) :dompa/text)
+ (str html (-> node :node/value))
- (contains? void-nodes (-> node :name))
+ (contains? void-nodes (-> node :node/name))
(str html "<" node-name node-attrs">")
:else
- (let [value (nodes->html-fn (-> node :children))]
+ (let [value (nodes->html-fn (-> node :node/children))]
(str html "<" node-name node-attrs ">" value "</" node-name ">"))))))
(defn traverse
@@ -35,8 +35,8 @@
[nodes traverser-fn]
(-> (fn [updated-nodes node]
(if-let [updated-node (traverser-fn node)]
- (let [children (traverse (-> updated-node :children) traverser-fn)]
- (conj updated-nodes (assoc updated-node :children children)))
+ (let [children (traverse (-> updated-node :node/children) traverser-fn)]
+ (conj updated-nodes (assoc updated-node :node/children children)))
updated-nodes))
(reduce [] nodes)))
@@ -61,6 +61,7 @@
- `:wbr`
"
([nodes]
+ (prn "nodes: " nodes)
(->html nodes {:void-nodes default-void-nodes}))
([nodes {:keys [void-nodes]}]
(-> (node->html-reducer-fn void-nodes ->html)
diff --git a/src/dompa/utils.cljc b/src/dompa/utils.cljc
index 285566d..ea25d68 100644
--- a/src/dompa/utils.cljc
+++ b/src/dompa/utils.cljc
@@ -1,34 +1,40 @@
(ns dompa.utils
(:require [dompa.nodes :as nodes]))
-(defmacro $ [name & opts]
+(defmacro defhtml [name & args-and-elements]
+ (let [[args & elements] args-and-elements]
+ `(defn ~name ~args
+ (nodes/->html (vector ~@elements)))))
+
+(defn $ [name & opts]
(if (string? name)
- {:name :dompa/text
- :value name}
- (let [node {:name name}
- attrs? (map? (first opts))
+ {: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?
- {:attrs attrs})
+ {:node/attrs attrs})
(when-not (empty? children)
- {:children (into [] children)})))))
+ {:node/children 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)))))
-(defn- page []
- (list
- ($ :!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, world.")))))))
+(prn (page "world"))
(comment
- ($ "asdasd")
- (page)
- (nodes/->html (page))) \ No newline at end of file
+ ($ :div {:class "test"}
+ ($ "asdasd" "asd"))) \ No newline at end of file
diff --git a/test/dompa/coordinates_test.cljc b/test/dompa/coordinates_test.cljc
index d6528a0..91abf20 100644
--- a/test/dompa/coordinates_test.cljc
+++ b/test/dompa/coordinates_test.cljc
@@ -97,48 +97,48 @@
(deftest nodes-test
(testing "Create nodes"
- (is (= [{:name :div
- :attrs {}
- :children [{:name :dompa/text
- :value "hello"}]}]
+ (is (= [{:node/name :div
+ :node/attrs {}
+ :node/children [{:node/name :dompa/text
+ :node/value "hello"}]}]
(-> "<div>hello</div>"
coordinates/compose
coordinates/unify
coordinates/->nodes))))
(testing "Create nodes with attributes"
- (is (= [{:name :div
- :attrs {:class "some test classes"
- :data-attr "something"
- :checked true}
- :children [{:name :dompa/text
- :value "hello"}]}]
+ (is (= [{:node/name :div
+ :node/attrs {:class "some test classes"
+ :data-attr "something"
+ :checked true}
+ :node/children [{:node/name :dompa/text
+ :node/value "hello"}]}]
(-> "<div class=\"some test classes\" data-attr=\"something\" checked>hello</div>"
coordinates/compose
coordinates/unify
coordinates/->nodes))))
(testing "Create nested nodes"
- (is (= [{:name :b
- :attrs {}
- :children [{:name :dompa/text
- :value "bold"}]}
- {:name :img
- :attrs {:src "img.png"}}
- {:name :dompa/text
- :value "Hello, "}
- {:name :span
- :attrs {}
- :children [{:name :dompa/text
- :value "wor"}
- {:name :i
- :attrs {}
- :children [{:name :dompa/text
- :value "l"}
- {:name :b
- :attrs {}
- :children [{:name :dompa/text
- :value "d"}]}]}]}]
+ (is (= [{:node/name :b
+ :node/attrs {}
+ :node/children [{:node/name :dompa/text
+ :node/value "bold"}]}
+ {:node/name :img
+ :node/attrs {:src "img.png"}}
+ {:node/name :dompa/text
+ :node/value "Hello, "}
+ {:node/name :span
+ :node/attrs {}
+ :node/children [{:node/name :dompa/text
+ :node/value "wor"}
+ {:node/name :i
+ :node/attrs {}
+ :node/children [{:node/name :dompa/text
+ :node/value "l"}
+ {:node/name :b
+ :node/attrs {}
+ :node/children [{:node/name :dompa/text
+ :node/value "d"}]}]}]}]
(-> "<b>bold</b><img src=\"img.png\" />Hello, <span>wor<i>l<b>d</b></i></span>"
coordinates/compose
coordinates/unify