2010-05-24 18 views

Répondre

3

Il s'avère qu'Enlive échappe HTML par défaut si vous utilisez net.cgrand.enlive-html/content pour mettre du texte dans un élément HTML.

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

Mise à jour: Je savais qu'il devait y avoir plus que ça ...

ring.util.codec de ring-core a une fonction appelée qui fonctionnent comme ceci:

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

Ce sont des emballages autour java.net.URLEncoder et java.net.URLDecoder . Le même espace de noms fournit des fonctions pour traiter le codage Base64, basé sur une classe d'Apache Commons.


La réponse originale suit.

Je ne suis pas certain qu'il y ait une fonction publique de le faire, mais Enlive a deux fonctions privées appelées xml-str et attr-str qui font ceci: (. attr-str échappe également ")

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

Vous pouvez obtenir à cette fonction avec @#'net.cgrand.enlive-html/xml-str (Clojure n'a pas tendance à faire les choses vraiment privé ...) ou simplement le copier dans votre propre espace de noms.

+0

C'est un peu décevant. Cela ressemble à un oubli majeur dans la plupart des frameworks web de Clojure. –

+1

Apparemment, la situation n'est pas si mauvaise: voir la réponse mise à jour.:-) –

+1

On dirait que j'étais un peu hâtive de blâmer Enlive, mais merci quand même. :) –

17

hiccup.util/escape-html dans hiccup le fait. Cette fonction était auparavant dans Compojure (puisque toutes les fonctionnalités de hoquet faisaient partie de Compojure). C'est une fonction assez simple que vous pourriez facilement écrire vous-même.

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

Il y a aussi clojure.contrib.string/escape, qui prend une carte de Char -> séquences d'échappement de chaîne et une chaîne et il échappe pour vous.

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

Cela me paraît pas aussi utile qu'elle pourrait l'être, parce que vous pouvez échapper à des séquences multi-caractères et cela ne vous laissera pas. Mais cela pourrait fonctionner pour vos besoins d'échappement HTML.

Et puis il y a beaucoup de bibliothèques Java pour cela, bien sûr. Vous pouvez utiliser StringEscapeUtils de Apache Commons:

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

Cela me frappe comme un poids lourd de peu à cet effet si.

+1

L'URL correcte de StringEscapeUtils http://commons.apache.org/lang/api-release/org/apache/commons/lang/StringEscapeUtils.html – grm

+0

Mise à jour de l'URL http://commons.apache.org/proper/commons- lang/javadocs/api-3.1/org/apache/commons/lang3/StringEscapeUtils.html –