1

我正在将 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 -> htmlrst -> latex),而且我不知道足够的 Lua 将代码转换为 Python 和 org -> md 转换。

谢谢你的帮助。

4

1 回答 1

0

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

下面的过滤器需要panflute,但 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 
于 2022-01-16T18:51:44.920 回答