你将如何去parsingMarkdown?

你可以在这里find这个语法。

下载后的源代码是用Perl编写的,我没有打算这么做。 它是正规expression式,它依靠MD5哈希来逃避某些字符。 有什么是错的!

我即将对Markdown的parsing器进行硬编码。 这是什么经验?

如果您对Markdown的实际parsing没有任何意义,请将时间留给我。 (这可能听起来很刺耳,但是,我正在寻找洞察力,而不是解决scheme,即第三方库)。

为了帮助一些答案,正则expression式是为了识别模式 ! 不要分析整个语法。 人们认为这样做是foobar。

  • 如果您考虑Markdown,它基本上是基于段落的概念。
  • 因此,合理的做法可能是将投入分成几段。
  • 段落有很多种,例如标题,文字,列表,引号和代码。
  • 因此,挑战在于确定这些段落以及它们在什么情况下发生。

一旦我发现它值得分享,我会回来的解决scheme。

我所知道的唯一使用实际parsing器的降价实现是Jon MacFarleane的peg-markdown 。 它的parsing器基于称为peg的parsingexpression式语法parsing器生成器。


编辑: Mauricio Fernandez最近发布了他的Simple Markup Markdownparsing器 ,他作为他的OcsiBlog博客引擎的一部分编写。 因为parsing器是用OCaml编写的,所以它非常简单和简短( parsing器为268 SLOC, HTML发射器为43 SLOC),但速度非常快 (比折扣 (手写优化的C) 快 20%,速度提高了百倍比BlueCloth ( ruby )),尽pipe它甚至没有性能优化。 因为它只是供Mauricio本人内部使用他的博客,所以Markdown规范有一些偏差,但是Mauricio创build了一个分支来恢复大部分的变化 。

我上周发布了一个新的基于parsing器的Markdown Java实现,名为pegdown 。 pegdown使用PEGparsing器首先构build一个抽象语法树,随后将其写入HTML。 因此,与基于正则expression式的方法相比,它非常干净,更容易阅读,维护和扩展。 PEG语法基于John MacFarlanes C实现“peg-markdown”。

也许你感兴趣的东西…

我可能会阅读语法规范足够多的时间来了解它,并得到如何parsing它的感觉。

阅读现有的parsing器代码当然是非常棒的,既可以看到似乎是复杂性的主要来源,也可以使用任何特殊的巧妙技巧。 MD5校验和的使用看起来有点奇怪,但是我还没有研究足够的代码来理解为什么这样做。 一个名为_EscapeSpecialChars()的例程中的注释表示:

我们用相应的MD5校验和值replace每个这样的字符; 这可能是过度的,但它应该防止我们意外地与逃逸值相冲突。

用完整的MD5代替单个字符看起来很奢侈,但也许它确实是有道理的。

当然,考虑创build一个“真正”的语法是很聪明的,对于一个像Flex这样的工具来说,摆脱了正则expression式。

如果我试图parsingmarkdown(及其扩展markdown extra ),我想我会尝试使用一个状态机,并一次parsing一个字符,将一些代表文本的内部结构连接在一起,所有的东西都被parsing出来,把所有的东西都输出到一起。

基本上,当我读取input文件时,我会构build一个小型DOM树。
要生成一个输出,我只是遍历树并输出HTML或其他任何东西(PS,LaTex,RTF,…)

事情会增加复杂性:

  • 事实上,你可以混合HTML和降价,虽然规则可以很容易实现:只要忽略两个平衡标签之间的任何内容,并逐字输出。

  • url和注释可以在文本的底部进行引用。 使用超链接的数据结构可以简单地logging下如下内容:

     [my text to a link][linkkey] results in a structure like: URLStructure: | InnerText : "my text to a link" | Key : "linkkey" | URL : <null> 
  • 头文件可以用下划线来定义,这可能会迫使我们在通用段落中使用简单的数据结构,并在读取文件时修改其属性:

     ParagraphStructure: | InnerText : the current paragraph text | (beginning of line until end of line). | HeadingLevel : <null> or 1-4 when we can assess | that paragraph heading level, if any. 

无论如何,只是一些想法。

我确信有很多细节需要处理,而且我非常肯定正则expression式在这个过程中会变得方便。
毕竟,它们是为了处理文本。

如果Perl不是你的东西, 至less有10种其他语言的 Markdown实现。 他们可能并不都有100%的兼容性,但往往相当接近。

MarkdownPapers是另一个Java实现,其parsing器在JavaCC语法中定义。

有许多语言的库,包括PHP,ruby,Java,C#,JavaScript。 我build议看看其中的一些想法。

这取决于你想使用哪种语言,为了实现它的最佳方式,将会有惯用的和非惯用的方法来实现它。

正则expression式在Perl中工作,因为Perl和正则expression式是最好的朋友。

如果您使用的编程语言有三个以上的其他用户,您应该能够find一个库来为您parsing它。 一个快速的Google-ing显示CL,Haskell,Python,JavaScript,Ruby等等的库。 这是不太可能的,你将需要重新发明这轮。

如果你真的必须从头开始编写,我build议你写一个合适的parsing器。 使用这种技术,您不必使用MD5散列来转义。 (我同意,如果你必须这样做,现在是时候重新考虑你的devise了。)

Markdown是一个JAWL(只是另一种维基语言)

有很多开源wiki,你可以检查parsing器的代码。 大多数使用REGEX

查看screwturn维基,有一个有趣的多通道格式化程序pipe道,一个非常好的技术 – 请参阅/core/Formatter.cs和/core/FormatterPipeline.cs

最好的是使用/join现有的项目,这些事情总是比他们看起来更难

在这里你可以find一个Markdown的JavaScript实现。 它也很大程度上依赖于正则expression式,因为这是分析文本的最快速和最简单的方法。

但它可以省去MD5的一部分。

我不能直接与parsing的编码,但也许这个链接可以帮助你这样或那样的。