| ... | ... | @@ -87,28 +87,20 @@ function createHighlightCacheKey(code: string, language: string, themeName: Diff |
| 87 | 87 | return `${fnv1a32(code).toString(36)}:${code.length}:${language}:${themeName}`; |
| 88 | 88 | } |
| 89 | 89 | |
| 90 | | function createHighlighterPromiseKey(language: string, themeName: DiffThemeName): string { |
| 91 | | return `${language}:${themeName}`; |
| 92 | | } |
| 93 | | |
| 94 | 90 | function estimateHighlightedSize(html: string, code: string): number { |
| 95 | 91 | return Math.max(html.length * 2, code.length * 3); |
| 96 | 92 | } |
| 97 | 93 | |
| 98 | | function getHighlighterPromise( |
| 99 | | language: string, |
| 100 | | themeName: DiffThemeName, |
| 101 | | ): Promise<DiffsHighlighter> { |
| 102 | | const cacheKey = createHighlighterPromiseKey(language, themeName); |
| 103 | | const cached = highlighterPromiseCache.get(cacheKey); |
| 94 | function getHighlighterPromise(language: string): Promise<DiffsHighlighter> { |
| 95 | const cached = highlighterPromiseCache.get(language); |
| 104 | 96 | if (cached) return cached; |
| 105 | 97 | |
| 106 | 98 | const promise = getSharedHighlighter({ |
| 107 | | themes: [themeName], |
| 99 | themes: ["pierre-dark", "pierre-light"], |
| 108 | 100 | langs: [language as SupportedLanguages], |
| 109 | 101 | preferredHighlighter: "shiki-js", |
| 110 | 102 | }); |
| 111 | | highlighterPromiseCache.set(cacheKey, promise); |
| 103 | highlighterPromiseCache.set(language, promise); |
| 112 | 104 | return promise; |
| 113 | 105 | } |
| 114 | 106 | |
| ... | ... | @@ -186,7 +178,7 @@ function SuspenseShikiCodeBlock({ |
| 186 | 178 | ); |
| 187 | 179 | } |
| 188 | 180 | |
| 189 | | const highlighter = use(getHighlighterPromise(language, themeName)); |
| 181 | const highlighter = use(getHighlighterPromise(language)); |
| 190 | 182 | const highlightedHtml = useMemo( |
| 191 | 183 | () => highlighter.codeToHtml(code, { lang: language, theme: themeName }), |
| 192 | 184 | [code, highlighter, language, themeName], |