这是一种极端情况。我正在运行 Haskell,Text.XmlHtml(版本 0.2.3)。我从 Pandoc(1.12 版)获取源数据。我的源文件都是 Markdown 格式。
当我在我的 Markdown 文件中直接有原始 Html 时,角落处理。当然,这是 Markdown 格式支持的,有时是我获得所需表格布局的唯一方法。Pandoc 读取文件只是文件,但是当它到达 Html 部分时,它发出的内容大致是这样的:
[ RawInline (Format "html") "<a href=\"abcdefg\">"
, RawInline (Format "html") "<img src=\"image.png\" />"
, RawInline (Format "html") "</a>" ]
所以......将其转换为分层树可能会变得非常复杂。在 XmlHtml 中,期望的结果是这样的:
Element "a" [("href", "abcdefg")] [Element "img" [("src", "image.png")]]
但是,当我处理一个层次结构(Pandoc 发出的所有其他东西都是层次结构很好)并且突然不是层次结构时,这很难得到,但是“非层次结构”部分只能通过基本上构建一个 Html 解析器来找到。这适用于围绕其他结构的多个字符串。
理想情况下,我想发出一个简单的TextNode:
TextNode "<a href=\"abcdefg\"><img src=\"image.png\" /></a>"
我可以通过发出一堆 TextNode 来做到这一点,每个 RawInline 一个,或者将 RawInline 元素混合在一起。关键是我想发出一个包含原始 Html 的 TextNode 并最终呈现它而没有任何额外的 Html 转义。
我的渲染器最终是一个 Heist 片段,但这可能意味着它通过 Blaze 运行。
我的最后一个可能可行的替代方案是从 Pandoc 通过 Blaze Html 渲染器,然后通过 XmlHtml 解析器来获取可以嵌入到 Heist 片段中的内容。我只是想避免这种情况,因为它感觉很脏。
(我想如果我想将 Java 脚本放入我的 Markdown 文档中,我实际上会遇到同样的问题......这在语言技术上是允许的,但可能非常邪恶。)
有没有办法做到这一点,还是我受到工具的限制?
更新
我尝试了从 Pandoc 到 Blaze 到 XmlHtml 的渲染路线。事实证明,我得到了相同的结果,将 Html 放入最终节点中逃脱并因此出现在浏览器中。这是我的功能(它比我完成的完整实现更短更容易......)
pandocToHtml :: Pandoc.Pandoc -> [XmlHtml.Node]
pandocToHtml = Text.Blaze.Renderer.XmlHtml.renderHtmlNodes . Pandoc.writeHtml Pandoc.def
Pandoc.def 包括所有“allow_raw_*”扩展,包括allow_raw_html。
我能想到的最后一件事是应用我自己的零碎 html 解析器(然后可能将其贡献给 Pandoc)。最后,这不会太难。