annotatable-html 0.0.0-stage → 1.38.3

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