Skip to content

Commit d26b62e

Browse files
committed
runExtensions
1 parent 9f2926c commit d26b62e

4 files changed

Lines changed: 262 additions & 31 deletions

File tree

src/Instance.ts

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import { _Renderer } from './Renderer.ts';
66
import { _Tokenizer } from './Tokenizer.ts';
77
import { _TextRenderer } from './TextRenderer.ts';
88
import { escape } from './helpers.ts';
9-
import type { MarkedExtension, MarkedOptions } from './MarkedOptions.ts';
9+
import { tokenizerBlockPositions, tokenizerInlinePositions, type MarkedExtension, type MarkedOptions } from './MarkedOptions.ts';
1010
import type { Token, Tokens, TokensList } from './Tokens.ts';
1111

1212
export 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

Comments
 (0)