javascript 使用一个简单的基于regex的markdown解析器的缺点是什么?[已关闭]

5tmbdcev  于 2023-09-29  发布在  Java
关注(0)|答案(1)|浏览(129)

已关闭,此问题需要更focused。它目前不接受回答。
**想改善这个问题吗?**更新问题,使其只关注editing this post的一个问题。

15小时前关门了。
Improve this question
我需要一个相对简单的markdown解析器为我的应用程序。只是简单的东西,如粗体,斜体等。我在四处寻找图书馆,许多图书馆似乎都很大。例如,marked非常受欢迎,有20,000颗星星。它有将近2,000行代码。我甚至不确定this one有多大,但它似乎相当复杂。
一般来说,我会尽量保持简单,并尽可能限制我的依赖性。我不太清楚这些线是干什么的?我很高兴很快就找到了this library,它甚至不到100行,它只是使用一个简单的正则表达式将文本转换为相应的markdown。
我的问题是,基本上,其他图书馆在做什么?如果我选择使用一种更简单的、以regex为中心的方法,我是否错过了什么?图书馆在某种程度上不安全吗?我是否应该考虑一些我不知道的其他因素?
显然,我似乎错过了一些重要的东西,因为前一个图书馆似乎相当受欢迎,而后一个图书馆甚至没有一颗星星。我只是不确定那是什么。我希望情况是,后者适合简单的情况,而前者更“完整”,如果这是你需要的,但我不想跳到这个结论。

k4ymrczo

k4ymrczo1#

有许多因素导致Markdown解析器的复杂性。也就是说,您可以使用“简单的基于regex”的方法来构建Markdown解析器。事实上,这正是reference implementation所使用的(在Perl中)。它运行一系列正则表达式,将现有文档上的Markdown语法替换为HTML语法。即使这样,源代码也由1451行代码组成,包括注解、许可证等。当然,它包括对原始syntax rules中描述的整个特性列表的支持。这些特性包括对嵌套、转义等的支持,这些特性使正则表达式的使用变得非常复杂。
一些人发现这样的实现方式是有限制的。这完全取决于你想从Markdown解析器中得到什么。
例如,使用参考实现扩展语法几乎是不可能的。例如,Python-Markdown(我是它的开发人员)采用了参考实现,为每个正则表达式命名,并为第三方扩展提供了一种替换或插入新正则表达式的方法。样板代码只是为了允许这一点,增加了相当多的代码行。顺便说一句,Markdown已经很老了,像Python-Markdown这样的库多年来一直在变化和发展。第一个版本非常接近地模仿了参考实现,但是今天您很难看到它们之间的任何相似之处。
其他人对扩展语法不感兴趣,而是提供一种控制输出的方法。例如,marked JS库输出抽象语法树(AST),然后可以将其传递给渲染器。渲染器接受AST(基本上是一个令牌列表)并输出一些其他格式。另一种格式可以是HTML,也可以是其他格式。Pandoc利用这一点在许多文档格式之间进行转换。这自然会增加额外的代码行。
另外一个因素是,无论是否实现,许多人都会认为,如果一个实现不支持规则中的所有功能,那么它就不是Markdown。事实上,多年来,许多实现都添加了非标准功能(参见GitHub Flavored Markdown作为示例)。人们开始依赖这些非标准特性,并会提交bug报告,抱怨某个实现不支持它们。作为Python-Markdown的开发人员,我经常看到这样的报告,当库实际上提供支持时。只是默认情况下没有启用。当向他们指出这一点时,他们的React往往不那么理解。因此,如果不支持所有标准特性,任何面向一般消费的实现都不会持久。
增加额外复杂性的是,在关于标准特征的实现之间不存在完美的一致性。详情请参阅Babelmark 2 FAQ。在常见问题解答中,您会发现许多记录在案的差异,这些差异相当细微。人们真的发现这些微小的差异很重要。出于这个原因,一群人创建了Commonmark,这是Markdown的严格规范。然而,由于Commonmark从未得到Markdown创建者的祝福,一些人质疑它是否可以被认为是Markdown。此外,在某些地方,规范自己承认直接违反了原始规则。无论如何,要成为Commonmark实现,必须提供一个完整的解决方案,其中包含规范的所有文档化特性。reference implementations(在JS和C中)都很大。事实上,我怀疑你是否可以用一个像markdown.pl那样使用简单的基于rexed的替换的实现来实现Commonmark。
关键是,除了最简单的实现之外,您得到的不仅仅是一个正则表达式替换的集合。具体的功能因实现而异,需要仔细阅读每个实现的文档。无论如何,即使是一个“简单”的正则表达式替换集合,要实现Markdown的所有文档功能也相当复杂和冗长。否则就不会被认为是Markdown。
另一个考虑因素是性能。虽然基于正则表达式的解析器对于大多数一般用途来说“足够好”(从命令行运行,因为参考实现是为之设计的),但更高性能的实现(例如marked或Commonmark参考实现)产生AST并使用渲染器。基于正则表达式的实现永远不会在性能上接近匹配,如果您的Web服务器在每个请求上都将Markdown转换为HTML,这一点很重要。

相关问题