import type { HighlighterCore } from "shiki"; import { createShikiState, initializeHighlighter, highlightCodeWithShiki, escapeHtml as coreEscapeHtml, ShikiState } from "dxUtils/shikiCore"; /** * Dynamic loading version of Shiki. * Uses dynamic import() for code splitting - shiki is lazy loaded on first use. * Note: May not work with SSG. Use dxUtils/shikiStatic for SSG compatibility. */ let shikiModulePromise: Promise | null = null; let bracketsModulePromise: Promise< typeof import("@shikijs/colorized-brackets") > | null = null; async function getShiki() { return (shikiModulePromise ??= import("shiki")); } async function getBrackets() { return (bracketsModulePromise ??= import("@shikijs/colorized-brackets")); } const shikiState: ShikiState = createShikiState(); async function initializeShiki(): Promise { const shikiModule = await getShiki(); return initializeHighlighter(shikiState, shikiModule); } export async function highlightCode( code: string, language: string, theme: "light" | "dark" = "light" ): Promise { try { const highlighter = await initializeShiki(); const { transformerColorizedBrackets } = await getBrackets(); return highlightCodeWithShiki( code, language, theme, highlighter, transformerColorizedBrackets ); } catch (error) { console.error("Failed to highlight code with Shiki:", error); return `
${escapeHtml(code)}
`; } } export function escapeHtml(text: string): string { return coreEscapeHtml(text); }