如何保存heist模板中的javascript逃脱?

时间:2011-01-01 13:14:23

标签: haskell template-engine heist

我正在使用带有Heist模板引擎的Snap框架。问题是Heist破坏了内嵌到html中的javascript代码:

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

转变为:

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

如何告诉Heist保留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

但是将此拼接绑定到脚本标记并没有帮助。它打印

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

所以,我认为,html实体替换是在运行所有拼接之后发生的。

2 个答案:

答案 0 :(得分:2)

Heist使用hexpat进行处理。我相信这里的问题是hexpat使用expat,这需要格式良好的XML。不幸的是,带有内联javascript的HTML文档无效,因此它会逃脱它们。我们意识到了这个问题。解决方案是切换到HTML5解析器而不是XML解析器。不幸的是,Haskell没有好的HTML5解析库。

在此之前,解决方案是将所有javascript从模板中移出到外部文件中。我们意识到这不是一个长期的适当解决方案。我们计划写一个或最终切换到一个。非常感谢在这方面的贡献。

更新

截至2011年2月,Heist已经从使用hexpat转向使用我们自己的自定义HTML解析库XmlHtml来解决这个问题。

答案 1 :(得分:1)

理想情况下,您可以将脚本包装在CDATA标签中

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

这会使它成为有效的XML。

唉,海斯特似乎忽略了这些。