/
importCodePlugin.ts
49 lines (43 loc) · 1.25 KB
/
importCodePlugin.ts
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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
import type { PluginWithOptions } from 'markdown-it'
import type { MarkdownEnv } from '../../types.js'
import { createImportCodeBlockRule } from './createImportCodeBlockRule.js'
import { resolveImportCode } from './resolveImportCode.js'
export interface ImportCodePluginOptions {
/**
* A function to handle the import path
*/
handleImportPath?: (str: string) => string
}
export const importCodePlugin: PluginWithOptions<ImportCodePluginOptions> = (
md,
options = {}
): void => {
// add import_code block rule
md.block.ruler.before(
'fence',
'import_code',
createImportCodeBlockRule(options),
{
alt: ['paragraph', 'reference', 'blockquote', 'list'],
}
)
// add import_code renderer rule
md.renderer.rules.import_code = (
tokens,
idx,
options,
env: MarkdownEnv,
slf
) => {
const token = tokens[idx]
// use imported code as token content
const { importFilePath, importCode } = resolveImportCode(token.meta, env)
token.content = importCode
// extract imported files to env
if (importFilePath) {
;(env.importedFiles ??= []).push(importFilePath)
}
// render the import_code token as a fence token
return md.renderer.rules.fence!(tokens, idx, options, env, slf)
}
}