正则处理解析
1. 标题——heading
/^ *(#{1,6}) *([^\n]+?) *#* *(?:\n+|$)/
首先忽略标题开始时的空格:^ *
然后是匹配1到6次的#号:(#{1,6})
忽略#到文本的空格之后,不接受换行符为止:*([^\n]+?)
或者显式地指定标题结尾:*#*
再对全局非获取匹配换行符:*(?:\n+|$)
非获取匹配——定义与运算符一起使用的子表达式
老式语法中head也有文本后跟两个等号的:/^([^\n]+)\n *(=|-){2,} *(?:\n+|$)/
2 分割线——hr
/^ {0,3}((?:- *){3,}|(?:_ *){3,}|(?:\* *){3,})(?:\n+|$)/
任意数量的_,-,*都可以产生分割线
头部可以有0-3数量的空格
3. 段落
/^([^\n]+(?:\n?(?!hr|heading| {0,3}>|tag)[^\n]+)+)/
tag是让marked支持直接解析html标签,其语法如下:
block._tag = '(?!(?:'
+ 'a|em|strong|small|s|cite|q|dfn|abbr|data|time|code'
+ '|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo'
+ '|span|br|wbr|ins|del|img)\\b)\\w+(?!:|[^\\w\\s@]*@)\\b';
然而轻度的markdown使用并不需要这个,因此可以将段落继续简化为:
/^([^\n]+(?:\n?(?!hr|heading| {0,3}>)[^\n]+)+)/
其中包含标题,分割线,应用等。
4. 引用——blockquote
/^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/
理论上引用可以无限嵌套