summaryrefslogtreecommitdiff
path: root/packages/markdown/remark/src/rehype-shiki.ts
blob: 43b38f09511bc4a9581bc4b27301778a79948378 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
import type { Root } from 'hast';
import type { Plugin } from 'unified';
import { highlightCodeBlocks } from './highlight.js';
import { type ShikiHighlighter, createShikiHighlighter } from './shiki.js';
import type { ShikiConfig } from './types.js';

export const rehypeShiki: Plugin<[ShikiConfig?], Root> = (config) => {
	let highlighterAsync: Promise<ShikiHighlighter> | undefined;

	return async (tree) => {
		highlighterAsync ??= createShikiHighlighter({
			langs: config?.langs,
			theme: config?.theme,
			themes: config?.themes,
			langAlias: config?.langAlias,
		});
		const highlighter = await highlighterAsync;

		await highlightCodeBlocks(tree, (code, language, options) => {
			return highlighter.codeToHast(code, language, {
				meta: options?.meta,
				wrap: config?.wrap,
				defaultColor: config?.defaultColor,
				transformers: config?.transformers,
			});
		});
	};
};