@@ -22,6 +22,7 @@ var block = {
22
22
list : / ^ ( * ) ( b u l l ) [ \s \S ] + ?(?: h r | d e f | \n { 2 , } (? ! ) (? ! \1b u l l ) \n * | \s * $ ) / ,
23
23
html : / ^ * (?: c o m m e n t | c l o s e d | c l o s i n g ) * (?: \n { 2 , } | \s * $ ) / ,
24
24
def : / ^ * \[ ( [ ^ \] ] + ) \] : * < ? ( [ ^ \s > ] + ) > ? (?: + [ " ( ] ( [ ^ \n ] + ) [ " ) ] ) ? * (?: \n + | $ ) / ,
25
+ task : noop ,
25
26
table : noop ,
26
27
paragraph : / ^ ( (?: [ ^ \n ] + \n ? (? ! h r | h e a d i n g | l h e a d i n g | b l o c k q u o t e | t a g | d e f ) ) + ) \n * / ,
27
28
text : / ^ [ ^ \n ] + /
@@ -75,6 +76,7 @@ block.normal = merge({}, block);
75
76
*/
76
77
77
78
block . gfm = merge ( { } , block . normal , {
79
+ task : / ^ ( \s * \[ [ x ] \] [ ^ \n ] + \n ) + \n * / ,
78
80
fences : / ^ * ( ` { 3 , } | ~ { 3 , } ) * ( \S + ) ? * \n ( [ \s \S ] + ?) \s * \1 * (?: \n + | $ ) / ,
79
81
paragraph : / ^ /
80
82
} ) ;
@@ -375,6 +377,33 @@ Lexer.prototype.token = function(src, top, bq) {
375
377
continue ;
376
378
}
377
379
380
+ // task (gfm)
381
+ if ( top && ( cap = this . rules . task . exec ( src ) ) {
382
+ src = src . substring ( cap [ 0 ] . length ) ;
383
+
384
+ this . tokens . push ( {
385
+ type : 'task_list_start'
386
+ } ) ;
387
+
388
+ cap [ 0 ] = cap [ 0 ] . replace ( / ^ \s + | \s + $ / g, '' ) ;
389
+ cap = cap [ 0 ] . split ( / \n + / ) ;
390
+
391
+ i = 0 ;
392
+ l = cap . length ;
393
+
394
+ for ( ; i < l ; i ++ ) {
395
+ this . tokens . push ( {
396
+ type : 'task_item' ,
397
+ checked : / ^ \s * \[ x \] / . test ( cap [ i ] ) ,
398
+ text : cap [ i ] . replace ( / ^ \s * \[ [ x ] \] \s * / , '' )
399
+ } ) ;
400
+ }
401
+
402
+ this . tokens . push ( {
403
+ type : 'task_list_end'
404
+ } ) ;
405
+ }
406
+
378
407
// table (gfm)
379
408
if ( top && ( cap = this . rules . table . exec ( src ) ) ) {
380
409
src = src . substring ( cap [ 0 ] . length ) ;
@@ -980,6 +1009,25 @@ Parser.prototype.tok = function() {
980
1009
this . token . lang ,
981
1010
this . token . escaped ) ;
982
1011
}
1012
+ case 'task_list_start' : {
1013
+ var body = ''
1014
+ , i = 1 ;
1015
+
1016
+ while ( this . next ( ) . type !== 'task_list_end' ) {
1017
+ body += '<li class="task-list-item"><label>'
1018
+ + '<input type="checkbox"'
1019
+ + ' class="task-list-item-checkbox"
1020
+ + ' data-item-index="' + ( i ++ ) + '"'
1021
+ + ' data-item-complete="' + ( this . token . checked ? 1 : 0 ) + '"'
1022
+ + ' ' + ( this . token . disabled ? 'disabled=""' + '' ) + '>'
1023
+ + ' ' + this . inline . output ( this . token . text )
1024
+ + '</label></li>' ;
1025
+ }
1026
+
1027
+ return '<ul class="task-list">'
1028
+ + body
1029
+ + '</ul>' ;
1030
+ }
983
1031
case 'table' : {
984
1032
var header = ''
985
1033
, body = ''
0 commit comments