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

How does this Haskell Pandoc filter work?

我想用Pandoc来合并多个Markdown文件。这样做时,我希望每个文件的前文或元数据在合并之前在文档顶部生成自定义 Markdown。我找到了这个 SO post answer which appears to do what I want, but I don't sufficiently understand Pandoc filters or the Haskell for the proposed filter。我试图将 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) 但没有看到看起来像元数据或文件 header 的 object。感谢您的帮助。

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

因此,跳过您需要的所有详细信息,从

开始
import Text.Pandoc.JSON

main :: IO ()
main = toJSONFilter myFunc

并实现 myFunc,一个接受一些 Walkable 东西并产生相同改变的东西的函数。在你的例子中,那个东西是 Pandoc,一个顶级 AST 节点,IIRC。

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

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