diff options
| author | Asko Nõmm <asko@nmm.ee> | 2025-09-23 02:08:12 +0300 |
|---|---|---|
| committer | Asko Nõmm <asko@nmm.ee> | 2025-09-23 02:08:12 +0300 |
| commit | 20fa62ab90ed87e143bf9b140ba4b7708f1e91ee (patch) | |
| tree | 717c19e9e39adcd29f8e53f58dd9e71ee5447900 | |
| parent | 1cde4cbae25e4cd1a79e882f0858f44b664a453b (diff) | |
Make nodes have namespaces keys so that we could make `$` helper macro into a function instead.
| -rw-r--r-- | src/dompa/coordinates.cljc | 8 | ||||
| -rw-r--r-- | src/dompa/nodes.cljc | 17 | ||||
| -rw-r--r-- | src/dompa/utils.cljc | 48 | ||||
| -rw-r--r-- | test/dompa/coordinates_test.cljc | 60 |
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 |
