marked 2.0.4 → 2.1.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
@@ -75,6 +75,7 @@
75
75
  return {
76
76
  baseUrl: null,
77
77
  breaks: false,
78
+ extensions: null,
78
79
  gfm: true,
79
80
  headerIds: true,
80
81
  headerPrefix: '',
@@ -955,9 +956,9 @@
955
956
  }
956
957
 
957
958
  var match = this.rules.inline.emStrong.lDelim.exec(src);
958
- if (!match) return;
959
- 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
959
+ if (!match) return; // _ can't be between two alphanumerics. \p{L}\p{N} includes non-english alphabet/numbers as well
960
960
 
961
+ 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;
961
962
  var nextChar = match[1] || match[2] || '';
962
963
 
963
964
  if (!nextChar || nextChar && (prevChar === '' || this.rules.inline.punctuation.exec(prevChar))) {
@@ -967,12 +968,13 @@
967
968
  delimTotal = lLength,
968
969
  midDelimTotal = 0;
969
970
  var endReg = match[0][0] === '*' ? this.rules.inline.emStrong.rDelimAst : this.rules.inline.emStrong.rDelimUnd;
970
- endReg.lastIndex = 0;
971
- maskedSrc = maskedSrc.slice(-1 * src.length + lLength); // Bump maskedSrc to same section of string as src (move to lexer?)
971
+ endReg.lastIndex = 0; // Clip maskedSrc to same section of string as src (move to lexer?)
972
+
973
+ maskedSrc = maskedSrc.slice(-1 * src.length + lLength);
972
974
 
973
975
  while ((match = endReg.exec(maskedSrc)) != null) {
974
976
  rDelim = match[1] || match[2] || match[3] || match[4] || match[5] || match[6];
975
- if (!rDelim) continue; // matched the first alternative in rules.js (skip the * in __abc*abc__)
977
+ if (!rDelim) continue; // skip single * in __abc*abc__
976
978
 
977
979
  rLength = rDelim.length;
978
980
 
@@ -990,11 +992,9 @@
990
992
 
991
993
  delimTotal -= rLength;
992
994
  if (delimTotal > 0) continue; // Haven't found enough closing delimiters
993
- // If this is the last rDelimiter, remove extra characters. *a*** -> *a*
995
+ // Remove extra characters. *a*** -> *a*
994
996
 
995
- if (delimTotal + midDelimTotal - rLength <= 0 && !maskedSrc.slice(endReg.lastIndex).match(endReg)) {
996
- rLength = Math.min(rLength, rLength + delimTotal + midDelimTotal);
997
- }
997
+ rLength = Math.min(rLength, rLength + delimTotal + midDelimTotal); // Create `em` if smallest delimiter has odd char count. *a***
998
998
 
999
999
  if (Math.min(lLength, rLength) % 2) {
1000
1000
  return {
@@ -1002,15 +1002,14 @@
1002
1002
  raw: src.slice(0, lLength + match.index + rLength + 1),
1003
1003
  text: src.slice(1, lLength + match.index + rLength)
1004
1004
  };
1005
- }
1005
+ } // Create 'strong' if smallest delimiter has even char count. **a***
1006
1006
 
1007
- if (Math.min(lLength, rLength) % 2 === 0) {
1008
- return {
1009
- type: 'strong',
1010
- raw: src.slice(0, lLength + match.index + rLength + 1),
1011
- text: src.slice(2, lLength + match.index + rLength - 1)
1012
- };
1013
- }
1007
+
1008
+ return {
1009
+ type: 'strong',
1010
+ raw: src.slice(0, lLength + match.index + rLength + 1),
1011
+ text: src.slice(2, lLength + match.index + rLength - 1)
1012
+ };
1014
1013
  }
1015
1014
  }
1016
1015
  };
@@ -1260,9 +1259,9 @@
1260
1259
  emStrong: {
1261
1260
  lDelim: /^(?:\*+(?:([punct_])|[^\s*]))|^_+(?:([punct*])|([^\s_]))/,
1262
1261
  // (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.
1263
- // () Skip other delimiter (1) #*** (2) a***#, a*** (3) #***a, ***a (4) ***# (5) #***# (6) a***a
1264
- rDelimAst: /\_\_[^_]*?\*[^_]*?\_\_|[punct_](\*+)(?=[\s]|$)|[^punct*_\s](\*+)(?=[punct_\s]|$)|[punct_\s](\*+)(?=[^punct*_\s])|[\s](\*+)(?=[punct_])|[punct_](\*+)(?=[punct_])|[^punct*_\s](\*+)(?=[^punct*_\s])/,
1265
- rDelimUnd: /\*\*[^*]*?\_[^*]*?\*\*|[punct*](\_+)(?=[\s]|$)|[^punct*_\s](\_+)(?=[punct*\s]|$)|[punct*\s](\_+)(?=[^punct*_\s])|[\s](\_+)(?=[punct*])|[punct*](\_+)(?=[punct*])/ // ^- Not allowed for _
1262
+ // () Skip other delimiter (1) #*** (2) a***#, a*** (3) #***a, ***a (4) ***# (5) #***# (6) a***a
1263
+ rDelimAst: /\_\_[^_*]*?\*[^_*]*?\_\_|[punct_](\*+)(?=[\s]|$)|[^punct*_\s](\*+)(?=[punct_\s]|$)|[punct_\s](\*+)(?=[^punct*_\s])|[\s](\*+)(?=[punct_])|[punct_](\*+)(?=[punct_])|[^punct*_\s](\*+)(?=[^punct*_\s])/,
1264
+ rDelimUnd: /\*\*[^_*]*?\_[^_*]*?\*\*|[punct*](\_+)(?=[\s]|$)|[^punct*_\s](\_+)(?=[punct*\s]|$)|[punct*\s](\_+)(?=[^punct*_\s])|[\s](\_+)(?=[punct*])|[punct*](\_+)(?=[punct*])/ // ^- Not allowed for _
1266
1265
 
1267
1266
  },
1268
1267
  code: /^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/,
@@ -1329,7 +1328,7 @@
1329
1328
  url: /^((?:ftp|https?):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/,
1330
1329
  _backpedal: /(?:[^?!.,:;*_~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_~)]+(?!$))+/,
1331
1330
  del: /^(~~?)(?=[^\s~])([\s\S]*?[^\s~])\1(?=[^~]|$)/,
1332
- text: /^([`~]+|[^`~])(?:(?= {2,}\n)|[\s\S]*?(?:(?=[\\<!\[`*~_]|\b_|https?:\/\/|ftp:\/\/|www\.|$)|[^ ](?= {2,}\n)|[^a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-](?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@))|(?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@))/
1331
+ text: /^([`~]+|[^`~])(?:(?= {2,}\n)|(?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)|[\s\S]*?(?:(?=[\\<!\[`*~_]|\b_|https?:\/\/|ftp:\/\/|www\.|$)|[^ ](?= {2,}\n)|[^a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-](?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)))/
1333
1332
  });
1334
1333
  inline$1.gfm.url = edit(inline$1.gfm.url, 'i').replace('email', inline$1.gfm._extended_email).getRegex();
1335
1334
  /**
@@ -1460,6 +1459,8 @@
1460
1459
  ;
1461
1460
 
1462
1461
  _proto.blockTokens = function blockTokens(src, tokens, top) {
1462
+ var _this = this;
1463
+
1463
1464
  if (tokens === void 0) {
1464
1465
  tokens = [];
1465
1466
  }
@@ -1472,10 +1473,24 @@
1472
1473
  src = src.replace(/^ +$/gm, '');
1473
1474
  }
1474
1475
 
1475
- var token, i, l, lastToken;
1476
+ var token, i, l, lastToken, cutSrc, lastParagraphClipped;
1476
1477
 
1477
1478
  while (src) {
1478
- // newline
1479
+ var _this$options, _this$options$extensi, _this$options$extensi2;
1480
+
1481
+ if ((_this$options = this.options) != null && (_this$options$extensi = _this$options.extensions) != null && _this$options$extensi.block && this.options.extensions.block.some(function (extTokenizer) {
1482
+ if (token = extTokenizer.call(_this, src, tokens)) {
1483
+ src = src.substring(token.raw.length);
1484
+ tokens.push(token);
1485
+ return true;
1486
+ }
1487
+
1488
+ return false;
1489
+ })) {
1490
+ continue;
1491
+ } // newline
1492
+
1493
+
1479
1494
  if (token = this.tokenizer.space(src)) {
1480
1495
  src = src.substring(token.raw.length);
1481
1496
 
@@ -1584,11 +1599,43 @@
1584
1599
  tokens.push(token);
1585
1600
  continue;
1586
1601
  } // top-level paragraph
1602
+ // prevent paragraph consuming extensions by clipping 'src' to extension start
1587
1603
 
1588
1604
 
1589
- if (top && (token = this.tokenizer.paragraph(src))) {
1605
+ cutSrc = src;
1606
+
1607
+ if ((_this$options$extensi2 = this.options.extensions) != null && _this$options$extensi2.startBlock) {
1608
+ (function () {
1609
+ var startIndex = Infinity;
1610
+ var tempSrc = src.slice(1);
1611
+ var tempStart = void 0;
1612
+
1613
+ _this.options.extensions.startBlock.forEach(function (getStartIndex) {
1614
+ tempStart = getStartIndex.call(this, tempSrc);
1615
+
1616
+ if (typeof tempStart === 'number' && tempStart >= 0) {
1617
+ startIndex = Math.min(startIndex, tempStart);
1618
+ }
1619
+ });
1620
+
1621
+ if (startIndex < Infinity && startIndex >= 0) {
1622
+ cutSrc = src.substring(0, startIndex + 1);
1623
+ }
1624
+ })();
1625
+ }
1626
+
1627
+ if (top && (token = this.tokenizer.paragraph(cutSrc))) {
1628
+ lastToken = tokens[tokens.length - 1];
1629
+
1630
+ if (lastParagraphClipped && lastToken.type === 'paragraph') {
1631
+ lastToken.raw += '\n' + token.raw;
1632
+ lastToken.text += '\n' + token.text;
1633
+ } else {
1634
+ tokens.push(token);
1635
+ }
1636
+
1637
+ lastParagraphClipped = cutSrc.length !== src.length;
1590
1638
  src = src.substring(token.raw.length);
1591
- tokens.push(token);
1592
1639
  continue;
1593
1640
  } // text
1594
1641
 
@@ -1696,6 +1743,8 @@
1696
1743
  ;
1697
1744
 
1698
1745
  _proto.inlineTokens = function inlineTokens(src, tokens, inLink, inRawBlock) {
1746
+ var _this2 = this;
1747
+
1699
1748
  if (tokens === void 0) {
1700
1749
  tokens = [];
1701
1750
  }
@@ -1708,7 +1757,7 @@
1708
1757
  inRawBlock = false;
1709
1758
  }
1710
1759
 
1711
- var token, lastToken; // String with links masked to avoid interference with em and strong
1760
+ var token, lastToken, cutSrc; // String with links masked to avoid interference with em and strong
1712
1761
 
1713
1762
  var maskedSrc = src;
1714
1763
  var match;
@@ -1737,11 +1786,26 @@
1737
1786
  }
1738
1787
 
1739
1788
  while (src) {
1789
+ var _this$options2, _this$options2$extens, _this$options$extensi3;
1790
+
1740
1791
  if (!keepPrevChar) {
1741
1792
  prevChar = '';
1742
1793
  }
1743
1794
 
1744
- keepPrevChar = false; // escape
1795
+ keepPrevChar = false; // extensions
1796
+
1797
+ if ((_this$options2 = this.options) != null && (_this$options2$extens = _this$options2.extensions) != null && _this$options2$extens.inline && this.options.extensions.inline.some(function (extTokenizer) {
1798
+ if (token = extTokenizer.call(_this2, src, tokens)) {
1799
+ src = src.substring(token.raw.length);
1800
+ tokens.push(token);
1801
+ return true;
1802
+ }
1803
+
1804
+ return false;
1805
+ })) {
1806
+ continue;
1807
+ } // escape
1808
+
1745
1809
 
1746
1810
  if (token = this.tokenizer.escape(src)) {
1747
1811
  src = src.substring(token.raw.length);
@@ -1754,11 +1818,11 @@
1754
1818
  src = src.substring(token.raw.length);
1755
1819
  inLink = token.inLink;
1756
1820
  inRawBlock = token.inRawBlock;
1757
- var _lastToken = tokens[tokens.length - 1];
1821
+ lastToken = tokens[tokens.length - 1];
1758
1822
 
1759
- if (_lastToken && token.type === 'text' && _lastToken.type === 'text') {
1760
- _lastToken.raw += token.raw;
1761
- _lastToken.text += token.text;
1823
+ if (lastToken && token.type === 'text' && lastToken.type === 'text') {
1824
+ lastToken.raw += token.raw;
1825
+ lastToken.text += token.text;
1762
1826
  } else {
1763
1827
  tokens.push(token);
1764
1828
  }
@@ -1781,14 +1845,14 @@
1781
1845
 
1782
1846
  if (token = this.tokenizer.reflink(src, this.tokens.links)) {
1783
1847
  src = src.substring(token.raw.length);
1784
- var _lastToken2 = tokens[tokens.length - 1];
1848
+ lastToken = tokens[tokens.length - 1];
1785
1849
 
1786
1850
  if (token.type === 'link') {
1787
1851
  token.tokens = this.inlineTokens(token.text, [], true, inRawBlock);
1788
1852
  tokens.push(token);
1789
- } else if (_lastToken2 && token.type === 'text' && _lastToken2.type === 'text') {
1790
- _lastToken2.raw += token.raw;
1791
- _lastToken2.text += token.text;
1853
+ } else if (lastToken && token.type === 'text' && lastToken.type === 'text') {
1854
+ lastToken.raw += token.raw;
1855
+ lastToken.text += token.text;
1792
1856
  } else {
1793
1857
  tokens.push(token);
1794
1858
  }
@@ -1839,9 +1903,32 @@
1839
1903
  tokens.push(token);
1840
1904
  continue;
1841
1905
  } // text
1906
+ // prevent inlineText consuming extensions by clipping 'src' to extension start
1907
+
1908
+
1909
+ cutSrc = src;
1910
+
1911
+ if ((_this$options$extensi3 = this.options.extensions) != null && _this$options$extensi3.startInline) {
1912
+ (function () {
1913
+ var startIndex = Infinity;
1914
+ var tempSrc = src.slice(1);
1915
+ var tempStart = void 0;
1842
1916
 
1917
+ _this2.options.extensions.startInline.forEach(function (getStartIndex) {
1918
+ tempStart = getStartIndex.call(this, tempSrc);
1843
1919
 
1844
- if (token = this.tokenizer.inlineText(src, inRawBlock, smartypants)) {
1920
+ if (typeof tempStart === 'number' && tempStart >= 0) {
1921
+ startIndex = Math.min(startIndex, tempStart);
1922
+ }
1923
+ });
1924
+
1925
+ if (startIndex < Infinity && startIndex >= 0) {
1926
+ cutSrc = src.substring(0, startIndex + 1);
1927
+ }
1928
+ })();
1929
+ }
1930
+
1931
+ if (token = this.tokenizer.inlineText(cutSrc, inRawBlock, smartypants)) {
1845
1932
  src = src.substring(token.raw.length);
1846
1933
 
1847
1934
  if (token.raw.slice(-1) !== '_') {
@@ -2217,11 +2304,23 @@
2217
2304
  item,
2218
2305
  checked,
2219
2306
  task,
2220
- checkbox;
2307
+ checkbox,
2308
+ ret;
2221
2309
  var l = tokens.length;
2222
2310
 
2223
2311
  for (i = 0; i < l; i++) {
2224
- token = tokens[i];
2312
+ var _this$options$extensi, _this$options$extensi2;
2313
+
2314
+ token = tokens[i]; // Run any renderer extensions
2315
+
2316
+ if ((_this$options$extensi = this.options.extensions) != null && (_this$options$extensi2 = _this$options$extensi.renderers) != null && _this$options$extensi2[token.type]) {
2317
+ ret = this.options.extensions.renderers[token.type].call(this, token);
2318
+
2319
+ if (ret !== false || !['space', 'hr', 'heading', 'code', 'table', 'blockquote', 'list', 'html', 'paragraph', 'text'].includes(token.type)) {
2320
+ out += ret || '';
2321
+ continue;
2322
+ }
2323
+ }
2225
2324
 
2226
2325
  switch (token.type) {
2227
2326
  case 'space':
@@ -2385,11 +2484,23 @@
2385
2484
  renderer = renderer || this.renderer;
2386
2485
  var out = '',
2387
2486
  i,
2388
- token;
2487
+ token,
2488
+ ret;
2389
2489
  var l = tokens.length;
2390
2490
 
2391
2491
  for (i = 0; i < l; i++) {
2392
- token = tokens[i];
2492
+ var _this$options$extensi3, _this$options$extensi4;
2493
+
2494
+ token = tokens[i]; // Run any renderer extensions
2495
+
2496
+ if ((_this$options$extensi3 = this.options.extensions) != null && (_this$options$extensi4 = _this$options$extensi3.renderers) != null && _this$options$extensi4[token.type]) {
2497
+ ret = this.options.extensions.renderers[token.type].call(this, token);
2498
+
2499
+ if (ret !== false || !['escape', 'html', 'link', 'image', 'strong', 'em', 'codespan', 'br', 'del', 'text'].includes(token.type)) {
2500
+ out += ret || '';
2501
+ continue;
2502
+ }
2503
+ }
2393
2504
 
2394
2505
  switch (token.type) {
2395
2506
  case 'escape':
@@ -2521,6 +2632,10 @@
2521
2632
 
2522
2633
  if (!err) {
2523
2634
  try {
2635
+ if (opt.walkTokens) {
2636
+ marked.walkTokens(tokens, opt.walkTokens);
2637
+ }
2638
+
2524
2639
  out = Parser.parse(tokens, opt);
2525
2640
  } catch (e) {
2526
2641
  err = e;
@@ -2604,82 +2719,171 @@
2604
2719
  * Use Extension
2605
2720
  */
2606
2721
 
2607
- marked.use = function (extension) {
2608
- var opts = merge({}, extension);
2722
+ marked.use = function () {
2723
+ var _this = this;
2724
+
2725
+ for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
2726
+ args[_key] = arguments[_key];
2727
+ }
2728
+
2729
+ var opts = merge.apply(void 0, [{}].concat(args));
2730
+ var extensions = marked.defaults.extensions || {
2731
+ renderers: {},
2732
+ childTokens: {}
2733
+ };
2734
+ var hasExtensions;
2735
+ args.forEach(function (pack) {
2736
+ // ==-- Parse "addon" extensions --== //
2737
+ if (pack.extensions) {
2738
+ hasExtensions = true;
2739
+ pack.extensions.forEach(function (ext) {
2740
+ if (!ext.name) {
2741
+ throw new Error('extension name required');
2742
+ }
2743
+
2744
+ if (ext.renderer) {
2745
+ var _extensions$renderers;
2609
2746
 
2610
- if (extension.renderer) {
2611
- (function () {
2612
- var renderer = marked.defaults.renderer || new Renderer();
2747
+ // Renderer extensions
2748
+ var prevRenderer = (_extensions$renderers = extensions.renderers) == null ? void 0 : _extensions$renderers[ext.name];
2749
+
2750
+ if (prevRenderer) {
2751
+ // Replace extension with func to run new extension but fall back if false
2752
+ extensions.renderers[ext.name] = function () {
2753
+ for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
2754
+ args[_key2] = arguments[_key2];
2755
+ }
2613
2756
 
2614
- var _loop = function _loop(prop) {
2615
- var prevRenderer = renderer[prop];
2757
+ var ret = ext.renderer.apply(this, args);
2616
2758
 
2617
- renderer[prop] = function () {
2618
- for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
2619
- args[_key] = arguments[_key];
2759
+ if (ret === false) {
2760
+ ret = prevRenderer.apply(this, args);
2761
+ }
2762
+
2763
+ return ret;
2764
+ };
2765
+ } else {
2766
+ extensions.renderers[ext.name] = ext.renderer;
2620
2767
  }
2768
+ }
2621
2769
 
2622
- var ret = extension.renderer[prop].apply(renderer, args);
2770
+ if (ext.tokenizer) {
2771
+ // Tokenizer Extensions
2772
+ if (!ext.level || ext.level !== 'block' && ext.level !== 'inline') {
2773
+ throw new Error("extension level must be 'block' or 'inline'");
2774
+ }
2623
2775
 
2624
- if (ret === false) {
2625
- ret = prevRenderer.apply(renderer, args);
2776
+ if (extensions[ext.level]) {
2777
+ extensions[ext.level].unshift(ext.tokenizer);
2778
+ } else {
2779
+ extensions[ext.level] = [ext.tokenizer];
2626
2780
  }
2627
2781
 
2628
- return ret;
2782
+ if (ext.start) {
2783
+ // Function to check for start of token
2784
+ if (ext.level === 'block') {
2785
+ if (extensions.startBlock) {
2786
+ extensions.startBlock.push(ext.start);
2787
+ } else {
2788
+ extensions.startBlock = [ext.start];
2789
+ }
2790
+ } else if (ext.level === 'inline') {
2791
+ if (extensions.startInline) {
2792
+ extensions.startInline.push(ext.start);
2793
+ } else {
2794
+ extensions.startInline = [ext.start];
2795
+ }
2796
+ }
2797
+ }
2798
+ }
2799
+
2800
+ if (ext.childTokens) {
2801
+ // Child tokens to be visited by walkTokens
2802
+ extensions.childTokens[ext.name] = ext.childTokens;
2803
+ }
2804
+ });
2805
+ } // ==-- Parse "overwrite" extensions --== //
2806
+
2807
+
2808
+ if (pack.renderer) {
2809
+ (function () {
2810
+ var renderer = marked.defaults.renderer || new Renderer();
2811
+
2812
+ var _loop = function _loop(prop) {
2813
+ var prevRenderer = renderer[prop]; // Replace renderer with func to run extension, but fall back if false
2814
+
2815
+ renderer[prop] = function () {
2816
+ for (var _len3 = arguments.length, args = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {
2817
+ args[_key3] = arguments[_key3];
2818
+ }
2819
+
2820
+ var ret = pack.renderer[prop].apply(renderer, args);
2821
+
2822
+ if (ret === false) {
2823
+ ret = prevRenderer.apply(renderer, args);
2824
+ }
2825
+
2826
+ return ret;
2827
+ };
2629
2828
  };
2630
- };
2631
2829
 
2632
- for (var prop in extension.renderer) {
2633
- _loop(prop);
2634
- }
2830
+ for (var prop in pack.renderer) {
2831
+ _loop(prop);
2832
+ }
2635
2833
 
2636
- opts.renderer = renderer;
2637
- })();
2638
- }
2834
+ opts.renderer = renderer;
2835
+ })();
2836
+ }
2639
2837
 
2640
- if (extension.tokenizer) {
2641
- (function () {
2642
- var tokenizer = marked.defaults.tokenizer || new Tokenizer();
2838
+ if (pack.tokenizer) {
2839
+ (function () {
2840
+ var tokenizer = marked.defaults.tokenizer || new Tokenizer();
2643
2841
 
2644
- var _loop2 = function _loop2(prop) {
2645
- var prevTokenizer = tokenizer[prop];
2842
+ var _loop2 = function _loop2(prop) {
2843
+ var prevTokenizer = tokenizer[prop]; // Replace tokenizer with func to run extension, but fall back if false
2646
2844
 
2647
- tokenizer[prop] = function () {
2648
- for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
2649
- args[_key2] = arguments[_key2];
2650
- }
2845
+ tokenizer[prop] = function () {
2846
+ for (var _len4 = arguments.length, args = new Array(_len4), _key4 = 0; _key4 < _len4; _key4++) {
2847
+ args[_key4] = arguments[_key4];
2848
+ }
2651
2849
 
2652
- var ret = extension.tokenizer[prop].apply(tokenizer, args);
2850
+ var ret = pack.tokenizer[prop].apply(tokenizer, args);
2653
2851
 
2654
- if (ret === false) {
2655
- ret = prevTokenizer.apply(tokenizer, args);
2656
- }
2852
+ if (ret === false) {
2853
+ ret = prevTokenizer.apply(tokenizer, args);
2854
+ }
2657
2855
 
2658
- return ret;
2856
+ return ret;
2857
+ };
2659
2858
  };
2660
- };
2661
2859
 
2662
- for (var prop in extension.tokenizer) {
2663
- _loop2(prop);
2664
- }
2860
+ for (var prop in pack.tokenizer) {
2861
+ _loop2(prop);
2862
+ }
2665
2863
 
2666
- opts.tokenizer = tokenizer;
2667
- })();
2668
- }
2864
+ opts.tokenizer = tokenizer;
2865
+ })();
2866
+ } // ==-- Parse WalkTokens extensions --== //
2669
2867
 
2670
- if (extension.walkTokens) {
2671
- var walkTokens = marked.defaults.walkTokens;
2672
2868
 
2673
- opts.walkTokens = function (token) {
2674
- extension.walkTokens(token);
2869
+ if (pack.walkTokens) {
2870
+ var walkTokens = marked.defaults.walkTokens;
2675
2871
 
2676
- if (walkTokens) {
2677
- walkTokens(token);
2678
- }
2679
- };
2680
- }
2872
+ opts.walkTokens = function (token) {
2873
+ pack.walkTokens.call(_this, token);
2681
2874
 
2682
- marked.setOptions(opts);
2875
+ if (walkTokens) {
2876
+ walkTokens(token);
2877
+ }
2878
+ };
2879
+ }
2880
+
2881
+ if (hasExtensions) {
2882
+ opts.extensions = extensions;
2883
+ }
2884
+
2885
+ marked.setOptions(opts);
2886
+ });
2683
2887
  };
2684
2888
  /**
2685
2889
  * Run callback for every token
@@ -2687,7 +2891,7 @@
2687
2891
 
2688
2892
 
2689
2893
  marked.walkTokens = function (tokens, callback) {
2690
- for (var _iterator = _createForOfIteratorHelperLoose(tokens), _step; !(_step = _iterator()).done;) {
2894
+ var _loop3 = function _loop3() {
2691
2895
  var token = _step.value;
2692
2896
  callback(token);
2693
2897
 
@@ -2719,11 +2923,26 @@
2719
2923
 
2720
2924
  default:
2721
2925
  {
2722
- if (token.tokens) {
2926
+ var _marked$defaults, _marked$defaults$exte, _marked$defaults$exte2, _marked$defaults3, _marked$defaults3$ext;
2927
+
2928
+ if ((_marked$defaults = marked.defaults) != null && (_marked$defaults$exte = _marked$defaults.extensions) != null && (_marked$defaults$exte2 = _marked$defaults$exte.childTokens) != null && _marked$defaults$exte2[token.type]) {
2929
+ var _marked$defaults2;
2930
+
2931
+ // Walk any extensions
2932
+ (_marked$defaults2 = marked.defaults) == null ? void 0 : _marked$defaults2.extensions.childTokens[token.type].forEach(function (childTokens) {
2933
+ marked.walkTokens(token[childTokens], callback);
2934
+ });
2935
+ }
2936
+
2937
+ if (token.tokens && !((_marked$defaults3 = marked.defaults) != null && (_marked$defaults3$ext = _marked$defaults3.extensions) != null && _marked$defaults3$ext.childTokens[token.type])) {
2723
2938
  marked.walkTokens(token.tokens, callback);
2724
2939
  }
2725
2940
  }
2726
2941
  }
2942
+ };
2943
+
2944
+ for (var _iterator = _createForOfIteratorHelperLoose(tokens), _step; !(_step = _iterator()).done;) {
2945
+ _loop3();
2727
2946
  }
2728
2947
  };
2729
2948
  /**