2011-01-01 12 views
2

Ich benutze Snap Framework mit Heist Templating Engine. Das Problem ist, dass Heist korrumpiert JavaScript-Code in HTML inlined:Wie man Javascript in der Überfallvorlage vor der Flucht bewahren kann?

<script type="text/javascript">alert('hello');</script> 

Verwandelt in:

<script type="text/javascript">alert(&apos;hello&apos;);</script> 

Wie kann ich Heist sagen Inhalt des script Tag zu bewahren?

Edit: ich nur solche Splice implementiert:

verbatimSplice :: MonadIO m => Splice m 
verbatimSplice = do 
    node <- getParamNode  -- get <script> node 
    stopRecursion    -- stop recursive processing of splices 
    lift $ liftIO $ print node -- show me the node 
    return [node]    -- return <script> as is 

Aber Bindung dieses Spleiß Script-Tag hilft nicht. Er druckt

Element "script" [("type","text/javascript")] [Text "alert('hello');"] 

so, denke ich, html Einheit Substitution erfolgt nach alle Spleißstellen läuft.

+0

Heh, das ist amüsant. Technisch gesehen sollte letzteres funktionieren (nach Spezifikationen und anderem), aber natürlich ist die Browser-Compliance in diesem Bereich nicht korrekt. Wenn Heist keine besonderen Vorkehrungen für Script-Tags hat, könnte das ein wenig schwierig sein: Du musst jeden Kommentar verwenden, den Hokuspokusmenschen heutzutage verwenden. –

+0

@Edward, Es ist schade, aber Firefox (mindestens 3.6.13) versteht das letztere Skript nicht. Können Sie auf Spezifikationen verweisen, die erklären, warum es sollte? –

Antwort

2

Heist verwendet Hexpat für seine Verarbeitung. Ich glaube, das Problem hier ist, dass hexpat expat verwendet, was wohlgeformtes XML erfordert. Leider sind HTML-Dokumente mit Inline-Javascript nicht gültig, daher entgeht es ihnen. Wir sind uns dieses Problems bewusst. Die Lösung besteht darin, zu einem HTML5-Parser anstelle eines XML-Parsers zu wechseln. Leider gibt es keine guten HTML5-Parsing-Bibliotheken für Haskell.

Bis dahin ist die Lösung, alle Ihre Javascript aus Vorlagen in externe Dateien zu verschieben. Wir sind uns bewusst, dass dies auf lange Sicht keine angemessene Lösung ist. Wir planen, entweder einen zu schreiben oder zu einem zu wechseln. Beiträge in diesem Bereich würden sehr geschätzt werden.

Update:

Ab Februar 2011 hat Heist wechselte von hexpat mit eigenen benutzerdefinierten HTML-Parsing-Bibliothek namens XmlHtml verwendet, die dieses Problem löst.

+0

Danke. Eine weitere Unannehmlichkeit ist, dass hexpat leere Knoten normalisiert, aber '' setzen. –

1

Im Idealfall würden Sie Ihr Skript in CDATA-Tags wickeln

<script> 
//<!CDATA[ 
    alert('hello'); 
//]]> 
</script> 

die es gültige XML machen würde.

Leider scheint Heist diese zu ignorieren.

+0

IIRC Dies ist ein Hexpat/Expat-Problem. Auch hier wäre ein neuer HTML5-kompatibler Parser wirklich nett. – mightybyte