2016-09-13 4 views
0

ClojureScriptプロジェクトの場合、クライアント側の外部HTML文書からコンテンツを抽出する簡潔な方法を探しています。コンテンツは実際にはMarkdown形式のajax呼び出しを介して受信され、それ以降はHTMLに解析されます。だからHTML文字列が出発点です。ClojureScriptのhtml-stringから要素を抽出します

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

ライブラリここでは必要とされているCSSセレクタを、表現するためのインスタンスを使用するベクターのためのEnliveGardenEnliveには、同様のセマンティクスを提供するフロントエンドの姉妹であるEnfocusがあります。より多くの試合があった場合

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

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

:somethingの値がベクトルになる:

はここで、現在のDOMからいくつかのコンテンツを抽出しenfocus例です。どのように任意のHTML文字列にこの関数を適用するか、わかりませんでした。今、いくつかの中に問題を引き起こす可能性があるすべてのものを包むのdivが、ありますので、しかし、これは、非常にきれいではありません

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

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

、その後:私は得ることができる最も近いこの機能を使用していました状況。

+0

多分ちょうどあなたのdivののfirstChildを取ります。 –

答えて

0

divにHTMLコンテンツを挿入すると、任意の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 
    )) 

これは、あなたがGoogleの閉鎖API内goog.dom namespaceか、他のどこかに掘ることができますしたい場合は、おそらくGoogleの閉鎖ライブラリを使用すると、よりエレガントになり、無地でシンプルなClojureScriptです。

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

だから、あなたのドキュメント上のEnfocusを呼び出すことができます:次に

は、あなたのHTML文字列を解析

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

結果:

{:mystuff "some of my stuff"} 
関連する問題