UNPKG

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