2016-09-13 5 views
0

Для проекта ClojureScript Я ищу краткий способ извлечения содержимого из внешнего документа HTML на стороне клиента. Содержимое фактически получено через вызов ajax в формате Markdown, который затем анализируется на HTML. Таким образом, строка HTML является отправной точкой.Извлечение элементов из html-строки в ClojureScript

(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

Может быть просто взять FirstChild вашего DIV , –

ответ

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, возможно с помощью библиотеки Google Closure будет более элегантным, если вы хотите, вы можете выкопать в goog.dom namespace или где-нибудь еще внутри API Google Closure.

Затем разобрать ваш 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"} 
Смежные вопросы