Skip to content

Commit bb8a17f

Browse files
committed
#9: Implement zipper support
1 parent a2e703f commit bb8a17f

2 files changed

Lines changed: 36 additions & 8 deletions

File tree

src/dompa/nodes.cljc

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
(ns dompa.nodes)
1+
(ns dompa.nodes
2+
(:require [clojure.zip :as zip]))
23

34
(def ^:private default-void-nodes
45
#{:!doctype :!DOCTYPE :area :base :br :col :embed :hr :img :input
@@ -50,6 +51,18 @@
5051
updated-nodes))
5152
(reduce [] nodes)))
5253

54+
(defn zip
55+
"Creates a zipper for given a given `node`."
56+
[node]
57+
(zip/zipper
58+
(fn branch? [node]
59+
(boolean (seq (:node/children node))))
60+
(fn children [node]
61+
(:node/children node))
62+
(fn make-node [node children]
63+
(assoc node :node/children children))
64+
node))
65+
5366
(defn ->html
5467
"Transform a vector of `nodes` into an HTML string.
5568

test/dompa/nodes_test.cljc

Lines changed: 22 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
11
(ns dompa.nodes-test
2-
#?(:clj (:require [clojure.test :refer [deftest is testing]]
3-
[dompa.nodes :refer [$ defhtml traverse ->html]]
4-
[dompa.html :as html]))
2+
#?(:clj (:require
3+
[clojure.test :refer [deftest is testing]]
4+
[clojure.zip :as zip]
5+
[dompa.html :as html]
6+
[dompa.nodes :as nodes :refer [$ defhtml]]))
57
#?(:cljs (:require [cljs.test :refer-macros [deftest testing is]]
6-
[dompa.nodes :refer [$ traverse ->html] :refer-macros [defhtml]]
8+
[clojure.zip :as zip]
9+
[dompa.nodes :as nodes :refer [$] :refer-macros [defhtml]]
710
[dompa.html :as html])))
811

912
(defhtml hello [who]
@@ -18,7 +21,7 @@
1821
($ :ul
1922
(->> items
2023
(map (fn [item]
21-
($ :li ($ item))))
24+
($ :li ($ item))))
2225
(into []))))
2326

2427
(deftest list-items-test
@@ -53,5 +56,17 @@
5356
node))]
5457
(is (= "<div>world hello</div>"
5558
(-> (html/->nodes "<div>hello world</div>")
56-
(traverse traverser-fn)
57-
->html)))))
59+
(nodes/traverse traverser-fn)
60+
nodes/->html)))))
61+
62+
(deftest zip-test
63+
(let [nodes (html/->nodes "<div><p>hello</p><p>world</p></div>")
64+
zipper (nodes/zip (first nodes))]
65+
(is (= :div
66+
(:node/name (zip/node zipper))))
67+
(is (= "hello"
68+
(-> zipper
69+
zip/down
70+
zip/down
71+
zip/node
72+
:node/value)))))

0 commit comments

Comments
 (0)