marked 1.2.9 → 2.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.js CHANGED
@@ -78,7 +78,7 @@
78
78
  return fn(module, module.exports), module.exports;
79
79
  }
80
80
 
81
- var defaults = createCommonjsModule(function (module) {
81
+ var defaults$5 = createCommonjsModule(function (module) {
82
82
  function getDefaults() {
83
83
  return {
84
84
  baseUrl: null,
@@ -132,7 +132,7 @@
132
132
  return escapeReplacements[ch];
133
133
  };
134
134
 
135
- function escape(html, encode) {
135
+ function escape$2(html, encode) {
136
136
  if (encode) {
137
137
  if (escapeTest.test(html)) {
138
138
  return html.replace(escapeReplace, getEscapeReplacement);
@@ -148,7 +148,7 @@
148
148
 
149
149
  var unescapeTest = /&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/ig;
150
150
 
151
- function unescape(html) {
151
+ function unescape$1(html) {
152
152
  // explicitly match decimal, hex, and named HTML entities
153
153
  return html.replace(unescapeTest, function (_, n) {
154
154
  n = n.toLowerCase();
@@ -164,7 +164,7 @@
164
164
 
165
165
  var caret = /(^|[^\[])\^/g;
166
166
 
167
- function edit(regex, opt) {
167
+ function edit$1(regex, opt) {
168
168
  regex = regex.source || regex;
169
169
  opt = opt || '';
170
170
  var obj = {
@@ -184,12 +184,12 @@
184
184
  var nonWordAndColonTest = /[^\w:]/g;
185
185
  var originIndependentUrl = /^$|^[a-z][a-z0-9+.-]*:|^[?#]/i;
186
186
 
187
- function cleanUrl(sanitize, base, href) {
187
+ function cleanUrl$1(sanitize, base, href) {
188
188
  if (sanitize) {
189
189
  var prot;
190
190
 
191
191
  try {
192
- prot = decodeURIComponent(unescape(href)).replace(nonWordAndColonTest, '').toLowerCase();
192
+ prot = decodeURIComponent(unescape$1(href)).replace(nonWordAndColonTest, '').toLowerCase();
193
193
  } catch (e) {
194
194
  return null;
195
195
  }
@@ -225,7 +225,7 @@
225
225
  if (justDomain.test(base)) {
226
226
  baseUrls[' ' + base] = base + '/';
227
227
  } else {
228
- baseUrls[' ' + base] = rtrim(base, '/', true);
228
+ baseUrls[' ' + base] = rtrim$1(base, '/', true);
229
229
  }
230
230
  }
231
231
 
@@ -249,11 +249,11 @@
249
249
  }
250
250
  }
251
251
 
252
- var noopTest = {
252
+ var noopTest$1 = {
253
253
  exec: function noopTest() {}
254
254
  };
255
255
 
256
- function merge(obj) {
256
+ function merge$2(obj) {
257
257
  var i = 1,
258
258
  target,
259
259
  key;
@@ -271,7 +271,7 @@
271
271
  return obj;
272
272
  }
273
273
 
274
- function splitCells(tableRow, count) {
274
+ function splitCells$1(tableRow, count) {
275
275
  // ensure that every cell-delimiting pipe has a space
276
276
  // before it to distinguish it from an escaped pipe
277
277
  var row = tableRow.replace(/\|/g, function (match, offset, str) {
@@ -313,7 +313,7 @@
313
313
  // invert: Remove suffix of non-c chars instead. Default falsey.
314
314
 
315
315
 
316
- function rtrim(str, c, invert) {
316
+ function rtrim$1(str, c, invert) {
317
317
  var l = str.length;
318
318
 
319
319
  if (l === 0) {
@@ -338,7 +338,7 @@
338
338
  return str.substr(0, l - suffLen);
339
339
  }
340
340
 
341
- function findClosingBracket(str, b) {
341
+ function findClosingBracket$1(str, b) {
342
342
  if (str.indexOf(b[1]) === -1) {
343
343
  return -1;
344
344
  }
@@ -364,14 +364,14 @@
364
364
  return -1;
365
365
  }
366
366
 
367
- function checkSanitizeDeprecation(opt) {
367
+ function checkSanitizeDeprecation$1(opt) {
368
368
  if (opt && opt.sanitize && !opt.silent) {
369
369
  console.warn('marked(): sanitize and sanitizer parameters are deprecated since version 0.7.0, should not be used and will be removed in the future. Read more here: https://marked.js.org/#/USING_ADVANCED.md#options');
370
370
  }
371
371
  } // copied from https://stackoverflow.com/a/5450113/806777
372
372
 
373
373
 
374
- function repeatString(pattern, count) {
374
+ function repeatString$1(pattern, count) {
375
375
  if (count < 1) {
376
376
  return '';
377
377
  }
@@ -391,25 +391,25 @@
391
391
  }
392
392
 
393
393
  var helpers = {
394
- escape: escape,
395
- unescape: unescape,
396
- edit: edit,
397
- cleanUrl: cleanUrl,
394
+ escape: escape$2,
395
+ unescape: unescape$1,
396
+ edit: edit$1,
397
+ cleanUrl: cleanUrl$1,
398
398
  resolveUrl: resolveUrl,
399
- noopTest: noopTest,
400
- merge: merge,
401
- splitCells: splitCells,
402
- rtrim: rtrim,
403
- findClosingBracket: findClosingBracket,
404
- checkSanitizeDeprecation: checkSanitizeDeprecation,
405
- repeatString: repeatString
399
+ noopTest: noopTest$1,
400
+ merge: merge$2,
401
+ splitCells: splitCells$1,
402
+ rtrim: rtrim$1,
403
+ findClosingBracket: findClosingBracket$1,
404
+ checkSanitizeDeprecation: checkSanitizeDeprecation$1,
405
+ repeatString: repeatString$1
406
406
  };
407
407
 
408
- var defaults$1 = defaults.defaults;
409
- var rtrim$1 = helpers.rtrim,
410
- splitCells$1 = helpers.splitCells,
408
+ var defaults$4 = defaults$5.defaults;
409
+ var rtrim = helpers.rtrim,
410
+ splitCells = helpers.splitCells,
411
411
  _escape = helpers.escape,
412
- findClosingBracket$1 = helpers.findClosingBracket;
412
+ findClosingBracket = helpers.findClosingBracket;
413
413
 
414
414
  function outputLink(cap, link, raw) {
415
415
  var href = link.href;
@@ -466,7 +466,7 @@
466
466
 
467
467
  var Tokenizer_1 = /*#__PURE__*/function () {
468
468
  function Tokenizer(options) {
469
- this.options = options || defaults$1;
469
+ this.options = options || defaults$4;
470
470
  }
471
471
 
472
472
  var _proto = Tokenizer.prototype;
@@ -488,25 +488,16 @@
488
488
  }
489
489
  };
490
490
 
491
- _proto.code = function code(src, tokens) {
491
+ _proto.code = function code(src) {
492
492
  var cap = this.rules.block.code.exec(src);
493
493
 
494
494
  if (cap) {
495
- var lastToken = tokens[tokens.length - 1]; // An indented code block cannot interrupt a paragraph.
496
-
497
- if (lastToken && lastToken.type === 'paragraph') {
498
- return {
499
- raw: cap[0],
500
- text: cap[0].trimRight()
501
- };
502
- }
503
-
504
495
  var text = cap[0].replace(/^ {1,4}/gm, '');
505
496
  return {
506
497
  type: 'code',
507
498
  raw: cap[0],
508
499
  codeBlockStyle: 'indented',
509
- text: !this.options.pedantic ? rtrim$1(text, '\n') : text
500
+ text: !this.options.pedantic ? rtrim(text, '\n') : text
510
501
  };
511
502
  }
512
503
  };
@@ -533,7 +524,7 @@
533
524
  var text = cap[2].trim(); // remove trailing #s
534
525
 
535
526
  if (/#$/.test(text)) {
536
- var trimmed = rtrim$1(text, '#');
527
+ var trimmed = rtrim(text, '#');
537
528
 
538
529
  if (this.options.pedantic) {
539
530
  text = trimmed.trim();
@@ -558,7 +549,7 @@
558
549
  if (cap) {
559
550
  var item = {
560
551
  type: 'table',
561
- header: splitCells$1(cap[1].replace(/^ *| *\| *$/g, '')),
552
+ header: splitCells(cap[1].replace(/^ *| *\| *$/g, '')),
562
553
  align: cap[2].replace(/^ *|\| *$/g, '').split(/ *\| */),
563
554
  cells: cap[3] ? cap[3].replace(/\n$/, '').split('\n') : [],
564
555
  raw: cap[0]
@@ -583,7 +574,7 @@
583
574
  l = item.cells.length;
584
575
 
585
576
  for (i = 0; i < l; i++) {
586
- item.cells[i] = splitCells$1(item.cells[i], item.header.length);
577
+ item.cells[i] = splitCells(item.cells[i], item.header.length);
587
578
  }
588
579
 
589
580
  return item;
@@ -640,31 +631,44 @@
640
631
  addBack,
641
632
  loose,
642
633
  istask,
643
- ischecked;
634
+ ischecked,
635
+ endMatch;
644
636
  var l = itemMatch.length;
645
637
  bcurr = this.rules.block.listItemStart.exec(itemMatch[0]);
646
638
 
647
639
  for (var i = 0; i < l; i++) {
648
640
  item = itemMatch[i];
649
- raw = item; // Determine whether the next list item belongs here.
641
+ raw = item;
642
+
643
+ if (!this.options.pedantic) {
644
+ // Determine if current item contains the end of the list
645
+ endMatch = item.match(new RegExp('\\n\\s*\\n {0,' + (bcurr[0].length - 1) + '}\\S'));
646
+
647
+ if (endMatch) {
648
+ addBack = item.length - endMatch.index + itemMatch.slice(i + 1).join('\n').length;
649
+ list.raw = list.raw.substring(0, list.raw.length - addBack);
650
+ item = item.substring(0, endMatch.index);
651
+ raw = item;
652
+ l = i + 1;
653
+ }
654
+ } // Determine whether the next list item belongs here.
650
655
  // Backpedal if it does not belong in this list.
651
656
 
657
+
652
658
  if (i !== l - 1) {
653
659
  bnext = this.rules.block.listItemStart.exec(itemMatch[i + 1]);
654
660
 
655
- if (!this.options.pedantic ? bnext[1].length > bcurr[0].length || bnext[1].length > 3 : bnext[1].length > bcurr[1].length) {
656
- // nested list
657
- itemMatch.splice(i, 2, itemMatch[i] + '\n' + itemMatch[i + 1]);
661
+ if (!this.options.pedantic ? bnext[1].length >= bcurr[0].length || bnext[1].length > 3 : bnext[1].length > bcurr[1].length) {
662
+ // nested list or continuation
663
+ itemMatch.splice(i, 2, itemMatch[i] + (!this.options.pedantic && bnext[1].length < bcurr[0].length && !itemMatch[i].match(/\n$/) ? '' : '\n') + itemMatch[i + 1]);
658
664
  i--;
659
665
  l--;
660
666
  continue;
661
- } else {
662
- if ( // different bullet style
663
- !this.options.pedantic || this.options.smartLists ? bnext[2][bnext[2].length - 1] !== bull[bull.length - 1] : isordered === (bnext[2].length === 1)) {
664
- addBack = itemMatch.slice(i + 1).join('\n');
665
- list.raw = list.raw.substring(0, list.raw.length - addBack.length);
666
- i = l - 1;
667
- }
667
+ } else if ( // different bullet style
668
+ !this.options.pedantic || this.options.smartLists ? bnext[2][bnext[2].length - 1] !== bull[bull.length - 1] : isordered === (bnext[2].length === 1)) {
669
+ addBack = itemMatch.slice(i + 1).join('\n').length;
670
+ list.raw = list.raw.substring(0, list.raw.length - addBack);
671
+ i = l - 1;
668
672
  }
669
673
 
670
674
  bcurr = bnext;
@@ -679,15 +683,22 @@
679
683
  if (~item.indexOf('\n ')) {
680
684
  space -= item.length;
681
685
  item = !this.options.pedantic ? item.replace(new RegExp('^ {1,' + space + '}', 'gm'), '') : item.replace(/^ {1,4}/gm, '');
686
+ } // trim item newlines at end
687
+
688
+
689
+ item = rtrim(item, '\n');
690
+
691
+ if (i !== l - 1) {
692
+ raw = raw + '\n';
682
693
  } // Determine whether item is loose or not.
683
694
  // Use: /(^|\n)(?! )[^\n]+\n\n(?!\s*$)/
684
695
  // for discount behavior.
685
696
 
686
697
 
687
- loose = next || /\n\n(?!\s*$)/.test(item);
698
+ loose = next || /\n\n(?!\s*$)/.test(raw);
688
699
 
689
700
  if (i !== l - 1) {
690
- next = item.charAt(item.length - 1) === '\n';
701
+ next = raw.slice(-2) === '\n\n';
691
702
  if (!loose) loose = next;
692
703
  }
693
704
 
@@ -740,6 +751,7 @@
740
751
  if (cap[3]) cap[3] = cap[3].substring(1, cap[3].length - 1);
741
752
  var tag = cap[1].toLowerCase().replace(/\s+/g, ' ');
742
753
  return {
754
+ type: 'def',
743
755
  tag: tag,
744
756
  raw: cap[0],
745
757
  href: cap[2],
@@ -754,7 +766,7 @@
754
766
  if (cap) {
755
767
  var item = {
756
768
  type: 'table',
757
- header: splitCells$1(cap[1].replace(/^ *| *\| *$/g, '')),
769
+ header: splitCells(cap[1].replace(/^ *| *\| *$/g, '')),
758
770
  align: cap[2].replace(/^ *|\| *$/g, '').split(/ *\| */),
759
771
  cells: cap[3] ? cap[3].replace(/\n$/, '').split('\n') : []
760
772
  };
@@ -779,7 +791,7 @@
779
791
  l = item.cells.length;
780
792
 
781
793
  for (i = 0; i < l; i++) {
782
- item.cells[i] = splitCells$1(item.cells[i].replace(/^ *\| *| *\| *$/g, ''), item.header.length);
794
+ item.cells[i] = splitCells(item.cells[i].replace(/^ *\| *| *\| *$/g, ''), item.header.length);
783
795
  }
784
796
 
785
797
  return item;
@@ -812,19 +824,10 @@
812
824
  }
813
825
  };
814
826
 
815
- _proto.text = function text(src, tokens) {
827
+ _proto.text = function text(src) {
816
828
  var cap = this.rules.block.text.exec(src);
817
829
 
818
830
  if (cap) {
819
- var lastToken = tokens[tokens.length - 1];
820
-
821
- if (lastToken && lastToken.type === 'text') {
822
- return {
823
- raw: cap[0],
824
- text: cap[0]
825
- };
826
- }
827
-
828
831
  return {
829
832
  type: 'text',
830
833
  raw: cap[0],
@@ -884,14 +887,14 @@
884
887
  } // ending angle bracket cannot be escaped
885
888
 
886
889
 
887
- var rtrimSlash = rtrim$1(trimmedUrl.slice(0, -1), '\\');
890
+ var rtrimSlash = rtrim(trimmedUrl.slice(0, -1), '\\');
888
891
 
889
892
  if ((trimmedUrl.length - rtrimSlash.length) % 2 === 0) {
890
893
  return;
891
894
  }
892
895
  } else {
893
896
  // find closing parenthesis
894
- var lastParenIndex = findClosingBracket$1(cap[2], '()');
897
+ var lastParenIndex = findClosingBracket(cap[2], '()');
895
898
 
896
899
  if (lastParenIndex > -1) {
897
900
  var start = cap[0].indexOf('!') === 0 ? 5 : 4;
@@ -955,54 +958,66 @@
955
958
  }
956
959
  };
957
960
 
958
- _proto.strong = function strong(src, maskedSrc, prevChar) {
961
+ _proto.emStrong = function emStrong(src, maskedSrc, prevChar) {
959
962
  if (prevChar === void 0) {
960
963
  prevChar = '';
961
964
  }
962
965
 
963
- var match = this.rules.inline.strong.start.exec(src);
966
+ var match = this.rules.inline.emStrong.lDelim.exec(src);
967
+ if (!match) return;
968
+ if (match[3] && prevChar.match(/(?:[0-9A-Za-z\xAA\xB2\xB3\xB5\xB9\xBA\xBC-\xBE\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0560-\u0588\u05D0-\u05EA\u05EF-\u05F2\u0620-\u064A\u0660-\u0669\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07C0-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u0860-\u086A\u08A0-\u08B4\u08B6-\u08C7\u0904-\u0939\u093D\u0950\u0958-\u0961\u0966-\u096F\u0971-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09E6-\u09F1\u09F4-\u09F9\u09FC\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A66-\u0A6F\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0AE6-\u0AEF\u0AF9\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B66-\u0B6F\u0B71-\u0B77\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0BE6-\u0BF2\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C60\u0C61\u0C66-\u0C6F\u0C78-\u0C7E\u0C80\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CE6-\u0CEF\u0CF1\u0CF2\u0D04-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D54-\u0D56\u0D58-\u0D61\u0D66-\u0D78\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0DE6-\u0DEF\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E50-\u0E59\u0E81\u0E82\u0E84\u0E86-\u0E8A\u0E8C-\u0EA3\u0EA5\u0EA7-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0ED0-\u0ED9\u0EDC-\u0EDF\u0F00\u0F20-\u0F33\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F-\u1049\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u1090-\u1099\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1369-\u137C\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u17E0-\u17E9\u17F0-\u17F9\u1810-\u1819\u1820-\u1878\u1880-\u1884\u1887-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1946-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u19D0-\u19DA\u1A00-\u1A16\u1A20-\u1A54\u1A80-\u1A89\u1A90-\u1A99\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B50-\u1B59\u1B83-\u1BA0\u1BAE-\u1BE5\u1C00-\u1C23\u1C40-\u1C49\u1C4D-\u1C7D\u1C80-\u1C88\u1C90-\u1CBA\u1CBD-\u1CBF\u1CE9-\u1CEC\u1CEE-\u1CF3\u1CF5\u1CF6\u1CFA\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2070\u2071\u2074-\u2079\u207F-\u2089\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2150-\u2189\u2460-\u249B\u24EA-\u24FF\u2776-\u2793\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2CFD\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303C\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312F\u3131-\u318E\u3192-\u3195\u31A0-\u31BF\u31F0-\u31FF\u3220-\u3229\u3248-\u324F\u3251-\u325F\u3280-\u3289\u32B1-\u32BF\u3400-\u4DBF\u4E00-\u9FFC\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6EF\uA717-\uA71F\uA722-\uA788\uA78B-\uA7BF\uA7C2-\uA7CA\uA7F5-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA830-\uA835\uA840-\uA873\uA882-\uA8B3\uA8D0-\uA8D9\uA8F2-\uA8F7\uA8FB\uA8FD\uA8FE\uA900-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF-\uA9D9\uA9E0-\uA9E4\uA9E6-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA50-\uAA59\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB69\uAB70-\uABE2\uABF0-\uABF9\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF10-\uFF19\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD07-\uDD33\uDD40-\uDD78\uDD8A\uDD8B\uDE80-\uDE9C\uDEA0-\uDED0\uDEE1-\uDEFB\uDF00-\uDF23\uDF2D-\uDF4A\uDF50-\uDF75\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCA0-\uDCA9\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC58-\uDC76\uDC79-\uDC9E\uDCA7-\uDCAF\uDCE0-\uDCF2\uDCF4\uDCF5\uDCFB-\uDD1B\uDD20-\uDD39\uDD80-\uDDB7\uDDBC-\uDDCF\uDDD2-\uDE00\uDE10-\uDE13\uDE15-\uDE17\uDE19-\uDE35\uDE40-\uDE48\uDE60-\uDE7E\uDE80-\uDE9F\uDEC0-\uDEC7\uDEC9-\uDEE4\uDEEB-\uDEEF\uDF00-\uDF35\uDF40-\uDF55\uDF58-\uDF72\uDF78-\uDF91\uDFA9-\uDFAF]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2\uDCFA-\uDD23\uDD30-\uDD39\uDE60-\uDE7E\uDE80-\uDEA9\uDEB0\uDEB1\uDF00-\uDF27\uDF30-\uDF45\uDF51-\uDF54\uDFB0-\uDFCB\uDFE0-\uDFF6]|\uD804[\uDC03-\uDC37\uDC52-\uDC6F\uDC83-\uDCAF\uDCD0-\uDCE8\uDCF0-\uDCF9\uDD03-\uDD26\uDD36-\uDD3F\uDD44\uDD47\uDD50-\uDD72\uDD76\uDD83-\uDDB2\uDDC1-\uDDC4\uDDD0-\uDDDA\uDDDC\uDDE1-\uDDF4\uDE00-\uDE11\uDE13-\uDE2B\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEDE\uDEF0-\uDEF9\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3D\uDF50\uDF5D-\uDF61]|\uD805[\uDC00-\uDC34\uDC47-\uDC4A\uDC50-\uDC59\uDC5F-\uDC61\uDC80-\uDCAF\uDCC4\uDCC5\uDCC7\uDCD0-\uDCD9\uDD80-\uDDAE\uDDD8-\uDDDB\uDE00-\uDE2F\uDE44\uDE50-\uDE59\uDE80-\uDEAA\uDEB8\uDEC0-\uDEC9\uDF00-\uDF1A\uDF30-\uDF3B]|\uD806[\uDC00-\uDC2B\uDCA0-\uDCF2\uDCFF-\uDD06\uDD09\uDD0C-\uDD13\uDD15\uDD16\uDD18-\uDD2F\uDD3F\uDD41\uDD50-\uDD59\uDDA0-\uDDA7\uDDAA-\uDDD0\uDDE1\uDDE3\uDE00\uDE0B-\uDE32\uDE3A\uDE50\uDE5C-\uDE89\uDE9D\uDEC0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC2E\uDC40\uDC50-\uDC6C\uDC72-\uDC8F\uDD00-\uDD06\uDD08\uDD09\uDD0B-\uDD30\uDD46\uDD50-\uDD59\uDD60-\uDD65\uDD67\uDD68\uDD6A-\uDD89\uDD98\uDDA0-\uDDA9\uDEE0-\uDEF2\uDFB0\uDFC0-\uDFD4]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|[\uD80C\uD81C-\uD820\uD822\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872\uD874-\uD879\uD880-\uD883][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDE60-\uDE69\uDED0-\uDEED\uDF00-\uDF2F\uDF40-\uDF43\uDF50-\uDF59\uDF5B-\uDF61\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDE40-\uDE96\uDF00-\uDF4A\uDF50\uDF93-\uDF9F\uDFE0\uDFE1\uDFE3]|\uD821[\uDC00-\uDFF7]|\uD823[\uDC00-\uDCD5\uDD00-\uDD08]|\uD82C[\uDC00-\uDD1E\uDD50-\uDD52\uDD64-\uDD67\uDD70-\uDEFB]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99]|\uD834[\uDEE0-\uDEF3\uDF60-\uDF78]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB\uDFCE-\uDFFF]|\uD838[\uDD00-\uDD2C\uDD37-\uDD3D\uDD40-\uDD49\uDD4E\uDEC0-\uDEEB\uDEF0-\uDEF9]|\uD83A[\uDC00-\uDCC4\uDCC7-\uDCCF\uDD00-\uDD43\uDD4B\uDD50-\uDD59]|\uD83B[\uDC71-\uDCAB\uDCAD-\uDCAF\uDCB1-\uDCB4\uDD01-\uDD2D\uDD2F-\uDD3D\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD83C[\uDD00-\uDD0C]|\uD83E[\uDFF0-\uDFF9]|\uD869[\uDC00-\uDEDD\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0]|\uD87E[\uDC00-\uDE1D]|\uD884[\uDC00-\uDF4A])/)) return; // _ can't be between two alphanumerics. \p{L}\p{N} includes non-english alphabet/numbers as well
969
+
970
+ var nextChar = match[1] || match[2] || '';
964
971
 
965
- if (match && (!match[1] || match[1] && (prevChar === '' || this.rules.inline.punctuation.exec(prevChar)))) {
966
- maskedSrc = maskedSrc.slice(-1 * src.length);
967
- var endReg = match[0] === '**' ? this.rules.inline.strong.endAst : this.rules.inline.strong.endUnd;
972
+ if (!nextChar || nextChar && (prevChar === '' || this.rules.inline.punctuation.exec(prevChar))) {
973
+ var lLength = match[0].length - 1;
974
+ var rDelim,
975
+ rLength,
976
+ delimTotal = lLength,
977
+ midDelimTotal = 0;
978
+ var endReg = match[0][0] === '*' ? this.rules.inline.emStrong.rDelimAst : this.rules.inline.emStrong.rDelimUnd;
968
979
  endReg.lastIndex = 0;
969
- var cap;
980
+ maskedSrc = maskedSrc.slice(-1 * src.length + lLength); // Bump maskedSrc to same section of string as src (move to lexer?)
970
981
 
971
982
  while ((match = endReg.exec(maskedSrc)) != null) {
972
- cap = this.rules.inline.strong.middle.exec(maskedSrc.slice(0, match.index + 3));
973
-
974
- if (cap) {
975
- return {
976
- type: 'strong',
977
- raw: src.slice(0, cap[0].length),
978
- text: src.slice(2, cap[0].length - 2)
979
- };
983
+ rDelim = match[1] || match[2] || match[3] || match[4] || match[5] || match[6];
984
+ if (!rDelim) continue; // matched the first alternative in rules.js (skip the * in __abc*abc__)
985
+
986
+ rLength = rDelim.length;
987
+
988
+ if (match[3] || match[4]) {
989
+ // found another Left Delim
990
+ delimTotal += rLength;
991
+ continue;
992
+ } else if (match[5] || match[6]) {
993
+ // either Left or Right Delim
994
+ if (lLength % 3 && !((lLength + rLength) % 3)) {
995
+ midDelimTotal += rLength;
996
+ continue; // CommonMark Emphasis Rules 9-10
997
+ }
980
998
  }
981
- }
982
- }
983
- };
984
-
985
- _proto.em = function em(src, maskedSrc, prevChar) {
986
- if (prevChar === void 0) {
987
- prevChar = '';
988
- }
989
-
990
- var match = this.rules.inline.em.start.exec(src);
991
999
 
992
- if (match && (!match[1] || match[1] && (prevChar === '' || this.rules.inline.punctuation.exec(prevChar)))) {
993
- maskedSrc = maskedSrc.slice(-1 * src.length);
994
- var endReg = match[0] === '*' ? this.rules.inline.em.endAst : this.rules.inline.em.endUnd;
995
- endReg.lastIndex = 0;
996
- var cap;
1000
+ delimTotal -= rLength;
1001
+ if (delimTotal > 0) continue; // Haven't found enough closing delimiters
1002
+ // If this is the last rDelimiter, remove extra characters. *a*** -> *a*
997
1003
 
998
- while ((match = endReg.exec(maskedSrc)) != null) {
999
- cap = this.rules.inline.em.middle.exec(maskedSrc.slice(0, match.index + 2));
1004
+ if (delimTotal + midDelimTotal - rLength <= 0 && !maskedSrc.slice(endReg.lastIndex).match(endReg)) {
1005
+ rLength = Math.min(rLength, rLength + delimTotal + midDelimTotal);
1006
+ }
1000
1007
 
1001
- if (cap) {
1008
+ if (Math.min(lLength, rLength) % 2) {
1002
1009
  return {
1003
1010
  type: 'em',
1004
- raw: src.slice(0, cap[0].length),
1005
- text: src.slice(1, cap[0].length - 1)
1011
+ raw: src.slice(0, lLength + match.index + rLength + 1),
1012
+ text: src.slice(1, lLength + match.index + rLength)
1013
+ };
1014
+ }
1015
+
1016
+ if (Math.min(lLength, rLength) % 2 === 0) {
1017
+ return {
1018
+ type: 'strong',
1019
+ raw: src.slice(0, lLength + match.index + rLength + 1),
1020
+ text: src.slice(2, lLength + match.index + rLength - 1)
1006
1021
  };
1007
1022
  }
1008
1023
  }
@@ -1145,14 +1160,14 @@
1145
1160
  return Tokenizer;
1146
1161
  }();
1147
1162
 
1148
- var noopTest$1 = helpers.noopTest,
1149
- edit$1 = helpers.edit,
1163
+ var noopTest = helpers.noopTest,
1164
+ edit = helpers.edit,
1150
1165
  merge$1 = helpers.merge;
1151
1166
  /**
1152
1167
  * Block-Level Grammar
1153
1168
  */
1154
1169
 
1155
- var block = {
1170
+ var block$1 = {
1156
1171
  newline: /^(?: *(?:\n|$))+/,
1157
1172
  code: /^( {4}[^\n]+(?:\n(?: *(?:\n|$))*)?)+/,
1158
1173
  fences: /^ {0,3}(`{3,}(?=[^`\n]*\n)|~{3,})([^\n]*)\n(?:|([\s\S]*?)\n)(?: {0,3}\1[~`]* *(?:\n+|$)|$)/,
@@ -1171,40 +1186,40 @@
1171
1186
  + '|</(?!script|pre|style)[a-z][\\w-]*\\s*>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:\\n{2,}|$)' // (7) closing tag
1172
1187
  + ')',
1173
1188
  def: /^ {0,3}\[(label)\]: *\n? *<?([^\s>]+)>?(?:(?: +\n? *| *\n *)(title))? *(?:\n+|$)/,
1174
- nptable: noopTest$1,
1175
- table: noopTest$1,
1189
+ nptable: noopTest,
1190
+ table: noopTest,
1176
1191
  lheading: /^([^\n]+)\n {0,3}(=+|-+) *(?:\n+|$)/,
1177
1192
  // regex template, placeholders will be replaced according to different paragraph
1178
1193
  // interruption rules of commonmark and the original markdown spec:
1179
1194
  _paragraph: /^([^\n]+(?:\n(?!hr|heading|lheading|blockquote|fences|list|html| +\n)[^\n]+)*)/,
1180
1195
  text: /^[^\n]+/
1181
1196
  };
1182
- block._label = /(?!\s*\])(?:\\[\[\]]|[^\[\]])+/;
1183
- block._title = /(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/;
1184
- block.def = edit$1(block.def).replace('label', block._label).replace('title', block._title).getRegex();
1185
- block.bullet = /(?:[*+-]|\d{1,9}[.)])/;
1186
- block.item = /^( *)(bull) ?[^\n]*(?:\n(?! *bull ?)[^\n]*)*/;
1187
- block.item = edit$1(block.item, 'gm').replace(/bull/g, block.bullet).getRegex();
1188
- block.listItemStart = edit$1(/^( *)(bull)/).replace('bull', block.bullet).getRegex();
1189
- block.list = edit$1(block.list).replace(/bull/g, block.bullet).replace('hr', '\\n+(?=\\1?(?:(?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$))').replace('def', '\\n+(?=' + block.def.source + ')').getRegex();
1190
- block._tag = 'address|article|aside|base|basefont|blockquote|body|caption' + '|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption' + '|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe' + '|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option' + '|p|param|section|source|summary|table|tbody|td|tfoot|th|thead|title|tr' + '|track|ul';
1191
- block._comment = /<!--(?!-?>)[\s\S]*?(?:-->|$)/;
1192
- block.html = edit$1(block.html, 'i').replace('comment', block._comment).replace('tag', block._tag).replace('attribute', / +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/).getRegex();
1193
- block.paragraph = edit$1(block._paragraph).replace('hr', block.hr).replace('heading', ' {0,3}#{1,6} ').replace('|lheading', '') // setex headings don't interrupt commonmark paragraphs
1197
+ block$1._label = /(?!\s*\])(?:\\[\[\]]|[^\[\]])+/;
1198
+ block$1._title = /(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/;
1199
+ block$1.def = edit(block$1.def).replace('label', block$1._label).replace('title', block$1._title).getRegex();
1200
+ block$1.bullet = /(?:[*+-]|\d{1,9}[.)])/;
1201
+ block$1.item = /^( *)(bull) ?[^\n]*(?:\n(?! *bull ?)[^\n]*)*/;
1202
+ block$1.item = edit(block$1.item, 'gm').replace(/bull/g, block$1.bullet).getRegex();
1203
+ block$1.listItemStart = edit(/^( *)(bull) */).replace('bull', block$1.bullet).getRegex();
1204
+ block$1.list = edit(block$1.list).replace(/bull/g, block$1.bullet).replace('hr', '\\n+(?=\\1?(?:(?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$))').replace('def', '\\n+(?=' + block$1.def.source + ')').getRegex();
1205
+ block$1._tag = 'address|article|aside|base|basefont|blockquote|body|caption' + '|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption' + '|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe' + '|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option' + '|p|param|section|source|summary|table|tbody|td|tfoot|th|thead|title|tr' + '|track|ul';
1206
+ block$1._comment = /<!--(?!-?>)[\s\S]*?(?:-->|$)/;
1207
+ block$1.html = edit(block$1.html, 'i').replace('comment', block$1._comment).replace('tag', block$1._tag).replace('attribute', / +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/).getRegex();
1208
+ block$1.paragraph = edit(block$1._paragraph).replace('hr', block$1.hr).replace('heading', ' {0,3}#{1,6} ').replace('|lheading', '') // setex headings don't interrupt commonmark paragraphs
1194
1209
  .replace('blockquote', ' {0,3}>').replace('fences', ' {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n').replace('list', ' {0,3}(?:[*+-]|1[.)]) ') // only lists starting from 1 can interrupt
1195
- .replace('html', '</?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|!--)').replace('tag', block._tag) // pars can be interrupted by type (6) html blocks
1210
+ .replace('html', '</?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|!--)').replace('tag', block$1._tag) // pars can be interrupted by type (6) html blocks
1196
1211
  .getRegex();
1197
- block.blockquote = edit$1(block.blockquote).replace('paragraph', block.paragraph).getRegex();
1212
+ block$1.blockquote = edit(block$1.blockquote).replace('paragraph', block$1.paragraph).getRegex();
1198
1213
  /**
1199
1214
  * Normal Block Grammar
1200
1215
  */
1201
1216
 
1202
- block.normal = merge$1({}, block);
1217
+ block$1.normal = merge$1({}, block$1);
1203
1218
  /**
1204
1219
  * GFM Block Grammar
1205
1220
  */
1206
1221
 
1207
- block.gfm = merge$1({}, block.normal, {
1222
+ block$1.gfm = merge$1({}, block$1.normal, {
1208
1223
  nptable: '^ *([^|\\n ].*\\|.*)\\n' // Header
1209
1224
  + ' {0,3}([-:]+ *\\|[-| :]*)' // Align
1210
1225
  + '(?:\\n((?:(?!\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)',
@@ -1214,33 +1229,33 @@
1214
1229
  + '(?:\\n *((?:(?!\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)' // Cells
1215
1230
 
1216
1231
  });
1217
- block.gfm.nptable = edit$1(block.gfm.nptable).replace('hr', block.hr).replace('heading', ' {0,3}#{1,6} ').replace('blockquote', ' {0,3}>').replace('code', ' {4}[^\\n]').replace('fences', ' {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n').replace('list', ' {0,3}(?:[*+-]|1[.)]) ') // only lists starting from 1 can interrupt
1218
- .replace('html', '</?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|!--)').replace('tag', block._tag) // tables can be interrupted by type (6) html blocks
1232
+ block$1.gfm.nptable = edit(block$1.gfm.nptable).replace('hr', block$1.hr).replace('heading', ' {0,3}#{1,6} ').replace('blockquote', ' {0,3}>').replace('code', ' {4}[^\\n]').replace('fences', ' {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n').replace('list', ' {0,3}(?:[*+-]|1[.)]) ') // only lists starting from 1 can interrupt
1233
+ .replace('html', '</?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|!--)').replace('tag', block$1._tag) // tables can be interrupted by type (6) html blocks
1219
1234
  .getRegex();
1220
- block.gfm.table = edit$1(block.gfm.table).replace('hr', block.hr).replace('heading', ' {0,3}#{1,6} ').replace('blockquote', ' {0,3}>').replace('code', ' {4}[^\\n]').replace('fences', ' {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n').replace('list', ' {0,3}(?:[*+-]|1[.)]) ') // only lists starting from 1 can interrupt
1221
- .replace('html', '</?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|!--)').replace('tag', block._tag) // tables can be interrupted by type (6) html blocks
1235
+ block$1.gfm.table = edit(block$1.gfm.table).replace('hr', block$1.hr).replace('heading', ' {0,3}#{1,6} ').replace('blockquote', ' {0,3}>').replace('code', ' {4}[^\\n]').replace('fences', ' {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n').replace('list', ' {0,3}(?:[*+-]|1[.)]) ') // only lists starting from 1 can interrupt
1236
+ .replace('html', '</?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|!--)').replace('tag', block$1._tag) // tables can be interrupted by type (6) html blocks
1222
1237
  .getRegex();
1223
1238
  /**
1224
1239
  * Pedantic grammar (original John Gruber's loose markdown specification)
1225
1240
  */
1226
1241
 
1227
- block.pedantic = merge$1({}, block.normal, {
1228
- html: edit$1('^ *(?:comment *(?:\\n|\\s*$)' + '|<(tag)[\\s\\S]+?</\\1> *(?:\\n{2,}|\\s*$)' // closed tag
1229
- + '|<tag(?:"[^"]*"|\'[^\']*\'|\\s[^\'"/>\\s]*)*?/?> *(?:\\n{2,}|\\s*$))').replace('comment', block._comment).replace(/tag/g, '(?!(?:' + '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').getRegex(),
1242
+ block$1.pedantic = merge$1({}, block$1.normal, {
1243
+ html: edit('^ *(?:comment *(?:\\n|\\s*$)' + '|<(tag)[\\s\\S]+?</\\1> *(?:\\n{2,}|\\s*$)' // closed tag
1244
+ + '|<tag(?:"[^"]*"|\'[^\']*\'|\\s[^\'"/>\\s]*)*?/?> *(?:\\n{2,}|\\s*$))').replace('comment', block$1._comment).replace(/tag/g, '(?!(?:' + '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').getRegex(),
1230
1245
  def: /^ *\[([^\]]+)\]: *<?([^\s>]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/,
1231
1246
  heading: /^(#{1,6})(.*)(?:\n+|$)/,
1232
- fences: noopTest$1,
1247
+ fences: noopTest,
1233
1248
  // fences not supported
1234
- paragraph: edit$1(block.normal._paragraph).replace('hr', block.hr).replace('heading', ' *#{1,6} *[^\n]').replace('lheading', block.lheading).replace('blockquote', ' {0,3}>').replace('|fences', '').replace('|list', '').replace('|html', '').getRegex()
1249
+ paragraph: edit(block$1.normal._paragraph).replace('hr', block$1.hr).replace('heading', ' *#{1,6} *[^\n]').replace('lheading', block$1.lheading).replace('blockquote', ' {0,3}>').replace('|fences', '').replace('|list', '').replace('|html', '').getRegex()
1235
1250
  });
1236
1251
  /**
1237
1252
  * Inline-Level Grammar
1238
1253
  */
1239
1254
 
1240
- var inline = {
1255
+ var inline$1 = {
1241
1256
  escape: /^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/,
1242
1257
  autolink: /^<(scheme:[^\s\x00-\x1f<>]*|email)>/,
1243
- url: noopTest$1,
1258
+ url: noopTest,
1244
1259
  tag: '^comment' + '|^</[a-zA-Z][\\w:-]*\\s*>' // self-closing tag
1245
1260
  + '|^<[a-zA-Z][\\w-]*(?:attribute)*?\\s*/?>' // open tag
1246
1261
  + '|^<\\?[\\s\\S]*?\\?>' // processing instruction, e.g. <?php ?>
@@ -1251,70 +1266,53 @@
1251
1266
  reflink: /^!?\[(label)\]\[(?!\s*\])((?:\\[\[\]]?|[^\[\]\\])+)\]/,
1252
1267
  nolink: /^!?\[(?!\s*\])((?:\[[^\[\]]*\]|\\[\[\]]|[^\[\]])*)\](?:\[\])?/,
1253
1268
  reflinkSearch: 'reflink|nolink(?!\\()',
1254
- strong: {
1255
- start: /^(?:(\*\*(?=[*punctuation]))|\*\*)(?![\s])|__/,
1256
- // (1) returns if starts w/ punctuation
1257
- middle: /^\*\*(?:(?:(?!overlapSkip)(?:[^*]|\\\*)|overlapSkip)|\*(?:(?!overlapSkip)(?:[^*]|\\\*)|overlapSkip)*?\*)+?\*\*$|^__(?![\s])((?:(?:(?!overlapSkip)(?:[^_]|\\_)|overlapSkip)|_(?:(?!overlapSkip)(?:[^_]|\\_)|overlapSkip)*?_)+?)__$/,
1258
- endAst: /[^punctuation\s]\*\*(?!\*)|[punctuation]\*\*(?!\*)(?:(?=[punctuation_\s]|$))/,
1259
- // last char can't be punct, or final * must also be followed by punct (or endline)
1260
- endUnd: /[^\s]__(?!_)(?:(?=[punctuation*\s])|$)/ // last char can't be a space, and final _ must preceed punct or \s (or endline)
1261
-
1262
- },
1263
- em: {
1264
- start: /^(?:(\*(?=[punctuation]))|\*)(?![*\s])|_/,
1265
- // (1) returns if starts w/ punctuation
1266
- middle: /^\*(?:(?:(?!overlapSkip)(?:[^*]|\\\*)|overlapSkip)|\*(?:(?!overlapSkip)(?:[^*]|\\\*)|overlapSkip)*?\*)+?\*$|^_(?![_\s])(?:(?:(?!overlapSkip)(?:[^_]|\\_)|overlapSkip)|_(?:(?!overlapSkip)(?:[^_]|\\_)|overlapSkip)*?_)+?_$/,
1267
- endAst: /[^punctuation\s]\*(?!\*)|[punctuation]\*(?!\*)(?:(?=[punctuation_\s]|$))/,
1268
- // last char can't be punct, or final * must also be followed by punct (or endline)
1269
- endUnd: /[^\s]_(?!_)(?:(?=[punctuation*\s])|$)/ // last char can't be a space, and final _ must preceed punct or \s (or endline)
1269
+ emStrong: {
1270
+ lDelim: /^(?:\*+(?:([punct_])|[^\s*]))|^_+(?:([punct*])|([^\s_]))/,
1271
+ // (1) and (2) can only be a Right Delimiter. (3) and (4) can only be Left. (5) and (6) can be either Left or Right.
1272
+ // () Skip other delimiter (1) #*** (2) a***#, a*** (3) #***a, ***a (4) ***# (5) #***# (6) a***a
1273
+ rDelimAst: /\_\_[^_]*?\*[^_]*?\_\_|[punct_](\*+)(?=[\s]|$)|[^punct*_\s](\*+)(?=[punct_\s]|$)|[punct_\s](\*+)(?=[^punct*_\s])|[\s](\*+)(?=[punct_])|[punct_](\*+)(?=[punct_])|[^punct*_\s](\*+)(?=[^punct*_\s])/,
1274
+ rDelimUnd: /\*\*[^*]*?\_[^*]*?\*\*|[punct*](\_+)(?=[\s]|$)|[^punct*_\s](\_+)(?=[punct*\s]|$)|[punct*\s](\_+)(?=[^punct*_\s])|[\s](\_+)(?=[punct*])|[punct*](\_+)(?=[punct*])/ // ^- Not allowed for _
1270
1275
 
1271
1276
  },
1272
1277
  code: /^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/,
1273
1278
  br: /^( {2,}|\\)\n(?!\s*$)/,
1274
- del: noopTest$1,
1275
- text: /^(`+|[^`])(?:(?= {2,}\n)|[\s\S]*?(?:(?=[\\<!\[`*]|\b_|$)|[^ ](?= {2,}\n)))/,
1276
- punctuation: /^([\s*punctuation])/
1277
- }; // list of punctuation marks from common mark spec
1278
- // without * and _ to workaround cases with double emphasis
1279
-
1280
- inline._punctuation = '!"#$%&\'()+\\-.,/:;<=>?@\\[\\]`^{|}~';
1281
- inline.punctuation = edit$1(inline.punctuation).replace(/punctuation/g, inline._punctuation).getRegex(); // sequences em should skip over [title](link), `code`, <html>
1282
-
1283
- inline._blockSkip = '\\[[^\\]]*?\\]\\([^\\)]*?\\)|`[^`]*?`|<[^>]*?>';
1284
- inline._overlapSkip = '__[^_]*?__|\\*\\*\\[^\\*\\]*?\\*\\*';
1285
- inline._comment = edit$1(block._comment).replace('(?:-->|$)', '-->').getRegex();
1286
- inline.em.start = edit$1(inline.em.start).replace(/punctuation/g, inline._punctuation).getRegex();
1287
- inline.em.middle = edit$1(inline.em.middle).replace(/punctuation/g, inline._punctuation).replace(/overlapSkip/g, inline._overlapSkip).getRegex();
1288
- inline.em.endAst = edit$1(inline.em.endAst, 'g').replace(/punctuation/g, inline._punctuation).getRegex();
1289
- inline.em.endUnd = edit$1(inline.em.endUnd, 'g').replace(/punctuation/g, inline._punctuation).getRegex();
1290
- inline.strong.start = edit$1(inline.strong.start).replace(/punctuation/g, inline._punctuation).getRegex();
1291
- inline.strong.middle = edit$1(inline.strong.middle).replace(/punctuation/g, inline._punctuation).replace(/overlapSkip/g, inline._overlapSkip).getRegex();
1292
- inline.strong.endAst = edit$1(inline.strong.endAst, 'g').replace(/punctuation/g, inline._punctuation).getRegex();
1293
- inline.strong.endUnd = edit$1(inline.strong.endUnd, 'g').replace(/punctuation/g, inline._punctuation).getRegex();
1294
- inline.blockSkip = edit$1(inline._blockSkip, 'g').getRegex();
1295
- inline.overlapSkip = edit$1(inline._overlapSkip, 'g').getRegex();
1296
- inline._escapes = /\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/g;
1297
- inline._scheme = /[a-zA-Z][a-zA-Z0-9+.-]{1,31}/;
1298
- inline._email = /[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/;
1299
- inline.autolink = edit$1(inline.autolink).replace('scheme', inline._scheme).replace('email', inline._email).getRegex();
1300
- inline._attribute = /\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/;
1301
- inline.tag = edit$1(inline.tag).replace('comment', inline._comment).replace('attribute', inline._attribute).getRegex();
1302
- inline._label = /(?:\[(?:\\.|[^\[\]\\])*\]|\\.|`[^`]*`|[^\[\]\\`])*?/;
1303
- inline._href = /<(?:\\.|[^\n<>\\])+>|[^\s\x00-\x1f]*/;
1304
- inline._title = /"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/;
1305
- inline.link = edit$1(inline.link).replace('label', inline._label).replace('href', inline._href).replace('title', inline._title).getRegex();
1306
- inline.reflink = edit$1(inline.reflink).replace('label', inline._label).getRegex();
1307
- inline.reflinkSearch = edit$1(inline.reflinkSearch, 'g').replace('reflink', inline.reflink).replace('nolink', inline.nolink).getRegex();
1279
+ del: noopTest,
1280
+ text: /^(`+|[^`])(?:(?= {2,}\n)|[\s\S]*?(?:(?=[\\<!\[`*_]|\b_|$)|[^ ](?= {2,}\n)))/,
1281
+ punctuation: /^([\spunctuation])/
1282
+ }; // list of punctuation marks from CommonMark spec
1283
+ // without * and _ to handle the different emphasis markers * and _
1284
+
1285
+ inline$1._punctuation = '!"#$%&\'()+\\-.,/:;<=>?@\\[\\]`^{|}~';
1286
+ inline$1.punctuation = edit(inline$1.punctuation).replace(/punctuation/g, inline$1._punctuation).getRegex(); // sequences em should skip over [title](link), `code`, <html>
1287
+
1288
+ inline$1.blockSkip = /\[[^\]]*?\]\([^\)]*?\)|`[^`]*?`|<[^>]*?>/g;
1289
+ inline$1.escapedEmSt = /\\\*|\\_/g;
1290
+ inline$1._comment = edit(block$1._comment).replace('(?:-->|$)', '-->').getRegex();
1291
+ inline$1.emStrong.lDelim = edit(inline$1.emStrong.lDelim).replace(/punct/g, inline$1._punctuation).getRegex();
1292
+ inline$1.emStrong.rDelimAst = edit(inline$1.emStrong.rDelimAst, 'g').replace(/punct/g, inline$1._punctuation).getRegex();
1293
+ inline$1.emStrong.rDelimUnd = edit(inline$1.emStrong.rDelimUnd, 'g').replace(/punct/g, inline$1._punctuation).getRegex();
1294
+ inline$1._escapes = /\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/g;
1295
+ inline$1._scheme = /[a-zA-Z][a-zA-Z0-9+.-]{1,31}/;
1296
+ inline$1._email = /[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/;
1297
+ inline$1.autolink = edit(inline$1.autolink).replace('scheme', inline$1._scheme).replace('email', inline$1._email).getRegex();
1298
+ inline$1._attribute = /\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/;
1299
+ inline$1.tag = edit(inline$1.tag).replace('comment', inline$1._comment).replace('attribute', inline$1._attribute).getRegex();
1300
+ inline$1._label = /(?:\[(?:\\.|[^\[\]\\])*\]|\\.|`[^`]*`|[^\[\]\\`])*?/;
1301
+ inline$1._href = /<(?:\\.|[^\n<>\\])+>|[^\s\x00-\x1f]*/;
1302
+ inline$1._title = /"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/;
1303
+ inline$1.link = edit(inline$1.link).replace('label', inline$1._label).replace('href', inline$1._href).replace('title', inline$1._title).getRegex();
1304
+ inline$1.reflink = edit(inline$1.reflink).replace('label', inline$1._label).getRegex();
1305
+ inline$1.reflinkSearch = edit(inline$1.reflinkSearch, 'g').replace('reflink', inline$1.reflink).replace('nolink', inline$1.nolink).getRegex();
1308
1306
  /**
1309
1307
  * Normal Inline Grammar
1310
1308
  */
1311
1309
 
1312
- inline.normal = merge$1({}, inline);
1310
+ inline$1.normal = merge$1({}, inline$1);
1313
1311
  /**
1314
1312
  * Pedantic Inline Grammar
1315
1313
  */
1316
1314
 
1317
- inline.pedantic = merge$1({}, inline.normal, {
1315
+ inline$1.pedantic = merge$1({}, inline$1.normal, {
1318
1316
  strong: {
1319
1317
  start: /^__|\*\*/,
1320
1318
  middle: /^__(?=\S)([\s\S]*?\S)__(?!_)|^\*\*(?=\S)([\s\S]*?\S)\*\*(?!\*)/,
@@ -1327,39 +1325,39 @@
1327
1325
  endAst: /\*(?!\*)/g,
1328
1326
  endUnd: /_(?!_)/g
1329
1327
  },
1330
- link: edit$1(/^!?\[(label)\]\((.*?)\)/).replace('label', inline._label).getRegex(),
1331
- reflink: edit$1(/^!?\[(label)\]\s*\[([^\]]*)\]/).replace('label', inline._label).getRegex()
1328
+ link: edit(/^!?\[(label)\]\((.*?)\)/).replace('label', inline$1._label).getRegex(),
1329
+ reflink: edit(/^!?\[(label)\]\s*\[([^\]]*)\]/).replace('label', inline$1._label).getRegex()
1332
1330
  });
1333
1331
  /**
1334
1332
  * GFM Inline Grammar
1335
1333
  */
1336
1334
 
1337
- inline.gfm = merge$1({}, inline.normal, {
1338
- escape: edit$1(inline.escape).replace('])', '~|])').getRegex(),
1335
+ inline$1.gfm = merge$1({}, inline$1.normal, {
1336
+ escape: edit(inline$1.escape).replace('])', '~|])').getRegex(),
1339
1337
  _extended_email: /[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/,
1340
1338
  url: /^((?:ftp|https?):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/,
1341
1339
  _backpedal: /(?:[^?!.,:;*_~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_~)]+(?!$))+/,
1342
1340
  del: /^(~~?)(?=[^\s~])([\s\S]*?[^\s~])\1(?=[^~]|$)/,
1343
- text: /^([`~]+|[^`~])(?:(?= {2,}\n)|[\s\S]*?(?:(?=[\\<!\[`*~]|\b_|https?:\/\/|ftp:\/\/|www\.|$)|[^ ](?= {2,}\n)|[^a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-](?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@))|(?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@))/
1341
+ text: /^([`~]+|[^`~])(?:(?= {2,}\n)|[\s\S]*?(?:(?=[\\<!\[`*~_]|\b_|https?:\/\/|ftp:\/\/|www\.|$)|[^ ](?= {2,}\n)|[^a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-](?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@))|(?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@))/
1344
1342
  });
1345
- inline.gfm.url = edit$1(inline.gfm.url, 'i').replace('email', inline.gfm._extended_email).getRegex();
1343
+ inline$1.gfm.url = edit(inline$1.gfm.url, 'i').replace('email', inline$1.gfm._extended_email).getRegex();
1346
1344
  /**
1347
1345
  * GFM + Line Breaks Inline Grammar
1348
1346
  */
1349
1347
 
1350
- inline.breaks = merge$1({}, inline.gfm, {
1351
- br: edit$1(inline.br).replace('{2,}', '*').getRegex(),
1352
- text: edit$1(inline.gfm.text).replace('\\b_', '\\b_| {2,}\\n').replace(/\{2,\}/g, '*').getRegex()
1348
+ inline$1.breaks = merge$1({}, inline$1.gfm, {
1349
+ br: edit(inline$1.br).replace('{2,}', '*').getRegex(),
1350
+ text: edit(inline$1.gfm.text).replace('\\b_', '\\b_| {2,}\\n').replace(/\{2,\}/g, '*').getRegex()
1353
1351
  });
1354
1352
  var rules = {
1355
- block: block,
1356
- inline: inline
1353
+ block: block$1,
1354
+ inline: inline$1
1357
1355
  };
1358
1356
 
1359
- var defaults$2 = defaults.defaults;
1360
- var block$1 = rules.block,
1361
- inline$1 = rules.inline;
1362
- var repeatString$1 = helpers.repeatString;
1357
+ var defaults$3 = defaults$5.defaults;
1358
+ var block = rules.block,
1359
+ inline = rules.inline;
1360
+ var repeatString = helpers.repeatString;
1363
1361
  /**
1364
1362
  * smartypants text replacement
1365
1363
  */
@@ -1406,25 +1404,25 @@
1406
1404
  function Lexer(options) {
1407
1405
  this.tokens = [];
1408
1406
  this.tokens.links = Object.create(null);
1409
- this.options = options || defaults$2;
1407
+ this.options = options || defaults$3;
1410
1408
  this.options.tokenizer = this.options.tokenizer || new Tokenizer_1();
1411
1409
  this.tokenizer = this.options.tokenizer;
1412
1410
  this.tokenizer.options = this.options;
1413
1411
  var rules = {
1414
- block: block$1.normal,
1415
- inline: inline$1.normal
1412
+ block: block.normal,
1413
+ inline: inline.normal
1416
1414
  };
1417
1415
 
1418
1416
  if (this.options.pedantic) {
1419
- rules.block = block$1.pedantic;
1420
- rules.inline = inline$1.pedantic;
1417
+ rules.block = block.pedantic;
1418
+ rules.inline = inline.pedantic;
1421
1419
  } else if (this.options.gfm) {
1422
- rules.block = block$1.gfm;
1420
+ rules.block = block.gfm;
1423
1421
 
1424
1422
  if (this.options.breaks) {
1425
- rules.inline = inline$1.breaks;
1423
+ rules.inline = inline.breaks;
1426
1424
  } else {
1427
- rules.inline = inline$1.gfm;
1425
+ rules.inline = inline.gfm;
1428
1426
  }
1429
1427
  }
1430
1428
 
@@ -1497,15 +1495,15 @@
1497
1495
  } // code
1498
1496
 
1499
1497
 
1500
- if (token = this.tokenizer.code(src, tokens)) {
1498
+ if (token = this.tokenizer.code(src)) {
1501
1499
  src = src.substring(token.raw.length);
1500
+ lastToken = tokens[tokens.length - 1]; // An indented code block cannot interrupt a paragraph.
1502
1501
 
1503
- if (token.type) {
1504
- tokens.push(token);
1505
- } else {
1506
- lastToken = tokens[tokens.length - 1];
1502
+ if (lastToken && lastToken.type === 'paragraph') {
1507
1503
  lastToken.raw += '\n' + token.raw;
1508
1504
  lastToken.text += '\n' + token.text;
1505
+ } else {
1506
+ tokens.push(token);
1509
1507
  }
1510
1508
 
1511
1509
  continue;
@@ -1603,15 +1601,15 @@
1603
1601
  } // text
1604
1602
 
1605
1603
 
1606
- if (token = this.tokenizer.text(src, tokens)) {
1604
+ if (token = this.tokenizer.text(src)) {
1607
1605
  src = src.substring(token.raw.length);
1606
+ lastToken = tokens[tokens.length - 1];
1608
1607
 
1609
- if (token.type) {
1610
- tokens.push(token);
1611
- } else {
1612
- lastToken = tokens[tokens.length - 1];
1608
+ if (lastToken && lastToken.type === 'text') {
1613
1609
  lastToken.raw += '\n' + token.raw;
1614
1610
  lastToken.text += '\n' + token.text;
1611
+ } else {
1612
+ tokens.push(token);
1615
1613
  }
1616
1614
 
1617
1615
  continue;
@@ -1718,7 +1716,7 @@
1718
1716
  inRawBlock = false;
1719
1717
  }
1720
1718
 
1721
- var token; // String with links masked to avoid interference with em and strong
1719
+ var token, lastToken; // String with links masked to avoid interference with em and strong
1722
1720
 
1723
1721
  var maskedSrc = src;
1724
1722
  var match;
@@ -1730,7 +1728,7 @@
1730
1728
  if (links.length > 0) {
1731
1729
  while ((match = this.tokenizer.rules.inline.reflinkSearch.exec(maskedSrc)) != null) {
1732
1730
  if (links.includes(match[0].slice(match[0].lastIndexOf('[') + 1, -1))) {
1733
- maskedSrc = maskedSrc.slice(0, match.index) + '[' + repeatString$1('a', match[0].length - 2) + ']' + maskedSrc.slice(this.tokenizer.rules.inline.reflinkSearch.lastIndex);
1731
+ maskedSrc = maskedSrc.slice(0, match.index) + '[' + repeatString('a', match[0].length - 2) + ']' + maskedSrc.slice(this.tokenizer.rules.inline.reflinkSearch.lastIndex);
1734
1732
  }
1735
1733
  }
1736
1734
  }
@@ -1738,7 +1736,12 @@
1738
1736
 
1739
1737
 
1740
1738
  while ((match = this.tokenizer.rules.inline.blockSkip.exec(maskedSrc)) != null) {
1741
- maskedSrc = maskedSrc.slice(0, match.index) + '[' + repeatString$1('a', match[0].length - 2) + ']' + maskedSrc.slice(this.tokenizer.rules.inline.blockSkip.lastIndex);
1739
+ maskedSrc = maskedSrc.slice(0, match.index) + '[' + repeatString('a', match[0].length - 2) + ']' + maskedSrc.slice(this.tokenizer.rules.inline.blockSkip.lastIndex);
1740
+ } // Mask out escaped em & strong delimiters
1741
+
1742
+
1743
+ while ((match = this.tokenizer.rules.inline.escapedEmSt.exec(maskedSrc)) != null) {
1744
+ maskedSrc = maskedSrc.slice(0, match.index) + '++' + maskedSrc.slice(this.tokenizer.rules.inline.escapedEmSt.lastIndex);
1742
1745
  }
1743
1746
 
1744
1747
  while (src) {
@@ -1759,7 +1762,15 @@
1759
1762
  src = src.substring(token.raw.length);
1760
1763
  inLink = token.inLink;
1761
1764
  inRawBlock = token.inRawBlock;
1762
- tokens.push(token);
1765
+ var _lastToken = tokens[tokens.length - 1];
1766
+
1767
+ if (_lastToken && token.type === 'text' && _lastToken.type === 'text') {
1768
+ _lastToken.raw += token.raw;
1769
+ _lastToken.text += token.text;
1770
+ } else {
1771
+ tokens.push(token);
1772
+ }
1773
+
1763
1774
  continue;
1764
1775
  } // link
1765
1776
 
@@ -1778,25 +1789,23 @@
1778
1789
 
1779
1790
  if (token = this.tokenizer.reflink(src, this.tokens.links)) {
1780
1791
  src = src.substring(token.raw.length);
1792
+ var _lastToken2 = tokens[tokens.length - 1];
1781
1793
 
1782
1794
  if (token.type === 'link') {
1783
1795
  token.tokens = this.inlineTokens(token.text, [], true, inRawBlock);
1796
+ tokens.push(token);
1797
+ } else if (_lastToken2 && token.type === 'text' && _lastToken2.type === 'text') {
1798
+ _lastToken2.raw += token.raw;
1799
+ _lastToken2.text += token.text;
1800
+ } else {
1801
+ tokens.push(token);
1784
1802
  }
1785
1803
 
1786
- tokens.push(token);
1787
1804
  continue;
1788
- } // strong
1805
+ } // em & strong
1789
1806
 
1790
1807
 
1791
- if (token = this.tokenizer.strong(src, maskedSrc, prevChar)) {
1792
- src = src.substring(token.raw.length);
1793
- token.tokens = this.inlineTokens(token.text, [], inLink, inRawBlock);
1794
- tokens.push(token);
1795
- continue;
1796
- } // em
1797
-
1798
-
1799
- if (token = this.tokenizer.em(src, maskedSrc, prevChar)) {
1808
+ if (token = this.tokenizer.emStrong(src, maskedSrc, prevChar)) {
1800
1809
  src = src.substring(token.raw.length);
1801
1810
  token.tokens = this.inlineTokens(token.text, [], inLink, inRawBlock);
1802
1811
  tokens.push(token);
@@ -1842,9 +1851,22 @@
1842
1851
 
1843
1852
  if (token = this.tokenizer.inlineText(src, inRawBlock, smartypants)) {
1844
1853
  src = src.substring(token.raw.length);
1845
- prevChar = token.raw.slice(-1);
1854
+
1855
+ if (token.raw.slice(-1) !== '_') {
1856
+ // Track prevChar before string of ____ started
1857
+ prevChar = token.raw.slice(-1);
1858
+ }
1859
+
1846
1860
  keepPrevChar = true;
1847
- tokens.push(token);
1861
+ lastToken = tokens[tokens.length - 1];
1862
+
1863
+ if (lastToken && lastToken.type === 'text') {
1864
+ lastToken.raw += token.raw;
1865
+ lastToken.text += token.text;
1866
+ } else {
1867
+ tokens.push(token);
1868
+ }
1869
+
1848
1870
  continue;
1849
1871
  }
1850
1872
 
@@ -1867,8 +1889,8 @@
1867
1889
  key: "rules",
1868
1890
  get: function get() {
1869
1891
  return {
1870
- block: block$1,
1871
- inline: inline$1
1892
+ block: block,
1893
+ inline: inline
1872
1894
  };
1873
1895
  }
1874
1896
  }]);
@@ -1876,8 +1898,8 @@
1876
1898
  return Lexer;
1877
1899
  }();
1878
1900
 
1879
- var defaults$3 = defaults.defaults;
1880
- var cleanUrl$1 = helpers.cleanUrl,
1901
+ var defaults$2 = defaults$5.defaults;
1902
+ var cleanUrl = helpers.cleanUrl,
1881
1903
  escape$1 = helpers.escape;
1882
1904
  /**
1883
1905
  * Renderer
@@ -1885,7 +1907,7 @@
1885
1907
 
1886
1908
  var Renderer_1 = /*#__PURE__*/function () {
1887
1909
  function Renderer(options) {
1888
- this.options = options || defaults$3;
1910
+ this.options = options || defaults$2;
1889
1911
  }
1890
1912
 
1891
1913
  var _proto = Renderer.prototype;
@@ -1987,7 +2009,7 @@
1987
2009
  };
1988
2010
 
1989
2011
  _proto.link = function link(href, title, text) {
1990
- href = cleanUrl$1(this.options.sanitize, this.options.baseUrl, href);
2012
+ href = cleanUrl(this.options.sanitize, this.options.baseUrl, href);
1991
2013
 
1992
2014
  if (href === null) {
1993
2015
  return text;
@@ -2004,7 +2026,7 @@
2004
2026
  };
2005
2027
 
2006
2028
  _proto.image = function image(href, title, text) {
2007
- href = cleanUrl$1(this.options.sanitize, this.options.baseUrl, href);
2029
+ href = cleanUrl(this.options.sanitize, this.options.baseUrl, href);
2008
2030
 
2009
2031
  if (href === null) {
2010
2032
  return text;
@@ -2135,15 +2157,15 @@
2135
2157
  return Slugger;
2136
2158
  }();
2137
2159
 
2138
- var defaults$4 = defaults.defaults;
2139
- var unescape$1 = helpers.unescape;
2160
+ var defaults$1 = defaults$5.defaults;
2161
+ var unescape = helpers.unescape;
2140
2162
  /**
2141
2163
  * Parsing & Compiling
2142
2164
  */
2143
2165
 
2144
2166
  var Parser_1 = /*#__PURE__*/function () {
2145
2167
  function Parser(options) {
2146
- this.options = options || defaults$4;
2168
+ this.options = options || defaults$1;
2147
2169
  this.options.renderer = this.options.renderer || new Renderer_1();
2148
2170
  this.renderer = this.options.renderer;
2149
2171
  this.renderer.options = this.options;
@@ -2218,7 +2240,7 @@
2218
2240
 
2219
2241
  case 'heading':
2220
2242
  {
2221
- out += this.renderer.heading(this.parseInline(token.tokens), token.depth, unescape$1(this.parseInline(token.tokens, this.textRenderer)), this.slugger);
2243
+ out += this.renderer.heading(this.parseInline(token.tokens), token.depth, unescape(this.parseInline(token.tokens, this.textRenderer)), this.slugger);
2222
2244
  continue;
2223
2245
  }
2224
2246
 
@@ -2453,12 +2475,12 @@
2453
2475
  return Parser;
2454
2476
  }();
2455
2477
 
2456
- var merge$2 = helpers.merge,
2457
- checkSanitizeDeprecation$1 = helpers.checkSanitizeDeprecation,
2458
- escape$2 = helpers.escape;
2459
- var getDefaults = defaults.getDefaults,
2460
- changeDefaults = defaults.changeDefaults,
2461
- defaults$5 = defaults.defaults;
2478
+ var merge = helpers.merge,
2479
+ checkSanitizeDeprecation = helpers.checkSanitizeDeprecation,
2480
+ escape = helpers.escape;
2481
+ var getDefaults = defaults$5.getDefaults,
2482
+ changeDefaults = defaults$5.changeDefaults,
2483
+ defaults = defaults$5.defaults;
2462
2484
  /**
2463
2485
  * Marked
2464
2486
  */
@@ -2478,8 +2500,8 @@
2478
2500
  opt = null;
2479
2501
  }
2480
2502
 
2481
- opt = merge$2({}, marked.defaults, opt || {});
2482
- checkSanitizeDeprecation$1(opt);
2503
+ opt = merge({}, marked.defaults, opt || {});
2504
+ checkSanitizeDeprecation(opt);
2483
2505
 
2484
2506
  if (callback) {
2485
2507
  var highlight = opt.highlight;
@@ -2556,7 +2578,7 @@
2556
2578
  e.message += '\nPlease report this to https://github.com/markedjs/marked.';
2557
2579
 
2558
2580
  if (opt.silent) {
2559
- return '<p>An error occurred:</p><pre>' + escape$2(e.message + '', true) + '</pre>';
2581
+ return '<p>An error occurred:</p><pre>' + escape(e.message + '', true) + '</pre>';
2560
2582
  }
2561
2583
 
2562
2584
  throw e;
@@ -2568,19 +2590,19 @@
2568
2590
 
2569
2591
 
2570
2592
  marked.options = marked.setOptions = function (opt) {
2571
- merge$2(marked.defaults, opt);
2593
+ merge(marked.defaults, opt);
2572
2594
  changeDefaults(marked.defaults);
2573
2595
  return marked;
2574
2596
  };
2575
2597
 
2576
2598
  marked.getDefaults = getDefaults;
2577
- marked.defaults = defaults$5;
2599
+ marked.defaults = defaults;
2578
2600
  /**
2579
2601
  * Use Extension
2580
2602
  */
2581
2603
 
2582
2604
  marked.use = function (extension) {
2583
- var opts = merge$2({}, extension);
2605
+ var opts = merge({}, extension);
2584
2606
 
2585
2607
  if (extension.renderer) {
2586
2608
  (function () {
@@ -2716,8 +2738,8 @@
2716
2738
  throw new Error('marked.parseInline(): input parameter is of type ' + Object.prototype.toString.call(src) + ', string expected');
2717
2739
  }
2718
2740
 
2719
- opt = merge$2({}, marked.defaults, opt || {});
2720
- checkSanitizeDeprecation$1(opt);
2741
+ opt = merge({}, marked.defaults, opt || {});
2742
+ checkSanitizeDeprecation(opt);
2721
2743
 
2722
2744
  try {
2723
2745
  var tokens = Lexer_1.lexInline(src, opt);
@@ -2731,7 +2753,7 @@
2731
2753
  e.message += '\nPlease report this to https://github.com/markedjs/marked.';
2732
2754
 
2733
2755
  if (opt.silent) {
2734
- return '<p>An error occurred:</p><pre>' + escape$2(e.message + '', true) + '</pre>';
2756
+ return '<p>An error occurred:</p><pre>' + escape(e.message + '', true) + '</pre>';
2735
2757
  }
2736
2758
 
2737
2759
  throw e;