2

私はHeistテンプレートエンジンでSnapフレームワークを使用しています。問題は、Heistがhtmlにインライン化されたjavascriptコードを破損することです。

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

に変換:

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

scriptタグの内容を保持するようにHeistに指示するにはどうすればよいですか?

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

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

ただし、このスプライスをスクリプトタグにバインドしても効果はありません。印刷します

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

したがって、htmlエンティティの置換は、すべてのスプライスを実行した後に行われると思います。

4

2 に答える 2

2

Heistは、処理にhexpatを使用します。ここでの問題は、hexpatがexpatを使用していることだと思います。これには、整形式のXMLが必要です。残念ながら、インラインJavaScriptを使用したHTMLドキュメントは無効であるため、エスケープされます。私たちはこの問題を認識しています。解決策は、XMLパーサーではなくHTML5パーサーに切り替えることです。残念ながら、Haskellに適したHTML5解析ライブラリはありません。

それが起こるまで、解決策はすべてのJavaScriptをテンプレートから外部ファイルに移動することです。これは長期的には適切な解決策ではないことを認識しています。最終的には、1つ書くか、1つに切り替える予定です。この分野での貢献をいただければ幸いです。

アップデート:

2011年2月の時点で、Heistはhexpatの使用から、この問題を解決するXmlHtmlと呼ばれる独自のカスタムHTML解析ライブラリの使用に切り替えました。

于 2011-01-02T03:32:27.817 に答える
1

理想的には、スクリプトをCDATAタグでラップします

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

これにより、有効なXMLになります。

悲しいかな、ハイストはこれらを無視しているようです。

于 2011-01-02T04:27:31.783 に答える