这个 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
进行操作,就像你的例子一样。
我想用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
进行操作,就像你的例子一样。