如何将 Markdown 解析为 AST,对其进行操作,然后将其写回 Markdown?

use*_*351 13 javascript markdown abstract-syntax-tree

我想以编程方式修改 Markdown 文件。

我一直在研究 Markdown 解析器并尝试了其中的一些;即 Marked、Markdown-it 和 Commonmark。他们允许访问 AST,这使我可以轻松修改内容。

问题是它们仅呈现为 HTML。我找不到任何有关渲染回 Markdown 的信息。

我现在看到两个选择,要么为这些库之一编写自定义渲染器(这将非常耗时),要么使用单独的工具将 HTML 转换回 Markdown。

有更简单的选择吗?为什么 Markdown 解析器只渲染为 HTML?

vas*_*vas 5

最好的选择就是您最初想做的事情!

有许多 Markdown 解析器可以生成 AST,其中很多可以将其渲染回 Markdown!

为什么 Markdown 解析器只渲染为 HTML?

他们中的许多人这样做的原因是因为Markdown 的首要用途是作为 HTML 的源代码。Markdown 甚至一开始就是为此而设计的。因此,Markdown 解析器最常见的用途(包括人们想要首先操作 AST 的情况)是输出 HTML。

也就是说,真正好的库包含渲染为其他格式的选项,包括返回 Markdown。

以下是我已经知道可以做到这一点的库:

潘多克

可能是世界上第一的 Markdown 工具包。Pandoc 的母语是 Haskell,但也有 Javascript 包装器(只需搜索 npm)。如果您以后打算做很多 Markdown 的事情,那么无论如何,了解 Pandoc 可能是有意义的。

它对过滤器的支持“都是关于 AST 操作的。它对 Lua 和Lua 过滤器有特殊支持,这可能是最容易编码的,但您也可以用其他语言编写过滤器:Python、PHP、Perl、Javascript/Typescript、Groovy ,鲁比。

它支持 Markdown 以及大量其他格式的渲染器。

它的解析器和渲染器有许多其他选项,可能会让您的工作变得更加轻松,或者可能已经完全满足您的要求。人们编写的许多过滤器可能已经可以满足您的需求。

CMark

尽管 CommonMark 的参考实现是用 C 编写的,但仍有许多Node 包装器。甚至还有使用 Emscripten 的 JavaScript 移植。它移植了 GitHub 扩展,以便表和其他 GFM 事物也可以在 AST 中操作。

它可以输出 CommonMark、HTML 和 LaTeX,甚至是 AST 的 XML 表示形式。

评论

专门围绕 AST 操作设计的基于 Javascript 的框架。我从未使用过它,但它可能有使 AST 操作更容易的工具,尽管我只是猜测。