对于ClojureScript
项目,我正在寻找一种简洁的方法来从客户端的外部HTML
文档中提取内容。实际上通过Markdown
格式的ajax调用接收内容,随后将其解析为HTML
。所以HTML
字符串是出发点。
(def html-string "<p>Something, that <a>was</a> Markdown before</p>")
库Enlive
和Garden
例如使用向量来表示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包装所有东西,这可能会在某些情况下造成麻烦。
答案 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))