我正在使用带有Heist模板引擎的Snap框架。问题是Heist破坏了内嵌到html中的javascript代码:
<script type="text/javascript">alert('hello');</script>
转变为:
<script type="text/javascript">alert('hello');</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实体替换是在运行所有拼接之后发生的。
答案 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。
唉,海斯特似乎忽略了这些。