@@ -381,12 +381,10 @@ export class _Tokenizer<ParserOutput = string, RendererOutput = string> {
381381 }
382382
383383 let istask : RegExpExecArray | null = null ;
384- let ischecked : boolean | undefined ;
385384 // Check for task list items
386385 if ( this . options . gfm ) {
387386 istask = this . rules . other . listIsTask . exec ( itemContents ) ;
388387 if ( istask ) {
389- ischecked = istask [ 0 ] !== '[ ] ' ;
390388 itemContents = itemContents . replace ( this . rules . other . listReplaceTask , '' ) ;
391389 }
392390 }
@@ -395,7 +393,6 @@ export class _Tokenizer<ParserOutput = string, RendererOutput = string> {
395393 type : 'list_item' ,
396394 raw,
397395 task : ! ! istask ,
398- checked : ischecked ,
399396 loose : false ,
400397 text : itemContents ,
401398 tokens : [ ] ,
@@ -416,13 +413,40 @@ export class _Tokenizer<ParserOutput = string, RendererOutput = string> {
416413 list . raw = list . raw . trimEnd ( ) ;
417414
418415 // Item child tokens handled here at end because we needed to have the final item to trim it first
419- for ( let i = 0 ; i < list . items . length ; i ++ ) {
416+ for ( const item of list . items ) {
420417 this . lexer . state . top = false ;
421- list . items [ i ] . tokens = this . lexer . blockTokens ( list . items [ i ] . text , [ ] ) ;
418+ item . tokens = this . lexer . blockTokens ( item . text , [ ] ) ;
419+ if ( item . task ) {
420+ const taskRaw = this . rules . other . listTaskCheckbox . exec ( item . raw ) ;
421+ if ( taskRaw ) {
422+ const checkboxToken : Tokens . Checkbox = {
423+ type : 'checkbox' ,
424+ raw : taskRaw [ 0 ] + ' ' ,
425+ checked : taskRaw [ 0 ] !== '[ ]' ,
426+ } ;
427+ item . checked = checkboxToken . checked ;
428+ if ( list . loose ) {
429+ if ( item . tokens [ 0 ] && [ 'paragraph' , 'text' ] . includes ( item . tokens [ 0 ] . type ) && 'tokens' in item . tokens [ 0 ] && item . tokens [ 0 ] . tokens ) {
430+ item . tokens [ 0 ] . raw = checkboxToken . raw + item . tokens [ 0 ] . raw ;
431+ item . tokens [ 0 ] . text = checkboxToken . raw + item . tokens [ 0 ] . text ;
432+ item . tokens [ 0 ] . tokens . unshift ( checkboxToken ) ;
433+ } else {
434+ item . tokens . unshift ( {
435+ type : 'paragraph' ,
436+ raw : checkboxToken . raw ,
437+ text : checkboxToken . raw ,
438+ tokens : [ checkboxToken ] ,
439+ } ) ;
440+ }
441+ } else {
442+ item . tokens . unshift ( checkboxToken ) ;
443+ }
444+ }
445+ }
422446
423447 if ( ! list . loose ) {
424448 // Check if list should be loose
425- const spacers = list . items [ i ] . tokens . filter ( t => t . type === 'space' ) ;
449+ const spacers = item . tokens . filter ( t => t . type === 'space' ) ;
426450 const hasMultipleLineBreaks = spacers . length > 0 && spacers . some ( t => this . rules . other . anyLine . test ( t . raw ) ) ;
427451
428452 list . loose = hasMultipleLineBreaks ;
@@ -431,8 +455,13 @@ export class _Tokenizer<ParserOutput = string, RendererOutput = string> {
431455
432456 // Set all items to loose if list is loose
433457 if ( list . loose ) {
434- for ( let i = 0 ; i < list . items . length ; i ++ ) {
435- list . items [ i ] . loose = true ;
458+ for ( const item of list . items ) {
459+ item . loose = true ;
460+ for ( const token of item . tokens ) {
461+ if ( token . type === 'text' ) {
462+ token . type = 'paragraph' ;
463+ }
464+ }
436465 }
437466 }
438467
0 commit comments