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/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
- }