我正在寻找一种可以逆转clojure打嗝的功能
所以
<html></html>
变成
[:html]
等
跟随@kotarak的回答,这对我有用:
(use 'net.cgrand.enlive-html)
(import 'java.io.StringReader)
(defn enlive->hiccup
[el]
(if-not (string? el)
(->> (map enlive->hiccup (:content el))
(concat [(:tag el) (:attrs el)])
(keep identity)
vec)
el))
(defn html->enlive
[html]
(first (html-resource (StringReader. html))))
(defn html->hiccup [html]
(-> html
html->enlive
enlive->hiccup))
=> (html->hiccup "<html><body id='foo'>hello</body></html>")
[:html [:body {:id "foo"} "hello"]]
答案 0 :(得分:8)
您可以从enlive html-resource
获得这样的结构:
{:tag :html :attrs {} :content []}
然后遍历它并将其变成打嗝结构。
(defn html->hiccup
[html]
(if-not (string? html)
(->> (map html->hiccup (:content html))
(concat [(:tag html) (:attrs html)])
(keep identity)
vec)
html))
这是一个用法示例:
user=> (html->hiccup {:tag :p
:content ["Hello" {:tag :a
:attrs {:href "/foo"}
:content ["World"]}
"!"]})
[:p "Hello" [:a {:href "/foo"} "World"] "!"]
答案 1 :(得分:6)
Hiccup Github Wiki上有一个页面:
https://github.com/weavejester/hiccup/wiki/Converting-html-to-hiccup
链接到三个解决方案:
https://github.com/davidsantiago/hickory
https://github.com/nathell/clj-tagsoup
https://github.com/hozumi/hiccup-bridge
(奇怪的是,我刚刚在同一个搜索中发现了这个问题和维基页面...而且我是2年前该Wiki页面的最新编辑。)
答案 2 :(得分:3)
现在有Hickory这样做:https://github.com/davidsantiago/hickory