@@ -14,21 +14,21 @@ export type MaybePromise = void | Promise<void>;
14
14
type UnknownFunction = ( ...args : unknown [ ] ) => unknown ;
15
15
type GenericRendererFunction = ( ...args : unknown [ ] ) => string | false ;
16
16
17
- export class Marked {
18
- defaults = _getDefaults ( ) ;
17
+ export class Marked < ParserOutput = string , RendererOutput = string > {
18
+ defaults = _getDefaults < ParserOutput , RendererOutput > ( ) ;
19
19
options = this . setOptions ;
20
20
21
21
parse = this . parseMarkdown ( true ) ;
22
22
parseInline = this . parseMarkdown ( false ) ;
23
23
24
- Parser = _Parser ;
25
- Renderer = _Renderer ;
26
- TextRenderer = _TextRenderer ;
24
+ Parser = _Parser < ParserOutput , RendererOutput > ;
25
+ Renderer = _Renderer < ParserOutput , RendererOutput > ;
26
+ TextRenderer = _TextRenderer < RendererOutput > ;
27
27
Lexer = _Lexer ;
28
- Tokenizer = _Tokenizer ;
29
- Hooks = _Hooks ;
28
+ Tokenizer = _Tokenizer < ParserOutput , RendererOutput > ;
29
+ Hooks = _Hooks < ParserOutput , RendererOutput > ;
30
30
31
- constructor ( ...args : MarkedExtension [ ] ) {
31
+ constructor ( ...args : MarkedExtension < ParserOutput , RendererOutput > [ ] ) {
32
32
this . use ( ...args ) ;
33
33
}
34
34
@@ -73,12 +73,12 @@ export class Marked {
73
73
return values ;
74
74
}
75
75
76
- use ( ...args : MarkedExtension [ ] ) {
77
- const extensions : MarkedOptions [ 'extensions' ] = this . defaults . extensions || { renderers : { } , childTokens : { } } ;
76
+ use ( ...args : MarkedExtension < ParserOutput , RendererOutput > [ ] ) {
77
+ const extensions : MarkedOptions < ParserOutput , RendererOutput > [ 'extensions' ] = this . defaults . extensions || { renderers : { } , childTokens : { } } ;
78
78
79
79
args . forEach ( ( pack ) => {
80
80
// copy options to new object
81
- const opts = { ...pack } as MarkedOptions ;
81
+ const opts = { ...pack } as MarkedOptions < ParserOutput , RendererOutput > ;
82
82
83
83
// set async to true if it was set to true before
84
84
opts . async = this . defaults . async || opts . async || false ;
@@ -139,7 +139,7 @@ export class Marked {
139
139
140
140
// ==-- Parse "overwrite" extensions --== //
141
141
if ( pack . renderer ) {
142
- const renderer = this . defaults . renderer || new _Renderer ( this . defaults ) ;
142
+ const renderer = this . defaults . renderer || new _Renderer < ParserOutput , RendererOutput > ( this . defaults ) ;
143
143
for ( const prop in pack . renderer ) {
144
144
if ( ! ( prop in renderer ) ) {
145
145
throw new Error ( `renderer '${ prop } ' does not exist` ) ;
@@ -148,7 +148,7 @@ export class Marked {
148
148
// ignore options property
149
149
continue ;
150
150
}
151
- const rendererProp = prop as Exclude < keyof _Renderer , 'options' | 'parser' > ;
151
+ const rendererProp = prop as Exclude < keyof _Renderer < ParserOutput , RendererOutput > , 'options' | 'parser' > ;
152
152
const rendererFunc = pack . renderer [ rendererProp ] as GenericRendererFunction ;
153
153
const prevRenderer = renderer [ rendererProp ] as GenericRendererFunction ;
154
154
// Replace renderer with func to run extension, but fall back if false
@@ -157,13 +157,13 @@ export class Marked {
157
157
if ( ret === false ) {
158
158
ret = prevRenderer . apply ( renderer , args ) ;
159
159
}
160
- return ret || '' ;
160
+ return ( ret || '' ) as RendererOutput ;
161
161
} ;
162
162
}
163
163
opts . renderer = renderer ;
164
164
}
165
165
if ( pack . tokenizer ) {
166
- const tokenizer = this . defaults . tokenizer || new _Tokenizer ( this . defaults ) ;
166
+ const tokenizer = this . defaults . tokenizer || new _Tokenizer < ParserOutput , RendererOutput > ( this . defaults ) ;
167
167
for ( const prop in pack . tokenizer ) {
168
168
if ( ! ( prop in tokenizer ) ) {
169
169
throw new Error ( `tokenizer '${ prop } ' does not exist` ) ;
@@ -172,7 +172,7 @@ export class Marked {
172
172
// ignore options, rules, and lexer properties
173
173
continue ;
174
174
}
175
- const tokenizerProp = prop as Exclude < keyof _Tokenizer , 'options' | 'rules' | 'lexer' > ;
175
+ const tokenizerProp = prop as Exclude < keyof _Tokenizer < ParserOutput , RendererOutput > , 'options' | 'rules' | 'lexer' > ;
176
176
const tokenizerFunc = pack . tokenizer [ tokenizerProp ] as UnknownFunction ;
177
177
const prevTokenizer = tokenizer [ tokenizerProp ] as UnknownFunction ;
178
178
// Replace tokenizer with func to run extension, but fall back if false
@@ -190,7 +190,7 @@ export class Marked {
190
190
191
191
// ==-- Parse Hooks extensions --== //
192
192
if ( pack . hooks ) {
193
- const hooks = this . defaults . hooks || new _Hooks ( ) ;
193
+ const hooks = this . defaults . hooks || new _Hooks < ParserOutput , RendererOutput > ( ) ;
194
194
for ( const prop in pack . hooks ) {
195
195
if ( ! ( prop in hooks ) ) {
196
196
throw new Error ( `hook '${ prop } ' does not exist` ) ;
@@ -199,7 +199,7 @@ export class Marked {
199
199
// ignore options and block properties
200
200
continue ;
201
201
}
202
- const hooksProp = prop as Exclude < keyof _Hooks , 'options' | 'block' > ;
202
+ const hooksProp = prop as Exclude < keyof _Hooks < ParserOutput , RendererOutput > , 'options' | 'block' > ;
203
203
const hooksFunc = pack . hooks [ hooksProp ] as UnknownFunction ;
204
204
const prevHook = hooks [ hooksProp ] as UnknownFunction ;
205
205
if ( _Hooks . passThroughHooks . has ( prop ) ) {
@@ -248,28 +248,28 @@ export class Marked {
248
248
return this ;
249
249
}
250
250
251
- setOptions ( opt : MarkedOptions ) {
251
+ setOptions ( opt : MarkedOptions < ParserOutput , RendererOutput > ) {
252
252
this . defaults = { ...this . defaults , ...opt } ;
253
253
return this ;
254
254
}
255
255
256
- lexer ( src : string , options ?: MarkedOptions ) {
256
+ lexer ( src : string , options ?: MarkedOptions < ParserOutput , RendererOutput > ) {
257
257
return _Lexer . lex ( src , options ?? this . defaults ) ;
258
258
}
259
259
260
- parser ( tokens : Token [ ] , options ?: MarkedOptions ) {
261
- return _Parser . parse ( tokens , options ?? this . defaults ) ;
260
+ parser ( tokens : Token [ ] , options ?: MarkedOptions < ParserOutput , RendererOutput > ) {
261
+ return _Parser . parse < ParserOutput , RendererOutput > ( tokens , options ?? this . defaults ) ;
262
262
}
263
263
264
264
private parseMarkdown ( blockType : boolean ) {
265
265
type overloadedParse = {
266
- ( src : string , options : MarkedOptions & { async : true } ) : Promise < string > ;
267
- ( src : string , options : MarkedOptions & { async : false } ) : string ;
268
- ( src : string , options ?: MarkedOptions | null ) : string | Promise < string > ;
266
+ ( src : string , options : MarkedOptions < ParserOutput , RendererOutput > & { async : true } ) : Promise < ParserOutput > ;
267
+ ( src : string , options : MarkedOptions < ParserOutput , RendererOutput > & { async : false } ) : ParserOutput ;
268
+ ( src : string , options ?: MarkedOptions < ParserOutput , RendererOutput > | null ) : ParserOutput | Promise < ParserOutput > ;
269
269
} ;
270
270
271
271
// eslint-disable-next-line @typescript-eslint/no-explicit-any
272
- const parse : overloadedParse = ( src : string , options ?: MarkedOptions | null ) : any => {
272
+ const parse : overloadedParse = ( src : string , options ?: MarkedOptions < ParserOutput , RendererOutput > | null ) : any => {
273
273
const origOpt = { ...options } ;
274
274
const opt = { ...this . defaults , ...origOpt } ;
275
275
@@ -320,7 +320,7 @@ export class Marked {
320
320
}
321
321
let html = parser ( tokens , opt ) ;
322
322
if ( opt . hooks ) {
323
- html = opt . hooks . postprocess ( html ) as string ;
323
+ html = opt . hooks . postprocess ( html ) ;
324
324
}
325
325
return html ;
326
326
} catch ( e ) {
0 commit comments