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

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

最近练手写了个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输出
共收到 20 条回复

:thumbsup:
测试有点少..

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

代码结构非常清晰,学习

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

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

Good Job!

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

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

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

鼓励!学习了!

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

#12楼 @jjym 很全面,赞

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

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

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

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

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

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

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

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

fork一下,有空看

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

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