1/** 2 * marked - a markdown parser 3 * Copyright (c) 2011-2021, Christopher Jeffrey. (MIT Licensed) 4 * https://github.com/markedjs/marked 5 */ 6 7/** 8 * DO NOT EDIT THIS FILE 9 * The code in this file is generated from files in ./src/ 10 */ 11 12(function (global, factory) { 13 typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : 14 typeof define === 'function' && define.amd ? define(factory) : 15 (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.marked = factory()); 16}(this, (function () { 'use strict'; 17 18 function _defineProperties(target, props) { 19 for (var i = 0; i < props.length; i++) { 20 var descriptor = props[i]; 21 descriptor.enumerable = descriptor.enumerable || false; 22 descriptor.configurable = true; 23 if ("value" in descriptor) descriptor.writable = true; 24 Object.defineProperty(target, descriptor.key, descriptor); 25 } 26 } 27 28 function _createClass(Constructor, protoProps, staticProps) { 29 if (protoProps) _defineProperties(Constructor.prototype, protoProps); 30 if (staticProps) _defineProperties(Constructor, staticProps); 31 return Constructor; 32 } 33 34 function _unsupportedIterableToArray(o, minLen) { 35 if (!o) return; 36 if (typeof o === "string") return _arrayLikeToArray(o, minLen); 37 var n = Object.prototype.toString.call(o).slice(8, -1); 38 if (n === "Object" && o.constructor) n = o.constructor.name; 39 if (n === "Map" || n === "Set") return Array.from(o); 40 if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); 41 } 42 43 function _arrayLikeToArray(arr, len) { 44 if (len == null || len > arr.length) len = arr.length; 45 46 for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; 47 48 return arr2; 49 } 50 51 function _createForOfIteratorHelperLoose(o, allowArrayLike) { 52 var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; 53 if (it) return (it = it.call(o)).next.bind(it); 54 55 if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { 56 if (it) o = it; 57 var i = 0; 58 return function () { 59 if (i >= o.length) return { 60 done: true 61 }; 62 return { 63 done: false, 64 value: o[i++] 65 }; 66 }; 67 } 68 69 throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); 70 } 71 72 var defaults$5 = {exports: {}}; 73 74 function getDefaults$1() { 75 return { 76 baseUrl: null, 77 breaks: false, 78 extensions: null, 79 gfm: true, 80 headerIds: true, 81 headerPrefix: '', 82 highlight: null, 83 langPrefix: 'language-', 84 mangle: true, 85 pedantic: false, 86 renderer: null, 87 sanitize: false, 88 sanitizer: null, 89 silent: false, 90 smartLists: false, 91 smartypants: false, 92 tokenizer: null, 93 walkTokens: null, 94 xhtml: false 95 }; 96 } 97 98 function changeDefaults$1(newDefaults) { 99 defaults$5.exports.defaults = newDefaults; 100 } 101 102 defaults$5.exports = { 103 defaults: getDefaults$1(), 104 getDefaults: getDefaults$1, 105 changeDefaults: changeDefaults$1 106 }; 107 108 /** 109 * Helpers 110 */ 111 var escapeTest = /[&<>"']/; 112 var escapeReplace = /[&<>"']/g; 113 var escapeTestNoEncode = /[<>"']|&(?!#?\w+;)/; 114 var escapeReplaceNoEncode = /[<>"']|&(?!#?\w+;)/g; 115 var escapeReplacements = { 116 '&': '&', 117 '<': '<', 118 '>': '>', 119 '"': '"', 120 "'": ''' 121 }; 122 123 var getEscapeReplacement = function getEscapeReplacement(ch) { 124 return escapeReplacements[ch]; 125 }; 126 127 function escape$2(html, encode) { 128 if (encode) { 129 if (escapeTest.test(html)) { 130 return html.replace(escapeReplace, getEscapeReplacement); 131 } 132 } else { 133 if (escapeTestNoEncode.test(html)) { 134 return html.replace(escapeReplaceNoEncode, getEscapeReplacement); 135 } 136 } 137 138 return html; 139 } 140 141 var unescapeTest = /&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/ig; 142 143 function unescape$1(html) { 144 // explicitly match decimal, hex, and named HTML entities 145 return html.replace(unescapeTest, function (_, n) { 146 n = n.toLowerCase(); 147 if (n === 'colon') return ':'; 148 149 if (n.charAt(0) === '#') { 150 return n.charAt(1) === 'x' ? String.fromCharCode(parseInt(n.substring(2), 16)) : String.fromCharCode(+n.substring(1)); 151 } 152 153 return ''; 154 }); 155 } 156 157 var caret = /(^|[^\[])\^/g; 158 159 function edit$1(regex, opt) { 160 regex = regex.source || regex; 161 opt = opt || ''; 162 var obj = { 163 replace: function replace(name, val) { 164 val = val.source || val; 165 val = val.replace(caret, '$1'); 166 regex = regex.replace(name, val); 167 return obj; 168 }, 169 getRegex: function getRegex() { 170 return new RegExp(regex, opt); 171 } 172 }; 173 return obj; 174 } 175 176 var nonWordAndColonTest = /[^\w:]/g; 177 var originIndependentUrl = /^$|^[a-z][a-z0-9+.-]*:|^[?#]/i; 178 179 function cleanUrl$1(sanitize, base, href) { 180 if (sanitize) { 181 var prot; 182 183 try { 184 prot = decodeURIComponent(unescape$1(href)).replace(nonWordAndColonTest, '').toLowerCase(); 185 } catch (e) { 186 return null; 187 } 188 189 if (prot.indexOf('javascript:') === 0 || prot.indexOf('vbscript:') === 0 || prot.indexOf('data:') === 0) { 190 return null; 191 } 192 } 193 194 if (base && !originIndependentUrl.test(href)) { 195 href = resolveUrl(base, href); 196 } 197 198 try { 199 href = encodeURI(href).replace(/%25/g, '%'); 200 } catch (e) { 201 return null; 202 } 203 204 return href; 205 } 206 207 var baseUrls = {}; 208 var justDomain = /^[^:]+:\/*[^/]*$/; 209 var protocol = /^([^:]+:)[\s\S]*$/; 210 var domain = /^([^:]+:\/*[^/]*)[\s\S]*$/; 211 212 function resolveUrl(base, href) { 213 if (!baseUrls[' ' + base]) { 214 // we can ignore everything in base after the last slash of its path component, 215 // but we might need to add _that_ 216 // https://tools.ietf.org/html/rfc3986#section-3 217 if (justDomain.test(base)) { 218 baseUrls[' ' + base] = base + '/'; 219 } else { 220 baseUrls[' ' + base] = rtrim$1(base, '/', true); 221 } 222 } 223 224 base = baseUrls[' ' + base]; 225 var relativeBase = base.indexOf(':') === -1; 226 227 if (href.substring(0, 2) === '//') { 228 if (relativeBase) { 229 return href; 230 } 231 232 return base.replace(protocol, '$1') + href; 233 } else if (href.charAt(0) === '/') { 234 if (relativeBase) { 235 return href; 236 } 237 238 return base.replace(domain, '$1') + href; 239 } else { 240 return base + href; 241 } 242 } 243 244 var noopTest$1 = { 245 exec: function noopTest() {} 246 }; 247 248 function merge$2(obj) { 249 var i = 1, 250 target, 251 key; 252 253 for (; i < arguments.length; i++) { 254 target = arguments[i]; 255 256 for (key in target) { 257 if (Object.prototype.hasOwnProperty.call(target, key)) { 258 obj[key] = target[key]; 259 } 260 } 261 } 262 263 return obj; 264 } 265 266 function splitCells$1(tableRow, count) { 267 // ensure that every cell-delimiting pipe has a space 268 // before it to distinguish it from an escaped pipe 269 var row = tableRow.replace(/\|/g, function (match, offset, str) { 270 var escaped = false, 271 curr = offset; 272 273 while (--curr >= 0 && str[curr] === '\\') { 274 escaped = !escaped; 275 } 276 277 if (escaped) { 278 // odd number of slashes means | is escaped 279 // so we leave it alone 280 return '|'; 281 } else { 282 // add space before unescaped | 283 return ' |'; 284 } 285 }), 286 cells = row.split(/ \|/); 287 var i = 0; // First/last cell in a row cannot be empty if it has no leading/trailing pipe 288 289 if (!cells[0].trim()) { 290 cells.shift(); 291 } 292 293 if (!cells[cells.length - 1].trim()) { 294 cells.pop(); 295 } 296 297 if (cells.length > count) { 298 cells.splice(count); 299 } else { 300 while (cells.length < count) { 301 cells.push(''); 302 } 303 } 304 305 for (; i < cells.length; i++) { 306 // leading or trailing whitespace is ignored per the gfm spec 307 cells[i] = cells[i].trim().replace(/\\\|/g, '|'); 308 } 309 310 return cells; 311 } // Remove trailing 'c's. Equivalent to str.replace(/c*$/, ''). 312 // /c*$/ is vulnerable to REDOS. 313 // invert: Remove suffix of non-c chars instead. Default falsey. 314 315 316 function rtrim$1(str, c, invert) { 317 var l = str.length; 318 319 if (l === 0) { 320 return ''; 321 } // Length of suffix matching the invert condition. 322 323 324 var suffLen = 0; // Step left until we fail to match the invert condition. 325 326 while (suffLen < l) { 327 var currChar = str.charAt(l - suffLen - 1); 328 329 if (currChar === c && !invert) { 330 suffLen++; 331 } else if (currChar !== c && invert) { 332 suffLen++; 333 } else { 334 break; 335 } 336 } 337 338 return str.substr(0, l - suffLen); 339 } 340 341 function findClosingBracket$1(str, b) { 342 if (str.indexOf(b[1]) === -1) { 343 return -1; 344 } 345 346 var l = str.length; 347 var level = 0, 348 i = 0; 349 350 for (; i < l; i++) { 351 if (str[i] === '\\') { 352 i++; 353 } else if (str[i] === b[0]) { 354 level++; 355 } else if (str[i] === b[1]) { 356 level--; 357 358 if (level < 0) { 359 return i; 360 } 361 } 362 } 363 364 return -1; 365 } 366 367 function checkSanitizeDeprecation$1(opt) { 368 if (opt && opt.sanitize && !opt.silent) { 369 console.warn('marked(): sanitize and sanitizer parameters are deprecated since version 0.7.0, should not be used and will be removed in the future. Read more here: https://marked.js.org/#/USING_ADVANCED.md#options'); 370 } 371 } // copied from https://stackoverflow.com/a/5450113/806777 372 373 374 function repeatString$1(pattern, count) { 375 if (count < 1) { 376 return ''; 377 } 378 379 var result = ''; 380 381 while (count > 1) { 382 if (count & 1) { 383 result += pattern; 384 } 385 386 count >>= 1; 387 pattern += pattern; 388 } 389 390 return result + pattern; 391 } 392 393 var helpers = { 394 escape: escape$2, 395 unescape: unescape$1, 396 edit: edit$1, 397 cleanUrl: cleanUrl$1, 398 resolveUrl: resolveUrl, 399 noopTest: noopTest$1, 400 merge: merge$2, 401 splitCells: splitCells$1, 402 rtrim: rtrim$1, 403 findClosingBracket: findClosingBracket$1, 404 checkSanitizeDeprecation: checkSanitizeDeprecation$1, 405 repeatString: repeatString$1 406 }; 407 408 var defaults$4 = defaults$5.exports.defaults; 409 var rtrim = helpers.rtrim, 410 splitCells = helpers.splitCells, 411 _escape = helpers.escape, 412 findClosingBracket = helpers.findClosingBracket; 413 414 function outputLink(cap, link, raw, lexer) { 415 var href = link.href; 416 var title = link.title ? _escape(link.title) : null; 417 var text = cap[1].replace(/\\([\[\]])/g, '$1'); 418 419 if (cap[0].charAt(0) !== '!') { 420 lexer.state.inLink = true; 421 var token = { 422 type: 'link', 423 raw: raw, 424 href: href, 425 title: title, 426 text: text, 427 tokens: lexer.inlineTokens(text, []) 428 }; 429 lexer.state.inLink = false; 430 return token; 431 } else { 432 return { 433 type: 'image', 434 raw: raw, 435 href: href, 436 title: title, 437 text: _escape(text) 438 }; 439 } 440 } 441 442 function indentCodeCompensation(raw, text) { 443 var matchIndentToCode = raw.match(/^(\s+)(?:```)/); 444 445 if (matchIndentToCode === null) { 446 return text; 447 } 448 449 var indentToCode = matchIndentToCode[1]; 450 return text.split('\n').map(function (node) { 451 var matchIndentInNode = node.match(/^\s+/); 452 453 if (matchIndentInNode === null) { 454 return node; 455 } 456 457 var indentInNode = matchIndentInNode[0]; 458 459 if (indentInNode.length >= indentToCode.length) { 460 return node.slice(indentToCode.length); 461 } 462 463 return node; 464 }).join('\n'); 465 } 466 /** 467 * Tokenizer 468 */ 469 470 471 var Tokenizer_1 = /*#__PURE__*/function () { 472 function Tokenizer(options) { 473 this.options = options || defaults$4; 474 } 475 476 var _proto = Tokenizer.prototype; 477 478 _proto.space = function space(src) { 479 var cap = this.rules.block.newline.exec(src); 480 481 if (cap) { 482 if (cap[0].length > 1) { 483 return { 484 type: 'space', 485 raw: cap[0] 486 }; 487 } 488 489 return { 490 raw: '\n' 491 }; 492 } 493 }; 494 495 _proto.code = function code(src) { 496 var cap = this.rules.block.code.exec(src); 497 498 if (cap) { 499 var text = cap[0].replace(/^ {1,4}/gm, ''); 500 return { 501 type: 'code', 502 raw: cap[0], 503 codeBlockStyle: 'indented', 504 text: !this.options.pedantic ? rtrim(text, '\n') : text 505 }; 506 } 507 }; 508 509 _proto.fences = function fences(src) { 510 var cap = this.rules.block.fences.exec(src); 511 512 if (cap) { 513 var raw = cap[0]; 514 var text = indentCodeCompensation(raw, cap[3] || ''); 515 return { 516 type: 'code', 517 raw: raw, 518 lang: cap[2] ? cap[2].trim() : cap[2], 519 text: text 520 }; 521 } 522 }; 523 524 _proto.heading = function heading(src) { 525 var cap = this.rules.block.heading.exec(src); 526 527 if (cap) { 528 var text = cap[2].trim(); // remove trailing #s 529 530 if (/#$/.test(text)) { 531 var trimmed = rtrim(text, '#'); 532 533 if (this.options.pedantic) { 534 text = trimmed.trim(); 535 } else if (!trimmed || / $/.test(trimmed)) { 536 // CommonMark requires space before trailing #s 537 text = trimmed.trim(); 538 } 539 } 540 541 var token = { 542 type: 'heading', 543 raw: cap[0], 544 depth: cap[1].length, 545 text: text, 546 tokens: [] 547 }; 548 this.lexer.inline(token.text, token.tokens); 549 return token; 550 } 551 }; 552 553 _proto.hr = function hr(src) { 554 var cap = this.rules.block.hr.exec(src); 555 556 if (cap) { 557 return { 558 type: 'hr', 559 raw: cap[0] 560 }; 561 } 562 }; 563 564 _proto.blockquote = function blockquote(src) { 565 var cap = this.rules.block.blockquote.exec(src); 566 567 if (cap) { 568 var text = cap[0].replace(/^ *> ?/gm, ''); 569 return { 570 type: 'blockquote', 571 raw: cap[0], 572 tokens: this.lexer.blockTokens(text, []), 573 text: text 574 }; 575 } 576 }; 577 578 _proto.list = function list(src) { 579 var cap = this.rules.block.list.exec(src); 580 581 if (cap) { 582 var raw, istask, ischecked, indent, i, blankLine, endsWithBlankLine, line, lines, itemContents; 583 var bull = cap[1].trim(); 584 var isordered = bull.length > 1; 585 var list = { 586 type: 'list', 587 raw: '', 588 ordered: isordered, 589 start: isordered ? +bull.slice(0, -1) : '', 590 loose: false, 591 items: [] 592 }; 593 bull = isordered ? "\\d{1,9}\\" + bull.slice(-1) : "\\" + bull; 594 595 if (this.options.pedantic) { 596 bull = isordered ? bull : '[*+-]'; 597 } // Get next list item 598 599 600 var itemRegex = new RegExp("^( {0,3}" + bull + ")((?: [^\\n]*| *)(?:\\n[^\\n]*)*(?:\\n|$))"); // Get each top-level item 601 602 while (src) { 603 if (this.rules.block.hr.test(src)) { 604 // End list if we encounter an HR (possibly move into itemRegex?) 605 break; 606 } 607 608 if (!(cap = itemRegex.exec(src))) { 609 break; 610 } 611 612 lines = cap[2].split('\n'); 613 614 if (this.options.pedantic) { 615 indent = 2; 616 itemContents = lines[0].trimLeft(); 617 } else { 618 indent = cap[2].search(/[^ ]/); // Find first non-space char 619 620 indent = cap[1].length + (indent > 4 ? 1 : indent); // intented code blocks after 4 spaces; indent is always 1 621 622 itemContents = lines[0].slice(indent - cap[1].length); 623 } 624 625 blankLine = false; 626 raw = cap[0]; 627 628 if (!lines[0] && /^ *$/.test(lines[1])) { 629 // items begin with at most one blank line 630 raw = cap[1] + lines.slice(0, 2).join('\n') + '\n'; 631 list.loose = true; 632 lines = []; 633 } 634 635 var nextBulletRegex = new RegExp("^ {0," + Math.min(3, indent - 1) + "}(?:[*+-]|\\d{1,9}[.)])"); 636 637 for (i = 1; i < lines.length; i++) { 638 line = lines[i]; 639 640 if (this.options.pedantic) { 641 // Re-align to follow commonmark nesting rules 642 line = line.replace(/^ {1,4}(?=( {4})*[^ ])/g, ' '); 643 } // End list item if found start of new bullet 644 645 646 if (nextBulletRegex.test(line)) { 647 raw = cap[1] + lines.slice(0, i).join('\n') + '\n'; 648 break; 649 } // Until we encounter a blank line, item contents do not need indentation 650 651 652 if (!blankLine) { 653 if (!line.trim()) { 654 // Check if current line is empty 655 blankLine = true; 656 } // Dedent if possible 657 658 659 if (line.search(/[^ ]/) >= indent) { 660 itemContents += '\n' + line.slice(indent); 661 } else { 662 itemContents += '\n' + line; 663 } 664 665 continue; 666 } // Dedent this line 667 668 669 if (line.search(/[^ ]/) >= indent || !line.trim()) { 670 itemContents += '\n' + line.slice(indent); 671 continue; 672 } else { 673 // Line was not properly indented; end of this item 674 raw = cap[1] + lines.slice(0, i).join('\n') + '\n'; 675 break; 676 } 677 } 678 679 if (!list.loose) { 680 // If the previous item ended with a blank line, the list is loose 681 if (endsWithBlankLine) { 682 list.loose = true; 683 } else if (/\n *\n *$/.test(raw)) { 684 endsWithBlankLine = true; 685 } 686 } // Check for task list items 687 688 689 if (this.options.gfm) { 690 istask = /^\[[ xX]\] /.exec(itemContents); 691 692 if (istask) { 693 ischecked = istask[0] !== '[ ] '; 694 itemContents = itemContents.replace(/^\[[ xX]\] +/, ''); 695 } 696 } 697 698 list.items.push({ 699 type: 'list_item', 700 raw: raw, 701 task: !!istask, 702 checked: ischecked, 703 loose: false, 704 text: itemContents 705 }); 706 list.raw += raw; 707 src = src.slice(raw.length); 708 } // Do not consume newlines at end of final item. Alternatively, make itemRegex *start* with any newlines to simplify/speed up endsWithBlankLine logic 709 710 711 list.items[list.items.length - 1].raw = raw.trimRight(); 712 list.items[list.items.length - 1].text = itemContents.trimRight(); 713 list.raw = list.raw.trimRight(); 714 var l = list.items.length; // Item child tokens handled here at end because we needed to have the final item to trim it first 715 716 for (i = 0; i < l; i++) { 717 this.lexer.state.top = false; 718 list.items[i].tokens = this.lexer.blockTokens(list.items[i].text, []); 719 720 if (list.items[i].tokens.some(function (t) { 721 return t.type === 'space'; 722 })) { 723 list.loose = true; 724 list.items[i].loose = true; 725 } 726 } 727 728 return list; 729 } 730 }; 731 732 _proto.html = function html(src) { 733 var cap = this.rules.block.html.exec(src); 734 735 if (cap) { 736 var token = { 737 type: 'html', 738 raw: cap[0], 739 pre: !this.options.sanitizer && (cap[1] === 'pre' || cap[1] === 'script' || cap[1] === 'style'), 740 text: cap[0] 741 }; 742 743 if (this.options.sanitize) { 744 token.type = 'paragraph'; 745 token.text = this.options.sanitizer ? this.options.sanitizer(cap[0]) : _escape(cap[0]); 746 token.tokens = []; 747 this.lexer.inline(token.text, token.tokens); 748 } 749 750 return token; 751 } 752 }; 753 754 _proto.def = function def(src) { 755 var cap = this.rules.block.def.exec(src); 756 757 if (cap) { 758 if (cap[3]) cap[3] = cap[3].substring(1, cap[3].length - 1); 759 var tag = cap[1].toLowerCase().replace(/\s+/g, ' '); 760 return { 761 type: 'def', 762 tag: tag, 763 raw: cap[0], 764 href: cap[2], 765 title: cap[3] 766 }; 767 } 768 }; 769 770 _proto.table = function table(src) { 771 var cap = this.rules.block.table.exec(src); 772 773 if (cap) { 774 var item = { 775 type: 'table', 776 header: splitCells(cap[1]).map(function (c) { 777 return { 778 text: c 779 }; 780 }), 781 align: cap[2].replace(/^ *|\| *$/g, '').split(/ *\| */), 782 rows: cap[3] ? cap[3].replace(/\n$/, '').split('\n') : [] 783 }; 784 785 if (item.header.length === item.align.length) { 786 item.raw = cap[0]; 787 var l = item.align.length; 788 var i, j, k, row; 789 790 for (i = 0; i < l; i++) { 791 if (/^ *-+: *$/.test(item.align[i])) { 792 item.align[i] = 'right'; 793 } else if (/^ *:-+: *$/.test(item.align[i])) { 794 item.align[i] = 'center'; 795 } else if (/^ *:-+ *$/.test(item.align[i])) { 796 item.align[i] = 'left'; 797 } else { 798 item.align[i] = null; 799 } 800 } 801 802 l = item.rows.length; 803 804 for (i = 0; i < l; i++) { 805 item.rows[i] = splitCells(item.rows[i], item.header.length).map(function (c) { 806 return { 807 text: c 808 }; 809 }); 810 } // parse child tokens inside headers and cells 811 // header child tokens 812 813 814 l = item.header.length; 815 816 for (j = 0; j < l; j++) { 817 item.header[j].tokens = []; 818 this.lexer.inlineTokens(item.header[j].text, item.header[j].tokens); 819 } // cell child tokens 820 821 822 l = item.rows.length; 823 824 for (j = 0; j < l; j++) { 825 row = item.rows[j]; 826 827 for (k = 0; k < row.length; k++) { 828 row[k].tokens = []; 829 this.lexer.inlineTokens(row[k].text, row[k].tokens); 830 } 831 } 832 833 return item; 834 } 835 } 836 }; 837 838 _proto.lheading = function lheading(src) { 839 var cap = this.rules.block.lheading.exec(src); 840 841 if (cap) { 842 var token = { 843 type: 'heading', 844 raw: cap[0], 845 depth: cap[2].charAt(0) === '=' ? 1 : 2, 846 text: cap[1], 847 tokens: [] 848 }; 849 this.lexer.inline(token.text, token.tokens); 850 return token; 851 } 852 }; 853 854 _proto.paragraph = function paragraph(src) { 855 var cap = this.rules.block.paragraph.exec(src); 856 857 if (cap) { 858 var token = { 859 type: 'paragraph', 860 raw: cap[0], 861 text: cap[1].charAt(cap[1].length - 1) === '\n' ? cap[1].slice(0, -1) : cap[1], 862 tokens: [] 863 }; 864 this.lexer.inline(token.text, token.tokens); 865 return token; 866 } 867 }; 868 869 _proto.text = function text(src) { 870 var cap = this.rules.block.text.exec(src); 871 872 if (cap) { 873 var token = { 874 type: 'text', 875 raw: cap[0], 876 text: cap[0], 877 tokens: [] 878 }; 879 this.lexer.inline(token.text, token.tokens); 880 return token; 881 } 882 }; 883 884 _proto.escape = function escape(src) { 885 var cap = this.rules.inline.escape.exec(src); 886 887 if (cap) { 888 return { 889 type: 'escape', 890 raw: cap[0], 891 text: _escape(cap[1]) 892 }; 893 } 894 }; 895 896 _proto.tag = function tag(src) { 897 var cap = this.rules.inline.tag.exec(src); 898 899 if (cap) { 900 if (!this.lexer.state.inLink && /^<a /i.test(cap[0])) { 901 this.lexer.state.inLink = true; 902 } else if (this.lexer.state.inLink && /^<\/a>/i.test(cap[0])) { 903 this.lexer.state.inLink = false; 904 } 905 906 if (!this.lexer.state.inRawBlock && /^<(pre|code|kbd|script)(\s|>)/i.test(cap[0])) { 907 this.lexer.state.inRawBlock = true; 908 } else if (this.lexer.state.inRawBlock && /^<\/(pre|code|kbd|script)(\s|>)/i.test(cap[0])) { 909 this.lexer.state.inRawBlock = false; 910 } 911 912 return { 913 type: this.options.sanitize ? 'text' : 'html', 914 raw: cap[0], 915 inLink: this.lexer.state.inLink, 916 inRawBlock: this.lexer.state.inRawBlock, 917 text: this.options.sanitize ? this.options.sanitizer ? this.options.sanitizer(cap[0]) : _escape(cap[0]) : cap[0] 918 }; 919 } 920 }; 921 922 _proto.link = function link(src) { 923 var cap = this.rules.inline.link.exec(src); 924 925 if (cap) { 926 var trimmedUrl = cap[2].trim(); 927 928 if (!this.options.pedantic && /^</.test(trimmedUrl)) { 929 // commonmark requires matching angle brackets 930 if (!/>$/.test(trimmedUrl)) { 931 return; 932 } // ending angle bracket cannot be escaped 933 934 935 var rtrimSlash = rtrim(trimmedUrl.slice(0, -1), '\\'); 936 937 if ((trimmedUrl.length - rtrimSlash.length) % 2 === 0) { 938 return; 939 } 940 } else { 941 // find closing parenthesis 942 var lastParenIndex = findClosingBracket(cap[2], '()'); 943 944 if (lastParenIndex > -1) { 945 var start = cap[0].indexOf('!') === 0 ? 5 : 4; 946 var linkLen = start + cap[1].length + lastParenIndex; 947 cap[2] = cap[2].substring(0, lastParenIndex); 948 cap[0] = cap[0].substring(0, linkLen).trim(); 949 cap[3] = ''; 950 } 951 } 952 953 var href = cap[2]; 954 var title = ''; 955 956 if (this.options.pedantic) { 957 // split pedantic href and title 958 var link = /^([^'"]*[^\s])\s+(['"])(.*)\2/.exec(href); 959 960 if (link) { 961 href = link[1]; 962 title = link[3]; 963 } 964 } else { 965 title = cap[3] ? cap[3].slice(1, -1) : ''; 966 } 967 968 href = href.trim(); 969 970 if (/^</.test(href)) { 971 if (this.options.pedantic && !/>$/.test(trimmedUrl)) { 972 // pedantic allows starting angle bracket without ending angle bracket 973 href = href.slice(1); 974 } else { 975 href = href.slice(1, -1); 976 } 977 } 978 979 return outputLink(cap, { 980 href: href ? href.replace(this.rules.inline._escapes, '$1') : href, 981 title: title ? title.replace(this.rules.inline._escapes, '$1') : title 982 }, cap[0], this.lexer); 983 } 984 }; 985 986 _proto.reflink = function reflink(src, links) { 987 var cap; 988 989 if ((cap = this.rules.inline.reflink.exec(src)) || (cap = this.rules.inline.nolink.exec(src))) { 990 var link = (cap[2] || cap[1]).replace(/\s+/g, ' '); 991 link = links[link.toLowerCase()]; 992 993 if (!link || !link.href) { 994 var text = cap[0].charAt(0); 995 return { 996 type: 'text', 997 raw: text, 998 text: text 999 }; 1000 } 1001 1002 return outputLink(cap, link, cap[0], this.lexer); 1003 } 1004 }; 1005 1006 _proto.emStrong = function emStrong(src, maskedSrc, prevChar) { 1007 if (prevChar === void 0) { 1008 prevChar = ''; 1009 } 1010 1011 var match = this.rules.inline.emStrong.lDelim.exec(src); 1012 if (!match) return; // _ can't be between two alphanumerics. \p{L}\p{N} includes non-english alphabet/numbers as well 1013 1014 if (match[3] && prevChar.match(/(?:[0-9A-Za-z\xAA\xB2\xB3\xB5\xB9\xBA\xBC-\xBE\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0560-\u0588\u05D0-\u05EA\u05EF-\u05F2\u0620-\u064A\u0660-\u0669\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07C0-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u0860-\u086A\u08A0-\u08B4\u08B6-\u08C7\u0904-\u0939\u093D\u0950\u0958-\u0961\u0966-\u096F\u0971-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09E6-\u09F1\u09F4-\u09F9\u09FC\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A66-\u0A6F\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0AE6-\u0AEF\u0AF9\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B66-\u0B6F\u0B71-\u0B77\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0BE6-\u0BF2\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C60\u0C61\u0C66-\u0C6F\u0C78-\u0C7E\u0C80\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CE6-\u0CEF\u0CF1\u0CF2\u0D04-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D54-\u0D56\u0D58-\u0D61\u0D66-\u0D78\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0DE6-\u0DEF\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E50-\u0E59\u0E81\u0E82\u0E84\u0E86-\u0E8A\u0E8C-\u0EA3\u0EA5\u0EA7-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0ED0-\u0ED9\u0EDC-\u0EDF\u0F00\u0F20-\u0F33\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F-\u1049\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u1090-\u1099\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1369-\u137C\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u17E0-\u17E9\u17F0-\u17F9\u1810-\u1819\u1820-\u1878\u1880-\u1884\u1887-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1946-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u19D0-\u19DA\u1A00-\u1A16\u1A20-\u1A54\u1A80-\u1A89\u1A90-\u1A99\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B50-\u1B59\u1B83-\u1BA0\u1BAE-\u1BE5\u1C00-\u1C23\u1C40-\u1C49\u1C4D-\u1C7D\u1C80-\u1C88\u1C90-\u1CBA\u1CBD-\u1CBF\u1CE9-\u1CEC\u1CEE-\u1CF3\u1CF5\u1CF6\u1CFA\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2070\u2071\u2074-\u2079\u207F-\u2089\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2150-\u2189\u2460-\u249B\u24EA-\u24FF\u2776-\u2793\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2CFD\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303C\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312F\u3131-\u318E\u3192-\u3195\u31A0-\u31BF\u31F0-\u31FF\u3220-\u3229\u3248-\u324F\u3251-\u325F\u3280-\u3289\u32B1-\u32BF\u3400-\u4DBF\u4E00-\u9FFC\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6EF\uA717-\uA71F\uA722-\uA788\uA78B-\uA7BF\uA7C2-\uA7CA\uA7F5-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA830-\uA835\uA840-\uA873\uA882-\uA8B3\uA8D0-\uA8D9\uA8F2-\uA8F7\uA8FB\uA8FD\uA8FE\uA900-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF-\uA9D9\uA9E0-\uA9E4\uA9E6-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA50-\uAA59\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB69\uAB70-\uABE2\uABF0-\uABF9\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF10-\uFF19\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD07-\uDD33\uDD40-\uDD78\uDD8A\uDD8B\uDE80-\uDE9C\uDEA0-\uDED0\uDEE1-\uDEFB\uDF00-\uDF23\uDF2D-\uDF4A\uDF50-\uDF75\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCA0-\uDCA9\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC58-\uDC76\uDC79-\uDC9E\uDCA7-\uDCAF\uDCE0-\uDCF2\uDCF4\uDCF5\uDCFB-\uDD1B\uDD20-\uDD39\uDD80-\uDDB7\uDDBC-\uDDCF\uDDD2-\uDE00\uDE10-\uDE13\uDE15-\uDE17\uDE19-\uDE35\uDE40-\uDE48\uDE60-\uDE7E\uDE80-\uDE9F\uDEC0-\uDEC7\uDEC9-\uDEE4\uDEEB-\uDEEF\uDF00-\uDF35\uDF40-\uDF55\uDF58-\uDF72\uDF78-\uDF91\uDFA9-\uDFAF]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2\uDCFA-\uDD23\uDD30-\uDD39\uDE60-\uDE7E\uDE80-\uDEA9\uDEB0\uDEB1\uDF00-\uDF27\uDF30-\uDF45\uDF51-\uDF54\uDFB0-\uDFCB\uDFE0-\uDFF6]|\uD804[\uDC03-\uDC37\uDC52-\uDC6F\uDC83-\uDCAF\uDCD0-\uDCE8\uDCF0-\uDCF9\uDD03-\uDD26\uDD36-\uDD3F\uDD44\uDD47\uDD50-\uDD72\uDD76\uDD83-\uDDB2\uDDC1-\uDDC4\uDDD0-\uDDDA\uDDDC\uDDE1-\uDDF4\uDE00-\uDE11\uDE13-\uDE2B\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEDE\uDEF0-\uDEF9\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3D\uDF50\uDF5D-\uDF61]|\uD805[\uDC00-\uDC34\uDC47-\uDC4A\uDC50-\uDC59\uDC5F-\uDC61\uDC80-\uDCAF\uDCC4\uDCC5\uDCC7\uDCD0-\uDCD9\uDD80-\uDDAE\uDDD8-\uDDDB\uDE00-\uDE2F\uDE44\uDE50-\uDE59\uDE80-\uDEAA\uDEB8\uDEC0-\uDEC9\uDF00-\uDF1A\uDF30-\uDF3B]|\uD806[\uDC00-\uDC2B\uDCA0-\uDCF2\uDCFF-\uDD06\uDD09\uDD0C-\uDD13\uDD15\uDD16\uDD18-\uDD2F\uDD3F\uDD41\uDD50-\uDD59\uDDA0-\uDDA7\uDDAA-\uDDD0\uDDE1\uDDE3\uDE00\uDE0B-\uDE32\uDE3A\uDE50\uDE5C-\uDE89\uDE9D\uDEC0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC2E\uDC40\uDC50-\uDC6C\uDC72-\uDC8F\uDD00-\uDD06\uDD08\uDD09\uDD0B-\uDD30\uDD46\uDD50-\uDD59\uDD60-\uDD65\uDD67\uDD68\uDD6A-\uDD89\uDD98\uDDA0-\uDDA9\uDEE0-\uDEF2\uDFB0\uDFC0-\uDFD4]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|[\uD80C\uD81C-\uD820\uD822\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872\uD874-\uD879\uD880-\uD883][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDE60-\uDE69\uDED0-\uDEED\uDF00-\uDF2F\uDF40-\uDF43\uDF50-\uDF59\uDF5B-\uDF61\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDE40-\uDE96\uDF00-\uDF4A\uDF50\uDF93-\uDF9F\uDFE0\uDFE1\uDFE3]|\uD821[\uDC00-\uDFF7]|\uD823[\uDC00-\uDCD5\uDD00-\uDD08]|\uD82C[\uDC00-\uDD1E\uDD50-\uDD52\uDD64-\uDD67\uDD70-\uDEFB]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99]|\uD834[\uDEE0-\uDEF3\uDF60-\uDF78]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB\uDFCE-\uDFFF]|\uD838[\uDD00-\uDD2C\uDD37-\uDD3D\uDD40-\uDD49\uDD4E\uDEC0-\uDEEB\uDEF0-\uDEF9]|\uD83A[\uDC00-\uDCC4\uDCC7-\uDCCF\uDD00-\uDD43\uDD4B\uDD50-\uDD59]|\uD83B[\uDC71-\uDCAB\uDCAD-\uDCAF\uDCB1-\uDCB4\uDD01-\uDD2D\uDD2F-\uDD3D\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD83C[\uDD00-\uDD0C]|\uD83E[\uDFF0-\uDFF9]|\uD869[\uDC00-\uDEDD\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0]|\uD87E[\uDC00-\uDE1D]|\uD884[\uDC00-\uDF4A])/)) return; 1015 var nextChar = match[1] || match[2] || ''; 1016 1017 if (!nextChar || nextChar && (prevChar === '' || this.rules.inline.punctuation.exec(prevChar))) { 1018 var lLength = match[0].length - 1; 1019 var rDelim, 1020 rLength, 1021 delimTotal = lLength, 1022 midDelimTotal = 0; 1023 var endReg = match[0][0] === '*' ? this.rules.inline.emStrong.rDelimAst : this.rules.inline.emStrong.rDelimUnd; 1024 endReg.lastIndex = 0; // Clip maskedSrc to same section of string as src (move to lexer?) 1025 1026 maskedSrc = maskedSrc.slice(-1 * src.length + lLength); 1027 1028 while ((match = endReg.exec(maskedSrc)) != null) { 1029 rDelim = match[1] || match[2] || match[3] || match[4] || match[5] || match[6]; 1030 if (!rDelim) continue; // skip single * in __abc*abc__ 1031 1032 rLength = rDelim.length; 1033 1034 if (match[3] || match[4]) { 1035 // found another Left Delim 1036 delimTotal += rLength; 1037 continue; 1038 } else if (match[5] || match[6]) { 1039 // either Left or Right Delim 1040 if (lLength % 3 && !((lLength + rLength) % 3)) { 1041 midDelimTotal += rLength; 1042 continue; // CommonMark Emphasis Rules 9-10 1043 } 1044 } 1045 1046 delimTotal -= rLength; 1047 if (delimTotal > 0) continue; // Haven't found enough closing delimiters 1048 // Remove extra characters. *a*** -> *a* 1049 1050 rLength = Math.min(rLength, rLength + delimTotal + midDelimTotal); // Create `em` if smallest delimiter has odd char count. *a*** 1051 1052 if (Math.min(lLength, rLength) % 2) { 1053 var _text = src.slice(1, lLength + match.index + rLength); 1054 1055 return { 1056 type: 'em', 1057 raw: src.slice(0, lLength + match.index + rLength + 1), 1058 text: _text, 1059 tokens: this.lexer.inlineTokens(_text, []) 1060 }; 1061 } // Create 'strong' if smallest delimiter has even char count. **a*** 1062 1063 1064 var text = src.slice(2, lLength + match.index + rLength - 1); 1065 return { 1066 type: 'strong', 1067 raw: src.slice(0, lLength + match.index + rLength + 1), 1068 text: text, 1069 tokens: this.lexer.inlineTokens(text, []) 1070 }; 1071 } 1072 } 1073 }; 1074 1075 _proto.codespan = function codespan(src) { 1076 var cap = this.rules.inline.code.exec(src); 1077 1078 if (cap) { 1079 var text = cap[2].replace(/\n/g, ' '); 1080 var hasNonSpaceChars = /[^ ]/.test(text); 1081 var hasSpaceCharsOnBothEnds = /^ /.test(text) && / $/.test(text); 1082 1083 if (hasNonSpaceChars && hasSpaceCharsOnBothEnds) { 1084 text = text.substring(1, text.length - 1); 1085 } 1086 1087 text = _escape(text, true); 1088 return { 1089 type: 'codespan', 1090 raw: cap[0], 1091 text: text 1092 }; 1093 } 1094 }; 1095 1096 _proto.br = function br(src) { 1097 var cap = this.rules.inline.br.exec(src); 1098 1099 if (cap) { 1100 return { 1101 type: 'br', 1102 raw: cap[0] 1103 }; 1104 } 1105 }; 1106 1107 _proto.del = function del(src) { 1108 var cap = this.rules.inline.del.exec(src); 1109 1110 if (cap) { 1111 return { 1112 type: 'del', 1113 raw: cap[0], 1114 text: cap[2], 1115 tokens: this.lexer.inlineTokens(cap[2], []) 1116 }; 1117 } 1118 }; 1119 1120 _proto.autolink = function autolink(src, mangle) { 1121 var cap = this.rules.inline.autolink.exec(src); 1122 1123 if (cap) { 1124 var text, href; 1125 1126 if (cap[2] === '@') { 1127 text = _escape(this.options.mangle ? mangle(cap[1]) : cap[1]); 1128 href = 'mailto:' + text; 1129 } else { 1130 text = _escape(cap[1]); 1131 href = text; 1132 } 1133 1134 return { 1135 type: 'link', 1136 raw: cap[0], 1137 text: text, 1138 href: href, 1139 tokens: [{ 1140 type: 'text', 1141 raw: text, 1142 text: text 1143 }] 1144 }; 1145 } 1146 }; 1147 1148 _proto.url = function url(src, mangle) { 1149 var cap; 1150 1151 if (cap = this.rules.inline.url.exec(src)) { 1152 var text, href; 1153 1154 if (cap[2] === '@') { 1155 text = _escape(this.options.mangle ? mangle(cap[0]) : cap[0]); 1156 href = 'mailto:' + text; 1157 } else { 1158 // do extended autolink path validation 1159 var prevCapZero; 1160 1161 do { 1162 prevCapZero = cap[0]; 1163 cap[0] = this.rules.inline._backpedal.exec(cap[0])[0]; 1164 } while (prevCapZero !== cap[0]); 1165 1166 text = _escape(cap[0]); 1167 1168 if (cap[1] === 'www.') { 1169 href = 'http://' + text; 1170 } else { 1171 href = text; 1172 } 1173 } 1174 1175 return { 1176 type: 'link', 1177 raw: cap[0], 1178 text: text, 1179 href: href, 1180 tokens: [{ 1181 type: 'text', 1182 raw: text, 1183 text: text 1184 }] 1185 }; 1186 } 1187 }; 1188 1189 _proto.inlineText = function inlineText(src, smartypants) { 1190 var cap = this.rules.inline.text.exec(src); 1191 1192 if (cap) { 1193 var text; 1194 1195 if (this.lexer.state.inRawBlock) { 1196 text = this.options.sanitize ? this.options.sanitizer ? this.options.sanitizer(cap[0]) : _escape(cap[0]) : cap[0]; 1197 } else { 1198 text = _escape(this.options.smartypants ? smartypants(cap[0]) : cap[0]); 1199 } 1200 1201 return { 1202 type: 'text', 1203 raw: cap[0], 1204 text: text 1205 }; 1206 } 1207 }; 1208 1209 return Tokenizer; 1210 }(); 1211 1212 var noopTest = helpers.noopTest, 1213 edit = helpers.edit, 1214 merge$1 = helpers.merge; 1215 /** 1216 * Block-Level Grammar 1217 */ 1218 1219 var block$1 = { 1220 newline: /^(?: *(?:\n|$))+/, 1221 code: /^( {4}[^\n]+(?:\n(?: *(?:\n|$))*)?)+/, 1222 fences: /^ {0,3}(`{3,}(?=[^`\n]*\n)|~{3,})([^\n]*)\n(?:|([\s\S]*?)\n)(?: {0,3}\1[~`]* *(?=\n|$)|$)/, 1223 hr: /^ {0,3}((?:- *){3,}|(?:_ *){3,}|(?:\* *){3,})(?:\n+|$)/, 1224 heading: /^ {0,3}(#{1,6})(?=\s|$)(.*)(?:\n+|$)/, 1225 blockquote: /^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/, 1226 list: /^( {0,3}bull)( [^\n]+?)?(?:\n|$)/, 1227 html: '^ {0,3}(?:' // optional indentation 1228 + '<(script|pre|style|textarea)[\\s>][\\s\\S]*?(?:</\\1>[^\\n]*\\n+|$)' // (1) 1229 + '|comment[^\\n]*(\\n+|$)' // (2) 1230 + '|<\\?[\\s\\S]*?(?:\\?>\\n*|$)' // (3) 1231 + '|<![A-Z][\\s\\S]*?(?:>\\n*|$)' // (4) 1232 + '|<!\\[CDATA\\[[\\s\\S]*?(?:\\]\\]>\\n*|$)' // (5) 1233 + '|</?(tag)(?: +|\\n|/?>)[\\s\\S]*?(?:(?:\\n *)+\\n|$)' // (6) 1234 + '|<(?!script|pre|style|textarea)([a-z][\\w-]*)(?:attribute)*? */?>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n *)+\\n|$)' // (7) open tag 1235 + '|</(?!script|pre|style|textarea)[a-z][\\w-]*\\s*>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n *)+\\n|$)' // (7) closing tag 1236 + ')', 1237 def: /^ {0,3}\[(label)\]: *\n? *<?([^\s>]+)>?(?:(?: +\n? *| *\n *)(title))? *(?:\n+|$)/, 1238 table: noopTest, 1239 lheading: /^([^\n]+)\n {0,3}(=+|-+) *(?:\n+|$)/, 1240 // regex template, placeholders will be replaced according to different paragraph 1241 // interruption rules of commonmark and the original markdown spec: 1242 _paragraph: /^([^\n]+(?:\n(?!hr|heading|lheading|blockquote|fences|list|html| +\n)[^\n]+)*)/, 1243 text: /^[^\n]+/ 1244 }; 1245 block$1._label = /(?!\s*\])(?:\\[\[\]]|[^\[\]])+/; 1246 block$1._title = /(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/; 1247 block$1.def = edit(block$1.def).replace('label', block$1._label).replace('title', block$1._title).getRegex(); 1248 block$1.bullet = /(?:[*+-]|\d{1,9}[.)])/; 1249 block$1.listItemStart = edit(/^( *)(bull) */).replace('bull', block$1.bullet).getRegex(); 1250 block$1.list = edit(block$1.list).replace(/bull/g, block$1.bullet).replace('hr', '\\n+(?=\\1?(?:(?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$))').replace('def', '\\n+(?=' + block$1.def.source + ')').getRegex(); 1251 block$1._tag = 'address|article|aside|base|basefont|blockquote|body|caption' + '|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption' + '|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe' + '|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option' + '|p|param|section|source|summary|table|tbody|td|tfoot|th|thead|title|tr' + '|track|ul'; 1252 block$1._comment = /<!--(?!-?>)[\s\S]*?(?:-->|$)/; 1253 block$1.html = edit(block$1.html, 'i').replace('comment', block$1._comment).replace('tag', block$1._tag).replace('attribute', / +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/).getRegex(); 1254 block$1.paragraph = edit(block$1._paragraph).replace('hr', block$1.hr).replace('heading', ' {0,3}#{1,6} ').replace('|lheading', '') // setex headings don't interrupt commonmark paragraphs 1255 .replace('blockquote', ' {0,3}>').replace('fences', ' {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n').replace('list', ' {0,3}(?:[*+-]|1[.)]) ') // only lists starting from 1 can interrupt 1256 .replace('html', '</?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|textarea|!--)').replace('tag', block$1._tag) // pars can be interrupted by type (6) html blocks 1257 .getRegex(); 1258 block$1.blockquote = edit(block$1.blockquote).replace('paragraph', block$1.paragraph).getRegex(); 1259 /** 1260 * Normal Block Grammar 1261 */ 1262 1263 block$1.normal = merge$1({}, block$1); 1264 /** 1265 * GFM Block Grammar 1266 */ 1267 1268 block$1.gfm = merge$1({}, block$1.normal, { 1269 table: '^ *([^\\n ].*\\|.*)\\n' // Header 1270 + ' {0,3}(?:\\| *)?(:?-+:? *(?:\\| *:?-+:? *)*)(?:\\| *)?' // Align 1271 + '(?:\\n((?:(?! *\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)' // Cells 1272 1273 }); 1274 block$1.gfm.table = edit(block$1.gfm.table).replace('hr', block$1.hr).replace('heading', ' {0,3}#{1,6} ').replace('blockquote', ' {0,3}>').replace('code', ' {4}[^\\n]').replace('fences', ' {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n').replace('list', ' {0,3}(?:[*+-]|1[.)]) ') // only lists starting from 1 can interrupt 1275 .replace('html', '</?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|textarea|!--)').replace('tag', block$1._tag) // tables can be interrupted by type (6) html blocks 1276 .getRegex(); 1277 /** 1278 * Pedantic grammar (original John Gruber's loose markdown specification) 1279 */ 1280 1281 block$1.pedantic = merge$1({}, block$1.normal, { 1282 html: edit('^ *(?:comment *(?:\\n|\\s*$)' + '|<(tag)[\\s\\S]+?</\\1> *(?:\\n{2,}|\\s*$)' // closed tag 1283 + '|<tag(?:"[^"]*"|\'[^\']*\'|\\s[^\'"/>\\s]*)*?/?> *(?:\\n{2,}|\\s*$))').replace('comment', block$1._comment).replace(/tag/g, '(?!(?:' + 'a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub' + '|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)' + '\\b)\\w+(?!:|[^\\w\\s@]*@)\\b').getRegex(), 1284 def: /^ *\[([^\]]+)\]: *<?([^\s>]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/, 1285 heading: /^(#{1,6})(.*)(?:\n+|$)/, 1286 fences: noopTest, 1287 // fences not supported 1288 paragraph: edit(block$1.normal._paragraph).replace('hr', block$1.hr).replace('heading', ' *#{1,6} *[^\n]').replace('lheading', block$1.lheading).replace('blockquote', ' {0,3}>').replace('|fences', '').replace('|list', '').replace('|html', '').getRegex() 1289 }); 1290 /** 1291 * Inline-Level Grammar 1292 */ 1293 1294 var inline$1 = { 1295 escape: /^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/, 1296 autolink: /^<(scheme:[^\s\x00-\x1f<>]*|email)>/, 1297 url: noopTest, 1298 tag: '^comment' + '|^</[a-zA-Z][\\w:-]*\\s*>' // self-closing tag 1299 + '|^<[a-zA-Z][\\w-]*(?:attribute)*?\\s*/?>' // open tag 1300 + '|^<\\?[\\s\\S]*?\\?>' // processing instruction, e.g. <?php ?> 1301 + '|^<![a-zA-Z]+\\s[\\s\\S]*?>' // declaration, e.g. <!DOCTYPE html> 1302 + '|^<!\\[CDATA\\[[\\s\\S]*?\\]\\]>', 1303 // CDATA section 1304 link: /^!?\[(label)\]\(\s*(href)(?:\s+(title))?\s*\)/, 1305 reflink: /^!?\[(label)\]\[(?!\s*\])((?:\\[\[\]]?|[^\[\]\\])+)\]/, 1306 nolink: /^!?\[(?!\s*\])((?:\[[^\[\]]*\]|\\[\[\]]|[^\[\]])*)\](?:\[\])?/, 1307 reflinkSearch: 'reflink|nolink(?!\\()', 1308 emStrong: { 1309 lDelim: /^(?:\*+(?:([punct_])|[^\s*]))|^_+(?:([punct*])|([^\s_]))/, 1310 // (1) and (2) can only be a Right Delimiter. (3) and (4) can only be Left. (5) and (6) can be either Left or Right. 1311 // () Skip other delimiter (1) #*** (2) a***#, a*** (3) #***a, ***a (4) ***# (5) #***# (6) a***a 1312 rDelimAst: /\_\_[^_*]*?\*[^_*]*?\_\_|[punct_](\*+)(?=[\s]|$)|[^punct*_\s](\*+)(?=[punct_\s]|$)|[punct_\s](\*+)(?=[^punct*_\s])|[\s](\*+)(?=[punct_])|[punct_](\*+)(?=[punct_])|[^punct*_\s](\*+)(?=[^punct*_\s])/, 1313 rDelimUnd: /\*\*[^_*]*?\_[^_*]*?\*\*|[punct*](\_+)(?=[\s]|$)|[^punct*_\s](\_+)(?=[punct*\s]|$)|[punct*\s](\_+)(?=[^punct*_\s])|[\s](\_+)(?=[punct*])|[punct*](\_+)(?=[punct*])/ // ^- Not allowed for _ 1314 1315 }, 1316 code: /^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/, 1317 br: /^( {2,}|\\)\n(?!\s*$)/, 1318 del: noopTest, 1319 text: /^(`+|[^`])(?:(?= {2,}\n)|[\s\S]*?(?:(?=[\\<!\[`*_]|\b_|$)|[^ ](?= {2,}\n)))/, 1320 punctuation: /^([\spunctuation])/ 1321 }; // list of punctuation marks from CommonMark spec 1322 // without * and _ to handle the different emphasis markers * and _ 1323 1324 inline$1._punctuation = '!"#$%&\'()+\\-.,/:;<=>?@\\[\\]`^{|}~'; 1325 inline$1.punctuation = edit(inline$1.punctuation).replace(/punctuation/g, inline$1._punctuation).getRegex(); // sequences em should skip over [title](link), `code`, <html> 1326 1327 inline$1.blockSkip = /\[[^\]]*?\]\([^\)]*?\)|`[^`]*?`|<[^>]*?>/g; 1328 inline$1.escapedEmSt = /\\\*|\\_/g; 1329 inline$1._comment = edit(block$1._comment).replace('(?:-->|$)', '-->').getRegex(); 1330 inline$1.emStrong.lDelim = edit(inline$1.emStrong.lDelim).replace(/punct/g, inline$1._punctuation).getRegex(); 1331 inline$1.emStrong.rDelimAst = edit(inline$1.emStrong.rDelimAst, 'g').replace(/punct/g, inline$1._punctuation).getRegex(); 1332 inline$1.emStrong.rDelimUnd = edit(inline$1.emStrong.rDelimUnd, 'g').replace(/punct/g, inline$1._punctuation).getRegex(); 1333 inline$1._escapes = /\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/g; 1334 inline$1._scheme = /[a-zA-Z][a-zA-Z0-9+.-]{1,31}/; 1335 inline$1._email = /[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/; 1336 inline$1.autolink = edit(inline$1.autolink).replace('scheme', inline$1._scheme).replace('email', inline$1._email).getRegex(); 1337 inline$1._attribute = /\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/; 1338 inline$1.tag = edit(inline$1.tag).replace('comment', inline$1._comment).replace('attribute', inline$1._attribute).getRegex(); 1339 inline$1._label = /(?:\[(?:\\.|[^\[\]\\])*\]|\\.|`[^`]*`|[^\[\]\\`])*?/; 1340 inline$1._href = /<(?:\\.|[^\n<>\\])+>|[^\s\x00-\x1f]*/; 1341 inline$1._title = /"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/; 1342 inline$1.link = edit(inline$1.link).replace('label', inline$1._label).replace('href', inline$1._href).replace('title', inline$1._title).getRegex(); 1343 inline$1.reflink = edit(inline$1.reflink).replace('label', inline$1._label).getRegex(); 1344 inline$1.reflinkSearch = edit(inline$1.reflinkSearch, 'g').replace('reflink', inline$1.reflink).replace('nolink', inline$1.nolink).getRegex(); 1345 /** 1346 * Normal Inline Grammar 1347 */ 1348 1349 inline$1.normal = merge$1({}, inline$1); 1350 /** 1351 * Pedantic Inline Grammar 1352 */ 1353 1354 inline$1.pedantic = merge$1({}, inline$1.normal, { 1355 strong: { 1356 start: /^__|\*\*/, 1357 middle: /^__(?=\S)([\s\S]*?\S)__(?!_)|^\*\*(?=\S)([\s\S]*?\S)\*\*(?!\*)/, 1358 endAst: /\*\*(?!\*)/g, 1359 endUnd: /__(?!_)/g 1360 }, 1361 em: { 1362 start: /^_|\*/, 1363 middle: /^()\*(?=\S)([\s\S]*?\S)\*(?!\*)|^_(?=\S)([\s\S]*?\S)_(?!_)/, 1364 endAst: /\*(?!\*)/g, 1365 endUnd: /_(?!_)/g 1366 }, 1367 link: edit(/^!?\[(label)\]\((.*?)\)/).replace('label', inline$1._label).getRegex(), 1368 reflink: edit(/^!?\[(label)\]\s*\[([^\]]*)\]/).replace('label', inline$1._label).getRegex() 1369 }); 1370 /** 1371 * GFM Inline Grammar 1372 */ 1373 1374 inline$1.gfm = merge$1({}, inline$1.normal, { 1375 escape: edit(inline$1.escape).replace('])', '~|])').getRegex(), 1376 _extended_email: /[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/, 1377 url: /^((?:ftp|https?):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/, 1378 _backpedal: /(?:[^?!.,:;*_~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_~)]+(?!$))+/, 1379 del: /^(~~?)(?=[^\s~])([\s\S]*?[^\s~])\1(?=[^~]|$)/, 1380 text: /^([`~]+|[^`~])(?:(?= {2,}\n)|(?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)|[\s\S]*?(?:(?=[\\<!\[`*~_]|\b_|https?:\/\/|ftp:\/\/|www\.|$)|[^ ](?= {2,}\n)|[^a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-](?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)))/ 1381 }); 1382 inline$1.gfm.url = edit(inline$1.gfm.url, 'i').replace('email', inline$1.gfm._extended_email).getRegex(); 1383 /** 1384 * GFM + Line Breaks Inline Grammar 1385 */ 1386 1387 inline$1.breaks = merge$1({}, inline$1.gfm, { 1388 br: edit(inline$1.br).replace('{2,}', '*').getRegex(), 1389 text: edit(inline$1.gfm.text).replace('\\b_', '\\b_| {2,}\\n').replace(/\{2,\}/g, '*').getRegex() 1390 }); 1391 var rules = { 1392 block: block$1, 1393 inline: inline$1 1394 }; 1395 1396 var Tokenizer$1 = Tokenizer_1; 1397 var defaults$3 = defaults$5.exports.defaults; 1398 var block = rules.block, 1399 inline = rules.inline; 1400 var repeatString = helpers.repeatString; 1401 /** 1402 * smartypants text replacement 1403 */ 1404 1405 function smartypants(text) { 1406 return text // em-dashes 1407 .replace(/---/g, "\u2014") // en-dashes 1408 .replace(/--/g, "\u2013") // opening singles 1409 .replace(/(^|[-\u2014/(\[{"\s])'/g, "$1\u2018") // closing singles & apostrophes 1410 .replace(/'/g, "\u2019") // opening doubles 1411 .replace(/(^|[-\u2014/(\[{\u2018\s])"/g, "$1\u201C") // closing doubles 1412 .replace(/"/g, "\u201D") // ellipses 1413 .replace(/\.{3}/g, "\u2026"); 1414 } 1415 /** 1416 * mangle email addresses 1417 */ 1418 1419 1420 function mangle(text) { 1421 var out = '', 1422 i, 1423 ch; 1424 var l = text.length; 1425 1426 for (i = 0; i < l; i++) { 1427 ch = text.charCodeAt(i); 1428 1429 if (Math.random() > 0.5) { 1430 ch = 'x' + ch.toString(16); 1431 } 1432 1433 out += '&#' + ch + ';'; 1434 } 1435 1436 return out; 1437 } 1438 /** 1439 * Block Lexer 1440 */ 1441 1442 1443 var Lexer_1 = /*#__PURE__*/function () { 1444 function Lexer(options) { 1445 this.tokens = []; 1446 this.tokens.links = Object.create(null); 1447 this.options = options || defaults$3; 1448 this.options.tokenizer = this.options.tokenizer || new Tokenizer$1(); 1449 this.tokenizer = this.options.tokenizer; 1450 this.tokenizer.options = this.options; 1451 this.tokenizer.lexer = this; 1452 this.inlineQueue = []; 1453 this.state = { 1454 inLink: false, 1455 inRawBlock: false, 1456 top: true 1457 }; 1458 var rules = { 1459 block: block.normal, 1460 inline: inline.normal 1461 }; 1462 1463 if (this.options.pedantic) { 1464 rules.block = block.pedantic; 1465 rules.inline = inline.pedantic; 1466 } else if (this.options.gfm) { 1467 rules.block = block.gfm; 1468 1469 if (this.options.breaks) { 1470 rules.inline = inline.breaks; 1471 } else { 1472 rules.inline = inline.gfm; 1473 } 1474 } 1475 1476 this.tokenizer.rules = rules; 1477 } 1478 /** 1479 * Expose Rules 1480 */ 1481 1482 1483 /** 1484 * Static Lex Method 1485 */ 1486 Lexer.lex = function lex(src, options) { 1487 var lexer = new Lexer(options); 1488 return lexer.lex(src); 1489 } 1490 /** 1491 * Static Lex Inline Method 1492 */ 1493 ; 1494 1495 Lexer.lexInline = function lexInline(src, options) { 1496 var lexer = new Lexer(options); 1497 return lexer.inlineTokens(src); 1498 } 1499 /** 1500 * Preprocessing 1501 */ 1502 ; 1503 1504 var _proto = Lexer.prototype; 1505 1506 _proto.lex = function lex(src) { 1507 src = src.replace(/\r\n|\r/g, '\n').replace(/\t/g, ' '); 1508 this.blockTokens(src, this.tokens); 1509 var next; 1510 1511 while (next = this.inlineQueue.shift()) { 1512 this.inlineTokens(next.src, next.tokens); 1513 } 1514 1515 return this.tokens; 1516 } 1517 /** 1518 * Lexing 1519 */ 1520 ; 1521 1522 _proto.blockTokens = function blockTokens(src, tokens) { 1523 var _this = this; 1524 1525 if (tokens === void 0) { 1526 tokens = []; 1527 } 1528 1529 if (this.options.pedantic) { 1530 src = src.replace(/^ +$/gm, ''); 1531 } 1532 1533 var token, lastToken, cutSrc, lastParagraphClipped; 1534 1535 while (src) { 1536 if (this.options.extensions && this.options.extensions.block && this.options.extensions.block.some(function (extTokenizer) { 1537 if (token = extTokenizer.call({ 1538 lexer: _this 1539 }, src, tokens)) { 1540 src = src.substring(token.raw.length); 1541 tokens.push(token); 1542 return true; 1543 } 1544 1545 return false; 1546 })) { 1547 continue; 1548 } // newline 1549 1550 1551 if (token = this.tokenizer.space(src)) { 1552 src = src.substring(token.raw.length); 1553 1554 if (token.type) { 1555 tokens.push(token); 1556 } 1557 1558 continue; 1559 } // code 1560 1561 1562 if (token = this.tokenizer.code(src)) { 1563 src = src.substring(token.raw.length); 1564 lastToken = tokens[tokens.length - 1]; // An indented code block cannot interrupt a paragraph. 1565 1566 if (lastToken && (lastToken.type === 'paragraph' || lastToken.type === 'text')) { 1567 lastToken.raw += '\n' + token.raw; 1568 lastToken.text += '\n' + token.text; 1569 this.inlineQueue[this.inlineQueue.length - 1].src = lastToken.text; 1570 } else { 1571 tokens.push(token); 1572 } 1573 1574 continue; 1575 } // fences 1576 1577 1578 if (token = this.tokenizer.fences(src)) { 1579 src = src.substring(token.raw.length); 1580 tokens.push(token); 1581 continue; 1582 } // heading 1583 1584 1585 if (token = this.tokenizer.heading(src)) { 1586 src = src.substring(token.raw.length); 1587 tokens.push(token); 1588 continue; 1589 } // hr 1590 1591 1592 if (token = this.tokenizer.hr(src)) { 1593 src = src.substring(token.raw.length); 1594 tokens.push(token); 1595 continue; 1596 } // blockquote 1597 1598 1599 if (token = this.tokenizer.blockquote(src)) { 1600 src = src.substring(token.raw.length); 1601 tokens.push(token); 1602 continue; 1603 } // list 1604 1605 1606 if (token = this.tokenizer.list(src)) { 1607 src = src.substring(token.raw.length); 1608 tokens.push(token); 1609 continue; 1610 } // html 1611 1612 1613 if (token = this.tokenizer.html(src)) { 1614 src = src.substring(token.raw.length); 1615 tokens.push(token); 1616 continue; 1617 } // def 1618 1619 1620 if (token = this.tokenizer.def(src)) { 1621 src = src.substring(token.raw.length); 1622 lastToken = tokens[tokens.length - 1]; 1623 1624 if (lastToken && (lastToken.type === 'paragraph' || lastToken.type === 'text')) { 1625 lastToken.raw += '\n' + token.raw; 1626 lastToken.text += '\n' + token.raw; 1627 this.inlineQueue[this.inlineQueue.length - 1].src = lastToken.text; 1628 } else if (!this.tokens.links[token.tag]) { 1629 this.tokens.links[token.tag] = { 1630 href: token.href, 1631 title: token.title 1632 }; 1633 } 1634 1635 continue; 1636 } // table (gfm) 1637 1638 1639 if (token = this.tokenizer.table(src)) { 1640 src = src.substring(token.raw.length); 1641 tokens.push(token); 1642 continue; 1643 } // lheading 1644 1645 1646 if (token = this.tokenizer.lheading(src)) { 1647 src = src.substring(token.raw.length); 1648 tokens.push(token); 1649 continue; 1650 } // top-level paragraph 1651 // prevent paragraph consuming extensions by clipping 'src' to extension start 1652 1653 1654 cutSrc = src; 1655 1656 if (this.options.extensions && this.options.extensions.startBlock) { 1657 (function () { 1658 var startIndex = Infinity; 1659 var tempSrc = src.slice(1); 1660 var tempStart = void 0; 1661 1662 _this.options.extensions.startBlock.forEach(function (getStartIndex) { 1663 tempStart = getStartIndex.call({ 1664 lexer: this 1665 }, tempSrc); 1666 1667 if (typeof tempStart === 'number' && tempStart >= 0) { 1668 startIndex = Math.min(startIndex, tempStart); 1669 } 1670 }); 1671 1672 if (startIndex < Infinity && startIndex >= 0) { 1673 cutSrc = src.substring(0, startIndex + 1); 1674 } 1675 })(); 1676 } 1677 1678 if (this.state.top && (token = this.tokenizer.paragraph(cutSrc))) { 1679 lastToken = tokens[tokens.length - 1]; 1680 1681 if (lastParagraphClipped && lastToken.type === 'paragraph') { 1682 lastToken.raw += '\n' + token.raw; 1683 lastToken.text += '\n' + token.text; 1684 this.inlineQueue.pop(); 1685 this.inlineQueue[this.inlineQueue.length - 1].src = lastToken.text; 1686 } else { 1687 tokens.push(token); 1688 } 1689 1690 lastParagraphClipped = cutSrc.length !== src.length; 1691 src = src.substring(token.raw.length); 1692 continue; 1693 } // text 1694 1695 1696 if (token = this.tokenizer.text(src)) { 1697 src = src.substring(token.raw.length); 1698 lastToken = tokens[tokens.length - 1]; 1699 1700 if (lastToken && lastToken.type === 'text') { 1701 lastToken.raw += '\n' + token.raw; 1702 lastToken.text += '\n' + token.text; 1703 this.inlineQueue.pop(); 1704 this.inlineQueue[this.inlineQueue.length - 1].src = lastToken.text; 1705 } else { 1706 tokens.push(token); 1707 } 1708 1709 continue; 1710 } 1711 1712 if (src) { 1713 var errMsg = 'Infinite loop on byte: ' + src.charCodeAt(0); 1714 1715 if (this.options.silent) { 1716 console.error(errMsg); 1717 break; 1718 } else { 1719 throw new Error(errMsg); 1720 } 1721 } 1722 } 1723 1724 this.state.top = true; 1725 return tokens; 1726 }; 1727 1728 _proto.inline = function inline(src, tokens) { 1729 this.inlineQueue.push({ 1730 src: src, 1731 tokens: tokens 1732 }); 1733 } 1734 /** 1735 * Lexing/Compiling 1736 */ 1737 ; 1738 1739 _proto.inlineTokens = function inlineTokens(src, tokens) { 1740 var _this2 = this; 1741 1742 if (tokens === void 0) { 1743 tokens = []; 1744 } 1745 1746 var token, lastToken, cutSrc; // String with links masked to avoid interference with em and strong 1747 1748 var maskedSrc = src; 1749 var match; 1750 var keepPrevChar, prevChar; // Mask out reflinks 1751 1752 if (this.tokens.links) { 1753 var links = Object.keys(this.tokens.links); 1754 1755 if (links.length > 0) { 1756 while ((match = this.tokenizer.rules.inline.reflinkSearch.exec(maskedSrc)) != null) { 1757 if (links.includes(match[0].slice(match[0].lastIndexOf('[') + 1, -1))) { 1758 maskedSrc = maskedSrc.slice(0, match.index) + '[' + repeatString('a', match[0].length - 2) + ']' + maskedSrc.slice(this.tokenizer.rules.inline.reflinkSearch.lastIndex); 1759 } 1760 } 1761 } 1762 } // Mask out other blocks 1763 1764 1765 while ((match = this.tokenizer.rules.inline.blockSkip.exec(maskedSrc)) != null) { 1766 maskedSrc = maskedSrc.slice(0, match.index) + '[' + repeatString('a', match[0].length - 2) + ']' + maskedSrc.slice(this.tokenizer.rules.inline.blockSkip.lastIndex); 1767 } // Mask out escaped em & strong delimiters 1768 1769 1770 while ((match = this.tokenizer.rules.inline.escapedEmSt.exec(maskedSrc)) != null) { 1771 maskedSrc = maskedSrc.slice(0, match.index) + '++' + maskedSrc.slice(this.tokenizer.rules.inline.escapedEmSt.lastIndex); 1772 } 1773 1774 while (src) { 1775 if (!keepPrevChar) { 1776 prevChar = ''; 1777 } 1778 1779 keepPrevChar = false; // extensions 1780 1781 if (this.options.extensions && this.options.extensions.inline && this.options.extensions.inline.some(function (extTokenizer) { 1782 if (token = extTokenizer.call({ 1783 lexer: _this2 1784 }, src, tokens)) { 1785 src = src.substring(token.raw.length); 1786 tokens.push(token); 1787 return true; 1788 } 1789 1790 return false; 1791 })) { 1792 continue; 1793 } // escape 1794 1795 1796 if (token = this.tokenizer.escape(src)) { 1797 src = src.substring(token.raw.length); 1798 tokens.push(token); 1799 continue; 1800 } // tag 1801 1802 1803 if (token = this.tokenizer.tag(src)) { 1804 src = src.substring(token.raw.length); 1805 lastToken = tokens[tokens.length - 1]; 1806 1807 if (lastToken && token.type === 'text' && lastToken.type === 'text') { 1808 lastToken.raw += token.raw; 1809 lastToken.text += token.text; 1810 } else { 1811 tokens.push(token); 1812 } 1813 1814 continue; 1815 } // link 1816 1817 1818 if (token = this.tokenizer.link(src)) { 1819 src = src.substring(token.raw.length); 1820 tokens.push(token); 1821 continue; 1822 } // reflink, nolink 1823 1824 1825 if (token = this.tokenizer.reflink(src, this.tokens.links)) { 1826 src = src.substring(token.raw.length); 1827 lastToken = tokens[tokens.length - 1]; 1828 1829 if (lastToken && token.type === 'text' && lastToken.type === 'text') { 1830 lastToken.raw += token.raw; 1831 lastToken.text += token.text; 1832 } else { 1833 tokens.push(token); 1834 } 1835 1836 continue; 1837 } // em & strong 1838 1839 1840 if (token = this.tokenizer.emStrong(src, maskedSrc, prevChar)) { 1841 src = src.substring(token.raw.length); 1842 tokens.push(token); 1843 continue; 1844 } // code 1845 1846 1847 if (token = this.tokenizer.codespan(src)) { 1848 src = src.substring(token.raw.length); 1849 tokens.push(token); 1850 continue; 1851 } // br 1852 1853 1854 if (token = this.tokenizer.br(src)) { 1855 src = src.substring(token.raw.length); 1856 tokens.push(token); 1857 continue; 1858 } // del (gfm) 1859 1860 1861 if (token = this.tokenizer.del(src)) { 1862 src = src.substring(token.raw.length); 1863 tokens.push(token); 1864 continue; 1865 } // autolink 1866 1867 1868 if (token = this.tokenizer.autolink(src, mangle)) { 1869 src = src.substring(token.raw.length); 1870 tokens.push(token); 1871 continue; 1872 } // url (gfm) 1873 1874 1875 if (!this.state.inLink && (token = this.tokenizer.url(src, mangle))) { 1876 src = src.substring(token.raw.length); 1877 tokens.push(token); 1878 continue; 1879 } // text 1880 // prevent inlineText consuming extensions by clipping 'src' to extension start 1881 1882 1883 cutSrc = src; 1884 1885 if (this.options.extensions && this.options.extensions.startInline) { 1886 (function () { 1887 var startIndex = Infinity; 1888 var tempSrc = src.slice(1); 1889 var tempStart = void 0; 1890 1891 _this2.options.extensions.startInline.forEach(function (getStartIndex) { 1892 tempStart = getStartIndex.call({ 1893 lexer: this 1894 }, tempSrc); 1895 1896 if (typeof tempStart === 'number' && tempStart >= 0) { 1897 startIndex = Math.min(startIndex, tempStart); 1898 } 1899 }); 1900 1901 if (startIndex < Infinity && startIndex >= 0) { 1902 cutSrc = src.substring(0, startIndex + 1); 1903 } 1904 })(); 1905 } 1906 1907 if (token = this.tokenizer.inlineText(cutSrc, smartypants)) { 1908 src = src.substring(token.raw.length); 1909 1910 if (token.raw.slice(-1) !== '_') { 1911 // Track prevChar before string of ____ started 1912 prevChar = token.raw.slice(-1); 1913 } 1914 1915 keepPrevChar = true; 1916 lastToken = tokens[tokens.length - 1]; 1917 1918 if (lastToken && lastToken.type === 'text') { 1919 lastToken.raw += token.raw; 1920 lastToken.text += token.text; 1921 } else { 1922 tokens.push(token); 1923 } 1924 1925 continue; 1926 } 1927 1928 if (src) { 1929 var errMsg = 'Infinite loop on byte: ' + src.charCodeAt(0); 1930 1931 if (this.options.silent) { 1932 console.error(errMsg); 1933 break; 1934 } else { 1935 throw new Error(errMsg); 1936 } 1937 } 1938 } 1939 1940 return tokens; 1941 }; 1942 1943 _createClass(Lexer, null, [{ 1944 key: "rules", 1945 get: function get() { 1946 return { 1947 block: block, 1948 inline: inline 1949 }; 1950 } 1951 }]); 1952 1953 return Lexer; 1954 }(); 1955 1956 var defaults$2 = defaults$5.exports.defaults; 1957 var cleanUrl = helpers.cleanUrl, 1958 escape$1 = helpers.escape; 1959 /** 1960 * Renderer 1961 */ 1962 1963 var Renderer_1 = /*#__PURE__*/function () { 1964 function Renderer(options) { 1965 this.options = options || defaults$2; 1966 } 1967 1968 var _proto = Renderer.prototype; 1969 1970 _proto.code = function code(_code, infostring, escaped) { 1971 var lang = (infostring || '').match(/\S*/)[0]; 1972 1973 if (this.options.highlight) { 1974 var out = this.options.highlight(_code, lang); 1975 1976 if (out != null && out !== _code) { 1977 escaped = true; 1978 _code = out; 1979 } 1980 } 1981 1982 _code = _code.replace(/\n$/, '') + '\n'; 1983 1984 if (!lang) { 1985 return '<pre><code>' + (escaped ? _code : escape$1(_code, true)) + '</code></pre>\n'; 1986 } 1987 1988 return '<pre><code class="' + this.options.langPrefix + escape$1(lang, true) + '">' + (escaped ? _code : escape$1(_code, true)) + '</code></pre>\n'; 1989 }; 1990 1991 _proto.blockquote = function blockquote(quote) { 1992 return '<blockquote>\n' + quote + '</blockquote>\n'; 1993 }; 1994 1995 _proto.html = function html(_html) { 1996 return _html; 1997 }; 1998 1999 _proto.heading = function heading(text, level, raw, slugger) { 2000 if (this.options.headerIds) { 2001 return '<h' + level + ' id="' + this.options.headerPrefix + slugger.slug(raw) + '">' + text + '</h' + level + '>\n'; 2002 } // ignore IDs 2003 2004 2005 return '<h' + level + '>' + text + '</h' + level + '>\n'; 2006 }; 2007 2008 _proto.hr = function hr() { 2009 return this.options.xhtml ? '<hr/>\n' : '<hr>\n'; 2010 }; 2011 2012 _proto.list = function list(body, ordered, start) { 2013 var type = ordered ? 'ol' : 'ul', 2014 startatt = ordered && start !== 1 ? ' start="' + start + '"' : ''; 2015 return '<' + type + startatt + '>\n' + body + '</' + type + '>\n'; 2016 }; 2017 2018 _proto.listitem = function listitem(text) { 2019 return '<li>' + text + '</li>\n'; 2020 }; 2021 2022 _proto.checkbox = function checkbox(checked) { 2023 return '<input ' + (checked ? 'checked="" ' : '') + 'disabled="" type="checkbox"' + (this.options.xhtml ? ' /' : '') + '> '; 2024 }; 2025 2026 _proto.paragraph = function paragraph(text) { 2027 return '<p>' + text + '</p>\n'; 2028 }; 2029 2030 _proto.table = function table(header, body) { 2031 if (body) body = '<tbody>' + body + '</tbody>'; 2032 return '<table>\n' + '<thead>\n' + header + '</thead>\n' + body + '</table>\n'; 2033 }; 2034 2035 _proto.tablerow = function tablerow(content) { 2036 return '<tr>\n' + content + '</tr>\n'; 2037 }; 2038 2039 _proto.tablecell = function tablecell(content, flags) { 2040 var type = flags.header ? 'th' : 'td'; 2041 var tag = flags.align ? '<' + type + ' align="' + flags.align + '">' : '<' + type + '>'; 2042 return tag + content + '</' + type + '>\n'; 2043 } // span level renderer 2044 ; 2045 2046 _proto.strong = function strong(text) { 2047 return '<strong>' + text + '</strong>'; 2048 }; 2049 2050 _proto.em = function em(text) { 2051 return '<em>' + text + '</em>'; 2052 }; 2053 2054 _proto.codespan = function codespan(text) { 2055 return '<code>' + text + '</code>'; 2056 }; 2057 2058 _proto.br = function br() { 2059 return this.options.xhtml ? '<br/>' : '<br>'; 2060 }; 2061 2062 _proto.del = function del(text) { 2063 return '<del>' + text + '</del>'; 2064 }; 2065 2066 _proto.link = function link(href, title, text) { 2067 href = cleanUrl(this.options.sanitize, this.options.baseUrl, href); 2068 2069 if (href === null) { 2070 return text; 2071 } 2072 2073 var out = '<a href="' + escape$1(href) + '"'; 2074 2075 if (title) { 2076 out += ' title="' + title + '"'; 2077 } 2078 2079 out += '>' + text + '</a>'; 2080 return out; 2081 }; 2082 2083 _proto.image = function image(href, title, text) { 2084 href = cleanUrl(this.options.sanitize, this.options.baseUrl, href); 2085 2086 if (href === null) { 2087 return text; 2088 } 2089 2090 var out = '<img src="' + href + '" alt="' + text + '"'; 2091 2092 if (title) { 2093 out += ' title="' + title + '"'; 2094 } 2095 2096 out += this.options.xhtml ? '/>' : '>'; 2097 return out; 2098 }; 2099 2100 _proto.text = function text(_text) { 2101 return _text; 2102 }; 2103 2104 return Renderer; 2105 }(); 2106 2107 /** 2108 * TextRenderer 2109 * returns only the textual part of the token 2110 */ 2111 2112 var TextRenderer_1 = /*#__PURE__*/function () { 2113 function TextRenderer() {} 2114 2115 var _proto = TextRenderer.prototype; 2116 2117 // no need for block level renderers 2118 _proto.strong = function strong(text) { 2119 return text; 2120 }; 2121 2122 _proto.em = function em(text) { 2123 return text; 2124 }; 2125 2126 _proto.codespan = function codespan(text) { 2127 return text; 2128 }; 2129 2130 _proto.del = function del(text) { 2131 return text; 2132 }; 2133 2134 _proto.html = function html(text) { 2135 return text; 2136 }; 2137 2138 _proto.text = function text(_text) { 2139 return _text; 2140 }; 2141 2142 _proto.link = function link(href, title, text) { 2143 return '' + text; 2144 }; 2145 2146 _proto.image = function image(href, title, text) { 2147 return '' + text; 2148 }; 2149 2150 _proto.br = function br() { 2151 return ''; 2152 }; 2153 2154 return TextRenderer; 2155 }(); 2156 2157 /** 2158 * Slugger generates header id 2159 */ 2160 2161 var Slugger_1 = /*#__PURE__*/function () { 2162 function Slugger() { 2163 this.seen = {}; 2164 } 2165 2166 var _proto = Slugger.prototype; 2167 2168 _proto.serialize = function serialize(value) { 2169 return value.toLowerCase().trim() // remove html tags 2170 .replace(/<[!\/a-z].*?>/ig, '') // remove unwanted chars 2171 .replace(/[\u2000-\u206F\u2E00-\u2E7F\\'!"#$%&()*+,./:;<=>?@[\]^`{|}~]/g, '').replace(/\s/g, '-'); 2172 } 2173 /** 2174 * Finds the next safe (unique) slug to use 2175 */ 2176 ; 2177 2178 _proto.getNextSafeSlug = function getNextSafeSlug(originalSlug, isDryRun) { 2179 var slug = originalSlug; 2180 var occurenceAccumulator = 0; 2181 2182 if (this.seen.hasOwnProperty(slug)) { 2183 occurenceAccumulator = this.seen[originalSlug]; 2184 2185 do { 2186 occurenceAccumulator++; 2187 slug = originalSlug + '-' + occurenceAccumulator; 2188 } while (this.seen.hasOwnProperty(slug)); 2189 } 2190 2191 if (!isDryRun) { 2192 this.seen[originalSlug] = occurenceAccumulator; 2193 this.seen[slug] = 0; 2194 } 2195 2196 return slug; 2197 } 2198 /** 2199 * Convert string to unique id 2200 * @param {object} options 2201 * @param {boolean} options.dryrun Generates the next unique slug without updating the internal accumulator. 2202 */ 2203 ; 2204 2205 _proto.slug = function slug(value, options) { 2206 if (options === void 0) { 2207 options = {}; 2208 } 2209 2210 var slug = this.serialize(value); 2211 return this.getNextSafeSlug(slug, options.dryrun); 2212 }; 2213 2214 return Slugger; 2215 }(); 2216 2217 var Renderer$1 = Renderer_1; 2218 var TextRenderer$1 = TextRenderer_1; 2219 var Slugger$1 = Slugger_1; 2220 var defaults$1 = defaults$5.exports.defaults; 2221 var unescape = helpers.unescape; 2222 /** 2223 * Parsing & Compiling 2224 */ 2225 2226 var Parser_1 = /*#__PURE__*/function () { 2227 function Parser(options) { 2228 this.options = options || defaults$1; 2229 this.options.renderer = this.options.renderer || new Renderer$1(); 2230 this.renderer = this.options.renderer; 2231 this.renderer.options = this.options; 2232 this.textRenderer = new TextRenderer$1(); 2233 this.slugger = new Slugger$1(); 2234 } 2235 /** 2236 * Static Parse Method 2237 */ 2238 2239 2240 Parser.parse = function parse(tokens, options) { 2241 var parser = new Parser(options); 2242 return parser.parse(tokens); 2243 } 2244 /** 2245 * Static Parse Inline Method 2246 */ 2247 ; 2248 2249 Parser.parseInline = function parseInline(tokens, options) { 2250 var parser = new Parser(options); 2251 return parser.parseInline(tokens); 2252 } 2253 /** 2254 * Parse Loop 2255 */ 2256 ; 2257 2258 var _proto = Parser.prototype; 2259 2260 _proto.parse = function parse(tokens, top) { 2261 if (top === void 0) { 2262 top = true; 2263 } 2264 2265 var out = '', 2266 i, 2267 j, 2268 k, 2269 l2, 2270 l3, 2271 row, 2272 cell, 2273 header, 2274 body, 2275 token, 2276 ordered, 2277 start, 2278 loose, 2279 itemBody, 2280 item, 2281 checked, 2282 task, 2283 checkbox, 2284 ret; 2285 var l = tokens.length; 2286 2287 for (i = 0; i < l; i++) { 2288 token = tokens[i]; // Run any renderer extensions 2289 2290 if (this.options.extensions && this.options.extensions.renderers && this.options.extensions.renderers[token.type]) { 2291 ret = this.options.extensions.renderers[token.type].call({ 2292 parser: this 2293 }, token); 2294 2295 if (ret !== false || !['space', 'hr', 'heading', 'code', 'table', 'blockquote', 'list', 'html', 'paragraph', 'text'].includes(token.type)) { 2296 out += ret || ''; 2297 continue; 2298 } 2299 } 2300 2301 switch (token.type) { 2302 case 'space': 2303 { 2304 continue; 2305 } 2306 2307 case 'hr': 2308 { 2309 out += this.renderer.hr(); 2310 continue; 2311 } 2312 2313 case 'heading': 2314 { 2315 out += this.renderer.heading(this.parseInline(token.tokens), token.depth, unescape(this.parseInline(token.tokens, this.textRenderer)), this.slugger); 2316 continue; 2317 } 2318 2319 case 'code': 2320 { 2321 out += this.renderer.code(token.text, token.lang, token.escaped); 2322 continue; 2323 } 2324 2325 case 'table': 2326 { 2327 header = ''; // header 2328 2329 cell = ''; 2330 l2 = token.header.length; 2331 2332 for (j = 0; j < l2; j++) { 2333 cell += this.renderer.tablecell(this.parseInline(token.header[j].tokens), { 2334 header: true, 2335 align: token.align[j] 2336 }); 2337 } 2338 2339 header += this.renderer.tablerow(cell); 2340 body = ''; 2341 l2 = token.rows.length; 2342 2343 for (j = 0; j < l2; j++) { 2344 row = token.rows[j]; 2345 cell = ''; 2346 l3 = row.length; 2347 2348 for (k = 0; k < l3; k++) { 2349 cell += this.renderer.tablecell(this.parseInline(row[k].tokens), { 2350 header: false, 2351 align: token.align[k] 2352 }); 2353 } 2354 2355 body += this.renderer.tablerow(cell); 2356 } 2357 2358 out += this.renderer.table(header, body); 2359 continue; 2360 } 2361 2362 case 'blockquote': 2363 { 2364 body = this.parse(token.tokens); 2365 out += this.renderer.blockquote(body); 2366 continue; 2367 } 2368 2369 case 'list': 2370 { 2371 ordered = token.ordered; 2372 start = token.start; 2373 loose = token.loose; 2374 l2 = token.items.length; 2375 body = ''; 2376 2377 for (j = 0; j < l2; j++) { 2378 item = token.items[j]; 2379 checked = item.checked; 2380 task = item.task; 2381 itemBody = ''; 2382 2383 if (item.task) { 2384 checkbox = this.renderer.checkbox(checked); 2385 2386 if (loose) { 2387 if (item.tokens.length > 0 && item.tokens[0].type === 'paragraph') { 2388 item.tokens[0].text = checkbox + ' ' + item.tokens[0].text; 2389 2390 if (item.tokens[0].tokens && item.tokens[0].tokens.length > 0 && item.tokens[0].tokens[0].type === 'text') { 2391 item.tokens[0].tokens[0].text = checkbox + ' ' + item.tokens[0].tokens[0].text; 2392 } 2393 } else { 2394 item.tokens.unshift({ 2395 type: 'text', 2396 text: checkbox 2397 }); 2398 } 2399 } else { 2400 itemBody += checkbox; 2401 } 2402 } 2403 2404 itemBody += this.parse(item.tokens, loose); 2405 body += this.renderer.listitem(itemBody, task, checked); 2406 } 2407 2408 out += this.renderer.list(body, ordered, start); 2409 continue; 2410 } 2411 2412 case 'html': 2413 { 2414 // TODO parse inline content if parameter markdown=1 2415 out += this.renderer.html(token.text); 2416 continue; 2417 } 2418 2419 case 'paragraph': 2420 { 2421 out += this.renderer.paragraph(this.parseInline(token.tokens)); 2422 continue; 2423 } 2424 2425 case 'text': 2426 { 2427 body = token.tokens ? this.parseInline(token.tokens) : token.text; 2428 2429 while (i + 1 < l && tokens[i + 1].type === 'text') { 2430 token = tokens[++i]; 2431 body += '\n' + (token.tokens ? this.parseInline(token.tokens) : token.text); 2432 } 2433 2434 out += top ? this.renderer.paragraph(body) : body; 2435 continue; 2436 } 2437 2438 default: 2439 { 2440 var errMsg = 'Token with "' + token.type + '" type was not found.'; 2441 2442 if (this.options.silent) { 2443 console.error(errMsg); 2444 return; 2445 } else { 2446 throw new Error(errMsg); 2447 } 2448 } 2449 } 2450 } 2451 2452 return out; 2453 } 2454 /** 2455 * Parse Inline Tokens 2456 */ 2457 ; 2458 2459 _proto.parseInline = function parseInline(tokens, renderer) { 2460 renderer = renderer || this.renderer; 2461 var out = '', 2462 i, 2463 token, 2464 ret; 2465 var l = tokens.length; 2466 2467 for (i = 0; i < l; i++) { 2468 token = tokens[i]; // Run any renderer extensions 2469 2470 if (this.options.extensions && this.options.extensions.renderers && this.options.extensions.renderers[token.type]) { 2471 ret = this.options.extensions.renderers[token.type].call({ 2472 parser: this 2473 }, token); 2474 2475 if (ret !== false || !['escape', 'html', 'link', 'image', 'strong', 'em', 'codespan', 'br', 'del', 'text'].includes(token.type)) { 2476 out += ret || ''; 2477 continue; 2478 } 2479 } 2480 2481 switch (token.type) { 2482 case 'escape': 2483 { 2484 out += renderer.text(token.text); 2485 break; 2486 } 2487 2488 case 'html': 2489 { 2490 out += renderer.html(token.text); 2491 break; 2492 } 2493 2494 case 'link': 2495 { 2496 out += renderer.link(token.href, token.title, this.parseInline(token.tokens, renderer)); 2497 break; 2498 } 2499 2500 case 'image': 2501 { 2502 out += renderer.image(token.href, token.title, token.text); 2503 break; 2504 } 2505 2506 case 'strong': 2507 { 2508 out += renderer.strong(this.parseInline(token.tokens, renderer)); 2509 break; 2510 } 2511 2512 case 'em': 2513 { 2514 out += renderer.em(this.parseInline(token.tokens, renderer)); 2515 break; 2516 } 2517 2518 case 'codespan': 2519 { 2520 out += renderer.codespan(token.text); 2521 break; 2522 } 2523 2524 case 'br': 2525 { 2526 out += renderer.br(); 2527 break; 2528 } 2529 2530 case 'del': 2531 { 2532 out += renderer.del(this.parseInline(token.tokens, renderer)); 2533 break; 2534 } 2535 2536 case 'text': 2537 { 2538 out += renderer.text(token.text); 2539 break; 2540 } 2541 2542 default: 2543 { 2544 var errMsg = 'Token with "' + token.type + '" type was not found.'; 2545 2546 if (this.options.silent) { 2547 console.error(errMsg); 2548 return; 2549 } else { 2550 throw new Error(errMsg); 2551 } 2552 } 2553 } 2554 } 2555 2556 return out; 2557 }; 2558 2559 return Parser; 2560 }(); 2561 2562 var Lexer = Lexer_1; 2563 var Parser = Parser_1; 2564 var Tokenizer = Tokenizer_1; 2565 var Renderer = Renderer_1; 2566 var TextRenderer = TextRenderer_1; 2567 var Slugger = Slugger_1; 2568 var merge = helpers.merge, 2569 checkSanitizeDeprecation = helpers.checkSanitizeDeprecation, 2570 escape = helpers.escape; 2571 var getDefaults = defaults$5.exports.getDefaults, 2572 changeDefaults = defaults$5.exports.changeDefaults, 2573 defaults = defaults$5.exports.defaults; 2574 /** 2575 * Marked 2576 */ 2577 2578 function marked(src, opt, callback) { 2579 // throw error in case of non string input 2580 if (typeof src === 'undefined' || src === null) { 2581 throw new Error('marked(): input parameter is undefined or null'); 2582 } 2583 2584 if (typeof src !== 'string') { 2585 throw new Error('marked(): input parameter is of type ' + Object.prototype.toString.call(src) + ', string expected'); 2586 } 2587 2588 if (typeof opt === 'function') { 2589 callback = opt; 2590 opt = null; 2591 } 2592 2593 opt = merge({}, marked.defaults, opt || {}); 2594 checkSanitizeDeprecation(opt); 2595 2596 if (callback) { 2597 var highlight = opt.highlight; 2598 var tokens; 2599 2600 try { 2601 tokens = Lexer.lex(src, opt); 2602 } catch (e) { 2603 return callback(e); 2604 } 2605 2606 var done = function done(err) { 2607 var out; 2608 2609 if (!err) { 2610 try { 2611 if (opt.walkTokens) { 2612 marked.walkTokens(tokens, opt.walkTokens); 2613 } 2614 2615 out = Parser.parse(tokens, opt); 2616 } catch (e) { 2617 err = e; 2618 } 2619 } 2620 2621 opt.highlight = highlight; 2622 return err ? callback(err) : callback(null, out); 2623 }; 2624 2625 if (!highlight || highlight.length < 3) { 2626 return done(); 2627 } 2628 2629 delete opt.highlight; 2630 if (!tokens.length) return done(); 2631 var pending = 0; 2632 marked.walkTokens(tokens, function (token) { 2633 if (token.type === 'code') { 2634 pending++; 2635 setTimeout(function () { 2636 highlight(token.text, token.lang, function (err, code) { 2637 if (err) { 2638 return done(err); 2639 } 2640 2641 if (code != null && code !== token.text) { 2642 token.text = code; 2643 token.escaped = true; 2644 } 2645 2646 pending--; 2647 2648 if (pending === 0) { 2649 done(); 2650 } 2651 }); 2652 }, 0); 2653 } 2654 }); 2655 2656 if (pending === 0) { 2657 done(); 2658 } 2659 2660 return; 2661 } 2662 2663 try { 2664 var _tokens = Lexer.lex(src, opt); 2665 2666 if (opt.walkTokens) { 2667 marked.walkTokens(_tokens, opt.walkTokens); 2668 } 2669 2670 return Parser.parse(_tokens, opt); 2671 } catch (e) { 2672 e.message += '\nPlease report this to https://github.com/markedjs/marked.'; 2673 2674 if (opt.silent) { 2675 return '<p>An error occurred:</p><pre>' + escape(e.message + '', true) + '</pre>'; 2676 } 2677 2678 throw e; 2679 } 2680 } 2681 /** 2682 * Options 2683 */ 2684 2685 2686 marked.options = marked.setOptions = function (opt) { 2687 merge(marked.defaults, opt); 2688 changeDefaults(marked.defaults); 2689 return marked; 2690 }; 2691 2692 marked.getDefaults = getDefaults; 2693 marked.defaults = defaults; 2694 /** 2695 * Use Extension 2696 */ 2697 2698 marked.use = function () { 2699 var _this = this; 2700 2701 for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { 2702 args[_key] = arguments[_key]; 2703 } 2704 2705 var opts = merge.apply(void 0, [{}].concat(args)); 2706 var extensions = marked.defaults.extensions || { 2707 renderers: {}, 2708 childTokens: {} 2709 }; 2710 var hasExtensions; 2711 args.forEach(function (pack) { 2712 // ==-- Parse "addon" extensions --== // 2713 if (pack.extensions) { 2714 hasExtensions = true; 2715 pack.extensions.forEach(function (ext) { 2716 if (!ext.name) { 2717 throw new Error('extension name required'); 2718 } 2719 2720 if (ext.renderer) { 2721 // Renderer extensions 2722 var prevRenderer = extensions.renderers ? extensions.renderers[ext.name] : null; 2723 2724 if (prevRenderer) { 2725 // Replace extension with func to run new extension but fall back if false 2726 extensions.renderers[ext.name] = function () { 2727 for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { 2728 args[_key2] = arguments[_key2]; 2729 } 2730 2731 var ret = ext.renderer.apply(this, args); 2732 2733 if (ret === false) { 2734 ret = prevRenderer.apply(this, args); 2735 } 2736 2737 return ret; 2738 }; 2739 } else { 2740 extensions.renderers[ext.name] = ext.renderer; 2741 } 2742 } 2743 2744 if (ext.tokenizer) { 2745 // Tokenizer Extensions 2746 if (!ext.level || ext.level !== 'block' && ext.level !== 'inline') { 2747 throw new Error("extension level must be 'block' or 'inline'"); 2748 } 2749 2750 if (extensions[ext.level]) { 2751 extensions[ext.level].unshift(ext.tokenizer); 2752 } else { 2753 extensions[ext.level] = [ext.tokenizer]; 2754 } 2755 2756 if (ext.start) { 2757 // Function to check for start of token 2758 if (ext.level === 'block') { 2759 if (extensions.startBlock) { 2760 extensions.startBlock.push(ext.start); 2761 } else { 2762 extensions.startBlock = [ext.start]; 2763 } 2764 } else if (ext.level === 'inline') { 2765 if (extensions.startInline) { 2766 extensions.startInline.push(ext.start); 2767 } else { 2768 extensions.startInline = [ext.start]; 2769 } 2770 } 2771 } 2772 } 2773 2774 if (ext.childTokens) { 2775 // Child tokens to be visited by walkTokens 2776 extensions.childTokens[ext.name] = ext.childTokens; 2777 } 2778 }); 2779 } // ==-- Parse "overwrite" extensions --== // 2780 2781 2782 if (pack.renderer) { 2783 (function () { 2784 var renderer = marked.defaults.renderer || new Renderer(); 2785 2786 var _loop = function _loop(prop) { 2787 var prevRenderer = renderer[prop]; // Replace renderer with func to run extension, but fall back if false 2788 2789 renderer[prop] = function () { 2790 for (var _len3 = arguments.length, args = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) { 2791 args[_key3] = arguments[_key3]; 2792 } 2793 2794 var ret = pack.renderer[prop].apply(renderer, args); 2795 2796 if (ret === false) { 2797 ret = prevRenderer.apply(renderer, args); 2798 } 2799 2800 return ret; 2801 }; 2802 }; 2803 2804 for (var prop in pack.renderer) { 2805 _loop(prop); 2806 } 2807 2808 opts.renderer = renderer; 2809 })(); 2810 } 2811 2812 if (pack.tokenizer) { 2813 (function () { 2814 var tokenizer = marked.defaults.tokenizer || new Tokenizer(); 2815 2816 var _loop2 = function _loop2(prop) { 2817 var prevTokenizer = tokenizer[prop]; // Replace tokenizer with func to run extension, but fall back if false 2818 2819 tokenizer[prop] = function () { 2820 for (var _len4 = arguments.length, args = new Array(_len4), _key4 = 0; _key4 < _len4; _key4++) { 2821 args[_key4] = arguments[_key4]; 2822 } 2823 2824 var ret = pack.tokenizer[prop].apply(tokenizer, args); 2825 2826 if (ret === false) { 2827 ret = prevTokenizer.apply(tokenizer, args); 2828 } 2829 2830 return ret; 2831 }; 2832 }; 2833 2834 for (var prop in pack.tokenizer) { 2835 _loop2(prop); 2836 } 2837 2838 opts.tokenizer = tokenizer; 2839 })(); 2840 } // ==-- Parse WalkTokens extensions --== // 2841 2842 2843 if (pack.walkTokens) { 2844 var walkTokens = marked.defaults.walkTokens; 2845 2846 opts.walkTokens = function (token) { 2847 pack.walkTokens.call(_this, token); 2848 2849 if (walkTokens) { 2850 walkTokens(token); 2851 } 2852 }; 2853 } 2854 2855 if (hasExtensions) { 2856 opts.extensions = extensions; 2857 } 2858 2859 marked.setOptions(opts); 2860 }); 2861 }; 2862 /** 2863 * Run callback for every token 2864 */ 2865 2866 2867 marked.walkTokens = function (tokens, callback) { 2868 var _loop3 = function _loop3() { 2869 var token = _step.value; 2870 callback(token); 2871 2872 switch (token.type) { 2873 case 'table': 2874 { 2875 for (var _iterator2 = _createForOfIteratorHelperLoose(token.header), _step2; !(_step2 = _iterator2()).done;) { 2876 var cell = _step2.value; 2877 marked.walkTokens(cell.tokens, callback); 2878 } 2879 2880 for (var _iterator3 = _createForOfIteratorHelperLoose(token.rows), _step3; !(_step3 = _iterator3()).done;) { 2881 var row = _step3.value; 2882 2883 for (var _iterator4 = _createForOfIteratorHelperLoose(row), _step4; !(_step4 = _iterator4()).done;) { 2884 var _cell = _step4.value; 2885 marked.walkTokens(_cell.tokens, callback); 2886 } 2887 } 2888 2889 break; 2890 } 2891 2892 case 'list': 2893 { 2894 marked.walkTokens(token.items, callback); 2895 break; 2896 } 2897 2898 default: 2899 { 2900 if (marked.defaults.extensions && marked.defaults.extensions.childTokens && marked.defaults.extensions.childTokens[token.type]) { 2901 // Walk any extensions 2902 marked.defaults.extensions.childTokens[token.type].forEach(function (childTokens) { 2903 marked.walkTokens(token[childTokens], callback); 2904 }); 2905 } else if (token.tokens) { 2906 marked.walkTokens(token.tokens, callback); 2907 } 2908 } 2909 } 2910 }; 2911 2912 for (var _iterator = _createForOfIteratorHelperLoose(tokens), _step; !(_step = _iterator()).done;) { 2913 _loop3(); 2914 } 2915 }; 2916 /** 2917 * Parse Inline 2918 */ 2919 2920 2921 marked.parseInline = function (src, opt) { 2922 // throw error in case of non string input 2923 if (typeof src === 'undefined' || src === null) { 2924 throw new Error('marked.parseInline(): input parameter is undefined or null'); 2925 } 2926 2927 if (typeof src !== 'string') { 2928 throw new Error('marked.parseInline(): input parameter is of type ' + Object.prototype.toString.call(src) + ', string expected'); 2929 } 2930 2931 opt = merge({}, marked.defaults, opt || {}); 2932 checkSanitizeDeprecation(opt); 2933 2934 try { 2935 var tokens = Lexer.lexInline(src, opt); 2936 2937 if (opt.walkTokens) { 2938 marked.walkTokens(tokens, opt.walkTokens); 2939 } 2940 2941 return Parser.parseInline(tokens, opt); 2942 } catch (e) { 2943 e.message += '\nPlease report this to https://github.com/markedjs/marked.'; 2944 2945 if (opt.silent) { 2946 return '<p>An error occurred:</p><pre>' + escape(e.message + '', true) + '</pre>'; 2947 } 2948 2949 throw e; 2950 } 2951 }; 2952 /** 2953 * Expose 2954 */ 2955 2956 2957 marked.Parser = Parser; 2958 marked.parser = Parser.parse; 2959 marked.Renderer = Renderer; 2960 marked.TextRenderer = TextRenderer; 2961 marked.Lexer = Lexer; 2962 marked.lexer = Lexer.lex; 2963 marked.Tokenizer = Tokenizer; 2964 marked.Slugger = Slugger; 2965 marked.parse = marked; 2966 var marked_1 = marked; 2967 2968 return marked_1; 2969 2970}))); 2971