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.
- package/LICENSE +21 -0
- package/README.md +289 -2
- package/agent/annot_answer.js +7 -0
- package/agent/annot_edit.js +6 -0
- package/agent/annot_poll.js +12 -0
- package/agent/annot_read.js +5 -0
- package/agent/annot_reply.js +50 -0
- package/bin/cli.js +239 -0
- package/lib/core.js +2198 -0
- package/lib/lang-en.js +462 -0
- package/lib/serve.js +293 -0
- package/lib/vendor/marked.cjs +2811 -0
- package/lib/vendor/temml.cjs +14710 -0
- package/package.json +48 -4
- package/templates/AGENTS.md +107 -0
- package/templates/SKILL.md +99 -0
- package/templates/annotatable-doc.html +5708 -0
- package/templates/annotatable.theme.css +28 -0
- package/templates/commands/html4agent.md +37 -0
- package/templates/theme-studio.html +330 -0
|
@@ -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
|
+
'&': '&',
|
|
129
|
+
'<': '<',
|
|
130
|
+
'>': '>',
|
|
131
|
+
'"': '"',
|
|
132
|
+
"'": '''
|
|
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;
|