1
- import { customAlphabet } from 'nanoid'
2
- import c from 'picocolors'
3
- import type { ShikiTransformer } from 'shiki'
4
- import { bundledLanguages , createHighlighter , isSpecialLang } from 'shiki'
5
1
import {
6
2
transformerCompactLineOptions ,
7
3
transformerNotationDiff ,
@@ -10,9 +6,21 @@ import {
10
6
transformerNotationHighlight ,
11
7
type TransformerCompactLineOption
12
8
} from '@shikijs/transformers'
9
+ import { customAlphabet } from 'nanoid'
10
+ import { createRequire } from 'node:module'
11
+ import c from 'picocolors'
12
+ import type { ShikiTransformer } from 'shiki'
13
+ import { createHighlighter , isSpecialLang } from 'shiki'
14
+ import { createSyncFn } from 'synckit'
13
15
import type { Logger } from 'vite'
16
+ import type { ShikiResolveLang } from 'worker_shikiResolveLang'
14
17
import type { MarkdownOptions , ThemeOptions } from '../markdown'
15
18
19
+ const require = createRequire ( import . meta. url )
20
+
21
+ const resolveLangSync = createSyncFn < ShikiResolveLang > (
22
+ require . resolve ( 'vitepress/dist/node/worker_shikiResolveLang.js' )
23
+ )
16
24
const nanoid = customAlphabet ( 'abcdefghijklmnopqrstuvwxyz' , 10 )
17
25
18
26
/**
@@ -62,7 +70,10 @@ export async function highlight(
62
70
typeof theme === 'object' && 'light' in theme && 'dark' in theme
63
71
? [ theme . light , theme . dark ]
64
72
: [ theme ] ,
65
- langs : [ ...Object . keys ( bundledLanguages ) , ...( options . languages || [ ] ) ] ,
73
+ langs : [
74
+ ...( options . languages || [ ] ) ,
75
+ ...Object . values ( options . languageAlias || { } )
76
+ ] ,
66
77
langAlias : options . languageAlias
67
78
} )
68
79
@@ -108,14 +119,19 @@ export async function highlight(
108
119
if ( lang ) {
109
120
const langLoaded = highlighter . getLoadedLanguages ( ) . includes ( lang )
110
121
if ( ! langLoaded && ! isSpecialLang ( lang ) ) {
111
- logger . warn (
112
- c . yellow (
113
- `\nThe language '${ lang } ' is not loaded, falling back to '${
114
- defaultLang || 'txt'
115
- } ' for syntax highlighting.`
122
+ const resolvedLang = resolveLangSync ( lang )
123
+ if ( ! resolvedLang ) {
124
+ logger . warn (
125
+ c . yellow (
126
+ `\nThe language '${ lang } ' is not loaded, falling back to '${
127
+ defaultLang || 'txt'
128
+ } ' for syntax highlighting.`
129
+ )
116
130
)
117
- )
118
- lang = defaultLang
131
+ lang = defaultLang
132
+ } else {
133
+ highlighter . loadLanguageSync ( resolvedLang )
134
+ }
119
135
}
120
136
}
121
137
0 commit comments