检测并替换降价文档中的文本段落

Detect and replace text paragraph in a markdown document

我正在努力编写/使用现有的降价解析器之一来查找并替换降价文档中的每个文本段落,并保持其他一切不变。

示例输入:

# A First Level Header

## Second Level Header

Now is the time for all good men to come to the aid of their country. This is just a regular paragraph.

The quick brown fox jumped over the lazy dog's back.

### Header 3

> This is a blockquote.
> 
> This is the second paragraph in the blockquote.
>
> ## This is an H2 in a blockquote

期望的效果是识别段落并替换它们,例如

# A First Level Header

## Second Level Header

[replaced]

[replaced]

### Header 3

> This is a blockquote.
> 
> This is the second paragraph in the blockquote.
>
> ## This is an H2 in a blockquote

marked or markdown-it 等现有库似乎无法无副作用地解析和重新创建 markdown 文档。

在 Markdown 文档中查找和替换文本段落的最佳方法是什么?

Markdown 中的段落本质上是任何文本块,而不是任何其他块级结构(由 Syntax Rules 定义)。所以一个段落是一个文本块,它不是 header、列表、块引用、代码块或水平规则(因为这些是 Markdown 中定义的唯一其他块级结构——忽略一些非官方扩展)。

由于您只对查找根级别段落(而不是嵌套段落)感兴趣,一个简单的方法可能是简单地在双换行符和 运行 正则表达式上拆分文档以检查每个块的开头对于标识 non-paragraph 类型的标记。如果它以四个或更多 space 开头(或一个制表符);不是一个段落。如果它以 0-3 spaces 和哈希开头;不是一个段落。如果是以0-3spaces,一个>和一个space开始;不是一个段落。如果它以 0-3 space 开头,*, -, + 之一和一个 space,则不是段落。等等...

一个麻烦点是 headers。 Headers 只能是一行,散列 header 和它后面的段落之间不能有空行。然而,这很容易解决,因为 headers 只能是一行。如果您找到一个 header(以散列开头的块),将第一行分开,其他任何内容都是一个单独的块,可能是也可能不是段落。

当然,一个更棘手的问题是 setext headers,因为第二行标识它们有 headers。然而,寻找第一个换行符后跟 3 个或更多 -= 的正则表达式应该可以解决问题。

如果您查看一些现有的 Markdown 实现,您需要的大部分正则表达式已经存在。当然,您会开发自己的各种 Markdown 解析器,并且各种边缘情况可能会偷偷摸摸。但是,考虑到您非常具体的需求,我不确定您是否会找到一个现有的解析器来满足您的需求。

这是一种众所周知的问题类型 - 按结果元素查找源范围所需的源映射信息。目前我不知道 markdown 解析器是否具有完整和正确的源映射支持。

但是 markdown-it 和引用通用标记解析器可以提供有关源代码行(无列)的信息。如果您只需要对根块执行某些操作,那么这些有限的行信息就足够了。例如,markdown-it demo 同步使用线映射到 srcoll 窗格。