Joh*_*ren 123 markdown parsing
编辑:我最近了解了一个名为CommonMark的项目,该项目可以正确识别并处理原始Markdown规范中的含糊之处.http://commonmark.org/它有很棒的C#库支持.
你可以在这里找到语法.
下载的源代码是用Perl编写的,我无意表达.它充满了正则表达式,它依赖于MD5哈希来逃避某些字符.对此有些不对劲!
我即将为Markdown编写解析器代码.这有什么经验?
如果你对Markdown的实际解析没有任何意义,请给我时间.(这可能听起来很苛刻,但是,我正在寻找洞察力,而不是解决方案,即第三方库).
为了帮助解决问题,正则表达式旨在识别模式!不要解析整个语法.人们认为这样做是foobar.
一旦我发现它值得分享,我会回来找一个解决方案.
Jör*_*tag 65
我所知道的唯一一个使用实际解析器的降价实现是Jon MacFarleane的peg-markdown.它的解析器基于一个名为peg的Parsing Expression Grammar解析器生成器.
编辑:Mauricio Fernandez最近发布了他的Simple Markup Markdown解析器,他将其作为OcsiBlog Weblog Engine的一部分编写.因为解析器被写入OCaml中,这是非常简单和较短(268 SLOC为解析器,43 SLOC为HTML发射极),但超炫快(快于20%的折扣(写在手工优化C)和sixhundred倍的速度比BlueCloth(Ruby)),尽管它甚至没有针对性能进行优化.因为它仅供Mauricio自己内部用于他的博客,所以与官方Markdown规范有一些偏差,但Mauricio创建了一个分支,它可以恢复大部分变化.
如果我试图解析markdown(及其扩展Markdown额外)我想我会尝试使用一个状态机并一次解析一个char,将一些内部结构链接在一起,表示当时的文本位,一次all解析,生成所有串起来的对象的输出.
基本上,当我读取输入文件时,我会构建一个类似迷你DOM的树.
要生成输出,我只需遍历树并输出HTML或其他任何内容(PS,LaTex,RTF,...)
可能增加复杂性的事情:
事实上你可以混合使用HTML和降价,虽然规则可以很容易实现:只需忽略两个平衡标签之间的任何内容并逐字输出.
URL和注释可以在文本底部引用它们.使用超链接的数据结构可以简单地记录如下:
[my text to a link][linkkey]
results in a structure like:
URLStructure:
| InnerText : "my text to a link"
| Key : "linkkey"
| URL : <null>
Run Code Online (Sandbox Code Playgroud)可以使用下划线定义标题,这可能会强制我们在通用段落中使用简单的数据结构,并在读取文件时修改其属性:
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.
Run Code Online (Sandbox Code Playgroud)无论如何,只是一些想法.
我确信有很多小细节需要处理,我很确定Regexes在这个过程中会变得很方便.
毕竟,他们的目的是处理文本.
| 归档时间: |
|
| 查看次数: |
44338 次 |
| 最近记录: |