我试图编写/使用现有的降价解析器之一来查找并替换降价文档中的每个文本段落,并保持其他所有内容不受影响。
示例输入:
# 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
或markdown-it
等现有库似乎无法解析和重新创建降价文档而没有副作用。
在降价文档中查找和替换文本段落的最佳方法是什么?
答案 0 :(得分:0)
Markdown中的段落本质上是任何文本块,不是任何其他块级构造(由Syntax Rules定义)。所以段落是一个文本块,它不是标题,列表,块引用,代码块或水平规则(因为它们是Markdown中定义的唯一其他块级结构 - 忽略一些非官方扩展)。
由于您只对找到根级段落(而不是嵌套段落)感兴趣,一个简单的方法可能是简单地将文档拆分为双行换行符并在每个块的开头运行一个正则表达式来检查标识非段的标记 - 段落类型。如果它以四个或更多空格(或一个标签)开头;不是一个段落。如果它以0-3空格和哈希开始;不是一个段落。如果以0-3个空格开始,则为>
和空格;不是一个段落。如果它以0-3个空格开始,*, -, +
之一和空格,而不是段落。等等...
一个问题点是标题。标题只能是一行,哈希标题之间可能没有空行和它后面的段落。但是,这很容易解决,因为标题只能是一行。你找到一个标题(以哈希开头的块),拆分第一行,其他任何东西都是一个单独的块,可能是也可能不是段落。
当然,一个棘手的问题是setext标题,因为第二行标识它们有标题。但是,查找第一个换行符后跟3个或更多-
或=
的正则表达式应该可以解决问题。
如果你看一些现有的Markdown实现,你需要的大部分正则表达式都已存在。当然,你会开发自己的Markdown解析器,各种边缘情况可能会偷偷摸摸。但是,鉴于您的特定需求,我不确定您是否会找到能够满足您需求的现有解析器。
答案 1 :(得分:0)
这是一个众所周知的问题类型 - 按结果元素查找源范围所需的源地图信息。此刻,我不知道markdown解析器是否完全支持源地图。
但是降价 - 它和参考共同标记解析器可以提供有关源行(没有列)的信息。如果你只需要对root块做一些事情,那么这些有限的行信息就会被启用。例如,markdown-it demo使用行同步映射到srcoll窗格。