@@ -86,24 +86,7 @@ function rehypeShikiFromHighlighter(
86
86
87
87
return ( tree ) => {
88
88
// use this queue if lazy is enabled
89
- const languageQueue : string [ ] = [ ]
90
- const queue : ( ( ) => void ) [ ] = [ ]
91
-
92
- function getLanguage ( lang : string | undefined ) : string | undefined {
93
- if ( ! lang )
94
- return defaultLanguage
95
-
96
- if ( highlighter . getLoadedLanguages ( ) . includes ( lang ) || isSpecialLang ( lang ) )
97
- return lang
98
-
99
- if ( lazy ) {
100
- languageQueue . push ( lang )
101
- return lang
102
- }
103
-
104
- if ( fallbackLanguage )
105
- return fallbackLanguage
106
- }
89
+ const queue : Promise < void > [ ] = [ ]
107
90
108
91
visit ( tree , 'element' , ( node , index , parent ) => {
109
92
let handler : RehypeShikiHandler | undefined
@@ -127,7 +110,23 @@ function rehypeShikiFromHighlighter(
127
110
if ( ! res )
128
111
return
129
112
130
- const lang = getLanguage ( res . lang )
113
+ let lang : string | undefined
114
+ let lazyLoad = false
115
+
116
+ if ( ! res . lang ) {
117
+ lang = defaultLanguage
118
+ }
119
+ else if ( highlighter . getLoadedLanguages ( ) . includes ( res . lang ) || isSpecialLang ( res . lang ) ) {
120
+ lang = res . lang
121
+ }
122
+ else if ( lazy ) {
123
+ lazyLoad = true
124
+ lang = res . lang
125
+ }
126
+ else if ( fallbackLanguage ) {
127
+ lang = fallbackLanguage
128
+ }
129
+
131
130
if ( ! lang )
132
131
return
133
132
@@ -145,24 +144,26 @@ function rehypeShikiFromHighlighter(
145
144
}
146
145
}
147
146
148
- parent . children . splice ( index , 1 , ... fragment . children )
147
+ parent . children [ index ] = fragment as any
149
148
}
150
149
151
- if ( lazy )
152
- queue . push ( processNode )
153
- else
150
+ if ( lazyLoad ) {
151
+ queue . push ( highlighter . loadLanguage ( lang ) . then ( ( ) => processNode ( ) ) )
152
+ }
153
+ else {
154
154
processNode ( )
155
+ }
155
156
156
157
// don't visit processed nodes
157
158
return 'skip'
158
159
} )
159
160
160
- if ( lazy ) {
161
- return highlighter
162
- . loadLanguage ( ... languageQueue )
163
- . then ( ( ) => {
164
- queue . forEach ( fn => fn ( ) )
165
- } )
161
+ if ( queue . length > 0 ) {
162
+ async function run ( ) : Promise < void > {
163
+ await Promise . all ( queue )
164
+ }
165
+
166
+ return run ( )
166
167
}
167
168
}
168
169
}
0 commit comments