2010-05-24 14 views

Respuesta

3

Resulta que Enlive hace escapa HTML de forma predeterminada si usa net.cgrand.enlive-html/content para poner texto en un elemento HTML.

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

Actualización: Me sabía que tenía que ser más que eso ...

ring.util.codec de ring-core tiene una funciones llamadas que funcionan de esta manera:

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

Estos son envolturas alrededor java.net.URLEncoder y java.net.URLDecoder . El mismo espacio de nombres proporciona funciones para tratar con la codificación Base64, basada en una clase de Apache Commons.


Responde la respuesta original.

no estoy seguro de si hay una función pública para hacer esto, pero Enlive tiene dos funciones privadas llamadas y xml-strattr-str, que haga lo siguiente: (. attr-str también escapa ")

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

Puede obtener esa función con @#'net.cgrand.enlive-html/xml-str (Clojure no tiende a hacer cosas realmente privado ...) o simplemente cópielo en su propio espacio de nombres.

+0

Eso es un poco fastidioso. Suena como un gran descuido en la mayoría de los marcos web de Clojure. –

+1

Aparentemente la situación no es tan mala: ver la respuesta actualizada.:-) –

+1

Parece que fui un poco apresurado para culpar a Enlive, pero gracias de todos modos. :) –

17

hiccup.util/escape-html en hiccup lo hace. Esa función solía ser en la propia Compojure (ya que toda la funcionalidad en hipo solía ser parte de Compojure). Sin embargo, es una función bastante simple que usted mismo podría escribir fácilmente.

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

También hay clojure.contrib.string/escape, que tiene un mapa de Char -> cadena de secuencias de escape y una cadena y se escapa por usted.

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

Esto me parece no es tan útil como podría ser, ya que es posible que desee escapar de secuencias de caracteres múltiples y esto no va a dejar. Pero podría funcionar para sus necesidades de escape de HTML.

Y luego hay muchas bibliotecas de Java para esto, por supuesto. Se podría utilizar StringEscapeUtils de Apache Commons:

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

Esto me parece un poco pesado para este propósito sin embargo.

+1

La URL correcta para StringEscapeUtils http://commons.apache.org/lang/api-release/org/apache/commons/lang/StringEscapeUtils.html – grm

+0

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

Cuestiones relacionadas