2010-05-24 15 views

Odpowiedz

3

Okazuje się, że Enlive domyślnie usuwa kod HTML, jeśli używasz net.cgrand.enlive-html/content do wstawiania tekstu do elementu HTML.

(sniptest "<p class=\"c\"></p>" [:.c] (content "<script></script>")) 
"<p class=\"c\">&lt;script&gt;&lt;/script&gt;</p>" 
14

Aktualizacja: Wiedziałem, że musi być więcej niż ...

ring.util.codec z ring-core posiada funkcje zwane które działają tak:

user> (require '[ring.util.codec :as c]) 
nil 
user> (c/url-encode "<a>") 
"%3Ca%3E" 
user> (c/url-decode "<a>") 
"<a>" 

Są obwolut wokół java.net.URLEncoder i java.net.URLDecoder . Ta sama przestrzeń nazw zapewnia funkcje radzenia sobie z kodowaniem Base64, oparte na klasie Apache Commons.


Oryginalna odpowiedź jest następująca.

Nie jestem pewien, czy jest to funkcja publiczna to zrobić, ale Enlive ma dwa prywatne funkcje zwane xml-str i attr-str który to zrobić: (. attr-str ucieka również ")

(defn- xml-str 
"Like clojure.core/str but escapes < > and &." 
[x] 
    (-> x str (.replace "&" "&amp;") (.replace "<" "&lt;") (.replace ">" "&gt;"))) 

Możesz dostać się do tej funkcji z @#'net.cgrand.enlive-html/xml-str (Clojure nie ma tendencji do robienia rzeczy naprawdę prywatnych ...) lub po prostu skopiować go do własnej przestrzeni nazw.

+0

To trochę niesmak. Brzmi to jak poważny niedopatrzenie w większości frameworków Clojure. –

+1

Wygląda na to, że sytuacja nie jest taka zła: zobacz zaktualizowaną odpowiedź.:-) –

+1

Wygląda na to, że trochę pośpiesznie obwiniałem Enlive'a, ale dzięki. :) –

17

hiccup.util/escape-html w hiccup robi to. Ta funkcja była kiedyś w samym programie Compojure (ponieważ cała funkcjonalność czkawki była częścią Compojure). Jest to dość prosta funkcja, którą można łatwo napisać samemu.

(defn escape-html 
    "Change special characters into HTML character entities." 
    [text] 
    (.. #^String (as-str text) 
    (replace "&" "&amp;") 
    (replace "<" "&lt;") 
    (replace ">" "&gt;") 
    (replace "\"" "&quot;"))) 

Jest też clojure.contrib.string/escape, który bierze mapę char -> ciąg sekwencji ucieczki i łańcuch i uchodzi to za Ciebie.

user> (clojure.contrib.string/escape {\< "&lt;" \> "&gt;"} "<div>foo</div>") 
"&lt;div&gt;foo&lt;/div&gt;" 

To wydaje mi się nie tak dobre, jak to może być, bo może chcesz sekwencje wieloznakowych i nie pozwolę ci. Może to jednak pomóc w wychodzeniu z HTML-a.

Oczywiście istnieje wiele bibliotek Java. Można użyć StringEscapeUtils z Apache Commons:

(org.apache.commons.lang.StringEscapeUtils/escapeHtml4 some-string) 

To uderza mnie jako heavyweight bitowej na ten cel chociaż.

+1

Poprawny adres URL do StringEscapeUtils http://commons.apache.org/lang/api-release/org/apache/commons/lang/StringEscapeUtils.html – grm

+0

Zaktualizowany adres URL http://commons.apache.org/proper/commons- lang/javadocs/api-3.1/org/apache/commons/lang3/StringEscapeUtils.html –