diff options
| -rw-r--r-- | src/dompa/nodes.cljc | 15 | ||||
| -rw-r--r-- | test/dompa/nodes_test.cljc | 29 |
2 files changed, 36 insertions, 8 deletions
diff --git a/src/dompa/nodes.cljc b/src/dompa/nodes.cljc index 9dbecd0..e99b364 100644 --- a/src/dompa/nodes.cljc +++ b/src/dompa/nodes.cljc @@ -1,4 +1,5 @@ -(ns dompa.nodes) +(ns dompa.nodes + (:require [clojure.zip :as zip])) (def ^:private default-void-nodes #{:!doctype :!DOCTYPE :area :base :br :col :embed :hr :img :input @@ -50,6 +51,18 @@ updated-nodes)) (reduce [] nodes))) +(defn zip + "Creates a zipper for given a given `node`." + [node] + (zip/zipper + (fn branch? [node] + (boolean (seq (:node/children node)))) + (fn children [node] + (:node/children node)) + (fn make-node [node children] + (assoc node :node/children children)) + node)) + (defn ->html "Transform a vector of `nodes` into an HTML string. diff --git a/test/dompa/nodes_test.cljc b/test/dompa/nodes_test.cljc index 2606be6..ca8d483 100644 --- a/test/dompa/nodes_test.cljc +++ b/test/dompa/nodes_test.cljc @@ -1,9 +1,12 @@ (ns dompa.nodes-test - #?(:clj (:require [clojure.test :refer [deftest is testing]] - [dompa.nodes :refer [$ defhtml traverse ->html]] - [dompa.html :as html])) + #?(:clj (:require + [clojure.test :refer [deftest is testing]] + [clojure.zip :as zip] + [dompa.html :as html] + [dompa.nodes :as nodes :refer [$ defhtml]])) #?(:cljs (:require [cljs.test :refer-macros [deftest testing is]] - [dompa.nodes :refer [$ traverse ->html] :refer-macros [defhtml]] + [clojure.zip :as zip] + [dompa.nodes :as nodes :refer [$] :refer-macros [defhtml]] [dompa.html :as html]))) (defhtml hello [who] @@ -18,7 +21,7 @@ ($ :ul (->> items (map (fn [item] - ($ :li ($ item)))) + ($ :li ($ item)))) (into [])))) (deftest list-items-test @@ -53,5 +56,17 @@ node))] (is (= "<div>world hello</div>" (-> (html/->nodes "<div>hello world</div>") - (traverse traverser-fn) - ->html))))) + (nodes/traverse traverser-fn) + nodes/->html))))) + +(deftest zip-test + (let [nodes (html/->nodes "<div><p>hello</p><p>world</p></div>") + zipper (nodes/zip (first nodes))] + (is (= :div + (:node/name (zip/node zipper)))) + (is (= "hello" + (-> zipper + zip/down + zip/down + zip/node + :node/value)))))
\ No newline at end of file |
