summaryrefslogtreecommitdiff
path: root/src/dompa/core.clj
blob: d8fff41dbd0e9e85a7a0e14bb6325225a9fa7627 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
(ns dompa.core
  (:require
    [dompa.coordinates :refer [html->coordinates]]
    [dompa.nodes :refer [coordinates->nodes]]))

(defn html->nodes [html]
  (->> html
       html->coordinates
       (coordinates->nodes html)))

(defn nodes->html [nodes]
  (reduce
    (fn [html node]
      (cond
        (= (-> node :name) :dompa/text)
        (str html (-> node :value))

        :else
        (let [node-name (-> node :name name)
              node-child-html (nodes->html (-> node :children))]
          (str html "<" node-name ">" node-child-html "</" node-name ">"))))
    ""
    nodes))

(defn traverse-nodes [nodes pred]
  (reduce
    (fn [updated-nodes node]
      (if-let [updated-node (pred node)]
        (let [children (traverse-nodes (-> updated-node :children) pred)]
          (conj updated-nodes (assoc updated-node :children children)))
        updated-nodes))
    []
    nodes))

(defn traverse-html [html pred]
  (-> (html->nodes html)
      (traverse-nodes pred)
      nodes->html))

(comment
  (traverse-html "<div>asdasd<span>hello</span></div>" #(when-not (= (-> % :name) :span)
                                                          %))
  (html->coordinates "<div>hello<span>asd</span><strong>asdasdadad<img></strong></div>hello some text<div>another root element</div>")
  (html->nodes "<div>hello<span><img src=\"test.jpg\" ckcche/>asd</span><strong>asdasdadad</strong>"))