marked 7.0.1 → 7.0.2
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/lib/marked.cjs +34 -24
- package/lib/marked.cjs.map +1 -1
- package/lib/marked.d.ts +111 -110
- package/lib/marked.esm.js +34 -24
- package/lib/marked.esm.js.map +1 -1
- package/lib/marked.umd.js +34 -24
- package/lib/marked.umd.js.map +1 -1
- package/marked.min.js +3 -3
- package/package.json +4 -5
- package/src/Hooks.ts +0 -29
- package/src/Instance.ts +0 -381
- package/src/Lexer.ts +0 -517
- package/src/MarkedOptions.ts +0 -212
- package/src/Parser.ts +0 -291
- package/src/Renderer.ts +0 -167
- package/src/Slugger.ts +0 -51
- package/src/TextRenderer.ts +0 -42
- package/src/Tokenizer.ts +0 -810
- package/src/Tokens.ts +0 -199
- package/src/defaults.ts +0 -35
- package/src/helpers.ts +0 -264
- package/src/marked.ts +0 -143
- package/src/rules.ts +0 -380
package/src/Instance.ts
DELETED
|
@@ -1,381 +0,0 @@
|
|
|
1
|
-
import { _getDefaults } from './defaults.js';
|
|
2
|
-
import { _Lexer } from './Lexer.ts';
|
|
3
|
-
import { _Parser } from './Parser.ts';
|
|
4
|
-
import { _Hooks } from './Hooks.ts';
|
|
5
|
-
import { _Renderer } from './Renderer.ts';
|
|
6
|
-
import { _Tokenizer } from './Tokenizer.ts';
|
|
7
|
-
import { _TextRenderer } from './TextRenderer.ts';
|
|
8
|
-
import { _Slugger } from './Slugger.ts';
|
|
9
|
-
import {
|
|
10
|
-
checkDeprecations,
|
|
11
|
-
escape
|
|
12
|
-
} from './helpers.ts';
|
|
13
|
-
import type { MarkedExtension, MarkedOptions } from './MarkedOptions.ts';
|
|
14
|
-
import type { Token, TokensList } from './Tokens.ts';
|
|
15
|
-
|
|
16
|
-
export type ResultCallback = (error: Error | null, parseResult?: string) => undefined | void;
|
|
17
|
-
|
|
18
|
-
export class Marked {
|
|
19
|
-
defaults = _getDefaults();
|
|
20
|
-
options = this.setOptions;
|
|
21
|
-
|
|
22
|
-
parse = this.#parseMarkdown(_Lexer.lex, _Parser.parse);
|
|
23
|
-
parseInline = this.#parseMarkdown(_Lexer.lexInline, _Parser.parseInline);
|
|
24
|
-
|
|
25
|
-
Parser = _Parser;
|
|
26
|
-
parser = _Parser.parse;
|
|
27
|
-
Renderer = _Renderer;
|
|
28
|
-
TextRenderer = _TextRenderer;
|
|
29
|
-
Lexer = _Lexer;
|
|
30
|
-
lexer = _Lexer.lex;
|
|
31
|
-
Tokenizer = _Tokenizer;
|
|
32
|
-
Slugger = _Slugger;
|
|
33
|
-
Hooks = _Hooks;
|
|
34
|
-
|
|
35
|
-
constructor(...args: MarkedExtension[]) {
|
|
36
|
-
this.use(...args);
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
/**
|
|
40
|
-
* Run callback for every token
|
|
41
|
-
*/
|
|
42
|
-
walkTokens <T = void>(tokens: Token[] | TokensList, callback: (token: Token) => T | T[]) {
|
|
43
|
-
let values: T[] = [];
|
|
44
|
-
for (const token of tokens) {
|
|
45
|
-
values = values.concat(callback.call(this, token));
|
|
46
|
-
switch (token.type) {
|
|
47
|
-
case 'table': {
|
|
48
|
-
for (const cell of token.header) {
|
|
49
|
-
values = values.concat(this.walkTokens(cell.tokens!, callback));
|
|
50
|
-
}
|
|
51
|
-
for (const row of token.rows) {
|
|
52
|
-
for (const cell of row) {
|
|
53
|
-
values = values.concat(this.walkTokens(cell.tokens!, callback));
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
break;
|
|
57
|
-
}
|
|
58
|
-
case 'list': {
|
|
59
|
-
values = values.concat(this.walkTokens(token.items, callback));
|
|
60
|
-
break;
|
|
61
|
-
}
|
|
62
|
-
default: {
|
|
63
|
-
if (this.defaults.extensions && this.defaults.extensions.childTokens && this.defaults.extensions.childTokens[token.type]) { // Walk any extensions
|
|
64
|
-
this.defaults.extensions.childTokens[token.type].forEach((childTokens) => {
|
|
65
|
-
values = values.concat(this.walkTokens(token[childTokens], callback));
|
|
66
|
-
});
|
|
67
|
-
} else if (token.tokens) {
|
|
68
|
-
values = values.concat(this.walkTokens(token.tokens, callback));
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
return values;
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
use(...args: MarkedExtension[]) {
|
|
77
|
-
const extensions: NonNullable<MarkedOptions['extensions']> = this.defaults.extensions || { renderers: {}, childTokens: {} } as NonNullable<MarkedOptions['extensions']>;
|
|
78
|
-
|
|
79
|
-
args.forEach((pack) => {
|
|
80
|
-
// copy options to new object
|
|
81
|
-
const opts = { ...pack } as MarkedOptions;
|
|
82
|
-
|
|
83
|
-
// set async to true if it was set to true before
|
|
84
|
-
opts.async = this.defaults.async || opts.async || false;
|
|
85
|
-
|
|
86
|
-
// ==-- Parse "addon" extensions --== //
|
|
87
|
-
if (pack.extensions) {
|
|
88
|
-
pack.extensions.forEach((ext) => {
|
|
89
|
-
if (!ext.name) {
|
|
90
|
-
throw new Error('extension name required');
|
|
91
|
-
}
|
|
92
|
-
if ('renderer' in ext) { // Renderer extensions
|
|
93
|
-
const prevRenderer = extensions.renderers[ext.name];
|
|
94
|
-
if (prevRenderer) {
|
|
95
|
-
// Replace extension with func to run new extension but fall back if false
|
|
96
|
-
extensions.renderers[ext.name] = function(...args) {
|
|
97
|
-
let ret = ext.renderer.apply(this, args);
|
|
98
|
-
if (ret === false) {
|
|
99
|
-
ret = prevRenderer.apply(this, args);
|
|
100
|
-
}
|
|
101
|
-
return ret;
|
|
102
|
-
};
|
|
103
|
-
} else {
|
|
104
|
-
extensions.renderers[ext.name] = ext.renderer;
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
if ('tokenizer' in ext) { // Tokenizer Extensions
|
|
108
|
-
if (!ext.level || (ext.level !== 'block' && ext.level !== 'inline')) {
|
|
109
|
-
throw new Error("extension level must be 'block' or 'inline'");
|
|
110
|
-
}
|
|
111
|
-
if (extensions[ext.level]) {
|
|
112
|
-
extensions[ext.level].unshift(ext.tokenizer);
|
|
113
|
-
} else {
|
|
114
|
-
extensions[ext.level] = [ext.tokenizer];
|
|
115
|
-
}
|
|
116
|
-
if (ext.start) { // Function to check for start of token
|
|
117
|
-
if (ext.level === 'block') {
|
|
118
|
-
if (extensions.startBlock) {
|
|
119
|
-
extensions.startBlock.push(ext.start!);
|
|
120
|
-
} else {
|
|
121
|
-
extensions.startBlock = [ext.start!];
|
|
122
|
-
}
|
|
123
|
-
} else if (ext.level === 'inline') {
|
|
124
|
-
if (extensions.startInline) {
|
|
125
|
-
extensions.startInline.push(ext.start!);
|
|
126
|
-
} else {
|
|
127
|
-
extensions.startInline = [ext.start!];
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
if ('childTokens' in ext && ext.childTokens) { // Child tokens to be visited by walkTokens
|
|
133
|
-
extensions.childTokens[ext.name] = ext.childTokens;
|
|
134
|
-
}
|
|
135
|
-
});
|
|
136
|
-
opts.extensions = extensions;
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
// ==-- Parse "overwrite" extensions --== //
|
|
140
|
-
if (pack.renderer) {
|
|
141
|
-
const renderer = this.defaults.renderer || new _Renderer(this.defaults);
|
|
142
|
-
for (const prop in pack.renderer) {
|
|
143
|
-
const prevRenderer = renderer[prop];
|
|
144
|
-
// Replace renderer with func to run extension, but fall back if false
|
|
145
|
-
renderer[prop] = (...args: unknown[]) => {
|
|
146
|
-
let ret = pack.renderer![prop].apply(renderer, args);
|
|
147
|
-
if (ret === false) {
|
|
148
|
-
ret = prevRenderer.apply(renderer, args);
|
|
149
|
-
}
|
|
150
|
-
return ret;
|
|
151
|
-
};
|
|
152
|
-
}
|
|
153
|
-
opts.renderer = renderer;
|
|
154
|
-
}
|
|
155
|
-
if (pack.tokenizer) {
|
|
156
|
-
const tokenizer = this.defaults.tokenizer || new _Tokenizer(this.defaults);
|
|
157
|
-
for (const prop in pack.tokenizer) {
|
|
158
|
-
const prevTokenizer = tokenizer[prop];
|
|
159
|
-
// Replace tokenizer with func to run extension, but fall back if false
|
|
160
|
-
tokenizer[prop] = (...args: unknown[]) => {
|
|
161
|
-
let ret = pack.tokenizer![prop].apply(tokenizer, args);
|
|
162
|
-
if (ret === false) {
|
|
163
|
-
ret = prevTokenizer.apply(tokenizer, args);
|
|
164
|
-
}
|
|
165
|
-
return ret;
|
|
166
|
-
};
|
|
167
|
-
}
|
|
168
|
-
opts.tokenizer = tokenizer;
|
|
169
|
-
}
|
|
170
|
-
|
|
171
|
-
// ==-- Parse Hooks extensions --== //
|
|
172
|
-
if (pack.hooks) {
|
|
173
|
-
const hooks = this.defaults.hooks || new _Hooks();
|
|
174
|
-
for (const prop in pack.hooks) {
|
|
175
|
-
const prevHook = hooks[prop];
|
|
176
|
-
if (_Hooks.passThroughHooks.has(prop)) {
|
|
177
|
-
hooks[prop as 'preprocess' | 'postprocess'] = (arg: string | undefined) => {
|
|
178
|
-
if (this.defaults.async) {
|
|
179
|
-
return Promise.resolve(pack.hooks![prop].call(hooks, arg)).then(ret => {
|
|
180
|
-
return prevHook.call(hooks, ret);
|
|
181
|
-
});
|
|
182
|
-
}
|
|
183
|
-
|
|
184
|
-
const ret = pack.hooks![prop].call(hooks, arg);
|
|
185
|
-
return prevHook.call(hooks, ret);
|
|
186
|
-
};
|
|
187
|
-
} else {
|
|
188
|
-
hooks[prop] = (...args) => {
|
|
189
|
-
let ret = pack.hooks![prop].apply(hooks, args);
|
|
190
|
-
if (ret === false) {
|
|
191
|
-
ret = prevHook.apply(hooks, args);
|
|
192
|
-
}
|
|
193
|
-
return ret;
|
|
194
|
-
};
|
|
195
|
-
}
|
|
196
|
-
}
|
|
197
|
-
opts.hooks = hooks;
|
|
198
|
-
}
|
|
199
|
-
|
|
200
|
-
// ==-- Parse WalkTokens extensions --== //
|
|
201
|
-
if (pack.walkTokens) {
|
|
202
|
-
const walkTokens = this.defaults.walkTokens;
|
|
203
|
-
opts.walkTokens = function(token) {
|
|
204
|
-
let values: Array<Promise<void> | void> = [];
|
|
205
|
-
values.push(pack.walkTokens!.call(this, token));
|
|
206
|
-
if (walkTokens) {
|
|
207
|
-
values = values.concat(walkTokens.call(this, token));
|
|
208
|
-
}
|
|
209
|
-
return values;
|
|
210
|
-
};
|
|
211
|
-
}
|
|
212
|
-
|
|
213
|
-
this.defaults = { ...this.defaults, ...opts };
|
|
214
|
-
});
|
|
215
|
-
|
|
216
|
-
return this;
|
|
217
|
-
}
|
|
218
|
-
|
|
219
|
-
setOptions(opt) {
|
|
220
|
-
this.defaults = { ...this.defaults, ...opt };
|
|
221
|
-
return this;
|
|
222
|
-
}
|
|
223
|
-
|
|
224
|
-
#parseMarkdown(lexer: (src: string, options?: MarkedOptions) => TokensList | Token[], parser: (tokens: Token[], options?: MarkedOptions) => string | undefined) {
|
|
225
|
-
return (src: string, optOrCallback?: MarkedOptions | ResultCallback | undefined | null, callback?: ResultCallback | undefined): string | Promise<string | undefined> | undefined => {
|
|
226
|
-
if (typeof optOrCallback === 'function') {
|
|
227
|
-
callback = optOrCallback;
|
|
228
|
-
optOrCallback = null;
|
|
229
|
-
}
|
|
230
|
-
|
|
231
|
-
const origOpt = { ...optOrCallback };
|
|
232
|
-
const opt = { ...this.defaults, ...origOpt };
|
|
233
|
-
const throwError = this.#onError(!!opt.silent, !!opt.async, callback);
|
|
234
|
-
|
|
235
|
-
// throw error in case of non string input
|
|
236
|
-
if (typeof src === 'undefined' || src === null) {
|
|
237
|
-
return throwError(new Error('marked(): input parameter is undefined or null'));
|
|
238
|
-
}
|
|
239
|
-
if (typeof src !== 'string') {
|
|
240
|
-
return throwError(new Error('marked(): input parameter is of type '
|
|
241
|
-
+ Object.prototype.toString.call(src) + ', string expected'));
|
|
242
|
-
}
|
|
243
|
-
|
|
244
|
-
checkDeprecations(opt, callback);
|
|
245
|
-
|
|
246
|
-
if (opt.hooks) {
|
|
247
|
-
opt.hooks.options = opt;
|
|
248
|
-
}
|
|
249
|
-
|
|
250
|
-
if (callback) {
|
|
251
|
-
const highlight = opt.highlight;
|
|
252
|
-
let tokens: TokensList | Token[];
|
|
253
|
-
|
|
254
|
-
try {
|
|
255
|
-
if (opt.hooks) {
|
|
256
|
-
src = opt.hooks.preprocess(src);
|
|
257
|
-
}
|
|
258
|
-
tokens = lexer(src, opt);
|
|
259
|
-
} catch (e) {
|
|
260
|
-
return throwError(e as Error);
|
|
261
|
-
}
|
|
262
|
-
|
|
263
|
-
const done = (err?: Error) => {
|
|
264
|
-
let out;
|
|
265
|
-
|
|
266
|
-
if (!err) {
|
|
267
|
-
try {
|
|
268
|
-
if (opt.walkTokens) {
|
|
269
|
-
this.walkTokens(tokens, opt.walkTokens);
|
|
270
|
-
}
|
|
271
|
-
out = parser(tokens, opt)!;
|
|
272
|
-
if (opt.hooks) {
|
|
273
|
-
out = opt.hooks.postprocess(out);
|
|
274
|
-
}
|
|
275
|
-
} catch (e) {
|
|
276
|
-
err = e as Error;
|
|
277
|
-
}
|
|
278
|
-
}
|
|
279
|
-
|
|
280
|
-
opt.highlight = highlight;
|
|
281
|
-
|
|
282
|
-
return err
|
|
283
|
-
? throwError(err)
|
|
284
|
-
: callback!(null, out) as undefined;
|
|
285
|
-
};
|
|
286
|
-
|
|
287
|
-
if (!highlight || highlight.length < 3) {
|
|
288
|
-
return done();
|
|
289
|
-
}
|
|
290
|
-
|
|
291
|
-
delete opt.highlight;
|
|
292
|
-
|
|
293
|
-
if (!tokens.length) return done();
|
|
294
|
-
|
|
295
|
-
let pending = 0;
|
|
296
|
-
this.walkTokens(tokens, (token) => {
|
|
297
|
-
if (token.type === 'code') {
|
|
298
|
-
pending++;
|
|
299
|
-
setTimeout(() => {
|
|
300
|
-
highlight(token.text, token.lang, (err, code) => {
|
|
301
|
-
if (err) {
|
|
302
|
-
return done(err);
|
|
303
|
-
}
|
|
304
|
-
if (code != null && code !== token.text) {
|
|
305
|
-
token.text = code;
|
|
306
|
-
token.escaped = true;
|
|
307
|
-
}
|
|
308
|
-
|
|
309
|
-
pending--;
|
|
310
|
-
if (pending === 0) {
|
|
311
|
-
done();
|
|
312
|
-
}
|
|
313
|
-
});
|
|
314
|
-
}, 0);
|
|
315
|
-
}
|
|
316
|
-
});
|
|
317
|
-
|
|
318
|
-
if (pending === 0) {
|
|
319
|
-
done();
|
|
320
|
-
}
|
|
321
|
-
|
|
322
|
-
return;
|
|
323
|
-
}
|
|
324
|
-
|
|
325
|
-
if (opt.async) {
|
|
326
|
-
return Promise.resolve(opt.hooks ? opt.hooks.preprocess(src) : src)
|
|
327
|
-
.then(src => lexer(src, opt))
|
|
328
|
-
.then(tokens => opt.walkTokens ? Promise.all(this.walkTokens(tokens, opt.walkTokens)).then(() => tokens) : tokens)
|
|
329
|
-
.then(tokens => parser(tokens, opt))
|
|
330
|
-
.then(html => opt.hooks ? opt.hooks.postprocess(html) : html)
|
|
331
|
-
.catch(throwError);
|
|
332
|
-
}
|
|
333
|
-
|
|
334
|
-
try {
|
|
335
|
-
if (opt.hooks) {
|
|
336
|
-
src = opt.hooks.preprocess(src);
|
|
337
|
-
}
|
|
338
|
-
const tokens = lexer(src, opt);
|
|
339
|
-
if (opt.walkTokens) {
|
|
340
|
-
this.walkTokens(tokens, opt.walkTokens);
|
|
341
|
-
}
|
|
342
|
-
let html = parser(tokens, opt);
|
|
343
|
-
if (opt.hooks) {
|
|
344
|
-
html = opt.hooks.postprocess(html);
|
|
345
|
-
}
|
|
346
|
-
return html;
|
|
347
|
-
} catch (e) {
|
|
348
|
-
return throwError(e as Error);
|
|
349
|
-
}
|
|
350
|
-
};
|
|
351
|
-
}
|
|
352
|
-
|
|
353
|
-
#onError(silent: boolean, async: boolean, callback?: ResultCallback) {
|
|
354
|
-
return (e: Error): string | Promise<string> | undefined => {
|
|
355
|
-
e.message += '\nPlease report this to https://github.com/markedjs/marked.';
|
|
356
|
-
|
|
357
|
-
if (silent) {
|
|
358
|
-
const msg = '<p>An error occurred:</p><pre>'
|
|
359
|
-
+ escape(e.message + '', true)
|
|
360
|
-
+ '</pre>';
|
|
361
|
-
if (async) {
|
|
362
|
-
return Promise.resolve(msg);
|
|
363
|
-
}
|
|
364
|
-
if (callback) {
|
|
365
|
-
callback(null, msg);
|
|
366
|
-
return;
|
|
367
|
-
}
|
|
368
|
-
return msg;
|
|
369
|
-
}
|
|
370
|
-
|
|
371
|
-
if (async) {
|
|
372
|
-
return Promise.reject(e);
|
|
373
|
-
}
|
|
374
|
-
if (callback) {
|
|
375
|
-
callback(e);
|
|
376
|
-
return;
|
|
377
|
-
}
|
|
378
|
-
throw e;
|
|
379
|
-
};
|
|
380
|
-
}
|
|
381
|
-
}
|