diff --git a/deps.edn b/deps.edn
index a75d65e..1213df6 100644
--- a/deps.edn
+++ b/deps.edn
@@ -14,7 +14,9 @@
com.cognitect/transit-clj {:mvn/version "1.0.324"}
medley/medley {:mvn/version "1.3.0"}
mvxcvi/puget {:mvn/version "1.3.1"}
- tolitius/xml-in {:mvn/version "0.1.1"}}
+ tolitius/xml-in {:mvn/version "0.1.1"}
+ org.clj-commons/hickory {:mvn/version "0.7.3"}
+ org.jsoup/jsoup {:mvn/version "1.14.3"}}
:aliases
{:run
{:main-opts ["-m" "cq.main"]}
diff --git a/src/cq/formats.clj b/src/cq/formats.clj
index a49e475..0a57772 100644
--- a/src/cq/formats.clj
+++ b/src/cq/formats.clj
@@ -2,6 +2,8 @@
(:require [clojure.data.csv :as csv]
[clojure.data.json :as json]
[clojure.data.xml :as xml]
+ [hickory.core :as html]
+ [hickory.render :refer [hickory-to-html]]
[clojure.edn :as edn]
[clojure.pprint :as ppt]
[clojure.java.io :as io]
@@ -167,6 +169,18 @@
(with-open [w (io/writer out)]
(emit x w)))))
+(defn ->html-reader
+ [_]
+ (fn [in]
+ (html/as-hickory (html/parse (slurp (io/reader in))))))
+
+(defn ->html-writer
+ [_]
+ (fn [x out]
+ (binding [*out* (io/writer out)]
+ (print (hickory-to-html x))
+ (flush))))
+
(def formats
{"json" {:->reader ->json-reader
:->writer ->json-writer}
@@ -185,7 +199,9 @@
"transit" {:->reader ->transit-reader
:->writer ->transit-writer}
"xml" {:->reader ->xml-reader
- :->writer ->xml-writer}})
+ :->writer ->xml-writer}
+ "html" {:->reader ->html-reader
+ :->writer ->html-writer}})
(defn format->reader
[format in opts]
diff --git a/test/cq/formats_test.clj b/test/cq/formats_test.clj
index 6254452..bbf3347 100644
--- a/test/cq/formats_test.clj
+++ b/test/cq/formats_test.clj
@@ -2,7 +2,8 @@
(:require [cq.formats :as sut]
[clojure.test :refer :all]
[clojure.java.io :as io]
- [clojure.string :as str])
+ [clojure.string :as str]
+ [hickory.core :as html])
(:import [java.io ByteArrayInputStream BufferedInputStream PrintStream ByteArrayOutputStream]))
(defn- to-out-stream
@@ -152,3 +153,33 @@
hello
") + +(def test-html-data + {:type :document + :content + [{:type :element + :attrs nil + :tag :html + :content + [{:type :element + :attrs nil + :tag :head :content nil} + {:type :element + :attrs nil + :tag :body :content + [{:type :element + :attrs nil + :tag :p + :content ["hello"]}]}]}]}) + +(deftest html + (testing "reader" + (is (= test-html-data + (test-reader-str sut/->html-reader nil test-html-str)))) + + (testing "writer" + (is (= "hello
" + (test-writer-str sut/->html-writer nil test-html-data)))))