繁体   English   中英

这个 Haskell Pandoc 过滤器如何工作?

[英]How does this Haskell Pandoc filter work?

我想使用 Pandoc 合并多个 Markdown 文件。 这样做时,我希望每个文件的 frontmatter 或元数据在合并之前在文档顶部生成自定义 Markdown。 我发现这个SO post answer似乎可以满足我的要求,但我对 Pandoc 过滤器或建议过滤器的 Haskell 的理解不够。 我尝试将 Haskell 翻译成 Python 是这样的:

from pandocfilters import Header
from pandocfilters import toJSONFilter


def insertMeta(key, value, format, meta):
    if ???:
        return Header(meta['title'], [], [])


if __name__ == "__main__":
    toJSONFilter(insertMeta)

我知道toJSONFilter将遍历文档的 AST,但我不知道如何编写一个条件,只在文档顶部插入 header 信息。 我在调理什么? 我试图dir(pandocfilters)但没有看到看起来像元数据或文件头的 object。 谢谢你的帮助。

是的,要理解toJSONFilter有点困难,因为它涉及理解 Haskell 类型类(并且这种类型 class 也不是很常见,因为它的实例是函数)。 但好消息是您并不需要真正理解它,因为它是一个帮助程序 function 将您的自定义逻辑包装到适当的 Pandoc 过滤器中。

所以,跳过你需要的所有细节开始

import Text.Pandoc.JSON

main :: IO ()
main = toJSONFilter myFunc

并实现myFunc ,一个Walkable ,它采用一些可步行的东西并产生相同的改变的东西。 在您的示例中,那个东西是Pandoc ,一个顶级 AST 节点 IIRC。

您可以在此处查找可步行物品的完整列表: Walkable ://hackage.haskell.org/package/pandoc-types/docs/Text-Pandoc-Walk.html#t:Walkable

由于Pandoc包含文档Block的列表,并且您想在开头添加一些块,因此您的myFunc也应该在Pandoc上运行,就像您的示例一样。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM