从ClojureScript中的html-string中提取元素

时间:2016-09-13 11:31:49

标签: javascript html css dom clojurescript

对于ClojureScript项目,我正在寻找一种简洁的方法来从客户端的外部HTML文档中提取内容。实际上通过Markdown格式的ajax调用接收内容,随后将其解析为HTML。所以HTML字符串是出发点。

(def html-string "<p>Something, that <a>was</a> Markdown before</p>")

EnliveGarden例如使用向量来表示CSS选择器,这里需要它们。 Enlive有一个名为Enfocus的前端姐妹,它提供了类似的语义。

这是一个enfocus示例,它从当前DOM中提取一些内容:

(require '[enfocus.core :as ef])

(ef/from js/document.head :something [:title]
         (ef/get-text))
;;{:something "My Title"}

如果有更多匹配项,:something的值将成为向量。我无法弄清楚,如何在任意HTML字符串上应用此函数。我能得到的最接近的是使用这个函数:

(defn html->node [h]
  (doto (.createElement js/document "div")
    (aset "innerHTML" h)))

然后:

(ef/from (html->node html-string) :my-link [:a]
  (ef/get-text))
;;{:my-link "was"}

然而,这并不是很干净,因为现在有一个div包装所有东西,这可能会在某些情况下造成麻烦。

1 个答案:

答案 0 :(得分:0)

将一些HTML内容插入newCard = [ { name: "myname", idList: "myIdList", desc: "mydesc", pos: "top", due: null }; ] 会自动评估您的任意HTML。你应该做的是用这样的东西来解析你的HTML字符串。

div

这是简单而简单的ClojureScript,如果您希望可以深入研究Google Closure API中的goog.dom namespace或其他位置,可能使用Google Closure库会更优雅。

然后解析HTML字符串:

(defn parse-html [html]
  "Parse an html string into a document"
  (let [doc (.createHTMLDocument js/document.implementation "mydoc")]
    (set! (.-innerHTML doc.documentElement) html)
    doc
    ))

因此,您可以在文档上调用Enfocus:

(def html-doc (parse-html "<body><div><p>some of my stuff</p></div></body>"))

结果:

(ef/from html-doc :mystuff [:p] (ef/get-text))