转换为 Markdown 时在 pandoc 中保留自定义代码块属性

Keep custom code block attributes in pandoc when converting to Markdown

我正在将 org 文件转换为 Markdown(特别是 commonmark)。我正在向我的代码块添加自定义属性,commonmark 编写器不支持该属性,并在转换期间将它们从代码块中删除。我正在尝试找到一种方法来保留我的自定义属性。

这是我的:

#+begin_src python :hl_lines "2"
def some_function():
    print("foo bar")
    return
#+end_src

这就是我想要的 .md 文件:

``` python hl_lines="2"
def some_function():
    print("foo bar")
    return
```

经过一些研究,我认为过滤器可以解决我的问题:我现在正在使用 panflute,一个用于编写 pandoc 过滤器的 python 库。

我发现了一些相关问题,但它们适用于其他转换 (, rst -> latex),而且我还不够了解 Lua 无法将代码翻译成 Python 和组织 - > md 转换。

感谢您的帮助。

我能够编写一个脚本,并将其发布在这里以供将来基于 Python 的有关 pandoc 过滤器的问题。

下面的过滤器需要 panflute, but there are other libs 用于 Python 中的 pandoc 过滤器。

import panflute


def keep_attributes_markdown(elem, doc, format="commonmark"):
    """Keep custom attributes specified in code block headers when exporting to Markdown"""
    if type(elem) == panflute.CodeBlock:
        language = "." + elem.classes[0]
        attributes = ""
        attributes = " ".join(
            [key + "=" + value for key, value in elem.attributes.items()]
        )
        header = "``` { " + " ".join([language, attributes]).strip() + " }"
        panflute.debug(header)

        code = elem.text.strip()

        footer = "```"

        content = [
            panflute.RawBlock(header, format=format),
            panflute.RawBlock(code, format=format),
            panflute.RawBlock(footer, format=format),
        ]
        return content


def main(doc=None):
    return panflute.run_filter(keep_attributes_markdown, doc=doc)


if __name__ == "__main__":
    main()

您现在可以运行以下命令:

pandoc --from=org --to=commonmark --filter=/full/path/to/keep_attributes_markdown.py --output=target_file.md your_file.org