2016-09-13 59 views
0

对于ClojureScript项目,我正在寻找一种简洁的方式来从客户端的外部文件HTML中提取内容。该内容实际上是通过格式为Markdown的ajax调用接收的,后者随后被解析为HTML。所以一个HTML字符串是一个出发点。从ClojureScript中的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包裹的一切,这可能会导致一些麻烦的情况。

+0

也许只是把你div的则firstChild 。 –

回答

0

将一些HTML内容插入div会自动评估您的任意HTML。你应该做的是用这样的东西解析你的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 
    )) 

这是简单明了的ClojureScript,也许使用谷歌关闭图书馆会更优雅,如果你愿意,你可以深入到goog.dom namespace或别的地方的谷歌关闭API里面。

然后,解析您的HTML字符串:

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

所以,你可以调用的Enfocus在文档:

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

结果:

{:mystuff "some of my stuff"}