Gem 写了个 Markdown parser [附代码导读]

jjym · 2013年08月29日 · 最后由 i5ting 回复于 2013年09月07日 · 5390 次阅读

最近练手写了个 markdown parser 采用 GFM 格式 没有其他依赖 https://github.com/jjyr/minidown 比想像中的要麻烦不少..

可以完美解析GFM 的 source 页


另: 既然有人读就再增加了一些略详细的说明

大概思路是字符串传到Document类,然后split成行

这是markdown一个特点, 单行就可以进行解析,比如 `code` 等语法都是不允许换行的,即使是块结构的语法, 如```,也是可以从单行中判断开始与结束

之后`Document#parse_reference`会去解析一遍文档, 把markdown中的链接/图片定义替换

然后parse_line进行每行的解析

大概就是

while line = unparsed_lines.shift
    parsed_nodes << (parse_line line)
end

parse_line中如果发现特殊结构
如: `>, *`等就由相应的类去解析(如`>`开头会由`BlockElement`类解析)

其余交给TextElement来解析文本内的语法,比如 *斜体*

....然后就是与各种正则的搏斗

之后对parse后的node调用to_html全部转换为HTML输出

:thumbsup:
测试有点少..

#1 楼 @yeerkunth 擦。。目测 1k 多行测试还少阿。。

代码结构非常清晰,学习

#3 楼 @zlx_star 其实有些细节地方代码不是很好,正则没学到家..有些地方还是比较混乱,尤其是成块的语法部分

#5 楼 @jjym 正则这个真的很神奇。不知道你的整体处理思路是怎么样的?

Good Job!

#6 楼 @zlx_star 已在帖子里更新

#8 楼 @jjym 单行解析的话对于多行代码块能不能处理?嵌套列表也比较头疼的吧?

话说 markdown 用着实在不习惯,是因为我不熟悉么?

鼓励!学习了!

#9 楼 @zlx_star 如果解析到特殊语法会交给相应的类解析,比如>然后类里 parse 有应对嵌套的处理,实际上能根据行判断其语法 (所以 split 成 Line 后分析),也很容易判断代码块的结束

这几天刚好用到。拜读学习了!

#14 楼 @DeathKing 如有 bug 欢迎 pr...帖子中更新了下代码说明

其实 markdown 里最难处理的是嵌套,下面两种东西的处理要写很多代码...

- 1
  + 2
    - 3
      换行加同缩进, 依然属于同一个 <li>
    - 3
  + 2
- 1
~~***尼玛***~~

如果允许列表中有 quote 或者 header, 直接会疯掉...

还有一个蛋疼点是 code 元素,因为其实以任意多个 ` 开始都可以的,例如下面这个,5 个`开始,5 个`结束

这样也可以`代码`的...

#16 楼 @luikore ..第一种太过蛋疼..github 无视了...

fork 一下,有空看

#16 楼 @luikore 我终于真正的理解这句话了。。修 bug 中...

需要 登录 后方可回复, 如果你还没有账号请 注册新账号