Haskell Pandoc过滤器如何工作?

问题描述 投票:1回答:1

我想使用Pandoc合并多个Markdown文件。这样做时,我希望每个文件的前题或元数据在合并之前在文档顶部生成自定义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个回答
2
投票

是的,要想掌握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包含文档Block的列表,并且您想在开头添加一些块,所以myFunc也应像您的示例一样在Pandoc上进行操作。

© www.soinside.com 2019 - 2024. All rights reserved.