marked 2.1.3 → 3.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/lib/marked.esm.js CHANGED
@@ -208,6 +208,10 @@ function splitCells$1(tableRow, count) {
208
208
  cells = row.split(/ \|/);
209
209
  let i = 0;
210
210
 
211
+ // First/last cell in a row cannot be empty if it has no leading/trailing pipe
212
+ if (!cells[0].trim()) { cells.shift(); }
213
+ if (!cells[cells.length - 1].trim()) { cells.pop(); }
214
+
211
215
  if (cells.length > count) {
212
216
  cells.splice(count);
213
217
  } else {
@@ -315,19 +319,23 @@ const {
315
319
  findClosingBracket
316
320
  } = helpers;
317
321
 
318
- function outputLink(cap, link, raw) {
322
+ function outputLink(cap, link, raw, lexer) {
319
323
  const href = link.href;
320
324
  const title = link.title ? escape$2(link.title) : null;
321
325
  const text = cap[1].replace(/\\([\[\]])/g, '$1');
322
326
 
323
327
  if (cap[0].charAt(0) !== '!') {
324
- return {
328
+ lexer.state.inLink = true;
329
+ const token = {
325
330
  type: 'link',
326
331
  raw,
327
332
  href,
328
333
  title,
329
- text
334
+ text,
335
+ tokens: lexer.inlineTokens(text, [])
330
336
  };
337
+ lexer.state.inLink = false;
338
+ return token;
331
339
  } else {
332
340
  return {
333
341
  type: 'image',
@@ -434,48 +442,15 @@ var Tokenizer_1 = class Tokenizer {
434
442
  }
435
443
  }
436
444
 
437
- return {
445
+ const token = {
438
446
  type: 'heading',
439
447
  raw: cap[0],
440
448
  depth: cap[1].length,
441
- text: text
449
+ text: text,
450
+ tokens: []
442
451
  };
443
- }
444
- }
445
-
446
- nptable(src) {
447
- const cap = this.rules.block.nptable.exec(src);
448
- if (cap) {
449
- const item = {
450
- type: 'table',
451
- header: splitCells(cap[1].replace(/^ *| *\| *$/g, '')),
452
- align: cap[2].replace(/^ *|\| *$/g, '').split(/ *\| */),
453
- cells: cap[3] ? cap[3].replace(/\n$/, '').split('\n') : [],
454
- raw: cap[0]
455
- };
456
-
457
- if (item.header.length === item.align.length) {
458
- let l = item.align.length;
459
- let i;
460
- for (i = 0; i < l; i++) {
461
- if (/^ *-+: *$/.test(item.align[i])) {
462
- item.align[i] = 'right';
463
- } else if (/^ *:-+: *$/.test(item.align[i])) {
464
- item.align[i] = 'center';
465
- } else if (/^ *:-+ *$/.test(item.align[i])) {
466
- item.align[i] = 'left';
467
- } else {
468
- item.align[i] = null;
469
- }
470
- }
471
-
472
- l = item.cells.length;
473
- for (i = 0; i < l; i++) {
474
- item.cells[i] = splitCells(item.cells[i], item.header.length);
475
- }
476
-
477
- return item;
478
- }
452
+ this.lexer.inline(token.text, token.tokens);
453
+ return token;
479
454
  }
480
455
  }
481
456
 
@@ -497,138 +472,155 @@ var Tokenizer_1 = class Tokenizer {
497
472
  return {
498
473
  type: 'blockquote',
499
474
  raw: cap[0],
475
+ tokens: this.lexer.blockTokens(text, []),
500
476
  text
501
477
  };
502
478
  }
503
479
  }
504
480
 
505
481
  list(src) {
506
- const cap = this.rules.block.list.exec(src);
482
+ let cap = this.rules.block.list.exec(src);
507
483
  if (cap) {
508
- let raw = cap[0];
509
- const bull = cap[2];
484
+ let raw, istask, ischecked, indent, i, blankLine, endsWithBlankLine,
485
+ line, lines, itemContents;
486
+
487
+ let bull = cap[1].trim();
510
488
  const isordered = bull.length > 1;
511
489
 
512
490
  const list = {
513
491
  type: 'list',
514
- raw,
492
+ raw: '',
515
493
  ordered: isordered,
516
494
  start: isordered ? +bull.slice(0, -1) : '',
517
495
  loose: false,
518
496
  items: []
519
497
  };
520
498
 
521
- // Get each top-level item.
522
- const itemMatch = cap[0].match(this.rules.block.item);
523
-
524
- let next = false,
525
- item,
526
- space,
527
- bcurr,
528
- bnext,
529
- addBack,
530
- loose,
531
- istask,
532
- ischecked,
533
- endMatch;
534
-
535
- let l = itemMatch.length;
536
- bcurr = this.rules.block.listItemStart.exec(itemMatch[0]);
537
- for (let i = 0; i < l; i++) {
538
- item = itemMatch[i];
539
- raw = item;
540
-
541
- if (!this.options.pedantic) {
542
- // Determine if current item contains the end of the list
543
- endMatch = item.match(new RegExp('\\n\\s*\\n {0,' + (bcurr[0].length - 1) + '}\\S'));
544
- if (endMatch) {
545
- addBack = item.length - endMatch.index + itemMatch.slice(i + 1).join('\n').length;
546
- list.raw = list.raw.substring(0, list.raw.length - addBack);
547
-
548
- item = item.substring(0, endMatch.index);
549
- raw = item;
550
- l = i + 1;
551
- }
499
+ bull = isordered ? `\\d{1,9}\\${bull.slice(-1)}` : `\\${bull}`;
500
+
501
+ if (this.options.pedantic) {
502
+ bull = isordered ? bull : '[*+-]';
503
+ }
504
+
505
+ // Get next list item
506
+ const itemRegex = new RegExp(`^( {0,3}${bull})((?: [^\\n]*| *)(?:\\n[^\\n]*)*(?:\\n|$))`);
507
+
508
+ // Get each top-level item
509
+ while (src) {
510
+ if (this.rules.block.hr.test(src)) { // End list if we encounter an HR (possibly move into itemRegex?)
511
+ break;
552
512
  }
553
513
 
554
- // Determine whether the next list item belongs here.
555
- // Backpedal if it does not belong in this list.
556
- if (i !== l - 1) {
557
- bnext = this.rules.block.listItemStart.exec(itemMatch[i + 1]);
558
- if (
559
- !this.options.pedantic
560
- ? bnext[1].length >= bcurr[0].length || bnext[1].length > 3
561
- : bnext[1].length > bcurr[1].length
562
- ) {
563
- // nested list or continuation
564
- itemMatch.splice(i, 2, itemMatch[i] + (!this.options.pedantic && bnext[1].length < bcurr[0].length && !itemMatch[i].match(/\n$/) ? '' : '\n') + itemMatch[i + 1]);
565
- i--;
566
- l--;
567
- continue;
568
- } else if (
569
- // different bullet style
570
- !this.options.pedantic || this.options.smartLists
571
- ? bnext[2][bnext[2].length - 1] !== bull[bull.length - 1]
572
- : isordered === (bnext[2].length === 1)
573
- ) {
574
- addBack = itemMatch.slice(i + 1).join('\n').length;
575
- list.raw = list.raw.substring(0, list.raw.length - addBack);
576
- i = l - 1;
577
- }
578
- bcurr = bnext;
514
+ if (!(cap = itemRegex.exec(src))) {
515
+ break;
579
516
  }
580
517
 
581
- // Remove the list item's bullet
582
- // so it is seen as the next token.
583
- space = item.length;
584
- item = item.replace(/^ *([*+-]|\d+[.)]) ?/, '');
518
+ lines = cap[2].split('\n');
585
519
 
586
- // Outdent whatever the
587
- // list item contains. Hacky.
588
- if (~item.indexOf('\n ')) {
589
- space -= item.length;
590
- item = !this.options.pedantic
591
- ? item.replace(new RegExp('^ {1,' + space + '}', 'gm'), '')
592
- : item.replace(/^ {1,4}/gm, '');
520
+ if (this.options.pedantic) {
521
+ indent = 2;
522
+ itemContents = lines[0].trimLeft();
523
+ } else {
524
+ indent = cap[2].search(/[^ ]/); // Find first non-space char
525
+ indent = cap[1].length + (indent > 4 ? 1 : indent); // intented code blocks after 4 spaces; indent is always 1
526
+ itemContents = lines[0].slice(indent - cap[1].length);
593
527
  }
594
528
 
595
- // trim item newlines at end
596
- item = rtrim(item, '\n');
597
- if (i !== l - 1) {
598
- raw = raw + '\n';
529
+ blankLine = false;
530
+ raw = cap[0];
531
+
532
+ if (!lines[0] && /^ *$/.test(lines[1])) { // items begin with at most one blank line
533
+ raw = cap[1] + lines.slice(0, 2).join('\n') + '\n';
534
+ list.loose = true;
535
+ lines = [];
599
536
  }
600
537
 
601
- // Determine whether item is loose or not.
602
- // Use: /(^|\n)(?! )[^\n]+\n\n(?!\s*$)/
603
- // for discount behavior.
604
- loose = next || /\n\n(?!\s*$)/.test(raw);
605
- if (i !== l - 1) {
606
- next = raw.slice(-2) === '\n\n';
607
- if (!loose) loose = next;
538
+ const nextBulletRegex = new RegExp(`^ {0,${Math.min(3, indent - 1)}}(?:[*+-]|\\d{1,9}[.)])`);
539
+
540
+ for (i = 1; i < lines.length; i++) {
541
+ line = lines[i];
542
+
543
+ if (this.options.pedantic) { // Re-align to follow commonmark nesting rules
544
+ line = line.replace(/^ {1,4}(?=( {4})*[^ ])/g, ' ');
545
+ }
546
+
547
+ // End list item if found start of new bullet
548
+ if (nextBulletRegex.test(line)) {
549
+ raw = cap[1] + lines.slice(0, i).join('\n') + '\n';
550
+ break;
551
+ }
552
+
553
+ // Until we encounter a blank line, item contents do not need indentation
554
+ if (!blankLine) {
555
+ if (!line.trim()) { // Check if current line is empty
556
+ blankLine = true;
557
+ }
558
+
559
+ // Dedent if possible
560
+ if (line.search(/[^ ]/) >= indent) {
561
+ itemContents += '\n' + line.slice(indent);
562
+ } else {
563
+ itemContents += '\n' + line;
564
+ }
565
+ continue;
566
+ }
567
+
568
+ // Dedent this line
569
+ if (line.search(/[^ ]/) >= indent || !line.trim()) {
570
+ itemContents += '\n' + line.slice(indent);
571
+ continue;
572
+ } else { // Line was not properly indented; end of this item
573
+ raw = cap[1] + lines.slice(0, i).join('\n') + '\n';
574
+ break;
575
+ }
608
576
  }
609
577
 
610
- if (loose) {
611
- list.loose = true;
578
+ if (!list.loose) {
579
+ // If the previous item ended with a blank line, the list is loose
580
+ if (endsWithBlankLine) {
581
+ list.loose = true;
582
+ } else if (/\n *\n *$/.test(raw)) {
583
+ endsWithBlankLine = true;
584
+ }
612
585
  }
613
586
 
614
587
  // Check for task list items
615
588
  if (this.options.gfm) {
616
- istask = /^\[[ xX]\] /.test(item);
617
- ischecked = undefined;
589
+ istask = /^\[[ xX]\] /.exec(itemContents);
618
590
  if (istask) {
619
- ischecked = item[1] !== ' ';
620
- item = item.replace(/^\[[ xX]\] +/, '');
591
+ ischecked = istask[0] !== '[ ] ';
592
+ itemContents = itemContents.replace(/^\[[ xX]\] +/, '');
621
593
  }
622
594
  }
623
595
 
624
596
  list.items.push({
625
597
  type: 'list_item',
626
- raw,
627
- task: istask,
598
+ raw: raw,
599
+ task: !!istask,
628
600
  checked: ischecked,
629
- loose: loose,
630
- text: item
601
+ loose: false,
602
+ text: itemContents
631
603
  });
604
+
605
+ list.raw += raw;
606
+ src = src.slice(raw.length);
607
+ }
608
+
609
+ // Do not consume newlines at end of final item. Alternatively, make itemRegex *start* with any newlines to simplify/speed up endsWithBlankLine logic
610
+ list.items[list.items.length - 1].raw = raw.trimRight();
611
+ list.items[list.items.length - 1].text = itemContents.trimRight();
612
+ list.raw = list.raw.trimRight();
613
+
614
+ const l = list.items.length;
615
+
616
+ // Item child tokens handled here at end because we needed to have the final item to trim it first
617
+ for (i = 0; i < l; i++) {
618
+ this.lexer.state.top = false;
619
+ list.items[i].tokens = this.lexer.blockTokens(list.items[i].text, []);
620
+ if (list.items[i].tokens.some(t => t.type === 'space')) {
621
+ list.loose = true;
622
+ list.items[i].loose = true;
623
+ }
632
624
  }
633
625
 
634
626
  return list;
@@ -638,15 +630,20 @@ var Tokenizer_1 = class Tokenizer {
638
630
  html(src) {
639
631
  const cap = this.rules.block.html.exec(src);
640
632
  if (cap) {
641
- return {
642
- type: this.options.sanitize
643
- ? 'paragraph'
644
- : 'html',
633
+ const token = {
634
+ type: 'html',
645
635
  raw: cap[0],
646
636
  pre: !this.options.sanitizer
647
637
  && (cap[1] === 'pre' || cap[1] === 'script' || cap[1] === 'style'),
648
- text: this.options.sanitize ? (this.options.sanitizer ? this.options.sanitizer(cap[0]) : escape$2(cap[0])) : cap[0]
638
+ text: cap[0]
649
639
  };
640
+ if (this.options.sanitize) {
641
+ token.type = 'paragraph';
642
+ token.text = this.options.sanitizer ? this.options.sanitizer(cap[0]) : escape$2(cap[0]);
643
+ token.tokens = [];
644
+ this.lexer.inline(token.text, token.tokens);
645
+ }
646
+ return token;
650
647
  }
651
648
  }
652
649
 
@@ -670,16 +667,16 @@ var Tokenizer_1 = class Tokenizer {
670
667
  if (cap) {
671
668
  const item = {
672
669
  type: 'table',
673
- header: splitCells(cap[1].replace(/^ *| *\| *$/g, '')),
670
+ header: splitCells(cap[1]).map(c => { return { text: c }; }),
674
671
  align: cap[2].replace(/^ *|\| *$/g, '').split(/ *\| */),
675
- cells: cap[3] ? cap[3].replace(/\n$/, '').split('\n') : []
672
+ rows: cap[3] ? cap[3].replace(/\n$/, '').split('\n') : []
676
673
  };
677
674
 
678
675
  if (item.header.length === item.align.length) {
679
676
  item.raw = cap[0];
680
677
 
681
678
  let l = item.align.length;
682
- let i;
679
+ let i, j, k, row;
683
680
  for (i = 0; i < l; i++) {
684
681
  if (/^ *-+: *$/.test(item.align[i])) {
685
682
  item.align[i] = 'right';
@@ -692,11 +689,28 @@ var Tokenizer_1 = class Tokenizer {
692
689
  }
693
690
  }
694
691
 
695
- l = item.cells.length;
692
+ l = item.rows.length;
696
693
  for (i = 0; i < l; i++) {
697
- item.cells[i] = splitCells(
698
- item.cells[i].replace(/^ *\| *| *\| *$/g, ''),
699
- item.header.length);
694
+ item.rows[i] = splitCells(item.rows[i], item.header.length).map(c => { return { text: c }; });
695
+ }
696
+
697
+ // parse child tokens inside headers and cells
698
+
699
+ // header child tokens
700
+ l = item.header.length;
701
+ for (j = 0; j < l; j++) {
702
+ item.header[j].tokens = [];
703
+ this.lexer.inlineTokens(item.header[j].text, item.header[j].tokens);
704
+ }
705
+
706
+ // cell child tokens
707
+ l = item.rows.length;
708
+ for (j = 0; j < l; j++) {
709
+ row = item.rows[j];
710
+ for (k = 0; k < row.length; k++) {
711
+ row[k].tokens = [];
712
+ this.lexer.inlineTokens(row[k].text, row[k].tokens);
713
+ }
700
714
  }
701
715
 
702
716
  return item;
@@ -707,36 +721,45 @@ var Tokenizer_1 = class Tokenizer {
707
721
  lheading(src) {
708
722
  const cap = this.rules.block.lheading.exec(src);
709
723
  if (cap) {
710
- return {
724
+ const token = {
711
725
  type: 'heading',
712
726
  raw: cap[0],
713
727
  depth: cap[2].charAt(0) === '=' ? 1 : 2,
714
- text: cap[1]
728
+ text: cap[1],
729
+ tokens: []
715
730
  };
731
+ this.lexer.inline(token.text, token.tokens);
732
+ return token;
716
733
  }
717
734
  }
718
735
 
719
736
  paragraph(src) {
720
737
  const cap = this.rules.block.paragraph.exec(src);
721
738
  if (cap) {
722
- return {
739
+ const token = {
723
740
  type: 'paragraph',
724
741
  raw: cap[0],
725
742
  text: cap[1].charAt(cap[1].length - 1) === '\n'
726
743
  ? cap[1].slice(0, -1)
727
- : cap[1]
744
+ : cap[1],
745
+ tokens: []
728
746
  };
747
+ this.lexer.inline(token.text, token.tokens);
748
+ return token;
729
749
  }
730
750
  }
731
751
 
732
752
  text(src) {
733
753
  const cap = this.rules.block.text.exec(src);
734
754
  if (cap) {
735
- return {
755
+ const token = {
736
756
  type: 'text',
737
757
  raw: cap[0],
738
- text: cap[0]
758
+ text: cap[0],
759
+ tokens: []
739
760
  };
761
+ this.lexer.inline(token.text, token.tokens);
762
+ return token;
740
763
  }
741
764
  }
742
765
 
@@ -751,18 +774,18 @@ var Tokenizer_1 = class Tokenizer {
751
774
  }
752
775
  }
753
776
 
754
- tag(src, inLink, inRawBlock) {
777
+ tag(src) {
755
778
  const cap = this.rules.inline.tag.exec(src);
756
779
  if (cap) {
757
- if (!inLink && /^<a /i.test(cap[0])) {
758
- inLink = true;
759
- } else if (inLink && /^<\/a>/i.test(cap[0])) {
760
- inLink = false;
780
+ if (!this.lexer.state.inLink && /^<a /i.test(cap[0])) {
781
+ this.lexer.state.inLink = true;
782
+ } else if (this.lexer.state.inLink && /^<\/a>/i.test(cap[0])) {
783
+ this.lexer.state.inLink = false;
761
784
  }
762
- if (!inRawBlock && /^<(pre|code|kbd|script)(\s|>)/i.test(cap[0])) {
763
- inRawBlock = true;
764
- } else if (inRawBlock && /^<\/(pre|code|kbd|script)(\s|>)/i.test(cap[0])) {
765
- inRawBlock = false;
785
+ if (!this.lexer.state.inRawBlock && /^<(pre|code|kbd|script)(\s|>)/i.test(cap[0])) {
786
+ this.lexer.state.inRawBlock = true;
787
+ } else if (this.lexer.state.inRawBlock && /^<\/(pre|code|kbd|script)(\s|>)/i.test(cap[0])) {
788
+ this.lexer.state.inRawBlock = false;
766
789
  }
767
790
 
768
791
  return {
@@ -770,8 +793,8 @@ var Tokenizer_1 = class Tokenizer {
770
793
  ? 'text'
771
794
  : 'html',
772
795
  raw: cap[0],
773
- inLink,
774
- inRawBlock,
796
+ inLink: this.lexer.state.inLink,
797
+ inRawBlock: this.lexer.state.inRawBlock,
775
798
  text: this.options.sanitize
776
799
  ? (this.options.sanitizer
777
800
  ? this.options.sanitizer(cap[0])
@@ -833,7 +856,7 @@ var Tokenizer_1 = class Tokenizer {
833
856
  return outputLink(cap, {
834
857
  href: href ? href.replace(this.rules.inline._escapes, '$1') : href,
835
858
  title: title ? title.replace(this.rules.inline._escapes, '$1') : title
836
- }, cap[0]);
859
+ }, cap[0], this.lexer);
837
860
  }
838
861
  }
839
862
 
@@ -851,7 +874,7 @@ var Tokenizer_1 = class Tokenizer {
851
874
  text
852
875
  };
853
876
  }
854
- return outputLink(cap, link, cap[0]);
877
+ return outputLink(cap, link, cap[0], this.lexer);
855
878
  }
856
879
  }
857
880
 
@@ -900,18 +923,22 @@ var Tokenizer_1 = class Tokenizer {
900
923
 
901
924
  // Create `em` if smallest delimiter has odd char count. *a***
902
925
  if (Math.min(lLength, rLength) % 2) {
926
+ const text = src.slice(1, lLength + match.index + rLength);
903
927
  return {
904
928
  type: 'em',
905
929
  raw: src.slice(0, lLength + match.index + rLength + 1),
906
- text: src.slice(1, lLength + match.index + rLength)
930
+ text,
931
+ tokens: this.lexer.inlineTokens(text, [])
907
932
  };
908
933
  }
909
934
 
910
935
  // Create 'strong' if smallest delimiter has even char count. **a***
936
+ const text = src.slice(2, lLength + match.index + rLength - 1);
911
937
  return {
912
938
  type: 'strong',
913
939
  raw: src.slice(0, lLength + match.index + rLength + 1),
914
- text: src.slice(2, lLength + match.index + rLength - 1)
940
+ text,
941
+ tokens: this.lexer.inlineTokens(text, [])
915
942
  };
916
943
  }
917
944
  }
@@ -951,7 +978,8 @@ var Tokenizer_1 = class Tokenizer {
951
978
  return {
952
979
  type: 'del',
953
980
  raw: cap[0],
954
- text: cap[2]
981
+ text: cap[2],
982
+ tokens: this.lexer.inlineTokens(cap[2], [])
955
983
  };
956
984
  }
957
985
  }
@@ -1021,11 +1049,11 @@ var Tokenizer_1 = class Tokenizer {
1021
1049
  }
1022
1050
  }
1023
1051
 
1024
- inlineText(src, inRawBlock, smartypants) {
1052
+ inlineText(src, smartypants) {
1025
1053
  const cap = this.rules.inline.text.exec(src);
1026
1054
  if (cap) {
1027
1055
  let text;
1028
- if (inRawBlock) {
1056
+ if (this.lexer.state.inRawBlock) {
1029
1057
  text = this.options.sanitize ? (this.options.sanitizer ? this.options.sanitizer(cap[0]) : escape$2(cap[0])) : cap[0];
1030
1058
  } else {
1031
1059
  text = escape$2(this.options.smartypants ? smartypants(cap[0]) : cap[0]);
@@ -1051,11 +1079,11 @@ const {
1051
1079
  const block$1 = {
1052
1080
  newline: /^(?: *(?:\n|$))+/,
1053
1081
  code: /^( {4}[^\n]+(?:\n(?: *(?:\n|$))*)?)+/,
1054
- fences: /^ {0,3}(`{3,}(?=[^`\n]*\n)|~{3,})([^\n]*)\n(?:|([\s\S]*?)\n)(?: {0,3}\1[~`]* *(?:\n+|$)|$)/,
1082
+ fences: /^ {0,3}(`{3,}(?=[^`\n]*\n)|~{3,})([^\n]*)\n(?:|([\s\S]*?)\n)(?: {0,3}\1[~`]* *(?=\n|$)|$)/,
1055
1083
  hr: /^ {0,3}((?:- *){3,}|(?:_ *){3,}|(?:\* *){3,})(?:\n+|$)/,
1056
1084
  heading: /^ {0,3}(#{1,6})(?=\s|$)(.*)(?:\n+|$)/,
1057
1085
  blockquote: /^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/,
1058
- list: /^( {0,3})(bull) [\s\S]+?(?:hr|def|\n{2,}(?! )(?! {0,3}bull )\n*|\s*$)/,
1086
+ list: /^( {0,3}bull)( [^\n]+?)?(?:\n|$)/,
1059
1087
  html: '^ {0,3}(?:' // optional indentation
1060
1088
  + '<(script|pre|style|textarea)[\\s>][\\s\\S]*?(?:</\\1>[^\\n]*\\n+|$)' // (1)
1061
1089
  + '|comment[^\\n]*(\\n+|$)' // (2)
@@ -1067,7 +1095,6 @@ const block$1 = {
1067
1095
  + '|</(?!script|pre|style|textarea)[a-z][\\w-]*\\s*>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n *)+\\n|$)' // (7) closing tag
1068
1096
  + ')',
1069
1097
  def: /^ {0,3}\[(label)\]: *\n? *<?([^\s>]+)>?(?:(?: +\n? *| *\n *)(title))? *(?:\n+|$)/,
1070
- nptable: noopTest,
1071
1098
  table: noopTest,
1072
1099
  lheading: /^([^\n]+)\n {0,3}(=+|-+) *(?:\n+|$)/,
1073
1100
  // regex template, placeholders will be replaced according to different paragraph
@@ -1084,11 +1111,6 @@ block$1.def = edit(block$1.def)
1084
1111
  .getRegex();
1085
1112
 
1086
1113
  block$1.bullet = /(?:[*+-]|\d{1,9}[.)])/;
1087
- block$1.item = /^( *)(bull) ?[^\n]*(?:\n(?! *bull ?)[^\n]*)*/;
1088
- block$1.item = edit(block$1.item, 'gm')
1089
- .replace(/bull/g, block$1.bullet)
1090
- .getRegex();
1091
-
1092
1114
  block$1.listItemStart = edit(/^( *)(bull) */)
1093
1115
  .replace('bull', block$1.bullet)
1094
1116
  .getRegex();
@@ -1138,25 +1160,11 @@ block$1.normal = merge$1({}, block$1);
1138
1160
  */
1139
1161
 
1140
1162
  block$1.gfm = merge$1({}, block$1.normal, {
1141
- nptable: '^ *([^|\\n ].*\\|.*)\\n' // Header
1142
- + ' {0,3}([-:]+ *\\|[-| :]*)' // Align
1143
- + '(?:\\n((?:(?!\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)', // Cells
1144
- table: '^ *\\|(.+)\\n' // Header
1145
- + ' {0,3}\\|?( *[-:]+[-| :]*)' // Align
1146
- + '(?:\\n *((?:(?!\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)' // Cells
1163
+ table: '^ *([^\\n ].*\\|.*)\\n' // Header
1164
+ + ' {0,3}(?:\\| *)?(:?-+:? *(?:\\| *:?-+:? *)*)(?:\\| *)?' // Align
1165
+ + '(?:\\n((?:(?! *\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)' // Cells
1147
1166
  });
1148
1167
 
1149
- block$1.gfm.nptable = edit(block$1.gfm.nptable)
1150
- .replace('hr', block$1.hr)
1151
- .replace('heading', ' {0,3}#{1,6} ')
1152
- .replace('blockquote', ' {0,3}>')
1153
- .replace('code', ' {4}[^\\n]')
1154
- .replace('fences', ' {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n')
1155
- .replace('list', ' {0,3}(?:[*+-]|1[.)]) ') // only lists starting from 1 can interrupt
1156
- .replace('html', '</?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|textarea|!--)')
1157
- .replace('tag', block$1._tag) // tables can be interrupted by type (6) html blocks
1158
- .getRegex();
1159
-
1160
1168
  block$1.gfm.table = edit(block$1.gfm.table)
1161
1169
  .replace('hr', block$1.hr)
1162
1170
  .replace('heading', ' {0,3}#{1,6} ')
@@ -1407,6 +1415,13 @@ var Lexer_1 = class Lexer {
1407
1415
  this.options.tokenizer = this.options.tokenizer || new Tokenizer$1();
1408
1416
  this.tokenizer = this.options.tokenizer;
1409
1417
  this.tokenizer.options = this.options;
1418
+ this.tokenizer.lexer = this;
1419
+ this.inlineQueue = [];
1420
+ this.state = {
1421
+ inLink: false,
1422
+ inRawBlock: false,
1423
+ top: true
1424
+ };
1410
1425
 
1411
1426
  const rules = {
1412
1427
  block: block.normal,
@@ -1461,9 +1476,12 @@ var Lexer_1 = class Lexer {
1461
1476
  .replace(/\r\n|\r/g, '\n')
1462
1477
  .replace(/\t/g, ' ');
1463
1478
 
1464
- this.blockTokens(src, this.tokens, true);
1479
+ this.blockTokens(src, this.tokens);
1465
1480
 
1466
- this.inline(this.tokens);
1481
+ let next;
1482
+ while (next = this.inlineQueue.shift()) {
1483
+ this.inlineTokens(next.src, next.tokens);
1484
+ }
1467
1485
 
1468
1486
  return this.tokens;
1469
1487
  }
@@ -1471,17 +1489,17 @@ var Lexer_1 = class Lexer {
1471
1489
  /**
1472
1490
  * Lexing
1473
1491
  */
1474
- blockTokens(src, tokens = [], top = true) {
1492
+ blockTokens(src, tokens = []) {
1475
1493
  if (this.options.pedantic) {
1476
1494
  src = src.replace(/^ +$/gm, '');
1477
1495
  }
1478
- let token, i, l, lastToken, cutSrc, lastParagraphClipped;
1496
+ let token, lastToken, cutSrc, lastParagraphClipped;
1479
1497
 
1480
1498
  while (src) {
1481
1499
  if (this.options.extensions
1482
1500
  && this.options.extensions.block
1483
1501
  && this.options.extensions.block.some((extTokenizer) => {
1484
- if (token = extTokenizer.call(this, src, tokens)) {
1502
+ if (token = extTokenizer.call({ lexer: this }, src, tokens)) {
1485
1503
  src = src.substring(token.raw.length);
1486
1504
  tokens.push(token);
1487
1505
  return true;
@@ -1505,9 +1523,10 @@ var Lexer_1 = class Lexer {
1505
1523
  src = src.substring(token.raw.length);
1506
1524
  lastToken = tokens[tokens.length - 1];
1507
1525
  // An indented code block cannot interrupt a paragraph.
1508
- if (lastToken && lastToken.type === 'paragraph') {
1526
+ if (lastToken && (lastToken.type === 'paragraph' || lastToken.type === 'text')) {
1509
1527
  lastToken.raw += '\n' + token.raw;
1510
1528
  lastToken.text += '\n' + token.text;
1529
+ this.inlineQueue[this.inlineQueue.length - 1].src = lastToken.text;
1511
1530
  } else {
1512
1531
  tokens.push(token);
1513
1532
  }
@@ -1528,13 +1547,6 @@ var Lexer_1 = class Lexer {
1528
1547
  continue;
1529
1548
  }
1530
1549
 
1531
- // table no leading pipe (gfm)
1532
- if (token = this.tokenizer.nptable(src)) {
1533
- src = src.substring(token.raw.length);
1534
- tokens.push(token);
1535
- continue;
1536
- }
1537
-
1538
1550
  // hr
1539
1551
  if (token = this.tokenizer.hr(src)) {
1540
1552
  src = src.substring(token.raw.length);
@@ -1545,7 +1557,6 @@ var Lexer_1 = class Lexer {
1545
1557
  // blockquote
1546
1558
  if (token = this.tokenizer.blockquote(src)) {
1547
1559
  src = src.substring(token.raw.length);
1548
- token.tokens = this.blockTokens(token.text, [], top);
1549
1560
  tokens.push(token);
1550
1561
  continue;
1551
1562
  }
@@ -1553,10 +1564,6 @@ var Lexer_1 = class Lexer {
1553
1564
  // list
1554
1565
  if (token = this.tokenizer.list(src)) {
1555
1566
  src = src.substring(token.raw.length);
1556
- l = token.items.length;
1557
- for (i = 0; i < l; i++) {
1558
- token.items[i].tokens = this.blockTokens(token.items[i].text, [], false);
1559
- }
1560
1567
  tokens.push(token);
1561
1568
  continue;
1562
1569
  }
@@ -1569,9 +1576,14 @@ var Lexer_1 = class Lexer {
1569
1576
  }
1570
1577
 
1571
1578
  // def
1572
- if (top && (token = this.tokenizer.def(src))) {
1579
+ if (token = this.tokenizer.def(src)) {
1573
1580
  src = src.substring(token.raw.length);
1574
- if (!this.tokens.links[token.tag]) {
1581
+ lastToken = tokens[tokens.length - 1];
1582
+ if (lastToken && (lastToken.type === 'paragraph' || lastToken.type === 'text')) {
1583
+ lastToken.raw += '\n' + token.raw;
1584
+ lastToken.text += '\n' + token.raw;
1585
+ this.inlineQueue[this.inlineQueue.length - 1].src = lastToken.text;
1586
+ } else if (!this.tokens.links[token.tag]) {
1575
1587
  this.tokens.links[token.tag] = {
1576
1588
  href: token.href,
1577
1589
  title: token.title
@@ -1602,18 +1614,20 @@ var Lexer_1 = class Lexer {
1602
1614
  const tempSrc = src.slice(1);
1603
1615
  let tempStart;
1604
1616
  this.options.extensions.startBlock.forEach(function(getStartIndex) {
1605
- tempStart = getStartIndex.call(this, tempSrc);
1617
+ tempStart = getStartIndex.call({ lexer: this }, tempSrc);
1606
1618
  if (typeof tempStart === 'number' && tempStart >= 0) { startIndex = Math.min(startIndex, tempStart); }
1607
1619
  });
1608
1620
  if (startIndex < Infinity && startIndex >= 0) {
1609
1621
  cutSrc = src.substring(0, startIndex + 1);
1610
1622
  }
1611
1623
  }
1612
- if (top && (token = this.tokenizer.paragraph(cutSrc))) {
1624
+ if (this.state.top && (token = this.tokenizer.paragraph(cutSrc))) {
1613
1625
  lastToken = tokens[tokens.length - 1];
1614
1626
  if (lastParagraphClipped && lastToken.type === 'paragraph') {
1615
1627
  lastToken.raw += '\n' + token.raw;
1616
1628
  lastToken.text += '\n' + token.text;
1629
+ this.inlineQueue.pop();
1630
+ this.inlineQueue[this.inlineQueue.length - 1].src = lastToken.text;
1617
1631
  } else {
1618
1632
  tokens.push(token);
1619
1633
  }
@@ -1629,6 +1643,8 @@ var Lexer_1 = class Lexer {
1629
1643
  if (lastToken && lastToken.type === 'text') {
1630
1644
  lastToken.raw += '\n' + token.raw;
1631
1645
  lastToken.text += '\n' + token.text;
1646
+ this.inlineQueue.pop();
1647
+ this.inlineQueue[this.inlineQueue.length - 1].src = lastToken.text;
1632
1648
  } else {
1633
1649
  tokens.push(token);
1634
1650
  }
@@ -1646,75 +1662,18 @@ var Lexer_1 = class Lexer {
1646
1662
  }
1647
1663
  }
1648
1664
 
1665
+ this.state.top = true;
1649
1666
  return tokens;
1650
1667
  }
1651
1668
 
1652
- inline(tokens) {
1653
- let i,
1654
- j,
1655
- k,
1656
- l2,
1657
- row,
1658
- token;
1659
-
1660
- const l = tokens.length;
1661
- for (i = 0; i < l; i++) {
1662
- token = tokens[i];
1663
- switch (token.type) {
1664
- case 'paragraph':
1665
- case 'text':
1666
- case 'heading': {
1667
- token.tokens = [];
1668
- this.inlineTokens(token.text, token.tokens);
1669
- break;
1670
- }
1671
- case 'table': {
1672
- token.tokens = {
1673
- header: [],
1674
- cells: []
1675
- };
1676
-
1677
- // header
1678
- l2 = token.header.length;
1679
- for (j = 0; j < l2; j++) {
1680
- token.tokens.header[j] = [];
1681
- this.inlineTokens(token.header[j], token.tokens.header[j]);
1682
- }
1683
-
1684
- // cells
1685
- l2 = token.cells.length;
1686
- for (j = 0; j < l2; j++) {
1687
- row = token.cells[j];
1688
- token.tokens.cells[j] = [];
1689
- for (k = 0; k < row.length; k++) {
1690
- token.tokens.cells[j][k] = [];
1691
- this.inlineTokens(row[k], token.tokens.cells[j][k]);
1692
- }
1693
- }
1694
-
1695
- break;
1696
- }
1697
- case 'blockquote': {
1698
- this.inline(token.tokens);
1699
- break;
1700
- }
1701
- case 'list': {
1702
- l2 = token.items.length;
1703
- for (j = 0; j < l2; j++) {
1704
- this.inline(token.items[j].tokens);
1705
- }
1706
- break;
1707
- }
1708
- }
1709
- }
1710
-
1711
- return tokens;
1669
+ inline(src, tokens) {
1670
+ this.inlineQueue.push({ src, tokens });
1712
1671
  }
1713
1672
 
1714
1673
  /**
1715
1674
  * Lexing/Compiling
1716
1675
  */
1717
- inlineTokens(src, tokens = [], inLink = false, inRawBlock = false) {
1676
+ inlineTokens(src, tokens = []) {
1718
1677
  let token, lastToken, cutSrc;
1719
1678
 
1720
1679
  // String with links masked to avoid interference with em and strong
@@ -1753,7 +1712,7 @@ var Lexer_1 = class Lexer {
1753
1712
  if (this.options.extensions
1754
1713
  && this.options.extensions.inline
1755
1714
  && this.options.extensions.inline.some((extTokenizer) => {
1756
- if (token = extTokenizer.call(this, src, tokens)) {
1715
+ if (token = extTokenizer.call({ lexer: this }, src, tokens)) {
1757
1716
  src = src.substring(token.raw.length);
1758
1717
  tokens.push(token);
1759
1718
  return true;
@@ -1771,10 +1730,8 @@ var Lexer_1 = class Lexer {
1771
1730
  }
1772
1731
 
1773
1732
  // tag
1774
- if (token = this.tokenizer.tag(src, inLink, inRawBlock)) {
1733
+ if (token = this.tokenizer.tag(src)) {
1775
1734
  src = src.substring(token.raw.length);
1776
- inLink = token.inLink;
1777
- inRawBlock = token.inRawBlock;
1778
1735
  lastToken = tokens[tokens.length - 1];
1779
1736
  if (lastToken && token.type === 'text' && lastToken.type === 'text') {
1780
1737
  lastToken.raw += token.raw;
@@ -1788,9 +1745,6 @@ var Lexer_1 = class Lexer {
1788
1745
  // link
1789
1746
  if (token = this.tokenizer.link(src)) {
1790
1747
  src = src.substring(token.raw.length);
1791
- if (token.type === 'link') {
1792
- token.tokens = this.inlineTokens(token.text, [], true, inRawBlock);
1793
- }
1794
1748
  tokens.push(token);
1795
1749
  continue;
1796
1750
  }
@@ -1799,10 +1753,7 @@ var Lexer_1 = class Lexer {
1799
1753
  if (token = this.tokenizer.reflink(src, this.tokens.links)) {
1800
1754
  src = src.substring(token.raw.length);
1801
1755
  lastToken = tokens[tokens.length - 1];
1802
- if (token.type === 'link') {
1803
- token.tokens = this.inlineTokens(token.text, [], true, inRawBlock);
1804
- tokens.push(token);
1805
- } else if (lastToken && token.type === 'text' && lastToken.type === 'text') {
1756
+ if (lastToken && token.type === 'text' && lastToken.type === 'text') {
1806
1757
  lastToken.raw += token.raw;
1807
1758
  lastToken.text += token.text;
1808
1759
  } else {
@@ -1814,7 +1765,6 @@ var Lexer_1 = class Lexer {
1814
1765
  // em & strong
1815
1766
  if (token = this.tokenizer.emStrong(src, maskedSrc, prevChar)) {
1816
1767
  src = src.substring(token.raw.length);
1817
- token.tokens = this.inlineTokens(token.text, [], inLink, inRawBlock);
1818
1768
  tokens.push(token);
1819
1769
  continue;
1820
1770
  }
@@ -1836,7 +1786,6 @@ var Lexer_1 = class Lexer {
1836
1786
  // del (gfm)
1837
1787
  if (token = this.tokenizer.del(src)) {
1838
1788
  src = src.substring(token.raw.length);
1839
- token.tokens = this.inlineTokens(token.text, [], inLink, inRawBlock);
1840
1789
  tokens.push(token);
1841
1790
  continue;
1842
1791
  }
@@ -1849,7 +1798,7 @@ var Lexer_1 = class Lexer {
1849
1798
  }
1850
1799
 
1851
1800
  // url (gfm)
1852
- if (!inLink && (token = this.tokenizer.url(src, mangle))) {
1801
+ if (!this.state.inLink && (token = this.tokenizer.url(src, mangle))) {
1853
1802
  src = src.substring(token.raw.length);
1854
1803
  tokens.push(token);
1855
1804
  continue;
@@ -1863,14 +1812,14 @@ var Lexer_1 = class Lexer {
1863
1812
  const tempSrc = src.slice(1);
1864
1813
  let tempStart;
1865
1814
  this.options.extensions.startInline.forEach(function(getStartIndex) {
1866
- tempStart = getStartIndex.call(this, tempSrc);
1815
+ tempStart = getStartIndex.call({ lexer: this }, tempSrc);
1867
1816
  if (typeof tempStart === 'number' && tempStart >= 0) { startIndex = Math.min(startIndex, tempStart); }
1868
1817
  });
1869
1818
  if (startIndex < Infinity && startIndex >= 0) {
1870
1819
  cutSrc = src.substring(0, startIndex + 1);
1871
1820
  }
1872
1821
  }
1873
- if (token = this.tokenizer.inlineText(cutSrc, inRawBlock, smartypants)) {
1822
+ if (token = this.tokenizer.inlineText(cutSrc, smartypants)) {
1874
1823
  src = src.substring(token.raw.length);
1875
1824
  if (token.raw.slice(-1) !== '_') { // Track prevChar before string of ____ started
1876
1825
  prevChar = token.raw.slice(-1);
@@ -2231,7 +2180,7 @@ var Parser_1 = class Parser {
2231
2180
 
2232
2181
  // Run any renderer extensions
2233
2182
  if (this.options.extensions && this.options.extensions.renderers && this.options.extensions.renderers[token.type]) {
2234
- ret = this.options.extensions.renderers[token.type].call(this, token);
2183
+ ret = this.options.extensions.renderers[token.type].call({ parser: this }, token);
2235
2184
  if (ret !== false || !['space', 'hr', 'heading', 'code', 'table', 'blockquote', 'list', 'html', 'paragraph', 'text'].includes(token.type)) {
2236
2185
  out += ret || '';
2237
2186
  continue;
@@ -2268,22 +2217,22 @@ var Parser_1 = class Parser {
2268
2217
  l2 = token.header.length;
2269
2218
  for (j = 0; j < l2; j++) {
2270
2219
  cell += this.renderer.tablecell(
2271
- this.parseInline(token.tokens.header[j]),
2220
+ this.parseInline(token.header[j].tokens),
2272
2221
  { header: true, align: token.align[j] }
2273
2222
  );
2274
2223
  }
2275
2224
  header += this.renderer.tablerow(cell);
2276
2225
 
2277
2226
  body = '';
2278
- l2 = token.cells.length;
2227
+ l2 = token.rows.length;
2279
2228
  for (j = 0; j < l2; j++) {
2280
- row = token.tokens.cells[j];
2229
+ row = token.rows[j];
2281
2230
 
2282
2231
  cell = '';
2283
2232
  l3 = row.length;
2284
2233
  for (k = 0; k < l3; k++) {
2285
2234
  cell += this.renderer.tablecell(
2286
- this.parseInline(row[k]),
2235
+ this.parseInline(row[k].tokens),
2287
2236
  { header: false, align: token.align[k] }
2288
2237
  );
2289
2238
  }
@@ -2314,7 +2263,7 @@ var Parser_1 = class Parser {
2314
2263
  if (item.task) {
2315
2264
  checkbox = this.renderer.checkbox(checked);
2316
2265
  if (loose) {
2317
- if (item.tokens.length > 0 && item.tokens[0].type === 'text') {
2266
+ if (item.tokens.length > 0 && item.tokens[0].type === 'paragraph') {
2318
2267
  item.tokens[0].text = checkbox + ' ' + item.tokens[0].text;
2319
2268
  if (item.tokens[0].tokens && item.tokens[0].tokens.length > 0 && item.tokens[0].tokens[0].type === 'text') {
2320
2269
  item.tokens[0].tokens[0].text = checkbox + ' ' + item.tokens[0].tokens[0].text;
@@ -2387,7 +2336,7 @@ var Parser_1 = class Parser {
2387
2336
 
2388
2337
  // Run any renderer extensions
2389
2338
  if (this.options.extensions && this.options.extensions.renderers && this.options.extensions.renderers[token.type]) {
2390
- ret = this.options.extensions.renderers[token.type].call(this, token);
2339
+ ret = this.options.extensions.renderers[token.type].call({ parser: this }, token);
2391
2340
  if (ret !== false || !['escape', 'html', 'link', 'image', 'strong', 'em', 'codespan', 'br', 'del', 'text'].includes(token.type)) {
2392
2341
  out += ret || '';
2393
2342
  continue;
@@ -2712,12 +2661,12 @@ marked.walkTokens = function(tokens, callback) {
2712
2661
  callback(token);
2713
2662
  switch (token.type) {
2714
2663
  case 'table': {
2715
- for (const cell of token.tokens.header) {
2716
- marked.walkTokens(cell, callback);
2664
+ for (const cell of token.header) {
2665
+ marked.walkTokens(cell.tokens, callback);
2717
2666
  }
2718
- for (const row of token.tokens.cells) {
2667
+ for (const row of token.rows) {
2719
2668
  for (const cell of row) {
2720
- marked.walkTokens(cell, callback);
2669
+ marked.walkTokens(cell.tokens, callback);
2721
2670
  }
2722
2671
  }
2723
2672
  break;
@@ -2793,4 +2742,4 @@ marked.parse = marked;
2793
2742
 
2794
2743
  var marked_1 = marked;
2795
2744
 
2796
- export default marked_1;
2745
+ export { marked_1 as default };