UNPKG

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