正則處理解析
1. 標題——heading
/^ *(#{1,6}) *([^\n]+?) *#* *(?:\n+|$)/
首先忽略標題開始時的空格:^ *
然后是匹配1到6次的#號:(#{1,6})
忽略#到文本的空格之后,不接受換行符為止:*([^\n]+?)
或者顯式地指定標題結(jié)尾:*#*
再對全局非獲取匹配換行符:*(?:\n+|$)
非獲取匹配——定義與運算符一起使用的子表達式
老式語法中head也有文本后跟兩個等號的:/^([^\n]+)\n *(=|-){2,} *(?:\n+|$)/
2 分割線——hr
/^ {0,3}((?:- *){3,}|(?:_ *){3,}|(?:\* *){3,})(?:\n+|$)/
任意數(shù)量的_,-,*都可以產(chǎn)生分割線
頭部可以有0-3數(shù)量的空格
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使用并不需要這個,因此可以將段落繼續(xù)簡化為:
/^([^\n]+(?:\n?(?!hr|heading| {0,3}>)[^\n]+)+)/
其中包含標題,分割線,應(yīng)用等。
4. 引用——blockquote
/^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/
理論上引用可以無限嵌套