返回 slidev
index.ts
根目录 / packages / slidev / node / syntax / codeblock / index.ts
1 import type { CodeblockTransformContext, CodeblockTransformer, ResolvedSlidevOptions } from '@slidev/types'
2 import type { MarkdownExit } from 'markdown-exit'
3 import { ensureSuffix } from '@antfu/utils'
4 import { regexSlideSourceId } from '../../vite/common'
5 import magicMoveTransformer from './magic-move'
6 import mermaidTransformer from './mermaid'
7 import monacoTransformer from './monaco'
8 import plantUmlTransformer from './plant-uml'
9 import wrapperTransformer from './wrapper'
10
11 export function MarkdownItCodeblocks(md: MarkdownExit, options: ResolvedSlidevOptions, extraTransformers: (CodeblockTransformer | false)[]) {
12 const oldFence = md.renderer.rules.fence!
13 md.renderer.rules.fence = async function (tokens, idx, renderOptions, env, slf) {
14 const token = tokens[idx]
15
16 const slideNo = env.id?.match(regexSlideSourceId)
17 const ctx: CodeblockTransformContext = {
18 info: token.info.trim(),
19 code: token.content,
20 fence: token.markup.length,
21 slide: slideNo ? options.data.slides[slideNo[1] - 1] : null,
22 options,
23 renderHighlighted(override) {
24 if (override.info != null)
25 token.info = override.info
26 if (override.code != null)
27 token.content = override.code
28 return oldFence(tokens, idx, renderOptions, env, slf)
29 },
30 }
31
32 const transformers = [
33 ...extraTransformers,
34 mermaidTransformer,
35 plantUmlTransformer,
36 magicMoveTransformer,
37 monacoTransformer,
38 wrapperTransformer,
39 ]
40
41 for (const transformer of transformers) {
42 if (!transformer)
43 continue
44 const res = await transformer(ctx)
45 if (res != null)
46 return ensureSuffix('\n', res)
47 }
48
49 throw new Error('Should not reach here')
50 }
51 }
52
52 lines TYPESCRIPT