0

这是一种极端情况。我正在运行 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)。最后,这不会太难。

4

1 回答 1

1

这样做的唯一方法是自己构建节点,如下所示:

Element "a" [("href", "abcdefg")] [Element "img" [("src", "image.png")]]

...或通过解析器运行您的标记。这是设计使然。的内容TextNode将始终被转义。XmlHmtl 不是为 pandoc 风格的降价设计的。它是为 XML 和 HTML 设计的。所以你必须先把你的文件变成那种格式。在我看来,您应该能够使用 pandoc 将 markdown 呈现为 HTML,然后在其上运行 XmlHtml 解析器。

XmlHtml 确实具有将文档的某些部分解释为原始文本的机制(根据 HTML 规范的要求)。您可以在此处查看哪些标签被解释为原始文本。在 0.2.2 中,我们更新了 XmlHtml,让用户可以更好地控制哪些内容被视为原始文本。如果您希望将节点视为原始节点,只需将xmlhtmlRaw属性添加到标签即可。如果您希望默认情况下被视为原始节点的节点不被视为原始节点,请添加该xmlhtmlNotRaw属性。

我不知道为什么renderHtmlNodes . writeHtml def不适合你。看起来应该可以。如果它不起作用,我认为 Pandoc'swriteHtml可能有问题。由于这不起作用,您可以尝试parseHtml . writeHtmlString(伪代码)。

于 2013-10-06T18:17:50.897 回答