2011-01-01 3 views
2

私は、SnapフレームワークとHeistテンプレートエンジンを使用しています。問題は、JavaScriptコードヘイストの腐敗がHTMLにインライン化ということである。ヘイストテンプレートのjavascriptをエスケープしないで保存するには?

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

は変身:

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

がどのように私はscriptタグの内容を保存するために強盗を伝えることができますか?

編集:私はちょうどそのようなスプライスを実装

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 

しかし、スクリプトタグにこのスプライスを結合しても解決しません。それはすべてのスプライスを実行した後にhtmlエンティティの置き換えが行われると思います。

+0

こんにちは、面白いです。技術的には、後者が(仕様に準拠して)動作するはずですが、もちろん、この分野のブラウザコンプライアンスは不十分です。 Heistにスクリプトタグの特別な規定がない場合は、これはちょっと難しいかもしれません。あなたは最近、どんなコメントをしても邪魔にならないコメントを使用する必要があります。 –

+0

@エドワード、残念だが、Firefox(少なくとも3.6.13)は後者のスクリプトを理解していない。それがなぜ必要なのかを説明するスペックを指すことができますか? –

答えて

2

Heistは、処理にhexpatを使用します。ここでの問題は、hexpatがexpatを使用していることです。expatは整形式のXMLを必要とします。残念ながら、インラインJavaScriptを使用したHTML文書は有効ではないので、それらをエスケープします。私たちはこの問題を認識しています。解決策は、XMLパーサの代わりにHTML5パーサに切り替えることです。残念ながら、Haskell用のHTML5解析ライブラリはありません。

これまでの解決策は、テンプレートからすべてのjavascriptを外部ファイルに移動することです。私たちはこれが長期的には適切な解決策ではないことを認識しています。我々は最終的に1つを書くか、または1つに切り替えるつもりです。この分野の貢献は非常に高く評価されるでしょう。

更新日:2011年2月の時点で

、ヘイストはこの問題を解決XmlHtmlと呼ばれる当社独自のカスタムHTML構文解析ライブラリを使用してhexpatを使用してから切り替えました。

+0

ありがとうございます。もう一つの不都合は、hexpatが空の数字を ノードに正規化するが、 ''の間に何か(1スペースで十分です)を入れる必要があります。 –

1

理想的には、それ有効なXMLになるだろうCDATAタグ

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

でスクリプトをラップします。

悲しいかな、強盗はこれらを無視しているようです。

+0

IIRCこれはhexpat/expatの問題です。ここでも、新しいHTML5準拠のパーサーが本当にうれしいでしょう。 – mightybyte

関連する問題