marked 2.0.5 → 2.1.1

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,22 @@
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
+ if (this.options.extensions && this.options.extensions.block && this.options.extensions.block.some(function (extTokenizer) {
1480
+ if (token = extTokenizer.call(_this, src, tokens)) {
1481
+ src = src.substring(token.raw.length);
1482
+ tokens.push(token);
1483
+ return true;
1484
+ }
1485
+
1486
+ return false;
1487
+ })) {
1488
+ continue;
1489
+ } // newline
1490
+
1491
+
1479
1492
  if (token = this.tokenizer.space(src)) {
1480
1493
  src = src.substring(token.raw.length);
1481
1494
 
@@ -1584,11 +1597,43 @@
1584
1597
  tokens.push(token);
1585
1598
  continue;
1586
1599
  } // top-level paragraph
1600
+ // prevent paragraph consuming extensions by clipping 'src' to extension start
1601
+
1602
+
1603
+ cutSrc = src;
1604
+
1605
+ if (this.options.extensions && this.options.extensions.startBlock) {
1606
+ (function () {
1607
+ var startIndex = Infinity;
1608
+ var tempSrc = src.slice(1);
1609
+ var tempStart = void 0;
1610
+
1611
+ _this.options.extensions.startBlock.forEach(function (getStartIndex) {
1612
+ tempStart = getStartIndex.call(this, tempSrc);
1613
+
1614
+ if (typeof tempStart === 'number' && tempStart >= 0) {
1615
+ startIndex = Math.min(startIndex, tempStart);
1616
+ }
1617
+ });
1587
1618
 
1619
+ if (startIndex < Infinity && startIndex >= 0) {
1620
+ cutSrc = src.substring(0, startIndex + 1);
1621
+ }
1622
+ })();
1623
+ }
1624
+
1625
+ if (top && (token = this.tokenizer.paragraph(cutSrc))) {
1626
+ lastToken = tokens[tokens.length - 1];
1627
+
1628
+ if (lastParagraphClipped && lastToken.type === 'paragraph') {
1629
+ lastToken.raw += '\n' + token.raw;
1630
+ lastToken.text += '\n' + token.text;
1631
+ } else {
1632
+ tokens.push(token);
1633
+ }
1588
1634
 
1589
- if (top && (token = this.tokenizer.paragraph(src))) {
1635
+ lastParagraphClipped = cutSrc.length !== src.length;
1590
1636
  src = src.substring(token.raw.length);
1591
- tokens.push(token);
1592
1637
  continue;
1593
1638
  } // text
1594
1639
 
@@ -1696,6 +1741,8 @@
1696
1741
  ;
1697
1742
 
1698
1743
  _proto.inlineTokens = function inlineTokens(src, tokens, inLink, inRawBlock) {
1744
+ var _this2 = this;
1745
+
1699
1746
  if (tokens === void 0) {
1700
1747
  tokens = [];
1701
1748
  }
@@ -1708,7 +1755,7 @@
1708
1755
  inRawBlock = false;
1709
1756
  }
1710
1757
 
1711
- var token, lastToken; // String with links masked to avoid interference with em and strong
1758
+ var token, lastToken, cutSrc; // String with links masked to avoid interference with em and strong
1712
1759
 
1713
1760
  var maskedSrc = src;
1714
1761
  var match;
@@ -1741,7 +1788,20 @@
1741
1788
  prevChar = '';
1742
1789
  }
1743
1790
 
1744
- keepPrevChar = false; // escape
1791
+ keepPrevChar = false; // extensions
1792
+
1793
+ if (this.options.extensions && this.options.extensions.inline && this.options.extensions.inline.some(function (extTokenizer) {
1794
+ if (token = extTokenizer.call(_this2, src, tokens)) {
1795
+ src = src.substring(token.raw.length);
1796
+ tokens.push(token);
1797
+ return true;
1798
+ }
1799
+
1800
+ return false;
1801
+ })) {
1802
+ continue;
1803
+ } // escape
1804
+
1745
1805
 
1746
1806
  if (token = this.tokenizer.escape(src)) {
1747
1807
  src = src.substring(token.raw.length);
@@ -1754,11 +1814,11 @@
1754
1814
  src = src.substring(token.raw.length);
1755
1815
  inLink = token.inLink;
1756
1816
  inRawBlock = token.inRawBlock;
1757
- var _lastToken = tokens[tokens.length - 1];
1817
+ lastToken = tokens[tokens.length - 1];
1758
1818
 
1759
- if (_lastToken && token.type === 'text' && _lastToken.type === 'text') {
1760
- _lastToken.raw += token.raw;
1761
- _lastToken.text += token.text;
1819
+ if (lastToken && token.type === 'text' && lastToken.type === 'text') {
1820
+ lastToken.raw += token.raw;
1821
+ lastToken.text += token.text;
1762
1822
  } else {
1763
1823
  tokens.push(token);
1764
1824
  }
@@ -1781,14 +1841,14 @@
1781
1841
 
1782
1842
  if (token = this.tokenizer.reflink(src, this.tokens.links)) {
1783
1843
  src = src.substring(token.raw.length);
1784
- var _lastToken2 = tokens[tokens.length - 1];
1844
+ lastToken = tokens[tokens.length - 1];
1785
1845
 
1786
1846
  if (token.type === 'link') {
1787
1847
  token.tokens = this.inlineTokens(token.text, [], true, inRawBlock);
1788
1848
  tokens.push(token);
1789
- } else if (_lastToken2 && token.type === 'text' && _lastToken2.type === 'text') {
1790
- _lastToken2.raw += token.raw;
1791
- _lastToken2.text += token.text;
1849
+ } else if (lastToken && token.type === 'text' && lastToken.type === 'text') {
1850
+ lastToken.raw += token.raw;
1851
+ lastToken.text += token.text;
1792
1852
  } else {
1793
1853
  tokens.push(token);
1794
1854
  }
@@ -1839,9 +1899,32 @@
1839
1899
  tokens.push(token);
1840
1900
  continue;
1841
1901
  } // text
1902
+ // prevent inlineText consuming extensions by clipping 'src' to extension start
1842
1903
 
1843
1904
 
1844
- if (token = this.tokenizer.inlineText(src, inRawBlock, smartypants)) {
1905
+ cutSrc = src;
1906
+
1907
+ if (this.options.extensions && this.options.extensions.startInline) {
1908
+ (function () {
1909
+ var startIndex = Infinity;
1910
+ var tempSrc = src.slice(1);
1911
+ var tempStart = void 0;
1912
+
1913
+ _this2.options.extensions.startInline.forEach(function (getStartIndex) {
1914
+ tempStart = getStartIndex.call(this, tempSrc);
1915
+
1916
+ if (typeof tempStart === 'number' && tempStart >= 0) {
1917
+ startIndex = Math.min(startIndex, tempStart);
1918
+ }
1919
+ });
1920
+
1921
+ if (startIndex < Infinity && startIndex >= 0) {
1922
+ cutSrc = src.substring(0, startIndex + 1);
1923
+ }
1924
+ })();
1925
+ }
1926
+
1927
+ if (token = this.tokenizer.inlineText(cutSrc, inRawBlock, smartypants)) {
1845
1928
  src = src.substring(token.raw.length);
1846
1929
 
1847
1930
  if (token.raw.slice(-1) !== '_') {
@@ -2217,11 +2300,21 @@
2217
2300
  item,
2218
2301
  checked,
2219
2302
  task,
2220
- checkbox;
2303
+ checkbox,
2304
+ ret;
2221
2305
  var l = tokens.length;
2222
2306
 
2223
2307
  for (i = 0; i < l; i++) {
2224
- token = tokens[i];
2308
+ token = tokens[i]; // Run any renderer extensions
2309
+
2310
+ if (this.options.extensions && this.options.extensions.renderers && this.options.extensions.renderers[token.type]) {
2311
+ ret = this.options.extensions.renderers[token.type].call(this, token);
2312
+
2313
+ if (ret !== false || !['space', 'hr', 'heading', 'code', 'table', 'blockquote', 'list', 'html', 'paragraph', 'text'].includes(token.type)) {
2314
+ out += ret || '';
2315
+ continue;
2316
+ }
2317
+ }
2225
2318
 
2226
2319
  switch (token.type) {
2227
2320
  case 'space':
@@ -2385,11 +2478,21 @@
2385
2478
  renderer = renderer || this.renderer;
2386
2479
  var out = '',
2387
2480
  i,
2388
- token;
2481
+ token,
2482
+ ret;
2389
2483
  var l = tokens.length;
2390
2484
 
2391
2485
  for (i = 0; i < l; i++) {
2392
- token = tokens[i];
2486
+ token = tokens[i]; // Run any renderer extensions
2487
+
2488
+ if (this.options.extensions && this.options.extensions.renderers && this.options.extensions.renderers[token.type]) {
2489
+ ret = this.options.extensions.renderers[token.type].call(this, token);
2490
+
2491
+ if (ret !== false || !['escape', 'html', 'link', 'image', 'strong', 'em', 'codespan', 'br', 'del', 'text'].includes(token.type)) {
2492
+ out += ret || '';
2493
+ continue;
2494
+ }
2495
+ }
2393
2496
 
2394
2497
  switch (token.type) {
2395
2498
  case 'escape':
@@ -2608,82 +2711,169 @@
2608
2711
  * Use Extension
2609
2712
  */
2610
2713
 
2611
- marked.use = function (extension) {
2612
- var opts = merge({}, extension);
2714
+ marked.use = function () {
2715
+ var _this = this;
2716
+
2717
+ for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
2718
+ args[_key] = arguments[_key];
2719
+ }
2720
+
2721
+ var opts = merge.apply(void 0, [{}].concat(args));
2722
+ var extensions = marked.defaults.extensions || {
2723
+ renderers: {},
2724
+ childTokens: {}
2725
+ };
2726
+ var hasExtensions;
2727
+ args.forEach(function (pack) {
2728
+ // ==-- Parse "addon" extensions --== //
2729
+ if (pack.extensions) {
2730
+ hasExtensions = true;
2731
+ pack.extensions.forEach(function (ext) {
2732
+ if (!ext.name) {
2733
+ throw new Error('extension name required');
2734
+ }
2735
+
2736
+ if (ext.renderer) {
2737
+ // Renderer extensions
2738
+ var prevRenderer = extensions.renderers ? extensions.renderers[ext.name] : null;
2613
2739
 
2614
- if (extension.renderer) {
2615
- (function () {
2616
- var renderer = marked.defaults.renderer || new Renderer();
2740
+ if (prevRenderer) {
2741
+ // Replace extension with func to run new extension but fall back if false
2742
+ extensions.renderers[ext.name] = function () {
2743
+ for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
2744
+ args[_key2] = arguments[_key2];
2745
+ }
2746
+
2747
+ var ret = ext.renderer.apply(this, args);
2748
+
2749
+ if (ret === false) {
2750
+ ret = prevRenderer.apply(this, args);
2751
+ }
2617
2752
 
2618
- var _loop = function _loop(prop) {
2619
- var prevRenderer = renderer[prop];
2753
+ return ret;
2754
+ };
2755
+ } else {
2756
+ extensions.renderers[ext.name] = ext.renderer;
2757
+ }
2758
+ }
2620
2759
 
2621
- renderer[prop] = function () {
2622
- for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
2623
- args[_key] = arguments[_key];
2760
+ if (ext.tokenizer) {
2761
+ // Tokenizer Extensions
2762
+ if (!ext.level || ext.level !== 'block' && ext.level !== 'inline') {
2763
+ throw new Error("extension level must be 'block' or 'inline'");
2624
2764
  }
2625
2765
 
2626
- var ret = extension.renderer[prop].apply(renderer, args);
2766
+ if (extensions[ext.level]) {
2767
+ extensions[ext.level].unshift(ext.tokenizer);
2768
+ } else {
2769
+ extensions[ext.level] = [ext.tokenizer];
2770
+ }
2627
2771
 
2628
- if (ret === false) {
2629
- ret = prevRenderer.apply(renderer, args);
2772
+ if (ext.start) {
2773
+ // Function to check for start of token
2774
+ if (ext.level === 'block') {
2775
+ if (extensions.startBlock) {
2776
+ extensions.startBlock.push(ext.start);
2777
+ } else {
2778
+ extensions.startBlock = [ext.start];
2779
+ }
2780
+ } else if (ext.level === 'inline') {
2781
+ if (extensions.startInline) {
2782
+ extensions.startInline.push(ext.start);
2783
+ } else {
2784
+ extensions.startInline = [ext.start];
2785
+ }
2786
+ }
2630
2787
  }
2788
+ }
2789
+
2790
+ if (ext.childTokens) {
2791
+ // Child tokens to be visited by walkTokens
2792
+ extensions.childTokens[ext.name] = ext.childTokens;
2793
+ }
2794
+ });
2795
+ } // ==-- Parse "overwrite" extensions --== //
2796
+
2797
+
2798
+ if (pack.renderer) {
2799
+ (function () {
2800
+ var renderer = marked.defaults.renderer || new Renderer();
2801
+
2802
+ var _loop = function _loop(prop) {
2803
+ var prevRenderer = renderer[prop]; // Replace renderer with func to run extension, but fall back if false
2804
+
2805
+ renderer[prop] = function () {
2806
+ for (var _len3 = arguments.length, args = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {
2807
+ args[_key3] = arguments[_key3];
2808
+ }
2631
2809
 
2632
- return ret;
2810
+ var ret = pack.renderer[prop].apply(renderer, args);
2811
+
2812
+ if (ret === false) {
2813
+ ret = prevRenderer.apply(renderer, args);
2814
+ }
2815
+
2816
+ return ret;
2817
+ };
2633
2818
  };
2634
- };
2635
2819
 
2636
- for (var prop in extension.renderer) {
2637
- _loop(prop);
2638
- }
2820
+ for (var prop in pack.renderer) {
2821
+ _loop(prop);
2822
+ }
2639
2823
 
2640
- opts.renderer = renderer;
2641
- })();
2642
- }
2824
+ opts.renderer = renderer;
2825
+ })();
2826
+ }
2643
2827
 
2644
- if (extension.tokenizer) {
2645
- (function () {
2646
- var tokenizer = marked.defaults.tokenizer || new Tokenizer();
2828
+ if (pack.tokenizer) {
2829
+ (function () {
2830
+ var tokenizer = marked.defaults.tokenizer || new Tokenizer();
2647
2831
 
2648
- var _loop2 = function _loop2(prop) {
2649
- var prevTokenizer = tokenizer[prop];
2832
+ var _loop2 = function _loop2(prop) {
2833
+ var prevTokenizer = tokenizer[prop]; // Replace tokenizer with func to run extension, but fall back if false
2650
2834
 
2651
- tokenizer[prop] = function () {
2652
- for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
2653
- args[_key2] = arguments[_key2];
2654
- }
2835
+ tokenizer[prop] = function () {
2836
+ for (var _len4 = arguments.length, args = new Array(_len4), _key4 = 0; _key4 < _len4; _key4++) {
2837
+ args[_key4] = arguments[_key4];
2838
+ }
2655
2839
 
2656
- var ret = extension.tokenizer[prop].apply(tokenizer, args);
2840
+ var ret = pack.tokenizer[prop].apply(tokenizer, args);
2657
2841
 
2658
- if (ret === false) {
2659
- ret = prevTokenizer.apply(tokenizer, args);
2660
- }
2842
+ if (ret === false) {
2843
+ ret = prevTokenizer.apply(tokenizer, args);
2844
+ }
2661
2845
 
2662
- return ret;
2846
+ return ret;
2847
+ };
2663
2848
  };
2664
- };
2665
2849
 
2666
- for (var prop in extension.tokenizer) {
2667
- _loop2(prop);
2668
- }
2850
+ for (var prop in pack.tokenizer) {
2851
+ _loop2(prop);
2852
+ }
2669
2853
 
2670
- opts.tokenizer = tokenizer;
2671
- })();
2672
- }
2854
+ opts.tokenizer = tokenizer;
2855
+ })();
2856
+ } // ==-- Parse WalkTokens extensions --== //
2673
2857
 
2674
- if (extension.walkTokens) {
2675
- var walkTokens = marked.defaults.walkTokens;
2676
2858
 
2677
- opts.walkTokens = function (token) {
2678
- extension.walkTokens(token);
2859
+ if (pack.walkTokens) {
2860
+ var walkTokens = marked.defaults.walkTokens;
2679
2861
 
2680
- if (walkTokens) {
2681
- walkTokens(token);
2682
- }
2683
- };
2684
- }
2862
+ opts.walkTokens = function (token) {
2863
+ pack.walkTokens.call(_this, token);
2864
+
2865
+ if (walkTokens) {
2866
+ walkTokens(token);
2867
+ }
2868
+ };
2869
+ }
2870
+
2871
+ if (hasExtensions) {
2872
+ opts.extensions = extensions;
2873
+ }
2685
2874
 
2686
- marked.setOptions(opts);
2875
+ marked.setOptions(opts);
2876
+ });
2687
2877
  };
2688
2878
  /**
2689
2879
  * Run callback for every token
@@ -2691,7 +2881,7 @@
2691
2881
 
2692
2882
 
2693
2883
  marked.walkTokens = function (tokens, callback) {
2694
- for (var _iterator = _createForOfIteratorHelperLoose(tokens), _step; !(_step = _iterator()).done;) {
2884
+ var _loop3 = function _loop3() {
2695
2885
  var token = _step.value;
2696
2886
  callback(token);
2697
2887
 
@@ -2723,11 +2913,20 @@
2723
2913
 
2724
2914
  default:
2725
2915
  {
2726
- if (token.tokens) {
2916
+ if (marked.defaults.extensions && marked.defaults.extensions.childTokens && marked.defaults.extensions.childTokens[token.type]) {
2917
+ // Walk any extensions
2918
+ marked.defaults.extensions.childTokens[token.type].forEach(function (childTokens) {
2919
+ marked.walkTokens(token[childTokens], callback);
2920
+ });
2921
+ } else if (token.tokens) {
2727
2922
  marked.walkTokens(token.tokens, callback);
2728
2923
  }
2729
2924
  }
2730
2925
  }
2926
+ };
2927
+
2928
+ for (var _iterator = _createForOfIteratorHelperLoose(tokens), _step; !(_step = _iterator()).done;) {
2929
+ _loop3();
2731
2930
  }
2732
2931
  };
2733
2932
  /**