UNPKG

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