2

我正在使用带有 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实体替换发生在运行所有拼接之后。

4

2 回答 2

2

Heist 使用 hexpat 进行处理。我认为这里的问题是 hexpat 使用 expat,这需要格式良好的 XML。不幸的是,带有内联 javascript 的 HTML 文档无效,因此它会对其进行转义。我们知道这个问题。解决方案是切换到 HTML5 解析器而不是 XML 解析器。不幸的是,Haskell 没有好的 HTML5 解析库。

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

更新:

自 2011 年 2 月起,Heist 已从使用 hexpat 切换到使用我们自己的自定义 HTML 解析库 XmlHtml 来解决这个问题。

于 2011-01-02T03:32:27.817 回答
1

理想情况下,您会将脚本包装在 CDATA 标记中

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

这将使它成为有效的 XML。

唉,Heist 似乎忽略了这些。

于 2011-01-02T04:27:31.783 回答