这是一个极端的案例。我正在运行Haskell,Text.XmlHtml(版本0.2.3)。我从Pandoc(版本1.12)获取源数据。我的源文件都是Markdown格式。
当我在Markdown文件中直接使用原始Html时,角落会处理。当然,这是由Markdown格式支持的,有时候这是我获得我想要的那种Table布局的唯一方法。 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>"
我可以通过发送一堆TextNodes,每个RawInline一个,或者将RawInline元素组合在一起来做到这一点。关键是我要发出一个TextNode,其中包含原始Html,并最终呈现而没有任何额外的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)。最终,这不会非常困难。
答案 0 :(得分:1)
执行此操作的唯一方法是自己构建节点:
Element "a" [("href", "abcdefg")] [Element "img" [("src", "image.png")]]
...或通过解析器运行您的标记。这是设计的。 TextNode
的内容将始终转义。 XmlHmtl不是为pandoc样式降价而设计的。它专为XML和HTML而设计。因此,您必须先将文档转换为该格式。在我看来,你应该能够使用pandoc将markdown呈现为HTML,然后在其上运行XmlHtml解析器。
XmlHtml确实有一种机制,可以将文档的某些部分解释为原始文本(根据HTML规范的要求)。您可以看到哪些标记被解释为原始文本here。在0.2.2中,我们更新了XmlHtml以向用户more control over what gets treated as raw text提供。如果您希望将节点视为原始节点,只需将xmlhtmlRaw
属性添加到标记即可。如果您希望默认情况下被视为原始的节点不被视为原始节点,则添加xmlhtmlNotRaw
属性。
我不确定为什么renderHtmlNodes . writeHtml def
不适合你。看起来这应该有效。如果它不起作用,我认为Pandoc的writeHtml
可能是错误的。由于这不起作用,您可以尝试parseHtml . writeHtmlString
(伪代码)。