2010-05-27 11 views
2

J'utilise Maruku avec mon application RoR3. Mais le problème est que lorsque j'utilise la méthode h(text) pour échapper le texte de la base de données avant d'utiliser Maruku, il échappe > à > alors Maruku ne verra pas cela comme un blockquote.Rail 3 s'échappant maruku

Mais je veux toujours échapper au reste du texte alors ma question est comment puis-je faire ce travail?

Je ne veux pas désactiver la fuite, mais je ne veux pas échapper >

Répondre

0

La méthode suivante prend des chaînes html_encoded multilignes et remplace tous les éléments blockquote de Maruku qui ont été converties en codes entité html Retour à >

Dans le cadre de cette implémentation, une ligne de bloc de maruku est définie comme une ligne commençant par une ou plusieurs séquences > séparées par des espaces blancs facultatifs.

def maruku_escape(text) 
    text.gsub(/^([\s]*\>)+/) {|match| match.gsub(/\>/, '>')} 
end 

La chaîne de test suivant a été utilisé

test_text = "<b>A bold tag</b> 
<span>Some text in a span</span> 

Some Markdown 
> Blockquote 1 
    > > nested blockquote 1 
    > > nested blockquote 2 
    >> nested blockquote 3 with no spaces 


Some plain text with an invalid blockquote > Some blockquote text 
<i>The end in italics<i>" 

Et en utilisant cela comme suit maruku_text = maruku_escape(ERB::Util.html_escape(test_text))

donné les résultats suivants

result = "&lt;b&gt;A bold tag&lt;/b&gt; 
&lt;span&gt;Some text in a span&lt;/span&gt; 

Some Markdown 
> Blockquote 1 
    > > nested blockquote 1 
    > > nested blockquote 2 
    >> nested blockquote 3 with no spaces 


Some plain text with an invalid blockquote &gt; Some blockquote text 
&lt;i&gt;The end in italics&lt;i&gt; 
" 
+0

Quelqu'un avec une meilleure regex-fu que moi peut être capable de travailler sur une regex qui n'appelle pas gsub deux fois. –

+2

Veuillez également noter que Rails 3 appelle automatiquement html_escape pour vous. –

3

Rails 3 échappe toutes les chaînes by default. Vous devez les marquer comme sûrs en utilisant "some_string.html_safe" ou utiliser <% = raw some_string%> dans le modèle si vous voulez éviter cela.

Si vous configurez le sanitize helper pour permettre aux balises HTML que vous voulez passer à travers, vous pouvez faire quelque chose comme ceci:

<%= sanitize(@maruku_content.to_html) %> 

Désinfecter frottera votre contenu et marquer la sortie comme html_safe tout en laissant les balises souhaitées intact. Cette option est décrite dans le document plugins rails_xss here. L'exemple qu'ils utilisent est pour le textile.

+0

Je ne pense pas que l'aseptisation fonctionnera bien car maruku est un balisage mais pas html. En particulier, il utilise> pour indiquer des blockquotes. –

+0

Utilisez-vous Maruku pour produire du HTML ou du LaTex? Si c'est pour du HTML, alors l'exemple ci-dessus fait l'affaire car il échappe à la sortie HTML de Maruku, pas au Markdown stocké. Markdown -> Représentation interne de Maruku -> HTML -> assainir – Awgy

+0

Même si cela a été fait dans l'autre sens, assainir ne modifiera pas un nu>. Seulement si cela fait partie de quelque chose de méchant comme