2016-01-21 72 views
1

在替换文本段落,我打破了我的头试图写/使用现有的降价解析器之一查找和替换减价文档中的每个文本段落,离开一切不变。检测和降价文件

示例输入:

# 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 

现有库如markedmarkdown-it似乎是不能解析和重新创建减价文档无副作用的。

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

+0

你应该*至少*提供示例性输入和所希望的输出 –

+0

@Thomas更新的。 – Gajus

+0

我可能会稍微得出一个结论,但是一个降价的段落会是以字母开头的任何内容吗? –

回答

0

Markdown中的段落基本上是任何不是任何其他块级别构造的文本块(如由Syntax Rules定义的)。因此,段落是不是标题,列表,块引用,代码块或水平规则的文本块(因为这些是Markdown中定义的唯一其他块级别的构造 - 忽略一些非官方扩展)。

由于您只想找到根级别的段落(不是嵌套的段落),一种简单的方法可能是简单地将文档分成双行换行符,并在每个块的开始处运行正则表达式,检查标识非段落类型。如果它以四个或更多空格(或一个选项卡)开头;不是一个段落。如果它以0-3个空格和一个散列开始;不是一个段落。如果以0-3个空格开始,一个>和一个空格;不是一个段落。如果它以0-3个空格开始,则为*, -, +之一,并且为空格,而不是段落。等等...

一个问题是标题。标题只能是一行,对于一个散列标题,它和它后面的段落之间可能没有空行。然而,这很容易解决,因为标题只能是一行。它会找到一个标题(以散列开头的块),将第一行分开,其他任何内容都是单独的块,可能不是段落。

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

如果你看看一些现有的Markdown实现,大部分正则表达式都需要已经存在。当然,你会开发自己的Markdown解析器,各种各样的边缘案例可能会潜入。但是,考虑到您的具体需求,我不确定您会找到现有的解析器,它会为您提供所需的解决方案。

+0

正则表达式“如果0-3次的空间,中*,一个开始 - ,+,及空间,而不是一个段落。”这不是真的。段落可以以重点开始(例如'* foo * bar.')或链接(例如'[foo](..)bar')。 – Gajus

+0

是的,但是如果你有'* foo * bar.'那么这是一个列表项。注意第一个'*'之后的空格。我通过说明一个空间必须遵循标记来描述这种情况。是的,这真的很简单。这是参考实现使用的方法。 – Waylan

+0

请参阅此处的示例:http://johnmacfarlane.net/babelmark2/?normalize=1&text=*foo*+bar.%0A%0A*+foo*+bar。 – Waylan

0

这是问题的一个众所周知的类型 - 找到源所需源地图信息的范围由结果的元素。在这一刻,我不知道降价解析器有完整和正确的源地图支持。

但降价-它和参考commonmark解析器可以提供关于源极线信息(没有列)。如果你只需要在根块上做一些事情,那么这样的限制线路信息将会是明智的。例如,markdown-it demo使用映射到srcoll窗格的行同步。