5

我正在寻找一种可以逆转 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"]]
4

3 回答 3

8

你可以html-resourceenlive得到这样的结构:

{: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"] "!"]
于 2012-06-19T05:42:50.257 回答
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

(奇怪的是,我刚刚在同一个搜索中找到了这个问题和那个 wiki 页面……而我是 2 年前那个 Wiki 页面的最新编辑。)

于 2014-09-24T01:00:21.707 回答
3

现在有 Hickory 可以做到这一点:https ://github.com/davidsantiago/hickory

于 2014-03-07T10:46:12.083 回答