marked 1.2.6 → 2.0.0

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
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * marked - a markdown parser
3
- * Copyright (c) 2011-2020, Christopher Jeffrey. (MIT Licensed)
3
+ * Copyright (c) 2011-2021, Christopher Jeffrey. (MIT Licensed)
4
4
  * https://github.com/markedjs/marked
5
5
  */
6
6
 
@@ -73,8 +73,9 @@
73
73
  return it.next.bind(it);
74
74
  }
75
75
 
76
- function createCommonjsModule(fn, module) {
77
- return module = { exports: {} }, fn(module, module.exports), module.exports;
76
+ function createCommonjsModule(fn) {
77
+ var module = { exports: {} };
78
+ return fn(module, module.exports), module.exports;
78
79
  }
79
80
 
80
81
  var defaults = createCommonjsModule(function (module) {
@@ -111,9 +112,6 @@
111
112
  changeDefaults: changeDefaults
112
113
  };
113
114
  });
114
- var defaults_1 = defaults.defaults;
115
- var defaults_2 = defaults.getDefaults;
116
- var defaults_3 = defaults.changeDefaults;
117
115
 
118
116
  /**
119
117
  * Helpers
@@ -490,20 +488,11 @@
490
488
  }
491
489
  };
492
490
 
493
- _proto.code = function code(src, tokens) {
491
+ _proto.code = function code(src) {
494
492
  var cap = this.rules.block.code.exec(src);
495
493
 
496
494
  if (cap) {
497
- var lastToken = tokens[tokens.length - 1]; // An indented code block cannot interrupt a paragraph.
498
-
499
- if (lastToken && lastToken.type === 'paragraph') {
500
- return {
501
- raw: cap[0],
502
- text: cap[0].trimRight()
503
- };
504
- }
505
-
506
- var text = cap[0].replace(/^ {4}/gm, '');
495
+ var text = cap[0].replace(/^ {1,4}/gm, '');
507
496
  return {
508
497
  type: 'code',
509
498
  raw: cap[0],
@@ -534,12 +523,12 @@
534
523
  if (cap) {
535
524
  var text = cap[2].trim(); // remove trailing #s
536
525
 
537
- if (text.endsWith('#')) {
526
+ if (/#$/.test(text)) {
538
527
  var trimmed = rtrim$1(text, '#');
539
528
 
540
529
  if (this.options.pedantic) {
541
530
  text = trimmed.trim();
542
- } else if (!trimmed || trimmed.endsWith(' ')) {
531
+ } else if (!trimmed || / $/.test(trimmed)) {
543
532
  // CommonMark requires space before trailing #s
544
533
  text = trimmed.trim();
545
534
  }
@@ -654,7 +643,7 @@
654
643
  if (i !== l - 1) {
655
644
  bnext = this.rules.block.listItemStart.exec(itemMatch[i + 1]);
656
645
 
657
- if (bnext[1].length > bcurr[0].length || bnext[1].length > 3) {
646
+ if (!this.options.pedantic ? bnext[1].length > bcurr[0].length || bnext[1].length > 3 : bnext[1].length > bcurr[1].length) {
658
647
  // nested list
659
648
  itemMatch.splice(i, 2, itemMatch[i] + '\n' + itemMatch[i + 1]);
660
649
  i--;
@@ -814,19 +803,10 @@
814
803
  }
815
804
  };
816
805
 
817
- _proto.text = function text(src, tokens) {
806
+ _proto.text = function text(src) {
818
807
  var cap = this.rules.block.text.exec(src);
819
808
 
820
809
  if (cap) {
821
- var lastToken = tokens[tokens.length - 1];
822
-
823
- if (lastToken && lastToken.type === 'text') {
824
- return {
825
- raw: cap[0],
826
- text: cap[0]
827
- };
828
- }
829
-
830
810
  return {
831
811
  type: 'text',
832
812
  raw: cap[0],
@@ -879,9 +859,9 @@
879
859
  if (cap) {
880
860
  var trimmedUrl = cap[2].trim();
881
861
 
882
- if (!this.options.pedantic && trimmedUrl.startsWith('<')) {
862
+ if (!this.options.pedantic && /^</.test(trimmedUrl)) {
883
863
  // commonmark requires matching angle brackets
884
- if (!trimmedUrl.endsWith('>')) {
864
+ if (!/>$/.test(trimmedUrl)) {
885
865
  return;
886
866
  } // ending angle bracket cannot be escaped
887
867
 
@@ -921,8 +901,8 @@
921
901
 
922
902
  href = href.trim();
923
903
 
924
- if (href.startsWith('<')) {
925
- if (this.options.pedantic && !trimmedUrl.endsWith('>')) {
904
+ if (/^</.test(href)) {
905
+ if (this.options.pedantic && !/>$/.test(trimmedUrl)) {
926
906
  // pedantic allows starting angle bracket without ending angle bracket
927
907
  href = href.slice(1);
928
908
  } else {
@@ -957,54 +937,66 @@
957
937
  }
958
938
  };
959
939
 
960
- _proto.strong = function strong(src, maskedSrc, prevChar) {
940
+ _proto.emStrong = function emStrong(src, maskedSrc, prevChar) {
961
941
  if (prevChar === void 0) {
962
942
  prevChar = '';
963
943
  }
964
944
 
965
- var match = this.rules.inline.strong.start.exec(src);
945
+ var match = this.rules.inline.emStrong.lDelim.exec(src);
946
+ if (!match) return;
947
+ 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
966
948
 
967
- if (match && (!match[1] || match[1] && (prevChar === '' || this.rules.inline.punctuation.exec(prevChar)))) {
968
- maskedSrc = maskedSrc.slice(-1 * src.length);
969
- var endReg = match[0] === '**' ? this.rules.inline.strong.endAst : this.rules.inline.strong.endUnd;
949
+ var nextChar = match[1] || match[2] || '';
950
+
951
+ if (!nextChar || nextChar && (prevChar === '' || this.rules.inline.punctuation.exec(prevChar))) {
952
+ var lLength = match[0].length - 1;
953
+ var rDelim,
954
+ rLength,
955
+ delimTotal = lLength,
956
+ midDelimTotal = 0;
957
+ var endReg = match[0][0] === '*' ? this.rules.inline.emStrong.rDelimAst : this.rules.inline.emStrong.rDelimUnd;
970
958
  endReg.lastIndex = 0;
971
- var cap;
959
+ maskedSrc = maskedSrc.slice(-1 * src.length + lLength); // Bump maskedSrc to same section of string as src (move to lexer?)
972
960
 
973
961
  while ((match = endReg.exec(maskedSrc)) != null) {
974
- cap = this.rules.inline.strong.middle.exec(maskedSrc.slice(0, match.index + 3));
975
-
976
- if (cap) {
977
- return {
978
- type: 'strong',
979
- raw: src.slice(0, cap[0].length),
980
- text: src.slice(2, cap[0].length - 2)
981
- };
962
+ rDelim = match[1] || match[2] || match[3] || match[4] || match[5] || match[6];
963
+ if (!rDelim) continue; // matched the first alternative in rules.js (skip the * in __abc*abc__)
964
+
965
+ rLength = rDelim.length;
966
+
967
+ if (match[3] || match[4]) {
968
+ // found another Left Delim
969
+ delimTotal += rLength;
970
+ continue;
971
+ } else if (match[5] || match[6]) {
972
+ // either Left or Right Delim
973
+ if (lLength % 3 && !((lLength + rLength) % 3)) {
974
+ midDelimTotal += rLength;
975
+ continue; // CommonMark Emphasis Rules 9-10
976
+ }
982
977
  }
983
- }
984
- }
985
- };
986
978
 
987
- _proto.em = function em(src, maskedSrc, prevChar) {
988
- if (prevChar === void 0) {
989
- prevChar = '';
990
- }
991
-
992
- var match = this.rules.inline.em.start.exec(src);
993
-
994
- if (match && (!match[1] || match[1] && (prevChar === '' || this.rules.inline.punctuation.exec(prevChar)))) {
995
- maskedSrc = maskedSrc.slice(-1 * src.length);
996
- var endReg = match[0] === '*' ? this.rules.inline.em.endAst : this.rules.inline.em.endUnd;
997
- endReg.lastIndex = 0;
998
- var cap;
979
+ delimTotal -= rLength;
980
+ if (delimTotal > 0) continue; // Haven't found enough closing delimiters
981
+ // If this is the last rDelimiter, remove extra characters. *a*** -> *a*
999
982
 
1000
- while ((match = endReg.exec(maskedSrc)) != null) {
1001
- cap = this.rules.inline.em.middle.exec(maskedSrc.slice(0, match.index + 2));
983
+ if (delimTotal + midDelimTotal - rLength <= 0 && !maskedSrc.slice(endReg.lastIndex).match(endReg)) {
984
+ rLength = Math.min(rLength, rLength + delimTotal + midDelimTotal);
985
+ }
1002
986
 
1003
- if (cap) {
987
+ if (Math.min(lLength, rLength) % 2) {
1004
988
  return {
1005
989
  type: 'em',
1006
- raw: src.slice(0, cap[0].length),
1007
- text: src.slice(1, cap[0].length - 1)
990
+ raw: src.slice(0, lLength + match.index + rLength + 1),
991
+ text: src.slice(1, lLength + match.index + rLength)
992
+ };
993
+ }
994
+
995
+ if (Math.min(lLength, rLength) % 2 === 0) {
996
+ return {
997
+ type: 'strong',
998
+ raw: src.slice(0, lLength + match.index + rLength + 1),
999
+ text: src.slice(2, lLength + match.index + rLength - 1)
1008
1000
  };
1009
1001
  }
1010
1002
  }
@@ -1017,7 +1009,7 @@
1017
1009
  if (cap) {
1018
1010
  var text = cap[2].replace(/\n/g, ' ');
1019
1011
  var hasNonSpaceChars = /[^ ]/.test(text);
1020
- var hasSpaceCharsOnBothEnds = text.startsWith(' ') && text.endsWith(' ');
1012
+ var hasSpaceCharsOnBothEnds = /^ /.test(text) && / $/.test(text);
1021
1013
 
1022
1014
  if (hasNonSpaceChars && hasSpaceCharsOnBothEnds) {
1023
1015
  text = text.substring(1, text.length - 1);
@@ -1155,8 +1147,8 @@
1155
1147
  */
1156
1148
 
1157
1149
  var block = {
1158
- newline: /^\n+/,
1159
- code: /^( {4}[^\n]+\n*)+/,
1150
+ newline: /^(?: *(?:\n|$))+/,
1151
+ code: /^( {4}[^\n]+(?:\n(?: *(?:\n|$))*)?)+/,
1160
1152
  fences: /^ {0,3}(`{3,}(?=[^`\n]*\n)|~{3,})([^\n]*)\n(?:|([\s\S]*?)\n)(?: {0,3}\1[~`]* *(?:\n+|$)|$)/,
1161
1153
  hr: /^ {0,3}((?:- *){3,}|(?:_ *){3,}|(?:\* *){3,})(?:\n+|$)/,
1162
1154
  heading: /^ {0,3}(#{1,6})(?=\s|$)(.*)(?:\n+|$)/,
@@ -1178,7 +1170,7 @@
1178
1170
  lheading: /^([^\n]+)\n {0,3}(=+|-+) *(?:\n+|$)/,
1179
1171
  // regex template, placeholders will be replaced according to different paragraph
1180
1172
  // interruption rules of commonmark and the original markdown spec:
1181
- _paragraph: /^([^\n]+(?:\n(?!hr|heading|lheading|blockquote|fences|list|html)[^\n]+)*)/,
1173
+ _paragraph: /^([^\n]+(?:\n(?!hr|heading|lheading|blockquote|fences|list|html| +\n)[^\n]+)*)/,
1182
1174
  text: /^[^\n]+/
1183
1175
  };
1184
1176
  block._label = /(?!\s*\])(?:\\[\[\]]|[^\[\]])+/;
@@ -1253,48 +1245,31 @@
1253
1245
  reflink: /^!?\[(label)\]\[(?!\s*\])((?:\\[\[\]]?|[^\[\]\\])+)\]/,
1254
1246
  nolink: /^!?\[(?!\s*\])((?:\[[^\[\]]*\]|\\[\[\]]|[^\[\]])*)\](?:\[\])?/,
1255
1247
  reflinkSearch: 'reflink|nolink(?!\\()',
1256
- strong: {
1257
- start: /^(?:(\*\*(?=[*punctuation]))|\*\*)(?![\s])|__/,
1258
- // (1) returns if starts w/ punctuation
1259
- middle: /^\*\*(?:(?:(?!overlapSkip)(?:[^*]|\\\*)|overlapSkip)|\*(?:(?!overlapSkip)(?:[^*]|\\\*)|overlapSkip)*?\*)+?\*\*$|^__(?![\s])((?:(?:(?!overlapSkip)(?:[^_]|\\_)|overlapSkip)|_(?:(?!overlapSkip)(?:[^_]|\\_)|overlapSkip)*?_)+?)__$/,
1260
- endAst: /[^punctuation\s]\*\*(?!\*)|[punctuation]\*\*(?!\*)(?:(?=[punctuation_\s]|$))/,
1261
- // last char can't be punct, or final * must also be followed by punct (or endline)
1262
- endUnd: /[^\s]__(?!_)(?:(?=[punctuation*\s])|$)/ // last char can't be a space, and final _ must preceed punct or \s (or endline)
1263
-
1264
- },
1265
- em: {
1266
- start: /^(?:(\*(?=[punctuation]))|\*)(?![*\s])|_/,
1267
- // (1) returns if starts w/ punctuation
1268
- middle: /^\*(?:(?:(?!overlapSkip)(?:[^*]|\\\*)|overlapSkip)|\*(?:(?!overlapSkip)(?:[^*]|\\\*)|overlapSkip)*?\*)+?\*$|^_(?![_\s])(?:(?:(?!overlapSkip)(?:[^_]|\\_)|overlapSkip)|_(?:(?!overlapSkip)(?:[^_]|\\_)|overlapSkip)*?_)+?_$/,
1269
- endAst: /[^punctuation\s]\*(?!\*)|[punctuation]\*(?!\*)(?:(?=[punctuation_\s]|$))/,
1270
- // last char can't be punct, or final * must also be followed by punct (or endline)
1271
- endUnd: /[^\s]_(?!_)(?:(?=[punctuation*\s])|$)/ // last char can't be a space, and final _ must preceed punct or \s (or endline)
1248
+ emStrong: {
1249
+ lDelim: /^(?:\*+(?:([punct_])|[^\s*]))|^_+(?:([punct*])|([^\s_]))/,
1250
+ // (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.
1251
+ // () Skip other delimiter (1) #*** (2) a***#, a*** (3) #***a, ***a (4) ***# (5) #***# (6) a***a
1252
+ rDelimAst: /\_\_[^_]*?\*[^_]*?\_\_|[punct_](\*+)(?=[\s]|$)|[^punct*_\s](\*+)(?=[punct_\s]|$)|[punct_\s](\*+)(?=[^punct*_\s])|[\s](\*+)(?=[punct_])|[punct_](\*+)(?=[punct_])|[^punct*_\s](\*+)(?=[^punct*_\s])/,
1253
+ rDelimUnd: /\*\*[^*]*?\_[^*]*?\*\*|[punct*](\_+)(?=[\s]|$)|[^punct*_\s](\_+)(?=[punct*\s]|$)|[punct*\s](\_+)(?=[^punct*_\s])|[\s](\_+)(?=[punct*])|[punct*](\_+)(?=[punct*])/ // ^- Not allowed for _
1272
1254
 
1273
1255
  },
1274
1256
  code: /^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/,
1275
1257
  br: /^( {2,}|\\)\n(?!\s*$)/,
1276
1258
  del: noopTest$1,
1277
- text: /^(`+|[^`])(?:(?= {2,}\n)|[\s\S]*?(?:(?=[\\<!\[`*]|\b_|$)|[^ ](?= {2,}\n)))/,
1278
- punctuation: /^([\s*punctuation])/
1279
- }; // list of punctuation marks from common mark spec
1280
- // without * and _ to workaround cases with double emphasis
1259
+ text: /^(`+|[^`])(?:(?= {2,}\n)|[\s\S]*?(?:(?=[\\<!\[`*_]|\b_|$)|[^ ](?= {2,}\n)))/,
1260
+ punctuation: /^([\spunctuation])/
1261
+ }; // list of punctuation marks from CommonMark spec
1262
+ // without * and _ to handle the different emphasis markers * and _
1281
1263
 
1282
1264
  inline._punctuation = '!"#$%&\'()+\\-.,/:;<=>?@\\[\\]`^{|}~';
1283
1265
  inline.punctuation = edit$1(inline.punctuation).replace(/punctuation/g, inline._punctuation).getRegex(); // sequences em should skip over [title](link), `code`, <html>
1284
1266
 
1285
- inline._blockSkip = '\\[[^\\]]*?\\]\\([^\\)]*?\\)|`[^`]*?`|<[^>]*?>';
1286
- inline._overlapSkip = '__[^_]*?__|\\*\\*\\[^\\*\\]*?\\*\\*';
1267
+ inline.blockSkip = /\[[^\]]*?\]\([^\)]*?\)|`[^`]*?`|<[^>]*?>/g;
1268
+ inline.escapedEmSt = /\\\*|\\_/g;
1287
1269
  inline._comment = edit$1(block._comment).replace('(?:-->|$)', '-->').getRegex();
1288
- inline.em.start = edit$1(inline.em.start).replace(/punctuation/g, inline._punctuation).getRegex();
1289
- inline.em.middle = edit$1(inline.em.middle).replace(/punctuation/g, inline._punctuation).replace(/overlapSkip/g, inline._overlapSkip).getRegex();
1290
- inline.em.endAst = edit$1(inline.em.endAst, 'g').replace(/punctuation/g, inline._punctuation).getRegex();
1291
- inline.em.endUnd = edit$1(inline.em.endUnd, 'g').replace(/punctuation/g, inline._punctuation).getRegex();
1292
- inline.strong.start = edit$1(inline.strong.start).replace(/punctuation/g, inline._punctuation).getRegex();
1293
- inline.strong.middle = edit$1(inline.strong.middle).replace(/punctuation/g, inline._punctuation).replace(/overlapSkip/g, inline._overlapSkip).getRegex();
1294
- inline.strong.endAst = edit$1(inline.strong.endAst, 'g').replace(/punctuation/g, inline._punctuation).getRegex();
1295
- inline.strong.endUnd = edit$1(inline.strong.endUnd, 'g').replace(/punctuation/g, inline._punctuation).getRegex();
1296
- inline.blockSkip = edit$1(inline._blockSkip, 'g').getRegex();
1297
- inline.overlapSkip = edit$1(inline._overlapSkip, 'g').getRegex();
1270
+ inline.emStrong.lDelim = edit$1(inline.emStrong.lDelim).replace(/punct/g, inline._punctuation).getRegex();
1271
+ inline.emStrong.rDelimAst = edit$1(inline.emStrong.rDelimAst, 'g').replace(/punct/g, inline._punctuation).getRegex();
1272
+ inline.emStrong.rDelimUnd = edit$1(inline.emStrong.rDelimUnd, 'g').replace(/punct/g, inline._punctuation).getRegex();
1298
1273
  inline._escapes = /\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/g;
1299
1274
  inline._scheme = /[a-zA-Z][a-zA-Z0-9+.-]{1,31}/;
1300
1275
  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])?)+(?![-_])/;
@@ -1342,7 +1317,7 @@
1342
1317
  url: /^((?:ftp|https?):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/,
1343
1318
  _backpedal: /(?:[^?!.,:;*_~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_~)]+(?!$))+/,
1344
1319
  del: /^(~~?)(?=[^\s~])([\s\S]*?[^\s~])\1(?=[^~]|$)/,
1345
- text: /^([`~]+|[^`~])(?:(?= {2,}\n)|[\s\S]*?(?:(?=[\\<!\[`*~]|\b_|https?:\/\/|ftp:\/\/|www\.|$)|[^ ](?= {2,}\n)|[^a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-](?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@))|(?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@))/
1320
+ text: /^([`~]+|[^`~])(?:(?= {2,}\n)|[\s\S]*?(?:(?=[\\<!\[`*~_]|\b_|https?:\/\/|ftp:\/\/|www\.|$)|[^ ](?= {2,}\n)|[^a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-](?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@))|(?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@))/
1346
1321
  });
1347
1322
  inline.gfm.url = edit$1(inline.gfm.url, 'i').replace('email', inline.gfm._extended_email).getRegex();
1348
1323
  /**
@@ -1480,7 +1455,10 @@
1480
1455
  top = true;
1481
1456
  }
1482
1457
 
1483
- src = src.replace(/^ +$/gm, '');
1458
+ if (this.options.pedantic) {
1459
+ src = src.replace(/^ +$/gm, '');
1460
+ }
1461
+
1484
1462
  var token, i, l, lastToken;
1485
1463
 
1486
1464
  while (src) {
@@ -1496,15 +1474,15 @@
1496
1474
  } // code
1497
1475
 
1498
1476
 
1499
- if (token = this.tokenizer.code(src, tokens)) {
1477
+ if (token = this.tokenizer.code(src)) {
1500
1478
  src = src.substring(token.raw.length);
1479
+ lastToken = tokens[tokens.length - 1]; // An indented code block cannot interrupt a paragraph.
1501
1480
 
1502
- if (token.type) {
1503
- tokens.push(token);
1504
- } else {
1505
- lastToken = tokens[tokens.length - 1];
1481
+ if (lastToken && lastToken.type === 'paragraph') {
1506
1482
  lastToken.raw += '\n' + token.raw;
1507
1483
  lastToken.text += '\n' + token.text;
1484
+ } else {
1485
+ tokens.push(token);
1508
1486
  }
1509
1487
 
1510
1488
  continue;
@@ -1602,15 +1580,15 @@
1602
1580
  } // text
1603
1581
 
1604
1582
 
1605
- if (token = this.tokenizer.text(src, tokens)) {
1583
+ if (token = this.tokenizer.text(src)) {
1606
1584
  src = src.substring(token.raw.length);
1585
+ lastToken = tokens[tokens.length - 1];
1607
1586
 
1608
- if (token.type) {
1609
- tokens.push(token);
1610
- } else {
1611
- lastToken = tokens[tokens.length - 1];
1587
+ if (lastToken && lastToken.type === 'text') {
1612
1588
  lastToken.raw += '\n' + token.raw;
1613
1589
  lastToken.text += '\n' + token.text;
1590
+ } else {
1591
+ tokens.push(token);
1614
1592
  }
1615
1593
 
1616
1594
  continue;
@@ -1717,7 +1695,7 @@
1717
1695
  inRawBlock = false;
1718
1696
  }
1719
1697
 
1720
- var token; // String with links masked to avoid interference with em and strong
1698
+ var token, lastToken; // String with links masked to avoid interference with em and strong
1721
1699
 
1722
1700
  var maskedSrc = src;
1723
1701
  var match;
@@ -1738,6 +1716,11 @@
1738
1716
 
1739
1717
  while ((match = this.tokenizer.rules.inline.blockSkip.exec(maskedSrc)) != null) {
1740
1718
  maskedSrc = maskedSrc.slice(0, match.index) + '[' + repeatString$1('a', match[0].length - 2) + ']' + maskedSrc.slice(this.tokenizer.rules.inline.blockSkip.lastIndex);
1719
+ } // Mask out escaped em & strong delimiters
1720
+
1721
+
1722
+ while ((match = this.tokenizer.rules.inline.escapedEmSt.exec(maskedSrc)) != null) {
1723
+ maskedSrc = maskedSrc.slice(0, match.index) + '++' + maskedSrc.slice(this.tokenizer.rules.inline.escapedEmSt.lastIndex);
1741
1724
  }
1742
1725
 
1743
1726
  while (src) {
@@ -1758,7 +1741,15 @@
1758
1741
  src = src.substring(token.raw.length);
1759
1742
  inLink = token.inLink;
1760
1743
  inRawBlock = token.inRawBlock;
1761
- tokens.push(token);
1744
+ var _lastToken = tokens[tokens.length - 1];
1745
+
1746
+ if (_lastToken && token.type === 'text' && _lastToken.type === 'text') {
1747
+ _lastToken.raw += token.raw;
1748
+ _lastToken.text += token.text;
1749
+ } else {
1750
+ tokens.push(token);
1751
+ }
1752
+
1762
1753
  continue;
1763
1754
  } // link
1764
1755
 
@@ -1777,25 +1768,23 @@
1777
1768
 
1778
1769
  if (token = this.tokenizer.reflink(src, this.tokens.links)) {
1779
1770
  src = src.substring(token.raw.length);
1771
+ var _lastToken2 = tokens[tokens.length - 1];
1780
1772
 
1781
1773
  if (token.type === 'link') {
1782
1774
  token.tokens = this.inlineTokens(token.text, [], true, inRawBlock);
1775
+ tokens.push(token);
1776
+ } else if (_lastToken2 && token.type === 'text' && _lastToken2.type === 'text') {
1777
+ _lastToken2.raw += token.raw;
1778
+ _lastToken2.text += token.text;
1779
+ } else {
1780
+ tokens.push(token);
1783
1781
  }
1784
1782
 
1785
- tokens.push(token);
1786
- continue;
1787
- } // strong
1788
-
1789
-
1790
- if (token = this.tokenizer.strong(src, maskedSrc, prevChar)) {
1791
- src = src.substring(token.raw.length);
1792
- token.tokens = this.inlineTokens(token.text, [], inLink, inRawBlock);
1793
- tokens.push(token);
1794
1783
  continue;
1795
- } // em
1784
+ } // em & strong
1796
1785
 
1797
1786
 
1798
- if (token = this.tokenizer.em(src, maskedSrc, prevChar)) {
1787
+ if (token = this.tokenizer.emStrong(src, maskedSrc, prevChar)) {
1799
1788
  src = src.substring(token.raw.length);
1800
1789
  token.tokens = this.inlineTokens(token.text, [], inLink, inRawBlock);
1801
1790
  tokens.push(token);
@@ -1841,9 +1830,22 @@
1841
1830
 
1842
1831
  if (token = this.tokenizer.inlineText(src, inRawBlock, smartypants)) {
1843
1832
  src = src.substring(token.raw.length);
1844
- prevChar = token.raw.slice(-1);
1833
+
1834
+ if (token.raw.slice(-1) !== '_') {
1835
+ // Track prevChar before string of ____ started
1836
+ prevChar = token.raw.slice(-1);
1837
+ }
1838
+
1845
1839
  keepPrevChar = true;
1846
- tokens.push(token);
1840
+ lastToken = tokens[tokens.length - 1];
1841
+
1842
+ if (lastToken && lastToken.type === 'text') {
1843
+ lastToken.raw += token.raw;
1844
+ lastToken.text += token.text;
1845
+ } else {
1846
+ tokens.push(token);
1847
+ }
1848
+
1847
1849
  continue;
1848
1850
  }
1849
1851
 
@@ -1901,6 +1903,8 @@
1901
1903
  }
1902
1904
  }
1903
1905
 
1906
+ _code = _code.replace(/\n$/, '') + '\n';
1907
+
1904
1908
  if (!lang) {
1905
1909
  return '<pre><code>' + (escaped ? _code : escape$1(_code, true)) + '</code></pre>\n';
1906
1910
  }