【问题标题】:How does this Haskell Pandoc filter work?这个 Haskell Pandoc 过滤器是如何工作的?
【发布时间】:2020-05-19 15:27:37
【问题描述】:

我想使用 Pandoc 来合并多个 Markdown 文件。这样做时,我希望每个文件的 frontmatter 或元数据在合并之前在文档顶部生成自定义 Markdown。我发现这个SO post answer 似乎可以满足我的要求,但我对proposed filter 的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,但我不知道如何编写一个仅在文档顶部插入标题信息的条件。我在调理什么?我尝试dir(pandocfilters),但没有看到看起来像元数据或文件头的对象。感谢您的帮助。

【问题讨论】:

    标签: haskell pandoc


    【解决方案1】:

    是的,要理解toJSONFilter 有点困难,因为它涉及到对 Haskell 类型类的理解(而且这种类型类也不是很常见,因为它的实例是函数)。但好消息是您并不需要真正理解它,因为它是一个帮助函数,可将您的自定义逻辑包装到适当的 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 包含文档Blocks 的列表,并且您想在开头添加一些块,您的myFunc 也应该在Pandoc 上运行,就像您的示例一样。

    【讨论】:

    • 感谢您的帮助。不幸的是,这并不能真正解决我的问题,因为pandocfilters 似乎没有一个名为Pandoc 的对象,它代表顶级AST 节点。如果没有其他帮助,我会在几天后接受这个答案。
    • 为什么不在 Haskell 中实现呢?我相信,这比你想象的要容易。通过电子邮件或 Freenode 上的 IRC #haskell-FreeBSD 与我联系,我很乐意为您提供帮助。
    猜你喜欢
    • 2015-11-24
    • 2021-10-02
    • 1970-01-01
    • 2015-12-22
    • 1970-01-01
    • 2019-11-05
    • 2017-12-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多