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