• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1/**
2 * marked - a markdown parser
3 * Copyright (c) 2011-2021, Christopher Jeffrey. (MIT Licensed)
4 * https://github.com/markedjs/marked
5 */
6
7/**
8 * DO NOT EDIT THIS FILE
9 * The code in this file is generated from files in ./src/
10 */
11
12(function (global, factory) {
13  typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
14  typeof define === 'function' && define.amd ? define(factory) :
15  (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.marked = factory());
16}(this, (function () { 'use strict';
17
18  function _defineProperties(target, props) {
19    for (var i = 0; i < props.length; i++) {
20      var descriptor = props[i];
21      descriptor.enumerable = descriptor.enumerable || false;
22      descriptor.configurable = true;
23      if ("value" in descriptor) descriptor.writable = true;
24      Object.defineProperty(target, descriptor.key, descriptor);
25    }
26  }
27
28  function _createClass(Constructor, protoProps, staticProps) {
29    if (protoProps) _defineProperties(Constructor.prototype, protoProps);
30    if (staticProps) _defineProperties(Constructor, staticProps);
31    return Constructor;
32  }
33
34  function _unsupportedIterableToArray(o, minLen) {
35    if (!o) return;
36    if (typeof o === "string") return _arrayLikeToArray(o, minLen);
37    var n = Object.prototype.toString.call(o).slice(8, -1);
38    if (n === "Object" && o.constructor) n = o.constructor.name;
39    if (n === "Map" || n === "Set") return Array.from(o);
40    if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);
41  }
42
43  function _arrayLikeToArray(arr, len) {
44    if (len == null || len > arr.length) len = arr.length;
45
46    for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];
47
48    return arr2;
49  }
50
51  function _createForOfIteratorHelperLoose(o, allowArrayLike) {
52    var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"];
53    if (it) return (it = it.call(o)).next.bind(it);
54
55    if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") {
56      if (it) o = it;
57      var i = 0;
58      return function () {
59        if (i >= o.length) return {
60          done: true
61        };
62        return {
63          done: false,
64          value: o[i++]
65        };
66      };
67    }
68
69    throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
70  }
71
72  var defaults$5 = {exports: {}};
73
74  function getDefaults$1() {
75    return {
76      baseUrl: null,
77      breaks: false,
78      extensions: null,
79      gfm: true,
80      headerIds: true,
81      headerPrefix: '',
82      highlight: null,
83      langPrefix: 'language-',
84      mangle: true,
85      pedantic: false,
86      renderer: null,
87      sanitize: false,
88      sanitizer: null,
89      silent: false,
90      smartLists: false,
91      smartypants: false,
92      tokenizer: null,
93      walkTokens: null,
94      xhtml: false
95    };
96  }
97
98  function changeDefaults$1(newDefaults) {
99    defaults$5.exports.defaults = newDefaults;
100  }
101
102  defaults$5.exports = {
103    defaults: getDefaults$1(),
104    getDefaults: getDefaults$1,
105    changeDefaults: changeDefaults$1
106  };
107
108  /**
109   * Helpers
110   */
111  var escapeTest = /[&<>"']/;
112  var escapeReplace = /[&<>"']/g;
113  var escapeTestNoEncode = /[<>"']|&(?!#?\w+;)/;
114  var escapeReplaceNoEncode = /[<>"']|&(?!#?\w+;)/g;
115  var escapeReplacements = {
116    '&': '&amp;',
117    '<': '&lt;',
118    '>': '&gt;',
119    '"': '&quot;',
120    "'": '&#39;'
121  };
122
123  var getEscapeReplacement = function getEscapeReplacement(ch) {
124    return escapeReplacements[ch];
125  };
126
127  function escape$2(html, encode) {
128    if (encode) {
129      if (escapeTest.test(html)) {
130        return html.replace(escapeReplace, getEscapeReplacement);
131      }
132    } else {
133      if (escapeTestNoEncode.test(html)) {
134        return html.replace(escapeReplaceNoEncode, getEscapeReplacement);
135      }
136    }
137
138    return html;
139  }
140
141  var unescapeTest = /&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/ig;
142
143  function unescape$1(html) {
144    // explicitly match decimal, hex, and named HTML entities
145    return html.replace(unescapeTest, function (_, n) {
146      n = n.toLowerCase();
147      if (n === 'colon') return ':';
148
149      if (n.charAt(0) === '#') {
150        return n.charAt(1) === 'x' ? String.fromCharCode(parseInt(n.substring(2), 16)) : String.fromCharCode(+n.substring(1));
151      }
152
153      return '';
154    });
155  }
156
157  var caret = /(^|[^\[])\^/g;
158
159  function edit$1(regex, opt) {
160    regex = regex.source || regex;
161    opt = opt || '';
162    var obj = {
163      replace: function replace(name, val) {
164        val = val.source || val;
165        val = val.replace(caret, '$1');
166        regex = regex.replace(name, val);
167        return obj;
168      },
169      getRegex: function getRegex() {
170        return new RegExp(regex, opt);
171      }
172    };
173    return obj;
174  }
175
176  var nonWordAndColonTest = /[^\w:]/g;
177  var originIndependentUrl = /^$|^[a-z][a-z0-9+.-]*:|^[?#]/i;
178
179  function cleanUrl$1(sanitize, base, href) {
180    if (sanitize) {
181      var prot;
182
183      try {
184        prot = decodeURIComponent(unescape$1(href)).replace(nonWordAndColonTest, '').toLowerCase();
185      } catch (e) {
186        return null;
187      }
188
189      if (prot.indexOf('javascript:') === 0 || prot.indexOf('vbscript:') === 0 || prot.indexOf('data:') === 0) {
190        return null;
191      }
192    }
193
194    if (base && !originIndependentUrl.test(href)) {
195      href = resolveUrl(base, href);
196    }
197
198    try {
199      href = encodeURI(href).replace(/%25/g, '%');
200    } catch (e) {
201      return null;
202    }
203
204    return href;
205  }
206
207  var baseUrls = {};
208  var justDomain = /^[^:]+:\/*[^/]*$/;
209  var protocol = /^([^:]+:)[\s\S]*$/;
210  var domain = /^([^:]+:\/*[^/]*)[\s\S]*$/;
211
212  function resolveUrl(base, href) {
213    if (!baseUrls[' ' + base]) {
214      // we can ignore everything in base after the last slash of its path component,
215      // but we might need to add _that_
216      // https://tools.ietf.org/html/rfc3986#section-3
217      if (justDomain.test(base)) {
218        baseUrls[' ' + base] = base + '/';
219      } else {
220        baseUrls[' ' + base] = rtrim$1(base, '/', true);
221      }
222    }
223
224    base = baseUrls[' ' + base];
225    var relativeBase = base.indexOf(':') === -1;
226
227    if (href.substring(0, 2) === '//') {
228      if (relativeBase) {
229        return href;
230      }
231
232      return base.replace(protocol, '$1') + href;
233    } else if (href.charAt(0) === '/') {
234      if (relativeBase) {
235        return href;
236      }
237
238      return base.replace(domain, '$1') + href;
239    } else {
240      return base + href;
241    }
242  }
243
244  var noopTest$1 = {
245    exec: function noopTest() {}
246  };
247
248  function merge$2(obj) {
249    var i = 1,
250        target,
251        key;
252
253    for (; i < arguments.length; i++) {
254      target = arguments[i];
255
256      for (key in target) {
257        if (Object.prototype.hasOwnProperty.call(target, key)) {
258          obj[key] = target[key];
259        }
260      }
261    }
262
263    return obj;
264  }
265
266  function splitCells$1(tableRow, count) {
267    // ensure that every cell-delimiting pipe has a space
268    // before it to distinguish it from an escaped pipe
269    var row = tableRow.replace(/\|/g, function (match, offset, str) {
270      var escaped = false,
271          curr = offset;
272
273      while (--curr >= 0 && str[curr] === '\\') {
274        escaped = !escaped;
275      }
276
277      if (escaped) {
278        // odd number of slashes means | is escaped
279        // so we leave it alone
280        return '|';
281      } else {
282        // add space before unescaped |
283        return ' |';
284      }
285    }),
286        cells = row.split(/ \|/);
287    var i = 0; // First/last cell in a row cannot be empty if it has no leading/trailing pipe
288
289    if (!cells[0].trim()) {
290      cells.shift();
291    }
292
293    if (!cells[cells.length - 1].trim()) {
294      cells.pop();
295    }
296
297    if (cells.length > count) {
298      cells.splice(count);
299    } else {
300      while (cells.length < count) {
301        cells.push('');
302      }
303    }
304
305    for (; i < cells.length; i++) {
306      // leading or trailing whitespace is ignored per the gfm spec
307      cells[i] = cells[i].trim().replace(/\\\|/g, '|');
308    }
309
310    return cells;
311  } // Remove trailing 'c's. Equivalent to str.replace(/c*$/, '').
312  // /c*$/ is vulnerable to REDOS.
313  // invert: Remove suffix of non-c chars instead. Default falsey.
314
315
316  function rtrim$1(str, c, invert) {
317    var l = str.length;
318
319    if (l === 0) {
320      return '';
321    } // Length of suffix matching the invert condition.
322
323
324    var suffLen = 0; // Step left until we fail to match the invert condition.
325
326    while (suffLen < l) {
327      var currChar = str.charAt(l - suffLen - 1);
328
329      if (currChar === c && !invert) {
330        suffLen++;
331      } else if (currChar !== c && invert) {
332        suffLen++;
333      } else {
334        break;
335      }
336    }
337
338    return str.substr(0, l - suffLen);
339  }
340
341  function findClosingBracket$1(str, b) {
342    if (str.indexOf(b[1]) === -1) {
343      return -1;
344    }
345
346    var l = str.length;
347    var level = 0,
348        i = 0;
349
350    for (; i < l; i++) {
351      if (str[i] === '\\') {
352        i++;
353      } else if (str[i] === b[0]) {
354        level++;
355      } else if (str[i] === b[1]) {
356        level--;
357
358        if (level < 0) {
359          return i;
360        }
361      }
362    }
363
364    return -1;
365  }
366
367  function checkSanitizeDeprecation$1(opt) {
368    if (opt && opt.sanitize && !opt.silent) {
369      console.warn('marked(): sanitize and sanitizer parameters are deprecated since version 0.7.0, should not be used and will be removed in the future. Read more here: https://marked.js.org/#/USING_ADVANCED.md#options');
370    }
371  } // copied from https://stackoverflow.com/a/5450113/806777
372
373
374  function repeatString$1(pattern, count) {
375    if (count < 1) {
376      return '';
377    }
378
379    var result = '';
380
381    while (count > 1) {
382      if (count & 1) {
383        result += pattern;
384      }
385
386      count >>= 1;
387      pattern += pattern;
388    }
389
390    return result + pattern;
391  }
392
393  var helpers = {
394    escape: escape$2,
395    unescape: unescape$1,
396    edit: edit$1,
397    cleanUrl: cleanUrl$1,
398    resolveUrl: resolveUrl,
399    noopTest: noopTest$1,
400    merge: merge$2,
401    splitCells: splitCells$1,
402    rtrim: rtrim$1,
403    findClosingBracket: findClosingBracket$1,
404    checkSanitizeDeprecation: checkSanitizeDeprecation$1,
405    repeatString: repeatString$1
406  };
407
408  var defaults$4 = defaults$5.exports.defaults;
409  var rtrim = helpers.rtrim,
410      splitCells = helpers.splitCells,
411      _escape = helpers.escape,
412      findClosingBracket = helpers.findClosingBracket;
413
414  function outputLink(cap, link, raw, lexer) {
415    var href = link.href;
416    var title = link.title ? _escape(link.title) : null;
417    var text = cap[1].replace(/\\([\[\]])/g, '$1');
418
419    if (cap[0].charAt(0) !== '!') {
420      lexer.state.inLink = true;
421      var token = {
422        type: 'link',
423        raw: raw,
424        href: href,
425        title: title,
426        text: text,
427        tokens: lexer.inlineTokens(text, [])
428      };
429      lexer.state.inLink = false;
430      return token;
431    } else {
432      return {
433        type: 'image',
434        raw: raw,
435        href: href,
436        title: title,
437        text: _escape(text)
438      };
439    }
440  }
441
442  function indentCodeCompensation(raw, text) {
443    var matchIndentToCode = raw.match(/^(\s+)(?:```)/);
444
445    if (matchIndentToCode === null) {
446      return text;
447    }
448
449    var indentToCode = matchIndentToCode[1];
450    return text.split('\n').map(function (node) {
451      var matchIndentInNode = node.match(/^\s+/);
452
453      if (matchIndentInNode === null) {
454        return node;
455      }
456
457      var indentInNode = matchIndentInNode[0];
458
459      if (indentInNode.length >= indentToCode.length) {
460        return node.slice(indentToCode.length);
461      }
462
463      return node;
464    }).join('\n');
465  }
466  /**
467   * Tokenizer
468   */
469
470
471  var Tokenizer_1 = /*#__PURE__*/function () {
472    function Tokenizer(options) {
473      this.options = options || defaults$4;
474    }
475
476    var _proto = Tokenizer.prototype;
477
478    _proto.space = function space(src) {
479      var cap = this.rules.block.newline.exec(src);
480
481      if (cap) {
482        if (cap[0].length > 1) {
483          return {
484            type: 'space',
485            raw: cap[0]
486          };
487        }
488
489        return {
490          raw: '\n'
491        };
492      }
493    };
494
495    _proto.code = function code(src) {
496      var cap = this.rules.block.code.exec(src);
497
498      if (cap) {
499        var text = cap[0].replace(/^ {1,4}/gm, '');
500        return {
501          type: 'code',
502          raw: cap[0],
503          codeBlockStyle: 'indented',
504          text: !this.options.pedantic ? rtrim(text, '\n') : text
505        };
506      }
507    };
508
509    _proto.fences = function fences(src) {
510      var cap = this.rules.block.fences.exec(src);
511
512      if (cap) {
513        var raw = cap[0];
514        var text = indentCodeCompensation(raw, cap[3] || '');
515        return {
516          type: 'code',
517          raw: raw,
518          lang: cap[2] ? cap[2].trim() : cap[2],
519          text: text
520        };
521      }
522    };
523
524    _proto.heading = function heading(src) {
525      var cap = this.rules.block.heading.exec(src);
526
527      if (cap) {
528        var text = cap[2].trim(); // remove trailing #s
529
530        if (/#$/.test(text)) {
531          var trimmed = rtrim(text, '#');
532
533          if (this.options.pedantic) {
534            text = trimmed.trim();
535          } else if (!trimmed || / $/.test(trimmed)) {
536            // CommonMark requires space before trailing #s
537            text = trimmed.trim();
538          }
539        }
540
541        var token = {
542          type: 'heading',
543          raw: cap[0],
544          depth: cap[1].length,
545          text: text,
546          tokens: []
547        };
548        this.lexer.inline(token.text, token.tokens);
549        return token;
550      }
551    };
552
553    _proto.hr = function hr(src) {
554      var cap = this.rules.block.hr.exec(src);
555
556      if (cap) {
557        return {
558          type: 'hr',
559          raw: cap[0]
560        };
561      }
562    };
563
564    _proto.blockquote = function blockquote(src) {
565      var cap = this.rules.block.blockquote.exec(src);
566
567      if (cap) {
568        var text = cap[0].replace(/^ *> ?/gm, '');
569        return {
570          type: 'blockquote',
571          raw: cap[0],
572          tokens: this.lexer.blockTokens(text, []),
573          text: text
574        };
575      }
576    };
577
578    _proto.list = function list(src) {
579      var cap = this.rules.block.list.exec(src);
580
581      if (cap) {
582        var raw, istask, ischecked, indent, i, blankLine, endsWithBlankLine, line, lines, itemContents;
583        var bull = cap[1].trim();
584        var isordered = bull.length > 1;
585        var list = {
586          type: 'list',
587          raw: '',
588          ordered: isordered,
589          start: isordered ? +bull.slice(0, -1) : '',
590          loose: false,
591          items: []
592        };
593        bull = isordered ? "\\d{1,9}\\" + bull.slice(-1) : "\\" + bull;
594
595        if (this.options.pedantic) {
596          bull = isordered ? bull : '[*+-]';
597        } // Get next list item
598
599
600        var itemRegex = new RegExp("^( {0,3}" + bull + ")((?: [^\\n]*| *)(?:\\n[^\\n]*)*(?:\\n|$))"); // Get each top-level item
601
602        while (src) {
603          if (this.rules.block.hr.test(src)) {
604            // End list if we encounter an HR (possibly move into itemRegex?)
605            break;
606          }
607
608          if (!(cap = itemRegex.exec(src))) {
609            break;
610          }
611
612          lines = cap[2].split('\n');
613
614          if (this.options.pedantic) {
615            indent = 2;
616            itemContents = lines[0].trimLeft();
617          } else {
618            indent = cap[2].search(/[^ ]/); // Find first non-space char
619
620            indent = cap[1].length + (indent > 4 ? 1 : indent); // intented code blocks after 4 spaces; indent is always 1
621
622            itemContents = lines[0].slice(indent - cap[1].length);
623          }
624
625          blankLine = false;
626          raw = cap[0];
627
628          if (!lines[0] && /^ *$/.test(lines[1])) {
629            // items begin with at most one blank line
630            raw = cap[1] + lines.slice(0, 2).join('\n') + '\n';
631            list.loose = true;
632            lines = [];
633          }
634
635          var nextBulletRegex = new RegExp("^ {0," + Math.min(3, indent - 1) + "}(?:[*+-]|\\d{1,9}[.)])");
636
637          for (i = 1; i < lines.length; i++) {
638            line = lines[i];
639
640            if (this.options.pedantic) {
641              // Re-align to follow commonmark nesting rules
642              line = line.replace(/^ {1,4}(?=( {4})*[^ ])/g, '  ');
643            } // End list item if found start of new bullet
644
645
646            if (nextBulletRegex.test(line)) {
647              raw = cap[1] + lines.slice(0, i).join('\n') + '\n';
648              break;
649            } // Until we encounter a blank line, item contents do not need indentation
650
651
652            if (!blankLine) {
653              if (!line.trim()) {
654                // Check if current line is empty
655                blankLine = true;
656              } // Dedent if possible
657
658
659              if (line.search(/[^ ]/) >= indent) {
660                itemContents += '\n' + line.slice(indent);
661              } else {
662                itemContents += '\n' + line;
663              }
664
665              continue;
666            } // Dedent this line
667
668
669            if (line.search(/[^ ]/) >= indent || !line.trim()) {
670              itemContents += '\n' + line.slice(indent);
671              continue;
672            } else {
673              // Line was not properly indented; end of this item
674              raw = cap[1] + lines.slice(0, i).join('\n') + '\n';
675              break;
676            }
677          }
678
679          if (!list.loose) {
680            // If the previous item ended with a blank line, the list is loose
681            if (endsWithBlankLine) {
682              list.loose = true;
683            } else if (/\n *\n *$/.test(raw)) {
684              endsWithBlankLine = true;
685            }
686          } // Check for task list items
687
688
689          if (this.options.gfm) {
690            istask = /^\[[ xX]\] /.exec(itemContents);
691
692            if (istask) {
693              ischecked = istask[0] !== '[ ] ';
694              itemContents = itemContents.replace(/^\[[ xX]\] +/, '');
695            }
696          }
697
698          list.items.push({
699            type: 'list_item',
700            raw: raw,
701            task: !!istask,
702            checked: ischecked,
703            loose: false,
704            text: itemContents
705          });
706          list.raw += raw;
707          src = src.slice(raw.length);
708        } // Do not consume newlines at end of final item. Alternatively, make itemRegex *start* with any newlines to simplify/speed up endsWithBlankLine logic
709
710
711        list.items[list.items.length - 1].raw = raw.trimRight();
712        list.items[list.items.length - 1].text = itemContents.trimRight();
713        list.raw = list.raw.trimRight();
714        var l = list.items.length; // Item child tokens handled here at end because we needed to have the final item to trim it first
715
716        for (i = 0; i < l; i++) {
717          this.lexer.state.top = false;
718          list.items[i].tokens = this.lexer.blockTokens(list.items[i].text, []);
719
720          if (list.items[i].tokens.some(function (t) {
721            return t.type === 'space';
722          })) {
723            list.loose = true;
724            list.items[i].loose = true;
725          }
726        }
727
728        return list;
729      }
730    };
731
732    _proto.html = function html(src) {
733      var cap = this.rules.block.html.exec(src);
734
735      if (cap) {
736        var token = {
737          type: 'html',
738          raw: cap[0],
739          pre: !this.options.sanitizer && (cap[1] === 'pre' || cap[1] === 'script' || cap[1] === 'style'),
740          text: cap[0]
741        };
742
743        if (this.options.sanitize) {
744          token.type = 'paragraph';
745          token.text = this.options.sanitizer ? this.options.sanitizer(cap[0]) : _escape(cap[0]);
746          token.tokens = [];
747          this.lexer.inline(token.text, token.tokens);
748        }
749
750        return token;
751      }
752    };
753
754    _proto.def = function def(src) {
755      var cap = this.rules.block.def.exec(src);
756
757      if (cap) {
758        if (cap[3]) cap[3] = cap[3].substring(1, cap[3].length - 1);
759        var tag = cap[1].toLowerCase().replace(/\s+/g, ' ');
760        return {
761          type: 'def',
762          tag: tag,
763          raw: cap[0],
764          href: cap[2],
765          title: cap[3]
766        };
767      }
768    };
769
770    _proto.table = function table(src) {
771      var cap = this.rules.block.table.exec(src);
772
773      if (cap) {
774        var item = {
775          type: 'table',
776          header: splitCells(cap[1]).map(function (c) {
777            return {
778              text: c
779            };
780          }),
781          align: cap[2].replace(/^ *|\| *$/g, '').split(/ *\| */),
782          rows: cap[3] ? cap[3].replace(/\n$/, '').split('\n') : []
783        };
784
785        if (item.header.length === item.align.length) {
786          item.raw = cap[0];
787          var l = item.align.length;
788          var i, j, k, row;
789
790          for (i = 0; i < l; i++) {
791            if (/^ *-+: *$/.test(item.align[i])) {
792              item.align[i] = 'right';
793            } else if (/^ *:-+: *$/.test(item.align[i])) {
794              item.align[i] = 'center';
795            } else if (/^ *:-+ *$/.test(item.align[i])) {
796              item.align[i] = 'left';
797            } else {
798              item.align[i] = null;
799            }
800          }
801
802          l = item.rows.length;
803
804          for (i = 0; i < l; i++) {
805            item.rows[i] = splitCells(item.rows[i], item.header.length).map(function (c) {
806              return {
807                text: c
808              };
809            });
810          } // parse child tokens inside headers and cells
811          // header child tokens
812
813
814          l = item.header.length;
815
816          for (j = 0; j < l; j++) {
817            item.header[j].tokens = [];
818            this.lexer.inlineTokens(item.header[j].text, item.header[j].tokens);
819          } // cell child tokens
820
821
822          l = item.rows.length;
823
824          for (j = 0; j < l; j++) {
825            row = item.rows[j];
826
827            for (k = 0; k < row.length; k++) {
828              row[k].tokens = [];
829              this.lexer.inlineTokens(row[k].text, row[k].tokens);
830            }
831          }
832
833          return item;
834        }
835      }
836    };
837
838    _proto.lheading = function lheading(src) {
839      var cap = this.rules.block.lheading.exec(src);
840
841      if (cap) {
842        var token = {
843          type: 'heading',
844          raw: cap[0],
845          depth: cap[2].charAt(0) === '=' ? 1 : 2,
846          text: cap[1],
847          tokens: []
848        };
849        this.lexer.inline(token.text, token.tokens);
850        return token;
851      }
852    };
853
854    _proto.paragraph = function paragraph(src) {
855      var cap = this.rules.block.paragraph.exec(src);
856
857      if (cap) {
858        var token = {
859          type: 'paragraph',
860          raw: cap[0],
861          text: cap[1].charAt(cap[1].length - 1) === '\n' ? cap[1].slice(0, -1) : cap[1],
862          tokens: []
863        };
864        this.lexer.inline(token.text, token.tokens);
865        return token;
866      }
867    };
868
869    _proto.text = function text(src) {
870      var cap = this.rules.block.text.exec(src);
871
872      if (cap) {
873        var token = {
874          type: 'text',
875          raw: cap[0],
876          text: cap[0],
877          tokens: []
878        };
879        this.lexer.inline(token.text, token.tokens);
880        return token;
881      }
882    };
883
884    _proto.escape = function escape(src) {
885      var cap = this.rules.inline.escape.exec(src);
886
887      if (cap) {
888        return {
889          type: 'escape',
890          raw: cap[0],
891          text: _escape(cap[1])
892        };
893      }
894    };
895
896    _proto.tag = function tag(src) {
897      var cap = this.rules.inline.tag.exec(src);
898
899      if (cap) {
900        if (!this.lexer.state.inLink && /^<a /i.test(cap[0])) {
901          this.lexer.state.inLink = true;
902        } else if (this.lexer.state.inLink && /^<\/a>/i.test(cap[0])) {
903          this.lexer.state.inLink = false;
904        }
905
906        if (!this.lexer.state.inRawBlock && /^<(pre|code|kbd|script)(\s|>)/i.test(cap[0])) {
907          this.lexer.state.inRawBlock = true;
908        } else if (this.lexer.state.inRawBlock && /^<\/(pre|code|kbd|script)(\s|>)/i.test(cap[0])) {
909          this.lexer.state.inRawBlock = false;
910        }
911
912        return {
913          type: this.options.sanitize ? 'text' : 'html',
914          raw: cap[0],
915          inLink: this.lexer.state.inLink,
916          inRawBlock: this.lexer.state.inRawBlock,
917          text: this.options.sanitize ? this.options.sanitizer ? this.options.sanitizer(cap[0]) : _escape(cap[0]) : cap[0]
918        };
919      }
920    };
921
922    _proto.link = function link(src) {
923      var cap = this.rules.inline.link.exec(src);
924
925      if (cap) {
926        var trimmedUrl = cap[2].trim();
927
928        if (!this.options.pedantic && /^</.test(trimmedUrl)) {
929          // commonmark requires matching angle brackets
930          if (!/>$/.test(trimmedUrl)) {
931            return;
932          } // ending angle bracket cannot be escaped
933
934
935          var rtrimSlash = rtrim(trimmedUrl.slice(0, -1), '\\');
936
937          if ((trimmedUrl.length - rtrimSlash.length) % 2 === 0) {
938            return;
939          }
940        } else {
941          // find closing parenthesis
942          var lastParenIndex = findClosingBracket(cap[2], '()');
943
944          if (lastParenIndex > -1) {
945            var start = cap[0].indexOf('!') === 0 ? 5 : 4;
946            var linkLen = start + cap[1].length + lastParenIndex;
947            cap[2] = cap[2].substring(0, lastParenIndex);
948            cap[0] = cap[0].substring(0, linkLen).trim();
949            cap[3] = '';
950          }
951        }
952
953        var href = cap[2];
954        var title = '';
955
956        if (this.options.pedantic) {
957          // split pedantic href and title
958          var link = /^([^'"]*[^\s])\s+(['"])(.*)\2/.exec(href);
959
960          if (link) {
961            href = link[1];
962            title = link[3];
963          }
964        } else {
965          title = cap[3] ? cap[3].slice(1, -1) : '';
966        }
967
968        href = href.trim();
969
970        if (/^</.test(href)) {
971          if (this.options.pedantic && !/>$/.test(trimmedUrl)) {
972            // pedantic allows starting angle bracket without ending angle bracket
973            href = href.slice(1);
974          } else {
975            href = href.slice(1, -1);
976          }
977        }
978
979        return outputLink(cap, {
980          href: href ? href.replace(this.rules.inline._escapes, '$1') : href,
981          title: title ? title.replace(this.rules.inline._escapes, '$1') : title
982        }, cap[0], this.lexer);
983      }
984    };
985
986    _proto.reflink = function reflink(src, links) {
987      var cap;
988
989      if ((cap = this.rules.inline.reflink.exec(src)) || (cap = this.rules.inline.nolink.exec(src))) {
990        var link = (cap[2] || cap[1]).replace(/\s+/g, ' ');
991        link = links[link.toLowerCase()];
992
993        if (!link || !link.href) {
994          var text = cap[0].charAt(0);
995          return {
996            type: 'text',
997            raw: text,
998            text: text
999          };
1000        }
1001
1002        return outputLink(cap, link, cap[0], this.lexer);
1003      }
1004    };
1005
1006    _proto.emStrong = function emStrong(src, maskedSrc, prevChar) {
1007      if (prevChar === void 0) {
1008        prevChar = '';
1009      }
1010
1011      var match = this.rules.inline.emStrong.lDelim.exec(src);
1012      if (!match) return; // _ can't be between two alphanumerics. \p{L}\p{N} includes non-english alphabet/numbers as well
1013
1014      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;
1015      var nextChar = match[1] || match[2] || '';
1016
1017      if (!nextChar || nextChar && (prevChar === '' || this.rules.inline.punctuation.exec(prevChar))) {
1018        var lLength = match[0].length - 1;
1019        var rDelim,
1020            rLength,
1021            delimTotal = lLength,
1022            midDelimTotal = 0;
1023        var endReg = match[0][0] === '*' ? this.rules.inline.emStrong.rDelimAst : this.rules.inline.emStrong.rDelimUnd;
1024        endReg.lastIndex = 0; // Clip maskedSrc to same section of string as src (move to lexer?)
1025
1026        maskedSrc = maskedSrc.slice(-1 * src.length + lLength);
1027
1028        while ((match = endReg.exec(maskedSrc)) != null) {
1029          rDelim = match[1] || match[2] || match[3] || match[4] || match[5] || match[6];
1030          if (!rDelim) continue; // skip single * in __abc*abc__
1031
1032          rLength = rDelim.length;
1033
1034          if (match[3] || match[4]) {
1035            // found another Left Delim
1036            delimTotal += rLength;
1037            continue;
1038          } else if (match[5] || match[6]) {
1039            // either Left or Right Delim
1040            if (lLength % 3 && !((lLength + rLength) % 3)) {
1041              midDelimTotal += rLength;
1042              continue; // CommonMark Emphasis Rules 9-10
1043            }
1044          }
1045
1046          delimTotal -= rLength;
1047          if (delimTotal > 0) continue; // Haven't found enough closing delimiters
1048          // Remove extra characters. *a*** -> *a*
1049
1050          rLength = Math.min(rLength, rLength + delimTotal + midDelimTotal); // Create `em` if smallest delimiter has odd char count. *a***
1051
1052          if (Math.min(lLength, rLength) % 2) {
1053            var _text = src.slice(1, lLength + match.index + rLength);
1054
1055            return {
1056              type: 'em',
1057              raw: src.slice(0, lLength + match.index + rLength + 1),
1058              text: _text,
1059              tokens: this.lexer.inlineTokens(_text, [])
1060            };
1061          } // Create 'strong' if smallest delimiter has even char count. **a***
1062
1063
1064          var text = src.slice(2, lLength + match.index + rLength - 1);
1065          return {
1066            type: 'strong',
1067            raw: src.slice(0, lLength + match.index + rLength + 1),
1068            text: text,
1069            tokens: this.lexer.inlineTokens(text, [])
1070          };
1071        }
1072      }
1073    };
1074
1075    _proto.codespan = function codespan(src) {
1076      var cap = this.rules.inline.code.exec(src);
1077
1078      if (cap) {
1079        var text = cap[2].replace(/\n/g, ' ');
1080        var hasNonSpaceChars = /[^ ]/.test(text);
1081        var hasSpaceCharsOnBothEnds = /^ /.test(text) && / $/.test(text);
1082
1083        if (hasNonSpaceChars && hasSpaceCharsOnBothEnds) {
1084          text = text.substring(1, text.length - 1);
1085        }
1086
1087        text = _escape(text, true);
1088        return {
1089          type: 'codespan',
1090          raw: cap[0],
1091          text: text
1092        };
1093      }
1094    };
1095
1096    _proto.br = function br(src) {
1097      var cap = this.rules.inline.br.exec(src);
1098
1099      if (cap) {
1100        return {
1101          type: 'br',
1102          raw: cap[0]
1103        };
1104      }
1105    };
1106
1107    _proto.del = function del(src) {
1108      var cap = this.rules.inline.del.exec(src);
1109
1110      if (cap) {
1111        return {
1112          type: 'del',
1113          raw: cap[0],
1114          text: cap[2],
1115          tokens: this.lexer.inlineTokens(cap[2], [])
1116        };
1117      }
1118    };
1119
1120    _proto.autolink = function autolink(src, mangle) {
1121      var cap = this.rules.inline.autolink.exec(src);
1122
1123      if (cap) {
1124        var text, href;
1125
1126        if (cap[2] === '@') {
1127          text = _escape(this.options.mangle ? mangle(cap[1]) : cap[1]);
1128          href = 'mailto:' + text;
1129        } else {
1130          text = _escape(cap[1]);
1131          href = text;
1132        }
1133
1134        return {
1135          type: 'link',
1136          raw: cap[0],
1137          text: text,
1138          href: href,
1139          tokens: [{
1140            type: 'text',
1141            raw: text,
1142            text: text
1143          }]
1144        };
1145      }
1146    };
1147
1148    _proto.url = function url(src, mangle) {
1149      var cap;
1150
1151      if (cap = this.rules.inline.url.exec(src)) {
1152        var text, href;
1153
1154        if (cap[2] === '@') {
1155          text = _escape(this.options.mangle ? mangle(cap[0]) : cap[0]);
1156          href = 'mailto:' + text;
1157        } else {
1158          // do extended autolink path validation
1159          var prevCapZero;
1160
1161          do {
1162            prevCapZero = cap[0];
1163            cap[0] = this.rules.inline._backpedal.exec(cap[0])[0];
1164          } while (prevCapZero !== cap[0]);
1165
1166          text = _escape(cap[0]);
1167
1168          if (cap[1] === 'www.') {
1169            href = 'http://' + text;
1170          } else {
1171            href = text;
1172          }
1173        }
1174
1175        return {
1176          type: 'link',
1177          raw: cap[0],
1178          text: text,
1179          href: href,
1180          tokens: [{
1181            type: 'text',
1182            raw: text,
1183            text: text
1184          }]
1185        };
1186      }
1187    };
1188
1189    _proto.inlineText = function inlineText(src, smartypants) {
1190      var cap = this.rules.inline.text.exec(src);
1191
1192      if (cap) {
1193        var text;
1194
1195        if (this.lexer.state.inRawBlock) {
1196          text = this.options.sanitize ? this.options.sanitizer ? this.options.sanitizer(cap[0]) : _escape(cap[0]) : cap[0];
1197        } else {
1198          text = _escape(this.options.smartypants ? smartypants(cap[0]) : cap[0]);
1199        }
1200
1201        return {
1202          type: 'text',
1203          raw: cap[0],
1204          text: text
1205        };
1206      }
1207    };
1208
1209    return Tokenizer;
1210  }();
1211
1212  var noopTest = helpers.noopTest,
1213      edit = helpers.edit,
1214      merge$1 = helpers.merge;
1215  /**
1216   * Block-Level Grammar
1217   */
1218
1219  var block$1 = {
1220    newline: /^(?: *(?:\n|$))+/,
1221    code: /^( {4}[^\n]+(?:\n(?: *(?:\n|$))*)?)+/,
1222    fences: /^ {0,3}(`{3,}(?=[^`\n]*\n)|~{3,})([^\n]*)\n(?:|([\s\S]*?)\n)(?: {0,3}\1[~`]* *(?=\n|$)|$)/,
1223    hr: /^ {0,3}((?:- *){3,}|(?:_ *){3,}|(?:\* *){3,})(?:\n+|$)/,
1224    heading: /^ {0,3}(#{1,6})(?=\s|$)(.*)(?:\n+|$)/,
1225    blockquote: /^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/,
1226    list: /^( {0,3}bull)( [^\n]+?)?(?:\n|$)/,
1227    html: '^ {0,3}(?:' // optional indentation
1228    + '<(script|pre|style|textarea)[\\s>][\\s\\S]*?(?:</\\1>[^\\n]*\\n+|$)' // (1)
1229    + '|comment[^\\n]*(\\n+|$)' // (2)
1230    + '|<\\?[\\s\\S]*?(?:\\?>\\n*|$)' // (3)
1231    + '|<![A-Z][\\s\\S]*?(?:>\\n*|$)' // (4)
1232    + '|<!\\[CDATA\\[[\\s\\S]*?(?:\\]\\]>\\n*|$)' // (5)
1233    + '|</?(tag)(?: +|\\n|/?>)[\\s\\S]*?(?:(?:\\n *)+\\n|$)' // (6)
1234    + '|<(?!script|pre|style|textarea)([a-z][\\w-]*)(?:attribute)*? */?>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n *)+\\n|$)' // (7) open tag
1235    + '|</(?!script|pre|style|textarea)[a-z][\\w-]*\\s*>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n *)+\\n|$)' // (7) closing tag
1236    + ')',
1237    def: /^ {0,3}\[(label)\]: *\n? *<?([^\s>]+)>?(?:(?: +\n? *| *\n *)(title))? *(?:\n+|$)/,
1238    table: noopTest,
1239    lheading: /^([^\n]+)\n {0,3}(=+|-+) *(?:\n+|$)/,
1240    // regex template, placeholders will be replaced according to different paragraph
1241    // interruption rules of commonmark and the original markdown spec:
1242    _paragraph: /^([^\n]+(?:\n(?!hr|heading|lheading|blockquote|fences|list|html| +\n)[^\n]+)*)/,
1243    text: /^[^\n]+/
1244  };
1245  block$1._label = /(?!\s*\])(?:\\[\[\]]|[^\[\]])+/;
1246  block$1._title = /(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/;
1247  block$1.def = edit(block$1.def).replace('label', block$1._label).replace('title', block$1._title).getRegex();
1248  block$1.bullet = /(?:[*+-]|\d{1,9}[.)])/;
1249  block$1.listItemStart = edit(/^( *)(bull) */).replace('bull', block$1.bullet).getRegex();
1250  block$1.list = edit(block$1.list).replace(/bull/g, block$1.bullet).replace('hr', '\\n+(?=\\1?(?:(?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$))').replace('def', '\\n+(?=' + block$1.def.source + ')').getRegex();
1251  block$1._tag = 'address|article|aside|base|basefont|blockquote|body|caption' + '|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption' + '|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe' + '|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option' + '|p|param|section|source|summary|table|tbody|td|tfoot|th|thead|title|tr' + '|track|ul';
1252  block$1._comment = /<!--(?!-?>)[\s\S]*?(?:-->|$)/;
1253  block$1.html = edit(block$1.html, 'i').replace('comment', block$1._comment).replace('tag', block$1._tag).replace('attribute', / +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/).getRegex();
1254  block$1.paragraph = edit(block$1._paragraph).replace('hr', block$1.hr).replace('heading', ' {0,3}#{1,6} ').replace('|lheading', '') // setex headings don't interrupt commonmark paragraphs
1255  .replace('blockquote', ' {0,3}>').replace('fences', ' {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n').replace('list', ' {0,3}(?:[*+-]|1[.)]) ') // only lists starting from 1 can interrupt
1256  .replace('html', '</?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|textarea|!--)').replace('tag', block$1._tag) // pars can be interrupted by type (6) html blocks
1257  .getRegex();
1258  block$1.blockquote = edit(block$1.blockquote).replace('paragraph', block$1.paragraph).getRegex();
1259  /**
1260   * Normal Block Grammar
1261   */
1262
1263  block$1.normal = merge$1({}, block$1);
1264  /**
1265   * GFM Block Grammar
1266   */
1267
1268  block$1.gfm = merge$1({}, block$1.normal, {
1269    table: '^ *([^\\n ].*\\|.*)\\n' // Header
1270    + ' {0,3}(?:\\| *)?(:?-+:? *(?:\\| *:?-+:? *)*)(?:\\| *)?' // Align
1271    + '(?:\\n((?:(?! *\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)' // Cells
1272
1273  });
1274  block$1.gfm.table = edit(block$1.gfm.table).replace('hr', block$1.hr).replace('heading', ' {0,3}#{1,6} ').replace('blockquote', ' {0,3}>').replace('code', ' {4}[^\\n]').replace('fences', ' {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n').replace('list', ' {0,3}(?:[*+-]|1[.)]) ') // only lists starting from 1 can interrupt
1275  .replace('html', '</?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|textarea|!--)').replace('tag', block$1._tag) // tables can be interrupted by type (6) html blocks
1276  .getRegex();
1277  /**
1278   * Pedantic grammar (original John Gruber's loose markdown specification)
1279   */
1280
1281  block$1.pedantic = merge$1({}, block$1.normal, {
1282    html: edit('^ *(?:comment *(?:\\n|\\s*$)' + '|<(tag)[\\s\\S]+?</\\1> *(?:\\n{2,}|\\s*$)' // closed tag
1283    + '|<tag(?:"[^"]*"|\'[^\']*\'|\\s[^\'"/>\\s]*)*?/?> *(?:\\n{2,}|\\s*$))').replace('comment', block$1._comment).replace(/tag/g, '(?!(?:' + 'a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub' + '|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)' + '\\b)\\w+(?!:|[^\\w\\s@]*@)\\b').getRegex(),
1284    def: /^ *\[([^\]]+)\]: *<?([^\s>]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/,
1285    heading: /^(#{1,6})(.*)(?:\n+|$)/,
1286    fences: noopTest,
1287    // fences not supported
1288    paragraph: edit(block$1.normal._paragraph).replace('hr', block$1.hr).replace('heading', ' *#{1,6} *[^\n]').replace('lheading', block$1.lheading).replace('blockquote', ' {0,3}>').replace('|fences', '').replace('|list', '').replace('|html', '').getRegex()
1289  });
1290  /**
1291   * Inline-Level Grammar
1292   */
1293
1294  var inline$1 = {
1295    escape: /^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/,
1296    autolink: /^<(scheme:[^\s\x00-\x1f<>]*|email)>/,
1297    url: noopTest,
1298    tag: '^comment' + '|^</[a-zA-Z][\\w:-]*\\s*>' // self-closing tag
1299    + '|^<[a-zA-Z][\\w-]*(?:attribute)*?\\s*/?>' // open tag
1300    + '|^<\\?[\\s\\S]*?\\?>' // processing instruction, e.g. <?php ?>
1301    + '|^<![a-zA-Z]+\\s[\\s\\S]*?>' // declaration, e.g. <!DOCTYPE html>
1302    + '|^<!\\[CDATA\\[[\\s\\S]*?\\]\\]>',
1303    // CDATA section
1304    link: /^!?\[(label)\]\(\s*(href)(?:\s+(title))?\s*\)/,
1305    reflink: /^!?\[(label)\]\[(?!\s*\])((?:\\[\[\]]?|[^\[\]\\])+)\]/,
1306    nolink: /^!?\[(?!\s*\])((?:\[[^\[\]]*\]|\\[\[\]]|[^\[\]])*)\](?:\[\])?/,
1307    reflinkSearch: 'reflink|nolink(?!\\()',
1308    emStrong: {
1309      lDelim: /^(?:\*+(?:([punct_])|[^\s*]))|^_+(?:([punct*])|([^\s_]))/,
1310      //        (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.
1311      //        () Skip other delimiter (1) #***                   (2) a***#, a***                   (3) #***a, ***a                 (4) ***#              (5) #***#                 (6) a***a
1312      rDelimAst: /\_\_[^_*]*?\*[^_*]*?\_\_|[punct_](\*+)(?=[\s]|$)|[^punct*_\s](\*+)(?=[punct_\s]|$)|[punct_\s](\*+)(?=[^punct*_\s])|[\s](\*+)(?=[punct_])|[punct_](\*+)(?=[punct_])|[^punct*_\s](\*+)(?=[^punct*_\s])/,
1313      rDelimUnd: /\*\*[^_*]*?\_[^_*]*?\*\*|[punct*](\_+)(?=[\s]|$)|[^punct*_\s](\_+)(?=[punct*\s]|$)|[punct*\s](\_+)(?=[^punct*_\s])|[\s](\_+)(?=[punct*])|[punct*](\_+)(?=[punct*])/ // ^- Not allowed for _
1314
1315    },
1316    code: /^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/,
1317    br: /^( {2,}|\\)\n(?!\s*$)/,
1318    del: noopTest,
1319    text: /^(`+|[^`])(?:(?= {2,}\n)|[\s\S]*?(?:(?=[\\<!\[`*_]|\b_|$)|[^ ](?= {2,}\n)))/,
1320    punctuation: /^([\spunctuation])/
1321  }; // list of punctuation marks from CommonMark spec
1322  // without * and _ to handle the different emphasis markers * and _
1323
1324  inline$1._punctuation = '!"#$%&\'()+\\-.,/:;<=>?@\\[\\]`^{|}~';
1325  inline$1.punctuation = edit(inline$1.punctuation).replace(/punctuation/g, inline$1._punctuation).getRegex(); // sequences em should skip over [title](link), `code`, <html>
1326
1327  inline$1.blockSkip = /\[[^\]]*?\]\([^\)]*?\)|`[^`]*?`|<[^>]*?>/g;
1328  inline$1.escapedEmSt = /\\\*|\\_/g;
1329  inline$1._comment = edit(block$1._comment).replace('(?:-->|$)', '-->').getRegex();
1330  inline$1.emStrong.lDelim = edit(inline$1.emStrong.lDelim).replace(/punct/g, inline$1._punctuation).getRegex();
1331  inline$1.emStrong.rDelimAst = edit(inline$1.emStrong.rDelimAst, 'g').replace(/punct/g, inline$1._punctuation).getRegex();
1332  inline$1.emStrong.rDelimUnd = edit(inline$1.emStrong.rDelimUnd, 'g').replace(/punct/g, inline$1._punctuation).getRegex();
1333  inline$1._escapes = /\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/g;
1334  inline$1._scheme = /[a-zA-Z][a-zA-Z0-9+.-]{1,31}/;
1335  inline$1._email = /[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/;
1336  inline$1.autolink = edit(inline$1.autolink).replace('scheme', inline$1._scheme).replace('email', inline$1._email).getRegex();
1337  inline$1._attribute = /\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/;
1338  inline$1.tag = edit(inline$1.tag).replace('comment', inline$1._comment).replace('attribute', inline$1._attribute).getRegex();
1339  inline$1._label = /(?:\[(?:\\.|[^\[\]\\])*\]|\\.|`[^`]*`|[^\[\]\\`])*?/;
1340  inline$1._href = /<(?:\\.|[^\n<>\\])+>|[^\s\x00-\x1f]*/;
1341  inline$1._title = /"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/;
1342  inline$1.link = edit(inline$1.link).replace('label', inline$1._label).replace('href', inline$1._href).replace('title', inline$1._title).getRegex();
1343  inline$1.reflink = edit(inline$1.reflink).replace('label', inline$1._label).getRegex();
1344  inline$1.reflinkSearch = edit(inline$1.reflinkSearch, 'g').replace('reflink', inline$1.reflink).replace('nolink', inline$1.nolink).getRegex();
1345  /**
1346   * Normal Inline Grammar
1347   */
1348
1349  inline$1.normal = merge$1({}, inline$1);
1350  /**
1351   * Pedantic Inline Grammar
1352   */
1353
1354  inline$1.pedantic = merge$1({}, inline$1.normal, {
1355    strong: {
1356      start: /^__|\*\*/,
1357      middle: /^__(?=\S)([\s\S]*?\S)__(?!_)|^\*\*(?=\S)([\s\S]*?\S)\*\*(?!\*)/,
1358      endAst: /\*\*(?!\*)/g,
1359      endUnd: /__(?!_)/g
1360    },
1361    em: {
1362      start: /^_|\*/,
1363      middle: /^()\*(?=\S)([\s\S]*?\S)\*(?!\*)|^_(?=\S)([\s\S]*?\S)_(?!_)/,
1364      endAst: /\*(?!\*)/g,
1365      endUnd: /_(?!_)/g
1366    },
1367    link: edit(/^!?\[(label)\]\((.*?)\)/).replace('label', inline$1._label).getRegex(),
1368    reflink: edit(/^!?\[(label)\]\s*\[([^\]]*)\]/).replace('label', inline$1._label).getRegex()
1369  });
1370  /**
1371   * GFM Inline Grammar
1372   */
1373
1374  inline$1.gfm = merge$1({}, inline$1.normal, {
1375    escape: edit(inline$1.escape).replace('])', '~|])').getRegex(),
1376    _extended_email: /[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/,
1377    url: /^((?:ftp|https?):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/,
1378    _backpedal: /(?:[^?!.,:;*_~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_~)]+(?!$))+/,
1379    del: /^(~~?)(?=[^\s~])([\s\S]*?[^\s~])\1(?=[^~]|$)/,
1380    text: /^([`~]+|[^`~])(?:(?= {2,}\n)|(?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)|[\s\S]*?(?:(?=[\\<!\[`*~_]|\b_|https?:\/\/|ftp:\/\/|www\.|$)|[^ ](?= {2,}\n)|[^a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-](?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)))/
1381  });
1382  inline$1.gfm.url = edit(inline$1.gfm.url, 'i').replace('email', inline$1.gfm._extended_email).getRegex();
1383  /**
1384   * GFM + Line Breaks Inline Grammar
1385   */
1386
1387  inline$1.breaks = merge$1({}, inline$1.gfm, {
1388    br: edit(inline$1.br).replace('{2,}', '*').getRegex(),
1389    text: edit(inline$1.gfm.text).replace('\\b_', '\\b_| {2,}\\n').replace(/\{2,\}/g, '*').getRegex()
1390  });
1391  var rules = {
1392    block: block$1,
1393    inline: inline$1
1394  };
1395
1396  var Tokenizer$1 = Tokenizer_1;
1397  var defaults$3 = defaults$5.exports.defaults;
1398  var block = rules.block,
1399      inline = rules.inline;
1400  var repeatString = helpers.repeatString;
1401  /**
1402   * smartypants text replacement
1403   */
1404
1405  function smartypants(text) {
1406    return text // em-dashes
1407    .replace(/---/g, "\u2014") // en-dashes
1408    .replace(/--/g, "\u2013") // opening singles
1409    .replace(/(^|[-\u2014/(\[{"\s])'/g, "$1\u2018") // closing singles & apostrophes
1410    .replace(/'/g, "\u2019") // opening doubles
1411    .replace(/(^|[-\u2014/(\[{\u2018\s])"/g, "$1\u201C") // closing doubles
1412    .replace(/"/g, "\u201D") // ellipses
1413    .replace(/\.{3}/g, "\u2026");
1414  }
1415  /**
1416   * mangle email addresses
1417   */
1418
1419
1420  function mangle(text) {
1421    var out = '',
1422        i,
1423        ch;
1424    var l = text.length;
1425
1426    for (i = 0; i < l; i++) {
1427      ch = text.charCodeAt(i);
1428
1429      if (Math.random() > 0.5) {
1430        ch = 'x' + ch.toString(16);
1431      }
1432
1433      out += '&#' + ch + ';';
1434    }
1435
1436    return out;
1437  }
1438  /**
1439   * Block Lexer
1440   */
1441
1442
1443  var Lexer_1 = /*#__PURE__*/function () {
1444    function Lexer(options) {
1445      this.tokens = [];
1446      this.tokens.links = Object.create(null);
1447      this.options = options || defaults$3;
1448      this.options.tokenizer = this.options.tokenizer || new Tokenizer$1();
1449      this.tokenizer = this.options.tokenizer;
1450      this.tokenizer.options = this.options;
1451      this.tokenizer.lexer = this;
1452      this.inlineQueue = [];
1453      this.state = {
1454        inLink: false,
1455        inRawBlock: false,
1456        top: true
1457      };
1458      var rules = {
1459        block: block.normal,
1460        inline: inline.normal
1461      };
1462
1463      if (this.options.pedantic) {
1464        rules.block = block.pedantic;
1465        rules.inline = inline.pedantic;
1466      } else if (this.options.gfm) {
1467        rules.block = block.gfm;
1468
1469        if (this.options.breaks) {
1470          rules.inline = inline.breaks;
1471        } else {
1472          rules.inline = inline.gfm;
1473        }
1474      }
1475
1476      this.tokenizer.rules = rules;
1477    }
1478    /**
1479     * Expose Rules
1480     */
1481
1482
1483    /**
1484     * Static Lex Method
1485     */
1486    Lexer.lex = function lex(src, options) {
1487      var lexer = new Lexer(options);
1488      return lexer.lex(src);
1489    }
1490    /**
1491     * Static Lex Inline Method
1492     */
1493    ;
1494
1495    Lexer.lexInline = function lexInline(src, options) {
1496      var lexer = new Lexer(options);
1497      return lexer.inlineTokens(src);
1498    }
1499    /**
1500     * Preprocessing
1501     */
1502    ;
1503
1504    var _proto = Lexer.prototype;
1505
1506    _proto.lex = function lex(src) {
1507      src = src.replace(/\r\n|\r/g, '\n').replace(/\t/g, '    ');
1508      this.blockTokens(src, this.tokens);
1509      var next;
1510
1511      while (next = this.inlineQueue.shift()) {
1512        this.inlineTokens(next.src, next.tokens);
1513      }
1514
1515      return this.tokens;
1516    }
1517    /**
1518     * Lexing
1519     */
1520    ;
1521
1522    _proto.blockTokens = function blockTokens(src, tokens) {
1523      var _this = this;
1524
1525      if (tokens === void 0) {
1526        tokens = [];
1527      }
1528
1529      if (this.options.pedantic) {
1530        src = src.replace(/^ +$/gm, '');
1531      }
1532
1533      var token, lastToken, cutSrc, lastParagraphClipped;
1534
1535      while (src) {
1536        if (this.options.extensions && this.options.extensions.block && this.options.extensions.block.some(function (extTokenizer) {
1537          if (token = extTokenizer.call({
1538            lexer: _this
1539          }, src, tokens)) {
1540            src = src.substring(token.raw.length);
1541            tokens.push(token);
1542            return true;
1543          }
1544
1545          return false;
1546        })) {
1547          continue;
1548        } // newline
1549
1550
1551        if (token = this.tokenizer.space(src)) {
1552          src = src.substring(token.raw.length);
1553
1554          if (token.type) {
1555            tokens.push(token);
1556          }
1557
1558          continue;
1559        } // code
1560
1561
1562        if (token = this.tokenizer.code(src)) {
1563          src = src.substring(token.raw.length);
1564          lastToken = tokens[tokens.length - 1]; // An indented code block cannot interrupt a paragraph.
1565
1566          if (lastToken && (lastToken.type === 'paragraph' || lastToken.type === 'text')) {
1567            lastToken.raw += '\n' + token.raw;
1568            lastToken.text += '\n' + token.text;
1569            this.inlineQueue[this.inlineQueue.length - 1].src = lastToken.text;
1570          } else {
1571            tokens.push(token);
1572          }
1573
1574          continue;
1575        } // fences
1576
1577
1578        if (token = this.tokenizer.fences(src)) {
1579          src = src.substring(token.raw.length);
1580          tokens.push(token);
1581          continue;
1582        } // heading
1583
1584
1585        if (token = this.tokenizer.heading(src)) {
1586          src = src.substring(token.raw.length);
1587          tokens.push(token);
1588          continue;
1589        } // hr
1590
1591
1592        if (token = this.tokenizer.hr(src)) {
1593          src = src.substring(token.raw.length);
1594          tokens.push(token);
1595          continue;
1596        } // blockquote
1597
1598
1599        if (token = this.tokenizer.blockquote(src)) {
1600          src = src.substring(token.raw.length);
1601          tokens.push(token);
1602          continue;
1603        } // list
1604
1605
1606        if (token = this.tokenizer.list(src)) {
1607          src = src.substring(token.raw.length);
1608          tokens.push(token);
1609          continue;
1610        } // html
1611
1612
1613        if (token = this.tokenizer.html(src)) {
1614          src = src.substring(token.raw.length);
1615          tokens.push(token);
1616          continue;
1617        } // def
1618
1619
1620        if (token = this.tokenizer.def(src)) {
1621          src = src.substring(token.raw.length);
1622          lastToken = tokens[tokens.length - 1];
1623
1624          if (lastToken && (lastToken.type === 'paragraph' || lastToken.type === 'text')) {
1625            lastToken.raw += '\n' + token.raw;
1626            lastToken.text += '\n' + token.raw;
1627            this.inlineQueue[this.inlineQueue.length - 1].src = lastToken.text;
1628          } else if (!this.tokens.links[token.tag]) {
1629            this.tokens.links[token.tag] = {
1630              href: token.href,
1631              title: token.title
1632            };
1633          }
1634
1635          continue;
1636        } // table (gfm)
1637
1638
1639        if (token = this.tokenizer.table(src)) {
1640          src = src.substring(token.raw.length);
1641          tokens.push(token);
1642          continue;
1643        } // lheading
1644
1645
1646        if (token = this.tokenizer.lheading(src)) {
1647          src = src.substring(token.raw.length);
1648          tokens.push(token);
1649          continue;
1650        } // top-level paragraph
1651        // prevent paragraph consuming extensions by clipping 'src' to extension start
1652
1653
1654        cutSrc = src;
1655
1656        if (this.options.extensions && this.options.extensions.startBlock) {
1657          (function () {
1658            var startIndex = Infinity;
1659            var tempSrc = src.slice(1);
1660            var tempStart = void 0;
1661
1662            _this.options.extensions.startBlock.forEach(function (getStartIndex) {
1663              tempStart = getStartIndex.call({
1664                lexer: this
1665              }, tempSrc);
1666
1667              if (typeof tempStart === 'number' && tempStart >= 0) {
1668                startIndex = Math.min(startIndex, tempStart);
1669              }
1670            });
1671
1672            if (startIndex < Infinity && startIndex >= 0) {
1673              cutSrc = src.substring(0, startIndex + 1);
1674            }
1675          })();
1676        }
1677
1678        if (this.state.top && (token = this.tokenizer.paragraph(cutSrc))) {
1679          lastToken = tokens[tokens.length - 1];
1680
1681          if (lastParagraphClipped && lastToken.type === 'paragraph') {
1682            lastToken.raw += '\n' + token.raw;
1683            lastToken.text += '\n' + token.text;
1684            this.inlineQueue.pop();
1685            this.inlineQueue[this.inlineQueue.length - 1].src = lastToken.text;
1686          } else {
1687            tokens.push(token);
1688          }
1689
1690          lastParagraphClipped = cutSrc.length !== src.length;
1691          src = src.substring(token.raw.length);
1692          continue;
1693        } // text
1694
1695
1696        if (token = this.tokenizer.text(src)) {
1697          src = src.substring(token.raw.length);
1698          lastToken = tokens[tokens.length - 1];
1699
1700          if (lastToken && lastToken.type === 'text') {
1701            lastToken.raw += '\n' + token.raw;
1702            lastToken.text += '\n' + token.text;
1703            this.inlineQueue.pop();
1704            this.inlineQueue[this.inlineQueue.length - 1].src = lastToken.text;
1705          } else {
1706            tokens.push(token);
1707          }
1708
1709          continue;
1710        }
1711
1712        if (src) {
1713          var errMsg = 'Infinite loop on byte: ' + src.charCodeAt(0);
1714
1715          if (this.options.silent) {
1716            console.error(errMsg);
1717            break;
1718          } else {
1719            throw new Error(errMsg);
1720          }
1721        }
1722      }
1723
1724      this.state.top = true;
1725      return tokens;
1726    };
1727
1728    _proto.inline = function inline(src, tokens) {
1729      this.inlineQueue.push({
1730        src: src,
1731        tokens: tokens
1732      });
1733    }
1734    /**
1735     * Lexing/Compiling
1736     */
1737    ;
1738
1739    _proto.inlineTokens = function inlineTokens(src, tokens) {
1740      var _this2 = this;
1741
1742      if (tokens === void 0) {
1743        tokens = [];
1744      }
1745
1746      var token, lastToken, cutSrc; // String with links masked to avoid interference with em and strong
1747
1748      var maskedSrc = src;
1749      var match;
1750      var keepPrevChar, prevChar; // Mask out reflinks
1751
1752      if (this.tokens.links) {
1753        var links = Object.keys(this.tokens.links);
1754
1755        if (links.length > 0) {
1756          while ((match = this.tokenizer.rules.inline.reflinkSearch.exec(maskedSrc)) != null) {
1757            if (links.includes(match[0].slice(match[0].lastIndexOf('[') + 1, -1))) {
1758              maskedSrc = maskedSrc.slice(0, match.index) + '[' + repeatString('a', match[0].length - 2) + ']' + maskedSrc.slice(this.tokenizer.rules.inline.reflinkSearch.lastIndex);
1759            }
1760          }
1761        }
1762      } // Mask out other blocks
1763
1764
1765      while ((match = this.tokenizer.rules.inline.blockSkip.exec(maskedSrc)) != null) {
1766        maskedSrc = maskedSrc.slice(0, match.index) + '[' + repeatString('a', match[0].length - 2) + ']' + maskedSrc.slice(this.tokenizer.rules.inline.blockSkip.lastIndex);
1767      } // Mask out escaped em & strong delimiters
1768
1769
1770      while ((match = this.tokenizer.rules.inline.escapedEmSt.exec(maskedSrc)) != null) {
1771        maskedSrc = maskedSrc.slice(0, match.index) + '++' + maskedSrc.slice(this.tokenizer.rules.inline.escapedEmSt.lastIndex);
1772      }
1773
1774      while (src) {
1775        if (!keepPrevChar) {
1776          prevChar = '';
1777        }
1778
1779        keepPrevChar = false; // extensions
1780
1781        if (this.options.extensions && this.options.extensions.inline && this.options.extensions.inline.some(function (extTokenizer) {
1782          if (token = extTokenizer.call({
1783            lexer: _this2
1784          }, src, tokens)) {
1785            src = src.substring(token.raw.length);
1786            tokens.push(token);
1787            return true;
1788          }
1789
1790          return false;
1791        })) {
1792          continue;
1793        } // escape
1794
1795
1796        if (token = this.tokenizer.escape(src)) {
1797          src = src.substring(token.raw.length);
1798          tokens.push(token);
1799          continue;
1800        } // tag
1801
1802
1803        if (token = this.tokenizer.tag(src)) {
1804          src = src.substring(token.raw.length);
1805          lastToken = tokens[tokens.length - 1];
1806
1807          if (lastToken && token.type === 'text' && lastToken.type === 'text') {
1808            lastToken.raw += token.raw;
1809            lastToken.text += token.text;
1810          } else {
1811            tokens.push(token);
1812          }
1813
1814          continue;
1815        } // link
1816
1817
1818        if (token = this.tokenizer.link(src)) {
1819          src = src.substring(token.raw.length);
1820          tokens.push(token);
1821          continue;
1822        } // reflink, nolink
1823
1824
1825        if (token = this.tokenizer.reflink(src, this.tokens.links)) {
1826          src = src.substring(token.raw.length);
1827          lastToken = tokens[tokens.length - 1];
1828
1829          if (lastToken && token.type === 'text' && lastToken.type === 'text') {
1830            lastToken.raw += token.raw;
1831            lastToken.text += token.text;
1832          } else {
1833            tokens.push(token);
1834          }
1835
1836          continue;
1837        } // em & strong
1838
1839
1840        if (token = this.tokenizer.emStrong(src, maskedSrc, prevChar)) {
1841          src = src.substring(token.raw.length);
1842          tokens.push(token);
1843          continue;
1844        } // code
1845
1846
1847        if (token = this.tokenizer.codespan(src)) {
1848          src = src.substring(token.raw.length);
1849          tokens.push(token);
1850          continue;
1851        } // br
1852
1853
1854        if (token = this.tokenizer.br(src)) {
1855          src = src.substring(token.raw.length);
1856          tokens.push(token);
1857          continue;
1858        } // del (gfm)
1859
1860
1861        if (token = this.tokenizer.del(src)) {
1862          src = src.substring(token.raw.length);
1863          tokens.push(token);
1864          continue;
1865        } // autolink
1866
1867
1868        if (token = this.tokenizer.autolink(src, mangle)) {
1869          src = src.substring(token.raw.length);
1870          tokens.push(token);
1871          continue;
1872        } // url (gfm)
1873
1874
1875        if (!this.state.inLink && (token = this.tokenizer.url(src, mangle))) {
1876          src = src.substring(token.raw.length);
1877          tokens.push(token);
1878          continue;
1879        } // text
1880        // prevent inlineText consuming extensions by clipping 'src' to extension start
1881
1882
1883        cutSrc = src;
1884
1885        if (this.options.extensions && this.options.extensions.startInline) {
1886          (function () {
1887            var startIndex = Infinity;
1888            var tempSrc = src.slice(1);
1889            var tempStart = void 0;
1890
1891            _this2.options.extensions.startInline.forEach(function (getStartIndex) {
1892              tempStart = getStartIndex.call({
1893                lexer: this
1894              }, tempSrc);
1895
1896              if (typeof tempStart === 'number' && tempStart >= 0) {
1897                startIndex = Math.min(startIndex, tempStart);
1898              }
1899            });
1900
1901            if (startIndex < Infinity && startIndex >= 0) {
1902              cutSrc = src.substring(0, startIndex + 1);
1903            }
1904          })();
1905        }
1906
1907        if (token = this.tokenizer.inlineText(cutSrc, smartypants)) {
1908          src = src.substring(token.raw.length);
1909
1910          if (token.raw.slice(-1) !== '_') {
1911            // Track prevChar before string of ____ started
1912            prevChar = token.raw.slice(-1);
1913          }
1914
1915          keepPrevChar = true;
1916          lastToken = tokens[tokens.length - 1];
1917
1918          if (lastToken && lastToken.type === 'text') {
1919            lastToken.raw += token.raw;
1920            lastToken.text += token.text;
1921          } else {
1922            tokens.push(token);
1923          }
1924
1925          continue;
1926        }
1927
1928        if (src) {
1929          var errMsg = 'Infinite loop on byte: ' + src.charCodeAt(0);
1930
1931          if (this.options.silent) {
1932            console.error(errMsg);
1933            break;
1934          } else {
1935            throw new Error(errMsg);
1936          }
1937        }
1938      }
1939
1940      return tokens;
1941    };
1942
1943    _createClass(Lexer, null, [{
1944      key: "rules",
1945      get: function get() {
1946        return {
1947          block: block,
1948          inline: inline
1949        };
1950      }
1951    }]);
1952
1953    return Lexer;
1954  }();
1955
1956  var defaults$2 = defaults$5.exports.defaults;
1957  var cleanUrl = helpers.cleanUrl,
1958      escape$1 = helpers.escape;
1959  /**
1960   * Renderer
1961   */
1962
1963  var Renderer_1 = /*#__PURE__*/function () {
1964    function Renderer(options) {
1965      this.options = options || defaults$2;
1966    }
1967
1968    var _proto = Renderer.prototype;
1969
1970    _proto.code = function code(_code, infostring, escaped) {
1971      var lang = (infostring || '').match(/\S*/)[0];
1972
1973      if (this.options.highlight) {
1974        var out = this.options.highlight(_code, lang);
1975
1976        if (out != null && out !== _code) {
1977          escaped = true;
1978          _code = out;
1979        }
1980      }
1981
1982      _code = _code.replace(/\n$/, '') + '\n';
1983
1984      if (!lang) {
1985        return '<pre><code>' + (escaped ? _code : escape$1(_code, true)) + '</code></pre>\n';
1986      }
1987
1988      return '<pre><code class="' + this.options.langPrefix + escape$1(lang, true) + '">' + (escaped ? _code : escape$1(_code, true)) + '</code></pre>\n';
1989    };
1990
1991    _proto.blockquote = function blockquote(quote) {
1992      return '<blockquote>\n' + quote + '</blockquote>\n';
1993    };
1994
1995    _proto.html = function html(_html) {
1996      return _html;
1997    };
1998
1999    _proto.heading = function heading(text, level, raw, slugger) {
2000      if (this.options.headerIds) {
2001        return '<h' + level + ' id="' + this.options.headerPrefix + slugger.slug(raw) + '">' + text + '</h' + level + '>\n';
2002      } // ignore IDs
2003
2004
2005      return '<h' + level + '>' + text + '</h' + level + '>\n';
2006    };
2007
2008    _proto.hr = function hr() {
2009      return this.options.xhtml ? '<hr/>\n' : '<hr>\n';
2010    };
2011
2012    _proto.list = function list(body, ordered, start) {
2013      var type = ordered ? 'ol' : 'ul',
2014          startatt = ordered && start !== 1 ? ' start="' + start + '"' : '';
2015      return '<' + type + startatt + '>\n' + body + '</' + type + '>\n';
2016    };
2017
2018    _proto.listitem = function listitem(text) {
2019      return '<li>' + text + '</li>\n';
2020    };
2021
2022    _proto.checkbox = function checkbox(checked) {
2023      return '<input ' + (checked ? 'checked="" ' : '') + 'disabled="" type="checkbox"' + (this.options.xhtml ? ' /' : '') + '> ';
2024    };
2025
2026    _proto.paragraph = function paragraph(text) {
2027      return '<p>' + text + '</p>\n';
2028    };
2029
2030    _proto.table = function table(header, body) {
2031      if (body) body = '<tbody>' + body + '</tbody>';
2032      return '<table>\n' + '<thead>\n' + header + '</thead>\n' + body + '</table>\n';
2033    };
2034
2035    _proto.tablerow = function tablerow(content) {
2036      return '<tr>\n' + content + '</tr>\n';
2037    };
2038
2039    _proto.tablecell = function tablecell(content, flags) {
2040      var type = flags.header ? 'th' : 'td';
2041      var tag = flags.align ? '<' + type + ' align="' + flags.align + '">' : '<' + type + '>';
2042      return tag + content + '</' + type + '>\n';
2043    } // span level renderer
2044    ;
2045
2046    _proto.strong = function strong(text) {
2047      return '<strong>' + text + '</strong>';
2048    };
2049
2050    _proto.em = function em(text) {
2051      return '<em>' + text + '</em>';
2052    };
2053
2054    _proto.codespan = function codespan(text) {
2055      return '<code>' + text + '</code>';
2056    };
2057
2058    _proto.br = function br() {
2059      return this.options.xhtml ? '<br/>' : '<br>';
2060    };
2061
2062    _proto.del = function del(text) {
2063      return '<del>' + text + '</del>';
2064    };
2065
2066    _proto.link = function link(href, title, text) {
2067      href = cleanUrl(this.options.sanitize, this.options.baseUrl, href);
2068
2069      if (href === null) {
2070        return text;
2071      }
2072
2073      var out = '<a href="' + escape$1(href) + '"';
2074
2075      if (title) {
2076        out += ' title="' + title + '"';
2077      }
2078
2079      out += '>' + text + '</a>';
2080      return out;
2081    };
2082
2083    _proto.image = function image(href, title, text) {
2084      href = cleanUrl(this.options.sanitize, this.options.baseUrl, href);
2085
2086      if (href === null) {
2087        return text;
2088      }
2089
2090      var out = '<img src="' + href + '" alt="' + text + '"';
2091
2092      if (title) {
2093        out += ' title="' + title + '"';
2094      }
2095
2096      out += this.options.xhtml ? '/>' : '>';
2097      return out;
2098    };
2099
2100    _proto.text = function text(_text) {
2101      return _text;
2102    };
2103
2104    return Renderer;
2105  }();
2106
2107  /**
2108   * TextRenderer
2109   * returns only the textual part of the token
2110   */
2111
2112  var TextRenderer_1 = /*#__PURE__*/function () {
2113    function TextRenderer() {}
2114
2115    var _proto = TextRenderer.prototype;
2116
2117    // no need for block level renderers
2118    _proto.strong = function strong(text) {
2119      return text;
2120    };
2121
2122    _proto.em = function em(text) {
2123      return text;
2124    };
2125
2126    _proto.codespan = function codespan(text) {
2127      return text;
2128    };
2129
2130    _proto.del = function del(text) {
2131      return text;
2132    };
2133
2134    _proto.html = function html(text) {
2135      return text;
2136    };
2137
2138    _proto.text = function text(_text) {
2139      return _text;
2140    };
2141
2142    _proto.link = function link(href, title, text) {
2143      return '' + text;
2144    };
2145
2146    _proto.image = function image(href, title, text) {
2147      return '' + text;
2148    };
2149
2150    _proto.br = function br() {
2151      return '';
2152    };
2153
2154    return TextRenderer;
2155  }();
2156
2157  /**
2158   * Slugger generates header id
2159   */
2160
2161  var Slugger_1 = /*#__PURE__*/function () {
2162    function Slugger() {
2163      this.seen = {};
2164    }
2165
2166    var _proto = Slugger.prototype;
2167
2168    _proto.serialize = function serialize(value) {
2169      return value.toLowerCase().trim() // remove html tags
2170      .replace(/<[!\/a-z].*?>/ig, '') // remove unwanted chars
2171      .replace(/[\u2000-\u206F\u2E00-\u2E7F\\'!"#$%&()*+,./:;<=>?@[\]^`{|}~]/g, '').replace(/\s/g, '-');
2172    }
2173    /**
2174     * Finds the next safe (unique) slug to use
2175     */
2176    ;
2177
2178    _proto.getNextSafeSlug = function getNextSafeSlug(originalSlug, isDryRun) {
2179      var slug = originalSlug;
2180      var occurenceAccumulator = 0;
2181
2182      if (this.seen.hasOwnProperty(slug)) {
2183        occurenceAccumulator = this.seen[originalSlug];
2184
2185        do {
2186          occurenceAccumulator++;
2187          slug = originalSlug + '-' + occurenceAccumulator;
2188        } while (this.seen.hasOwnProperty(slug));
2189      }
2190
2191      if (!isDryRun) {
2192        this.seen[originalSlug] = occurenceAccumulator;
2193        this.seen[slug] = 0;
2194      }
2195
2196      return slug;
2197    }
2198    /**
2199     * Convert string to unique id
2200     * @param {object} options
2201     * @param {boolean} options.dryrun Generates the next unique slug without updating the internal accumulator.
2202     */
2203    ;
2204
2205    _proto.slug = function slug(value, options) {
2206      if (options === void 0) {
2207        options = {};
2208      }
2209
2210      var slug = this.serialize(value);
2211      return this.getNextSafeSlug(slug, options.dryrun);
2212    };
2213
2214    return Slugger;
2215  }();
2216
2217  var Renderer$1 = Renderer_1;
2218  var TextRenderer$1 = TextRenderer_1;
2219  var Slugger$1 = Slugger_1;
2220  var defaults$1 = defaults$5.exports.defaults;
2221  var unescape = helpers.unescape;
2222  /**
2223   * Parsing & Compiling
2224   */
2225
2226  var Parser_1 = /*#__PURE__*/function () {
2227    function Parser(options) {
2228      this.options = options || defaults$1;
2229      this.options.renderer = this.options.renderer || new Renderer$1();
2230      this.renderer = this.options.renderer;
2231      this.renderer.options = this.options;
2232      this.textRenderer = new TextRenderer$1();
2233      this.slugger = new Slugger$1();
2234    }
2235    /**
2236     * Static Parse Method
2237     */
2238
2239
2240    Parser.parse = function parse(tokens, options) {
2241      var parser = new Parser(options);
2242      return parser.parse(tokens);
2243    }
2244    /**
2245     * Static Parse Inline Method
2246     */
2247    ;
2248
2249    Parser.parseInline = function parseInline(tokens, options) {
2250      var parser = new Parser(options);
2251      return parser.parseInline(tokens);
2252    }
2253    /**
2254     * Parse Loop
2255     */
2256    ;
2257
2258    var _proto = Parser.prototype;
2259
2260    _proto.parse = function parse(tokens, top) {
2261      if (top === void 0) {
2262        top = true;
2263      }
2264
2265      var out = '',
2266          i,
2267          j,
2268          k,
2269          l2,
2270          l3,
2271          row,
2272          cell,
2273          header,
2274          body,
2275          token,
2276          ordered,
2277          start,
2278          loose,
2279          itemBody,
2280          item,
2281          checked,
2282          task,
2283          checkbox,
2284          ret;
2285      var l = tokens.length;
2286
2287      for (i = 0; i < l; i++) {
2288        token = tokens[i]; // Run any renderer extensions
2289
2290        if (this.options.extensions && this.options.extensions.renderers && this.options.extensions.renderers[token.type]) {
2291          ret = this.options.extensions.renderers[token.type].call({
2292            parser: this
2293          }, token);
2294
2295          if (ret !== false || !['space', 'hr', 'heading', 'code', 'table', 'blockquote', 'list', 'html', 'paragraph', 'text'].includes(token.type)) {
2296            out += ret || '';
2297            continue;
2298          }
2299        }
2300
2301        switch (token.type) {
2302          case 'space':
2303            {
2304              continue;
2305            }
2306
2307          case 'hr':
2308            {
2309              out += this.renderer.hr();
2310              continue;
2311            }
2312
2313          case 'heading':
2314            {
2315              out += this.renderer.heading(this.parseInline(token.tokens), token.depth, unescape(this.parseInline(token.tokens, this.textRenderer)), this.slugger);
2316              continue;
2317            }
2318
2319          case 'code':
2320            {
2321              out += this.renderer.code(token.text, token.lang, token.escaped);
2322              continue;
2323            }
2324
2325          case 'table':
2326            {
2327              header = ''; // header
2328
2329              cell = '';
2330              l2 = token.header.length;
2331
2332              for (j = 0; j < l2; j++) {
2333                cell += this.renderer.tablecell(this.parseInline(token.header[j].tokens), {
2334                  header: true,
2335                  align: token.align[j]
2336                });
2337              }
2338
2339              header += this.renderer.tablerow(cell);
2340              body = '';
2341              l2 = token.rows.length;
2342
2343              for (j = 0; j < l2; j++) {
2344                row = token.rows[j];
2345                cell = '';
2346                l3 = row.length;
2347
2348                for (k = 0; k < l3; k++) {
2349                  cell += this.renderer.tablecell(this.parseInline(row[k].tokens), {
2350                    header: false,
2351                    align: token.align[k]
2352                  });
2353                }
2354
2355                body += this.renderer.tablerow(cell);
2356              }
2357
2358              out += this.renderer.table(header, body);
2359              continue;
2360            }
2361
2362          case 'blockquote':
2363            {
2364              body = this.parse(token.tokens);
2365              out += this.renderer.blockquote(body);
2366              continue;
2367            }
2368
2369          case 'list':
2370            {
2371              ordered = token.ordered;
2372              start = token.start;
2373              loose = token.loose;
2374              l2 = token.items.length;
2375              body = '';
2376
2377              for (j = 0; j < l2; j++) {
2378                item = token.items[j];
2379                checked = item.checked;
2380                task = item.task;
2381                itemBody = '';
2382
2383                if (item.task) {
2384                  checkbox = this.renderer.checkbox(checked);
2385
2386                  if (loose) {
2387                    if (item.tokens.length > 0 && item.tokens[0].type === 'paragraph') {
2388                      item.tokens[0].text = checkbox + ' ' + item.tokens[0].text;
2389
2390                      if (item.tokens[0].tokens && item.tokens[0].tokens.length > 0 && item.tokens[0].tokens[0].type === 'text') {
2391                        item.tokens[0].tokens[0].text = checkbox + ' ' + item.tokens[0].tokens[0].text;
2392                      }
2393                    } else {
2394                      item.tokens.unshift({
2395                        type: 'text',
2396                        text: checkbox
2397                      });
2398                    }
2399                  } else {
2400                    itemBody += checkbox;
2401                  }
2402                }
2403
2404                itemBody += this.parse(item.tokens, loose);
2405                body += this.renderer.listitem(itemBody, task, checked);
2406              }
2407
2408              out += this.renderer.list(body, ordered, start);
2409              continue;
2410            }
2411
2412          case 'html':
2413            {
2414              // TODO parse inline content if parameter markdown=1
2415              out += this.renderer.html(token.text);
2416              continue;
2417            }
2418
2419          case 'paragraph':
2420            {
2421              out += this.renderer.paragraph(this.parseInline(token.tokens));
2422              continue;
2423            }
2424
2425          case 'text':
2426            {
2427              body = token.tokens ? this.parseInline(token.tokens) : token.text;
2428
2429              while (i + 1 < l && tokens[i + 1].type === 'text') {
2430                token = tokens[++i];
2431                body += '\n' + (token.tokens ? this.parseInline(token.tokens) : token.text);
2432              }
2433
2434              out += top ? this.renderer.paragraph(body) : body;
2435              continue;
2436            }
2437
2438          default:
2439            {
2440              var errMsg = 'Token with "' + token.type + '" type was not found.';
2441
2442              if (this.options.silent) {
2443                console.error(errMsg);
2444                return;
2445              } else {
2446                throw new Error(errMsg);
2447              }
2448            }
2449        }
2450      }
2451
2452      return out;
2453    }
2454    /**
2455     * Parse Inline Tokens
2456     */
2457    ;
2458
2459    _proto.parseInline = function parseInline(tokens, renderer) {
2460      renderer = renderer || this.renderer;
2461      var out = '',
2462          i,
2463          token,
2464          ret;
2465      var l = tokens.length;
2466
2467      for (i = 0; i < l; i++) {
2468        token = tokens[i]; // Run any renderer extensions
2469
2470        if (this.options.extensions && this.options.extensions.renderers && this.options.extensions.renderers[token.type]) {
2471          ret = this.options.extensions.renderers[token.type].call({
2472            parser: this
2473          }, token);
2474
2475          if (ret !== false || !['escape', 'html', 'link', 'image', 'strong', 'em', 'codespan', 'br', 'del', 'text'].includes(token.type)) {
2476            out += ret || '';
2477            continue;
2478          }
2479        }
2480
2481        switch (token.type) {
2482          case 'escape':
2483            {
2484              out += renderer.text(token.text);
2485              break;
2486            }
2487
2488          case 'html':
2489            {
2490              out += renderer.html(token.text);
2491              break;
2492            }
2493
2494          case 'link':
2495            {
2496              out += renderer.link(token.href, token.title, this.parseInline(token.tokens, renderer));
2497              break;
2498            }
2499
2500          case 'image':
2501            {
2502              out += renderer.image(token.href, token.title, token.text);
2503              break;
2504            }
2505
2506          case 'strong':
2507            {
2508              out += renderer.strong(this.parseInline(token.tokens, renderer));
2509              break;
2510            }
2511
2512          case 'em':
2513            {
2514              out += renderer.em(this.parseInline(token.tokens, renderer));
2515              break;
2516            }
2517
2518          case 'codespan':
2519            {
2520              out += renderer.codespan(token.text);
2521              break;
2522            }
2523
2524          case 'br':
2525            {
2526              out += renderer.br();
2527              break;
2528            }
2529
2530          case 'del':
2531            {
2532              out += renderer.del(this.parseInline(token.tokens, renderer));
2533              break;
2534            }
2535
2536          case 'text':
2537            {
2538              out += renderer.text(token.text);
2539              break;
2540            }
2541
2542          default:
2543            {
2544              var errMsg = 'Token with "' + token.type + '" type was not found.';
2545
2546              if (this.options.silent) {
2547                console.error(errMsg);
2548                return;
2549              } else {
2550                throw new Error(errMsg);
2551              }
2552            }
2553        }
2554      }
2555
2556      return out;
2557    };
2558
2559    return Parser;
2560  }();
2561
2562  var Lexer = Lexer_1;
2563  var Parser = Parser_1;
2564  var Tokenizer = Tokenizer_1;
2565  var Renderer = Renderer_1;
2566  var TextRenderer = TextRenderer_1;
2567  var Slugger = Slugger_1;
2568  var merge = helpers.merge,
2569      checkSanitizeDeprecation = helpers.checkSanitizeDeprecation,
2570      escape = helpers.escape;
2571  var getDefaults = defaults$5.exports.getDefaults,
2572      changeDefaults = defaults$5.exports.changeDefaults,
2573      defaults = defaults$5.exports.defaults;
2574  /**
2575   * Marked
2576   */
2577
2578  function marked(src, opt, callback) {
2579    // throw error in case of non string input
2580    if (typeof src === 'undefined' || src === null) {
2581      throw new Error('marked(): input parameter is undefined or null');
2582    }
2583
2584    if (typeof src !== 'string') {
2585      throw new Error('marked(): input parameter is of type ' + Object.prototype.toString.call(src) + ', string expected');
2586    }
2587
2588    if (typeof opt === 'function') {
2589      callback = opt;
2590      opt = null;
2591    }
2592
2593    opt = merge({}, marked.defaults, opt || {});
2594    checkSanitizeDeprecation(opt);
2595
2596    if (callback) {
2597      var highlight = opt.highlight;
2598      var tokens;
2599
2600      try {
2601        tokens = Lexer.lex(src, opt);
2602      } catch (e) {
2603        return callback(e);
2604      }
2605
2606      var done = function done(err) {
2607        var out;
2608
2609        if (!err) {
2610          try {
2611            if (opt.walkTokens) {
2612              marked.walkTokens(tokens, opt.walkTokens);
2613            }
2614
2615            out = Parser.parse(tokens, opt);
2616          } catch (e) {
2617            err = e;
2618          }
2619        }
2620
2621        opt.highlight = highlight;
2622        return err ? callback(err) : callback(null, out);
2623      };
2624
2625      if (!highlight || highlight.length < 3) {
2626        return done();
2627      }
2628
2629      delete opt.highlight;
2630      if (!tokens.length) return done();
2631      var pending = 0;
2632      marked.walkTokens(tokens, function (token) {
2633        if (token.type === 'code') {
2634          pending++;
2635          setTimeout(function () {
2636            highlight(token.text, token.lang, function (err, code) {
2637              if (err) {
2638                return done(err);
2639              }
2640
2641              if (code != null && code !== token.text) {
2642                token.text = code;
2643                token.escaped = true;
2644              }
2645
2646              pending--;
2647
2648              if (pending === 0) {
2649                done();
2650              }
2651            });
2652          }, 0);
2653        }
2654      });
2655
2656      if (pending === 0) {
2657        done();
2658      }
2659
2660      return;
2661    }
2662
2663    try {
2664      var _tokens = Lexer.lex(src, opt);
2665
2666      if (opt.walkTokens) {
2667        marked.walkTokens(_tokens, opt.walkTokens);
2668      }
2669
2670      return Parser.parse(_tokens, opt);
2671    } catch (e) {
2672      e.message += '\nPlease report this to https://github.com/markedjs/marked.';
2673
2674      if (opt.silent) {
2675        return '<p>An error occurred:</p><pre>' + escape(e.message + '', true) + '</pre>';
2676      }
2677
2678      throw e;
2679    }
2680  }
2681  /**
2682   * Options
2683   */
2684
2685
2686  marked.options = marked.setOptions = function (opt) {
2687    merge(marked.defaults, opt);
2688    changeDefaults(marked.defaults);
2689    return marked;
2690  };
2691
2692  marked.getDefaults = getDefaults;
2693  marked.defaults = defaults;
2694  /**
2695   * Use Extension
2696   */
2697
2698  marked.use = function () {
2699    var _this = this;
2700
2701    for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
2702      args[_key] = arguments[_key];
2703    }
2704
2705    var opts = merge.apply(void 0, [{}].concat(args));
2706    var extensions = marked.defaults.extensions || {
2707      renderers: {},
2708      childTokens: {}
2709    };
2710    var hasExtensions;
2711    args.forEach(function (pack) {
2712      // ==-- Parse "addon" extensions --== //
2713      if (pack.extensions) {
2714        hasExtensions = true;
2715        pack.extensions.forEach(function (ext) {
2716          if (!ext.name) {
2717            throw new Error('extension name required');
2718          }
2719
2720          if (ext.renderer) {
2721            // Renderer extensions
2722            var prevRenderer = extensions.renderers ? extensions.renderers[ext.name] : null;
2723
2724            if (prevRenderer) {
2725              // Replace extension with func to run new extension but fall back if false
2726              extensions.renderers[ext.name] = function () {
2727                for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
2728                  args[_key2] = arguments[_key2];
2729                }
2730
2731                var ret = ext.renderer.apply(this, args);
2732
2733                if (ret === false) {
2734                  ret = prevRenderer.apply(this, args);
2735                }
2736
2737                return ret;
2738              };
2739            } else {
2740              extensions.renderers[ext.name] = ext.renderer;
2741            }
2742          }
2743
2744          if (ext.tokenizer) {
2745            // Tokenizer Extensions
2746            if (!ext.level || ext.level !== 'block' && ext.level !== 'inline') {
2747              throw new Error("extension level must be 'block' or 'inline'");
2748            }
2749
2750            if (extensions[ext.level]) {
2751              extensions[ext.level].unshift(ext.tokenizer);
2752            } else {
2753              extensions[ext.level] = [ext.tokenizer];
2754            }
2755
2756            if (ext.start) {
2757              // Function to check for start of token
2758              if (ext.level === 'block') {
2759                if (extensions.startBlock) {
2760                  extensions.startBlock.push(ext.start);
2761                } else {
2762                  extensions.startBlock = [ext.start];
2763                }
2764              } else if (ext.level === 'inline') {
2765                if (extensions.startInline) {
2766                  extensions.startInline.push(ext.start);
2767                } else {
2768                  extensions.startInline = [ext.start];
2769                }
2770              }
2771            }
2772          }
2773
2774          if (ext.childTokens) {
2775            // Child tokens to be visited by walkTokens
2776            extensions.childTokens[ext.name] = ext.childTokens;
2777          }
2778        });
2779      } // ==-- Parse "overwrite" extensions --== //
2780
2781
2782      if (pack.renderer) {
2783        (function () {
2784          var renderer = marked.defaults.renderer || new Renderer();
2785
2786          var _loop = function _loop(prop) {
2787            var prevRenderer = renderer[prop]; // Replace renderer with func to run extension, but fall back if false
2788
2789            renderer[prop] = function () {
2790              for (var _len3 = arguments.length, args = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {
2791                args[_key3] = arguments[_key3];
2792              }
2793
2794              var ret = pack.renderer[prop].apply(renderer, args);
2795
2796              if (ret === false) {
2797                ret = prevRenderer.apply(renderer, args);
2798              }
2799
2800              return ret;
2801            };
2802          };
2803
2804          for (var prop in pack.renderer) {
2805            _loop(prop);
2806          }
2807
2808          opts.renderer = renderer;
2809        })();
2810      }
2811
2812      if (pack.tokenizer) {
2813        (function () {
2814          var tokenizer = marked.defaults.tokenizer || new Tokenizer();
2815
2816          var _loop2 = function _loop2(prop) {
2817            var prevTokenizer = tokenizer[prop]; // Replace tokenizer with func to run extension, but fall back if false
2818
2819            tokenizer[prop] = function () {
2820              for (var _len4 = arguments.length, args = new Array(_len4), _key4 = 0; _key4 < _len4; _key4++) {
2821                args[_key4] = arguments[_key4];
2822              }
2823
2824              var ret = pack.tokenizer[prop].apply(tokenizer, args);
2825
2826              if (ret === false) {
2827                ret = prevTokenizer.apply(tokenizer, args);
2828              }
2829
2830              return ret;
2831            };
2832          };
2833
2834          for (var prop in pack.tokenizer) {
2835            _loop2(prop);
2836          }
2837
2838          opts.tokenizer = tokenizer;
2839        })();
2840      } // ==-- Parse WalkTokens extensions --== //
2841
2842
2843      if (pack.walkTokens) {
2844        var walkTokens = marked.defaults.walkTokens;
2845
2846        opts.walkTokens = function (token) {
2847          pack.walkTokens.call(_this, token);
2848
2849          if (walkTokens) {
2850            walkTokens(token);
2851          }
2852        };
2853      }
2854
2855      if (hasExtensions) {
2856        opts.extensions = extensions;
2857      }
2858
2859      marked.setOptions(opts);
2860    });
2861  };
2862  /**
2863   * Run callback for every token
2864   */
2865
2866
2867  marked.walkTokens = function (tokens, callback) {
2868    var _loop3 = function _loop3() {
2869      var token = _step.value;
2870      callback(token);
2871
2872      switch (token.type) {
2873        case 'table':
2874          {
2875            for (var _iterator2 = _createForOfIteratorHelperLoose(token.header), _step2; !(_step2 = _iterator2()).done;) {
2876              var cell = _step2.value;
2877              marked.walkTokens(cell.tokens, callback);
2878            }
2879
2880            for (var _iterator3 = _createForOfIteratorHelperLoose(token.rows), _step3; !(_step3 = _iterator3()).done;) {
2881              var row = _step3.value;
2882
2883              for (var _iterator4 = _createForOfIteratorHelperLoose(row), _step4; !(_step4 = _iterator4()).done;) {
2884                var _cell = _step4.value;
2885                marked.walkTokens(_cell.tokens, callback);
2886              }
2887            }
2888
2889            break;
2890          }
2891
2892        case 'list':
2893          {
2894            marked.walkTokens(token.items, callback);
2895            break;
2896          }
2897
2898        default:
2899          {
2900            if (marked.defaults.extensions && marked.defaults.extensions.childTokens && marked.defaults.extensions.childTokens[token.type]) {
2901              // Walk any extensions
2902              marked.defaults.extensions.childTokens[token.type].forEach(function (childTokens) {
2903                marked.walkTokens(token[childTokens], callback);
2904              });
2905            } else if (token.tokens) {
2906              marked.walkTokens(token.tokens, callback);
2907            }
2908          }
2909      }
2910    };
2911
2912    for (var _iterator = _createForOfIteratorHelperLoose(tokens), _step; !(_step = _iterator()).done;) {
2913      _loop3();
2914    }
2915  };
2916  /**
2917   * Parse Inline
2918   */
2919
2920
2921  marked.parseInline = function (src, opt) {
2922    // throw error in case of non string input
2923    if (typeof src === 'undefined' || src === null) {
2924      throw new Error('marked.parseInline(): input parameter is undefined or null');
2925    }
2926
2927    if (typeof src !== 'string') {
2928      throw new Error('marked.parseInline(): input parameter is of type ' + Object.prototype.toString.call(src) + ', string expected');
2929    }
2930
2931    opt = merge({}, marked.defaults, opt || {});
2932    checkSanitizeDeprecation(opt);
2933
2934    try {
2935      var tokens = Lexer.lexInline(src, opt);
2936
2937      if (opt.walkTokens) {
2938        marked.walkTokens(tokens, opt.walkTokens);
2939      }
2940
2941      return Parser.parseInline(tokens, opt);
2942    } catch (e) {
2943      e.message += '\nPlease report this to https://github.com/markedjs/marked.';
2944
2945      if (opt.silent) {
2946        return '<p>An error occurred:</p><pre>' + escape(e.message + '', true) + '</pre>';
2947      }
2948
2949      throw e;
2950    }
2951  };
2952  /**
2953   * Expose
2954   */
2955
2956
2957  marked.Parser = Parser;
2958  marked.parser = Parser.parse;
2959  marked.Renderer = Renderer;
2960  marked.TextRenderer = TextRenderer;
2961  marked.Lexer = Lexer;
2962  marked.lexer = Lexer.lex;
2963  marked.Tokenizer = Tokenizer;
2964  marked.Slugger = Slugger;
2965  marked.parse = marked;
2966  var marked_1 = marked;
2967
2968  return marked_1;
2969
2970})));
2971