@@ -533,7 +533,7 @@ var Tokenizer = /*#__PURE__*/function () {
533
533
var cap = this . rules . block . list . exec ( src ) ;
534
534
535
535
if ( cap ) {
536
- var raw , istask , ischecked , indent , i , blankLine , endsWithBlankLine , line , lines , itemContents ;
536
+ var raw , istask , ischecked , indent , i , blankLine , endsWithBlankLine , line , nextLine , rawLine , itemContents ;
537
537
var bull = cap [ 1 ] . trim ( ) ;
538
538
var isordered = bull . length > 1 ;
539
539
var list = {
@@ -551,83 +551,77 @@ var Tokenizer = /*#__PURE__*/function () {
551
551
} // Get next list item
552
552
553
553
554
- var itemRegex = new RegExp ( "^( {0,3}" + bull + ")((?: [^\\n]*| *)(?:\\n[^\\n]*)* (?:\\n|$))" ) ; // Get each top-level item
554
+ var itemRegex = new RegExp ( "^( {0,3}" + bull + ")((?: [^\\n]*)? (?:\\n|$))" ) ; // Check if current bullet point can start a new List Item
555
555
556
556
while ( src ) {
557
- if ( this . rules . block . hr . test ( src ) ) {
558
- // End list if we encounter an HR (possibly move into itemRegex?)
557
+ if ( ! ( cap = itemRegex . exec ( src ) ) ) {
559
558
break ;
560
559
}
561
560
562
- if ( ! ( cap = itemRegex . exec ( src ) ) ) {
561
+ if ( this . rules . block . hr . test ( src ) ) {
562
+ // End list if bullet was actually HR (possibly move into itemRegex?)
563
563
break ;
564
564
}
565
565
566
- lines = cap [ 2 ] . split ( '\n' ) ;
566
+ raw = cap [ 0 ] ;
567
+ src = src . substring ( raw . length ) ;
568
+ line = cap [ 2 ] . split ( '\n' , 1 ) [ 0 ] ;
569
+ nextLine = src . split ( '\n' , 1 ) [ 0 ] ;
567
570
568
571
if ( this . options . pedantic ) {
569
572
indent = 2 ;
570
- itemContents = lines [ 0 ] . trimLeft ( ) ;
573
+ itemContents = line . trimLeft ( ) ;
571
574
} else {
572
575
indent = cap [ 2 ] . search ( / [ ^ ] / ) ; // Find first non-space char
573
576
574
- indent = cap [ 1 ] . length + ( indent > 4 ? 1 : indent ) ; // intented code blocks after 4 spaces; indent is always 1
577
+ indent = indent > 4 ? 1 : indent ; // Treat indented code blocks (> 4 spaces) as having only 1 indent
575
578
576
- itemContents = lines [ 0 ] . slice ( indent - cap [ 1 ] . length ) ;
579
+ itemContents = line . slice ( indent ) ;
580
+ indent += cap [ 1 ] . length ;
577
581
}
578
582
579
583
blankLine = false ;
580
- raw = cap [ 0 ] ;
581
584
582
- if ( ! lines [ 0 ] && / ^ * $ / . test ( lines [ 1 ] ) ) {
583
- // items begin with at most one blank line
584
- raw = cap [ 1 ] + lines . slice ( 0 , 2 ) . join ( '\n' ) + '\n' ;
585
+ if ( ! line && / ^ * $ / . test ( nextLine ) ) {
586
+ // Items begin with at most one blank line
587
+ raw += nextLine + '\n' ;
588
+ src = src . substring ( nextLine . length + 1 ) ;
585
589
list . loose = true ;
586
- lines = [ ] ;
587
590
}
588
591
589
- var nextBulletRegex = new RegExp ( "^ {0," + Math . min ( 3 , indent - 1 ) + "}(?:[*+-]|\\d{1,9}[.)])" ) ;
592
+ var nextBulletRegex = new RegExp ( "^ {0," + Math . min ( 3 , indent - 1 ) + "}(?:[*+-]|\\d{1,9}[.)])" ) ; // Check if following lines should be included in List Item
590
593
591
- for ( i = 1 ; i < lines . length ; i ++ ) {
592
- line = lines [ i ] ;
594
+ while ( src && ! list . loose ) {
595
+ rawLine = src . split ( '\n' , 1 ) [ 0 ] ;
596
+ line = rawLine ; // Re-align to follow commonmark nesting rules
593
597
594
598
if ( this . options . pedantic ) {
595
- // Re-align to follow commonmark nesting rules
596
599
line = line . replace ( / ^ { 1 , 4 } (? = ( { 4 } ) * [ ^ ] ) / g, ' ' ) ;
597
600
} // End list item if found start of new bullet
598
601
599
602
600
603
if ( nextBulletRegex . test ( line ) ) {
601
- raw = cap [ 1 ] + lines . slice ( 0 , i ) . join ( '\n' ) + '\n' ;
602
604
break ;
603
- } // Until we encounter a blank line, item contents do not need indentation
604
-
605
-
606
- if ( ! blankLine ) {
607
- if ( ! line . trim ( ) ) {
608
- // Check if current line is empty
609
- blankLine = true ;
610
- } // Dedent if possible
611
-
612
-
613
- if ( line . search ( / [ ^ ] / ) >= indent ) {
614
- itemContents += '\n' + line . slice ( indent ) ;
615
- } else {
616
- itemContents += '\n' + line ;
617
- }
618
-
619
- continue ;
620
- } // Dedent this line
621
-
605
+ }
622
606
623
607
if ( line . search ( / [ ^ ] / ) >= indent || ! line . trim ( ) ) {
608
+ // Dedent if possible
624
609
itemContents += '\n' + line . slice ( indent ) ;
625
- continue ;
610
+ } else if ( ! blankLine ) {
611
+ // Until blank line, item doesn't need indentation
612
+ itemContents += '\n' + line ;
626
613
} else {
627
- // Line was not properly indented; end of this item
628
- raw = cap [ 1 ] + lines . slice ( 0 , i ) . join ( '\n' ) + '\n' ;
614
+ // Otherwise, improper indentation ends this item
629
615
break ;
630
616
}
617
+
618
+ if ( ! blankLine && ! line . trim ( ) ) {
619
+ // Check if current line is blank
620
+ blankLine = true ;
621
+ }
622
+
623
+ raw += rawLine + '\n' ;
624
+ src = src . substring ( rawLine . length + 1 ) ;
631
625
}
632
626
633
627
if ( ! list . loose ) {
@@ -658,7 +652,6 @@ var Tokenizer = /*#__PURE__*/function () {
658
652
text : itemContents
659
653
} ) ;
660
654
list . raw += raw ;
661
- src = src . slice ( raw . length ) ;
662
655
} // Do not consume newlines at end of final item. Alternatively, make itemRegex *start* with any newlines to simplify/speed up endsWithBlankLine logic
663
656
664
657
@@ -671,7 +664,7 @@ var Tokenizer = /*#__PURE__*/function () {
671
664
this . lexer . state . top = false ;
672
665
list . items [ i ] . tokens = this . lexer . blockTokens ( list . items [ i ] . text , [ ] ) ;
673
666
674
- if ( list . items [ i ] . tokens . some ( function ( t ) {
667
+ if ( ! list . loose && list . items [ i ] . tokens . some ( function ( t ) {
675
668
return t . type === 'space' ;
676
669
} ) ) {
677
670
list . loose = true ;
0 commit comments