@@ -6,7 +6,7 @@ import { _Renderer } from './Renderer.ts';
66import { _Tokenizer } from './Tokenizer.ts' ;
77import { _TextRenderer } from './TextRenderer.ts' ;
88import { escape } from './helpers.ts' ;
9- import type { MarkedExtension , MarkedOptions } from './MarkedOptions.ts' ;
9+ import { tokenizerBlockPositions , tokenizerInlinePositions , type MarkedExtension , type MarkedOptions } from './MarkedOptions.ts' ;
1010import type { Token , Tokens , TokensList } from './Tokens.ts' ;
1111
1212export type MaybePromise = void | Promise < void > ;
@@ -74,7 +74,7 @@ export class Marked {
7474 }
7575
7676 use ( ...args : MarkedExtension [ ] ) {
77- const extensions : MarkedOptions [ 'extensions' ] = this . defaults . extensions || { renderers : { } , childTokens : { } } ;
77+ const extensions : MarkedOptions [ 'extensions' ] = this . defaults . extensions || { renderers : { } , childTokens : { } , tokenizers : { } } ;
7878
7979 args . forEach ( ( pack ) => {
8080 // copy options to new object
@@ -105,23 +105,26 @@ export class Marked {
105105 }
106106 }
107107 if ( 'tokenizer' in ext ) { // Tokenizer Extensions
108- if ( ! ext . level || ( ext . level !== 'block' && ext . level !== 'inline' ) ) {
108+ if ( ext . level && ( ext . level !== 'block' && ext . level !== 'inline' ) ) {
109109 throw new Error ( "extension level must be 'block' or 'inline'" ) ;
110110 }
111- const extLevel = extensions [ ext . level ] ;
112- if ( extLevel ) {
113- extLevel . unshift ( ext . tokenizer ) ;
114- } else {
115- extensions [ ext . level ] = [ ext . tokenizer ] ;
111+ if ( ext . position && ! [ ... tokenizerBlockPositions , ... tokenizerInlinePositions ] . includes ( ext . position ) ) {
112+ throw new Error ( `extension position must be one of ' ${ tokenizerBlockPositions . join ( "', '" ) } ', ' ${ tokenizerInlinePositions . join ( "', '" ) } '` ) ;
113+ }
114+ if ( ! ext . level && ! ext . position ) {
115+ throw new Error ( 'extension level or position is required' ) ;
116116 }
117+ const position = ext . position || ( ext . level === 'block' ? tokenizerBlockPositions [ 0 ] : tokenizerInlinePositions [ 0 ] ) ;
118+ extensions . tokenizers [ position ] = extensions . tokenizers [ position ] || [ ] ;
119+ extensions . tokenizers [ position ] . unshift ( ext . tokenizer ) ;
117120 if ( ext . start ) { // Function to check for start of token
118- if ( ext . level === 'block' ) {
121+ if ( tokenizerBlockPositions . includes ( position as typeof tokenizerBlockPositions [ number ] ) ) {
119122 if ( extensions . startBlock ) {
120123 extensions . startBlock . push ( ext . start ) ;
121124 } else {
122125 extensions . startBlock = [ ext . start ] ;
123126 }
124- } else if ( ext . level === 'inline' ) {
127+ } else if ( tokenizerInlinePositions . includes ( position as typeof tokenizerInlinePositions [ number ] ) ) {
125128 if ( extensions . startInline ) {
126129 extensions . startInline . push ( ext . start ) ;
127130 } else {
0 commit comments