2013-05-16 7 views
7

Ich habe ein Problem ähnlich wie ich einige auf Stackoverflow gefunden habe, aber nicht ganz das Gleiche. Ich möchte die Lösung auf die folgende Frage vermeiden:Unescaping HAML in einem Attribut Hash

https://stackoverflow.com/a/10407782/996587

Grundsätzlich möchte folgende HTML-Ausgabe:

<div class='myclass' extraattr='UNESCAPED <>& CONTENT'> 
    Content... 
</div> 

Die HAML Ich verwende sieht wie folgt aus:

.myclass{ "extraattr" => "UNESCAPED <>& CONTENT" } 
    Content... 

Ich kann nicht ganz herausfinden, wie der Inhalt ausgegeben wird, wie ich will. Versucht, das Ende der Zeichenfolge Anwendung .html_safe, bekam aber den folgenden Fehler:

nicht definierte Methode `html_safe‘ für ‚unescaped <> & CONTENT‘: String

Später erkannte, dass für diese spezielle Anwendung ich bin nicht mit Rails, nur Ruby + HAML. (Ich erbte dieses Projekt und ich fange gerade an, HAML, Ruby und Schienen irgendwie zu lernen)

Und wieder, für diejenigen von Ihnen zu faul, um Links zu klicken und die Lösung nicht gelesen habe, die ich erwähnte, I ' d bevorzugen, HAML nicht zu konfigurieren, um attrs für die gesamte Datei nicht zu entkommen, nur für dieses eine Attribut.

Danke!

UPDATE

Ich habe gerade die: einfachen Filter, und war in der Lage zu bekommen, was ich mit, dass wollte. Wenn es jedoch einen Trick gibt, von dem ich nichts weiß, damit ich nicht den ganzen HTML-Code schreiben muss, würde ich das schätzen. Mein "fix":

:plain 
    <div class='myclass' extraattr='UNESCAPED <>& CONTENT'> 
    Content... 
    </div> 
+0

die Verwendung von: plain die Konsistenz der haml brechen ... gibt es eine etwas besser? – chfw

Antwort

0

Haben Sie versucht, eine \ mit den Charakteren zu entkommen.

{ :myattr => '\<\>\&' }

+0

Ja "fliehende" Zeichen führen dazu, dass der umgekehrte Schrägstrich ignoriert wird, aber das Zeichen wird maskiert. Ich habe sogar versucht, mit einem Schrägstrich zu entkommen, nur weil HAML verrückt war. Kein Glück :) – thexfactor

4

Es ist (derzeit) nicht eine Möglichkeit für ein individuelles Attribut in Haml auszuschalten Flucht außerhalb von Rails, es ist alles oder nichts, um die :escape_attrs Option. Je nachdem, was Sie wollen, könnte es sich lohnen, die :once option zu betrachten.

Wenn Haml in Rails verwendet wird, ersetzt es die HTML-Escaping-Methoden durch einige, die den von ActiveSupport hinzugefügten Wert html_safe respektieren (siehe lib/haml/helpers/xss_mods.rb).

Es ist möglich, diese Methoden außerhalb von Rails zu verwenden, wenn Sie möchten. Sie müssen die Methoden html_safe und html_safe? der String-Klasse hinzufügen, damit dies funktioniert (seien Sie vorsichtig, dieses Beispiel ist nur eine "arme" Version des vollständigen XSS-Schutzes, den Rails bietet, es schützt Sie nicht wirklich von viel, aber es wird selektives Entkommen von Attributen erlauben).

Fügen Sie den folgenden irgendwo nach erfordern Haml (es am besten in einer eigenen Datei sein könnte, die erforderlich wird):

class String 
    def html_safe? 
    defined?(@html_safe) && @html_safe 
    end 

    def html_safe 
    @html_safe = true 
    self 
    end 
end 

require 'haml/helpers/xss_mods' 

module Haml::Helpers 
    include Haml::Helpers::XssMods 
end 

Jetzt können Sie html_safe auf die Saiten verwenden, und Haml sie nicht entkommen:

.myclass{ "extraattr" => "UNESCAPED <>& CONTENT".html_safe, 
      "otherextraattr" => "ESCAPED <>& CONTENT"} 
    Content... 

Ausgang:

<div class='myclass' extraattr='UNESCAPED <>& CONTENT' otherextraattr='ESCAPED &lt;&gt;&amp; CONTENT'> 
    Content... 
</div>