最近练手写了个 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输出
其实 markdown 里最难处理的是嵌套,下面两种东西的处理要写很多代码...
- 1
+ 2
- 3
换行加同缩进, 依然属于同一个 <li>
- 3
+ 2
- 1
~~***尼玛***~~
如果允许列表中有 quote 或者 header, 直接会疯掉...
还有一个蛋疼点是 code 元素,因为其实以任意多个 ` 开始都可以的,例如下面这个,5 个`开始,5 个`结束
这样也可以`代码`的...