@incremark/vue 0.3.2 → 0.3.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +1 -0
- package/dist/index.js +54 -52
- package/dist/index.js.map +1 -1
- package/package.json +6 -6
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/composables/useIncremark.ts","../src/composables/useProvideDefinations.ts","../src/composables/useTypewriter.ts","../src/utils/cursor.ts","../src/composables/useStreamRenderer.ts","../src/composables/useDevTools.ts","../src/composables/useBlockTransformer.ts","../src/composables/useLocale.ts","../src/composables/useDefinationsContext.ts","src/components/Incremark.vue","src/components/IncremarkRenderer.vue","src/components/IncremarkHeading.vue","src/components/IncremarkInline.vue","src/components/IncremarkMath.vue","sfc-template:/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkMath.vue?type=template","../src/components/IncremarkMath.vue","src/components/IncremarkHtmlElement.vue","sfc-template:/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkHtmlElement.vue?type=template","../src/components/IncremarkHtmlElement.vue","sfc-template:/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkInline.vue?type=template","../src/components/IncremarkInline.vue","sfc-template:/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkHeading.vue?type=template","../src/components/IncremarkHeading.vue","sfc-template:/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkParagraph.vue?type=template","../src/components/IncremarkParagraph.vue","src/components/IncremarkCode.vue","src/components/IncremarkCodeMermaid.vue","sfc-template:/Users/yishuai/develop/ai/markdown/packages/vue/src/components/SvgIcon.vue?type=template","../src/components/SvgIcon.vue","sfc-template:/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkCodeMermaid.vue?type=template","../src/components/IncremarkCodeMermaid.vue","src/components/IncremarkCodeDefault.vue","../src/composables/useShiki.ts","src/components/CachedCodeRenderer.vue","../../../node_modules/.pnpm/@shikijs+vscode-textmate@10.0.2/node_modules/@shikijs/vscode-textmate/dist/index.js","../../../node_modules/.pnpm/@shikijs+core@3.21.0/node_modules/@shikijs/core/dist/index.mjs","sfc-template:/Users/yishuai/develop/ai/markdown/packages/vue/src/components/CachedCodeRenderer.vue?type=template","../src/components/CachedCodeRenderer.vue","sfc-template:/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkCodeDefault.vue?type=template","../src/components/IncremarkCodeDefault.vue","sfc-template:/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkCode.vue?type=template","../src/components/IncremarkCode.vue","src/components/IncremarkList.vue","sfc-template:/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkList.vue?type=template","../src/components/IncremarkList.vue","src/components/IncremarkTable.vue","sfc-template:/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkTable.vue?type=template","../src/components/IncremarkTable.vue","sfc-template:/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkBlockquote.vue?type=template","../src/components/IncremarkBlockquote.vue","sfc-template:/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkThematicBreak.vue?type=template","../src/components/IncremarkThematicBreak.vue","src/components/IncremarkContainer.vue","sfc-template:/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkContainer.vue?type=template","../src/components/IncremarkContainer.vue","sfc-template:/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkDefault.vue?type=template","../src/components/IncremarkDefault.vue","sfc-template:/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkRenderer.vue?type=template","../src/components/IncremarkRenderer.vue","src/components/IncremarkFootnotes.vue","sfc-template:/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkFootnotes.vue?type=template","../src/components/IncremarkFootnotes.vue","sfc-template:/Users/yishuai/develop/ai/markdown/packages/vue/src/components/Incremark.vue?type=template","../src/components/Incremark.vue","src/components/IncremarkContent.vue","sfc-template:/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkContent.vue?type=template","../src/components/IncremarkContent.vue","src/components/AutoScrollContainer.vue","sfc-template:/Users/yishuai/develop/ai/markdown/packages/vue/src/components/AutoScrollContainer.vue?type=template","../src/components/AutoScrollContainer.vue","src/ThemeProvider.vue","sfc-template:/Users/yishuai/develop/ai/markdown/packages/vue/src/ThemeProvider.vue?type=template","../src/ThemeProvider.vue","src/components/ConfigProvider.vue","sfc-template:/Users/yishuai/develop/ai/markdown/packages/vue/src/components/ConfigProvider.vue?type=template","../src/components/ConfigProvider.vue","../src/index.ts"],"sourcesContent":["import { ref, shallowRef, computed, markRaw, watch, toValue, type ComputedRef, type MaybeRefOrGetter } from 'vue'\nimport {\n createIncremarkParser,\n type IncremarkParserOptions,\n type ParsedBlock,\n type IncrementalUpdate,\n type Root,\n type TransformerPlugin,\n type AnimationEffect\n} from '@incremark/core'\nimport { useProvideDefinations } from './useProvideDefinations'\nimport { useTypewriter } from './useTypewriter'\n\n/** 打字机效果配置 */\nexport interface TypewriterOptions {\n /** 是否启用打字机效果(可响应式切换) */\n enabled?: boolean\n /** 每次显示的字符数,可以是固定值或范围 [min, max] */\n charsPerTick?: number | [number, number]\n /** 更新间隔 (ms) */\n tickInterval?: number\n /** 动画效果: 'none' | 'fade-in' | 'typing' */\n effect?: AnimationEffect\n /** 光标字符(仅 typing 效果使用) */\n cursor?: string\n /** 页面不可见时暂停 */\n pauseOnHidden?: boolean\n /** 自定义插件 */\n plugins?: TransformerPlugin[]\n}\n\nexport interface UseIncremarkOptions extends IncremarkParserOptions {\n /** 打字机配置,传入即创建 transformer(可通过 enabled 控制是否启用) */\n typewriter?: TypewriterOptions\n}\n\n/** 打字机控制对象 */\nexport interface TypewriterControls {\n /** 是否启用(只读) */\n enabled: ComputedRef<boolean>\n /** 设置是否启用 */\n setEnabled: (enabled: boolean) => void\n /** 是否正在处理中 */\n isProcessing: ComputedRef<boolean>\n /** 是否已暂停 */\n isPaused: ComputedRef<boolean>\n /** 当前动画效果 */\n effect: ComputedRef<AnimationEffect>\n /** 跳过动画,直接显示全部 */\n skip: () => void\n /** 暂停动画 */\n pause: () => void\n /** 恢复动画 */\n resume: () => void\n /** 动态更新配置 */\n setOptions: (options: Partial<TypewriterOptions>) => void\n}\n\n/** useIncremark 的返回类型 */\nexport type UseIncremarkReturn = ReturnType<typeof useIncremark>\n\n/**\n * Vue 3 Composable: Incremark 流式 Markdown 解析器\n *\n * @example\n * ```vue\n * <script setup>\n * import { useIncremark, Incremark } from '@incremark/vue'\n *\n * // 基础用法\n * const { blocks, append, finalize } = useIncremark()\n *\n * // 启用打字机效果\n * const { blocks, append, finalize, typewriter } = useIncremark({\n * typewriter: {\n * enabled: true, // 可响应式切换\n * charsPerTick: [1, 3],\n * tickInterval: 30,\n * effect: 'typing',\n * cursor: '|'\n * }\n * })\n *\n * // 动态切换打字机效果\n * typewriter.enabled.value = false\n * </script>\n *\n * <template>\n * <Incremark :blocks=\"blocks\" />\n * <button v-if=\"typewriter.isProcessing.value\" @click=\"typewriter.skip\">跳过</button>\n * </template>\n * ```\n */\nexport function useIncremark(optionsInput: MaybeRefOrGetter<UseIncremarkOptions> = {}) {\n // 内部自动提供 definitions context\n const { setDefinations, setFootnoteDefinitions, setFootnoteReferenceOrder } = useProvideDefinations()\n\n // 创建解析器的工厂函数\n function createParser(options: UseIncremarkOptions) {\n return createIncremarkParser({\n ...options,\n onChange: (state) => {\n setDefinations(state.definitions)\n setFootnoteDefinitions(state.footnoteDefinitions)\n options.onChange?.(state)\n }\n })\n }\n\n // 解析器\n let parser = createParser(toValue(optionsInput))\n\n const completedBlocks = shallowRef<ParsedBlock[]>([])\n const pendingBlocks = shallowRef<ParsedBlock[]>([])\n const isLoading = ref(false)\n const markdown = ref('')\n const isFinalized = ref(false)\n const footnoteReferenceOrder = ref<string[]>([])\n\n // 使用 useTypewriter composable 管理打字机效果\n // 传入响应式的 typewriter 配置,让 useTypewriter 内部监听变化\n const { blocks, typewriter, transformer, isAnimationComplete, displayedFootnoteReferenceOrder } = useTypewriter({\n typewriter: () => toValue(optionsInput).typewriter,\n completedBlocks,\n pendingBlocks\n })\n\n // 内容是否完全显示完成\n // 如果没有配置打字机或未启用打字机:解析完成即显示完成\n // 如果启用打字机:解析完成 + 动画完成\n const isDisplayComplete = computed(() => {\n // 没有配置打字机,或者打字机未启用:只需判断是否 finalized\n if (!toValue(optionsInput).typewriter || !typewriter.enabled.value) {\n return isFinalized.value\n }\n // 启用了打字机:需要 finalize + 动画完成\n return isFinalized.value && isAnimationComplete.value\n })\n\n // AST\n const ast = ref<Root>({\n type: 'root',\n children: []\n })\n\n /**\n * 处理解析器更新结果(统一 append 和 finalize 的更新逻辑)\n */\n function handleUpdate(update: IncrementalUpdate, isFinalize: boolean = false): void {\n markdown.value = parser.getBuffer()\n\n // 处理被更新的 blocks(需要移除的旧 blocks)\n if (update.updated.length > 0) {\n const idsToRemove = new Set(update.updated.map(b => b.id))\n completedBlocks.value = completedBlocks.value.filter(b => !idsToRemove.has(b.id))\n }\n\n if (update.completed.length > 0) {\n completedBlocks.value.push(...update.completed.map((b) => markRaw(b)))\n }\n pendingBlocks.value = update.pending.map((b) => markRaw(b))\n\n if (isFinalize) {\n // 如果还有 pending blocks,则将它们添加到 completed blocks 中\n if (pendingBlocks.value.length) {\n completedBlocks.value.push(...pendingBlocks.value.map((b) => markRaw(b)))\n pendingBlocks.value = []\n }\n isLoading.value = false\n isFinalized.value = true\n } else {\n isLoading.value = true\n }\n\n // 更新脚注引用顺序(解析器的完整顺序)\n footnoteReferenceOrder.value = update.footnoteReferenceOrder\n // 注意:这里不再直接调用 setFootnoteReferenceOrder\n // 脚注显示顺序由下面的 watch 根据打字机状态来控制\n }\n\n function append(chunk: string): IncrementalUpdate {\n const update = parser.append(chunk)\n ast.value = update.ast\n handleUpdate(update, false)\n return update\n }\n\n function finalize(): IncrementalUpdate {\n const update = parser.finalize()\n handleUpdate(update, true)\n return update\n }\n\n function abort(): IncrementalUpdate {\n return finalize()\n }\n\n function reset(): void {\n parser.reset()\n completedBlocks.value = []\n pendingBlocks.value = []\n markdown.value = ''\n isLoading.value = false\n isFinalized.value = false\n footnoteReferenceOrder.value = []\n\n // 重置 transformer\n transformer?.reset()\n }\n\n // 监听 parser 相关 options 变化,动态更新配置(排除 typewriter 配置)\n // 使用 JSON.stringify 比较,避免 deep watch 对新对象的误触发\n // 注意:astBuilder 是类,需要单独处理\n watch(\n () => {\n const opts = toValue(optionsInput)\n const { typewriter: _, astBuilder, ...parserOptions } = opts\n // astBuilder 用名称标识,因为它是类不能 JSON.stringify\n return JSON.stringify(parserOptions) + '|' + (astBuilder?.name ?? 'default')\n },\n () => {\n // 使用 updateOptions 动态更新配置(包括引擎切换),不需要重建 parser\n const opts = toValue(optionsInput)\n const { typewriter: _, ...parserOptions } = opts\n parser.updateOptions(parserOptions)\n // 同步 Vue 状态\n completedBlocks.value = []\n pendingBlocks.value = []\n markdown.value = ''\n isLoading.value = false\n isFinalized.value = false\n footnoteReferenceOrder.value = []\n transformer?.reset()\n }\n )\n\n // 监听打字机的 displayedFootnoteReferenceOrder 变化,更新脚注显示\n // 这确保脚注只在引用所在的 block 动画完成后才显示\n watch(\n displayedFootnoteReferenceOrder,\n (newOrder) => {\n setFootnoteReferenceOrder(newOrder)\n },\n { immediate: true }\n )\n\n function render(content: string): IncrementalUpdate {\n const update = parser.render(content)\n\n markdown.value = parser.getBuffer()\n completedBlocks.value = parser.getCompletedBlocks().map(b => markRaw(b))\n pendingBlocks.value = []\n isLoading.value = false\n isFinalized.value = true\n footnoteReferenceOrder.value = update.footnoteReferenceOrder\n // render 是一次性渲染,不经过打字机,直接设置脚注顺序\n setFootnoteReferenceOrder(update.footnoteReferenceOrder)\n\n return update\n }\n\n const result = {\n /** 已收集的完整 Markdown 字符串 */\n markdown,\n /** 已完成的块列表 */\n completedBlocks,\n /** 待处理的块列表 */\n pendingBlocks,\n /** 当前完整的 AST */\n ast,\n /** 用于渲染的 blocks(根据打字机设置自动处理) */\n blocks,\n /** 是否正在加载 */\n isLoading,\n /** 是否已完成(finalize) */\n isFinalized,\n /**\n * 内容是否完全显示完成\n * - 无打字机:等于 isFinalized\n * - 有打字机:isFinalized + 动画播放完成\n * 适用于控制 footnote 等需要在内容完全显示后才出现的元素\n */\n isDisplayComplete,\n /** 脚注引用的出现顺序 */\n footnoteReferenceOrder,\n /** 追加内容 */\n append,\n /** 完成解析 */\n finalize,\n /** 强制中断 */\n abort,\n /** 重置解析器和打字机 */\n reset,\n /** 一次性渲染(reset + append + finalize) */\n render,\n /** 解析器实例 */\n parser,\n /** 打字机控制 */\n typewriter\n }\n\n return result as any\n}\n","import { ref, provide, type InjectionKey, type Ref } from 'vue';\nimport type { Definition, FootnoteDefinition } from 'mdast';\n\nexport const definationsInjectionKey: InjectionKey<{\n definations: Ref<Record<string, Definition>>\n footnoteDefinitions: Ref<Record<string, FootnoteDefinition>>\n footnoteReferenceOrder: Ref<string[]>\n}> = Symbol('provideDefinations');\n\nexport function useProvideDefinations() {\n const definations = ref<Record<string, Definition>>({});\n const footnoteDefinitions = ref<Record<string, FootnoteDefinition>>({});\n const footnoteReferenceOrder = ref<string[]>([]);\n\n provide(definationsInjectionKey, {\n definations,\n footnoteDefinitions,\n footnoteReferenceOrder\n });\n\n function setDefinations(definitions: Record<string, Definition>) {\n definations.value = definitions;\n }\n\n function setFootnoteDefinitions(definitions: Record<string, FootnoteDefinition>) {\n footnoteDefinitions.value = definitions;\n }\n\n function setFootnoteReferenceOrder(order: string[]) {\n footnoteReferenceOrder.value = order;\n }\n\n function clearDefinations() {\n definations.value = {};\n }\n\n function clearFootnoteDefinitions() {\n footnoteDefinitions.value = {};\n }\n\n function clearFootnoteReferenceOrder() {\n footnoteReferenceOrder.value = [];\n }\n\n function clearAllDefinations() {\n clearDefinations();\n clearFootnoteDefinitions();\n clearFootnoteReferenceOrder();\n }\n\n return {\n setDefinations,\n setFootnoteDefinitions,\n setFootnoteReferenceOrder,\n clearDefinations,\n clearFootnoteDefinitions,\n clearFootnoteReferenceOrder,\n clearAllDefinations\n }\n\n}","/**\n * @file useTypewriter Composable - 打字机效果管理\n *\n * @description\n * 管理打字机效果的状态和控制逻辑,从 useIncremark 中拆分出来以简化代码。\n *\n * @author Incremark Team\n * @license MIT\n */\n\nimport { ref, shallowRef, computed, watch, toValue, onUnmounted, type Ref, type ComputedRef, type MaybeRefOrGetter } from 'vue'\nimport {\n createBlockTransformer,\n defaultPlugins,\n mathPlugin,\n collectFootnoteReferences,\n type RootContent,\n type ParsedBlock,\n type DisplayBlock,\n type AnimationEffect,\n type BlockTransformer\n} from '@incremark/core'\nimport type { TypewriterOptions, TypewriterControls } from './useIncremark'\nimport { addCursorToNode } from '../utils/cursor'\n\nexport interface UseTypewriterOptions {\n typewriter: MaybeRefOrGetter<TypewriterOptions | undefined>\n completedBlocks: Ref<ParsedBlock[]>\n pendingBlocks: Ref<ParsedBlock[]>\n}\n\nexport interface UseTypewriterReturn {\n /** 用于渲染的 blocks(经过打字机处理或原始blocks) */\n blocks: ComputedRef<Array<ParsedBlock & { isLastPending?: boolean }>>\n /** 打字机控制对象 */\n typewriter: TypewriterControls\n /** transformer 实例 */\n transformer: BlockTransformer<RootContent> | null\n /** 所有动画是否已完成(队列为空且没有正在处理的 block) */\n isAnimationComplete: Ref<boolean>\n /**\n * 脚注引用顺序(所有动画完成后才返回)\n * 用于控制脚注的显示时机:只有当所有 blocks 的打字机动画都完成后才显示脚注\n * 动画进行中时返回空数组\n */\n displayedFootnoteReferenceOrder: ComputedRef<string[]>\n}\n\n/**\n * useTypewriter Composable\n *\n * @description\n * 管理打字机效果的所有状态和逻辑。\n *\n * @param options - 打字机配置和数据\n * @returns 打字机状态和控制对象\n */\nexport function useTypewriter(options: UseTypewriterOptions): UseTypewriterReturn {\n const { typewriter: typewriterInput, completedBlocks, pendingBlocks } = options\n\n // 获取初始配置\n const initialConfig = toValue(typewriterInput)\n\n // 打字机状态\n const typewriterEnabled = ref(initialConfig?.enabled ?? !!initialConfig)\n const displayBlocksRef = shallowRef<DisplayBlock<RootContent>[]>([])\n const isTypewriterProcessing = ref(false)\n const isTypewriterPaused = ref(false)\n const typewriterEffect = ref<AnimationEffect>(initialConfig?.effect ?? 'none')\n const typewriterCursor = ref(initialConfig?.cursor ?? '|')\n const isAnimationComplete = ref(true) // 初始为 true(没有动画时视为完成)\n\n // 创建 transformer(如果有 typewriter 配置)\n let transformer: BlockTransformer<RootContent> | null = null\n\n if (initialConfig) {\n transformer = createBlockTransformer<RootContent>({\n charsPerTick: initialConfig.charsPerTick ?? [1, 3],\n tickInterval: initialConfig.tickInterval ?? 30,\n effect: initialConfig.effect ?? 'none',\n pauseOnHidden: initialConfig.pauseOnHidden ?? true,\n // 默认插件 + 数学公式插件(数学公式应该整体显示,不参与打字机逐字符效果)\n plugins: initialConfig.plugins ?? [...defaultPlugins, mathPlugin],\n onChange: (blocks) => {\n // console.log('onChange',blocks)\n displayBlocksRef.value = blocks as DisplayBlock<RootContent>[]\n isTypewriterProcessing.value = transformer?.isProcessing() ?? false\n isTypewriterPaused.value = transformer?.isPausedState() ?? false\n },\n onAllComplete: () => {\n // 所有动画完成\n isAnimationComplete.value = true\n }\n })\n }\n\n // 监听配置变化,更新 transformer\n watch(\n () => toValue(typewriterInput),\n (newConfig) => {\n if (!newConfig) return\n\n // 更新本地状态\n if (newConfig.enabled !== undefined) {\n typewriterEnabled.value = newConfig.enabled\n }\n if (newConfig.effect !== undefined) {\n typewriterEffect.value = newConfig.effect\n }\n if (newConfig.cursor !== undefined) {\n typewriterCursor.value = newConfig.cursor\n }\n\n // 更新 transformer 配置\n transformer?.setOptions({\n charsPerTick: newConfig.charsPerTick,\n tickInterval: newConfig.tickInterval,\n effect: newConfig.effect,\n pauseOnHidden: newConfig.pauseOnHidden\n })\n },\n { deep: true }\n )\n\n // 监听 blocks 变化,推送给 transformer\n // transformer.push() 会自动检测并更新已存在 blocks 的内容变化\n if (transformer) {\n watch(\n [completedBlocks, pendingBlocks],\n () => {\n // 直接传递原始 block 引用\n // ParsedBlock 的结构(id, node, status)已经兼容 SourceBlock\n const allBlocks = [...completedBlocks.value, ...pendingBlocks.value] as any\n transformer!.push(allBlocks)\n },\n { immediate: true }\n )\n }\n\n // 原始 blocks(不经过打字机)\n const rawBlocks = computed(() => {\n return [...completedBlocks.value, ...pendingBlocks.value]\n })\n\n // 最终用于渲染的 blocks\n const blocks = computed(() => {\n // 未启用打字机或没有 transformer:返回原始 blocks\n if (!typewriterEnabled.value || !transformer) {\n return rawBlocks.value\n }\n\n // 启用打字机:使用 displayBlocks\n return displayBlocksRef.value.map((db, index) => {\n const isPending = !db.isDisplayComplete\n const isLastPending = isPending && index === displayBlocksRef.value.length - 1\n\n // typing 效果时添加光标\n let node = db.displayNode\n if (typewriterEffect.value === 'typing' && isLastPending) {\n node = addCursorToNode(db.displayNode, typewriterCursor.value)\n }\n\n return {\n id: db.id,\n status: db.status,\n node,\n // 这些字段在打字机模式下没有意义,设为默认值以满足类型要求\n startOffset: 0,\n endOffset: 0,\n rawText: '',\n isLastPending\n }\n })\n })\n\n /**\n * 脚注引用顺序(所有动画完成后才返回)\n * 用于控制脚注的显示时机:只有当所有 blocks 的打字机动画都完成后才显示脚注\n */\n const displayedFootnoteReferenceOrder = computed(() => {\n // 未启用打字机:返回所有脚注引用(从原始 blocks 中提取)\n if (!typewriterEnabled.value || !transformer) {\n const references: string[] = []\n const seen = new Set<string>()\n for (const block of rawBlocks.value) {\n const blockRefs = collectFootnoteReferences(block.node)\n for (const ref of blockRefs) {\n if (!seen.has(ref)) {\n seen.add(ref)\n references.push(ref)\n }\n }\n }\n return references\n }\n\n // 启用打字机:只有所有动画完成后才返回脚注引用\n // 如果还有动画在进行中,返回空数组\n if (!isAnimationComplete.value) {\n return []\n }\n\n // 所有动画完成,返回全部脚注引用\n const references: string[] = []\n const seen = new Set<string>()\n for (const db of displayBlocksRef.value) {\n const blockRefs = collectFootnoteReferences(db.displayNode)\n for (const ref of blockRefs) {\n if (!seen.has(ref)) {\n seen.add(ref)\n references.push(ref)\n }\n }\n }\n return references\n })\n\n // 打字机控制对象\n const typewriterControls: TypewriterControls = {\n enabled: computed(() => typewriterEnabled.value),\n setEnabled: (value: boolean) => {\n typewriterEnabled.value = value\n },\n isProcessing: computed(() => isTypewriterProcessing.value),\n isPaused: computed(() => isTypewriterPaused.value),\n effect: computed(() => typewriterEffect.value),\n skip: () => transformer?.skip(),\n pause: () => {\n transformer?.pause()\n isTypewriterPaused.value = true\n },\n resume: () => {\n transformer?.resume()\n isTypewriterPaused.value = false\n },\n setOptions: (opts) => {\n if (opts.enabled !== undefined) {\n typewriterEnabled.value = opts.enabled\n }\n if (opts.charsPerTick !== undefined || opts.tickInterval !== undefined || opts.effect !== undefined || opts.pauseOnHidden !== undefined) {\n transformer?.setOptions({\n charsPerTick: opts.charsPerTick,\n tickInterval: opts.tickInterval,\n effect: opts.effect,\n pauseOnHidden: opts.pauseOnHidden\n })\n }\n if (opts.effect !== undefined) {\n typewriterEffect.value = opts.effect\n }\n if (opts.cursor !== undefined) {\n typewriterCursor.value = opts.cursor\n }\n }\n }\n\n // 清理\n onUnmounted(() => {\n transformer?.destroy()\n })\n\n return {\n blocks,\n typewriter: typewriterControls,\n transformer,\n isAnimationComplete,\n displayedFootnoteReferenceOrder\n }\n}\n","/**\n * @file Cursor Utils - 光标工具函数\n *\n * @description\n * 用于在 AST 节点末尾添加光标的工具函数。\n *\n * @author Incremark Team\n * @license MIT\n */\n\nimport type { RootContent } from '@incremark/core'\n\n/**\n * 在节点末尾添加光标\n *\n * @param node - 要添加光标的节点\n * @param cursor - 光标字符\n * @returns 添加了光标的新节点\n */\nexport function addCursorToNode(node: RootContent, cursor: string): RootContent {\n // 代码块不应该添加光标(会破坏代码高亮)\n if (node.type === 'code') {\n return node\n }\n\n const cloned = JSON.parse(JSON.stringify(node))\n\n function addToLast(n: { children?: unknown[]; type?: string; value?: string }): boolean {\n // 跳过代码块\n if (n.type === 'code') {\n return false\n }\n\n if (n.children && n.children.length > 0) {\n for (let i = n.children.length - 1; i >= 0; i--) {\n if (addToLast(n.children[i] as { children?: unknown[]; type?: string; value?: string })) {\n return true\n }\n }\n n.children.push({ type: 'text', value: cursor })\n return true\n }\n if (n.type === 'text' && typeof n.value === 'string') {\n n.value += cursor\n return true\n }\n if (typeof n.value === 'string') {\n n.value += cursor\n return true\n }\n return false\n }\n\n addToLast(cloned)\n return cloned\n}\n","import { computed, type Ref, type ComputedRef } from 'vue'\nimport type { ParsedBlock } from '@incremark/core'\n\nexport interface UseStreamRendererOptions {\n /** 已完成的块 */\n completedBlocks: Ref<ParsedBlock[]>\n /** 待处理的块 */\n pendingBlocks: Ref<ParsedBlock[]>\n}\n\nexport interface UseStreamRendererReturn {\n /** 已完成的块 */\n completedBlocks: ComputedRef<ParsedBlock[]>\n /** 待处理的块 */\n pendingBlocks: ComputedRef<ParsedBlock[]>\n /** 所有块 */\n allBlocks: ComputedRef<ParsedBlock[]>\n}\n\n/**\n * Vue 3 Composable: 流式渲染辅助\n *\n * 直接使用 block.id 作为稳定的渲染 key\n */\nexport function useStreamRenderer(options: UseStreamRendererOptions): UseStreamRendererReturn {\n const { completedBlocks, pendingBlocks } = options\n\n const completedBlocksComputed = computed<ParsedBlock[]>(() => completedBlocks.value)\n const pendingBlocksComputed = computed<ParsedBlock[]>(() => pendingBlocks.value)\n const allBlocks = computed(() => [...completedBlocksComputed.value, ...pendingBlocksComputed.value])\n\n return {\n completedBlocks: completedBlocksComputed,\n pendingBlocks: pendingBlocksComputed,\n allBlocks\n }\n}\n\n","import { onMounted, onUnmounted } from 'vue'\nimport { createDevTools, type DevToolsOptions } from '@incremark/devtools'\nimport type { UseIncremarkReturn } from './useIncremark'\n\nexport interface UseDevToolsOptions extends DevToolsOptions {}\n\n/**\n * Vue 3 DevTools 一行接入\n *\n * @example\n * ```vue\n * <script setup>\n * import { useIncremark, useDevTools } from '@incremark/vue'\n *\n * const incremark = useIncremark()\n * useDevTools(incremark) // 就这一行!\n * </script>\n * ```\n */\nexport function useDevTools(\n incremark: UseIncremarkReturn,\n options: UseDevToolsOptions = {}\n) {\n const devtools = createDevTools(options)\n\n // 设置 parser 的 onChange 回调\n incremark.parser.setOnChange((state: any) => {\n const blocks = [\n ...state.completedBlocks,\n ...state.pendingBlocks\n ]\n\n devtools.update({\n blocks,\n completedBlocks: state.completedBlocks,\n pendingBlocks: state.pendingBlocks,\n markdown: state.markdown,\n ast: state.ast,\n isLoading: state.pendingBlocks.length > 0\n })\n })\n\n onMounted(() => {\n devtools.mount()\n })\n\n onUnmounted(() => {\n devtools.unmount()\n // 清理回调\n incremark.parser.setOnChange(undefined)\n })\n\n return devtools\n}\n","import { ref, watch, computed, onUnmounted, type Ref, type ComputedRef } from 'vue'\nimport {\n BlockTransformer,\n createBlockTransformer,\n type TransformerOptions,\n type DisplayBlock,\n type SourceBlock,\n type AnimationEffect\n} from '@incremark/core'\n\nexport interface UseBlockTransformerOptions extends Omit<TransformerOptions, 'onChange'> {}\n\nexport interface UseBlockTransformerReturn<T = unknown> {\n /** 用于渲染的 display blocks */\n displayBlocks: ComputedRef<DisplayBlock<T>[]>\n /** 是否正在处理中 */\n isProcessing: ComputedRef<boolean>\n /** 是否已暂停 */\n isPaused: ComputedRef<boolean>\n /** 当前动画效果 */\n effect: ComputedRef<AnimationEffect>\n /** 跳过所有动画 */\n skip: () => void\n /** 重置状态 */\n reset: () => void\n /** 暂停动画 */\n pause: () => void\n /** 恢复动画 */\n resume: () => void\n /** 动态更新配置 */\n setOptions: (options: Partial<Pick<TransformerOptions, 'charsPerTick' | 'tickInterval' | 'effect' | 'pauseOnHidden'>>) => void\n /** transformer 实例(用于高级用法) */\n transformer: BlockTransformer<T>\n}\n\n/**\n * Vue 3 Composable: Block Transformer\n *\n * 用于控制 blocks 的逐步显示(打字机效果)\n * 作为解析器和渲染器之间的中间层\n *\n * 特性:\n * - 使用 requestAnimationFrame 实现流畅动画\n * - 支持随机步长 `charsPerTick: [1, 3]`\n * - 支持动画效果 `effect: 'typing'`\n * - 页面不可见时自动暂停\n *\n * @example\n * ```vue\n * <script setup>\n * import { useIncremark, useBlockTransformer, defaultPlugins } from '@incremark/vue'\n *\n * const { blocks, completedBlocks, append, finalize } = useIncremark()\n *\n * // 使用 completedBlocks 作为输入(ID 稳定)\n * const sourceBlocks = computed(() => completedBlocks.value.map(b => ({\n * id: b.id,\n * node: b.node,\n * status: b.status\n * })))\n *\n * // 添加打字机效果\n * const { displayBlocks, isProcessing, skip, effect } = useBlockTransformer(sourceBlocks, {\n * charsPerTick: [1, 3], // 随机步长\n * tickInterval: 30,\n * effect: 'typing', // 光标效果\n * plugins: defaultPlugins\n * })\n * </script>\n *\n * <template>\n * <Incremark :blocks=\"displayBlocks\" :class=\"{ 'typing': effect === 'typing' }\" />\n * <button v-if=\"isProcessing\" @click=\"skip\">跳过</button>\n * </template>\n * ```\n */\nexport function useBlockTransformer<T = unknown>(\n sourceBlocks: Ref<SourceBlock<T>[]> | ComputedRef<SourceBlock<T>[]>,\n options: UseBlockTransformerOptions = {}\n): UseBlockTransformerReturn<T> {\n const displayBlocksRef = ref<DisplayBlock<T>[]>([])\n const isProcessingRef = ref(false)\n const isPausedRef = ref(false)\n const effectRef = ref<AnimationEffect>(options.effect ?? 'none')\n\n const transformer = createBlockTransformer<T>({\n ...options,\n onChange: (blocks) => {\n displayBlocksRef.value = blocks as DisplayBlock<T>[]\n isProcessingRef.value = transformer.isProcessing()\n isPausedRef.value = transformer.isPausedState()\n }\n })\n\n // 监听源 blocks 变化\n watch(\n sourceBlocks,\n (blocks) => {\n // 推入新 blocks\n transformer.push(blocks)\n\n // 处理正在显示的 block 内容更新\n const currentDisplaying = displayBlocksRef.value.find((b) => !b.isDisplayComplete)\n if (currentDisplaying) {\n const updated = blocks.find((b) => b.id === currentDisplaying.id)\n if (updated) {\n transformer.update(updated)\n }\n }\n },\n { immediate: true, deep: true }\n )\n\n onUnmounted(() => {\n transformer.destroy()\n })\n\n return {\n displayBlocks: computed(() => displayBlocksRef.value) as ComputedRef<DisplayBlock<T>[]>,\n isProcessing: computed(() => isProcessingRef.value),\n isPaused: computed(() => isPausedRef.value),\n effect: computed(() => effectRef.value),\n skip: () => transformer.skip(),\n reset: () => transformer.reset(),\n pause: () => {\n transformer.pause()\n isPausedRef.value = true\n },\n resume: () => {\n transformer.resume()\n isPausedRef.value = false\n },\n setOptions: (opts) => {\n transformer.setOptions(opts)\n if (opts.effect !== undefined) {\n effectRef.value = opts.effect\n }\n },\n transformer\n }\n}\n","import { inject, computed, ref, type Ref, type ComputedRef, type InjectionKey } from 'vue'\nimport type { IncremarkLocale } from '@incremark/shared'\nimport { zhCN } from '@incremark/shared'\n\n/**\n * Locale 注入 key,用于 provide/inject\n */\nconst LOCALE_KEY: InjectionKey<Ref<IncremarkLocale>> = Symbol('incremark-locale')\n\n/**\n * Vue 国际化 Hook\n */\nexport interface UseLocaleReturn {\n /** 翻译函数 */\n t: ComputedRef<(key: string) => string>\n}\n\n/**\n * 使用 locale\n */\nexport function useLocale(): UseLocaleReturn {\n // 使用 inject 的默认值,如果没有 provider 则使用中文\n const locale = inject(LOCALE_KEY, ref(zhCN))\n\n const t = computed(() => (key: string) => {\n const keys = key.split('.')\n let value: any = locale.value\n for (const k of keys) {\n value = value?.[k]\n }\n return value || key\n })\n\n return { t }\n}\n\n/**\n * 提供 locale 的 key(用于 ConfigProvider)\n */\nexport { LOCALE_KEY }\n","import { inject } from 'vue'\nimport { definationsInjectionKey } from './useProvideDefinations'\n\n/**\n * support definations and footnoteDefinitions\n * @returns \n */\nexport function useDefinationsContext() {\n const definationContext = inject(definationsInjectionKey);\n\n if (!definationContext) {\n throw new Error('definationContext not found');\n }\n\n return definationContext;\n}","<script setup lang=\"ts\">\nimport { computed, type Component } from 'vue'\nimport type { ParsedBlock } from '@incremark/core'\nimport { useDefinationsContext } from '../composables/useDefinationsContext'\nimport type { UseIncremarkReturn } from '../composables/useIncremark'\nimport IncremarkRenderer from './IncremarkRenderer.vue'\nimport IncremarkFootnotes from './IncremarkFootnotes.vue'\n\n// 组件映射类型\nexport type ComponentMap = Partial<Record<string, Component>>\n\n// 可渲染的块类型(带 isLastPending 字段用于打字机光标)\nexport type RenderableBlock = ParsedBlock & { isLastPending?: boolean }\n\n/**\n * 代码块配置\n */\nexport interface CodeBlockConfig {\n /** 是否从一开始就接管渲染,而不是等到 completed 状态 */\n takeOver?: boolean\n}\n\nconst props = withDefaults(\n defineProps<{\n /** 要渲染的块列表(来自 useIncremark 的 blocks) */\n blocks?: RenderableBlock[]\n /** 内容是否完全显示完成(用于控制脚注等需要在内容完全显示后才出现的元素)\n * 如果传入了 incremark,则会自动使用 incremark.isDisplayComplete,此 prop 被忽略 */\n isDisplayComplete?: boolean\n /** 自定义组件映射,key 为节点类型 */\n components?: ComponentMap\n /** 自定义容器组件映射,key 为容器名称(如 'warning', 'info') */\n customContainers?: Record<string, Component>\n /** 自定义代码块组件映射,key 为代码语言名称(如 'echart', 'mermaid') */\n customCodeBlocks?: Record<string, Component>\n /** 代码块配置映射,key 为代码语言名称 */\n codeBlockConfigs?: Record<string, CodeBlockConfig>\n /** 待处理块的样式类名 */\n pendingClass?: string\n /** 已完成块的样式类名 */\n completedClass?: string\n /** 是否显示块状态边框 */\n showBlockStatus?: boolean\n /** 可选:useIncremark 返回的对象(用于自动注入数据) */\n incremark?: UseIncremarkReturn\n }>(),\n {\n blocks: () => [],\n isDisplayComplete: false,\n components: () => ({}),\n customContainers: () => ({}),\n customCodeBlocks: () => ({}),\n codeBlockConfigs: () => ({}),\n pendingClass: 'incremark-pending',\n completedClass: 'incremark-completed',\n showBlockStatus: false\n }\n)\n\nconst {\n footnoteReferenceOrder\n} = useDefinationsContext();\n\n// 计算实际使用的 blocks 和 isDisplayComplete\nconst actualBlocks = computed<RenderableBlock[]>(() => props.incremark?.blocks.value || props.blocks || [])\nconst actualIsDisplayComplete = computed(() => {\n // 优先使用 incremark 提供的 isDisplayComplete(已考虑打字机等状态)\n if (props.incremark) {\n return props.incremark.isDisplayComplete.value\n }\n // 否则使用用户传入的 isDisplayComplete\n return props.isDisplayComplete\n})\n\n</script>\n\n<template>\n <div class=\"incremark\">\n <!-- 主要内容块 -->\n <template v-for=\"block in actualBlocks\">\n <div\n v-if=\"block.node.type !== 'definition' && block.node.type !== 'footnoteDefinition'\"\n :key=\"block.id\"\n :class=\"[\n 'incremark-block',\n block.status === 'completed' ? completedClass : pendingClass,\n { 'incremark-show-status': showBlockStatus },\n { 'incremark-last-pending': block.isLastPending }\n ]\"\n >\n <IncremarkRenderer\n :node=\"block.node\"\n :block-status=\"block.status\"\n :custom-containers=\"customContainers\"\n :custom-code-blocks=\"customCodeBlocks\"\n :code-block-configs=\"codeBlockConfigs\"\n :components=\"components\"\n />\n </div>\n </template>\n\n <!-- 脚注列表(仅在内容完全显示后显示) -->\n <IncremarkFootnotes\n v-if=\"actualIsDisplayComplete && footnoteReferenceOrder.length > 0\"\n />\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport type { RootContent, HTML, Code } from 'mdast'\nimport type { Component } from 'vue'\nimport { computed } from 'vue'\nimport IncremarkHeading from './IncremarkHeading.vue'\nimport IncremarkParagraph from './IncremarkParagraph.vue'\nimport IncremarkCode from './IncremarkCode.vue'\nimport IncremarkList from './IncremarkList.vue'\nimport IncremarkTable from './IncremarkTable.vue'\nimport IncremarkBlockquote from './IncremarkBlockquote.vue'\nimport IncremarkThematicBreak from './IncremarkThematicBreak.vue'\nimport IncremarkMath from './IncremarkMath.vue'\nimport IncremarkHtmlElement from './IncremarkHtmlElement.vue'\nimport IncremarkContainer from './IncremarkContainer.vue'\nimport IncremarkDefault from './IncremarkDefault.vue'\nimport type { ContainerNode } from './IncremarkContainer.vue'\nimport type { CodeBlockConfig } from './Incremark.vue'\n\ntype ExtendedRootContent = RootContent | ContainerNode\n\nconst props = defineProps<{\n node: ExtendedRootContent\n customContainers?: Record<string, Component>\n customCodeBlocks?: Record<string, Component>\n codeBlockConfigs?: Record<string, CodeBlockConfig>\n blockStatus?: 'pending' | 'stable' | 'completed'\n components?: Partial<Record<string, Component>>\n}>()\n\n// 默认组件映射\nconst defaultComponentMap: Record<string, Component> = {\n heading: IncremarkHeading,\n paragraph: IncremarkParagraph,\n code: IncremarkCode,\n list: IncremarkList,\n table: IncremarkTable,\n blockquote: IncremarkBlockquote,\n thematicBreak: IncremarkThematicBreak,\n math: IncremarkMath,\n inlineMath: IncremarkMath,\n htmlElement: IncremarkHtmlElement,\n containerDirective: IncremarkContainer,\n leafDirective: IncremarkContainer,\n textDirective: IncremarkContainer,\n}\n\n// 合并用户自定义组件\nconst componentMap = computed(() => ({\n ...defaultComponentMap,\n ...props.components\n}))\n\nfunction getComponent(type: string): Component {\n return componentMap.value[type] || IncremarkDefault\n}\n\n/**\n * 检查是否是容器节点\n */\nfunction isContainerNode(node: ExtendedRootContent): node is ContainerNode {\n return (node as any).type === 'containerDirective' || \n (node as any).type === 'leafDirective' || \n (node as any).type === 'textDirective'\n}\n\n/**\n * 检查是否是 html 节点\n */\nfunction isHtmlNode(node: ExtendedRootContent): node is HTML {\n return node.type === 'html'\n}\n</script>\n\n<template>\n <!-- HTML 节点:渲染为代码块显示源代码 -->\n <pre v-if=\"isHtmlNode(node)\" class=\"incremark-html-code\"><code>{{ (node as HTML).value }}</code></pre>\n <!-- 容器节点:使用容器组件,传递 customContainers -->\n <IncremarkContainer\n v-else-if=\"isContainerNode(node)\"\n :node=\"node as ContainerNode\"\n :custom-containers=\"customContainers\"\n />\n <!-- 代码节点:特殊处理,传递 customCodeBlocks、codeBlockConfigs 和 blockStatus -->\n <IncremarkCode\n v-else-if=\"(node as RootContent).type === 'code'\"\n :node=\"node as Code\"\n :custom-code-blocks=\"customCodeBlocks\"\n :code-block-configs=\"codeBlockConfigs\"\n :block-status=\"blockStatus\"\n :default-code-component=\"components?.['code']\"\n />\n <!-- 其他节点:使用对应组件 -->\n <component v-else :is=\"getComponent((node as RootContent).type)\" :node=\"node as RootContent\" />\n</template>\n\n","<script setup lang=\"ts\">\nimport type { Heading } from 'mdast'\nimport { computed } from 'vue'\nimport IncremarkInline from './IncremarkInline.vue'\n\nconst props = defineProps<{\n node: Heading\n}>()\n\nconst tag = computed(() => `h${props.node.depth}`)\n</script>\n\n<template>\n <component :is=\"tag\" :class=\"`incremark-heading h${node.depth}`\">\n <IncremarkInline :nodes=\"node.children\" />\n </component>\n</template>\n","<script setup lang=\"ts\">\nimport type { PhrasingContent, RootContent, ImageReference, LinkReference } from 'mdast'\nimport type { TextChunk } from '@incremark/core'\nimport {\n type TextNodeWithChunks,\n hasChunks,\n getStableText,\n isHtmlNode\n} from '@incremark/shared'\nimport IncremarkMath from './IncremarkMath.vue'\nimport IncremarkHtmlElement from './IncremarkHtmlElement.vue'\nimport { useDefinationsContext } from '../composables/useDefinationsContext'\n\n// Math 节点类型\ninterface MathNode {\n type: 'math' | 'inlineMath'\n value: string\n}\n\n// HtmlElement 节点类型\ninterface HtmlElementNode {\n type: 'htmlElement'\n tagName: string\n attrs: Record<string, string>\n children: RootContent[]\n}\n\n/**\n * 类型守卫:检查是否是 htmlElement 节点\n */\nfunction isHtmlElementNode(node: PhrasingContent): node is PhrasingContent & HtmlElementNode {\n return (node as unknown as HtmlElementNode).type === 'htmlElement'\n}\n\n/**\n * 类型守卫:检查是否是 imageReference 节点\n */\nfunction isImageReference(node: PhrasingContent): node is ImageReference {\n return node.type === 'imageReference'\n}\n\n/**\n * 类型守卫:检查是否是 linkReference 节点\n */\nfunction isLinkReference(node: PhrasingContent): node is LinkReference {\n return node.type === 'linkReference'\n}\n\nconst props = defineProps<{\n nodes: PhrasingContent[]\n}>()\n\nconst {\n definations,\n footnoteDefinitions\n} = useDefinationsContext()\n\n/**\n * 获取节点的 chunks(类型安全)\n */\nfunction getChunks(node: PhrasingContent): TextChunk[] | undefined {\n if (hasChunks(node)) {\n return (node as TextNodeWithChunks).chunks\n }\n return undefined\n}\n\n/**\n * 类型守卫:检查是否是 inlineMath 节点\n * inlineMath 是 mdast-util-math 扩展的类型,不在标准 PhrasingContent 中\n */\nfunction isInlineMath(node: PhrasingContent): node is PhrasingContent & MathNode {\n return (node as unknown as MathNode).type === 'inlineMath'\n}\n\n</script>\n\n<template>\n <template v-for=\"(node, idx) in nodes\" :key=\"idx\">\n <!-- 文本(支持 chunks 渐入动画) -->\n <template v-if=\"node.type === 'text'\">\n <!-- 稳定文本(已经显示过的部分,无动画) -->\n {{ getStableText(node as TextNodeWithChunks) }}\n <!-- 新增的 chunk 部分(带渐入动画) -->\n <span \n v-for=\"chunk in getChunks(node)\" \n :key=\"chunk.createdAt\"\n class=\"incremark-fade-in\"\n >{{ chunk.text }}</span>\n </template>\n\n <!-- 行内公式 -->\n <IncremarkMath v-else-if=\"isInlineMath(node)\" :node=\"(node as unknown as MathNode)\" />\n\n <!-- htmlElement 节点(结构化的 HTML 元素) -->\n <IncremarkHtmlElement \n v-else-if=\"isHtmlElementNode(node)\" \n :node=\"(node as unknown as HtmlElementNode)\" \n />\n\n <!-- HTML 节点(原始 HTML,如未启用 htmlTree 选项) -->\n <span v-else-if=\"isHtmlNode(node)\" class=\"incremark-inline-html\" v-html=\"(node as any).value\"></span>\n\n <!-- 加粗 -->\n <strong v-else-if=\"node.type === 'strong'\">\n <IncremarkInline :nodes=\"(node.children as PhrasingContent[])\" />\n </strong>\n\n <!-- 斜体 -->\n <em v-else-if=\"node.type === 'emphasis'\">\n <IncremarkInline :nodes=\"(node.children as PhrasingContent[])\" />\n </em>\n\n <!-- 行内代码 -->\n <code v-else-if=\"node.type === 'inlineCode'\" class=\"incremark-inline-code\">{{ (node as any).value }}</code>\n\n <!-- 链接 -->\n <a\n v-else-if=\"node.type === 'link'\"\n class=\"incremark-link\"\n :href=\"node.url\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n <IncremarkInline :nodes=\"(node.children as PhrasingContent[])\" />\n </a>\n\n <!-- 图片 -->\n <img\n v-else-if=\"node.type === 'image'\"\n class=\"incremark-image\"\n :src=\"node.url\"\n :alt=\"node.alt || ''\"\n :title=\"(node as any).title || undefined\"\n loading=\"lazy\"\n />\n\n <!-- 引用式图片(imageReference) -->\n <template v-else-if=\"isImageReference(node)\">\n <img\n v-if=\"definations[node.identifier]\"\n class=\"incremark-image incremark-reference-image\"\n :src=\"definations[node.identifier].url\"\n :alt=\"(node as ImageReference).alt || ''\"\n :title=\"definations[node.identifier].title || undefined\"\n loading=\"lazy\"\n />\n <!-- 如果没有找到定义,渲染为原始文本(降级处理) -->\n <span v-else class=\"incremark-image-ref-missing\">\n ![{{ (node as ImageReference).alt }}][{{ (node as ImageReference).identifier || (node as ImageReference).label }}]\n </span>\n </template>\n\n <!-- 引用式链接(linkReference) -->\n <template v-else-if=\"isLinkReference(node)\">\n <a\n v-if=\"definations[node.identifier]\"\n class=\"incremark-link incremark-reference-link\"\n :href=\"definations[node.identifier].url\"\n :title=\"definations[node.identifier].title || undefined\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n <IncremarkInline :nodes=\"((node as LinkReference).children as PhrasingContent[])\" />\n </a>\n <!-- 如果没有找到定义,渲染为原始文本(降级处理) -->\n <span v-else class=\"incremark-link-ref-missing\">\n [{{ ((node as LinkReference).children as any[]).map((c: any) => c.value).join('') }}][{{ (node as LinkReference).identifier || (node as LinkReference).label }}]\n </span>\n </template>\n\n <!-- 脚注引用(footnoteReference) -->\n <sup v-else-if=\"node.type === 'footnoteReference'\" class=\"incremark-footnote-ref\">\n <a :href=\"`#fn-${(node as any).identifier}`\" :id=\"`fnref-${(node as any).identifier}`\">\n [{{ (node as any).identifier }}]\n </a>\n </sup>\n\n <!-- 换行 -->\n <br v-else-if=\"node.type === 'break'\" />\n\n <!-- 删除线 -->\n <del v-else-if=\"node.type === 'delete'\">\n <IncremarkInline :nodes=\"(node.children as PhrasingContent[])\" />\n </del>\n </template>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, ref, watch, shallowRef, onUnmounted } from 'vue'\n\n// Math 节点类型(来自 mdast-util-math)\ninterface MathNode {\n type: 'math' | 'inlineMath'\n value: string\n data?: {\n hName?: string\n hProperties?: Record<string, any>\n }\n}\n\nconst props = withDefaults(\n defineProps<{\n node: MathNode\n /** 渲染延迟(毫秒),用于流式输入时防抖 */\n renderDelay?: number\n }>(),\n {\n renderDelay: 300\n }\n)\n\nconst renderedHtml = ref('')\nconst renderError = ref('')\nconst isLoading = ref(false)\nconst katexRef = shallowRef<any>(null)\nlet renderTimer: ReturnType<typeof setTimeout> | null = null\n\nconst isInline = computed(() => props.node.type === 'inlineMath')\nconst formula = computed(() => props.node.value)\n\n// 带防抖动的渲染\nfunction scheduleRender() {\n if (!formula.value) {\n renderedHtml.value = ''\n return\n }\n\n // 清除之前的定时器\n if (renderTimer) {\n clearTimeout(renderTimer)\n }\n\n isLoading.value = true\n\n // 防抖动延迟渲染\n renderTimer = setTimeout(() => {\n doRender()\n }, props.renderDelay)\n}\n\nasync function doRender() {\n if (!formula.value) return\n\n try {\n // 动态导入 KaTeX\n if (!katexRef.value) {\n // @ts-ignore - katex 是可选依赖\n const katexModule = await import('katex')\n katexRef.value = katexModule.default\n }\n\n const katex = katexRef.value\n renderedHtml.value = katex.renderToString(formula.value, {\n displayMode: !isInline.value,\n throwOnError: false,\n strict: false\n })\n renderError.value = ''\n } catch (e: any) {\n // 静默失败,可能是公式不完整\n renderError.value = ''\n renderedHtml.value = ''\n } finally {\n isLoading.value = false\n }\n}\n\nonUnmounted(() => {\n if (renderTimer) {\n clearTimeout(renderTimer)\n }\n})\n\nwatch(formula, scheduleRender, { immediate: true })\n</script>\n\n<template>\n <!-- 行内公式 -->\n <span v-if=\"isInline\" class=\"incremark-math-inline\">\n <!-- 渲染成功 -->\n <span v-if=\"renderedHtml && !isLoading\" v-html=\"renderedHtml\" />\n <!-- 加载中或未渲染:显示源码 -->\n <code v-else class=\"math-source\">{{ formula }}</code>\n </span>\n <!-- 块级公式 -->\n <div v-else class=\"incremark-math-block\">\n <!-- 渲染成功 -->\n <div v-if=\"renderedHtml && !isLoading\" v-html=\"renderedHtml\" class=\"math-rendered\" />\n <!-- 加载中或未渲染:显示源码 -->\n <pre v-else class=\"math-source-block\"><code>{{ formula }}</code></pre>\n </div>\n</template>\n","import { createCommentVNode as _createCommentVNode, openBlock as _openBlock, createElementBlock as _createElementBlock, toDisplayString as _toDisplayString, createElementVNode as _createElementVNode, Fragment as _Fragment } from \"vue\"\n\nconst _hoisted_1 = {\n key: 0,\n class: \"incremark-math-inline\"\n}\nconst _hoisted_2 = [\"innerHTML\"]\nconst _hoisted_3 = { class: \"math-source\" }\nconst _hoisted_4 = { class: \"incremark-math-block\" }\nconst _hoisted_5 = [\"innerHTML\"]\nconst _hoisted_6 = { class: \"math-source-block\" }\n\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n return (_openBlock(), _createElementBlock(_Fragment, null, [\n _createCommentVNode(\" 行内公式 \"),\n ($setup.isInline)\n ? (_openBlock(), _createElementBlock(\"span\", _hoisted_1, [\n _createCommentVNode(\" 渲染成功 \"),\n ($setup.renderedHtml && !$setup.isLoading)\n ? (_openBlock(), _createElementBlock(\"span\", {\n key: 0,\n innerHTML: $setup.renderedHtml\n }, null, 8 /* PROPS */, _hoisted_2))\n : (_openBlock(), _createElementBlock(_Fragment, { key: 1 }, [\n _createCommentVNode(\" 加载中或未渲染:显示源码 \"),\n _createElementVNode(\"code\", _hoisted_3, _toDisplayString($setup.formula), 1 /* TEXT */)\n ], 2112 /* STABLE_FRAGMENT, DEV_ROOT_FRAGMENT */))\n ]))\n : (_openBlock(), _createElementBlock(_Fragment, { key: 1 }, [\n _createCommentVNode(\" 块级公式 \"),\n _createElementVNode(\"div\", _hoisted_4, [\n _createCommentVNode(\" 渲染成功 \"),\n ($setup.renderedHtml && !$setup.isLoading)\n ? (_openBlock(), _createElementBlock(\"div\", {\n key: 0,\n innerHTML: $setup.renderedHtml,\n class: \"math-rendered\"\n }, null, 8 /* PROPS */, _hoisted_5))\n : (_openBlock(), _createElementBlock(_Fragment, { key: 1 }, [\n _createCommentVNode(\" 加载中或未渲染:显示源码 \"),\n _createElementVNode(\"pre\", _hoisted_6, [\n _createElementVNode(\"code\", null, _toDisplayString($setup.formula), 1 /* TEXT */)\n ])\n ], 2112 /* STABLE_FRAGMENT, DEV_ROOT_FRAGMENT */))\n ])\n ], 2112 /* STABLE_FRAGMENT, DEV_ROOT_FRAGMENT */))\n ], 2112 /* STABLE_FRAGMENT, DEV_ROOT_FRAGMENT */))\n}","import script from \"/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkMath.vue?type=script\";import { render } from \"/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkMath.vue?type=template\"; script.render = render;script.__file = \"src/components/IncremarkMath.vue\";export default script;","<script setup lang=\"ts\">\nimport type { RootContent, PhrasingContent } from 'mdast'\nimport IncremarkInline from './IncremarkInline.vue'\n\n/**\n * HtmlElementNode 类型定义(与 @incremark/core 中的定义一致)\n */\ninterface HtmlElementNode {\n type: 'htmlElement'\n tagName: string\n attrs: Record<string, string>\n children: RootContent[]\n data?: {\n rawHtml?: string\n parsed?: boolean\n originalType?: string\n }\n}\n\ndefineProps<{\n node: HtmlElementNode\n}>()\n\n/**\n * 判断是否是行内元素\n */\nfunction isInlineElement(tagName: string): boolean {\n const inlineElements = [\n 'a', 'abbr', 'acronym', 'b', 'bdo', 'big', 'br', 'button', 'cite', \n 'code', 'dfn', 'em', 'i', 'img', 'input', 'kbd', 'label', 'map', \n 'object', 'output', 'q', 'samp', 'script', 'select', 'small', \n 'span', 'strong', 'sub', 'sup', 'textarea', 'time', 'tt', 'var'\n ]\n return inlineElements.includes(tagName.toLowerCase())\n}\n\n/**\n * 判断是否是自闭合元素\n */\nfunction isVoidElement(tagName: string): boolean {\n const voidElements = [\n 'area', 'base', 'br', 'col', 'embed', 'hr', 'img', 'input', \n 'link', 'meta', 'param', 'source', 'track', 'wbr'\n ]\n return voidElements.includes(tagName.toLowerCase())\n}\n\n/**\n * 判断子节点是否都是行内内容\n */\nfunction hasOnlyInlineChildren(children: RootContent[]): boolean {\n if (!children || children.length === 0) return true\n \n return children.every(child => {\n const type = child.type\n // 常见的行内类型\n const inlineTypes = ['text', 'strong', 'emphasis', 'inlineCode', 'link', 'image', 'break', 'html', 'htmlElement']\n if (inlineTypes.includes(type)) {\n // 如果是 htmlElement,检查是否是行内元素\n if (type === 'htmlElement') {\n return isInlineElement((child as unknown as HtmlElementNode).tagName)\n }\n return true\n }\n return false\n })\n}\n\n/**\n * 将属性对象转换为 HTML 属性字符串(用于 v-bind)\n */\nfunction getAttrs(attrs: Record<string, string>): Record<string, string> {\n // 过滤掉可能有问题的属性\n const result: Record<string, string> = {}\n for (const [key, value] of Object.entries(attrs)) {\n // 跳过事件属性(已在解析时过滤,这里双重保险)\n if (key.startsWith('on')) continue\n result[key] = value\n }\n return result\n}\n</script>\n\n<template>\n <component \n :is=\"node.tagName\" \n v-bind=\"getAttrs(node.attrs)\"\n :class=\"['incremark-html-element', `incremark-${node.tagName}`]\"\n >\n <!-- 自闭合元素没有子节点 -->\n <template v-if=\"!isVoidElement(node.tagName)\">\n <!-- 如果子节点都是行内内容,使用 IncremarkInline -->\n <template v-if=\"hasOnlyInlineChildren(node.children)\">\n <IncremarkInline :nodes=\"(node.children as PhrasingContent[])\" />\n </template>\n \n <!-- 否则递归渲染每个子节点 -->\n <template v-else>\n <template v-for=\"(child, idx) in node.children\" :key=\"idx\">\n <!-- 如果子节点是 htmlElement,递归 -->\n <IncremarkHtmlElement \n v-if=\"child.type === 'htmlElement'\" \n :node=\"(child as unknown as HtmlElementNode)\" \n />\n <!-- 如果是文本节点 -->\n <template v-else-if=\"child.type === 'text'\">\n {{ (child as any).value }}\n </template>\n <!-- 其他类型尝试用 IncremarkInline -->\n <IncremarkInline \n v-else-if=\"['strong', 'emphasis', 'inlineCode', 'link', 'image', 'break'].includes(child.type)\"\n :nodes=\"[child as PhrasingContent]\" \n />\n <!-- 段落等块级元素 -->\n <template v-else-if=\"child.type === 'paragraph'\">\n <p><IncremarkInline :nodes=\"((child as any).children as PhrasingContent[])\" /></p>\n </template>\n <!-- 其他未知类型,显示原始 -->\n <template v-else>\n <div class=\"incremark-unknown-child\">{{ child.type }}</div>\n </template>\n </template>\n </template>\n </template>\n </component>\n</template>\n\n","import { createCommentVNode as _createCommentVNode, openBlock as _openBlock, createBlock as _createBlock, renderList as _renderList, Fragment as _Fragment, createElementBlock as _createElementBlock, resolveComponent as _resolveComponent, toDisplayString as _toDisplayString, createTextVNode as _createTextVNode, createVNode as _createVNode, createElementVNode as _createElementVNode, resolveDynamicComponent as _resolveDynamicComponent, mergeProps as _mergeProps, withCtx as _withCtx } from \"vue\"\n\nconst _hoisted_1 = { class: \"incremark-unknown-child\" }\n\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_IncremarkHtmlElement = _resolveComponent(\"IncremarkHtmlElement\", true)\n\n return (_openBlock(), _createBlock(_resolveDynamicComponent($props.node.tagName), _mergeProps($setup.getAttrs($props.node.attrs), {\n class: ['incremark-html-element', `incremark-${$props.node.tagName}`]\n }), {\n default: _withCtx(() => [\n _createCommentVNode(\" 自闭合元素没有子节点 \"),\n (!$setup.isVoidElement($props.node.tagName))\n ? (_openBlock(), _createElementBlock(_Fragment, { key: 0 }, [\n _createCommentVNode(\" 如果子节点都是行内内容,使用 IncremarkInline \"),\n ($setup.hasOnlyInlineChildren($props.node.children))\n ? (_openBlock(), _createBlock($setup[\"IncremarkInline\"], {\n key: 0,\n nodes: ($props.node.children as PhrasingContent[])\n }, null, 8 /* PROPS */, [\"nodes\"]))\n : (_openBlock(), _createElementBlock(_Fragment, { key: 1 }, [\n _createCommentVNode(\" 否则递归渲染每个子节点 \"),\n (_openBlock(true), _createElementBlock(_Fragment, null, _renderList($props.node.children, (child, idx) => {\n return (_openBlock(), _createElementBlock(_Fragment, { key: idx }, [\n _createCommentVNode(\" 如果子节点是 htmlElement,递归 \"),\n (child.type === 'htmlElement')\n ? (_openBlock(), _createBlock(_component_IncremarkHtmlElement, {\n key: 0,\n node: (child as unknown as HtmlElementNode)\n }, null, 8 /* PROPS */, [\"node\"]))\n : (child.type === 'text')\n ? (_openBlock(), _createElementBlock(_Fragment, { key: 1 }, [\n _createCommentVNode(\" 如果是文本节点 \"),\n _createTextVNode(_toDisplayString((child as any).value), 1 /* TEXT */)\n ], 64 /* STABLE_FRAGMENT */))\n : (['strong', 'emphasis', 'inlineCode', 'link', 'image', 'break'].includes(child.type))\n ? (_openBlock(), _createElementBlock(_Fragment, { key: 2 }, [\n _createCommentVNode(\" 其他类型尝试用 IncremarkInline \"),\n _createVNode($setup[\"IncremarkInline\"], {\n nodes: [child as PhrasingContent]\n }, null, 8 /* PROPS */, [\"nodes\"])\n ], 2112 /* STABLE_FRAGMENT, DEV_ROOT_FRAGMENT */))\n : (child.type === 'paragraph')\n ? (_openBlock(), _createElementBlock(_Fragment, { key: 3 }, [\n _createCommentVNode(\" 段落等块级元素 \"),\n _createElementVNode(\"p\", null, [\n _createVNode($setup[\"IncremarkInline\"], {\n nodes: ((child as any).children as PhrasingContent[])\n }, null, 8 /* PROPS */, [\"nodes\"])\n ])\n ], 64 /* STABLE_FRAGMENT */))\n : (_openBlock(), _createElementBlock(_Fragment, { key: 4 }, [\n _createCommentVNode(\" 其他未知类型,显示原始 \"),\n _createElementVNode(\"div\", _hoisted_1, _toDisplayString(child.type), 1 /* TEXT */)\n ], 64 /* STABLE_FRAGMENT */))\n ], 64 /* STABLE_FRAGMENT */))\n }), 128 /* KEYED_FRAGMENT */))\n ], 64 /* STABLE_FRAGMENT */))\n ], 64 /* STABLE_FRAGMENT */))\n : _createCommentVNode(\"v-if\", true)\n ]),\n _: 1 /* STABLE */\n }, 16 /* FULL_PROPS */, [\"class\"]))\n}","import script from \"/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkHtmlElement.vue?type=script\";import { render } from \"/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkHtmlElement.vue?type=template\"; script.render = render;script.__file = \"src/components/IncremarkHtmlElement.vue\";export default script;","import { renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, toDisplayString as _toDisplayString, createTextVNode as _createTextVNode, createVNode as _createVNode, createElementVNode as _createElementVNode, resolveComponent as _resolveComponent } from \"vue\"\n\nconst _hoisted_1 = [\"innerHTML\"]\nconst _hoisted_2 = { class: \"incremark-inline-code\" }\nconst _hoisted_3 = [\"href\"]\nconst _hoisted_4 = [\"src\", \"alt\", \"title\"]\nconst _hoisted_5 = [\"src\", \"alt\", \"title\"]\nconst _hoisted_6 = { class: \"incremark-image-ref-missing\" }\nconst _hoisted_7 = [\"href\", \"title\"]\nconst _hoisted_8 = { class: \"incremark-link-ref-missing\" }\nconst _hoisted_9 = { class: \"incremark-footnote-ref\" }\nconst _hoisted_10 = [\"href\", \"id\"]\n\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_IncremarkInline = _resolveComponent(\"IncremarkInline\", true)\n\n return (_openBlock(true), _createElementBlock(_Fragment, null, _renderList($props.nodes, (node, idx) => {\n return (_openBlock(), _createElementBlock(_Fragment, { key: idx }, [\n _createCommentVNode(\" 文本(支持 chunks 渐入动画) \"),\n (node.type === 'text')\n ? (_openBlock(), _createElementBlock(_Fragment, { key: 0 }, [\n _createCommentVNode(\" 稳定文本(已经显示过的部分,无动画) \"),\n _createTextVNode(\" \" + _toDisplayString($setup.getStableText(node as TextNodeWithChunks)) + \" \", 1 /* TEXT */),\n _createCommentVNode(\" 新增的 chunk 部分(带渐入动画) \"),\n (_openBlock(true), _createElementBlock(_Fragment, null, _renderList($setup.getChunks(node), (chunk) => {\n return (_openBlock(), _createElementBlock(\"span\", {\n key: chunk.createdAt,\n class: \"incremark-fade-in\"\n }, _toDisplayString(chunk.text), 1 /* TEXT */))\n }), 128 /* KEYED_FRAGMENT */))\n ], 64 /* STABLE_FRAGMENT */))\n : ($setup.isInlineMath(node))\n ? (_openBlock(), _createElementBlock(_Fragment, { key: 1 }, [\n _createCommentVNode(\" 行内公式 \"),\n _createVNode($setup[\"IncremarkMath\"], {\n node: (node as unknown as MathNode)\n }, null, 8 /* PROPS */, [\"node\"])\n ], 2112 /* STABLE_FRAGMENT, DEV_ROOT_FRAGMENT */))\n : ($setup.isHtmlElementNode(node))\n ? (_openBlock(), _createElementBlock(_Fragment, { key: 2 }, [\n _createCommentVNode(\" htmlElement 节点(结构化的 HTML 元素) \"),\n _createVNode($setup[\"IncremarkHtmlElement\"], {\n node: (node as unknown as HtmlElementNode)\n }, null, 8 /* PROPS */, [\"node\"])\n ], 2112 /* STABLE_FRAGMENT, DEV_ROOT_FRAGMENT */))\n : ($setup.isHtmlNode(node))\n ? (_openBlock(), _createElementBlock(_Fragment, { key: 3 }, [\n _createCommentVNode(\" HTML 节点(原始 HTML,如未启用 htmlTree 选项) \"),\n _createElementVNode(\"span\", {\n class: \"incremark-inline-html\",\n innerHTML: (node as any).value\n }, null, 8 /* PROPS */, _hoisted_1)\n ], 2112 /* STABLE_FRAGMENT, DEV_ROOT_FRAGMENT */))\n : (node.type === 'strong')\n ? (_openBlock(), _createElementBlock(_Fragment, { key: 4 }, [\n _createCommentVNode(\" 加粗 \"),\n _createElementVNode(\"strong\", null, [\n _createVNode(_component_IncremarkInline, {\n nodes: (node.children as PhrasingContent[])\n }, null, 8 /* PROPS */, [\"nodes\"])\n ])\n ], 2112 /* STABLE_FRAGMENT, DEV_ROOT_FRAGMENT */))\n : (node.type === 'emphasis')\n ? (_openBlock(), _createElementBlock(_Fragment, { key: 5 }, [\n _createCommentVNode(\" 斜体 \"),\n _createElementVNode(\"em\", null, [\n _createVNode(_component_IncremarkInline, {\n nodes: (node.children as PhrasingContent[])\n }, null, 8 /* PROPS */, [\"nodes\"])\n ])\n ], 2112 /* STABLE_FRAGMENT, DEV_ROOT_FRAGMENT */))\n : (node.type === 'inlineCode')\n ? (_openBlock(), _createElementBlock(_Fragment, { key: 6 }, [\n _createCommentVNode(\" 行内代码 \"),\n _createElementVNode(\"code\", _hoisted_2, _toDisplayString((node as any).value), 1 /* TEXT */)\n ], 2112 /* STABLE_FRAGMENT, DEV_ROOT_FRAGMENT */))\n : (node.type === 'link')\n ? (_openBlock(), _createElementBlock(_Fragment, { key: 7 }, [\n _createCommentVNode(\" 链接 \"),\n _createElementVNode(\"a\", {\n class: \"incremark-link\",\n href: node.url,\n target: \"_blank\",\n rel: \"noopener noreferrer\"\n }, [\n _createVNode(_component_IncremarkInline, {\n nodes: (node.children as PhrasingContent[])\n }, null, 8 /* PROPS */, [\"nodes\"])\n ], 8 /* PROPS */, _hoisted_3)\n ], 2112 /* STABLE_FRAGMENT, DEV_ROOT_FRAGMENT */))\n : (node.type === 'image')\n ? (_openBlock(), _createElementBlock(_Fragment, { key: 8 }, [\n _createCommentVNode(\" 图片 \"),\n _createElementVNode(\"img\", {\n class: \"incremark-image\",\n src: node.url,\n alt: node.alt || '',\n title: (node as any).title || undefined,\n loading: \"lazy\"\n }, null, 8 /* PROPS */, _hoisted_4)\n ], 2112 /* STABLE_FRAGMENT, DEV_ROOT_FRAGMENT */))\n : ($setup.isImageReference(node))\n ? (_openBlock(), _createElementBlock(_Fragment, { key: 9 }, [\n _createCommentVNode(\" 引用式图片(imageReference) \"),\n ($setup.definations[node.identifier])\n ? (_openBlock(), _createElementBlock(\"img\", {\n key: 0,\n class: \"incremark-image incremark-reference-image\",\n src: $setup.definations[node.identifier].url,\n alt: (node as ImageReference).alt || '',\n title: $setup.definations[node.identifier].title || undefined,\n loading: \"lazy\"\n }, null, 8 /* PROPS */, _hoisted_5))\n : (_openBlock(), _createElementBlock(_Fragment, { key: 1 }, [\n _createCommentVNode(\" 如果没有找到定义,渲染为原始文本(降级处理) \"),\n _createElementVNode(\"span\", _hoisted_6, \" ![\" + _toDisplayString((node as ImageReference).alt) + \"][\" + _toDisplayString((node as ImageReference).identifier || (node as ImageReference).label) + \"] \", 1 /* TEXT */)\n ], 2112 /* STABLE_FRAGMENT, DEV_ROOT_FRAGMENT */))\n ], 64 /* STABLE_FRAGMENT */))\n : ($setup.isLinkReference(node))\n ? (_openBlock(), _createElementBlock(_Fragment, { key: 10 }, [\n _createCommentVNode(\" 引用式链接(linkReference) \"),\n ($setup.definations[node.identifier])\n ? (_openBlock(), _createElementBlock(\"a\", {\n key: 0,\n class: \"incremark-link incremark-reference-link\",\n href: $setup.definations[node.identifier].url,\n title: $setup.definations[node.identifier].title || undefined,\n target: \"_blank\",\n rel: \"noopener noreferrer\"\n }, [\n _createVNode(_component_IncremarkInline, {\n nodes: ((node as LinkReference).children as PhrasingContent[])\n }, null, 8 /* PROPS */, [\"nodes\"])\n ], 8 /* PROPS */, _hoisted_7))\n : (_openBlock(), _createElementBlock(_Fragment, { key: 1 }, [\n _createCommentVNode(\" 如果没有找到定义,渲染为原始文本(降级处理) \"),\n _createElementVNode(\"span\", _hoisted_8, \" [\" + _toDisplayString(((node as LinkReference).children as any[]).map((c) => c.value).join('')) + \"][\" + _toDisplayString((node as LinkReference).identifier || (node as LinkReference).label) + \"] \", 1 /* TEXT */)\n ], 2112 /* STABLE_FRAGMENT, DEV_ROOT_FRAGMENT */))\n ], 64 /* STABLE_FRAGMENT */))\n : (node.type === 'footnoteReference')\n ? (_openBlock(), _createElementBlock(_Fragment, { key: 11 }, [\n _createCommentVNode(\" 脚注引用(footnoteReference) \"),\n _createElementVNode(\"sup\", _hoisted_9, [\n _createElementVNode(\"a\", {\n href: `#fn-${(node as any).identifier}`,\n id: `fnref-${(node as any).identifier}`\n }, \" [\" + _toDisplayString((node as any).identifier) + \"] \", 9 /* TEXT, PROPS */, _hoisted_10)\n ])\n ], 2112 /* STABLE_FRAGMENT, DEV_ROOT_FRAGMENT */))\n : (node.type === 'break')\n ? (_openBlock(), _createElementBlock(_Fragment, { key: 12 }, [\n _createCommentVNode(\" 换行 \"),\n _cache[0] || (_cache[0] = _createElementVNode(\"br\", null, null, -1 /* CACHED */))\n ], 2112 /* STABLE_FRAGMENT, DEV_ROOT_FRAGMENT */))\n : (node.type === 'delete')\n ? (_openBlock(), _createElementBlock(_Fragment, { key: 13 }, [\n _createCommentVNode(\" 删除线 \"),\n _createElementVNode(\"del\", null, [\n _createVNode(_component_IncremarkInline, {\n nodes: (node.children as PhrasingContent[])\n }, null, 8 /* PROPS */, [\"nodes\"])\n ])\n ], 2112 /* STABLE_FRAGMENT, DEV_ROOT_FRAGMENT */))\n : _createCommentVNode(\"v-if\", true)\n ], 64 /* STABLE_FRAGMENT */))\n }), 128 /* KEYED_FRAGMENT */))\n}","import script from \"/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkInline.vue?type=script\";import { render } from \"/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkInline.vue?type=template\"; script.render = render;script.__file = \"src/components/IncremarkInline.vue\";export default script;","import { createVNode as _createVNode, resolveDynamicComponent as _resolveDynamicComponent, normalizeClass as _normalizeClass, withCtx as _withCtx, openBlock as _openBlock, createBlock as _createBlock } from \"vue\"\n\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n return (_openBlock(), _createBlock(_resolveDynamicComponent($setup.tag), {\n class: _normalizeClass(`incremark-heading h${$props.node.depth}`)\n }, {\n default: _withCtx(() => [\n _createVNode($setup[\"IncremarkInline\"], {\n nodes: $props.node.children\n }, null, 8 /* PROPS */, [\"nodes\"])\n ]),\n _: 1 /* STABLE */\n }, 8 /* PROPS */, [\"class\"]))\n}","import script from \"/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkHeading.vue?type=script\";import { render } from \"/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkHeading.vue?type=template\"; script.render = render;script.__file = \"src/components/IncremarkHeading.vue\";export default script;","import { createVNode as _createVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nconst _hoisted_1 = { class: \"incremark-paragraph\" }\n\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n return (_openBlock(), _createElementBlock(\"p\", _hoisted_1, [\n _createVNode($setup[\"IncremarkInline\"], {\n nodes: $props.node.children\n }, null, 8 /* PROPS */, [\"nodes\"])\n ]))\n}","import script from \"/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkParagraph.vue?type=script\";import { render } from \"/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkParagraph.vue?type=template\"; script.render = render;script.__file = \"src/components/IncremarkParagraph.vue\";export default script;","<script setup lang=\"ts\">\nimport type { Code } from 'mdast'\nimport type { Component } from 'vue'\nimport { computed, onMounted } from 'vue'\n\nimport type { CodeBlockConfig } from './Incremark.vue'\nimport IncremarkCodeMermaid from './IncremarkCodeMermaid.vue'\nimport IncremarkCodeDefault from './IncremarkCodeDefault.vue'\n\ninterface Props {\n node: Code\n /** Shiki 主题,默认 github-dark */\n theme?: string\n /** 默认回退主题(当指定主题加载失败时使用),默认 github-dark */\n fallbackTheme?: string\n /** 是否禁用代码高亮 */\n disableHighlight?: boolean\n /** Mermaid 渲染延迟(毫秒),用于流式输入时防抖 */\n mermaidDelay?: number\n /** 自定义代码块组件映射,key 为代码语言名称 */\n customCodeBlocks?: Record<string, Component>\n /** 代码块配置映射,key 为代码语言名称 */\n codeBlockConfigs?: Record<string, CodeBlockConfig>\n /** 块状态,用于判断是否使用自定义组件 */\n blockStatus?: 'pending' | 'stable' | 'completed'\n /** 默认代码块渲染组件(当不是 mermaid 且没有自定义组件时使用) */\n defaultCodeComponent?: Component\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n theme: 'github-dark',\n fallbackTheme: 'github-dark',\n disableHighlight: false,\n mermaidDelay: 500,\n customCodeBlocks: () => ({}),\n codeBlockConfigs: () => ({}),\n blockStatus: 'completed',\n defaultCodeComponent: () => IncremarkCodeDefault\n})\n\nconst language = computed(() => props.node.lang || 'text')\n\n// 检查是否有自定义代码块组件\nconst CustomCodeBlock = computed(() => {\n const component = props.customCodeBlocks?.[language.value]\n if (!component) return null\n\n // 检查该语言的配置\n const config = props.codeBlockConfigs?.[language.value]\n\n // 如果配置了 takeOver 为 true,则从一开始就使用\n if (config?.takeOver) {\n return component\n }\n\n // 否则,默认行为:只在 completed 状态使用\n if (props.blockStatus !== 'completed') {\n return null\n }\n\n return component\n})\n\n// 判断是否为 mermaid\nconst isMermaid = computed(() => language.value === 'mermaid')\n</script>\n\n<template>\n <!-- 自定义代码块组件 -->\n <component\n v-if=\"CustomCodeBlock\"\n :is=\"CustomCodeBlock\"\n :code-str=\"node.value\"\n :lang=\"language\"\n :completed=\"blockStatus === 'completed'\"\n :takeOver=\"codeBlockConfigs?.[language]?.takeOver\"\n />\n\n <!-- Mermaid 图表 -->\n <IncremarkCodeMermaid\n v-else-if=\"isMermaid\"\n :node=\"node\"\n :mermaid-delay=\"mermaidDelay\"\n />\n\n <!-- 默认代码块渲染(支持用户自定义,使用 stream 高亮)-->\n <component\n v-else\n :is=\"defaultCodeComponent\"\n :node=\"node\"\n :theme=\"theme\"\n :fallback-theme=\"fallbackTheme\"\n :disable-highlight=\"disableHighlight\"\n :block-status=\"blockStatus\"\n />\n</template>\n","<script setup lang=\"ts\">\nimport type { Code } from 'mdast'\nimport { computed, ref, onUnmounted, shallowRef, watch } from 'vue'\nimport { GravityMermaid, LucideCode, LucideEye, LucideCopy, LucideCopyCheck } from '@incremark/icons'\nimport { isClipboardAvailable } from '@incremark/shared'\nimport SvgIcon from './SvgIcon.vue'\nimport { useLocale } from '../composables/useLocale'\n\ninterface Props {\n node: Code\n /** Mermaid 渲染延迟(毫秒),用于流式输入时防抖 */\n mermaidDelay?: number\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n mermaidDelay: 500\n})\n\n// 使用 i18n\nconst { t } = useLocale()\n\nconst mermaidSvg = ref('')\nconst mermaidError = ref('')\nconst mermaidLoading = ref(false)\nconst mermaidRef = shallowRef<any>(null)\nlet mermaidTimer: ReturnType<typeof setTimeout> | null = null\n// 视图模式:'preview' | 'source'\nconst mermaidViewMode = ref<'preview' | 'source'>('preview')\n\nfunction toggleMermaidView() {\n mermaidViewMode.value = mermaidViewMode.value === 'preview' ? 'source' : 'preview'\n}\n\nconst code = computed(() => props.node.value)\n\n// Mermaid 渲染(带防抖动)\nfunction scheduleRenderMermaid() {\n if (!code.value) return\n\n // 清除之前的定时器\n if (mermaidTimer) {\n clearTimeout(mermaidTimer)\n }\n\n // 显示加载状态\n mermaidLoading.value = true\n\n // 防抖动延迟渲染\n mermaidTimer = setTimeout(() => {\n doRenderMermaid()\n }, props.mermaidDelay)\n}\n\nasync function doRenderMermaid() {\n if (!code.value) return\n\n mermaidError.value = ''\n\n try {\n // 动态导入 mermaid\n if (!mermaidRef.value) {\n // @ts-ignore - mermaid 是可选依赖\n const mermaidModule = await import('mermaid')\n mermaidRef.value = mermaidModule.default\n mermaidRef.value.initialize({\n startOnLoad: false,\n theme: 'dark',\n securityLevel: 'loose',\n suppressErrorRendering: true\n })\n }\n\n const mermaid = mermaidRef.value\n const id = `mermaid-${Date.now()}-${Math.random().toString(36).slice(2)}`\n\n const { svg } = await mermaid.render(id, code.value)\n mermaidSvg.value = svg\n } catch (e: any) {\n // 不显示错误,可能是代码还不完整\n mermaidError.value = ''\n mermaidSvg.value = ''\n } finally {\n mermaidLoading.value = false\n }\n}\n\n// 监听代码变化,重新渲染\nwatch(code, scheduleRenderMermaid, { immediate: true })\n\n// 组件卸载时清理定时器\nonUnmounted(() => {\n if (mermaidTimer) {\n clearTimeout(mermaidTimer)\n }\n if (copyTimeoutId) {\n clearTimeout(copyTimeoutId)\n }\n})\n\nconst copied = ref(false)\nlet copyTimeoutId: ReturnType<typeof setTimeout> | null = null\n\nasync function copyCode() {\n if (!isClipboardAvailable()) return\n\n try {\n await navigator.clipboard.writeText(code.value)\n copied.value = true\n\n // 清理之前的定时器\n if (copyTimeoutId) {\n clearTimeout(copyTimeoutId)\n }\n\n copyTimeoutId = setTimeout(() => {\n copied.value = false\n }, 2000)\n } catch {\n // 复制失败静默处理\n }\n}\n</script>\n\n<template>\n <div class=\"incremark-mermaid\">\n <div class=\"mermaid-header\">\n <span class=\"language\">\n <SvgIcon :svg=\"GravityMermaid\" class=\"language-icon\" />\n MERMAID\n </span>\n <div class=\"mermaid-actions\">\n <button\n class=\"code-btn\"\n @click=\"toggleMermaidView\"\n type=\"button\"\n :disabled=\"!mermaidSvg\"\n :aria-label=\"mermaidViewMode === 'preview' ? t('mermaid.viewSource') : t('mermaid.preview')\"\n :title=\"mermaidViewMode === 'preview' ? 'View Source' : 'Preview'\"\n >\n <SvgIcon :svg=\"mermaidViewMode === 'preview' ? LucideCode : LucideEye\" />\n </button>\n <button\n class=\"code-btn\"\n @click=\"copyCode\"\n type=\"button\"\n :aria-label=\"copied ? t('mermaid.copied') : t('mermaid.copy')\"\n :title=\"copied ? 'Copied!' : 'Copy'\"\n >\n <SvgIcon :svg=\"copied ? LucideCopyCheck : LucideCopy\" />\n </button>\n </div>\n </div>\n <div class=\"mermaid-content\">\n <!-- 加载中 -->\n <div v-if=\"mermaidLoading && !mermaidSvg\" class=\"mermaid-loading\">\n <pre class=\"mermaid-source-code\">{{ code }}</pre>\n </div>\n <!-- 源码模式 -->\n <pre v-else-if=\"mermaidViewMode === 'source'\" class=\"mermaid-source-code\">{{ code }}</pre>\n <!-- 预览模式 -->\n <div v-else-if=\"mermaidSvg\" v-html=\"mermaidSvg\" class=\"mermaid-svg\" />\n <!-- 无法渲染时显示源码 -->\n <pre v-else class=\"mermaid-source-code\">{{ code }}</pre>\n </div>\n </div>\n</template>\n","import { normalizeClass as _normalizeClass, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nconst _hoisted_1 = [\"innerHTML\"]\n\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n return (_openBlock(), _createElementBlock(\"span\", {\n class: _normalizeClass(['incremark-icon', $props.sizeClass]),\n innerHTML: $props.svg,\n \"aria-hidden\": \"true\"\n }, null, 10 /* CLASS, PROPS */, _hoisted_1))\n}","import script from \"/Users/yishuai/develop/ai/markdown/packages/vue/src/components/SvgIcon.vue?type=script\";import { render } from \"/Users/yishuai/develop/ai/markdown/packages/vue/src/components/SvgIcon.vue?type=template\"; script.render = render;script.__file = \"src/components/SvgIcon.vue\";export default script;","import { createVNode as _createVNode, createTextVNode as _createTextVNode, createElementVNode as _createElementVNode, createCommentVNode as _createCommentVNode, toDisplayString as _toDisplayString, openBlock as _openBlock, createElementBlock as _createElementBlock, Fragment as _Fragment } from \"vue\"\n\nconst _hoisted_1 = { class: \"incremark-mermaid\" }\nconst _hoisted_2 = { class: \"mermaid-header\" }\nconst _hoisted_3 = { class: \"language\" }\nconst _hoisted_4 = { class: \"mermaid-actions\" }\nconst _hoisted_5 = [\"disabled\", \"aria-label\", \"title\"]\nconst _hoisted_6 = [\"aria-label\", \"title\"]\nconst _hoisted_7 = { class: \"mermaid-content\" }\nconst _hoisted_8 = {\n key: 0,\n class: \"mermaid-loading\"\n}\nconst _hoisted_9 = { class: \"mermaid-source-code\" }\nconst _hoisted_10 = { class: \"mermaid-source-code\" }\nconst _hoisted_11 = [\"innerHTML\"]\nconst _hoisted_12 = { class: \"mermaid-source-code\" }\n\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n return (_openBlock(), _createElementBlock(\"div\", _hoisted_1, [\n _createElementVNode(\"div\", _hoisted_2, [\n _createElementVNode(\"span\", _hoisted_3, [\n _createVNode($setup[\"SvgIcon\"], {\n svg: $setup.GravityMermaid,\n class: \"language-icon\"\n }, null, 8 /* PROPS */, [\"svg\"]),\n _cache[0] || (_cache[0] = _createTextVNode(\" MERMAID \", -1 /* CACHED */))\n ]),\n _createElementVNode(\"div\", _hoisted_4, [\n _createElementVNode(\"button\", {\n class: \"code-btn\",\n onClick: $setup.toggleMermaidView,\n type: \"button\",\n disabled: !$setup.mermaidSvg,\n \"aria-label\": $setup.mermaidViewMode === 'preview' ? $setup.t('mermaid.viewSource') : $setup.t('mermaid.preview'),\n title: $setup.mermaidViewMode === 'preview' ? 'View Source' : 'Preview'\n }, [\n _createVNode($setup[\"SvgIcon\"], {\n svg: $setup.mermaidViewMode === 'preview' ? $setup.LucideCode : $setup.LucideEye\n }, null, 8 /* PROPS */, [\"svg\"])\n ], 8 /* PROPS */, _hoisted_5),\n _createElementVNode(\"button\", {\n class: \"code-btn\",\n onClick: $setup.copyCode,\n type: \"button\",\n \"aria-label\": $setup.copied ? $setup.t('mermaid.copied') : $setup.t('mermaid.copy'),\n title: $setup.copied ? 'Copied!' : 'Copy'\n }, [\n _createVNode($setup[\"SvgIcon\"], {\n svg: $setup.copied ? $setup.LucideCopyCheck : $setup.LucideCopy\n }, null, 8 /* PROPS */, [\"svg\"])\n ], 8 /* PROPS */, _hoisted_6)\n ])\n ]),\n _createElementVNode(\"div\", _hoisted_7, [\n _createCommentVNode(\" 加载中 \"),\n ($setup.mermaidLoading && !$setup.mermaidSvg)\n ? (_openBlock(), _createElementBlock(\"div\", _hoisted_8, [\n _createElementVNode(\"pre\", _hoisted_9, _toDisplayString($setup.code), 1 /* TEXT */)\n ]))\n : ($setup.mermaidViewMode === 'source')\n ? (_openBlock(), _createElementBlock(_Fragment, { key: 1 }, [\n _createCommentVNode(\" 源码模式 \"),\n _createElementVNode(\"pre\", _hoisted_10, _toDisplayString($setup.code), 1 /* TEXT */)\n ], 2112 /* STABLE_FRAGMENT, DEV_ROOT_FRAGMENT */))\n : ($setup.mermaidSvg)\n ? (_openBlock(), _createElementBlock(_Fragment, { key: 2 }, [\n _createCommentVNode(\" 预览模式 \"),\n _createElementVNode(\"div\", {\n innerHTML: $setup.mermaidSvg,\n class: \"mermaid-svg\"\n }, null, 8 /* PROPS */, _hoisted_11)\n ], 2112 /* STABLE_FRAGMENT, DEV_ROOT_FRAGMENT */))\n : (_openBlock(), _createElementBlock(_Fragment, { key: 3 }, [\n _createCommentVNode(\" 无法渲染时显示源码 \"),\n _createElementVNode(\"pre\", _hoisted_12, _toDisplayString($setup.code), 1 /* TEXT */)\n ], 2112 /* STABLE_FRAGMENT, DEV_ROOT_FRAGMENT */))\n ])\n ]))\n}","import script from \"/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkCodeMermaid.vue?type=script\";import { render } from \"/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkCodeMermaid.vue?type=template\"; script.render = render;script.__file = \"src/components/IncremarkCodeMermaid.vue\";export default script;","<script setup lang=\"ts\">\nimport type { Code } from 'mdast'\nimport { computed, onMounted, ref, watch } from 'vue'\nimport { LucideCopy, LucideCopyCheck } from '@incremark/icons'\nimport { isClipboardAvailable } from '@incremark/shared'\nimport SvgIcon from './SvgIcon.vue'\nimport { useShiki } from '../composables/useShiki'\nimport { useLocale } from '../composables/useLocale'\nimport CachedCodeRenderer from './CachedCodeRenderer.vue'\n\ninterface Props {\n node: Code\n /** Shiki 主题,默认 github-dark */\n theme?: string\n /** 默认回退主题(当指定主题加载失败时使用),默认 github-dark */\n fallbackTheme?: string\n /** 是否禁用代码高亮 */\n disableHighlight?: boolean\n /** block 状态 */\n blockStatus?: 'pending' | 'stable' | 'completed'\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n theme: 'github-dark',\n fallbackTheme: 'github-dark',\n disableHighlight: false,\n blockStatus: 'pending'\n})\n\nconst copied = ref(false)\n\nconst language = computed(() => props.node.lang || 'text')\nconst code = computed(() => props.node.value)\n\n// 使用 i18n\nconst { t } = useLocale()\n\n// 使用 Shiki 单例管理器\nconst { highlighterInfo, initHighlighter } = useShiki(props.theme)\n\n// 语言是否已加载完成\nconst isLanguageLoaded = ref(false)\n\n// 是否应该启用高亮(需要有代码内容才开始高亮逻辑)\nconst shouldEnableHighlight = computed(() => {\n return !props.disableHighlight && code.value && code.value.length > 0\n})\n\n// 初始化 highlighter 并加载语言\n// 只有当存在代码内容时才开始加载语言,避免流式渲染时语言标识不完整导致的错误\nwatch([highlighterInfo, language, shouldEnableHighlight], async ([info, lang, shouldHighlight]) => {\n // 如果不需要高亮,直接返回\n if (!shouldHighlight) {\n return\n }\n\n if (!info) {\n await initHighlighter()\n } else if (lang && lang !== 'text') {\n // 检查语言是否已加载\n if (!info.loadedLanguages.has(lang as any)) {\n try {\n isLanguageLoaded.value = false\n // 检查语言是否被 shiki 支持\n const supportedLangs = info.highlighter.getLoadedLanguages()\n const bundledLangs = await import('shiki').then(m => Object.keys(m.bundledLanguages || {}))\n const isSupported = supportedLangs.includes(lang) || bundledLangs.includes(lang)\n\n if (isSupported) {\n await info.highlighter.loadLanguage(lang as any)\n info.loadedLanguages.add(lang as any)\n }\n // 无论是否支持,都标记为已加载(不支持的语言会 fallback 到纯文本显示)\n isLanguageLoaded.value = true\n } catch {\n // 语言加载失败,标记为已加载(回退到无高亮)\n isLanguageLoaded.value = true\n }\n } else {\n isLanguageLoaded.value = true\n }\n } else {\n // text 语言不需要加载\n isLanguageLoaded.value = true\n }\n}, { immediate: true, deep: true })\n\nlet copyTimeoutId: ReturnType<typeof setTimeout> | null = null\n\nasync function copyCode() {\n if (!isClipboardAvailable()) return\n\n try {\n await navigator.clipboard.writeText(code.value)\n copied.value = true\n\n // 清理之前的定时器\n if (copyTimeoutId) {\n clearTimeout(copyTimeoutId)\n }\n\n copyTimeoutId = setTimeout(() => {\n copied.value = false\n }, 2000)\n } catch {\n // 复制失败静默处理\n }\n}\n</script>\n\n<template>\n <div class=\"incremark-code\">\n <div class=\"code-header\">\n <span class=\"language\">{{ language }}</span>\n <button\n class=\"code-btn\"\n @click=\"copyCode\"\n type=\"button\"\n :aria-label=\"copied ? t('code.copied') : t('code.copy')\"\n :title=\"copied ? 'Copied!' : 'Copy'\"\n >\n <SvgIcon :svg=\"copied ? LucideCopyCheck : LucideCopy\" />\n </button>\n </div>\n <div class=\"code-content\">\n <div class=\"shiki-wrapper\">\n <!-- Stream 高亮(只有当存在代码内容且语言加载完成后才渲染) -->\n <CachedCodeRenderer\n v-if=\"shouldEnableHighlight && highlighterInfo && isLanguageLoaded\"\n :code=\"code\"\n :lang=\"language\"\n :theme=\"theme\"\n :highlighter=\"highlighterInfo.highlighter\"\n />\n <!-- 无高亮模式(禁用高亮、无代码内容、或语言未加载完成时显示) -->\n <pre v-else class=\"code-fallback\"><code>{{ code }}</code></pre>\n </div>\n </div>\n </div>\n</template>\n","/**\n * Shiki Highlighter 单例管理器\n *\n * 避免重复创建 Shiki 实例,所有组件共享同一个 highlighter\n */\n\nimport { shallowRef } from 'vue'\nimport type { HighlighterGeneric, BundledLanguage, BundledTheme } from 'shiki'\n\n// ============ 类型定义 ============\n\ninterface HighlighterInfo {\n highlighter: HighlighterGeneric<BundledLanguage, BundledTheme>\n loadedLanguages: Set<BundledLanguage>\n loadedThemes: Set<BundledTheme>\n}\n\n// ============ 单例管理器 ============\n\n/** Shiki highlighter 单例管理器 */\nclass ShikiManager {\n private static instance: ShikiManager | null = null\n\n /** 存储 highlighter 实例,key 为主题名称 */\n private highlighters = new Map<string, HighlighterInfo>()\n\n private constructor() {}\n\n static getInstance(): ShikiManager {\n if (!ShikiManager.instance) {\n ShikiManager.instance = new ShikiManager()\n }\n return ShikiManager.instance\n }\n\n /**\n * 获取或创建 highlighter\n * @param theme 主题名称\n * @returns highlighter 实例\n */\n async getHighlighter(theme: BundledTheme): Promise<HighlighterInfo> {\n // 如果已存在对应主题的 highlighter,直接返回\n if (this.highlighters.has(theme)) {\n return this.highlighters.get(theme)!\n }\n\n // 创建新的 highlighter\n const { createHighlighter } = await import('shiki')\n const highlighter = await createHighlighter({\n themes: [theme],\n langs: []\n })\n\n const info: HighlighterInfo = {\n highlighter,\n loadedLanguages: new Set<BundledLanguage>(),\n loadedThemes: new Set<BundledTheme>([theme])\n }\n\n this.highlighters.set(theme, info)\n return info\n }\n\n /**\n * 加载语言(按需)\n * @param theme 主题名称\n * @param lang 语言名称\n */\n async loadLanguage(theme: BundledTheme, lang: BundledLanguage): Promise<void> {\n const info = this.highlighters.get(theme)\n if (!info || info.loadedLanguages.has(lang)) return\n\n try {\n await info.highlighter.loadLanguage(lang)\n info.loadedLanguages.add(lang)\n } catch {\n // 语言不支持,静默处理\n }\n }\n\n /**\n * 加载主题(按需)\n * @param theme 主题名称\n */\n async loadTheme(theme: BundledTheme): Promise<void> {\n const info = this.highlighters.get(theme)\n if (!info || info.loadedThemes.has(theme)) return\n\n try {\n await info.highlighter.loadTheme(theme)\n info.loadedThemes.add(theme)\n } catch {\n // 主题不支持,静默处理\n }\n }\n\n /**\n * 高亮代码\n * @param theme 主题名称\n * @param code 代码内容\n * @param lang 语言名称\n * @param fallbackTheme 回退主题\n * @returns 高亮后的 HTML\n */\n async codeToHtml(\n theme: BundledTheme,\n code: string,\n lang: BundledLanguage,\n fallbackTheme: BundledTheme\n ): Promise<string> {\n const info = this.highlighters.get(theme)\n if (!info) throw new Error('Highlighter not found')\n\n const actualLang = info.loadedLanguages.has(lang) ? lang : 'text'\n const actualTheme = info.loadedThemes.has(theme) ? theme : fallbackTheme\n\n return info.highlighter.codeToHtml(code, {\n lang: actualLang,\n theme: actualTheme\n })\n }\n\n /**\n * 清理所有 highlighter(应用退出或需要重置时调用)\n */\n disposeAll() {\n for (const [, info] of this.highlighters) {\n if (info.highlighter?.dispose) {\n info.highlighter.dispose()\n }\n }\n this.highlighters.clear()\n }\n}\n\n// ============ 延迟初始化单例 ============\n\nlet shikiManagerInstance: ShikiManager | null = null\n\n/**\n * 获取 ShikiManager 单例(延迟初始化)\n * 避免模块加载时立即创建实例,支持 SSR\n */\nfunction getShikiManager(): ShikiManager {\n if (!shikiManagerInstance) {\n shikiManagerInstance = ShikiManager.getInstance()\n }\n return shikiManagerInstance\n}\n\nexport { getShikiManager, ShikiManager }\n\n// ============ Vue 组合式函数 ============\n\n/**\n * 使用 Shiki Highlighter(组合式函数)\n *\n * @param theme 主题名称\n * @returns Shiki 相关的响应式状态和方法\n */\nexport function useShiki(theme: string) {\n const highlighterInfo = shallowRef<HighlighterInfo | null>(null)\n const isHighlighting = shallowRef(false)\n const isReady = shallowRef(false)\n\n /**\n * 初始化 highlighter(预加载)\n */\n async function initHighlighter(): Promise<void> {\n if (isReady.value) return\n\n try {\n const info = await getShikiManager().getHighlighter(theme as BundledTheme)\n highlighterInfo.value = info\n isReady.value = true\n } catch (e) {\n console.warn('Failed to initialize Shiki highlighter:', e)\n throw e\n }\n }\n\n /**\n * 获取 highlighter\n */\n async function getHighlighter(): Promise<HighlighterInfo> {\n if (!highlighterInfo.value) {\n highlighterInfo.value = await getShikiManager().getHighlighter(theme as BundledTheme)\n isReady.value = true\n }\n return highlighterInfo.value!\n }\n\n /**\n * 高亮代码\n */\n async function highlight(code: string, lang: string, fallbackTheme: string): Promise<string> {\n isHighlighting.value = true\n\n try {\n const info = await getHighlighter()\n\n const manager = getShikiManager()\n\n // 按需加载语言\n if (!info.loadedLanguages.has(lang as BundledLanguage) && lang !== 'text') {\n await manager.loadLanguage(theme as BundledTheme, lang as BundledLanguage)\n }\n\n // 按需加载主题\n if (!info.loadedThemes.has(theme as BundledTheme)) {\n await manager.loadTheme(theme as BundledTheme)\n }\n\n return await manager.codeToHtml(theme as BundledTheme, code, lang as BundledLanguage, fallbackTheme as BundledTheme)\n } catch (e) {\n throw e\n } finally {\n isHighlighting.value = false\n }\n }\n\n return {\n highlighterInfo,\n isHighlighting,\n isReady,\n initHighlighter,\n highlight\n }\n}\n\n","<script setup lang=\"ts\">\nimport { h, ref, reactive, watch, renderList, onMounted, onUnmounted } from 'vue'\nimport { CodeToTokenTransformStream } from 'shiki-stream'\nimport { getTokenStyleObject } from '@shikijs/core'\nimport { objectId } from '@antfu/utils'\n\ninterface Props {\n code: string\n lang: string\n theme: string\n highlighter: any\n}\n\nconst props = defineProps<Props>()\n\nconst emit = defineEmits<{\n 'stream-start': []\n 'stream-end': []\n 'stream-error': []\n}>()\n\n// Stream 错误状态\nconst hasStreamError = ref(false)\n\n// 完全照搬 ShikiCachedRenderer 的实现\nconst index = ref(0)\nlet controller: ReadableStreamController<string> | null = null\nconst textStream = new ReadableStream<string>({\n start(_controller) {\n controller = _controller\n },\n})\n\nwatch(() => props.code, (newCode) => {\n // 只处理增量更新:传入新增的部分\n if (newCode.length > index.value && !hasStreamError.value) {\n const incremental = newCode.slice(index.value)\n controller?.enqueue(incremental as any)\n index.value = newCode.length\n }\n}, { immediate: true })\n\n// 尝试创建 token stream,如果失败则标记错误\nlet tokenStream: ReadableStream<any> | null = null\n\ntry {\n tokenStream = textStream.pipeThrough(\n new CodeToTokenTransformStream({\n highlighter: props.highlighter,\n lang: props.lang,\n theme: props.theme,\n allowRecalls: true,\n })\n )\n} catch (error) {\n console.error('Failed to create token stream:', error)\n hasStreamError.value = true\n emit('stream-error')\n}\n\n// 直接消费 stream,不用 watch\nconst tokens = reactive<any[]>([])\n\nif (tokenStream) {\n let tokenCount = 0\n tokenStream.pipeTo(new WritableStream({\n write(token) {\n const start = performance.now()\n if ('recall' in token)\n tokens.splice(tokens.length - token.recall, token.recall)\n else\n tokens.push(token)\n const elapsed = performance.now() - start\n tokenCount++\n if (elapsed > 1) {\n console.log(`[Vue CodeRenderer] Token #${tokenCount} update took ${elapsed.toFixed(2)}ms, total tokens: ${tokens.length}`)\n }\n },\n close: () => {\n console.log(`[Vue CodeRenderer] Stream completed, total tokens: ${tokenCount}`)\n emit('stream-end')\n },\n })).catch((error) => {\n console.error('Stream error:', error)\n hasStreamError.value = true\n emit('stream-error')\n })\n}\n\n// 渲染函数\nconst render = () => {\n // 如果有错误,渲染纯文本\n if (hasStreamError.value) {\n return h('pre', { class: 'shiki incremark-code-stream' }, h('code', props.code))\n }\n\n // 正常渲染高亮代码\n return h(\n 'pre',\n { class: 'shiki incremark-code-stream' },\n h(\n 'code',\n renderList(tokens, (token: any) => h('span', { key: objectId(token), style: token.htmlStyle || getTokenStyleObject(token) }, token.content)),\n ),\n )\n}\n\n// 组件卸载时清理\nonUnmounted(() => {\n hasStreamError.value = false\n tokens.length = 0\n index.value = 0\n})\n</script>\n\n<template>\n <component :is=\"render\" />\n</template>\n","// src/utils.ts\nfunction clone(something) {\n return doClone(something);\n}\nfunction doClone(something) {\n if (Array.isArray(something)) {\n return cloneArray(something);\n }\n if (something instanceof RegExp) {\n return something;\n }\n if (typeof something === \"object\") {\n return cloneObj(something);\n }\n return something;\n}\nfunction cloneArray(arr) {\n let r = [];\n for (let i = 0, len = arr.length; i < len; i++) {\n r[i] = doClone(arr[i]);\n }\n return r;\n}\nfunction cloneObj(obj) {\n let r = {};\n for (let key in obj) {\n r[key] = doClone(obj[key]);\n }\n return r;\n}\nfunction mergeObjects(target, ...sources) {\n sources.forEach((source) => {\n for (let key in source) {\n target[key] = source[key];\n }\n });\n return target;\n}\nfunction basename(path) {\n const idx = ~path.lastIndexOf(\"/\") || ~path.lastIndexOf(\"\\\\\");\n if (idx === 0) {\n return path;\n } else if (~idx === path.length - 1) {\n return basename(path.substring(0, path.length - 1));\n } else {\n return path.substr(~idx + 1);\n }\n}\nvar CAPTURING_REGEX_SOURCE = /\\$(\\d+)|\\${(\\d+):\\/(downcase|upcase)}/g;\nvar RegexSource = class {\n static hasCaptures(regexSource) {\n if (regexSource === null) {\n return false;\n }\n CAPTURING_REGEX_SOURCE.lastIndex = 0;\n return CAPTURING_REGEX_SOURCE.test(regexSource);\n }\n static replaceCaptures(regexSource, captureSource, captureIndices) {\n return regexSource.replace(CAPTURING_REGEX_SOURCE, (match, index, commandIndex, command) => {\n let capture = captureIndices[parseInt(index || commandIndex, 10)];\n if (capture) {\n let result = captureSource.substring(capture.start, capture.end);\n while (result[0] === \".\") {\n result = result.substring(1);\n }\n switch (command) {\n case \"downcase\":\n return result.toLowerCase();\n case \"upcase\":\n return result.toUpperCase();\n default:\n return result;\n }\n } else {\n return match;\n }\n });\n }\n};\nfunction strcmp(a, b) {\n if (a < b) {\n return -1;\n }\n if (a > b) {\n return 1;\n }\n return 0;\n}\nfunction strArrCmp(a, b) {\n if (a === null && b === null) {\n return 0;\n }\n if (!a) {\n return -1;\n }\n if (!b) {\n return 1;\n }\n let len1 = a.length;\n let len2 = b.length;\n if (len1 === len2) {\n for (let i = 0; i < len1; i++) {\n let res = strcmp(a[i], b[i]);\n if (res !== 0) {\n return res;\n }\n }\n return 0;\n }\n return len1 - len2;\n}\nfunction isValidHexColor(hex) {\n if (/^#[0-9a-f]{6}$/i.test(hex)) {\n return true;\n }\n if (/^#[0-9a-f]{8}$/i.test(hex)) {\n return true;\n }\n if (/^#[0-9a-f]{3}$/i.test(hex)) {\n return true;\n }\n if (/^#[0-9a-f]{4}$/i.test(hex)) {\n return true;\n }\n return false;\n}\nfunction escapeRegExpCharacters(value) {\n return value.replace(/[\\-\\\\\\{\\}\\*\\+\\?\\|\\^\\$\\.\\,\\[\\]\\(\\)\\#\\s]/g, \"\\\\$&\");\n}\nvar CachedFn = class {\n constructor(fn) {\n this.fn = fn;\n }\n cache = /* @__PURE__ */ new Map();\n get(key) {\n if (this.cache.has(key)) {\n return this.cache.get(key);\n }\n const value = this.fn(key);\n this.cache.set(key, value);\n return value;\n }\n};\n\n// src/theme.ts\nvar Theme = class {\n constructor(_colorMap, _defaults, _root) {\n this._colorMap = _colorMap;\n this._defaults = _defaults;\n this._root = _root;\n }\n static createFromRawTheme(source, colorMap) {\n return this.createFromParsedTheme(parseTheme(source), colorMap);\n }\n static createFromParsedTheme(source, colorMap) {\n return resolveParsedThemeRules(source, colorMap);\n }\n _cachedMatchRoot = new CachedFn(\n (scopeName) => this._root.match(scopeName)\n );\n getColorMap() {\n return this._colorMap.getColorMap();\n }\n getDefaults() {\n return this._defaults;\n }\n match(scopePath) {\n if (scopePath === null) {\n return this._defaults;\n }\n const scopeName = scopePath.scopeName;\n const matchingTrieElements = this._cachedMatchRoot.get(scopeName);\n const effectiveRule = matchingTrieElements.find(\n (v) => _scopePathMatchesParentScopes(scopePath.parent, v.parentScopes)\n );\n if (!effectiveRule) {\n return null;\n }\n return new StyleAttributes(\n effectiveRule.fontStyle,\n effectiveRule.foreground,\n effectiveRule.background\n );\n }\n};\nvar ScopeStack = class _ScopeStack {\n constructor(parent, scopeName) {\n this.parent = parent;\n this.scopeName = scopeName;\n }\n static push(path, scopeNames) {\n for (const name of scopeNames) {\n path = new _ScopeStack(path, name);\n }\n return path;\n }\n static from(...segments) {\n let result = null;\n for (let i = 0; i < segments.length; i++) {\n result = new _ScopeStack(result, segments[i]);\n }\n return result;\n }\n push(scopeName) {\n return new _ScopeStack(this, scopeName);\n }\n getSegments() {\n let item = this;\n const result = [];\n while (item) {\n result.push(item.scopeName);\n item = item.parent;\n }\n result.reverse();\n return result;\n }\n toString() {\n return this.getSegments().join(\" \");\n }\n extends(other) {\n if (this === other) {\n return true;\n }\n if (this.parent === null) {\n return false;\n }\n return this.parent.extends(other);\n }\n getExtensionIfDefined(base) {\n const result = [];\n let item = this;\n while (item && item !== base) {\n result.push(item.scopeName);\n item = item.parent;\n }\n return item === base ? result.reverse() : void 0;\n }\n};\nfunction _scopePathMatchesParentScopes(scopePath, parentScopes) {\n if (parentScopes.length === 0) {\n return true;\n }\n for (let index = 0; index < parentScopes.length; index++) {\n let scopePattern = parentScopes[index];\n let scopeMustMatch = false;\n if (scopePattern === \">\") {\n if (index === parentScopes.length - 1) {\n return false;\n }\n scopePattern = parentScopes[++index];\n scopeMustMatch = true;\n }\n while (scopePath) {\n if (_matchesScope(scopePath.scopeName, scopePattern)) {\n break;\n }\n if (scopeMustMatch) {\n return false;\n }\n scopePath = scopePath.parent;\n }\n if (!scopePath) {\n return false;\n }\n scopePath = scopePath.parent;\n }\n return true;\n}\nfunction _matchesScope(scopeName, scopePattern) {\n return scopePattern === scopeName || scopeName.startsWith(scopePattern) && scopeName[scopePattern.length] === \".\";\n}\nvar StyleAttributes = class {\n constructor(fontStyle, foregroundId, backgroundId) {\n this.fontStyle = fontStyle;\n this.foregroundId = foregroundId;\n this.backgroundId = backgroundId;\n }\n};\nfunction parseTheme(source) {\n if (!source) {\n return [];\n }\n if (!source.settings || !Array.isArray(source.settings)) {\n return [];\n }\n let settings = source.settings;\n let result = [], resultLen = 0;\n for (let i = 0, len = settings.length; i < len; i++) {\n let entry = settings[i];\n if (!entry.settings) {\n continue;\n }\n let scopes;\n if (typeof entry.scope === \"string\") {\n let _scope = entry.scope;\n _scope = _scope.replace(/^[,]+/, \"\");\n _scope = _scope.replace(/[,]+$/, \"\");\n scopes = _scope.split(\",\");\n } else if (Array.isArray(entry.scope)) {\n scopes = entry.scope;\n } else {\n scopes = [\"\"];\n }\n let fontStyle = -1 /* NotSet */;\n if (typeof entry.settings.fontStyle === \"string\") {\n fontStyle = 0 /* None */;\n let segments = entry.settings.fontStyle.split(\" \");\n for (let j = 0, lenJ = segments.length; j < lenJ; j++) {\n let segment = segments[j];\n switch (segment) {\n case \"italic\":\n fontStyle = fontStyle | 1 /* Italic */;\n break;\n case \"bold\":\n fontStyle = fontStyle | 2 /* Bold */;\n break;\n case \"underline\":\n fontStyle = fontStyle | 4 /* Underline */;\n break;\n case \"strikethrough\":\n fontStyle = fontStyle | 8 /* Strikethrough */;\n break;\n }\n }\n }\n let foreground = null;\n if (typeof entry.settings.foreground === \"string\" && isValidHexColor(entry.settings.foreground)) {\n foreground = entry.settings.foreground;\n }\n let background = null;\n if (typeof entry.settings.background === \"string\" && isValidHexColor(entry.settings.background)) {\n background = entry.settings.background;\n }\n for (let j = 0, lenJ = scopes.length; j < lenJ; j++) {\n let _scope = scopes[j].trim();\n let segments = _scope.split(\" \");\n let scope = segments[segments.length - 1];\n let parentScopes = null;\n if (segments.length > 1) {\n parentScopes = segments.slice(0, segments.length - 1);\n parentScopes.reverse();\n }\n result[resultLen++] = new ParsedThemeRule(\n scope,\n parentScopes,\n i,\n fontStyle,\n foreground,\n background\n );\n }\n }\n return result;\n}\nvar ParsedThemeRule = class {\n constructor(scope, parentScopes, index, fontStyle, foreground, background) {\n this.scope = scope;\n this.parentScopes = parentScopes;\n this.index = index;\n this.fontStyle = fontStyle;\n this.foreground = foreground;\n this.background = background;\n }\n};\nvar FontStyle = /* @__PURE__ */ ((FontStyle2) => {\n FontStyle2[FontStyle2[\"NotSet\"] = -1] = \"NotSet\";\n FontStyle2[FontStyle2[\"None\"] = 0] = \"None\";\n FontStyle2[FontStyle2[\"Italic\"] = 1] = \"Italic\";\n FontStyle2[FontStyle2[\"Bold\"] = 2] = \"Bold\";\n FontStyle2[FontStyle2[\"Underline\"] = 4] = \"Underline\";\n FontStyle2[FontStyle2[\"Strikethrough\"] = 8] = \"Strikethrough\";\n return FontStyle2;\n})(FontStyle || {});\nfunction resolveParsedThemeRules(parsedThemeRules, _colorMap) {\n parsedThemeRules.sort((a, b) => {\n let r = strcmp(a.scope, b.scope);\n if (r !== 0) {\n return r;\n }\n r = strArrCmp(a.parentScopes, b.parentScopes);\n if (r !== 0) {\n return r;\n }\n return a.index - b.index;\n });\n let defaultFontStyle = 0 /* None */;\n let defaultForeground = \"#000000\";\n let defaultBackground = \"#ffffff\";\n while (parsedThemeRules.length >= 1 && parsedThemeRules[0].scope === \"\") {\n let incomingDefaults = parsedThemeRules.shift();\n if (incomingDefaults.fontStyle !== -1 /* NotSet */) {\n defaultFontStyle = incomingDefaults.fontStyle;\n }\n if (incomingDefaults.foreground !== null) {\n defaultForeground = incomingDefaults.foreground;\n }\n if (incomingDefaults.background !== null) {\n defaultBackground = incomingDefaults.background;\n }\n }\n let colorMap = new ColorMap(_colorMap);\n let defaults = new StyleAttributes(defaultFontStyle, colorMap.getId(defaultForeground), colorMap.getId(defaultBackground));\n let root = new ThemeTrieElement(new ThemeTrieElementRule(0, null, -1 /* NotSet */, 0, 0), []);\n for (let i = 0, len = parsedThemeRules.length; i < len; i++) {\n let rule = parsedThemeRules[i];\n root.insert(0, rule.scope, rule.parentScopes, rule.fontStyle, colorMap.getId(rule.foreground), colorMap.getId(rule.background));\n }\n return new Theme(colorMap, defaults, root);\n}\nvar ColorMap = class {\n _isFrozen;\n _lastColorId;\n _id2color;\n _color2id;\n constructor(_colorMap) {\n this._lastColorId = 0;\n this._id2color = [];\n this._color2id = /* @__PURE__ */ Object.create(null);\n if (Array.isArray(_colorMap)) {\n this._isFrozen = true;\n for (let i = 0, len = _colorMap.length; i < len; i++) {\n this._color2id[_colorMap[i]] = i;\n this._id2color[i] = _colorMap[i];\n }\n } else {\n this._isFrozen = false;\n }\n }\n getId(color) {\n if (color === null) {\n return 0;\n }\n color = color.toUpperCase();\n let value = this._color2id[color];\n if (value) {\n return value;\n }\n if (this._isFrozen) {\n throw new Error(`Missing color in color map - ${color}`);\n }\n value = ++this._lastColorId;\n this._color2id[color] = value;\n this._id2color[value] = color;\n return value;\n }\n getColorMap() {\n return this._id2color.slice(0);\n }\n};\nvar emptyParentScopes = Object.freeze([]);\nvar ThemeTrieElementRule = class _ThemeTrieElementRule {\n scopeDepth;\n parentScopes;\n fontStyle;\n foreground;\n background;\n constructor(scopeDepth, parentScopes, fontStyle, foreground, background) {\n this.scopeDepth = scopeDepth;\n this.parentScopes = parentScopes || emptyParentScopes;\n this.fontStyle = fontStyle;\n this.foreground = foreground;\n this.background = background;\n }\n clone() {\n return new _ThemeTrieElementRule(this.scopeDepth, this.parentScopes, this.fontStyle, this.foreground, this.background);\n }\n static cloneArr(arr) {\n let r = [];\n for (let i = 0, len = arr.length; i < len; i++) {\n r[i] = arr[i].clone();\n }\n return r;\n }\n acceptOverwrite(scopeDepth, fontStyle, foreground, background) {\n if (this.scopeDepth > scopeDepth) {\n console.log(\"how did this happen?\");\n } else {\n this.scopeDepth = scopeDepth;\n }\n if (fontStyle !== -1 /* NotSet */) {\n this.fontStyle = fontStyle;\n }\n if (foreground !== 0) {\n this.foreground = foreground;\n }\n if (background !== 0) {\n this.background = background;\n }\n }\n};\nvar ThemeTrieElement = class _ThemeTrieElement {\n constructor(_mainRule, rulesWithParentScopes = [], _children = {}) {\n this._mainRule = _mainRule;\n this._children = _children;\n this._rulesWithParentScopes = rulesWithParentScopes;\n }\n _rulesWithParentScopes;\n static _cmpBySpecificity(a, b) {\n if (a.scopeDepth !== b.scopeDepth) {\n return b.scopeDepth - a.scopeDepth;\n }\n let aParentIndex = 0;\n let bParentIndex = 0;\n while (true) {\n if (a.parentScopes[aParentIndex] === \">\") {\n aParentIndex++;\n }\n if (b.parentScopes[bParentIndex] === \">\") {\n bParentIndex++;\n }\n if (aParentIndex >= a.parentScopes.length || bParentIndex >= b.parentScopes.length) {\n break;\n }\n const parentScopeLengthDiff = b.parentScopes[bParentIndex].length - a.parentScopes[aParentIndex].length;\n if (parentScopeLengthDiff !== 0) {\n return parentScopeLengthDiff;\n }\n aParentIndex++;\n bParentIndex++;\n }\n return b.parentScopes.length - a.parentScopes.length;\n }\n match(scope) {\n if (scope !== \"\") {\n let dotIndex = scope.indexOf(\".\");\n let head;\n let tail;\n if (dotIndex === -1) {\n head = scope;\n tail = \"\";\n } else {\n head = scope.substring(0, dotIndex);\n tail = scope.substring(dotIndex + 1);\n }\n if (this._children.hasOwnProperty(head)) {\n return this._children[head].match(tail);\n }\n }\n const rules = this._rulesWithParentScopes.concat(this._mainRule);\n rules.sort(_ThemeTrieElement._cmpBySpecificity);\n return rules;\n }\n insert(scopeDepth, scope, parentScopes, fontStyle, foreground, background) {\n if (scope === \"\") {\n this._doInsertHere(scopeDepth, parentScopes, fontStyle, foreground, background);\n return;\n }\n let dotIndex = scope.indexOf(\".\");\n let head;\n let tail;\n if (dotIndex === -1) {\n head = scope;\n tail = \"\";\n } else {\n head = scope.substring(0, dotIndex);\n tail = scope.substring(dotIndex + 1);\n }\n let child;\n if (this._children.hasOwnProperty(head)) {\n child = this._children[head];\n } else {\n child = new _ThemeTrieElement(this._mainRule.clone(), ThemeTrieElementRule.cloneArr(this._rulesWithParentScopes));\n this._children[head] = child;\n }\n child.insert(scopeDepth + 1, tail, parentScopes, fontStyle, foreground, background);\n }\n _doInsertHere(scopeDepth, parentScopes, fontStyle, foreground, background) {\n if (parentScopes === null) {\n this._mainRule.acceptOverwrite(scopeDepth, fontStyle, foreground, background);\n return;\n }\n for (let i = 0, len = this._rulesWithParentScopes.length; i < len; i++) {\n let rule = this._rulesWithParentScopes[i];\n if (strArrCmp(rule.parentScopes, parentScopes) === 0) {\n rule.acceptOverwrite(scopeDepth, fontStyle, foreground, background);\n return;\n }\n }\n if (fontStyle === -1 /* NotSet */) {\n fontStyle = this._mainRule.fontStyle;\n }\n if (foreground === 0) {\n foreground = this._mainRule.foreground;\n }\n if (background === 0) {\n background = this._mainRule.background;\n }\n this._rulesWithParentScopes.push(new ThemeTrieElementRule(scopeDepth, parentScopes, fontStyle, foreground, background));\n }\n};\n\n// src/encodedTokenAttributes.ts\nvar EncodedTokenMetadata = class _EncodedTokenMetadata {\n static toBinaryStr(encodedTokenAttributes) {\n return encodedTokenAttributes.toString(2).padStart(32, \"0\");\n }\n static print(encodedTokenAttributes) {\n const languageId = _EncodedTokenMetadata.getLanguageId(encodedTokenAttributes);\n const tokenType = _EncodedTokenMetadata.getTokenType(encodedTokenAttributes);\n const fontStyle = _EncodedTokenMetadata.getFontStyle(encodedTokenAttributes);\n const foreground = _EncodedTokenMetadata.getForeground(encodedTokenAttributes);\n const background = _EncodedTokenMetadata.getBackground(encodedTokenAttributes);\n console.log({\n languageId,\n tokenType,\n fontStyle,\n foreground,\n background\n });\n }\n static getLanguageId(encodedTokenAttributes) {\n return (encodedTokenAttributes & 255 /* LANGUAGEID_MASK */) >>> 0 /* LANGUAGEID_OFFSET */;\n }\n static getTokenType(encodedTokenAttributes) {\n return (encodedTokenAttributes & 768 /* TOKEN_TYPE_MASK */) >>> 8 /* TOKEN_TYPE_OFFSET */;\n }\n static containsBalancedBrackets(encodedTokenAttributes) {\n return (encodedTokenAttributes & 1024 /* BALANCED_BRACKETS_MASK */) !== 0;\n }\n static getFontStyle(encodedTokenAttributes) {\n return (encodedTokenAttributes & 30720 /* FONT_STYLE_MASK */) >>> 11 /* FONT_STYLE_OFFSET */;\n }\n static getForeground(encodedTokenAttributes) {\n return (encodedTokenAttributes & 16744448 /* FOREGROUND_MASK */) >>> 15 /* FOREGROUND_OFFSET */;\n }\n static getBackground(encodedTokenAttributes) {\n return (encodedTokenAttributes & 4278190080 /* BACKGROUND_MASK */) >>> 24 /* BACKGROUND_OFFSET */;\n }\n /**\n * Updates the fields in `metadata`.\n * A value of `0`, `NotSet` or `null` indicates that the corresponding field should be left as is.\n */\n static set(encodedTokenAttributes, languageId, tokenType, containsBalancedBrackets, fontStyle, foreground, background) {\n let _languageId = _EncodedTokenMetadata.getLanguageId(encodedTokenAttributes);\n let _tokenType = _EncodedTokenMetadata.getTokenType(encodedTokenAttributes);\n let _containsBalancedBracketsBit = _EncodedTokenMetadata.containsBalancedBrackets(encodedTokenAttributes) ? 1 : 0;\n let _fontStyle = _EncodedTokenMetadata.getFontStyle(encodedTokenAttributes);\n let _foreground = _EncodedTokenMetadata.getForeground(encodedTokenAttributes);\n let _background = _EncodedTokenMetadata.getBackground(encodedTokenAttributes);\n if (languageId !== 0) {\n _languageId = languageId;\n }\n if (tokenType !== 8 /* NotSet */) {\n _tokenType = fromOptionalTokenType(tokenType);\n }\n if (containsBalancedBrackets !== null) {\n _containsBalancedBracketsBit = containsBalancedBrackets ? 1 : 0;\n }\n if (fontStyle !== -1 /* NotSet */) {\n _fontStyle = fontStyle;\n }\n if (foreground !== 0) {\n _foreground = foreground;\n }\n if (background !== 0) {\n _background = background;\n }\n return (_languageId << 0 /* LANGUAGEID_OFFSET */ | _tokenType << 8 /* TOKEN_TYPE_OFFSET */ | _containsBalancedBracketsBit << 10 /* BALANCED_BRACKETS_OFFSET */ | _fontStyle << 11 /* FONT_STYLE_OFFSET */ | _foreground << 15 /* FOREGROUND_OFFSET */ | _background << 24 /* BACKGROUND_OFFSET */) >>> 0;\n }\n};\nfunction toOptionalTokenType(standardType) {\n return standardType;\n}\nfunction fromOptionalTokenType(standardType) {\n return standardType;\n}\n\n// src/matcher.ts\nfunction createMatchers(selector, matchesName) {\n const results = [];\n const tokenizer = newTokenizer(selector);\n let token = tokenizer.next();\n while (token !== null) {\n let priority = 0;\n if (token.length === 2 && token.charAt(1) === \":\") {\n switch (token.charAt(0)) {\n case \"R\":\n priority = 1;\n break;\n case \"L\":\n priority = -1;\n break;\n default:\n console.log(`Unknown priority ${token} in scope selector`);\n }\n token = tokenizer.next();\n }\n let matcher = parseConjunction();\n results.push({ matcher, priority });\n if (token !== \",\") {\n break;\n }\n token = tokenizer.next();\n }\n return results;\n function parseOperand() {\n if (token === \"-\") {\n token = tokenizer.next();\n const expressionToNegate = parseOperand();\n return (matcherInput) => !!expressionToNegate && !expressionToNegate(matcherInput);\n }\n if (token === \"(\") {\n token = tokenizer.next();\n const expressionInParents = parseInnerExpression();\n if (token === \")\") {\n token = tokenizer.next();\n }\n return expressionInParents;\n }\n if (isIdentifier(token)) {\n const identifiers = [];\n do {\n identifiers.push(token);\n token = tokenizer.next();\n } while (isIdentifier(token));\n return (matcherInput) => matchesName(identifiers, matcherInput);\n }\n return null;\n }\n function parseConjunction() {\n const matchers = [];\n let matcher = parseOperand();\n while (matcher) {\n matchers.push(matcher);\n matcher = parseOperand();\n }\n return (matcherInput) => matchers.every((matcher2) => matcher2(matcherInput));\n }\n function parseInnerExpression() {\n const matchers = [];\n let matcher = parseConjunction();\n while (matcher) {\n matchers.push(matcher);\n if (token === \"|\" || token === \",\") {\n do {\n token = tokenizer.next();\n } while (token === \"|\" || token === \",\");\n } else {\n break;\n }\n matcher = parseConjunction();\n }\n return (matcherInput) => matchers.some((matcher2) => matcher2(matcherInput));\n }\n}\nfunction isIdentifier(token) {\n return !!token && !!token.match(/[\\w\\.:]+/);\n}\nfunction newTokenizer(input) {\n let regex = /([LR]:|[\\w\\.:][\\w\\.:\\-]*|[\\,\\|\\-\\(\\)])/g;\n let match = regex.exec(input);\n return {\n next: () => {\n if (!match) {\n return null;\n }\n const res = match[0];\n match = regex.exec(input);\n return res;\n }\n };\n}\n\n// src/onigLib.ts\nvar FindOption = /* @__PURE__ */ ((FindOption2) => {\n FindOption2[FindOption2[\"None\"] = 0] = \"None\";\n FindOption2[FindOption2[\"NotBeginString\"] = 1] = \"NotBeginString\";\n FindOption2[FindOption2[\"NotEndString\"] = 2] = \"NotEndString\";\n FindOption2[FindOption2[\"NotBeginPosition\"] = 4] = \"NotBeginPosition\";\n FindOption2[FindOption2[\"DebugCall\"] = 8] = \"DebugCall\";\n return FindOption2;\n})(FindOption || {});\nfunction disposeOnigString(str) {\n if (typeof str.dispose === \"function\") {\n str.dispose();\n }\n}\n\n// src/grammar/grammarDependencies.ts\nvar TopLevelRuleReference = class {\n constructor(scopeName) {\n this.scopeName = scopeName;\n }\n toKey() {\n return this.scopeName;\n }\n};\nvar TopLevelRepositoryRuleReference = class {\n constructor(scopeName, ruleName) {\n this.scopeName = scopeName;\n this.ruleName = ruleName;\n }\n toKey() {\n return `${this.scopeName}#${this.ruleName}`;\n }\n};\nvar ExternalReferenceCollector = class {\n _references = [];\n _seenReferenceKeys = /* @__PURE__ */ new Set();\n get references() {\n return this._references;\n }\n visitedRule = /* @__PURE__ */ new Set();\n add(reference) {\n const key = reference.toKey();\n if (this._seenReferenceKeys.has(key)) {\n return;\n }\n this._seenReferenceKeys.add(key);\n this._references.push(reference);\n }\n};\nvar ScopeDependencyProcessor = class {\n constructor(repo, initialScopeName) {\n this.repo = repo;\n this.initialScopeName = initialScopeName;\n this.seenFullScopeRequests.add(this.initialScopeName);\n this.Q = [new TopLevelRuleReference(this.initialScopeName)];\n }\n seenFullScopeRequests = /* @__PURE__ */ new Set();\n seenPartialScopeRequests = /* @__PURE__ */ new Set();\n Q;\n processQueue() {\n const q = this.Q;\n this.Q = [];\n const deps = new ExternalReferenceCollector();\n for (const dep of q) {\n collectReferencesOfReference(dep, this.initialScopeName, this.repo, deps);\n }\n for (const dep of deps.references) {\n if (dep instanceof TopLevelRuleReference) {\n if (this.seenFullScopeRequests.has(dep.scopeName)) {\n continue;\n }\n this.seenFullScopeRequests.add(dep.scopeName);\n this.Q.push(dep);\n } else {\n if (this.seenFullScopeRequests.has(dep.scopeName)) {\n continue;\n }\n if (this.seenPartialScopeRequests.has(dep.toKey())) {\n continue;\n }\n this.seenPartialScopeRequests.add(dep.toKey());\n this.Q.push(dep);\n }\n }\n }\n};\nfunction collectReferencesOfReference(reference, baseGrammarScopeName, repo, result) {\n const selfGrammar = repo.lookup(reference.scopeName);\n if (!selfGrammar) {\n if (reference.scopeName === baseGrammarScopeName) {\n throw new Error(`No grammar provided for <${baseGrammarScopeName}>`);\n }\n return;\n }\n const baseGrammar = repo.lookup(baseGrammarScopeName);\n if (reference instanceof TopLevelRuleReference) {\n collectExternalReferencesInTopLevelRule({ baseGrammar, selfGrammar }, result);\n } else {\n collectExternalReferencesInTopLevelRepositoryRule(\n reference.ruleName,\n { baseGrammar, selfGrammar, repository: selfGrammar.repository },\n result\n );\n }\n const injections = repo.injections(reference.scopeName);\n if (injections) {\n for (const injection of injections) {\n result.add(new TopLevelRuleReference(injection));\n }\n }\n}\nfunction collectExternalReferencesInTopLevelRepositoryRule(ruleName, context, result) {\n if (context.repository && context.repository[ruleName]) {\n const rule = context.repository[ruleName];\n collectExternalReferencesInRules([rule], context, result);\n }\n}\nfunction collectExternalReferencesInTopLevelRule(context, result) {\n if (context.selfGrammar.patterns && Array.isArray(context.selfGrammar.patterns)) {\n collectExternalReferencesInRules(\n context.selfGrammar.patterns,\n { ...context, repository: context.selfGrammar.repository },\n result\n );\n }\n if (context.selfGrammar.injections) {\n collectExternalReferencesInRules(\n Object.values(context.selfGrammar.injections),\n { ...context, repository: context.selfGrammar.repository },\n result\n );\n }\n}\nfunction collectExternalReferencesInRules(rules, context, result) {\n for (const rule of rules) {\n if (result.visitedRule.has(rule)) {\n continue;\n }\n result.visitedRule.add(rule);\n const patternRepository = rule.repository ? mergeObjects({}, context.repository, rule.repository) : context.repository;\n if (Array.isArray(rule.patterns)) {\n collectExternalReferencesInRules(rule.patterns, { ...context, repository: patternRepository }, result);\n }\n const include = rule.include;\n if (!include) {\n continue;\n }\n const reference = parseInclude(include);\n switch (reference.kind) {\n case 0 /* Base */:\n collectExternalReferencesInTopLevelRule({ ...context, selfGrammar: context.baseGrammar }, result);\n break;\n case 1 /* Self */:\n collectExternalReferencesInTopLevelRule(context, result);\n break;\n case 2 /* RelativeReference */:\n collectExternalReferencesInTopLevelRepositoryRule(reference.ruleName, { ...context, repository: patternRepository }, result);\n break;\n case 3 /* TopLevelReference */:\n case 4 /* TopLevelRepositoryReference */:\n const selfGrammar = reference.scopeName === context.selfGrammar.scopeName ? context.selfGrammar : reference.scopeName === context.baseGrammar.scopeName ? context.baseGrammar : void 0;\n if (selfGrammar) {\n const newContext = { baseGrammar: context.baseGrammar, selfGrammar, repository: patternRepository };\n if (reference.kind === 4 /* TopLevelRepositoryReference */) {\n collectExternalReferencesInTopLevelRepositoryRule(reference.ruleName, newContext, result);\n } else {\n collectExternalReferencesInTopLevelRule(newContext, result);\n }\n } else {\n if (reference.kind === 4 /* TopLevelRepositoryReference */) {\n result.add(new TopLevelRepositoryRuleReference(reference.scopeName, reference.ruleName));\n } else {\n result.add(new TopLevelRuleReference(reference.scopeName));\n }\n }\n break;\n }\n }\n}\nvar BaseReference = class {\n kind = 0 /* Base */;\n};\nvar SelfReference = class {\n kind = 1 /* Self */;\n};\nvar RelativeReference = class {\n constructor(ruleName) {\n this.ruleName = ruleName;\n }\n kind = 2 /* RelativeReference */;\n};\nvar TopLevelReference = class {\n constructor(scopeName) {\n this.scopeName = scopeName;\n }\n kind = 3 /* TopLevelReference */;\n};\nvar TopLevelRepositoryReference = class {\n constructor(scopeName, ruleName) {\n this.scopeName = scopeName;\n this.ruleName = ruleName;\n }\n kind = 4 /* TopLevelRepositoryReference */;\n};\nfunction parseInclude(include) {\n if (include === \"$base\") {\n return new BaseReference();\n } else if (include === \"$self\") {\n return new SelfReference();\n }\n const indexOfSharp = include.indexOf(\"#\");\n if (indexOfSharp === -1) {\n return new TopLevelReference(include);\n } else if (indexOfSharp === 0) {\n return new RelativeReference(include.substring(1));\n } else {\n const scopeName = include.substring(0, indexOfSharp);\n const ruleName = include.substring(indexOfSharp + 1);\n return new TopLevelRepositoryReference(scopeName, ruleName);\n }\n}\n\n// src/rule.ts\nvar HAS_BACK_REFERENCES = /\\\\(\\d+)/;\nvar BACK_REFERENCING_END = /\\\\(\\d+)/g;\nvar ruleIdSymbol = Symbol(\"RuleId\");\nvar endRuleId = -1;\nvar whileRuleId = -2;\nfunction ruleIdFromNumber(id) {\n return id;\n}\nfunction ruleIdToNumber(id) {\n return id;\n}\nvar Rule = class {\n $location;\n id;\n _nameIsCapturing;\n _name;\n _contentNameIsCapturing;\n _contentName;\n constructor($location, id, name, contentName) {\n this.$location = $location;\n this.id = id;\n this._name = name || null;\n this._nameIsCapturing = RegexSource.hasCaptures(this._name);\n this._contentName = contentName || null;\n this._contentNameIsCapturing = RegexSource.hasCaptures(this._contentName);\n }\n get debugName() {\n const location = this.$location ? `${basename(this.$location.filename)}:${this.$location.line}` : \"unknown\";\n return `${this.constructor.name}#${this.id} @ ${location}`;\n }\n getName(lineText, captureIndices) {\n if (!this._nameIsCapturing || this._name === null || lineText === null || captureIndices === null) {\n return this._name;\n }\n return RegexSource.replaceCaptures(this._name, lineText, captureIndices);\n }\n getContentName(lineText, captureIndices) {\n if (!this._contentNameIsCapturing || this._contentName === null) {\n return this._contentName;\n }\n return RegexSource.replaceCaptures(this._contentName, lineText, captureIndices);\n }\n};\nvar CaptureRule = class extends Rule {\n retokenizeCapturedWithRuleId;\n constructor($location, id, name, contentName, retokenizeCapturedWithRuleId) {\n super($location, id, name, contentName);\n this.retokenizeCapturedWithRuleId = retokenizeCapturedWithRuleId;\n }\n dispose() {\n }\n collectPatterns(grammar, out) {\n throw new Error(\"Not supported!\");\n }\n compile(grammar, endRegexSource) {\n throw new Error(\"Not supported!\");\n }\n compileAG(grammar, endRegexSource, allowA, allowG) {\n throw new Error(\"Not supported!\");\n }\n};\nvar MatchRule = class extends Rule {\n _match;\n captures;\n _cachedCompiledPatterns;\n constructor($location, id, name, match, captures) {\n super($location, id, name, null);\n this._match = new RegExpSource(match, this.id);\n this.captures = captures;\n this._cachedCompiledPatterns = null;\n }\n dispose() {\n if (this._cachedCompiledPatterns) {\n this._cachedCompiledPatterns.dispose();\n this._cachedCompiledPatterns = null;\n }\n }\n get debugMatchRegExp() {\n return `${this._match.source}`;\n }\n collectPatterns(grammar, out) {\n out.push(this._match);\n }\n compile(grammar, endRegexSource) {\n return this._getCachedCompiledPatterns(grammar).compile(grammar);\n }\n compileAG(grammar, endRegexSource, allowA, allowG) {\n return this._getCachedCompiledPatterns(grammar).compileAG(grammar, allowA, allowG);\n }\n _getCachedCompiledPatterns(grammar) {\n if (!this._cachedCompiledPatterns) {\n this._cachedCompiledPatterns = new RegExpSourceList();\n this.collectPatterns(grammar, this._cachedCompiledPatterns);\n }\n return this._cachedCompiledPatterns;\n }\n};\nvar IncludeOnlyRule = class extends Rule {\n hasMissingPatterns;\n patterns;\n _cachedCompiledPatterns;\n constructor($location, id, name, contentName, patterns) {\n super($location, id, name, contentName);\n this.patterns = patterns.patterns;\n this.hasMissingPatterns = patterns.hasMissingPatterns;\n this._cachedCompiledPatterns = null;\n }\n dispose() {\n if (this._cachedCompiledPatterns) {\n this._cachedCompiledPatterns.dispose();\n this._cachedCompiledPatterns = null;\n }\n }\n collectPatterns(grammar, out) {\n for (const pattern of this.patterns) {\n const rule = grammar.getRule(pattern);\n rule.collectPatterns(grammar, out);\n }\n }\n compile(grammar, endRegexSource) {\n return this._getCachedCompiledPatterns(grammar).compile(grammar);\n }\n compileAG(grammar, endRegexSource, allowA, allowG) {\n return this._getCachedCompiledPatterns(grammar).compileAG(grammar, allowA, allowG);\n }\n _getCachedCompiledPatterns(grammar) {\n if (!this._cachedCompiledPatterns) {\n this._cachedCompiledPatterns = new RegExpSourceList();\n this.collectPatterns(grammar, this._cachedCompiledPatterns);\n }\n return this._cachedCompiledPatterns;\n }\n};\nvar BeginEndRule = class extends Rule {\n _begin;\n beginCaptures;\n _end;\n endHasBackReferences;\n endCaptures;\n applyEndPatternLast;\n hasMissingPatterns;\n patterns;\n _cachedCompiledPatterns;\n constructor($location, id, name, contentName, begin, beginCaptures, end, endCaptures, applyEndPatternLast, patterns) {\n super($location, id, name, contentName);\n this._begin = new RegExpSource(begin, this.id);\n this.beginCaptures = beginCaptures;\n this._end = new RegExpSource(end ? end : \"\\uFFFF\", -1);\n this.endHasBackReferences = this._end.hasBackReferences;\n this.endCaptures = endCaptures;\n this.applyEndPatternLast = applyEndPatternLast || false;\n this.patterns = patterns.patterns;\n this.hasMissingPatterns = patterns.hasMissingPatterns;\n this._cachedCompiledPatterns = null;\n }\n dispose() {\n if (this._cachedCompiledPatterns) {\n this._cachedCompiledPatterns.dispose();\n this._cachedCompiledPatterns = null;\n }\n }\n get debugBeginRegExp() {\n return `${this._begin.source}`;\n }\n get debugEndRegExp() {\n return `${this._end.source}`;\n }\n getEndWithResolvedBackReferences(lineText, captureIndices) {\n return this._end.resolveBackReferences(lineText, captureIndices);\n }\n collectPatterns(grammar, out) {\n out.push(this._begin);\n }\n compile(grammar, endRegexSource) {\n return this._getCachedCompiledPatterns(grammar, endRegexSource).compile(grammar);\n }\n compileAG(grammar, endRegexSource, allowA, allowG) {\n return this._getCachedCompiledPatterns(grammar, endRegexSource).compileAG(grammar, allowA, allowG);\n }\n _getCachedCompiledPatterns(grammar, endRegexSource) {\n if (!this._cachedCompiledPatterns) {\n this._cachedCompiledPatterns = new RegExpSourceList();\n for (const pattern of this.patterns) {\n const rule = grammar.getRule(pattern);\n rule.collectPatterns(grammar, this._cachedCompiledPatterns);\n }\n if (this.applyEndPatternLast) {\n this._cachedCompiledPatterns.push(this._end.hasBackReferences ? this._end.clone() : this._end);\n } else {\n this._cachedCompiledPatterns.unshift(this._end.hasBackReferences ? this._end.clone() : this._end);\n }\n }\n if (this._end.hasBackReferences) {\n if (this.applyEndPatternLast) {\n this._cachedCompiledPatterns.setSource(this._cachedCompiledPatterns.length() - 1, endRegexSource);\n } else {\n this._cachedCompiledPatterns.setSource(0, endRegexSource);\n }\n }\n return this._cachedCompiledPatterns;\n }\n};\nvar BeginWhileRule = class extends Rule {\n _begin;\n beginCaptures;\n whileCaptures;\n _while;\n whileHasBackReferences;\n hasMissingPatterns;\n patterns;\n _cachedCompiledPatterns;\n _cachedCompiledWhilePatterns;\n constructor($location, id, name, contentName, begin, beginCaptures, _while, whileCaptures, patterns) {\n super($location, id, name, contentName);\n this._begin = new RegExpSource(begin, this.id);\n this.beginCaptures = beginCaptures;\n this.whileCaptures = whileCaptures;\n this._while = new RegExpSource(_while, whileRuleId);\n this.whileHasBackReferences = this._while.hasBackReferences;\n this.patterns = patterns.patterns;\n this.hasMissingPatterns = patterns.hasMissingPatterns;\n this._cachedCompiledPatterns = null;\n this._cachedCompiledWhilePatterns = null;\n }\n dispose() {\n if (this._cachedCompiledPatterns) {\n this._cachedCompiledPatterns.dispose();\n this._cachedCompiledPatterns = null;\n }\n if (this._cachedCompiledWhilePatterns) {\n this._cachedCompiledWhilePatterns.dispose();\n this._cachedCompiledWhilePatterns = null;\n }\n }\n get debugBeginRegExp() {\n return `${this._begin.source}`;\n }\n get debugWhileRegExp() {\n return `${this._while.source}`;\n }\n getWhileWithResolvedBackReferences(lineText, captureIndices) {\n return this._while.resolveBackReferences(lineText, captureIndices);\n }\n collectPatterns(grammar, out) {\n out.push(this._begin);\n }\n compile(grammar, endRegexSource) {\n return this._getCachedCompiledPatterns(grammar).compile(grammar);\n }\n compileAG(grammar, endRegexSource, allowA, allowG) {\n return this._getCachedCompiledPatterns(grammar).compileAG(grammar, allowA, allowG);\n }\n _getCachedCompiledPatterns(grammar) {\n if (!this._cachedCompiledPatterns) {\n this._cachedCompiledPatterns = new RegExpSourceList();\n for (const pattern of this.patterns) {\n const rule = grammar.getRule(pattern);\n rule.collectPatterns(grammar, this._cachedCompiledPatterns);\n }\n }\n return this._cachedCompiledPatterns;\n }\n compileWhile(grammar, endRegexSource) {\n return this._getCachedCompiledWhilePatterns(grammar, endRegexSource).compile(grammar);\n }\n compileWhileAG(grammar, endRegexSource, allowA, allowG) {\n return this._getCachedCompiledWhilePatterns(grammar, endRegexSource).compileAG(grammar, allowA, allowG);\n }\n _getCachedCompiledWhilePatterns(grammar, endRegexSource) {\n if (!this._cachedCompiledWhilePatterns) {\n this._cachedCompiledWhilePatterns = new RegExpSourceList();\n this._cachedCompiledWhilePatterns.push(this._while.hasBackReferences ? this._while.clone() : this._while);\n }\n if (this._while.hasBackReferences) {\n this._cachedCompiledWhilePatterns.setSource(0, endRegexSource ? endRegexSource : \"\\uFFFF\");\n }\n return this._cachedCompiledWhilePatterns;\n }\n};\nvar RuleFactory = class _RuleFactory {\n static createCaptureRule(helper, $location, name, contentName, retokenizeCapturedWithRuleId) {\n return helper.registerRule((id) => {\n return new CaptureRule($location, id, name, contentName, retokenizeCapturedWithRuleId);\n });\n }\n static getCompiledRuleId(desc, helper, repository) {\n if (!desc.id) {\n helper.registerRule((id) => {\n desc.id = id;\n if (desc.match) {\n return new MatchRule(\n desc.$vscodeTextmateLocation,\n desc.id,\n desc.name,\n desc.match,\n _RuleFactory._compileCaptures(desc.captures, helper, repository)\n );\n }\n if (typeof desc.begin === \"undefined\") {\n if (desc.repository) {\n repository = mergeObjects({}, repository, desc.repository);\n }\n let patterns = desc.patterns;\n if (typeof patterns === \"undefined\" && desc.include) {\n patterns = [{ include: desc.include }];\n }\n return new IncludeOnlyRule(\n desc.$vscodeTextmateLocation,\n desc.id,\n desc.name,\n desc.contentName,\n _RuleFactory._compilePatterns(patterns, helper, repository)\n );\n }\n if (desc.while) {\n return new BeginWhileRule(\n desc.$vscodeTextmateLocation,\n desc.id,\n desc.name,\n desc.contentName,\n desc.begin,\n _RuleFactory._compileCaptures(desc.beginCaptures || desc.captures, helper, repository),\n desc.while,\n _RuleFactory._compileCaptures(desc.whileCaptures || desc.captures, helper, repository),\n _RuleFactory._compilePatterns(desc.patterns, helper, repository)\n );\n }\n return new BeginEndRule(\n desc.$vscodeTextmateLocation,\n desc.id,\n desc.name,\n desc.contentName,\n desc.begin,\n _RuleFactory._compileCaptures(desc.beginCaptures || desc.captures, helper, repository),\n desc.end,\n _RuleFactory._compileCaptures(desc.endCaptures || desc.captures, helper, repository),\n desc.applyEndPatternLast,\n _RuleFactory._compilePatterns(desc.patterns, helper, repository)\n );\n });\n }\n return desc.id;\n }\n static _compileCaptures(captures, helper, repository) {\n let r = [];\n if (captures) {\n let maximumCaptureId = 0;\n for (const captureId in captures) {\n if (captureId === \"$vscodeTextmateLocation\") {\n continue;\n }\n const numericCaptureId = parseInt(captureId, 10);\n if (numericCaptureId > maximumCaptureId) {\n maximumCaptureId = numericCaptureId;\n }\n }\n for (let i = 0; i <= maximumCaptureId; i++) {\n r[i] = null;\n }\n for (const captureId in captures) {\n if (captureId === \"$vscodeTextmateLocation\") {\n continue;\n }\n const numericCaptureId = parseInt(captureId, 10);\n let retokenizeCapturedWithRuleId = 0;\n if (captures[captureId].patterns) {\n retokenizeCapturedWithRuleId = _RuleFactory.getCompiledRuleId(captures[captureId], helper, repository);\n }\n r[numericCaptureId] = _RuleFactory.createCaptureRule(helper, captures[captureId].$vscodeTextmateLocation, captures[captureId].name, captures[captureId].contentName, retokenizeCapturedWithRuleId);\n }\n }\n return r;\n }\n static _compilePatterns(patterns, helper, repository) {\n let r = [];\n if (patterns) {\n for (let i = 0, len = patterns.length; i < len; i++) {\n const pattern = patterns[i];\n let ruleId = -1;\n if (pattern.include) {\n const reference = parseInclude(pattern.include);\n switch (reference.kind) {\n case 0 /* Base */:\n case 1 /* Self */:\n ruleId = _RuleFactory.getCompiledRuleId(repository[pattern.include], helper, repository);\n break;\n case 2 /* RelativeReference */:\n let localIncludedRule = repository[reference.ruleName];\n if (localIncludedRule) {\n ruleId = _RuleFactory.getCompiledRuleId(localIncludedRule, helper, repository);\n } else {\n }\n break;\n case 3 /* TopLevelReference */:\n case 4 /* TopLevelRepositoryReference */:\n const externalGrammarName = reference.scopeName;\n const externalGrammarInclude = reference.kind === 4 /* TopLevelRepositoryReference */ ? reference.ruleName : null;\n const externalGrammar = helper.getExternalGrammar(externalGrammarName, repository);\n if (externalGrammar) {\n if (externalGrammarInclude) {\n let externalIncludedRule = externalGrammar.repository[externalGrammarInclude];\n if (externalIncludedRule) {\n ruleId = _RuleFactory.getCompiledRuleId(externalIncludedRule, helper, externalGrammar.repository);\n } else {\n }\n } else {\n ruleId = _RuleFactory.getCompiledRuleId(externalGrammar.repository.$self, helper, externalGrammar.repository);\n }\n } else {\n }\n break;\n }\n } else {\n ruleId = _RuleFactory.getCompiledRuleId(pattern, helper, repository);\n }\n if (ruleId !== -1) {\n const rule = helper.getRule(ruleId);\n let skipRule = false;\n if (rule instanceof IncludeOnlyRule || rule instanceof BeginEndRule || rule instanceof BeginWhileRule) {\n if (rule.hasMissingPatterns && rule.patterns.length === 0) {\n skipRule = true;\n }\n }\n if (skipRule) {\n continue;\n }\n r.push(ruleId);\n }\n }\n }\n return {\n patterns: r,\n hasMissingPatterns: (patterns ? patterns.length : 0) !== r.length\n };\n }\n};\nvar RegExpSource = class _RegExpSource {\n source;\n ruleId;\n hasAnchor;\n hasBackReferences;\n _anchorCache;\n constructor(regExpSource, ruleId) {\n if (regExpSource && typeof regExpSource === \"string\") {\n const len = regExpSource.length;\n let lastPushedPos = 0;\n let output = [];\n let hasAnchor = false;\n for (let pos = 0; pos < len; pos++) {\n const ch = regExpSource.charAt(pos);\n if (ch === \"\\\\\") {\n if (pos + 1 < len) {\n const nextCh = regExpSource.charAt(pos + 1);\n if (nextCh === \"z\") {\n output.push(regExpSource.substring(lastPushedPos, pos));\n output.push(\"$(?!\\\\n)(?<!\\\\n)\");\n lastPushedPos = pos + 2;\n } else if (nextCh === \"A\" || nextCh === \"G\") {\n hasAnchor = true;\n }\n pos++;\n }\n }\n }\n this.hasAnchor = hasAnchor;\n if (lastPushedPos === 0) {\n this.source = regExpSource;\n } else {\n output.push(regExpSource.substring(lastPushedPos, len));\n this.source = output.join(\"\");\n }\n } else {\n this.hasAnchor = false;\n this.source = regExpSource;\n }\n if (this.hasAnchor) {\n this._anchorCache = this._buildAnchorCache();\n } else {\n this._anchorCache = null;\n }\n this.ruleId = ruleId;\n if (typeof this.source === \"string\") {\n this.hasBackReferences = HAS_BACK_REFERENCES.test(this.source);\n } else {\n this.hasBackReferences = false;\n }\n }\n clone() {\n return new _RegExpSource(this.source, this.ruleId);\n }\n setSource(newSource) {\n if (this.source === newSource) {\n return;\n }\n this.source = newSource;\n if (this.hasAnchor) {\n this._anchorCache = this._buildAnchorCache();\n }\n }\n resolveBackReferences(lineText, captureIndices) {\n if (typeof this.source !== \"string\") {\n throw new Error(\"This method should only be called if the source is a string\");\n }\n let capturedValues = captureIndices.map((capture) => {\n return lineText.substring(capture.start, capture.end);\n });\n BACK_REFERENCING_END.lastIndex = 0;\n return this.source.replace(BACK_REFERENCING_END, (match, g1) => {\n return escapeRegExpCharacters(capturedValues[parseInt(g1, 10)] || \"\");\n });\n }\n _buildAnchorCache() {\n if (typeof this.source !== \"string\") {\n throw new Error(\"This method should only be called if the source is a string\");\n }\n let A0_G0_result = [];\n let A0_G1_result = [];\n let A1_G0_result = [];\n let A1_G1_result = [];\n let pos, len, ch, nextCh;\n for (pos = 0, len = this.source.length; pos < len; pos++) {\n ch = this.source.charAt(pos);\n A0_G0_result[pos] = ch;\n A0_G1_result[pos] = ch;\n A1_G0_result[pos] = ch;\n A1_G1_result[pos] = ch;\n if (ch === \"\\\\\") {\n if (pos + 1 < len) {\n nextCh = this.source.charAt(pos + 1);\n if (nextCh === \"A\") {\n A0_G0_result[pos + 1] = \"\\uFFFF\";\n A0_G1_result[pos + 1] = \"\\uFFFF\";\n A1_G0_result[pos + 1] = \"A\";\n A1_G1_result[pos + 1] = \"A\";\n } else if (nextCh === \"G\") {\n A0_G0_result[pos + 1] = \"\\uFFFF\";\n A0_G1_result[pos + 1] = \"G\";\n A1_G0_result[pos + 1] = \"\\uFFFF\";\n A1_G1_result[pos + 1] = \"G\";\n } else {\n A0_G0_result[pos + 1] = nextCh;\n A0_G1_result[pos + 1] = nextCh;\n A1_G0_result[pos + 1] = nextCh;\n A1_G1_result[pos + 1] = nextCh;\n }\n pos++;\n }\n }\n }\n return {\n A0_G0: A0_G0_result.join(\"\"),\n A0_G1: A0_G1_result.join(\"\"),\n A1_G0: A1_G0_result.join(\"\"),\n A1_G1: A1_G1_result.join(\"\")\n };\n }\n resolveAnchors(allowA, allowG) {\n if (!this.hasAnchor || !this._anchorCache || typeof this.source !== \"string\") {\n return this.source;\n }\n if (allowA) {\n if (allowG) {\n return this._anchorCache.A1_G1;\n } else {\n return this._anchorCache.A1_G0;\n }\n } else {\n if (allowG) {\n return this._anchorCache.A0_G1;\n } else {\n return this._anchorCache.A0_G0;\n }\n }\n }\n};\nvar RegExpSourceList = class {\n _items;\n _hasAnchors;\n _cached;\n _anchorCache;\n constructor() {\n this._items = [];\n this._hasAnchors = false;\n this._cached = null;\n this._anchorCache = {\n A0_G0: null,\n A0_G1: null,\n A1_G0: null,\n A1_G1: null\n };\n }\n dispose() {\n this._disposeCaches();\n }\n _disposeCaches() {\n if (this._cached) {\n this._cached.dispose();\n this._cached = null;\n }\n if (this._anchorCache.A0_G0) {\n this._anchorCache.A0_G0.dispose();\n this._anchorCache.A0_G0 = null;\n }\n if (this._anchorCache.A0_G1) {\n this._anchorCache.A0_G1.dispose();\n this._anchorCache.A0_G1 = null;\n }\n if (this._anchorCache.A1_G0) {\n this._anchorCache.A1_G0.dispose();\n this._anchorCache.A1_G0 = null;\n }\n if (this._anchorCache.A1_G1) {\n this._anchorCache.A1_G1.dispose();\n this._anchorCache.A1_G1 = null;\n }\n }\n push(item) {\n this._items.push(item);\n this._hasAnchors = this._hasAnchors || item.hasAnchor;\n }\n unshift(item) {\n this._items.unshift(item);\n this._hasAnchors = this._hasAnchors || item.hasAnchor;\n }\n length() {\n return this._items.length;\n }\n setSource(index, newSource) {\n if (this._items[index].source !== newSource) {\n this._disposeCaches();\n this._items[index].setSource(newSource);\n }\n }\n compile(onigLib) {\n if (!this._cached) {\n let regExps = this._items.map((e) => e.source);\n this._cached = new CompiledRule(onigLib, regExps, this._items.map((e) => e.ruleId));\n }\n return this._cached;\n }\n compileAG(onigLib, allowA, allowG) {\n if (!this._hasAnchors) {\n return this.compile(onigLib);\n } else {\n if (allowA) {\n if (allowG) {\n if (!this._anchorCache.A1_G1) {\n this._anchorCache.A1_G1 = this._resolveAnchors(onigLib, allowA, allowG);\n }\n return this._anchorCache.A1_G1;\n } else {\n if (!this._anchorCache.A1_G0) {\n this._anchorCache.A1_G0 = this._resolveAnchors(onigLib, allowA, allowG);\n }\n return this._anchorCache.A1_G0;\n }\n } else {\n if (allowG) {\n if (!this._anchorCache.A0_G1) {\n this._anchorCache.A0_G1 = this._resolveAnchors(onigLib, allowA, allowG);\n }\n return this._anchorCache.A0_G1;\n } else {\n if (!this._anchorCache.A0_G0) {\n this._anchorCache.A0_G0 = this._resolveAnchors(onigLib, allowA, allowG);\n }\n return this._anchorCache.A0_G0;\n }\n }\n }\n }\n _resolveAnchors(onigLib, allowA, allowG) {\n let regExps = this._items.map((e) => e.resolveAnchors(allowA, allowG));\n return new CompiledRule(onigLib, regExps, this._items.map((e) => e.ruleId));\n }\n};\nvar CompiledRule = class {\n constructor(onigLib, regExps, rules) {\n this.regExps = regExps;\n this.rules = rules;\n this.scanner = onigLib.createOnigScanner(regExps);\n }\n scanner;\n dispose() {\n if (typeof this.scanner.dispose === \"function\") {\n this.scanner.dispose();\n }\n }\n toString() {\n const r = [];\n for (let i = 0, len = this.rules.length; i < len; i++) {\n r.push(\" - \" + this.rules[i] + \": \" + this.regExps[i]);\n }\n return r.join(\"\\n\");\n }\n findNextMatchSync(string, startPosition, options) {\n const result = this.scanner.findNextMatchSync(string, startPosition, options);\n if (!result) {\n return null;\n }\n return {\n ruleId: this.rules[result.index],\n captureIndices: result.captureIndices\n };\n }\n};\n\n// src/grammar/basicScopesAttributeProvider.ts\nvar BasicScopeAttributes = class {\n constructor(languageId, tokenType) {\n this.languageId = languageId;\n this.tokenType = tokenType;\n }\n};\nvar BasicScopeAttributesProvider = class _BasicScopeAttributesProvider {\n _defaultAttributes;\n _embeddedLanguagesMatcher;\n constructor(initialLanguageId, embeddedLanguages) {\n this._defaultAttributes = new BasicScopeAttributes(initialLanguageId, 8 /* NotSet */);\n this._embeddedLanguagesMatcher = new ScopeMatcher(Object.entries(embeddedLanguages || {}));\n }\n getDefaultAttributes() {\n return this._defaultAttributes;\n }\n getBasicScopeAttributes(scopeName) {\n if (scopeName === null) {\n return _BasicScopeAttributesProvider._NULL_SCOPE_METADATA;\n }\n return this._getBasicScopeAttributes.get(scopeName);\n }\n static _NULL_SCOPE_METADATA = new BasicScopeAttributes(0, 0);\n _getBasicScopeAttributes = new CachedFn((scopeName) => {\n const languageId = this._scopeToLanguage(scopeName);\n const standardTokenType = this._toStandardTokenType(scopeName);\n return new BasicScopeAttributes(languageId, standardTokenType);\n });\n /**\n * Given a produced TM scope, return the language that token describes or null if unknown.\n * e.g. source.html => html, source.css.embedded.html => css, punctuation.definition.tag.html => null\n */\n _scopeToLanguage(scope) {\n return this._embeddedLanguagesMatcher.match(scope) || 0;\n }\n _toStandardTokenType(scopeName) {\n const m = scopeName.match(_BasicScopeAttributesProvider.STANDARD_TOKEN_TYPE_REGEXP);\n if (!m) {\n return 8 /* NotSet */;\n }\n switch (m[1]) {\n case \"comment\":\n return 1 /* Comment */;\n case \"string\":\n return 2 /* String */;\n case \"regex\":\n return 3 /* RegEx */;\n case \"meta.embedded\":\n return 0 /* Other */;\n }\n throw new Error(\"Unexpected match for standard token type!\");\n }\n static STANDARD_TOKEN_TYPE_REGEXP = /\\b(comment|string|regex|meta\\.embedded)\\b/;\n};\nvar ScopeMatcher = class {\n values;\n scopesRegExp;\n constructor(values) {\n if (values.length === 0) {\n this.values = null;\n this.scopesRegExp = null;\n } else {\n this.values = new Map(values);\n const escapedScopes = values.map(\n ([scopeName, value]) => escapeRegExpCharacters(scopeName)\n );\n escapedScopes.sort();\n escapedScopes.reverse();\n this.scopesRegExp = new RegExp(\n `^((${escapedScopes.join(\")|(\")}))($|\\\\.)`,\n \"\"\n );\n }\n }\n match(scope) {\n if (!this.scopesRegExp) {\n return void 0;\n }\n const m = scope.match(this.scopesRegExp);\n if (!m) {\n return void 0;\n }\n return this.values.get(m[1]);\n }\n};\n\n// src/debug.ts\nvar DebugFlags = {\n InDebugMode: typeof process !== \"undefined\" && !!process.env[\"VSCODE_TEXTMATE_DEBUG\"]\n};\nvar UseOnigurumaFindOptions = false;\n\n// src/grammar/tokenizeString.ts\nvar TokenizeStringResult = class {\n constructor(stack, stoppedEarly) {\n this.stack = stack;\n this.stoppedEarly = stoppedEarly;\n }\n};\nfunction _tokenizeString(grammar, lineText, isFirstLine, linePos, stack, lineTokens, checkWhileConditions, timeLimit) {\n const lineLength = lineText.content.length;\n let STOP = false;\n let anchorPosition = -1;\n if (checkWhileConditions) {\n const whileCheckResult = _checkWhileConditions(\n grammar,\n lineText,\n isFirstLine,\n linePos,\n stack,\n lineTokens\n );\n stack = whileCheckResult.stack;\n linePos = whileCheckResult.linePos;\n isFirstLine = whileCheckResult.isFirstLine;\n anchorPosition = whileCheckResult.anchorPosition;\n }\n const startTime = Date.now();\n while (!STOP) {\n if (timeLimit !== 0) {\n const elapsedTime = Date.now() - startTime;\n if (elapsedTime > timeLimit) {\n return new TokenizeStringResult(stack, true);\n }\n }\n scanNext();\n }\n return new TokenizeStringResult(stack, false);\n function scanNext() {\n if (false) {\n console.log(\"\");\n console.log(\n `@@scanNext ${linePos}: |${lineText.content.substr(linePos).replace(/\\n$/, \"\\\\n\")}|`\n );\n }\n const r = matchRuleOrInjections(\n grammar,\n lineText,\n isFirstLine,\n linePos,\n stack,\n anchorPosition\n );\n if (!r) {\n lineTokens.produce(stack, lineLength);\n STOP = true;\n return;\n }\n const captureIndices = r.captureIndices;\n const matchedRuleId = r.matchedRuleId;\n const hasAdvanced = captureIndices && captureIndices.length > 0 ? captureIndices[0].end > linePos : false;\n if (matchedRuleId === endRuleId) {\n const poppedRule = stack.getRule(grammar);\n if (false) {\n console.log(\n \" popping \" + poppedRule.debugName + \" - \" + poppedRule.debugEndRegExp\n );\n }\n lineTokens.produce(stack, captureIndices[0].start);\n stack = stack.withContentNameScopesList(stack.nameScopesList);\n handleCaptures(\n grammar,\n lineText,\n isFirstLine,\n stack,\n lineTokens,\n poppedRule.endCaptures,\n captureIndices\n );\n lineTokens.produce(stack, captureIndices[0].end);\n const popped = stack;\n stack = stack.parent;\n anchorPosition = popped.getAnchorPos();\n if (!hasAdvanced && popped.getEnterPos() === linePos) {\n if (false) {\n console.error(\n \"[1] - Grammar is in an endless loop - Grammar pushed & popped a rule without advancing\"\n );\n }\n stack = popped;\n lineTokens.produce(stack, lineLength);\n STOP = true;\n return;\n }\n } else {\n const _rule = grammar.getRule(matchedRuleId);\n lineTokens.produce(stack, captureIndices[0].start);\n const beforePush = stack;\n const scopeName = _rule.getName(lineText.content, captureIndices);\n const nameScopesList = stack.contentNameScopesList.pushAttributed(\n scopeName,\n grammar\n );\n stack = stack.push(\n matchedRuleId,\n linePos,\n anchorPosition,\n captureIndices[0].end === lineLength,\n null,\n nameScopesList,\n nameScopesList\n );\n if (_rule instanceof BeginEndRule) {\n const pushedRule = _rule;\n if (false) {\n console.log(\n \" pushing \" + pushedRule.debugName + \" - \" + pushedRule.debugBeginRegExp\n );\n }\n handleCaptures(\n grammar,\n lineText,\n isFirstLine,\n stack,\n lineTokens,\n pushedRule.beginCaptures,\n captureIndices\n );\n lineTokens.produce(stack, captureIndices[0].end);\n anchorPosition = captureIndices[0].end;\n const contentName = pushedRule.getContentName(\n lineText.content,\n captureIndices\n );\n const contentNameScopesList = nameScopesList.pushAttributed(\n contentName,\n grammar\n );\n stack = stack.withContentNameScopesList(contentNameScopesList);\n if (pushedRule.endHasBackReferences) {\n stack = stack.withEndRule(\n pushedRule.getEndWithResolvedBackReferences(\n lineText.content,\n captureIndices\n )\n );\n }\n if (!hasAdvanced && beforePush.hasSameRuleAs(stack)) {\n if (false) {\n console.error(\n \"[2] - Grammar is in an endless loop - Grammar pushed the same rule without advancing\"\n );\n }\n stack = stack.pop();\n lineTokens.produce(stack, lineLength);\n STOP = true;\n return;\n }\n } else if (_rule instanceof BeginWhileRule) {\n const pushedRule = _rule;\n if (false) {\n console.log(\" pushing \" + pushedRule.debugName);\n }\n handleCaptures(\n grammar,\n lineText,\n isFirstLine,\n stack,\n lineTokens,\n pushedRule.beginCaptures,\n captureIndices\n );\n lineTokens.produce(stack, captureIndices[0].end);\n anchorPosition = captureIndices[0].end;\n const contentName = pushedRule.getContentName(\n lineText.content,\n captureIndices\n );\n const contentNameScopesList = nameScopesList.pushAttributed(\n contentName,\n grammar\n );\n stack = stack.withContentNameScopesList(contentNameScopesList);\n if (pushedRule.whileHasBackReferences) {\n stack = stack.withEndRule(\n pushedRule.getWhileWithResolvedBackReferences(\n lineText.content,\n captureIndices\n )\n );\n }\n if (!hasAdvanced && beforePush.hasSameRuleAs(stack)) {\n if (false) {\n console.error(\n \"[3] - Grammar is in an endless loop - Grammar pushed the same rule without advancing\"\n );\n }\n stack = stack.pop();\n lineTokens.produce(stack, lineLength);\n STOP = true;\n return;\n }\n } else {\n const matchingRule = _rule;\n if (false) {\n console.log(\n \" matched \" + matchingRule.debugName + \" - \" + matchingRule.debugMatchRegExp\n );\n }\n handleCaptures(\n grammar,\n lineText,\n isFirstLine,\n stack,\n lineTokens,\n matchingRule.captures,\n captureIndices\n );\n lineTokens.produce(stack, captureIndices[0].end);\n stack = stack.pop();\n if (!hasAdvanced) {\n if (false) {\n console.error(\n \"[4] - Grammar is in an endless loop - Grammar is not advancing, nor is it pushing/popping\"\n );\n }\n stack = stack.safePop();\n lineTokens.produce(stack, lineLength);\n STOP = true;\n return;\n }\n }\n }\n if (captureIndices[0].end > linePos) {\n linePos = captureIndices[0].end;\n isFirstLine = false;\n }\n }\n}\nfunction _checkWhileConditions(grammar, lineText, isFirstLine, linePos, stack, lineTokens) {\n let anchorPosition = stack.beginRuleCapturedEOL ? 0 : -1;\n const whileRules = [];\n for (let node = stack; node; node = node.pop()) {\n const nodeRule = node.getRule(grammar);\n if (nodeRule instanceof BeginWhileRule) {\n whileRules.push({\n rule: nodeRule,\n stack: node\n });\n }\n }\n for (let whileRule = whileRules.pop(); whileRule; whileRule = whileRules.pop()) {\n const { ruleScanner, findOptions } = prepareRuleWhileSearch(whileRule.rule, grammar, whileRule.stack.endRule, isFirstLine, linePos === anchorPosition);\n const r = ruleScanner.findNextMatchSync(lineText, linePos, findOptions);\n if (false) {\n console.log(\" scanning for while rule\");\n console.log(ruleScanner.toString());\n }\n if (r) {\n const matchedRuleId = r.ruleId;\n if (matchedRuleId !== whileRuleId) {\n stack = whileRule.stack.pop();\n break;\n }\n if (r.captureIndices && r.captureIndices.length) {\n lineTokens.produce(whileRule.stack, r.captureIndices[0].start);\n handleCaptures(grammar, lineText, isFirstLine, whileRule.stack, lineTokens, whileRule.rule.whileCaptures, r.captureIndices);\n lineTokens.produce(whileRule.stack, r.captureIndices[0].end);\n anchorPosition = r.captureIndices[0].end;\n if (r.captureIndices[0].end > linePos) {\n linePos = r.captureIndices[0].end;\n isFirstLine = false;\n }\n }\n } else {\n if (false) {\n console.log(\" popping \" + whileRule.rule.debugName + \" - \" + whileRule.rule.debugWhileRegExp);\n }\n stack = whileRule.stack.pop();\n break;\n }\n }\n return { stack, linePos, anchorPosition, isFirstLine };\n}\nfunction matchRuleOrInjections(grammar, lineText, isFirstLine, linePos, stack, anchorPosition) {\n const matchResult = matchRule(grammar, lineText, isFirstLine, linePos, stack, anchorPosition);\n const injections = grammar.getInjections();\n if (injections.length === 0) {\n return matchResult;\n }\n const injectionResult = matchInjections(injections, grammar, lineText, isFirstLine, linePos, stack, anchorPosition);\n if (!injectionResult) {\n return matchResult;\n }\n if (!matchResult) {\n return injectionResult;\n }\n const matchResultScore = matchResult.captureIndices[0].start;\n const injectionResultScore = injectionResult.captureIndices[0].start;\n if (injectionResultScore < matchResultScore || injectionResult.priorityMatch && injectionResultScore === matchResultScore) {\n return injectionResult;\n }\n return matchResult;\n}\nfunction matchRule(grammar, lineText, isFirstLine, linePos, stack, anchorPosition) {\n const rule = stack.getRule(grammar);\n const { ruleScanner, findOptions } = prepareRuleSearch(rule, grammar, stack.endRule, isFirstLine, linePos === anchorPosition);\n const r = ruleScanner.findNextMatchSync(lineText, linePos, findOptions);\n if (r) {\n return {\n captureIndices: r.captureIndices,\n matchedRuleId: r.ruleId\n };\n }\n return null;\n}\nfunction matchInjections(injections, grammar, lineText, isFirstLine, linePos, stack, anchorPosition) {\n let bestMatchRating = Number.MAX_VALUE;\n let bestMatchCaptureIndices = null;\n let bestMatchRuleId;\n let bestMatchResultPriority = 0;\n const scopes = stack.contentNameScopesList.getScopeNames();\n for (let i = 0, len = injections.length; i < len; i++) {\n const injection = injections[i];\n if (!injection.matcher(scopes)) {\n continue;\n }\n const rule = grammar.getRule(injection.ruleId);\n const { ruleScanner, findOptions } = prepareRuleSearch(rule, grammar, null, isFirstLine, linePos === anchorPosition);\n const matchResult = ruleScanner.findNextMatchSync(lineText, linePos, findOptions);\n if (!matchResult) {\n continue;\n }\n if (false) {\n console.log(` matched injection: ${injection.debugSelector}`);\n console.log(ruleScanner.toString());\n }\n const matchRating = matchResult.captureIndices[0].start;\n if (matchRating >= bestMatchRating) {\n continue;\n }\n bestMatchRating = matchRating;\n bestMatchCaptureIndices = matchResult.captureIndices;\n bestMatchRuleId = matchResult.ruleId;\n bestMatchResultPriority = injection.priority;\n if (bestMatchRating === linePos) {\n break;\n }\n }\n if (bestMatchCaptureIndices) {\n return {\n priorityMatch: bestMatchResultPriority === -1,\n captureIndices: bestMatchCaptureIndices,\n matchedRuleId: bestMatchRuleId\n };\n }\n return null;\n}\nfunction prepareRuleSearch(rule, grammar, endRegexSource, allowA, allowG) {\n if (UseOnigurumaFindOptions) {\n const ruleScanner2 = rule.compile(grammar, endRegexSource);\n const findOptions = getFindOptions(allowA, allowG);\n return { ruleScanner: ruleScanner2, findOptions };\n }\n const ruleScanner = rule.compileAG(grammar, endRegexSource, allowA, allowG);\n return { ruleScanner, findOptions: 0 /* None */ };\n}\nfunction prepareRuleWhileSearch(rule, grammar, endRegexSource, allowA, allowG) {\n if (UseOnigurumaFindOptions) {\n const ruleScanner2 = rule.compileWhile(grammar, endRegexSource);\n const findOptions = getFindOptions(allowA, allowG);\n return { ruleScanner: ruleScanner2, findOptions };\n }\n const ruleScanner = rule.compileWhileAG(grammar, endRegexSource, allowA, allowG);\n return { ruleScanner, findOptions: 0 /* None */ };\n}\nfunction getFindOptions(allowA, allowG) {\n let options = 0 /* None */;\n if (!allowA) {\n options |= 1 /* NotBeginString */;\n }\n if (!allowG) {\n options |= 4 /* NotBeginPosition */;\n }\n return options;\n}\nfunction handleCaptures(grammar, lineText, isFirstLine, stack, lineTokens, captures, captureIndices) {\n if (captures.length === 0) {\n return;\n }\n const lineTextContent = lineText.content;\n const len = Math.min(captures.length, captureIndices.length);\n const localStack = [];\n const maxEnd = captureIndices[0].end;\n for (let i = 0; i < len; i++) {\n const captureRule = captures[i];\n if (captureRule === null) {\n continue;\n }\n const captureIndex = captureIndices[i];\n if (captureIndex.length === 0) {\n continue;\n }\n if (captureIndex.start > maxEnd) {\n break;\n }\n while (localStack.length > 0 && localStack[localStack.length - 1].endPos <= captureIndex.start) {\n lineTokens.produceFromScopes(localStack[localStack.length - 1].scopes, localStack[localStack.length - 1].endPos);\n localStack.pop();\n }\n if (localStack.length > 0) {\n lineTokens.produceFromScopes(localStack[localStack.length - 1].scopes, captureIndex.start);\n } else {\n lineTokens.produce(stack, captureIndex.start);\n }\n if (captureRule.retokenizeCapturedWithRuleId) {\n const scopeName = captureRule.getName(lineTextContent, captureIndices);\n const nameScopesList = stack.contentNameScopesList.pushAttributed(scopeName, grammar);\n const contentName = captureRule.getContentName(lineTextContent, captureIndices);\n const contentNameScopesList = nameScopesList.pushAttributed(contentName, grammar);\n const stackClone = stack.push(captureRule.retokenizeCapturedWithRuleId, captureIndex.start, -1, false, null, nameScopesList, contentNameScopesList);\n const onigSubStr = grammar.createOnigString(lineTextContent.substring(0, captureIndex.end));\n _tokenizeString(\n grammar,\n onigSubStr,\n isFirstLine && captureIndex.start === 0,\n captureIndex.start,\n stackClone,\n lineTokens,\n false,\n /* no time limit */\n 0\n );\n disposeOnigString(onigSubStr);\n continue;\n }\n const captureRuleScopeName = captureRule.getName(lineTextContent, captureIndices);\n if (captureRuleScopeName !== null) {\n const base = localStack.length > 0 ? localStack[localStack.length - 1].scopes : stack.contentNameScopesList;\n const captureRuleScopesList = base.pushAttributed(captureRuleScopeName, grammar);\n localStack.push(new LocalStackElement(captureRuleScopesList, captureIndex.end));\n }\n }\n while (localStack.length > 0) {\n lineTokens.produceFromScopes(localStack[localStack.length - 1].scopes, localStack[localStack.length - 1].endPos);\n localStack.pop();\n }\n}\nvar LocalStackElement = class {\n scopes;\n endPos;\n constructor(scopes, endPos) {\n this.scopes = scopes;\n this.endPos = endPos;\n }\n};\n\n// src/grammar/grammar.ts\nfunction createGrammar(scopeName, grammar, initialLanguage, embeddedLanguages, tokenTypes, balancedBracketSelectors, grammarRepository, onigLib) {\n return new Grammar(\n scopeName,\n grammar,\n initialLanguage,\n embeddedLanguages,\n tokenTypes,\n balancedBracketSelectors,\n grammarRepository,\n onigLib\n );\n}\nfunction collectInjections(result, selector, rule, ruleFactoryHelper, grammar) {\n const matchers = createMatchers(selector, nameMatcher);\n const ruleId = RuleFactory.getCompiledRuleId(rule, ruleFactoryHelper, grammar.repository);\n for (const matcher of matchers) {\n result.push({\n debugSelector: selector,\n matcher: matcher.matcher,\n ruleId,\n grammar,\n priority: matcher.priority\n });\n }\n}\nfunction nameMatcher(identifers, scopes) {\n if (scopes.length < identifers.length) {\n return false;\n }\n let lastIndex = 0;\n return identifers.every((identifier) => {\n for (let i = lastIndex; i < scopes.length; i++) {\n if (scopesAreMatching(scopes[i], identifier)) {\n lastIndex = i + 1;\n return true;\n }\n }\n return false;\n });\n}\nfunction scopesAreMatching(thisScopeName, scopeName) {\n if (!thisScopeName) {\n return false;\n }\n if (thisScopeName === scopeName) {\n return true;\n }\n const len = scopeName.length;\n return thisScopeName.length > len && thisScopeName.substr(0, len) === scopeName && thisScopeName[len] === \".\";\n}\nvar Grammar = class {\n constructor(_rootScopeName, grammar, initialLanguage, embeddedLanguages, tokenTypes, balancedBracketSelectors, grammarRepository, _onigLib) {\n this._rootScopeName = _rootScopeName;\n this.balancedBracketSelectors = balancedBracketSelectors;\n this._onigLib = _onigLib;\n this._basicScopeAttributesProvider = new BasicScopeAttributesProvider(\n initialLanguage,\n embeddedLanguages\n );\n this._rootId = -1;\n this._lastRuleId = 0;\n this._ruleId2desc = [null];\n this._includedGrammars = {};\n this._grammarRepository = grammarRepository;\n this._grammar = initGrammar(grammar, null);\n this._injections = null;\n this._tokenTypeMatchers = [];\n if (tokenTypes) {\n for (const selector of Object.keys(tokenTypes)) {\n const matchers = createMatchers(selector, nameMatcher);\n for (const matcher of matchers) {\n this._tokenTypeMatchers.push({\n matcher: matcher.matcher,\n type: tokenTypes[selector]\n });\n }\n }\n }\n }\n _rootId;\n _lastRuleId;\n _ruleId2desc;\n _includedGrammars;\n _grammarRepository;\n _grammar;\n _injections;\n _basicScopeAttributesProvider;\n _tokenTypeMatchers;\n get themeProvider() {\n return this._grammarRepository;\n }\n dispose() {\n for (const rule of this._ruleId2desc) {\n if (rule) {\n rule.dispose();\n }\n }\n }\n createOnigScanner(sources) {\n return this._onigLib.createOnigScanner(sources);\n }\n createOnigString(sources) {\n return this._onigLib.createOnigString(sources);\n }\n getMetadataForScope(scope) {\n return this._basicScopeAttributesProvider.getBasicScopeAttributes(scope);\n }\n _collectInjections() {\n const grammarRepository = {\n lookup: (scopeName2) => {\n if (scopeName2 === this._rootScopeName) {\n return this._grammar;\n }\n return this.getExternalGrammar(scopeName2);\n },\n injections: (scopeName2) => {\n return this._grammarRepository.injections(scopeName2);\n }\n };\n const result = [];\n const scopeName = this._rootScopeName;\n const grammar = grammarRepository.lookup(scopeName);\n if (grammar) {\n const rawInjections = grammar.injections;\n if (rawInjections) {\n for (let expression in rawInjections) {\n collectInjections(\n result,\n expression,\n rawInjections[expression],\n this,\n grammar\n );\n }\n }\n const injectionScopeNames = this._grammarRepository.injections(scopeName);\n if (injectionScopeNames) {\n injectionScopeNames.forEach((injectionScopeName) => {\n const injectionGrammar = this.getExternalGrammar(injectionScopeName);\n if (injectionGrammar) {\n const selector = injectionGrammar.injectionSelector;\n if (selector) {\n collectInjections(\n result,\n selector,\n injectionGrammar,\n this,\n injectionGrammar\n );\n }\n }\n });\n }\n }\n result.sort((i1, i2) => i1.priority - i2.priority);\n return result;\n }\n getInjections() {\n if (this._injections === null) {\n this._injections = this._collectInjections();\n }\n return this._injections;\n }\n registerRule(factory) {\n const id = ++this._lastRuleId;\n const result = factory(ruleIdFromNumber(id));\n this._ruleId2desc[id] = result;\n return result;\n }\n getRule(ruleId) {\n return this._ruleId2desc[ruleIdToNumber(ruleId)];\n }\n getExternalGrammar(scopeName, repository) {\n if (this._includedGrammars[scopeName]) {\n return this._includedGrammars[scopeName];\n } else if (this._grammarRepository) {\n const rawIncludedGrammar = this._grammarRepository.lookup(scopeName);\n if (rawIncludedGrammar) {\n this._includedGrammars[scopeName] = initGrammar(\n rawIncludedGrammar,\n repository && repository.$base\n );\n return this._includedGrammars[scopeName];\n }\n }\n return void 0;\n }\n tokenizeLine(lineText, prevState, timeLimit = 0) {\n const r = this._tokenize(lineText, prevState, false, timeLimit);\n return {\n tokens: r.lineTokens.getResult(r.ruleStack, r.lineLength),\n ruleStack: r.ruleStack,\n stoppedEarly: r.stoppedEarly\n };\n }\n tokenizeLine2(lineText, prevState, timeLimit = 0) {\n const r = this._tokenize(lineText, prevState, true, timeLimit);\n return {\n tokens: r.lineTokens.getBinaryResult(r.ruleStack, r.lineLength),\n ruleStack: r.ruleStack,\n stoppedEarly: r.stoppedEarly\n };\n }\n _tokenize(lineText, prevState, emitBinaryTokens, timeLimit) {\n if (this._rootId === -1) {\n this._rootId = RuleFactory.getCompiledRuleId(\n this._grammar.repository.$self,\n this,\n this._grammar.repository\n );\n this.getInjections();\n }\n let isFirstLine;\n if (!prevState || prevState === StateStackImpl.NULL) {\n isFirstLine = true;\n const rawDefaultMetadata = this._basicScopeAttributesProvider.getDefaultAttributes();\n const defaultStyle = this.themeProvider.getDefaults();\n const defaultMetadata = EncodedTokenMetadata.set(\n 0,\n rawDefaultMetadata.languageId,\n rawDefaultMetadata.tokenType,\n null,\n defaultStyle.fontStyle,\n defaultStyle.foregroundId,\n defaultStyle.backgroundId\n );\n const rootScopeName = this.getRule(this._rootId).getName(\n null,\n null\n );\n let scopeList;\n if (rootScopeName) {\n scopeList = AttributedScopeStack.createRootAndLookUpScopeName(\n rootScopeName,\n defaultMetadata,\n this\n );\n } else {\n scopeList = AttributedScopeStack.createRoot(\n \"unknown\",\n defaultMetadata\n );\n }\n prevState = new StateStackImpl(\n null,\n this._rootId,\n -1,\n -1,\n false,\n null,\n scopeList,\n scopeList\n );\n } else {\n isFirstLine = false;\n prevState.reset();\n }\n lineText = lineText + \"\\n\";\n const onigLineText = this.createOnigString(lineText);\n const lineLength = onigLineText.content.length;\n const lineTokens = new LineTokens(\n emitBinaryTokens,\n lineText,\n this._tokenTypeMatchers,\n this.balancedBracketSelectors\n );\n const r = _tokenizeString(\n this,\n onigLineText,\n isFirstLine,\n 0,\n prevState,\n lineTokens,\n true,\n timeLimit\n );\n disposeOnigString(onigLineText);\n return {\n lineLength,\n lineTokens,\n ruleStack: r.stack,\n stoppedEarly: r.stoppedEarly\n };\n }\n};\nfunction initGrammar(grammar, base) {\n grammar = clone(grammar);\n grammar.repository = grammar.repository || {};\n grammar.repository.$self = {\n $vscodeTextmateLocation: grammar.$vscodeTextmateLocation,\n patterns: grammar.patterns,\n name: grammar.scopeName\n };\n grammar.repository.$base = base || grammar.repository.$self;\n return grammar;\n}\nvar AttributedScopeStack = class _AttributedScopeStack {\n /**\n * Invariant:\n * ```\n * if (parent && !scopePath.extends(parent.scopePath)) {\n * \tthrow new Error();\n * }\n * ```\n */\n constructor(parent, scopePath, tokenAttributes) {\n this.parent = parent;\n this.scopePath = scopePath;\n this.tokenAttributes = tokenAttributes;\n }\n static fromExtension(namesScopeList, contentNameScopesList) {\n let current = namesScopeList;\n let scopeNames = namesScopeList?.scopePath ?? null;\n for (const frame of contentNameScopesList) {\n scopeNames = ScopeStack.push(scopeNames, frame.scopeNames);\n current = new _AttributedScopeStack(current, scopeNames, frame.encodedTokenAttributes);\n }\n return current;\n }\n static createRoot(scopeName, tokenAttributes) {\n return new _AttributedScopeStack(null, new ScopeStack(null, scopeName), tokenAttributes);\n }\n static createRootAndLookUpScopeName(scopeName, tokenAttributes, grammar) {\n const rawRootMetadata = grammar.getMetadataForScope(scopeName);\n const scopePath = new ScopeStack(null, scopeName);\n const rootStyle = grammar.themeProvider.themeMatch(scopePath);\n const resolvedTokenAttributes = _AttributedScopeStack.mergeAttributes(\n tokenAttributes,\n rawRootMetadata,\n rootStyle\n );\n return new _AttributedScopeStack(null, scopePath, resolvedTokenAttributes);\n }\n get scopeName() {\n return this.scopePath.scopeName;\n }\n toString() {\n return this.getScopeNames().join(\" \");\n }\n equals(other) {\n return _AttributedScopeStack.equals(this, other);\n }\n static equals(a, b) {\n do {\n if (a === b) {\n return true;\n }\n if (!a && !b) {\n return true;\n }\n if (!a || !b) {\n return false;\n }\n if (a.scopeName !== b.scopeName || a.tokenAttributes !== b.tokenAttributes) {\n return false;\n }\n a = a.parent;\n b = b.parent;\n } while (true);\n }\n static mergeAttributes(existingTokenAttributes, basicScopeAttributes, styleAttributes) {\n let fontStyle = -1 /* NotSet */;\n let foreground = 0;\n let background = 0;\n if (styleAttributes !== null) {\n fontStyle = styleAttributes.fontStyle;\n foreground = styleAttributes.foregroundId;\n background = styleAttributes.backgroundId;\n }\n return EncodedTokenMetadata.set(\n existingTokenAttributes,\n basicScopeAttributes.languageId,\n basicScopeAttributes.tokenType,\n null,\n fontStyle,\n foreground,\n background\n );\n }\n pushAttributed(scopePath, grammar) {\n if (scopePath === null) {\n return this;\n }\n if (scopePath.indexOf(\" \") === -1) {\n return _AttributedScopeStack._pushAttributed(this, scopePath, grammar);\n }\n const scopes = scopePath.split(/ /g);\n let result = this;\n for (const scope of scopes) {\n result = _AttributedScopeStack._pushAttributed(result, scope, grammar);\n }\n return result;\n }\n static _pushAttributed(target, scopeName, grammar) {\n const rawMetadata = grammar.getMetadataForScope(scopeName);\n const newPath = target.scopePath.push(scopeName);\n const scopeThemeMatchResult = grammar.themeProvider.themeMatch(newPath);\n const metadata = _AttributedScopeStack.mergeAttributes(\n target.tokenAttributes,\n rawMetadata,\n scopeThemeMatchResult\n );\n return new _AttributedScopeStack(target, newPath, metadata);\n }\n getScopeNames() {\n return this.scopePath.getSegments();\n }\n getExtensionIfDefined(base) {\n const result = [];\n let self = this;\n while (self && self !== base) {\n result.push({\n encodedTokenAttributes: self.tokenAttributes,\n scopeNames: self.scopePath.getExtensionIfDefined(self.parent?.scopePath ?? null)\n });\n self = self.parent;\n }\n return self === base ? result.reverse() : void 0;\n }\n};\nvar StateStackImpl = class _StateStackImpl {\n /**\n * Invariant:\n * ```\n * if (contentNameScopesList !== nameScopesList && contentNameScopesList?.parent !== nameScopesList) {\n * \tthrow new Error();\n * }\n * if (this.parent && !nameScopesList.extends(this.parent.contentNameScopesList)) {\n * \tthrow new Error();\n * }\n * ```\n */\n constructor(parent, ruleId, enterPos, anchorPos, beginRuleCapturedEOL, endRule, nameScopesList, contentNameScopesList) {\n this.parent = parent;\n this.ruleId = ruleId;\n this.beginRuleCapturedEOL = beginRuleCapturedEOL;\n this.endRule = endRule;\n this.nameScopesList = nameScopesList;\n this.contentNameScopesList = contentNameScopesList;\n this.depth = this.parent ? this.parent.depth + 1 : 1;\n this._enterPos = enterPos;\n this._anchorPos = anchorPos;\n }\n _stackElementBrand = void 0;\n // TODO remove me\n static NULL = new _StateStackImpl(\n null,\n 0,\n 0,\n 0,\n false,\n null,\n null,\n null\n );\n /**\n * The position on the current line where this state was pushed.\n * This is relevant only while tokenizing a line, to detect endless loops.\n * Its value is meaningless across lines.\n */\n _enterPos;\n /**\n * The captured anchor position when this stack element was pushed.\n * This is relevant only while tokenizing a line, to restore the anchor position when popping.\n * Its value is meaningless across lines.\n */\n _anchorPos;\n /**\n * The depth of the stack.\n */\n depth;\n equals(other) {\n if (other === null) {\n return false;\n }\n return _StateStackImpl._equals(this, other);\n }\n static _equals(a, b) {\n if (a === b) {\n return true;\n }\n if (!this._structuralEquals(a, b)) {\n return false;\n }\n return AttributedScopeStack.equals(a.contentNameScopesList, b.contentNameScopesList);\n }\n /**\n * A structural equals check. Does not take into account `scopes`.\n */\n static _structuralEquals(a, b) {\n do {\n if (a === b) {\n return true;\n }\n if (!a && !b) {\n return true;\n }\n if (!a || !b) {\n return false;\n }\n if (a.depth !== b.depth || a.ruleId !== b.ruleId || a.endRule !== b.endRule) {\n return false;\n }\n a = a.parent;\n b = b.parent;\n } while (true);\n }\n clone() {\n return this;\n }\n static _reset(el) {\n while (el) {\n el._enterPos = -1;\n el._anchorPos = -1;\n el = el.parent;\n }\n }\n reset() {\n _StateStackImpl._reset(this);\n }\n pop() {\n return this.parent;\n }\n safePop() {\n if (this.parent) {\n return this.parent;\n }\n return this;\n }\n push(ruleId, enterPos, anchorPos, beginRuleCapturedEOL, endRule, nameScopesList, contentNameScopesList) {\n return new _StateStackImpl(\n this,\n ruleId,\n enterPos,\n anchorPos,\n beginRuleCapturedEOL,\n endRule,\n nameScopesList,\n contentNameScopesList\n );\n }\n getEnterPos() {\n return this._enterPos;\n }\n getAnchorPos() {\n return this._anchorPos;\n }\n getRule(grammar) {\n return grammar.getRule(this.ruleId);\n }\n toString() {\n const r = [];\n this._writeString(r, 0);\n return \"[\" + r.join(\",\") + \"]\";\n }\n _writeString(res, outIndex) {\n if (this.parent) {\n outIndex = this.parent._writeString(res, outIndex);\n }\n res[outIndex++] = `(${this.ruleId}, ${this.nameScopesList?.toString()}, ${this.contentNameScopesList?.toString()})`;\n return outIndex;\n }\n withContentNameScopesList(contentNameScopeStack) {\n if (this.contentNameScopesList === contentNameScopeStack) {\n return this;\n }\n return this.parent.push(\n this.ruleId,\n this._enterPos,\n this._anchorPos,\n this.beginRuleCapturedEOL,\n this.endRule,\n this.nameScopesList,\n contentNameScopeStack\n );\n }\n withEndRule(endRule) {\n if (this.endRule === endRule) {\n return this;\n }\n return new _StateStackImpl(\n this.parent,\n this.ruleId,\n this._enterPos,\n this._anchorPos,\n this.beginRuleCapturedEOL,\n endRule,\n this.nameScopesList,\n this.contentNameScopesList\n );\n }\n // Used to warn of endless loops\n hasSameRuleAs(other) {\n let el = this;\n while (el && el._enterPos === other._enterPos) {\n if (el.ruleId === other.ruleId) {\n return true;\n }\n el = el.parent;\n }\n return false;\n }\n toStateStackFrame() {\n return {\n ruleId: ruleIdToNumber(this.ruleId),\n beginRuleCapturedEOL: this.beginRuleCapturedEOL,\n endRule: this.endRule,\n nameScopesList: this.nameScopesList?.getExtensionIfDefined(this.parent?.nameScopesList ?? null) ?? [],\n contentNameScopesList: this.contentNameScopesList?.getExtensionIfDefined(this.nameScopesList) ?? []\n };\n }\n static pushFrame(self, frame) {\n const namesScopeList = AttributedScopeStack.fromExtension(self?.nameScopesList ?? null, frame.nameScopesList);\n return new _StateStackImpl(\n self,\n ruleIdFromNumber(frame.ruleId),\n frame.enterPos ?? -1,\n frame.anchorPos ?? -1,\n frame.beginRuleCapturedEOL,\n frame.endRule,\n namesScopeList,\n AttributedScopeStack.fromExtension(namesScopeList, frame.contentNameScopesList)\n );\n }\n};\nvar BalancedBracketSelectors = class {\n balancedBracketScopes;\n unbalancedBracketScopes;\n allowAny = false;\n constructor(balancedBracketScopes, unbalancedBracketScopes) {\n this.balancedBracketScopes = balancedBracketScopes.flatMap(\n (selector) => {\n if (selector === \"*\") {\n this.allowAny = true;\n return [];\n }\n return createMatchers(selector, nameMatcher).map((m) => m.matcher);\n }\n );\n this.unbalancedBracketScopes = unbalancedBracketScopes.flatMap(\n (selector) => createMatchers(selector, nameMatcher).map((m) => m.matcher)\n );\n }\n get matchesAlways() {\n return this.allowAny && this.unbalancedBracketScopes.length === 0;\n }\n get matchesNever() {\n return this.balancedBracketScopes.length === 0 && !this.allowAny;\n }\n match(scopes) {\n for (const excluder of this.unbalancedBracketScopes) {\n if (excluder(scopes)) {\n return false;\n }\n }\n for (const includer of this.balancedBracketScopes) {\n if (includer(scopes)) {\n return true;\n }\n }\n return this.allowAny;\n }\n};\nvar LineTokens = class {\n constructor(emitBinaryTokens, lineText, tokenTypeOverrides, balancedBracketSelectors) {\n this.balancedBracketSelectors = balancedBracketSelectors;\n this._emitBinaryTokens = emitBinaryTokens;\n this._tokenTypeOverrides = tokenTypeOverrides;\n if (false) {\n this._lineText = lineText;\n } else {\n this._lineText = null;\n }\n this._tokens = [];\n this._binaryTokens = [];\n this._lastTokenEndIndex = 0;\n }\n _emitBinaryTokens;\n /**\n * defined only if `false`.\n */\n _lineText;\n /**\n * used only if `_emitBinaryTokens` is false.\n */\n _tokens;\n /**\n * used only if `_emitBinaryTokens` is true.\n */\n _binaryTokens;\n _lastTokenEndIndex;\n _tokenTypeOverrides;\n produce(stack, endIndex) {\n this.produceFromScopes(stack.contentNameScopesList, endIndex);\n }\n produceFromScopes(scopesList, endIndex) {\n if (this._lastTokenEndIndex >= endIndex) {\n return;\n }\n if (this._emitBinaryTokens) {\n let metadata = scopesList?.tokenAttributes ?? 0;\n let containsBalancedBrackets = false;\n if (this.balancedBracketSelectors?.matchesAlways) {\n containsBalancedBrackets = true;\n }\n if (this._tokenTypeOverrides.length > 0 || this.balancedBracketSelectors && !this.balancedBracketSelectors.matchesAlways && !this.balancedBracketSelectors.matchesNever) {\n const scopes2 = scopesList?.getScopeNames() ?? [];\n for (const tokenType of this._tokenTypeOverrides) {\n if (tokenType.matcher(scopes2)) {\n metadata = EncodedTokenMetadata.set(\n metadata,\n 0,\n toOptionalTokenType(tokenType.type),\n null,\n -1 /* NotSet */,\n 0,\n 0\n );\n }\n }\n if (this.balancedBracketSelectors) {\n containsBalancedBrackets = this.balancedBracketSelectors.match(scopes2);\n }\n }\n if (containsBalancedBrackets) {\n metadata = EncodedTokenMetadata.set(\n metadata,\n 0,\n 8 /* NotSet */,\n containsBalancedBrackets,\n -1 /* NotSet */,\n 0,\n 0\n );\n }\n if (this._binaryTokens.length > 0 && this._binaryTokens[this._binaryTokens.length - 1] === metadata) {\n this._lastTokenEndIndex = endIndex;\n return;\n }\n this._binaryTokens.push(this._lastTokenEndIndex);\n this._binaryTokens.push(metadata);\n this._lastTokenEndIndex = endIndex;\n return;\n }\n const scopes = scopesList?.getScopeNames() ?? [];\n this._tokens.push({\n startIndex: this._lastTokenEndIndex,\n endIndex,\n // value: lineText.substring(lastTokenEndIndex, endIndex),\n scopes\n });\n this._lastTokenEndIndex = endIndex;\n }\n getResult(stack, lineLength) {\n if (this._tokens.length > 0 && this._tokens[this._tokens.length - 1].startIndex === lineLength - 1) {\n this._tokens.pop();\n }\n if (this._tokens.length === 0) {\n this._lastTokenEndIndex = -1;\n this.produce(stack, lineLength);\n this._tokens[this._tokens.length - 1].startIndex = 0;\n }\n return this._tokens;\n }\n getBinaryResult(stack, lineLength) {\n if (this._binaryTokens.length > 0 && this._binaryTokens[this._binaryTokens.length - 2] === lineLength - 1) {\n this._binaryTokens.pop();\n this._binaryTokens.pop();\n }\n if (this._binaryTokens.length === 0) {\n this._lastTokenEndIndex = -1;\n this.produce(stack, lineLength);\n this._binaryTokens[this._binaryTokens.length - 2] = 0;\n }\n const result = new Uint32Array(this._binaryTokens.length);\n for (let i = 0, len = this._binaryTokens.length; i < len; i++) {\n result[i] = this._binaryTokens[i];\n }\n return result;\n }\n};\n\n// src/registry.ts\nvar SyncRegistry = class {\n constructor(theme, _onigLib) {\n this._onigLib = _onigLib;\n this._theme = theme;\n }\n _grammars = /* @__PURE__ */ new Map();\n _rawGrammars = /* @__PURE__ */ new Map();\n _injectionGrammars = /* @__PURE__ */ new Map();\n _theme;\n dispose() {\n for (const grammar of this._grammars.values()) {\n grammar.dispose();\n }\n }\n setTheme(theme) {\n this._theme = theme;\n }\n getColorMap() {\n return this._theme.getColorMap();\n }\n /**\n * Add `grammar` to registry and return a list of referenced scope names\n */\n addGrammar(grammar, injectionScopeNames) {\n this._rawGrammars.set(grammar.scopeName, grammar);\n if (injectionScopeNames) {\n this._injectionGrammars.set(grammar.scopeName, injectionScopeNames);\n }\n }\n /**\n * Lookup a raw grammar.\n */\n lookup(scopeName) {\n return this._rawGrammars.get(scopeName);\n }\n /**\n * Returns the injections for the given grammar\n */\n injections(targetScope) {\n return this._injectionGrammars.get(targetScope);\n }\n /**\n * Get the default theme settings\n */\n getDefaults() {\n return this._theme.getDefaults();\n }\n /**\n * Match a scope in the theme.\n */\n themeMatch(scopePath) {\n return this._theme.match(scopePath);\n }\n /**\n * Lookup a grammar.\n */\n grammarForScopeName(scopeName, initialLanguage, embeddedLanguages, tokenTypes, balancedBracketSelectors) {\n if (!this._grammars.has(scopeName)) {\n let rawGrammar = this._rawGrammars.get(scopeName);\n if (!rawGrammar) {\n return null;\n }\n this._grammars.set(scopeName, createGrammar(\n scopeName,\n rawGrammar,\n initialLanguage,\n embeddedLanguages,\n tokenTypes,\n balancedBracketSelectors,\n this,\n this._onigLib\n ));\n }\n return this._grammars.get(scopeName);\n }\n};\n\n// src/index.ts\nvar Registry = class {\n _options;\n _syncRegistry;\n _ensureGrammarCache;\n constructor(options) {\n this._options = options;\n this._syncRegistry = new SyncRegistry(\n Theme.createFromRawTheme(options.theme, options.colorMap),\n options.onigLib\n );\n this._ensureGrammarCache = /* @__PURE__ */ new Map();\n }\n dispose() {\n this._syncRegistry.dispose();\n }\n /**\n * Change the theme. Once called, no previous `ruleStack` should be used anymore.\n */\n setTheme(theme, colorMap) {\n this._syncRegistry.setTheme(Theme.createFromRawTheme(theme, colorMap));\n }\n /**\n * Returns a lookup array for color ids.\n */\n getColorMap() {\n return this._syncRegistry.getColorMap();\n }\n /**\n * Load the grammar for `scopeName` and all referenced included grammars asynchronously.\n * Please do not use language id 0.\n */\n loadGrammarWithEmbeddedLanguages(initialScopeName, initialLanguage, embeddedLanguages) {\n return this.loadGrammarWithConfiguration(initialScopeName, initialLanguage, { embeddedLanguages });\n }\n /**\n * Load the grammar for `scopeName` and all referenced included grammars asynchronously.\n * Please do not use language id 0.\n */\n loadGrammarWithConfiguration(initialScopeName, initialLanguage, configuration) {\n return this._loadGrammar(\n initialScopeName,\n initialLanguage,\n configuration.embeddedLanguages,\n configuration.tokenTypes,\n new BalancedBracketSelectors(\n configuration.balancedBracketSelectors || [],\n configuration.unbalancedBracketSelectors || []\n )\n );\n }\n /**\n * Load the grammar for `scopeName` and all referenced included grammars asynchronously.\n */\n loadGrammar(initialScopeName) {\n return this._loadGrammar(initialScopeName, 0, null, null, null);\n }\n _loadGrammar(initialScopeName, initialLanguage, embeddedLanguages, tokenTypes, balancedBracketSelectors) {\n const dependencyProcessor = new ScopeDependencyProcessor(this._syncRegistry, initialScopeName);\n while (dependencyProcessor.Q.length > 0) {\n dependencyProcessor.Q.map((request) => this._loadSingleGrammar(request.scopeName));\n dependencyProcessor.processQueue();\n }\n return this._grammarForScopeName(\n initialScopeName,\n initialLanguage,\n embeddedLanguages,\n tokenTypes,\n balancedBracketSelectors\n );\n }\n _loadSingleGrammar(scopeName) {\n if (!this._ensureGrammarCache.has(scopeName)) {\n this._doLoadSingleGrammar(scopeName);\n this._ensureGrammarCache.set(scopeName, true);\n }\n }\n _doLoadSingleGrammar(scopeName) {\n const grammar = this._options.loadGrammar(scopeName);\n if (grammar) {\n const injections = typeof this._options.getInjections === \"function\" ? this._options.getInjections(scopeName) : void 0;\n this._syncRegistry.addGrammar(grammar, injections);\n }\n }\n /**\n * Adds a rawGrammar.\n */\n addGrammar(rawGrammar, injections = [], initialLanguage = 0, embeddedLanguages = null) {\n this._syncRegistry.addGrammar(rawGrammar, injections);\n return this._grammarForScopeName(rawGrammar.scopeName, initialLanguage, embeddedLanguages);\n }\n /**\n * Get the grammar for `scopeName`. The grammar must first be created via `loadGrammar` or `addGrammar`.\n */\n _grammarForScopeName(scopeName, initialLanguage = 0, embeddedLanguages = null, tokenTypes = null, balancedBracketSelectors = null) {\n return this._syncRegistry.grammarForScopeName(\n scopeName,\n initialLanguage,\n embeddedLanguages,\n tokenTypes,\n balancedBracketSelectors\n );\n }\n};\nvar INITIAL = StateStackImpl.NULL;\nexport {\n EncodedTokenMetadata,\n FindOption,\n FontStyle,\n INITIAL,\n Registry,\n Theme,\n disposeOnigString\n};\n","import { ShikiError as ShikiError$1 } from '@shikijs/types';\nexport * from '@shikijs/types';\nimport { FontStyle, INITIAL, EncodedTokenMetadata, Registry as Registry$1, Theme } from '@shikijs/vscode-textmate';\nimport { toHtml } from 'hast-util-to-html';\n\nfunction resolveColorReplacements(theme, options) {\n const replacements = typeof theme === \"string\" ? {} : { ...theme.colorReplacements };\n const themeName = typeof theme === \"string\" ? theme : theme.name;\n for (const [key, value] of Object.entries(options?.colorReplacements || {})) {\n if (typeof value === \"string\")\n replacements[key] = value;\n else if (key === themeName)\n Object.assign(replacements, value);\n }\n return replacements;\n}\nfunction applyColorReplacements(color, replacements) {\n if (!color)\n return color;\n return replacements?.[color?.toLowerCase()] || color;\n}\n\nfunction toArray(x) {\n return Array.isArray(x) ? x : [x];\n}\nasync function normalizeGetter(p) {\n return Promise.resolve(typeof p === \"function\" ? p() : p).then((r) => r.default || r);\n}\nfunction isPlainLang(lang) {\n return !lang || [\"plaintext\", \"txt\", \"text\", \"plain\"].includes(lang);\n}\nfunction isSpecialLang(lang) {\n return lang === \"ansi\" || isPlainLang(lang);\n}\nfunction isNoneTheme(theme) {\n return theme === \"none\";\n}\nfunction isSpecialTheme(theme) {\n return isNoneTheme(theme);\n}\n\nfunction addClassToHast(node, className) {\n if (!className)\n return node;\n node.properties ||= {};\n node.properties.class ||= [];\n if (typeof node.properties.class === \"string\")\n node.properties.class = node.properties.class.split(/\\s+/g);\n if (!Array.isArray(node.properties.class))\n node.properties.class = [];\n const targets = Array.isArray(className) ? className : className.split(/\\s+/g);\n for (const c of targets) {\n if (c && !node.properties.class.includes(c))\n node.properties.class.push(c);\n }\n return node;\n}\n\nfunction splitLines(code, preserveEnding = false) {\n if (code.length === 0) {\n return [[\"\", 0]];\n }\n const parts = code.split(/(\\r?\\n)/g);\n let index = 0;\n const lines = [];\n for (let i = 0; i < parts.length; i += 2) {\n const line = preserveEnding ? parts[i] + (parts[i + 1] || \"\") : parts[i];\n lines.push([line, index]);\n index += parts[i].length;\n index += parts[i + 1]?.length || 0;\n }\n return lines;\n}\nfunction createPositionConverter(code) {\n const lines = splitLines(code, true).map(([line]) => line);\n function indexToPos(index) {\n if (index === code.length) {\n return {\n line: lines.length - 1,\n character: lines[lines.length - 1].length\n };\n }\n let character = index;\n let line = 0;\n for (const lineText of lines) {\n if (character < lineText.length)\n break;\n character -= lineText.length;\n line++;\n }\n return { line, character };\n }\n function posToIndex(line, character) {\n let index = 0;\n for (let i = 0; i < line; i++)\n index += lines[i].length;\n index += character;\n return index;\n }\n return {\n lines,\n indexToPos,\n posToIndex\n };\n}\nfunction guessEmbeddedLanguages(code, _lang, highlighter) {\n const langs = /* @__PURE__ */ new Set();\n for (const match of code.matchAll(/:?lang=[\"']([^\"']+)[\"']/g)) {\n const lang = match[1].toLowerCase().trim();\n if (lang)\n langs.add(lang);\n }\n for (const match of code.matchAll(/(?:```|~~~)([\\w-]+)/g)) {\n const lang = match[1].toLowerCase().trim();\n if (lang)\n langs.add(lang);\n }\n for (const match of code.matchAll(/\\\\begin\\{([\\w-]+)\\}/g)) {\n const lang = match[1].toLowerCase().trim();\n if (lang)\n langs.add(lang);\n }\n for (const match of code.matchAll(/<script\\s+(?:type|lang)=[\"']([^\"']+)[\"']/gi)) {\n const fullType = match[1].toLowerCase().trim();\n const lang = fullType.includes(\"/\") ? fullType.split(\"/\").pop() : fullType;\n if (lang)\n langs.add(lang);\n }\n if (!highlighter)\n return Array.from(langs);\n const bundle = highlighter.getBundledLanguages();\n return Array.from(langs).filter((l) => l && bundle[l]);\n}\n\nconst DEFAULT_COLOR_LIGHT_DARK = \"light-dark()\";\nconst COLOR_KEYS = [\"color\", \"background-color\"];\n\nfunction splitToken(token, offsets) {\n let lastOffset = 0;\n const tokens = [];\n for (const offset of offsets) {\n if (offset > lastOffset) {\n tokens.push({\n ...token,\n content: token.content.slice(lastOffset, offset),\n offset: token.offset + lastOffset\n });\n }\n lastOffset = offset;\n }\n if (lastOffset < token.content.length) {\n tokens.push({\n ...token,\n content: token.content.slice(lastOffset),\n offset: token.offset + lastOffset\n });\n }\n return tokens;\n}\nfunction splitTokens(tokens, breakpoints) {\n const sorted = Array.from(breakpoints instanceof Set ? breakpoints : new Set(breakpoints)).sort((a, b) => a - b);\n if (!sorted.length)\n return tokens;\n return tokens.map((line) => {\n return line.flatMap((token) => {\n const breakpointsInToken = sorted.filter((i) => token.offset < i && i < token.offset + token.content.length).map((i) => i - token.offset).sort((a, b) => a - b);\n if (!breakpointsInToken.length)\n return token;\n return splitToken(token, breakpointsInToken);\n });\n });\n}\nfunction flatTokenVariants(merged, variantsOrder, cssVariablePrefix, defaultColor, colorsRendering = \"css-vars\") {\n const token = {\n content: merged.content,\n explanation: merged.explanation,\n offset: merged.offset\n };\n const styles = variantsOrder.map((t) => getTokenStyleObject(merged.variants[t]));\n const styleKeys = new Set(styles.flatMap((t) => Object.keys(t)));\n const mergedStyles = {};\n const varKey = (idx, key) => {\n const keyName = key === \"color\" ? \"\" : key === \"background-color\" ? \"-bg\" : `-${key}`;\n return cssVariablePrefix + variantsOrder[idx] + (key === \"color\" ? \"\" : keyName);\n };\n styles.forEach((cur, idx) => {\n for (const key of styleKeys) {\n const value = cur[key] || \"inherit\";\n if (idx === 0 && defaultColor && COLOR_KEYS.includes(key)) {\n if (defaultColor === DEFAULT_COLOR_LIGHT_DARK && styles.length > 1) {\n const lightIndex = variantsOrder.findIndex((t) => t === \"light\");\n const darkIndex = variantsOrder.findIndex((t) => t === \"dark\");\n if (lightIndex === -1 || darkIndex === -1)\n throw new ShikiError$1('When using `defaultColor: \"light-dark()\"`, you must provide both `light` and `dark` themes');\n const lightValue = styles[lightIndex][key] || \"inherit\";\n const darkValue = styles[darkIndex][key] || \"inherit\";\n mergedStyles[key] = `light-dark(${lightValue}, ${darkValue})`;\n if (colorsRendering === \"css-vars\")\n mergedStyles[varKey(idx, key)] = value;\n } else {\n mergedStyles[key] = value;\n }\n } else {\n if (colorsRendering === \"css-vars\")\n mergedStyles[varKey(idx, key)] = value;\n }\n }\n });\n token.htmlStyle = mergedStyles;\n return token;\n}\nfunction getTokenStyleObject(token) {\n const styles = {};\n if (token.color)\n styles.color = token.color;\n if (token.bgColor)\n styles[\"background-color\"] = token.bgColor;\n if (token.fontStyle) {\n if (token.fontStyle & FontStyle.Italic)\n styles[\"font-style\"] = \"italic\";\n if (token.fontStyle & FontStyle.Bold)\n styles[\"font-weight\"] = \"bold\";\n const decorations = [];\n if (token.fontStyle & FontStyle.Underline)\n decorations.push(\"underline\");\n if (token.fontStyle & FontStyle.Strikethrough)\n decorations.push(\"line-through\");\n if (decorations.length)\n styles[\"text-decoration\"] = decorations.join(\" \");\n }\n return styles;\n}\nfunction stringifyTokenStyle(token) {\n if (typeof token === \"string\")\n return token;\n return Object.entries(token).map(([key, value]) => `${key}:${value}`).join(\";\");\n}\n\nconst _grammarStateMap = /* @__PURE__ */ new WeakMap();\nfunction setLastGrammarStateToMap(keys, state) {\n _grammarStateMap.set(keys, state);\n}\nfunction getLastGrammarStateFromMap(keys) {\n return _grammarStateMap.get(keys);\n}\nclass GrammarState {\n /**\n * Theme to Stack mapping\n */\n _stacks = {};\n lang;\n get themes() {\n return Object.keys(this._stacks);\n }\n get theme() {\n return this.themes[0];\n }\n get _stack() {\n return this._stacks[this.theme];\n }\n /**\n * Static method to create a initial grammar state.\n */\n static initial(lang, themes) {\n return new GrammarState(\n Object.fromEntries(toArray(themes).map((theme) => [theme, INITIAL])),\n lang\n );\n }\n constructor(...args) {\n if (args.length === 2) {\n const [stacksMap, lang] = args;\n this.lang = lang;\n this._stacks = stacksMap;\n } else {\n const [stack, lang, theme] = args;\n this.lang = lang;\n this._stacks = { [theme]: stack };\n }\n }\n /**\n * Get the internal stack object.\n * @internal\n */\n getInternalStack(theme = this.theme) {\n return this._stacks[theme];\n }\n getScopes(theme = this.theme) {\n return getScopes(this._stacks[theme]);\n }\n toJSON() {\n return {\n lang: this.lang,\n theme: this.theme,\n themes: this.themes,\n scopes: this.getScopes()\n };\n }\n}\nfunction getScopes(stack) {\n const scopes = [];\n const visited = /* @__PURE__ */ new Set();\n function pushScope(stack2) {\n if (visited.has(stack2))\n return;\n visited.add(stack2);\n const name = stack2?.nameScopesList?.scopeName;\n if (name)\n scopes.push(name);\n if (stack2.parent)\n pushScope(stack2.parent);\n }\n pushScope(stack);\n return scopes;\n}\nfunction getGrammarStack(state, theme) {\n if (!(state instanceof GrammarState))\n throw new ShikiError$1(\"Invalid grammar state\");\n return state.getInternalStack(theme);\n}\n\nfunction transformerDecorations() {\n const map = /* @__PURE__ */ new WeakMap();\n function getContext(shiki) {\n if (!map.has(shiki.meta)) {\n let normalizePosition = function(p) {\n if (typeof p === \"number\") {\n if (p < 0 || p > shiki.source.length)\n throw new ShikiError$1(`Invalid decoration offset: ${p}. Code length: ${shiki.source.length}`);\n return {\n ...converter.indexToPos(p),\n offset: p\n };\n } else {\n const line = converter.lines[p.line];\n if (line === void 0)\n throw new ShikiError$1(`Invalid decoration position ${JSON.stringify(p)}. Lines length: ${converter.lines.length}`);\n let character = p.character;\n if (character < 0)\n character = line.length + character;\n if (character < 0 || character > line.length)\n throw new ShikiError$1(`Invalid decoration position ${JSON.stringify(p)}. Line ${p.line} length: ${line.length}`);\n return {\n ...p,\n character,\n offset: converter.posToIndex(p.line, character)\n };\n }\n };\n const converter = createPositionConverter(shiki.source);\n const decorations = (shiki.options.decorations || []).map((d) => ({\n ...d,\n start: normalizePosition(d.start),\n end: normalizePosition(d.end)\n }));\n verifyIntersections(decorations);\n map.set(shiki.meta, {\n decorations,\n converter,\n source: shiki.source\n });\n }\n return map.get(shiki.meta);\n }\n return {\n name: \"shiki:decorations\",\n tokens(tokens) {\n if (!this.options.decorations?.length)\n return;\n const ctx = getContext(this);\n const breakpoints = ctx.decorations.flatMap((d) => [d.start.offset, d.end.offset]);\n const splitted = splitTokens(tokens, breakpoints);\n return splitted;\n },\n code(codeEl) {\n if (!this.options.decorations?.length)\n return;\n const ctx = getContext(this);\n const lines = Array.from(codeEl.children).filter((i) => i.type === \"element\" && i.tagName === \"span\");\n if (lines.length !== ctx.converter.lines.length)\n throw new ShikiError$1(`Number of lines in code element (${lines.length}) does not match the number of lines in the source (${ctx.converter.lines.length}). Failed to apply decorations.`);\n function applyLineSection(line, start, end, decoration) {\n const lineEl = lines[line];\n let text = \"\";\n let startIndex = -1;\n let endIndex = -1;\n if (start === 0)\n startIndex = 0;\n if (end === 0)\n endIndex = 0;\n if (end === Number.POSITIVE_INFINITY)\n endIndex = lineEl.children.length;\n if (startIndex === -1 || endIndex === -1) {\n for (let i = 0; i < lineEl.children.length; i++) {\n text += stringify(lineEl.children[i]);\n if (startIndex === -1 && text.length === start)\n startIndex = i + 1;\n if (endIndex === -1 && text.length === end)\n endIndex = i + 1;\n }\n }\n if (startIndex === -1)\n throw new ShikiError$1(`Failed to find start index for decoration ${JSON.stringify(decoration.start)}`);\n if (endIndex === -1)\n throw new ShikiError$1(`Failed to find end index for decoration ${JSON.stringify(decoration.end)}`);\n const children = lineEl.children.slice(startIndex, endIndex);\n if (!decoration.alwaysWrap && children.length === lineEl.children.length) {\n applyDecoration(lineEl, decoration, \"line\");\n } else if (!decoration.alwaysWrap && children.length === 1 && children[0].type === \"element\") {\n applyDecoration(children[0], decoration, \"token\");\n } else {\n const wrapper = {\n type: \"element\",\n tagName: \"span\",\n properties: {},\n children\n };\n applyDecoration(wrapper, decoration, \"wrapper\");\n lineEl.children.splice(startIndex, children.length, wrapper);\n }\n }\n function applyLine(line, decoration) {\n lines[line] = applyDecoration(lines[line], decoration, \"line\");\n }\n function applyDecoration(el, decoration, type) {\n const properties = decoration.properties || {};\n const transform = decoration.transform || ((i) => i);\n el.tagName = decoration.tagName || \"span\";\n el.properties = {\n ...el.properties,\n ...properties,\n class: el.properties.class\n };\n if (decoration.properties?.class)\n addClassToHast(el, decoration.properties.class);\n el = transform(el, type) || el;\n return el;\n }\n const lineApplies = [];\n const sorted = ctx.decorations.sort((a, b) => b.start.offset - a.start.offset || a.end.offset - b.end.offset);\n for (const decoration of sorted) {\n const { start, end } = decoration;\n if (start.line === end.line) {\n applyLineSection(start.line, start.character, end.character, decoration);\n } else if (start.line < end.line) {\n applyLineSection(start.line, start.character, Number.POSITIVE_INFINITY, decoration);\n for (let i = start.line + 1; i < end.line; i++)\n lineApplies.unshift(() => applyLine(i, decoration));\n applyLineSection(end.line, 0, end.character, decoration);\n }\n }\n lineApplies.forEach((i) => i());\n }\n };\n}\nfunction verifyIntersections(items) {\n for (let i = 0; i < items.length; i++) {\n const foo = items[i];\n if (foo.start.offset > foo.end.offset)\n throw new ShikiError$1(`Invalid decoration range: ${JSON.stringify(foo.start)} - ${JSON.stringify(foo.end)}`);\n for (let j = i + 1; j < items.length; j++) {\n const bar = items[j];\n const isFooHasBarStart = foo.start.offset <= bar.start.offset && bar.start.offset < foo.end.offset;\n const isFooHasBarEnd = foo.start.offset < bar.end.offset && bar.end.offset <= foo.end.offset;\n const isBarHasFooStart = bar.start.offset <= foo.start.offset && foo.start.offset < bar.end.offset;\n const isBarHasFooEnd = bar.start.offset < foo.end.offset && foo.end.offset <= bar.end.offset;\n if (isFooHasBarStart || isFooHasBarEnd || isBarHasFooStart || isBarHasFooEnd) {\n if (isFooHasBarStart && isFooHasBarEnd)\n continue;\n if (isBarHasFooStart && isBarHasFooEnd)\n continue;\n if (isBarHasFooStart && foo.start.offset === foo.end.offset)\n continue;\n if (isFooHasBarEnd && bar.start.offset === bar.end.offset)\n continue;\n throw new ShikiError$1(`Decorations ${JSON.stringify(foo.start)} and ${JSON.stringify(bar.start)} intersect.`);\n }\n }\n }\n}\nfunction stringify(el) {\n if (el.type === \"text\")\n return el.value;\n if (el.type === \"element\")\n return el.children.map(stringify).join(\"\");\n return \"\";\n}\n\nconst builtInTransformers = [\n /* @__PURE__ */ transformerDecorations()\n];\nfunction getTransformers(options) {\n const transformers = sortTransformersByEnforcement(options.transformers || []);\n return [\n ...transformers.pre,\n ...transformers.normal,\n ...transformers.post,\n ...builtInTransformers\n ];\n}\nfunction sortTransformersByEnforcement(transformers) {\n const pre = [];\n const post = [];\n const normal = [];\n for (const transformer of transformers) {\n switch (transformer.enforce) {\n case \"pre\":\n pre.push(transformer);\n break;\n case \"post\":\n post.push(transformer);\n break;\n default:\n normal.push(transformer);\n }\n }\n return { pre, post, normal };\n}\n\n// src/colors.ts\nvar namedColors = [\n \"black\",\n \"red\",\n \"green\",\n \"yellow\",\n \"blue\",\n \"magenta\",\n \"cyan\",\n \"white\",\n \"brightBlack\",\n \"brightRed\",\n \"brightGreen\",\n \"brightYellow\",\n \"brightBlue\",\n \"brightMagenta\",\n \"brightCyan\",\n \"brightWhite\"\n];\n\n// src/decorations.ts\nvar decorations = {\n 1: \"bold\",\n 2: \"dim\",\n 3: \"italic\",\n 4: \"underline\",\n 7: \"reverse\",\n 8: \"hidden\",\n 9: \"strikethrough\"\n};\n\n// src/parser.ts\nfunction findSequence(value, position) {\n const nextEscape = value.indexOf(\"\\x1B\", position);\n if (nextEscape !== -1) {\n if (value[nextEscape + 1] === \"[\") {\n const nextClose = value.indexOf(\"m\", nextEscape);\n if (nextClose !== -1) {\n return {\n sequence: value.substring(nextEscape + 2, nextClose).split(\";\"),\n startPosition: nextEscape,\n position: nextClose + 1\n };\n }\n }\n }\n return {\n position: value.length\n };\n}\nfunction parseColor(sequence) {\n const colorMode = sequence.shift();\n if (colorMode === \"2\") {\n const rgb = sequence.splice(0, 3).map((x) => Number.parseInt(x));\n if (rgb.length !== 3 || rgb.some((x) => Number.isNaN(x)))\n return;\n return {\n type: \"rgb\",\n rgb\n };\n } else if (colorMode === \"5\") {\n const index = sequence.shift();\n if (index) {\n return { type: \"table\", index: Number(index) };\n }\n }\n}\nfunction parseSequence(sequence) {\n const commands = [];\n while (sequence.length > 0) {\n const code = sequence.shift();\n if (!code)\n continue;\n const codeInt = Number.parseInt(code);\n if (Number.isNaN(codeInt))\n continue;\n if (codeInt === 0) {\n commands.push({ type: \"resetAll\" });\n } else if (codeInt <= 9) {\n const decoration = decorations[codeInt];\n if (decoration) {\n commands.push({\n type: \"setDecoration\",\n value: decorations[codeInt]\n });\n }\n } else if (codeInt <= 29) {\n const decoration = decorations[codeInt - 20];\n if (decoration) {\n commands.push({\n type: \"resetDecoration\",\n value: decoration\n });\n if (decoration === \"dim\") {\n commands.push({\n type: \"resetDecoration\",\n value: \"bold\"\n });\n }\n }\n } else if (codeInt <= 37) {\n commands.push({\n type: \"setForegroundColor\",\n value: { type: \"named\", name: namedColors[codeInt - 30] }\n });\n } else if (codeInt === 38) {\n const color = parseColor(sequence);\n if (color) {\n commands.push({\n type: \"setForegroundColor\",\n value: color\n });\n }\n } else if (codeInt === 39) {\n commands.push({\n type: \"resetForegroundColor\"\n });\n } else if (codeInt <= 47) {\n commands.push({\n type: \"setBackgroundColor\",\n value: { type: \"named\", name: namedColors[codeInt - 40] }\n });\n } else if (codeInt === 48) {\n const color = parseColor(sequence);\n if (color) {\n commands.push({\n type: \"setBackgroundColor\",\n value: color\n });\n }\n } else if (codeInt === 49) {\n commands.push({\n type: \"resetBackgroundColor\"\n });\n } else if (codeInt === 53) {\n commands.push({\n type: \"setDecoration\",\n value: \"overline\"\n });\n } else if (codeInt === 55) {\n commands.push({\n type: \"resetDecoration\",\n value: \"overline\"\n });\n } else if (codeInt >= 90 && codeInt <= 97) {\n commands.push({\n type: \"setForegroundColor\",\n value: { type: \"named\", name: namedColors[codeInt - 90 + 8] }\n });\n } else if (codeInt >= 100 && codeInt <= 107) {\n commands.push({\n type: \"setBackgroundColor\",\n value: { type: \"named\", name: namedColors[codeInt - 100 + 8] }\n });\n }\n }\n return commands;\n}\nfunction createAnsiSequenceParser() {\n let foreground = null;\n let background = null;\n let decorations2 = /* @__PURE__ */ new Set();\n return {\n parse(value) {\n const tokens = [];\n let position = 0;\n do {\n const findResult = findSequence(value, position);\n const text = findResult.sequence ? value.substring(position, findResult.startPosition) : value.substring(position);\n if (text.length > 0) {\n tokens.push({\n value: text,\n foreground,\n background,\n decorations: new Set(decorations2)\n });\n }\n if (findResult.sequence) {\n const commands = parseSequence(findResult.sequence);\n for (const styleToken of commands) {\n if (styleToken.type === \"resetAll\") {\n foreground = null;\n background = null;\n decorations2.clear();\n } else if (styleToken.type === \"resetForegroundColor\") {\n foreground = null;\n } else if (styleToken.type === \"resetBackgroundColor\") {\n background = null;\n } else if (styleToken.type === \"resetDecoration\") {\n decorations2.delete(styleToken.value);\n }\n }\n for (const styleToken of commands) {\n if (styleToken.type === \"setForegroundColor\") {\n foreground = styleToken.value;\n } else if (styleToken.type === \"setBackgroundColor\") {\n background = styleToken.value;\n } else if (styleToken.type === \"setDecoration\") {\n decorations2.add(styleToken.value);\n }\n }\n }\n position = findResult.position;\n } while (position < value.length);\n return tokens;\n }\n };\n}\n\n// src/palette.ts\nvar defaultNamedColorsMap = {\n black: \"#000000\",\n red: \"#bb0000\",\n green: \"#00bb00\",\n yellow: \"#bbbb00\",\n blue: \"#0000bb\",\n magenta: \"#ff00ff\",\n cyan: \"#00bbbb\",\n white: \"#eeeeee\",\n brightBlack: \"#555555\",\n brightRed: \"#ff5555\",\n brightGreen: \"#00ff00\",\n brightYellow: \"#ffff55\",\n brightBlue: \"#5555ff\",\n brightMagenta: \"#ff55ff\",\n brightCyan: \"#55ffff\",\n brightWhite: \"#ffffff\"\n};\nfunction createColorPalette(namedColorsMap = defaultNamedColorsMap) {\n function namedColor(name) {\n return namedColorsMap[name];\n }\n function rgbColor(rgb) {\n return `#${rgb.map((x) => Math.max(0, Math.min(x, 255)).toString(16).padStart(2, \"0\")).join(\"\")}`;\n }\n let colorTable;\n function getColorTable() {\n if (colorTable) {\n return colorTable;\n }\n colorTable = [];\n for (let i = 0; i < namedColors.length; i++) {\n colorTable.push(namedColor(namedColors[i]));\n }\n let levels = [0, 95, 135, 175, 215, 255];\n for (let r = 0; r < 6; r++) {\n for (let g = 0; g < 6; g++) {\n for (let b = 0; b < 6; b++) {\n colorTable.push(rgbColor([levels[r], levels[g], levels[b]]));\n }\n }\n }\n let level = 8;\n for (let i = 0; i < 24; i++, level += 10) {\n colorTable.push(rgbColor([level, level, level]));\n }\n return colorTable;\n }\n function tableColor(index) {\n return getColorTable()[index];\n }\n function value(color) {\n switch (color.type) {\n case \"named\":\n return namedColor(color.name);\n case \"rgb\":\n return rgbColor(color.rgb);\n case \"table\":\n return tableColor(color.index);\n }\n }\n return {\n value\n };\n}\n\nconst defaultAnsiColors = {\n black: \"#000000\",\n red: \"#cd3131\",\n green: \"#0DBC79\",\n yellow: \"#E5E510\",\n blue: \"#2472C8\",\n magenta: \"#BC3FBC\",\n cyan: \"#11A8CD\",\n white: \"#E5E5E5\",\n brightBlack: \"#666666\",\n brightRed: \"#F14C4C\",\n brightGreen: \"#23D18B\",\n brightYellow: \"#F5F543\",\n brightBlue: \"#3B8EEA\",\n brightMagenta: \"#D670D6\",\n brightCyan: \"#29B8DB\",\n brightWhite: \"#FFFFFF\"\n};\nfunction tokenizeAnsiWithTheme(theme, fileContents, options) {\n const colorReplacements = resolveColorReplacements(theme, options);\n const lines = splitLines(fileContents);\n const ansiPalette = Object.fromEntries(\n namedColors.map((name) => {\n const key = `terminal.ansi${name[0].toUpperCase()}${name.substring(1)}`;\n const themeColor = theme.colors?.[key];\n return [name, themeColor || defaultAnsiColors[name]];\n })\n );\n const colorPalette = createColorPalette(ansiPalette);\n const parser = createAnsiSequenceParser();\n return lines.map(\n (line) => parser.parse(line[0]).map((token) => {\n let color;\n let bgColor;\n if (token.decorations.has(\"reverse\")) {\n color = token.background ? colorPalette.value(token.background) : theme.bg;\n bgColor = token.foreground ? colorPalette.value(token.foreground) : theme.fg;\n } else {\n color = token.foreground ? colorPalette.value(token.foreground) : theme.fg;\n bgColor = token.background ? colorPalette.value(token.background) : void 0;\n }\n color = applyColorReplacements(color, colorReplacements);\n bgColor = applyColorReplacements(bgColor, colorReplacements);\n if (token.decorations.has(\"dim\"))\n color = dimColor(color);\n let fontStyle = FontStyle.None;\n if (token.decorations.has(\"bold\"))\n fontStyle |= FontStyle.Bold;\n if (token.decorations.has(\"italic\"))\n fontStyle |= FontStyle.Italic;\n if (token.decorations.has(\"underline\"))\n fontStyle |= FontStyle.Underline;\n if (token.decorations.has(\"strikethrough\"))\n fontStyle |= FontStyle.Strikethrough;\n return {\n content: token.value,\n offset: line[1],\n // TODO: more accurate offset? might need to fork ansi-sequence-parser\n color,\n bgColor,\n fontStyle\n };\n })\n );\n}\nfunction dimColor(color) {\n const hexMatch = color.match(/#([0-9a-f]{3,8})/i);\n if (hexMatch) {\n const hex = hexMatch[1];\n if (hex.length === 8) {\n const alpha = Math.round(Number.parseInt(hex.slice(6, 8), 16) / 2).toString(16).padStart(2, \"0\");\n return `#${hex.slice(0, 6)}${alpha}`;\n } else if (hex.length === 6) {\n return `#${hex}80`;\n } else if (hex.length === 4) {\n const r = hex[0];\n const g = hex[1];\n const b = hex[2];\n const a = hex[3];\n const alpha = Math.round(Number.parseInt(`${a}${a}`, 16) / 2).toString(16).padStart(2, \"0\");\n return `#${r}${r}${g}${g}${b}${b}${alpha}`;\n } else if (hex.length === 3) {\n const r = hex[0];\n const g = hex[1];\n const b = hex[2];\n return `#${r}${r}${g}${g}${b}${b}80`;\n }\n }\n const cssVarMatch = color.match(/var\\((--[\\w-]+-ansi-[\\w-]+)\\)/);\n if (cssVarMatch)\n return `var(${cssVarMatch[1]}-dim)`;\n return color;\n}\n\nfunction codeToTokensBase(internal, code, options = {}) {\n const {\n theme: themeName = internal.getLoadedThemes()[0]\n } = options;\n const lang = internal.resolveLangAlias(options.lang || \"text\");\n if (isPlainLang(lang) || isNoneTheme(themeName))\n return splitLines(code).map((line) => [{ content: line[0], offset: line[1] }]);\n const { theme, colorMap } = internal.setTheme(themeName);\n if (lang === \"ansi\")\n return tokenizeAnsiWithTheme(theme, code, options);\n const _grammar = internal.getLanguage(options.lang || \"text\");\n if (options.grammarState) {\n if (options.grammarState.lang !== _grammar.name) {\n throw new ShikiError$1(`Grammar state language \"${options.grammarState.lang}\" does not match highlight language \"${_grammar.name}\"`);\n }\n if (!options.grammarState.themes.includes(theme.name)) {\n throw new ShikiError$1(`Grammar state themes \"${options.grammarState.themes}\" do not contain highlight theme \"${theme.name}\"`);\n }\n }\n return tokenizeWithTheme(code, _grammar, theme, colorMap, options);\n}\nfunction getLastGrammarState(...args) {\n if (args.length === 2) {\n return getLastGrammarStateFromMap(args[1]);\n }\n const [internal, code, options = {}] = args;\n const {\n lang = \"text\",\n theme: themeName = internal.getLoadedThemes()[0]\n } = options;\n if (isPlainLang(lang) || isNoneTheme(themeName))\n throw new ShikiError$1(\"Plain language does not have grammar state\");\n if (lang === \"ansi\")\n throw new ShikiError$1(\"ANSI language does not have grammar state\");\n const { theme, colorMap } = internal.setTheme(themeName);\n const _grammar = internal.getLanguage(lang);\n return new GrammarState(\n _tokenizeWithTheme(code, _grammar, theme, colorMap, options).stateStack,\n _grammar.name,\n theme.name\n );\n}\nfunction tokenizeWithTheme(code, grammar, theme, colorMap, options) {\n const result = _tokenizeWithTheme(code, grammar, theme, colorMap, options);\n const grammarState = new GrammarState(\n result.stateStack,\n grammar.name,\n theme.name\n );\n setLastGrammarStateToMap(result.tokens, grammarState);\n return result.tokens;\n}\nfunction _tokenizeWithTheme(code, grammar, theme, colorMap, options) {\n const colorReplacements = resolveColorReplacements(theme, options);\n const {\n tokenizeMaxLineLength = 0,\n tokenizeTimeLimit = 500\n } = options;\n const lines = splitLines(code);\n let stateStack = options.grammarState ? getGrammarStack(options.grammarState, theme.name) ?? INITIAL : options.grammarContextCode != null ? _tokenizeWithTheme(\n options.grammarContextCode,\n grammar,\n theme,\n colorMap,\n {\n ...options,\n grammarState: void 0,\n grammarContextCode: void 0\n }\n ).stateStack : INITIAL;\n let actual = [];\n const final = [];\n for (let i = 0, len = lines.length; i < len; i++) {\n const [line, lineOffset] = lines[i];\n if (line === \"\") {\n actual = [];\n final.push([]);\n continue;\n }\n if (tokenizeMaxLineLength > 0 && line.length >= tokenizeMaxLineLength) {\n actual = [];\n final.push([{\n content: line,\n offset: lineOffset,\n color: \"\",\n fontStyle: 0\n }]);\n continue;\n }\n let resultWithScopes;\n let tokensWithScopes;\n let tokensWithScopesIndex;\n if (options.includeExplanation) {\n resultWithScopes = grammar.tokenizeLine(line, stateStack, tokenizeTimeLimit);\n tokensWithScopes = resultWithScopes.tokens;\n tokensWithScopesIndex = 0;\n }\n const result = grammar.tokenizeLine2(line, stateStack, tokenizeTimeLimit);\n const tokensLength = result.tokens.length / 2;\n for (let j = 0; j < tokensLength; j++) {\n const startIndex = result.tokens[2 * j];\n const nextStartIndex = j + 1 < tokensLength ? result.tokens[2 * j + 2] : line.length;\n if (startIndex === nextStartIndex)\n continue;\n const metadata = result.tokens[2 * j + 1];\n const color = applyColorReplacements(\n colorMap[EncodedTokenMetadata.getForeground(metadata)],\n colorReplacements\n );\n const fontStyle = EncodedTokenMetadata.getFontStyle(metadata);\n const token = {\n content: line.substring(startIndex, nextStartIndex),\n offset: lineOffset + startIndex,\n color,\n fontStyle\n };\n if (options.includeExplanation) {\n const themeSettingsSelectors = [];\n if (options.includeExplanation !== \"scopeName\") {\n for (const setting of theme.settings) {\n let selectors;\n switch (typeof setting.scope) {\n case \"string\":\n selectors = setting.scope.split(/,/).map((scope) => scope.trim());\n break;\n case \"object\":\n selectors = setting.scope;\n break;\n default:\n continue;\n }\n themeSettingsSelectors.push({\n settings: setting,\n selectors: selectors.map((selector) => selector.split(/ /))\n });\n }\n }\n token.explanation = [];\n let offset = 0;\n while (startIndex + offset < nextStartIndex) {\n const tokenWithScopes = tokensWithScopes[tokensWithScopesIndex];\n const tokenWithScopesText = line.substring(\n tokenWithScopes.startIndex,\n tokenWithScopes.endIndex\n );\n offset += tokenWithScopesText.length;\n token.explanation.push({\n content: tokenWithScopesText,\n scopes: options.includeExplanation === \"scopeName\" ? explainThemeScopesNameOnly(\n tokenWithScopes.scopes\n ) : explainThemeScopesFull(\n themeSettingsSelectors,\n tokenWithScopes.scopes\n )\n });\n tokensWithScopesIndex += 1;\n }\n }\n actual.push(token);\n }\n final.push(actual);\n actual = [];\n stateStack = result.ruleStack;\n }\n return {\n tokens: final,\n stateStack\n };\n}\nfunction explainThemeScopesNameOnly(scopes) {\n return scopes.map((scope) => ({ scopeName: scope }));\n}\nfunction explainThemeScopesFull(themeSelectors, scopes) {\n const result = [];\n for (let i = 0, len = scopes.length; i < len; i++) {\n const scope = scopes[i];\n result[i] = {\n scopeName: scope,\n themeMatches: explainThemeScope(themeSelectors, scope, scopes.slice(0, i))\n };\n }\n return result;\n}\nfunction matchesOne(selector, scope) {\n return selector === scope || scope.substring(0, selector.length) === selector && scope[selector.length] === \".\";\n}\nfunction matches(selectors, scope, parentScopes) {\n if (!matchesOne(selectors[selectors.length - 1], scope))\n return false;\n let selectorParentIndex = selectors.length - 2;\n let parentIndex = parentScopes.length - 1;\n while (selectorParentIndex >= 0 && parentIndex >= 0) {\n if (matchesOne(selectors[selectorParentIndex], parentScopes[parentIndex]))\n selectorParentIndex -= 1;\n parentIndex -= 1;\n }\n if (selectorParentIndex === -1)\n return true;\n return false;\n}\nfunction explainThemeScope(themeSettingsSelectors, scope, parentScopes) {\n const result = [];\n for (const { selectors, settings } of themeSettingsSelectors) {\n for (const selectorPieces of selectors) {\n if (matches(selectorPieces, scope, parentScopes)) {\n result.push(settings);\n break;\n }\n }\n }\n return result;\n}\n\nfunction codeToTokensWithThemes(internal, code, options) {\n const themes = Object.entries(options.themes).filter((i) => i[1]).map((i) => ({ color: i[0], theme: i[1] }));\n const themedTokens = themes.map((t) => {\n const tokens2 = codeToTokensBase(internal, code, {\n ...options,\n theme: t.theme\n });\n const state = getLastGrammarStateFromMap(tokens2);\n const theme = typeof t.theme === \"string\" ? t.theme : t.theme.name;\n return {\n tokens: tokens2,\n state,\n theme\n };\n });\n const tokens = syncThemesTokenization(\n ...themedTokens.map((i) => i.tokens)\n );\n const mergedTokens = tokens[0].map(\n (line, lineIdx) => line.map((_token, tokenIdx) => {\n const mergedToken = {\n content: _token.content,\n variants: {},\n offset: _token.offset\n };\n if (\"includeExplanation\" in options && options.includeExplanation) {\n mergedToken.explanation = _token.explanation;\n }\n tokens.forEach((t, themeIdx) => {\n const {\n content: _,\n explanation: __,\n offset: ___,\n ...styles\n } = t[lineIdx][tokenIdx];\n mergedToken.variants[themes[themeIdx].color] = styles;\n });\n return mergedToken;\n })\n );\n const mergedGrammarState = themedTokens[0].state ? new GrammarState(\n Object.fromEntries(themedTokens.map((s) => [s.theme, s.state?.getInternalStack(s.theme)])),\n themedTokens[0].state.lang\n ) : void 0;\n if (mergedGrammarState)\n setLastGrammarStateToMap(mergedTokens, mergedGrammarState);\n return mergedTokens;\n}\nfunction syncThemesTokenization(...themes) {\n const outThemes = themes.map(() => []);\n const count = themes.length;\n for (let i = 0; i < themes[0].length; i++) {\n const lines = themes.map((t) => t[i]);\n const outLines = outThemes.map(() => []);\n outThemes.forEach((t, i2) => t.push(outLines[i2]));\n const indexes = lines.map(() => 0);\n const current = lines.map((l) => l[0]);\n while (current.every((t) => t)) {\n const minLength = Math.min(...current.map((t) => t.content.length));\n for (let n = 0; n < count; n++) {\n const token = current[n];\n if (token.content.length === minLength) {\n outLines[n].push(token);\n indexes[n] += 1;\n current[n] = lines[n][indexes[n]];\n } else {\n outLines[n].push({\n ...token,\n content: token.content.slice(0, minLength)\n });\n current[n] = {\n ...token,\n content: token.content.slice(minLength),\n offset: token.offset + minLength\n };\n }\n }\n }\n }\n return outThemes;\n}\n\nfunction codeToTokens(internal, code, options) {\n let bg;\n let fg;\n let tokens;\n let themeName;\n let rootStyle;\n let grammarState;\n if (\"themes\" in options) {\n const {\n defaultColor = \"light\",\n cssVariablePrefix = \"--shiki-\",\n colorsRendering = \"css-vars\"\n } = options;\n const themes = Object.entries(options.themes).filter((i) => i[1]).map((i) => ({ color: i[0], theme: i[1] })).sort((a, b) => a.color === defaultColor ? -1 : b.color === defaultColor ? 1 : 0);\n if (themes.length === 0)\n throw new ShikiError$1(\"`themes` option must not be empty\");\n const themeTokens = codeToTokensWithThemes(\n internal,\n code,\n options\n );\n grammarState = getLastGrammarStateFromMap(themeTokens);\n if (defaultColor && DEFAULT_COLOR_LIGHT_DARK !== defaultColor && !themes.find((t) => t.color === defaultColor))\n throw new ShikiError$1(`\\`themes\\` option must contain the defaultColor key \\`${defaultColor}\\``);\n const themeRegs = themes.map((t) => internal.getTheme(t.theme));\n const themesOrder = themes.map((t) => t.color);\n tokens = themeTokens.map((line) => line.map((token) => flatTokenVariants(token, themesOrder, cssVariablePrefix, defaultColor, colorsRendering)));\n if (grammarState)\n setLastGrammarStateToMap(tokens, grammarState);\n const themeColorReplacements = themes.map((t) => resolveColorReplacements(t.theme, options));\n fg = mapThemeColors(themes, themeRegs, themeColorReplacements, cssVariablePrefix, defaultColor, \"fg\", colorsRendering);\n bg = mapThemeColors(themes, themeRegs, themeColorReplacements, cssVariablePrefix, defaultColor, \"bg\", colorsRendering);\n themeName = `shiki-themes ${themeRegs.map((t) => t.name).join(\" \")}`;\n rootStyle = defaultColor ? void 0 : [fg, bg].join(\";\");\n } else if (\"theme\" in options) {\n const colorReplacements = resolveColorReplacements(options.theme, options);\n tokens = codeToTokensBase(\n internal,\n code,\n options\n );\n const _theme = internal.getTheme(options.theme);\n bg = applyColorReplacements(_theme.bg, colorReplacements);\n fg = applyColorReplacements(_theme.fg, colorReplacements);\n themeName = _theme.name;\n grammarState = getLastGrammarStateFromMap(tokens);\n } else {\n throw new ShikiError$1(\"Invalid options, either `theme` or `themes` must be provided\");\n }\n return {\n tokens,\n fg,\n bg,\n themeName,\n rootStyle,\n grammarState\n };\n}\nfunction mapThemeColors(themes, themeRegs, themeColorReplacements, cssVariablePrefix, defaultColor, property, colorsRendering) {\n return themes.map((t, idx) => {\n const value = applyColorReplacements(themeRegs[idx][property], themeColorReplacements[idx]) || \"inherit\";\n const cssVar = `${cssVariablePrefix + t.color}${property === \"bg\" ? \"-bg\" : \"\"}:${value}`;\n if (idx === 0 && defaultColor) {\n if (defaultColor === DEFAULT_COLOR_LIGHT_DARK && themes.length > 1) {\n const lightIndex = themes.findIndex((t2) => t2.color === \"light\");\n const darkIndex = themes.findIndex((t2) => t2.color === \"dark\");\n if (lightIndex === -1 || darkIndex === -1)\n throw new ShikiError$1('When using `defaultColor: \"light-dark()\"`, you must provide both `light` and `dark` themes');\n const lightValue = applyColorReplacements(themeRegs[lightIndex][property], themeColorReplacements[lightIndex]) || \"inherit\";\n const darkValue = applyColorReplacements(themeRegs[darkIndex][property], themeColorReplacements[darkIndex]) || \"inherit\";\n return `light-dark(${lightValue}, ${darkValue});${cssVar}`;\n }\n return value;\n }\n if (colorsRendering === \"css-vars\") {\n return cssVar;\n }\n return null;\n }).filter((i) => !!i).join(\";\");\n}\n\nfunction codeToHast(internal, code, options, transformerContext = {\n meta: {},\n options,\n codeToHast: (_code, _options) => codeToHast(internal, _code, _options),\n codeToTokens: (_code, _options) => codeToTokens(internal, _code, _options)\n}) {\n let input = code;\n for (const transformer of getTransformers(options))\n input = transformer.preprocess?.call(transformerContext, input, options) || input;\n let {\n tokens,\n fg,\n bg,\n themeName,\n rootStyle,\n grammarState\n } = codeToTokens(internal, input, options);\n const {\n mergeWhitespaces = true,\n mergeSameStyleTokens = false\n } = options;\n if (mergeWhitespaces === true)\n tokens = mergeWhitespaceTokens(tokens);\n else if (mergeWhitespaces === \"never\")\n tokens = splitWhitespaceTokens(tokens);\n if (mergeSameStyleTokens) {\n tokens = mergeAdjacentStyledTokens(tokens);\n }\n const contextSource = {\n ...transformerContext,\n get source() {\n return input;\n }\n };\n for (const transformer of getTransformers(options))\n tokens = transformer.tokens?.call(contextSource, tokens) || tokens;\n return tokensToHast(\n tokens,\n {\n ...options,\n fg,\n bg,\n themeName,\n rootStyle: options.rootStyle === false ? false : options.rootStyle ?? rootStyle\n },\n contextSource,\n grammarState\n );\n}\nfunction tokensToHast(tokens, options, transformerContext, grammarState = getLastGrammarStateFromMap(tokens)) {\n const transformers = getTransformers(options);\n const lines = [];\n const root = {\n type: \"root\",\n children: []\n };\n const {\n structure = \"classic\",\n tabindex = \"0\"\n } = options;\n const properties = {\n class: `shiki ${options.themeName || \"\"}`\n };\n if (options.rootStyle !== false) {\n if (options.rootStyle != null)\n properties.style = options.rootStyle;\n else\n properties.style = `background-color:${options.bg};color:${options.fg}`;\n }\n if (tabindex !== false && tabindex != null)\n properties.tabindex = tabindex.toString();\n for (const [key, value] of Object.entries(options.meta || {})) {\n if (!key.startsWith(\"_\"))\n properties[key] = value;\n }\n let preNode = {\n type: \"element\",\n tagName: \"pre\",\n properties,\n children: [],\n data: options.data\n };\n let codeNode = {\n type: \"element\",\n tagName: \"code\",\n properties: {},\n children: lines\n };\n const lineNodes = [];\n const context = {\n ...transformerContext,\n structure,\n addClassToHast,\n get source() {\n return transformerContext.source;\n },\n get tokens() {\n return tokens;\n },\n get options() {\n return options;\n },\n get root() {\n return root;\n },\n get pre() {\n return preNode;\n },\n get code() {\n return codeNode;\n },\n get lines() {\n return lineNodes;\n }\n };\n tokens.forEach((line, idx) => {\n if (idx) {\n if (structure === \"inline\")\n root.children.push({ type: \"element\", tagName: \"br\", properties: {}, children: [] });\n else if (structure === \"classic\")\n lines.push({ type: \"text\", value: \"\\n\" });\n }\n let lineNode = {\n type: \"element\",\n tagName: \"span\",\n properties: { class: \"line\" },\n children: []\n };\n let col = 0;\n for (const token of line) {\n let tokenNode = {\n type: \"element\",\n tagName: \"span\",\n properties: {\n ...token.htmlAttrs\n },\n children: [{ type: \"text\", value: token.content }]\n };\n const style = stringifyTokenStyle(token.htmlStyle || getTokenStyleObject(token));\n if (style)\n tokenNode.properties.style = style;\n for (const transformer of transformers)\n tokenNode = transformer?.span?.call(context, tokenNode, idx + 1, col, lineNode, token) || tokenNode;\n if (structure === \"inline\")\n root.children.push(tokenNode);\n else if (structure === \"classic\")\n lineNode.children.push(tokenNode);\n col += token.content.length;\n }\n if (structure === \"classic\") {\n for (const transformer of transformers)\n lineNode = transformer?.line?.call(context, lineNode, idx + 1) || lineNode;\n lineNodes.push(lineNode);\n lines.push(lineNode);\n } else if (structure === \"inline\") {\n lineNodes.push(lineNode);\n }\n });\n if (structure === \"classic\") {\n for (const transformer of transformers)\n codeNode = transformer?.code?.call(context, codeNode) || codeNode;\n preNode.children.push(codeNode);\n for (const transformer of transformers)\n preNode = transformer?.pre?.call(context, preNode) || preNode;\n root.children.push(preNode);\n } else if (structure === \"inline\") {\n const syntheticLines = [];\n let currentLine = {\n type: \"element\",\n tagName: \"span\",\n properties: { class: \"line\" },\n children: []\n };\n for (const child of root.children) {\n if (child.type === \"element\" && child.tagName === \"br\") {\n syntheticLines.push(currentLine);\n currentLine = {\n type: \"element\",\n tagName: \"span\",\n properties: { class: \"line\" },\n children: []\n };\n } else if (child.type === \"element\" || child.type === \"text\") {\n currentLine.children.push(child);\n }\n }\n syntheticLines.push(currentLine);\n const syntheticCode = {\n type: \"element\",\n tagName: \"code\",\n properties: {},\n children: syntheticLines\n };\n let transformedCode = syntheticCode;\n for (const transformer of transformers)\n transformedCode = transformer?.code?.call(context, transformedCode) || transformedCode;\n root.children = [];\n for (let i = 0; i < transformedCode.children.length; i++) {\n if (i > 0)\n root.children.push({ type: \"element\", tagName: \"br\", properties: {}, children: [] });\n const line = transformedCode.children[i];\n if (line.type === \"element\")\n root.children.push(...line.children);\n }\n }\n let result = root;\n for (const transformer of transformers)\n result = transformer?.root?.call(context, result) || result;\n if (grammarState)\n setLastGrammarStateToMap(result, grammarState);\n return result;\n}\nfunction mergeWhitespaceTokens(tokens) {\n return tokens.map((line) => {\n const newLine = [];\n let carryOnContent = \"\";\n let firstOffset;\n line.forEach((token, idx) => {\n const isDecorated = token.fontStyle && (token.fontStyle & FontStyle.Underline || token.fontStyle & FontStyle.Strikethrough);\n const couldMerge = !isDecorated;\n if (couldMerge && token.content.match(/^\\s+$/) && line[idx + 1]) {\n if (firstOffset === void 0)\n firstOffset = token.offset;\n carryOnContent += token.content;\n } else {\n if (carryOnContent) {\n if (couldMerge) {\n newLine.push({\n ...token,\n offset: firstOffset,\n content: carryOnContent + token.content\n });\n } else {\n newLine.push(\n {\n content: carryOnContent,\n offset: firstOffset\n },\n token\n );\n }\n firstOffset = void 0;\n carryOnContent = \"\";\n } else {\n newLine.push(token);\n }\n }\n });\n return newLine;\n });\n}\nfunction splitWhitespaceTokens(tokens) {\n return tokens.map((line) => {\n return line.flatMap((token) => {\n if (token.content.match(/^\\s+$/))\n return token;\n const match = token.content.match(/^(\\s*)(.*?)(\\s*)$/);\n if (!match)\n return token;\n const [, leading, content, trailing] = match;\n if (!leading && !trailing)\n return token;\n const expanded = [{\n ...token,\n offset: token.offset + leading.length,\n content\n }];\n if (leading) {\n expanded.unshift({\n content: leading,\n offset: token.offset\n });\n }\n if (trailing) {\n expanded.push({\n content: trailing,\n offset: token.offset + leading.length + content.length\n });\n }\n return expanded;\n });\n });\n}\nfunction mergeAdjacentStyledTokens(tokens) {\n return tokens.map((line) => {\n const newLine = [];\n for (const token of line) {\n if (newLine.length === 0) {\n newLine.push({ ...token });\n continue;\n }\n const prevToken = newLine[newLine.length - 1];\n const prevStyle = stringifyTokenStyle(prevToken.htmlStyle || getTokenStyleObject(prevToken));\n const currentStyle = stringifyTokenStyle(token.htmlStyle || getTokenStyleObject(token));\n const isPrevDecorated = prevToken.fontStyle && (prevToken.fontStyle & FontStyle.Underline || prevToken.fontStyle & FontStyle.Strikethrough);\n const isDecorated = token.fontStyle && (token.fontStyle & FontStyle.Underline || token.fontStyle & FontStyle.Strikethrough);\n if (!isPrevDecorated && !isDecorated && prevStyle === currentStyle) {\n prevToken.content += token.content;\n } else {\n newLine.push({ ...token });\n }\n }\n return newLine;\n });\n}\n\nconst hastToHtml = toHtml;\nfunction codeToHtml(internal, code, options) {\n const context = {\n meta: {},\n options,\n codeToHast: (_code, _options) => codeToHast(internal, _code, _options),\n codeToTokens: (_code, _options) => codeToTokens(internal, _code, _options)\n };\n let result = hastToHtml(codeToHast(internal, code, options, context));\n for (const transformer of getTransformers(options))\n result = transformer.postprocess?.call(context, result, options) || result;\n return result;\n}\n\nconst VSCODE_FALLBACK_EDITOR_FG = { light: \"#333333\", dark: \"#bbbbbb\" };\nconst VSCODE_FALLBACK_EDITOR_BG = { light: \"#fffffe\", dark: \"#1e1e1e\" };\nconst RESOLVED_KEY = \"__shiki_resolved\";\nfunction normalizeTheme(rawTheme) {\n if (rawTheme?.[RESOLVED_KEY])\n return rawTheme;\n const theme = {\n ...rawTheme\n };\n if (theme.tokenColors && !theme.settings) {\n theme.settings = theme.tokenColors;\n delete theme.tokenColors;\n }\n theme.type ||= \"dark\";\n theme.colorReplacements = { ...theme.colorReplacements };\n theme.settings ||= [];\n let { bg, fg } = theme;\n if (!bg || !fg) {\n const globalSetting = theme.settings ? theme.settings.find((s) => !s.name && !s.scope) : void 0;\n if (globalSetting?.settings?.foreground)\n fg = globalSetting.settings.foreground;\n if (globalSetting?.settings?.background)\n bg = globalSetting.settings.background;\n if (!fg && theme?.colors?.[\"editor.foreground\"])\n fg = theme.colors[\"editor.foreground\"];\n if (!bg && theme?.colors?.[\"editor.background\"])\n bg = theme.colors[\"editor.background\"];\n if (!fg)\n fg = theme.type === \"light\" ? VSCODE_FALLBACK_EDITOR_FG.light : VSCODE_FALLBACK_EDITOR_FG.dark;\n if (!bg)\n bg = theme.type === \"light\" ? VSCODE_FALLBACK_EDITOR_BG.light : VSCODE_FALLBACK_EDITOR_BG.dark;\n theme.fg = fg;\n theme.bg = bg;\n }\n if (!(theme.settings[0] && theme.settings[0].settings && !theme.settings[0].scope)) {\n theme.settings.unshift({\n settings: {\n foreground: theme.fg,\n background: theme.bg\n }\n });\n }\n let replacementCount = 0;\n const replacementMap = /* @__PURE__ */ new Map();\n function getReplacementColor(value) {\n if (replacementMap.has(value))\n return replacementMap.get(value);\n replacementCount += 1;\n const hex = `#${replacementCount.toString(16).padStart(8, \"0\").toLowerCase()}`;\n if (theme.colorReplacements?.[`#${hex}`])\n return getReplacementColor(value);\n replacementMap.set(value, hex);\n return hex;\n }\n theme.settings = theme.settings.map((setting) => {\n const replaceFg = setting.settings?.foreground && !setting.settings.foreground.startsWith(\"#\");\n const replaceBg = setting.settings?.background && !setting.settings.background.startsWith(\"#\");\n if (!replaceFg && !replaceBg)\n return setting;\n const clone = {\n ...setting,\n settings: {\n ...setting.settings\n }\n };\n if (replaceFg) {\n const replacement = getReplacementColor(setting.settings.foreground);\n theme.colorReplacements[replacement] = setting.settings.foreground;\n clone.settings.foreground = replacement;\n }\n if (replaceBg) {\n const replacement = getReplacementColor(setting.settings.background);\n theme.colorReplacements[replacement] = setting.settings.background;\n clone.settings.background = replacement;\n }\n return clone;\n });\n for (const key of Object.keys(theme.colors || {})) {\n if (key === \"editor.foreground\" || key === \"editor.background\" || key.startsWith(\"terminal.ansi\")) {\n if (!theme.colors[key]?.startsWith(\"#\")) {\n const replacement = getReplacementColor(theme.colors[key]);\n theme.colorReplacements[replacement] = theme.colors[key];\n theme.colors[key] = replacement;\n }\n }\n }\n Object.defineProperty(theme, RESOLVED_KEY, {\n enumerable: false,\n writable: false,\n value: true\n });\n return theme;\n}\n\nasync function resolveLangs(langs) {\n return Array.from(new Set((await Promise.all(\n langs.filter((l) => !isSpecialLang(l)).map(async (lang) => await normalizeGetter(lang).then((r) => Array.isArray(r) ? r : [r]))\n )).flat()));\n}\nasync function resolveThemes(themes) {\n const resolved = await Promise.all(\n themes.map(\n async (theme) => isSpecialTheme(theme) ? null : normalizeTheme(await normalizeGetter(theme))\n )\n );\n return resolved.filter((i) => !!i);\n}\n\nlet _emitDeprecation = 3;\nlet _emitError = false;\nfunction enableDeprecationWarnings(emitDeprecation = true, emitError = false) {\n _emitDeprecation = emitDeprecation;\n _emitError = emitError;\n}\nfunction warnDeprecated(message, version = 3) {\n if (!_emitDeprecation)\n return;\n if (typeof _emitDeprecation === \"number\" && version > _emitDeprecation)\n return;\n if (_emitError) {\n throw new Error(`[SHIKI DEPRECATE]: ${message}`);\n } else {\n console.trace(`[SHIKI DEPRECATE]: ${message}`);\n }\n}\n\nclass ShikiError extends Error {\n constructor(message) {\n super(message);\n this.name = \"ShikiError\";\n }\n}\n\nfunction resolveLangAlias(name, alias) {\n if (!alias)\n return name;\n if (alias[name]) {\n const resolved = /* @__PURE__ */ new Set([name]);\n while (alias[name]) {\n name = alias[name];\n if (resolved.has(name))\n throw new ShikiError(`Circular alias \\`${Array.from(resolved).join(\" -> \")} -> ${name}\\``);\n resolved.add(name);\n }\n }\n return name;\n}\n\nclass Registry extends Registry$1 {\n constructor(_resolver, _themes, _langs, _alias = {}) {\n super(_resolver);\n this._resolver = _resolver;\n this._themes = _themes;\n this._langs = _langs;\n this._alias = _alias;\n this._themes.map((t) => this.loadTheme(t));\n this.loadLanguages(this._langs);\n }\n _resolvedThemes = /* @__PURE__ */ new Map();\n _resolvedGrammars = /* @__PURE__ */ new Map();\n _langMap = /* @__PURE__ */ new Map();\n _langGraph = /* @__PURE__ */ new Map();\n _textmateThemeCache = /* @__PURE__ */ new WeakMap();\n _loadedThemesCache = null;\n _loadedLanguagesCache = null;\n getTheme(theme) {\n if (typeof theme === \"string\")\n return this._resolvedThemes.get(theme);\n else\n return this.loadTheme(theme);\n }\n loadTheme(theme) {\n const _theme = normalizeTheme(theme);\n if (_theme.name) {\n this._resolvedThemes.set(_theme.name, _theme);\n this._loadedThemesCache = null;\n }\n return _theme;\n }\n getLoadedThemes() {\n if (!this._loadedThemesCache)\n this._loadedThemesCache = [...this._resolvedThemes.keys()];\n return this._loadedThemesCache;\n }\n // Override and re-implement this method to cache the textmate themes as `TextMateTheme.createFromRawTheme`\n // is expensive. Themes can switch often especially for dual-theme support.\n //\n // The parent class also accepts `colorMap` as the second parameter, but since we don't use that,\n // we omit here so it's easier to cache the themes.\n setTheme(theme) {\n let textmateTheme = this._textmateThemeCache.get(theme);\n if (!textmateTheme) {\n textmateTheme = Theme.createFromRawTheme(theme);\n this._textmateThemeCache.set(theme, textmateTheme);\n }\n this._syncRegistry.setTheme(textmateTheme);\n }\n getGrammar(name) {\n name = resolveLangAlias(name, this._alias);\n return this._resolvedGrammars.get(name);\n }\n loadLanguage(lang) {\n if (this.getGrammar(lang.name))\n return;\n const embeddedLazilyBy = new Set(\n [...this._langMap.values()].filter((i) => i.embeddedLangsLazy?.includes(lang.name))\n );\n this._resolver.addLanguage(lang);\n const grammarConfig = {\n balancedBracketSelectors: lang.balancedBracketSelectors || [\"*\"],\n unbalancedBracketSelectors: lang.unbalancedBracketSelectors || []\n };\n this._syncRegistry._rawGrammars.set(lang.scopeName, lang);\n const g = this.loadGrammarWithConfiguration(lang.scopeName, 1, grammarConfig);\n g.name = lang.name;\n this._resolvedGrammars.set(lang.name, g);\n if (lang.aliases) {\n lang.aliases.forEach((alias) => {\n this._alias[alias] = lang.name;\n });\n }\n this._loadedLanguagesCache = null;\n if (embeddedLazilyBy.size) {\n for (const e of embeddedLazilyBy) {\n this._resolvedGrammars.delete(e.name);\n this._loadedLanguagesCache = null;\n this._syncRegistry?._injectionGrammars?.delete(e.scopeName);\n this._syncRegistry?._grammars?.delete(e.scopeName);\n this.loadLanguage(this._langMap.get(e.name));\n }\n }\n }\n dispose() {\n super.dispose();\n this._resolvedThemes.clear();\n this._resolvedGrammars.clear();\n this._langMap.clear();\n this._langGraph.clear();\n this._loadedThemesCache = null;\n }\n loadLanguages(langs) {\n for (const lang of langs)\n this.resolveEmbeddedLanguages(lang);\n const langsGraphArray = Array.from(this._langGraph.entries());\n const missingLangs = langsGraphArray.filter(([_, lang]) => !lang);\n if (missingLangs.length) {\n const dependents = langsGraphArray.filter(([_, lang]) => {\n if (!lang)\n return false;\n const embedded = lang.embeddedLanguages || lang.embeddedLangs;\n return embedded?.some((l) => missingLangs.map(([name]) => name).includes(l));\n }).filter((lang) => !missingLangs.includes(lang));\n throw new ShikiError(`Missing languages ${missingLangs.map(([name]) => `\\`${name}\\``).join(\", \")}, required by ${dependents.map(([name]) => `\\`${name}\\``).join(\", \")}`);\n }\n for (const [_, lang] of langsGraphArray)\n this._resolver.addLanguage(lang);\n for (const [_, lang] of langsGraphArray)\n this.loadLanguage(lang);\n }\n getLoadedLanguages() {\n if (!this._loadedLanguagesCache) {\n this._loadedLanguagesCache = [\n .../* @__PURE__ */ new Set([...this._resolvedGrammars.keys(), ...Object.keys(this._alias)])\n ];\n }\n return this._loadedLanguagesCache;\n }\n resolveEmbeddedLanguages(lang) {\n this._langMap.set(lang.name, lang);\n this._langGraph.set(lang.name, lang);\n const embedded = lang.embeddedLanguages ?? lang.embeddedLangs;\n if (embedded) {\n for (const embeddedLang of embedded)\n this._langGraph.set(embeddedLang, this._langMap.get(embeddedLang));\n }\n }\n}\n\nclass Resolver {\n _langs = /* @__PURE__ */ new Map();\n _scopeToLang = /* @__PURE__ */ new Map();\n _injections = /* @__PURE__ */ new Map();\n _onigLib;\n constructor(engine, langs) {\n this._onigLib = {\n createOnigScanner: (patterns) => engine.createScanner(patterns),\n createOnigString: (s) => engine.createString(s)\n };\n langs.forEach((i) => this.addLanguage(i));\n }\n get onigLib() {\n return this._onigLib;\n }\n getLangRegistration(langIdOrAlias) {\n return this._langs.get(langIdOrAlias);\n }\n loadGrammar(scopeName) {\n return this._scopeToLang.get(scopeName);\n }\n addLanguage(l) {\n this._langs.set(l.name, l);\n if (l.aliases) {\n l.aliases.forEach((a) => {\n this._langs.set(a, l);\n });\n }\n this._scopeToLang.set(l.scopeName, l);\n if (l.injectTo) {\n l.injectTo.forEach((i) => {\n if (!this._injections.get(i))\n this._injections.set(i, []);\n this._injections.get(i).push(l.scopeName);\n });\n }\n }\n getInjections(scopeName) {\n const scopeParts = scopeName.split(\".\");\n let injections = [];\n for (let i = 1; i <= scopeParts.length; i++) {\n const subScopeName = scopeParts.slice(0, i).join(\".\");\n injections = [...injections, ...this._injections.get(subScopeName) || []];\n }\n return injections;\n }\n}\n\nlet instancesCount = 0;\nfunction createShikiInternalSync(options) {\n instancesCount += 1;\n if (options.warnings !== false && instancesCount >= 10 && instancesCount % 10 === 0)\n console.warn(`[Shiki] ${instancesCount} instances have been created. Shiki is supposed to be used as a singleton, consider refactoring your code to cache your highlighter instance; Or call \\`highlighter.dispose()\\` to release unused instances.`);\n let isDisposed = false;\n if (!options.engine)\n throw new ShikiError(\"`engine` option is required for synchronous mode\");\n const langs = (options.langs || []).flat(1);\n const themes = (options.themes || []).flat(1).map(normalizeTheme);\n const resolver = new Resolver(options.engine, langs);\n const _registry = new Registry(resolver, themes, langs, options.langAlias);\n let _lastTheme;\n function resolveLangAlias$1(name) {\n return resolveLangAlias(name, options.langAlias);\n }\n function getLanguage(name) {\n ensureNotDisposed();\n const _lang = _registry.getGrammar(typeof name === \"string\" ? name : name.name);\n if (!_lang)\n throw new ShikiError(`Language \\`${name}\\` not found, you may need to load it first`);\n return _lang;\n }\n function getTheme(name) {\n if (name === \"none\")\n return { bg: \"\", fg: \"\", name: \"none\", settings: [], type: \"dark\" };\n ensureNotDisposed();\n const _theme = _registry.getTheme(name);\n if (!_theme)\n throw new ShikiError(`Theme \\`${name}\\` not found, you may need to load it first`);\n return _theme;\n }\n function setTheme(name) {\n ensureNotDisposed();\n const theme = getTheme(name);\n if (_lastTheme !== name) {\n _registry.setTheme(theme);\n _lastTheme = name;\n }\n const colorMap = _registry.getColorMap();\n return {\n theme,\n colorMap\n };\n }\n function getLoadedThemes() {\n ensureNotDisposed();\n return _registry.getLoadedThemes();\n }\n function getLoadedLanguages() {\n ensureNotDisposed();\n return _registry.getLoadedLanguages();\n }\n function loadLanguageSync(...langs2) {\n ensureNotDisposed();\n _registry.loadLanguages(langs2.flat(1));\n }\n async function loadLanguage(...langs2) {\n return loadLanguageSync(await resolveLangs(langs2));\n }\n function loadThemeSync(...themes2) {\n ensureNotDisposed();\n for (const theme of themes2.flat(1)) {\n _registry.loadTheme(theme);\n }\n }\n async function loadTheme(...themes2) {\n ensureNotDisposed();\n return loadThemeSync(await resolveThemes(themes2));\n }\n function ensureNotDisposed() {\n if (isDisposed)\n throw new ShikiError(\"Shiki instance has been disposed\");\n }\n function dispose() {\n if (isDisposed)\n return;\n isDisposed = true;\n _registry.dispose();\n instancesCount -= 1;\n }\n return {\n setTheme,\n getTheme,\n getLanguage,\n getLoadedThemes,\n getLoadedLanguages,\n resolveLangAlias: resolveLangAlias$1,\n loadLanguage,\n loadLanguageSync,\n loadTheme,\n loadThemeSync,\n dispose,\n [Symbol.dispose]: dispose\n };\n}\n\nasync function createShikiInternal(options) {\n if (!options.engine) {\n warnDeprecated(\"`engine` option is required. Use `createOnigurumaEngine` or `createJavaScriptRegexEngine` to create an engine.\");\n }\n const [\n themes,\n langs,\n engine\n ] = await Promise.all([\n resolveThemes(options.themes || []),\n resolveLangs(options.langs || []),\n options.engine\n ]);\n return createShikiInternalSync({\n ...options,\n themes,\n langs,\n engine\n });\n}\n\nasync function createHighlighterCore(options) {\n const internal = await createShikiInternal(options);\n return {\n getLastGrammarState: (...args) => getLastGrammarState(internal, ...args),\n codeToTokensBase: (code, options2) => codeToTokensBase(internal, code, options2),\n codeToTokensWithThemes: (code, options2) => codeToTokensWithThemes(internal, code, options2),\n codeToTokens: (code, options2) => codeToTokens(internal, code, options2),\n codeToHast: (code, options2) => codeToHast(internal, code, options2),\n codeToHtml: (code, options2) => codeToHtml(internal, code, options2),\n getBundledLanguages: () => ({}),\n getBundledThemes: () => ({}),\n ...internal,\n getInternalContext: () => internal\n };\n}\nfunction createHighlighterCoreSync(options) {\n const internal = createShikiInternalSync(options);\n return {\n getLastGrammarState: (...args) => getLastGrammarState(internal, ...args),\n codeToTokensBase: (code, options2) => codeToTokensBase(internal, code, options2),\n codeToTokensWithThemes: (code, options2) => codeToTokensWithThemes(internal, code, options2),\n codeToTokens: (code, options2) => codeToTokens(internal, code, options2),\n codeToHast: (code, options2) => codeToHast(internal, code, options2),\n codeToHtml: (code, options2) => codeToHtml(internal, code, options2),\n getBundledLanguages: () => ({}),\n getBundledThemes: () => ({}),\n ...internal,\n getInternalContext: () => internal\n };\n}\nfunction makeSingletonHighlighterCore(createHighlighter) {\n let _shiki;\n async function getSingletonHighlighterCore2(options) {\n if (!_shiki) {\n _shiki = createHighlighter({\n ...options,\n themes: options.themes || [],\n langs: options.langs || []\n });\n return _shiki;\n } else {\n const s = await _shiki;\n await Promise.all([\n s.loadTheme(...options.themes || []),\n s.loadLanguage(...options.langs || [])\n ]);\n return s;\n }\n }\n return getSingletonHighlighterCore2;\n}\nconst getSingletonHighlighterCore = /* @__PURE__ */ makeSingletonHighlighterCore(createHighlighterCore);\n\nfunction createBundledHighlighter(options) {\n const bundledLanguages = options.langs;\n const bundledThemes = options.themes;\n const engine = options.engine;\n async function createHighlighter(options2) {\n function resolveLang(lang) {\n if (typeof lang === \"string\") {\n lang = options2.langAlias?.[lang] || lang;\n if (isSpecialLang(lang))\n return [];\n const bundle = bundledLanguages[lang];\n if (!bundle)\n throw new ShikiError$1(`Language \\`${lang}\\` is not included in this bundle. You may want to load it from external source.`);\n return bundle;\n }\n return lang;\n }\n function resolveTheme(theme) {\n if (isSpecialTheme(theme))\n return \"none\";\n if (typeof theme === \"string\") {\n const bundle = bundledThemes[theme];\n if (!bundle)\n throw new ShikiError$1(`Theme \\`${theme}\\` is not included in this bundle. You may want to load it from external source.`);\n return bundle;\n }\n return theme;\n }\n const _themes = (options2.themes ?? []).map((i) => resolveTheme(i));\n const langs = (options2.langs ?? []).map((i) => resolveLang(i));\n const core = await createHighlighterCore({\n engine: options2.engine ?? engine(),\n ...options2,\n themes: _themes,\n langs\n });\n return {\n ...core,\n loadLanguage(...langs2) {\n return core.loadLanguage(...langs2.map(resolveLang));\n },\n loadTheme(...themes) {\n return core.loadTheme(...themes.map(resolveTheme));\n },\n getBundledLanguages() {\n return bundledLanguages;\n },\n getBundledThemes() {\n return bundledThemes;\n }\n };\n }\n return createHighlighter;\n}\nfunction makeSingletonHighlighter(createHighlighter) {\n let _shiki;\n async function getSingletonHighlighter(options = {}) {\n if (!_shiki) {\n _shiki = createHighlighter({\n ...options,\n themes: [],\n langs: []\n });\n const s = await _shiki;\n await Promise.all([\n s.loadTheme(...options.themes || []),\n s.loadLanguage(...options.langs || [])\n ]);\n return s;\n } else {\n const s = await _shiki;\n await Promise.all([\n s.loadTheme(...options.themes || []),\n s.loadLanguage(...options.langs || [])\n ]);\n return s;\n }\n }\n return getSingletonHighlighter;\n}\nfunction createSingletonShorthands(createHighlighter, config) {\n const getSingletonHighlighter = makeSingletonHighlighter(createHighlighter);\n async function get(code, options) {\n const shiki = await getSingletonHighlighter({\n langs: [options.lang],\n themes: \"theme\" in options ? [options.theme] : Object.values(options.themes)\n });\n const langs = await config?.guessEmbeddedLanguages?.(code, options.lang, shiki);\n if (langs) {\n await shiki.loadLanguage(...langs);\n }\n return shiki;\n }\n return {\n getSingletonHighlighter(options) {\n return getSingletonHighlighter(options);\n },\n async codeToHtml(code, options) {\n const shiki = await get(code, options);\n return shiki.codeToHtml(code, options);\n },\n async codeToHast(code, options) {\n const shiki = await get(code, options);\n return shiki.codeToHast(code, options);\n },\n async codeToTokens(code, options) {\n const shiki = await get(code, options);\n return shiki.codeToTokens(code, options);\n },\n async codeToTokensBase(code, options) {\n const shiki = await get(code, options);\n return shiki.codeToTokensBase(code, options);\n },\n async codeToTokensWithThemes(code, options) {\n const shiki = await get(code, options);\n return shiki.codeToTokensWithThemes(code, options);\n },\n async getLastGrammarState(code, options) {\n const shiki = await getSingletonHighlighter({\n langs: [options.lang],\n themes: [options.theme]\n });\n return shiki.getLastGrammarState(code, options);\n }\n };\n}\nconst createdBundledHighlighter = createBundledHighlighter;\n\nfunction createCssVariablesTheme(options = {}) {\n const {\n name = \"css-variables\",\n variablePrefix = \"--shiki-\",\n fontStyle = true\n } = options;\n const variable = (name2) => {\n if (options.variableDefaults?.[name2])\n return `var(${variablePrefix}${name2}, ${options.variableDefaults[name2]})`;\n return `var(${variablePrefix}${name2})`;\n };\n const theme = {\n name,\n type: \"dark\",\n colors: {\n \"editor.foreground\": variable(\"foreground\"),\n \"editor.background\": variable(\"background\"),\n \"terminal.ansiBlack\": variable(\"ansi-black\"),\n \"terminal.ansiRed\": variable(\"ansi-red\"),\n \"terminal.ansiGreen\": variable(\"ansi-green\"),\n \"terminal.ansiYellow\": variable(\"ansi-yellow\"),\n \"terminal.ansiBlue\": variable(\"ansi-blue\"),\n \"terminal.ansiMagenta\": variable(\"ansi-magenta\"),\n \"terminal.ansiCyan\": variable(\"ansi-cyan\"),\n \"terminal.ansiWhite\": variable(\"ansi-white\"),\n \"terminal.ansiBrightBlack\": variable(\"ansi-bright-black\"),\n \"terminal.ansiBrightRed\": variable(\"ansi-bright-red\"),\n \"terminal.ansiBrightGreen\": variable(\"ansi-bright-green\"),\n \"terminal.ansiBrightYellow\": variable(\"ansi-bright-yellow\"),\n \"terminal.ansiBrightBlue\": variable(\"ansi-bright-blue\"),\n \"terminal.ansiBrightMagenta\": variable(\"ansi-bright-magenta\"),\n \"terminal.ansiBrightCyan\": variable(\"ansi-bright-cyan\"),\n \"terminal.ansiBrightWhite\": variable(\"ansi-bright-white\")\n },\n tokenColors: [\n {\n scope: [\n \"keyword.operator.accessor\",\n \"meta.group.braces.round.function.arguments\",\n \"meta.template.expression\",\n \"markup.fenced_code meta.embedded.block\"\n ],\n settings: {\n foreground: variable(\"foreground\")\n }\n },\n {\n scope: \"emphasis\",\n settings: {\n fontStyle: \"italic\"\n }\n },\n {\n scope: [\"strong\", \"markup.heading.markdown\", \"markup.bold.markdown\"],\n settings: {\n fontStyle: \"bold\"\n }\n },\n {\n scope: [\"markup.italic.markdown\"],\n settings: {\n fontStyle: \"italic\"\n }\n },\n {\n scope: \"meta.link.inline.markdown\",\n settings: {\n fontStyle: \"underline\",\n foreground: variable(\"token-link\")\n }\n },\n {\n scope: [\"string\", \"markup.fenced_code\", \"markup.inline\"],\n settings: {\n foreground: variable(\"token-string\")\n }\n },\n {\n scope: [\"comment\", \"string.quoted.docstring.multi\"],\n settings: {\n foreground: variable(\"token-comment\")\n }\n },\n {\n scope: [\n \"constant.numeric\",\n \"constant.language\",\n \"constant.other.placeholder\",\n \"constant.character.format.placeholder\",\n \"variable.language.this\",\n \"variable.other.object\",\n \"variable.other.class\",\n \"variable.other.constant\",\n \"meta.property-name\",\n \"meta.property-value\",\n \"support\"\n ],\n settings: {\n foreground: variable(\"token-constant\")\n }\n },\n {\n scope: [\n \"keyword\",\n \"storage.modifier\",\n \"storage.type\",\n \"storage.control.clojure\",\n \"entity.name.function.clojure\",\n \"entity.name.tag.yaml\",\n \"support.function.node\",\n \"support.type.property-name.json\",\n \"punctuation.separator.key-value\",\n \"punctuation.definition.template-expression\"\n ],\n settings: {\n foreground: variable(\"token-keyword\")\n }\n },\n {\n scope: \"variable.parameter.function\",\n settings: {\n foreground: variable(\"token-parameter\")\n }\n },\n {\n scope: [\n \"support.function\",\n \"entity.name.type\",\n \"entity.other.inherited-class\",\n \"meta.function-call\",\n \"meta.instance.constructor\",\n \"entity.other.attribute-name\",\n \"entity.name.function\",\n \"constant.keyword.clojure\"\n ],\n settings: {\n foreground: variable(\"token-function\")\n }\n },\n {\n scope: [\n \"entity.name.tag\",\n \"string.quoted\",\n \"string.regexp\",\n \"string.interpolated\",\n \"string.template\",\n \"string.unquoted.plain.out.yaml\",\n \"keyword.other.template\"\n ],\n settings: {\n foreground: variable(\"token-string-expression\")\n }\n },\n {\n scope: [\n \"punctuation.definition.arguments\",\n \"punctuation.definition.dict\",\n \"punctuation.separator\",\n \"meta.function-call.arguments\"\n ],\n settings: {\n foreground: variable(\"token-punctuation\")\n }\n },\n {\n // [Custom] Markdown links\n scope: [\n \"markup.underline.link\",\n \"punctuation.definition.metadata.markdown\"\n ],\n settings: {\n foreground: variable(\"token-link\")\n }\n },\n {\n // [Custom] Markdown list\n scope: [\"beginning.punctuation.definition.list.markdown\"],\n settings: {\n foreground: variable(\"token-string\")\n }\n },\n {\n // [Custom] Markdown punctuation definition brackets\n scope: [\n \"punctuation.definition.string.begin.markdown\",\n \"punctuation.definition.string.end.markdown\",\n \"string.other.link.title.markdown\",\n \"string.other.link.description.markdown\"\n ],\n settings: {\n foreground: variable(\"token-keyword\")\n }\n },\n {\n // [Custom] Diff\n scope: [\n \"markup.inserted\",\n \"meta.diff.header.to-file\",\n \"punctuation.definition.inserted\"\n ],\n settings: {\n foreground: variable(\"token-inserted\")\n }\n },\n {\n scope: [\n \"markup.deleted\",\n \"meta.diff.header.from-file\",\n \"punctuation.definition.deleted\"\n ],\n settings: {\n foreground: variable(\"token-deleted\")\n }\n },\n {\n scope: [\n \"markup.changed\",\n \"punctuation.definition.changed\"\n ],\n settings: {\n foreground: variable(\"token-changed\")\n }\n }\n ]\n };\n if (!fontStyle) {\n theme.tokenColors = theme.tokenColors?.map((tokenColor) => {\n if (tokenColor.settings?.fontStyle)\n delete tokenColor.settings.fontStyle;\n return tokenColor;\n });\n }\n return theme;\n}\n\nexport { addClassToHast, applyColorReplacements, codeToHast, codeToHtml, codeToTokens, codeToTokensBase, codeToTokensWithThemes, createBundledHighlighter, createCssVariablesTheme, createHighlighterCore, createHighlighterCoreSync, createPositionConverter, createShikiInternal, createShikiInternalSync, createSingletonShorthands, createdBundledHighlighter, enableDeprecationWarnings, flatTokenVariants, getSingletonHighlighterCore, getTokenStyleObject, guessEmbeddedLanguages, hastToHtml, isNoneTheme, isPlainLang, isSpecialLang, isSpecialTheme, makeSingletonHighlighter, makeSingletonHighlighterCore, normalizeGetter, normalizeTheme, resolveColorReplacements, splitLines, splitToken, splitTokens, stringifyTokenStyle, toArray, tokenizeAnsiWithTheme, tokenizeWithTheme, tokensToHast, transformerDecorations, warnDeprecated };\n","import { resolveDynamicComponent as _resolveDynamicComponent, openBlock as _openBlock, createBlock as _createBlock } from \"vue\"\n\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n return (_openBlock(), _createBlock(_resolveDynamicComponent($setup.render)))\n}","import script from \"/Users/yishuai/develop/ai/markdown/packages/vue/src/components/CachedCodeRenderer.vue?type=script\";import { render } from \"/Users/yishuai/develop/ai/markdown/packages/vue/src/components/CachedCodeRenderer.vue?type=template\"; script.render = render;script.__file = \"src/components/CachedCodeRenderer.vue\";export default script;","import { toDisplayString as _toDisplayString, createElementVNode as _createElementVNode, createVNode as _createVNode, createCommentVNode as _createCommentVNode, openBlock as _openBlock, createBlock as _createBlock, Fragment as _Fragment, createElementBlock as _createElementBlock } from \"vue\"\n\nconst _hoisted_1 = { class: \"incremark-code\" }\nconst _hoisted_2 = { class: \"code-header\" }\nconst _hoisted_3 = { class: \"language\" }\nconst _hoisted_4 = [\"aria-label\", \"title\"]\nconst _hoisted_5 = { class: \"code-content\" }\nconst _hoisted_6 = { class: \"shiki-wrapper\" }\nconst _hoisted_7 = { class: \"code-fallback\" }\n\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n return (_openBlock(), _createElementBlock(\"div\", _hoisted_1, [\n _createElementVNode(\"div\", _hoisted_2, [\n _createElementVNode(\"span\", _hoisted_3, _toDisplayString($setup.language), 1 /* TEXT */),\n _createElementVNode(\"button\", {\n class: \"code-btn\",\n onClick: $setup.copyCode,\n type: \"button\",\n \"aria-label\": $setup.copied ? $setup.t('code.copied') : $setup.t('code.copy'),\n title: $setup.copied ? 'Copied!' : 'Copy'\n }, [\n _createVNode($setup[\"SvgIcon\"], {\n svg: $setup.copied ? $setup.LucideCopyCheck : $setup.LucideCopy\n }, null, 8 /* PROPS */, [\"svg\"])\n ], 8 /* PROPS */, _hoisted_4)\n ]),\n _createElementVNode(\"div\", _hoisted_5, [\n _createElementVNode(\"div\", _hoisted_6, [\n _createCommentVNode(\" Stream 高亮(只有当存在代码内容且语言加载完成后才渲染) \"),\n ($setup.shouldEnableHighlight && $setup.highlighterInfo && $setup.isLanguageLoaded)\n ? (_openBlock(), _createBlock($setup[\"CachedCodeRenderer\"], {\n key: 0,\n code: $setup.code,\n lang: $setup.language,\n theme: $props.theme,\n highlighter: $setup.highlighterInfo.highlighter\n }, null, 8 /* PROPS */, [\"code\", \"lang\", \"theme\", \"highlighter\"]))\n : (_openBlock(), _createElementBlock(_Fragment, { key: 1 }, [\n _createCommentVNode(\" 无高亮模式(禁用高亮、无代码内容、或语言未加载完成时显示) \"),\n _createElementVNode(\"pre\", _hoisted_7, [\n _createElementVNode(\"code\", null, _toDisplayString($setup.code), 1 /* TEXT */)\n ])\n ], 2112 /* STABLE_FRAGMENT, DEV_ROOT_FRAGMENT */))\n ])\n ])\n ]))\n}","import script from \"/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkCodeDefault.vue?type=script\";import { render } from \"/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkCodeDefault.vue?type=template\"; script.render = render;script.__file = \"src/components/IncremarkCodeDefault.vue\";export default script;","import { createCommentVNode as _createCommentVNode, resolveDynamicComponent as _resolveDynamicComponent, openBlock as _openBlock, createBlock as _createBlock, createVNode as _createVNode, Fragment as _Fragment, createElementBlock as _createElementBlock } from \"vue\"\n\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n return (_openBlock(), _createElementBlock(_Fragment, null, [\n _createCommentVNode(\" 自定义代码块组件 \"),\n ($setup.CustomCodeBlock)\n ? (_openBlock(), _createBlock(_resolveDynamicComponent($setup.CustomCodeBlock), {\n key: 0,\n \"code-str\": $props.node.value,\n lang: $setup.language,\n completed: $props.blockStatus === 'completed',\n takeOver: $props.codeBlockConfigs?.[$setup.language]?.takeOver\n }, null, 8 /* PROPS */, [\"code-str\", \"lang\", \"completed\", \"takeOver\"]))\n : ($setup.isMermaid)\n ? (_openBlock(), _createElementBlock(_Fragment, { key: 1 }, [\n _createCommentVNode(\" Mermaid 图表 \"),\n _createVNode($setup[\"IncremarkCodeMermaid\"], {\n node: $props.node,\n \"mermaid-delay\": $props.mermaidDelay\n }, null, 8 /* PROPS */, [\"node\", \"mermaid-delay\"])\n ], 2112 /* STABLE_FRAGMENT, DEV_ROOT_FRAGMENT */))\n : (_openBlock(), _createElementBlock(_Fragment, { key: 2 }, [\n _createCommentVNode(\" 默认代码块渲染(支持用户自定义,使用 stream 高亮)\"),\n (_openBlock(), _createBlock(_resolveDynamicComponent($props.defaultCodeComponent), {\n node: $props.node,\n theme: $props.theme,\n \"fallback-theme\": $props.fallbackTheme,\n \"disable-highlight\": $props.disableHighlight,\n \"block-status\": $props.blockStatus\n }, null, 8 /* PROPS */, [\"node\", \"theme\", \"fallback-theme\", \"disable-highlight\", \"block-status\"]))\n ], 2112 /* STABLE_FRAGMENT, DEV_ROOT_FRAGMENT */))\n ], 2112 /* STABLE_FRAGMENT, DEV_ROOT_FRAGMENT */))\n}","import script from \"/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkCode.vue?type=script\";import { render } from \"/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkCode.vue?type=template\"; script.render = render;script.__file = \"src/components/IncremarkCode.vue\";export default script;","<script setup lang=\"ts\">\nimport type { List, ListItem, RootContent } from 'mdast'\nimport { computed } from 'vue'\nimport IncremarkInline from './IncremarkInline.vue'\nimport IncremarkRenderer from './IncremarkRenderer.vue'\n\n// 设置组件名称以支持递归引用\ndefineOptions({\n name: 'IncremarkList'\n})\n\nconst props = defineProps<{\n node: List\n}>()\n\nconst tag = computed(() => props.node.ordered ? 'ol' : 'ul')\n\n/**\n * 获取列表项的内联内容(来自第一个 paragraph)\n */\nfunction getItemInlineContent(item: ListItem) {\n const firstChild = item.children[0]\n if (firstChild?.type === 'paragraph') {\n return firstChild.children\n }\n return []\n}\n\n/**\n * 获取列表项的块级子节点(嵌套列表、代码块等)\n * 排除第一个 paragraph,因为它已经被 getItemInlineContent 处理\n */\nfunction getItemBlockChildren(item: ListItem): RootContent[] {\n return item.children.filter((child, index) => {\n // 第一个 paragraph 已经被处理为内联内容\n if (index === 0 && child.type === 'paragraph') {\n return false\n }\n return true\n })\n}\n\n/**\n * 检查列表项是否有块级子节点(嵌套列表等)\n */\nfunction hasBlockChildren(item: ListItem): boolean {\n return getItemBlockChildren(item).length > 0\n}\n</script>\n\n<template>\n <component \n :is=\"tag\" \n class=\"incremark-list\" \n :class=\"{ 'task-list': node.children.some(item => item.checked !== null && item.checked !== undefined) }\"\n :start=\"node.start || undefined\"\n>\n <li\n v-for=\"(item, index) in node.children\"\n :key=\"index\"\n class=\"incremark-list-item\"\n :class=\"{ 'task-item': item.checked !== null && item.checked !== undefined }\"\n >\n <label v-if=\"item.checked !== null && item.checked !== undefined\" class=\"task-label\">\n <input\n type=\"checkbox\"\n :checked=\"item.checked\"\n disabled\n class=\"checkbox\"\n />\n <span class=\"task-content\">\n <IncremarkInline :nodes=\"getItemInlineContent(item)\" />\n </span>\n </label>\n <template v-else>\n <IncremarkInline :nodes=\"getItemInlineContent(item)\" />\n <!-- 递归渲染所有块级内容(嵌套列表、heading、blockquote、code、table 等) -->\n <template v-if=\"hasBlockChildren(item)\">\n <template v-for=\"(child, childIndex) in getItemBlockChildren(item)\" :key=\"childIndex\">\n <IncremarkRenderer :node=\"child\" />\n </template>\n </template>\n </template>\n </li>\n </component>\n</template>\n\n","import { renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, createElementVNode as _createElementVNode, createVNode as _createVNode, createCommentVNode as _createCommentVNode, createBlock as _createBlock, normalizeClass as _normalizeClass, resolveDynamicComponent as _resolveDynamicComponent, withCtx as _withCtx } from \"vue\"\n\nconst _hoisted_1 = {\n key: 0,\n class: \"task-label\"\n}\nconst _hoisted_2 = [\"checked\"]\nconst _hoisted_3 = { class: \"task-content\" }\n\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n return (_openBlock(), _createBlock(_resolveDynamicComponent($setup.tag), {\n class: _normalizeClass([\"incremark-list\", { 'task-list': $props.node.children.some(item => item.checked !== null && item.checked !== undefined) }]),\n start: $props.node.start || undefined\n }, {\n default: _withCtx(() => [\n (_openBlock(true), _createElementBlock(_Fragment, null, _renderList($props.node.children, (item, index) => {\n return (_openBlock(), _createElementBlock(\"li\", {\n key: index,\n class: _normalizeClass([\"incremark-list-item\", { 'task-item': item.checked !== null && item.checked !== undefined }])\n }, [\n (item.checked !== null && item.checked !== undefined)\n ? (_openBlock(), _createElementBlock(\"label\", _hoisted_1, [\n _createElementVNode(\"input\", {\n type: \"checkbox\",\n checked: item.checked,\n disabled: \"\",\n class: \"checkbox\"\n }, null, 8 /* PROPS */, _hoisted_2),\n _createElementVNode(\"span\", _hoisted_3, [\n _createVNode($setup[\"IncremarkInline\"], {\n nodes: $setup.getItemInlineContent(item)\n }, null, 8 /* PROPS */, [\"nodes\"])\n ])\n ]))\n : (_openBlock(), _createElementBlock(_Fragment, { key: 1 }, [\n _createVNode($setup[\"IncremarkInline\"], {\n nodes: $setup.getItemInlineContent(item)\n }, null, 8 /* PROPS */, [\"nodes\"]),\n _createCommentVNode(\" 递归渲染所有块级内容(嵌套列表、heading、blockquote、code、table 等) \"),\n ($setup.hasBlockChildren(item))\n ? (_openBlock(true), _createElementBlock(_Fragment, { key: 0 }, _renderList($setup.getItemBlockChildren(item), (child, childIndex) => {\n return (_openBlock(), _createBlock($setup[\"IncremarkRenderer\"], {\n key: childIndex,\n node: child\n }, null, 8 /* PROPS */, [\"node\"]))\n }), 128 /* KEYED_FRAGMENT */))\n : _createCommentVNode(\"v-if\", true)\n ], 64 /* STABLE_FRAGMENT */))\n ], 2 /* CLASS */))\n }), 128 /* KEYED_FRAGMENT */))\n ]),\n _: 1 /* STABLE */\n }, 8 /* PROPS */, [\"class\", \"start\"]))\n}","import script from \"/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkList.vue?type=script\";import { render } from \"/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkList.vue?type=template\"; script.render = render;script.__file = \"src/components/IncremarkList.vue\";export default script;","<script setup lang=\"ts\">\nimport type { Table, TableCell, PhrasingContent } from 'mdast'\nimport IncremarkInline from './IncremarkInline.vue'\n\ndefineProps<{\n node: Table\n}>()\n\nfunction getCellContent(cell: TableCell): PhrasingContent[] {\n return cell.children as PhrasingContent[]\n}\n</script>\n\n<template>\n <div class=\"incremark-table-wrapper\">\n <table class=\"incremark-table\">\n <thead>\n <tr v-if=\"node.children[0]\">\n <th \n v-for=\"(cell, cellIndex) in node.children[0].children\" \n :key=\"cellIndex\"\n :class=\"`incremark-table-align-${node.align?.[cellIndex] || 'left'}`\"\n >\n <IncremarkInline :nodes=\"getCellContent(cell)\" />\n </th>\n </tr>\n </thead>\n <tbody>\n <tr v-for=\"(row, rowIndex) in node.children.slice(1)\" :key=\"rowIndex\">\n <td \n v-for=\"(cell, cellIndex) in row.children\" \n :key=\"cellIndex\"\n :class=\"`incremark-table-align-${node.align?.[cellIndex] || 'left'}`\"\n >\n <IncremarkInline :nodes=\"getCellContent(cell)\" />\n </td>\n </tr>\n </tbody>\n </table>\n </div>\n</template>\n\n","import { renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, createVNode as _createVNode, normalizeClass as _normalizeClass, createCommentVNode as _createCommentVNode, createElementVNode as _createElementVNode } from \"vue\"\n\nconst _hoisted_1 = { class: \"incremark-table-wrapper\" }\nconst _hoisted_2 = { class: \"incremark-table\" }\nconst _hoisted_3 = { key: 0 }\n\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n return (_openBlock(), _createElementBlock(\"div\", _hoisted_1, [\n _createElementVNode(\"table\", _hoisted_2, [\n _createElementVNode(\"thead\", null, [\n ($props.node.children[0])\n ? (_openBlock(), _createElementBlock(\"tr\", _hoisted_3, [\n (_openBlock(true), _createElementBlock(_Fragment, null, _renderList($props.node.children[0].children, (cell, cellIndex) => {\n return (_openBlock(), _createElementBlock(\"th\", {\n key: cellIndex,\n class: _normalizeClass(`incremark-table-align-${$props.node.align?.[cellIndex] || 'left'}`)\n }, [\n _createVNode($setup[\"IncremarkInline\"], {\n nodes: $setup.getCellContent(cell)\n }, null, 8 /* PROPS */, [\"nodes\"])\n ], 2 /* CLASS */))\n }), 128 /* KEYED_FRAGMENT */))\n ]))\n : _createCommentVNode(\"v-if\", true)\n ]),\n _createElementVNode(\"tbody\", null, [\n (_openBlock(true), _createElementBlock(_Fragment, null, _renderList($props.node.children.slice(1), (row, rowIndex) => {\n return (_openBlock(), _createElementBlock(\"tr\", { key: rowIndex }, [\n (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(row.children, (cell, cellIndex) => {\n return (_openBlock(), _createElementBlock(\"td\", {\n key: cellIndex,\n class: _normalizeClass(`incremark-table-align-${$props.node.align?.[cellIndex] || 'left'}`)\n }, [\n _createVNode($setup[\"IncremarkInline\"], {\n nodes: $setup.getCellContent(cell)\n }, null, 8 /* PROPS */, [\"nodes\"])\n ], 2 /* CLASS */))\n }), 128 /* KEYED_FRAGMENT */))\n ]))\n }), 128 /* KEYED_FRAGMENT */))\n ])\n ])\n ]))\n}","import script from \"/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkTable.vue?type=script\";import { render } from \"/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkTable.vue?type=template\"; script.render = render;script.__file = \"src/components/IncremarkTable.vue\";export default script;","import { renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, createBlock as _createBlock } from \"vue\"\n\nconst _hoisted_1 = { class: \"incremark-blockquote\" }\n\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n return (_openBlock(), _createElementBlock(\"blockquote\", _hoisted_1, [\n (_openBlock(true), _createElementBlock(_Fragment, null, _renderList($props.node.children, (child, index) => {\n return (_openBlock(), _createBlock($setup[\"IncremarkRenderer\"], {\n key: index,\n node: child\n }, null, 8 /* PROPS */, [\"node\"]))\n }), 128 /* KEYED_FRAGMENT */))\n ]))\n}","import script from \"/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkBlockquote.vue?type=script\";import { render } from \"/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkBlockquote.vue?type=template\"; script.render = render;script.__file = \"src/components/IncremarkBlockquote.vue\";export default script;","import { openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nconst _hoisted_1 = { class: \"incremark-hr\" }\n\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n return (_openBlock(), _createElementBlock(\"hr\", _hoisted_1))\n}","import script from \"/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkThematicBreak.vue?type=script\";import { render } from \"/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkThematicBreak.vue?type=template\"; script.render = render;script.__file = \"src/components/IncremarkThematicBreak.vue\";export default script;","<script setup lang=\"ts\">\nimport type { RootContent } from 'mdast'\nimport type { Component } from 'vue'\nimport IncremarkRenderer from './IncremarkRenderer.vue'\n\n/**\n * 容器节点类型定义\n * 根据 directive 解析后的结构\n */\nexport interface ContainerNode {\n type: 'containerDirective' | 'leafDirective' | 'textDirective'\n name: string\n attributes?: Record<string, string>\n children?: RootContent[]\n}\n\nconst props = defineProps<{\n node: ContainerNode\n customContainers?: Record<string, Component>\n}>()\n\n/**\n * 解析 attributes 字符串为对象\n * directive 的 attributes 可能是字符串格式,需要解析\n */\nfunction parseOptions(attributes?: Record<string, string>): Record<string, any> {\n if (!attributes) return {}\n \n const options: Record<string, any> = {}\n for (const [key, value] of Object.entries(attributes)) {\n // 尝试解析 JSON 值\n try {\n options[key] = JSON.parse(value)\n } catch {\n // 如果不是 JSON,直接使用字符串值\n options[key] = value\n }\n }\n return options\n}\n\nconst containerName = props.node.name\nconst options = parseOptions(props.node.attributes)\nconst CustomContainer = props.customContainers?.[containerName]\n\n// 如果没有自定义容器组件,使用默认渲染\nconst hasCustomContainer = !!CustomContainer\n</script>\n\n<template>\n <!-- 如果有自定义容器组件,使用自定义组件 -->\n <component\n v-if=\"hasCustomContainer\"\n :is=\"CustomContainer\"\n :name=\"containerName\"\n :options=\"options\"\n >\n <!-- 将容器内容作为默认 slot 传递 -->\n <template v-if=\"node.children && node.children.length > 0\">\n <template v-for=\"(child, index) in node.children\" :key=\"index\">\n <IncremarkRenderer :node=\"child\" />\n </template>\n </template>\n </component>\n \n <!-- 如果没有自定义容器组件,使用默认渲染 -->\n <div v-else :class=\"['incremark-container', `incremark-container-${containerName}`]\">\n <div v-if=\"node.children && node.children.length > 0\" class=\"incremark-container-content\">\n <template v-for=\"(child, index) in node.children\" :key=\"index\">\n <IncremarkRenderer :node=\"child\" />\n </template>\n </div>\n </div>\n</template>\n\n","import { createCommentVNode as _createCommentVNode, renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, createBlock as _createBlock, resolveDynamicComponent as _resolveDynamicComponent, withCtx as _withCtx, normalizeClass as _normalizeClass, createElementVNode as _createElementVNode } from \"vue\"\n\nconst _hoisted_1 = {\n key: 0,\n class: \"incremark-container-content\"\n}\n\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n return (_openBlock(), _createElementBlock(_Fragment, null, [\n _createCommentVNode(\" 如果有自定义容器组件,使用自定义组件 \"),\n ($setup.hasCustomContainer)\n ? (_openBlock(), _createBlock(_resolveDynamicComponent($setup.CustomContainer), {\n key: 0,\n name: $setup.containerName,\n options: $setup.options\n }, {\n default: _withCtx(() => [\n _createCommentVNode(\" 将容器内容作为默认 slot 传递 \"),\n ($props.node.children && $props.node.children.length > 0)\n ? (_openBlock(true), _createElementBlock(_Fragment, { key: 0 }, _renderList($props.node.children, (child, index) => {\n return (_openBlock(), _createBlock($setup[\"IncremarkRenderer\"], {\n key: index,\n node: child\n }, null, 8 /* PROPS */, [\"node\"]))\n }), 128 /* KEYED_FRAGMENT */))\n : _createCommentVNode(\"v-if\", true)\n ]),\n _: 1 /* STABLE */\n }, 8 /* PROPS */, [\"name\", \"options\"]))\n : (_openBlock(), _createElementBlock(_Fragment, { key: 1 }, [\n _createCommentVNode(\" 如果没有自定义容器组件,使用默认渲染 \"),\n _createElementVNode(\"div\", {\n class: _normalizeClass(['incremark-container', `incremark-container-${$setup.containerName}`])\n }, [\n ($props.node.children && $props.node.children.length > 0)\n ? (_openBlock(), _createElementBlock(\"div\", _hoisted_1, [\n (_openBlock(true), _createElementBlock(_Fragment, null, _renderList($props.node.children, (child, index) => {\n return (_openBlock(), _createBlock($setup[\"IncremarkRenderer\"], {\n key: index,\n node: child\n }, null, 8 /* PROPS */, [\"node\"]))\n }), 128 /* KEYED_FRAGMENT */))\n ]))\n : _createCommentVNode(\"v-if\", true)\n ], 2 /* CLASS */)\n ], 2112 /* STABLE_FRAGMENT, DEV_ROOT_FRAGMENT */))\n ], 2112 /* STABLE_FRAGMENT, DEV_ROOT_FRAGMENT */))\n}","import script from \"/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkContainer.vue?type=script\";import { render } from \"/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkContainer.vue?type=template\"; script.render = render;script.__file = \"src/components/IncremarkContainer.vue\";export default script;","import { toDisplayString as _toDisplayString, createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nconst _hoisted_1 = { class: \"incremark-default\" }\nconst _hoisted_2 = { class: \"type-badge\" }\n\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n return (_openBlock(), _createElementBlock(\"div\", _hoisted_1, [\n _createElementVNode(\"span\", _hoisted_2, _toDisplayString($props.node.type), 1 /* TEXT */),\n _createElementVNode(\"pre\", null, _toDisplayString(JSON.stringify($props.node, null, 2)), 1 /* TEXT */)\n ]))\n}","import script from \"/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkDefault.vue?type=script\";import { render } from \"/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkDefault.vue?type=template\"; script.render = render;script.__file = \"src/components/IncremarkDefault.vue\";export default script;","import { createCommentVNode as _createCommentVNode, toDisplayString as _toDisplayString, createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock, createVNode as _createVNode, Fragment as _Fragment, resolveDynamicComponent as _resolveDynamicComponent, createBlock as _createBlock } from \"vue\"\n\nconst _hoisted_1 = {\n key: 0,\n class: \"incremark-html-code\"\n}\n\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n return (_openBlock(), _createElementBlock(_Fragment, null, [\n _createCommentVNode(\" HTML 节点:渲染为代码块显示源代码 \"),\n ($setup.isHtmlNode($props.node))\n ? (_openBlock(), _createElementBlock(\"pre\", _hoisted_1, [\n _createElementVNode(\"code\", null, _toDisplayString(($props.node as HTML).value), 1 /* TEXT */)\n ]))\n : ($setup.isContainerNode($props.node))\n ? (_openBlock(), _createElementBlock(_Fragment, { key: 1 }, [\n _createCommentVNode(\" 容器节点:使用容器组件,传递 customContainers \"),\n _createVNode($setup[\"IncremarkContainer\"], {\n node: $props.node as ContainerNode,\n \"custom-containers\": $props.customContainers\n }, null, 8 /* PROPS */, [\"node\", \"custom-containers\"])\n ], 2112 /* STABLE_FRAGMENT, DEV_ROOT_FRAGMENT */))\n : (($props.node as RootContent).type === 'code')\n ? (_openBlock(), _createElementBlock(_Fragment, { key: 2 }, [\n _createCommentVNode(\" 代码节点:特殊处理,传递 customCodeBlocks、codeBlockConfigs 和 blockStatus \"),\n _createVNode($setup[\"IncremarkCode\"], {\n node: $props.node as Code,\n \"custom-code-blocks\": $props.customCodeBlocks,\n \"code-block-configs\": $props.codeBlockConfigs,\n \"block-status\": $props.blockStatus,\n \"default-code-component\": $props.components?.['code']\n }, null, 8 /* PROPS */, [\"node\", \"custom-code-blocks\", \"code-block-configs\", \"block-status\", \"default-code-component\"])\n ], 2112 /* STABLE_FRAGMENT, DEV_ROOT_FRAGMENT */))\n : (_openBlock(), _createElementBlock(_Fragment, { key: 3 }, [\n _createCommentVNode(\" 其他节点:使用对应组件 \"),\n (_openBlock(), _createBlock(_resolveDynamicComponent($setup.getComponent(($props.node as RootContent).type)), {\n node: $props.node as RootContent\n }, null, 8 /* PROPS */, [\"node\"]))\n ], 2112 /* STABLE_FRAGMENT, DEV_ROOT_FRAGMENT */))\n ], 2112 /* STABLE_FRAGMENT, DEV_ROOT_FRAGMENT */))\n}","import script from \"/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkRenderer.vue?type=script\";import { render } from \"/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkRenderer.vue?type=template\"; script.render = render;script.__file = \"src/components/IncremarkRenderer.vue\";export default script;","<!--\n/**\n * 脚注列表组件\n *\n * 在文档底部渲染所有脚注定义,按引用出现的顺序排列\n *\n * @component IncremarkFootnotes\n *\n * @remarks\n * 样式定义在 @incremark/theme 中的 footnotes.less\n * footnoteReferenceOrder 自动从 context 获取,无需手动传递\n */\n-->\n<script setup lang=\"ts\">\nimport { computed } from 'vue'\nimport type { FootnoteDefinition, RootContent } from 'mdast'\nimport { useDefinationsContext } from '../composables/useDefinationsContext'\nimport IncremarkRenderer from './IncremarkRenderer.vue'\n\nconst { footnoteDefinitions, footnoteReferenceOrder } = useDefinationsContext()\n\n/**\n * 按引用顺序排列的脚注列表\n * 只显示已有定义的脚注\n */\nconst orderedFootnotes = computed<Array<{ identifier: string; definition: FootnoteDefinition }>>(() => {\n return footnoteReferenceOrder.value\n .map(identifier => ({\n identifier,\n definition: footnoteDefinitions.value[identifier]\n }))\n .filter(item => item.definition !== undefined)\n})\n\n/**\n * 是否有脚注需要显示\n */\nconst hasFootnotes = computed(() => orderedFootnotes.value.length > 0)\n</script>\n\n<template>\n <section v-if=\"hasFootnotes\" class=\"incremark-footnotes\">\n <hr class=\"incremark-footnotes-divider\" />\n <ol class=\"incremark-footnotes-list\">\n <li\n v-for=\"(item, index) in orderedFootnotes\"\n :key=\"item.identifier\"\n :id=\"`fn-${item.identifier}`\"\n class=\"incremark-footnote-item\"\n >\n <div class=\"incremark-footnote-content\">\n <!-- 脚注序号 -->\n <span class=\"incremark-footnote-number\">{{ index + 1 }}.</span>\n \n <!-- 脚注内容 -->\n <div class=\"incremark-footnote-body\">\n <IncremarkRenderer\n v-for=\"(child, childIndex) in item.definition.children\"\n :key=\"childIndex\"\n :node=\"(child as RootContent)\"\n />\n </div>\n </div>\n \n <!-- 返回链接 -->\n <a \n :href=\"`#fnref-${item.identifier}`\" \n class=\"incremark-footnote-backref\"\n aria-label=\"返回引用位置\"\n >\n ↩\n </a>\n </li>\n </ol>\n </section>\n</template>\n\n\n","import { createElementVNode as _createElementVNode, renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, toDisplayString as _toDisplayString, createBlock as _createBlock } from \"vue\"\n\nconst _hoisted_1 = {\n key: 0,\n class: \"incremark-footnotes\"\n}\nconst _hoisted_2 = { class: \"incremark-footnotes-list\" }\nconst _hoisted_3 = [\"id\"]\nconst _hoisted_4 = { class: \"incremark-footnote-content\" }\nconst _hoisted_5 = { class: \"incremark-footnote-number\" }\nconst _hoisted_6 = { class: \"incremark-footnote-body\" }\nconst _hoisted_7 = [\"href\"]\n\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n return ($setup.hasFootnotes)\n ? (_openBlock(), _createElementBlock(\"section\", _hoisted_1, [\n _cache[0] || (_cache[0] = _createElementVNode(\"hr\", { class: \"incremark-footnotes-divider\" }, null, -1 /* CACHED */)),\n _createElementVNode(\"ol\", _hoisted_2, [\n (_openBlock(true), _createElementBlock(_Fragment, null, _renderList($setup.orderedFootnotes, (item, index) => {\n return (_openBlock(), _createElementBlock(\"li\", {\n key: item.identifier,\n id: `fn-${item.identifier}`,\n class: \"incremark-footnote-item\"\n }, [\n _createElementVNode(\"div\", _hoisted_4, [\n _createCommentVNode(\" 脚注序号 \"),\n _createElementVNode(\"span\", _hoisted_5, _toDisplayString(index + 1) + \".\", 1 /* TEXT */),\n _createCommentVNode(\" 脚注内容 \"),\n _createElementVNode(\"div\", _hoisted_6, [\n (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(item.definition.children, (child, childIndex) => {\n return (_openBlock(), _createBlock($setup[\"IncremarkRenderer\"], {\n key: childIndex,\n node: (child as RootContent)\n }, null, 8 /* PROPS */, [\"node\"]))\n }), 128 /* KEYED_FRAGMENT */))\n ])\n ]),\n _createCommentVNode(\" 返回链接 \"),\n _createElementVNode(\"a\", {\n href: `#fnref-${item.identifier}`,\n class: \"incremark-footnote-backref\",\n \"aria-label\": \"返回引用位置\"\n }, \" ↩ \", 8 /* PROPS */, _hoisted_7)\n ], 8 /* PROPS */, _hoisted_3))\n }), 128 /* KEYED_FRAGMENT */))\n ])\n ]))\n : _createCommentVNode(\"v-if\", true)\n}","import script from \"/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkFootnotes.vue?type=script\";import { render } from \"/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkFootnotes.vue?type=template\"; script.render = render;script.__file = \"src/components/IncremarkFootnotes.vue\";export default script;","import { createCommentVNode as _createCommentVNode, renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, createVNode as _createVNode, normalizeClass as _normalizeClass, createBlock as _createBlock } from \"vue\"\n\nconst _hoisted_1 = { class: \"incremark\" }\n\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n return (_openBlock(), _createElementBlock(\"div\", _hoisted_1, [\n _createCommentVNode(\" 主要内容块 \"),\n (_openBlock(true), _createElementBlock(_Fragment, null, _renderList($setup.actualBlocks, (block) => {\n return (_openBlock(), _createElementBlock(_Fragment, null, [\n (block.node.type !== 'definition' && block.node.type !== 'footnoteDefinition')\n ? (_openBlock(), _createElementBlock(\"div\", {\n key: block.id,\n class: _normalizeClass([\n 'incremark-block',\n block.status === 'completed' ? $props.completedClass : $props.pendingClass,\n { 'incremark-show-status': $props.showBlockStatus },\n { 'incremark-last-pending': block.isLastPending }\n ])\n }, [\n _createVNode($setup[\"IncremarkRenderer\"], {\n node: block.node,\n \"block-status\": block.status,\n \"custom-containers\": $props.customContainers,\n \"custom-code-blocks\": $props.customCodeBlocks,\n \"code-block-configs\": $props.codeBlockConfigs,\n components: $props.components\n }, null, 8 /* PROPS */, [\"node\", \"block-status\", \"custom-containers\", \"custom-code-blocks\", \"code-block-configs\", \"components\"])\n ], 2 /* CLASS */))\n : _createCommentVNode(\"v-if\", true)\n ], 64 /* STABLE_FRAGMENT */))\n }), 256 /* UNKEYED_FRAGMENT */)),\n _createCommentVNode(\" 脚注列表(仅在内容完全显示后显示) \"),\n ($setup.actualIsDisplayComplete && $setup.footnoteReferenceOrder.length > 0)\n ? (_openBlock(), _createBlock($setup[\"IncremarkFootnotes\"], { key: 0 }))\n : _createCommentVNode(\"v-if\", true)\n ]))\n}","import script from \"/Users/yishuai/develop/ai/markdown/packages/vue/src/components/Incremark.vue?type=script\";import { render } from \"/Users/yishuai/develop/ai/markdown/packages/vue/src/components/Incremark.vue?type=template\"; script.render = render;script.__file = \"src/components/Incremark.vue\";export default script;","<script setup lang=\"ts\">\n import { computed, watch } from 'vue';\n import { useIncremark } from '../composables';\n import { IncremarkContentProps } from '../types';\n import Incremark from './Incremark.vue';\n\n const props = defineProps<IncremarkContentProps>()\n\n const incremarkOptions = computed(() => ({\n gfm: true,\n htmlTree: true,\n containers: true,\n math: true,\n ...props.incremarkOptions\n }))\n\n const { blocks, append, finalize, render, reset, isDisplayComplete, markdown } = useIncremark(incremarkOptions);\n\n const isStreamMode = computed(() => typeof props.stream === 'function');\n\n async function handleStreamInput() {\n if (!props.stream) return;\n\n try {\n const stream = props.stream();\n\n for await (const chunk of stream) {\n append(chunk);\n } \n\n finalize();\n } catch (error) {\n console.error('Stream error: ', error);\n finalize();\n }\n }\n\n function handleContentInput(newContent?: string, oldContent?: string) {\n if (!newContent) {\n if (oldContent) {\n reset();\n }\n return;\n }\n\n if (newContent?.startsWith(oldContent ?? '')) {\n const delta = newContent.slice((oldContent || '').length)\n append(delta);\n } else {\n render(newContent);\n }\n }\n\n watch(() => props.content, async (newContent, oldContent) => {\n if (isStreamMode.value) {\n await handleStreamInput();\n } else {\n handleContentInput(newContent, oldContent);\n }\n }, { immediate: true });\n\n watch(() => props.isFinished, (newIsFinished) => {\n if (newIsFinished && props.content === markdown.value) {\n finalize();\n }\n }, { immediate: true })\n</script>\n\n<template>\n <Incremark \n :blocks=\"blocks\"\n :pending-class=\"pendingClass\"\n :is-display-complete=\"isDisplayComplete\"\n :show-block-status=\"showBlockStatus\"\n :components=\"components\"\n :custom-containers=\"customContainers\"\n :custom-code-blocks=\"customCodeBlocks\"\n :code-block-configs=\"codeBlockConfigs\"\n />\n</template>","import { openBlock as _openBlock, createBlock as _createBlock } from \"vue\"\n\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n return (_openBlock(), _createBlock($setup[\"Incremark\"], {\n blocks: $setup.blocks,\n \"pending-class\": $props.pendingClass,\n \"is-display-complete\": $setup.isDisplayComplete,\n \"show-block-status\": $props.showBlockStatus,\n components: $props.components,\n \"custom-containers\": $props.customContainers,\n \"custom-code-blocks\": $props.customCodeBlocks,\n \"code-block-configs\": $props.codeBlockConfigs\n }, null, 8 /* PROPS */, [\"blocks\", \"pending-class\", \"is-display-complete\", \"show-block-status\", \"components\", \"custom-containers\", \"custom-code-blocks\", \"code-block-configs\"]))\n}","import script from \"/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkContent.vue?type=script\";import { render } from \"/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkContent.vue?type=template\"; script.render = render;script.__file = \"src/components/IncremarkContent.vue\";export default script;","<script setup lang=\"ts\">\nimport { ref, watch, onMounted, onUnmounted, nextTick } from 'vue'\n\nconst props = withDefaults(defineProps<{\n /** 是否启用自动滚动 */\n enabled?: boolean\n /** 触发自动滚动的底部阈值(像素) */\n threshold?: number\n /** 滚动行为 */\n behavior?: ScrollBehavior\n}>(), {\n enabled: true,\n threshold: 50,\n behavior: 'instant'\n})\n\nconst containerRef = ref<HTMLDivElement | null>(null)\nconst isUserScrolledUp = ref(false)\n\n// 记录上一次滚动位置,用于判断滚动方向\nlet lastScrollTop = 0\nlet lastScrollHeight = 0\n\n/**\n * 检查是否在底部附近\n */\nfunction isNearBottom(): boolean {\n const container = containerRef.value\n if (!container) return true\n \n const { scrollTop, scrollHeight, clientHeight } = container\n return scrollHeight - scrollTop - clientHeight <= props.threshold\n}\n\n/**\n * 滚动到底部\n */\nfunction scrollToBottom(force = false): void {\n const container = containerRef.value\n if (!container) return\n \n // 如果用户手动向上滚动了,且不是强制滚动,则不自动滚动\n if (isUserScrolledUp.value && !force) return\n \n container.scrollTo({\n top: container.scrollHeight,\n behavior: props.behavior\n })\n}\n\n/**\n * 检查是否有滚动条\n */\nfunction hasScrollbar(): boolean {\n const container = containerRef.value\n if (!container) return false\n return container.scrollHeight > container.clientHeight\n}\n\n/**\n * 处理滚动事件\n */\nfunction handleScroll(): void {\n const container = containerRef.value\n if (!container) return\n \n const { scrollTop, scrollHeight, clientHeight } = container\n \n // 如果没有滚动条,恢复自动滚动\n if (scrollHeight <= clientHeight) {\n isUserScrolledUp.value = false\n lastScrollTop = 0\n lastScrollHeight = scrollHeight\n return\n }\n \n // 检查用户是否滚动到底部附近\n if (isNearBottom()) {\n // 用户滚动到底部,恢复自动滚动\n isUserScrolledUp.value = false\n } else {\n // 判断是否是用户主动向上滚动\n // 条件:scrollTop 减少(向上滚动)且 scrollHeight 没有变化(不是因为内容增加)\n const isScrollingUp = scrollTop < lastScrollTop\n const isContentUnchanged = scrollHeight === lastScrollHeight\n \n if (isScrollingUp && isContentUnchanged) {\n // 用户主动向上滚动,暂停自动滚动\n isUserScrolledUp.value = true\n }\n }\n \n // 更新记录\n lastScrollTop = scrollTop\n lastScrollHeight = scrollHeight\n}\n\n// 监听 slot 内容变化(使用 MutationObserver)\nlet observer: MutationObserver | null = null\n\nonMounted(() => {\n if (!containerRef.value) return\n \n // 初始化滚动位置记录\n lastScrollTop = containerRef.value.scrollTop\n lastScrollHeight = containerRef.value.scrollHeight\n \n observer = new MutationObserver(() => {\n nextTick(() => {\n if (!containerRef.value) return\n \n // 如果没有滚动条,重置状态\n if (!hasScrollbar()) {\n isUserScrolledUp.value = false\n }\n \n // 更新 scrollHeight 记录(内容变化后)\n lastScrollHeight = containerRef.value.scrollHeight\n \n // 自动滚动\n if (props.enabled && !isUserScrolledUp.value) {\n scrollToBottom()\n }\n })\n })\n \n observer.observe(containerRef.value, {\n childList: true,\n subtree: true,\n characterData: true\n })\n})\n\nonUnmounted(() => {\n observer?.disconnect()\n})\n\n// 暴露方法给父组件\ndefineExpose({\n /** 强制滚动到底部 */\n scrollToBottom: () => scrollToBottom(true),\n /** 是否用户手动向上滚动了 */\n isUserScrolledUp: () => isUserScrolledUp.value,\n /** 容器元素引用 */\n container: containerRef\n})\n</script>\n\n<template>\n <div\n ref=\"containerRef\"\n class=\"auto-scroll-container\"\n @scroll=\"handleScroll\"\n >\n <slot />\n </div>\n</template>\n","import { renderSlot as _renderSlot, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n return (_openBlock(), _createElementBlock(\"div\", {\n ref: \"containerRef\",\n class: \"auto-scroll-container\",\n onScroll: $setup.handleScroll\n }, [\n _renderSlot(_ctx.$slots, \"default\")\n ], 544 /* NEED_HYDRATION, NEED_PATCH */))\n}","import script from \"/Users/yishuai/develop/ai/markdown/packages/vue/src/components/AutoScrollContainer.vue?type=script\";import { render } from \"/Users/yishuai/develop/ai/markdown/packages/vue/src/components/AutoScrollContainer.vue?type=template\"; script.render = render;script.__file = \"src/components/AutoScrollContainer.vue\";export default script;","<script setup lang=\"ts\">\nimport { ref, watch } from 'vue'\nimport type { DesignTokens } from '@incremark/theme'\nimport { applyTheme } from '@incremark/theme'\nimport { isServer } from '@incremark/shared'\n\n/**\n * 主题配置,可以是:\n * - 字符串:'default' | 'dark'\n * - 完整主题对象:DesignTokens\n * - 部分主题对象:Partial<DesignTokens>(会合并到默认主题)\n */\nconst props = withDefaults(\n defineProps<{\n theme: 'default' | 'dark' | DesignTokens | Partial<DesignTokens>\n class?: string\n }>(),\n {\n class: ''\n }\n)\n\nconst containerRef = ref<HTMLElement>()\n\nwatch(\n () => props.theme,\n (theme) => {\n if (isServer()) return\n\n if (containerRef.value) {\n applyTheme(containerRef.value, theme)\n }\n },\n { immediate: true }\n)\n</script>\n\n<template>\n <div ref=\"containerRef\" :class=\"props.class\" class=\"incremark-theme-provider\">\n <slot />\n </div>\n</template>\n\n","import { renderSlot as _renderSlot, normalizeClass as _normalizeClass, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n return (_openBlock(), _createElementBlock(\"div\", {\n ref: \"containerRef\",\n class: _normalizeClass([$setup.props.class, \"incremark-theme-provider\"])\n }, [\n _renderSlot(_ctx.$slots, \"default\")\n ], 2 /* CLASS */))\n}","import script from \"/Users/yishuai/develop/ai/markdown/packages/vue/src/ThemeProvider.vue?type=script\";import { render } from \"/Users/yishuai/develop/ai/markdown/packages/vue/src/ThemeProvider.vue?type=template\"; script.render = render;script.__file = \"src/ThemeProvider.vue\";export default script;","<script setup lang=\"ts\">\nimport { provide, ref, watch, type Ref } from 'vue'\nimport type { IncremarkLocale } from '@incremark/shared'\nimport { zhCN } from '@incremark/shared'\nimport { LOCALE_KEY } from '../composables/useLocale'\n\ninterface Props {\n /** locale 对象 */\n locale?: IncremarkLocale\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n locale: () => zhCN\n})\n\n// 提供 locale 给子组件(确保不是 undefined)\nconst localeRef: Ref<IncremarkLocale> = ref(props.locale || zhCN)\nprovide(LOCALE_KEY, localeRef)\n\n// 监听 locale 变化\nwatch(\n () => props.locale,\n (newLocale) => {\n if (newLocale) {\n localeRef.value = newLocale\n }\n },\n { deep: true }\n)\n</script>\n\n<template>\n <slot />\n</template>\n","import { renderSlot as _renderSlot } from \"vue\"\n\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n return _renderSlot(_ctx.$slots, \"default\")\n}","import script from \"/Users/yishuai/develop/ai/markdown/packages/vue/src/components/ConfigProvider.vue?type=script\";import { render } from \"/Users/yishuai/develop/ai/markdown/packages/vue/src/components/ConfigProvider.vue?type=template\"; script.render = render;script.__file = \"src/components/ConfigProvider.vue\";export default script;","// Composables\nexport { useIncremark, useStreamRenderer, useDevTools, useBlockTransformer, useLocale } from './composables'\nexport { useProvideDefinations } from './composables/useProvideDefinations'\nexport { useDefinationsContext } from './composables/useDefinationsContext'\nexport type {\n UseIncremarkOptions,\n TypewriterOptions,\n TypewriterControls,\n UseStreamRendererOptions,\n UseDevToolsOptions,\n UseBlockTransformerOptions,\n UseBlockTransformerReturn\n} from './composables'\n\n// Components\nexport * from './components';\n\nexport { default as ThemeProvider } from './ThemeProvider.vue'\nexport { default as ConfigProvider } from './components/ConfigProvider.vue'\n\n// Re-export core types\nexport type {\n ParsedBlock,\n IncrementalUpdate,\n ParserOptions,\n BlockStatus,\n Root,\n RootContent,\n // Transformer types\n SourceBlock,\n DisplayBlock,\n TransformerPlugin,\n TransformerOptions,\n TransformerState,\n AnimationEffect\n} from '@incremark/core'\n\n// Re-export transformer utilities and plugins\nexport {\n BlockTransformer,\n createBlockTransformer,\n countChars,\n sliceAst,\n cloneNode,\n codeBlockPlugin,\n mermaidPlugin,\n imagePlugin,\n mathPlugin,\n thematicBreakPlugin,\n defaultPlugins,\n allPlugins,\n createPlugin\n} from '@incremark/core'\n\n// Re-export theme utilities\nexport {\n type DesignTokens,\n defaultTheme,\n darkTheme,\n generateCSSVars,\n mergeTheme,\n applyTheme\n} from '@incremark/theme'\n\n// Re-export i18n utilities\nimport { en as enShared, zhCN as zhCNShared } from '@incremark/shared'\nimport type { IncremarkLocale } from '@incremark/shared'\n\nexport { enShared as en, zhCNShared as zhCN }\nexport type { IncremarkLocale }\n"],"mappings":"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","names":["ref","shallowRef","computed","watch","toValue","ref","ref","blocks","references","seen","toValue","shallowRef","ref","computed","watch","render","computed","onUnmounted","ref","watch","computed","onUnmounted","createBlockTransformer","computed","ref","inject","inject","computed","computed","computed","computed","ref","watch","shallowRef","onUnmounted","IncremarkMath_default","_createCommentVNode","_openBlock","_Fragment","_createElementBlock","_toDisplayString","_createElementVNode","_hoisted_1","render","render","IncremarkHtmlElement_default","_renderList","_Fragment","_openBlock","_createElementBlock","_createCommentVNode","_toDisplayString","_createTextVNode","_createVNode","_createElementVNode","_resolveComponent","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","render","IncremarkInline_default","render","computed","_createVNode","_resolveDynamicComponent","_withCtx","_openBlock","_createBlock","render","render","IncremarkHeading_default","_createVNode","_openBlock","_createElementBlock","_hoisted_1","render","render","IncremarkParagraph_default","computed","computed","ref","onUnmounted","shallowRef","watch","_normalizeClass","_openBlock","_createElementBlock","_hoisted_1","render","render","SvgIcon_default","ref","shallowRef","computed","watch","onUnmounted","_createVNode","_createTextVNode","_createElementVNode","_createCommentVNode","_toDisplayString","_openBlock","_createElementBlock","_Fragment","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","_hoisted_10","_hoisted_12","render","render","IncremarkCodeMermaid_default","computed","ref","watch","LucideCopy","LucideCopyCheck","isClipboardAvailable","shallowRef","shallowRef","ref","watch","onUnmounted","ref","watch","render","onUnmounted","_resolveDynamicComponent","_openBlock","_createBlock","render","render","CachedCodeRenderer_default","ref","computed","watch","isClipboardAvailable","_toDisplayString","_createElementVNode","_createVNode","_createCommentVNode","_openBlock","_createBlock","_Fragment","_createElementBlock","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","render","render","IncremarkCodeDefault_default","computed","_createCommentVNode","_resolveDynamicComponent","_openBlock","_createBlock","_createVNode","_Fragment","_createElementBlock","render","render","IncremarkCode_default","computed","computed","_renderList","_Fragment","_openBlock","_createElementBlock","_createElementVNode","_createVNode","_createCommentVNode","_createBlock","_normalizeClass","_resolveDynamicComponent","_withCtx","_hoisted_1","_hoisted_2","_hoisted_3","render","render","IncremarkList_default","_renderList","_Fragment","_openBlock","_createElementBlock","_createVNode","_normalizeClass","_createCommentVNode","_createElementVNode","_hoisted_1","_hoisted_2","_hoisted_3","render","render","IncremarkTable_default","_renderList","_Fragment","_openBlock","_createElementBlock","_createBlock","_hoisted_1","render","render","IncremarkBlockquote_default","_openBlock","_createElementBlock","_hoisted_1","render","render","IncremarkThematicBreak_default","options","_createCommentVNode","_renderList","_Fragment","_openBlock","_createElementBlock","_createBlock","_resolveDynamicComponent","_withCtx","_normalizeClass","_createElementVNode","_hoisted_1","render","render","IncremarkContainer_default","_toDisplayString","_createElementVNode","_openBlock","_createElementBlock","_hoisted_1","_hoisted_2","render","render","IncremarkDefault_default","IncremarkHeading_default","IncremarkParagraph_default","IncremarkCode_default","IncremarkList_default","IncremarkTable_default","IncremarkBlockquote_default","IncremarkThematicBreak_default","IncremarkMath_default","IncremarkHtmlElement_default","IncremarkContainer_default","computed","IncremarkDefault_default","isHtmlNode","_createCommentVNode","_toDisplayString","_createElementVNode","_openBlock","_createElementBlock","_createVNode","_Fragment","_resolveDynamicComponent","_createBlock","_hoisted_1","render","IncremarkRenderer_default","render","computed","computed","_createElementVNode","_renderList","_Fragment","_openBlock","_createElementBlock","_createCommentVNode","_toDisplayString","_createBlock","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","render","render","IncremarkFootnotes_default","computed","_createCommentVNode","_renderList","_Fragment","_openBlock","_createElementBlock","_createVNode","_normalizeClass","_createBlock","_hoisted_1","render","render","Incremark_default","computed","watch","computed","render","watch","_openBlock","_createBlock","render","render","IncremarkContent_default","ref","onMounted","onUnmounted","_openBlock","_createElementBlock","render","render","AutoScrollContainer_default","ref","watch","_renderSlot","_normalizeClass","_openBlock","_createElementBlock","render","render","ThemeProvider_default","provide","ref","watch","zhCN","ref","zhCN","provide","watch","_renderSlot","render","render","ConfigProvider_default","BlockTransformer","createBlockTransformer","mathPlugin","defaultPlugins","applyTheme"]}
|
|
1
|
+
{"version":3,"sources":["../src/composables/useIncremark.ts","../src/composables/useProvideDefinations.ts","../src/composables/useTypewriter.ts","../src/utils/cursor.ts","../src/composables/useStreamRenderer.ts","../src/composables/useDevTools.ts","../src/composables/useBlockTransformer.ts","../src/composables/useLocale.ts","../src/composables/useDefinationsContext.ts","src/components/Incremark.vue","src/components/IncremarkRenderer.vue","src/components/IncremarkHeading.vue","src/components/IncremarkInline.vue","src/components/IncremarkMath.vue","sfc-template:/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkMath.vue?type=template","../src/components/IncremarkMath.vue","src/components/IncremarkHtmlElement.vue","sfc-template:/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkHtmlElement.vue?type=template","../src/components/IncremarkHtmlElement.vue","sfc-template:/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkInline.vue?type=template","../src/components/IncremarkInline.vue","sfc-template:/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkHeading.vue?type=template","../src/components/IncremarkHeading.vue","sfc-template:/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkParagraph.vue?type=template","../src/components/IncremarkParagraph.vue","src/components/IncremarkCode.vue","src/components/IncremarkCodeMermaid.vue","sfc-template:/Users/yishuai/develop/ai/markdown/packages/vue/src/components/SvgIcon.vue?type=template","../src/components/SvgIcon.vue","sfc-template:/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkCodeMermaid.vue?type=template","../src/components/IncremarkCodeMermaid.vue","src/components/IncremarkCodeDefault.vue","../src/composables/useShiki.ts","src/components/CachedCodeRenderer.vue","../../../node_modules/.pnpm/@shikijs+vscode-textmate@10.0.2/node_modules/@shikijs/vscode-textmate/dist/index.js","../../../node_modules/.pnpm/@shikijs+core@3.21.0/node_modules/@shikijs/core/dist/index.mjs","sfc-template:/Users/yishuai/develop/ai/markdown/packages/vue/src/components/CachedCodeRenderer.vue?type=template","../src/components/CachedCodeRenderer.vue","sfc-template:/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkCodeDefault.vue?type=template","../src/components/IncremarkCodeDefault.vue","sfc-template:/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkCode.vue?type=template","../src/components/IncremarkCode.vue","src/components/IncremarkList.vue","sfc-template:/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkList.vue?type=template","../src/components/IncremarkList.vue","src/components/IncremarkTable.vue","sfc-template:/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkTable.vue?type=template","../src/components/IncremarkTable.vue","sfc-template:/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkBlockquote.vue?type=template","../src/components/IncremarkBlockquote.vue","sfc-template:/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkThematicBreak.vue?type=template","../src/components/IncremarkThematicBreak.vue","src/components/IncremarkContainer.vue","sfc-template:/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkContainer.vue?type=template","../src/components/IncremarkContainer.vue","sfc-template:/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkDefault.vue?type=template","../src/components/IncremarkDefault.vue","sfc-template:/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkRenderer.vue?type=template","../src/components/IncremarkRenderer.vue","src/components/IncremarkFootnotes.vue","sfc-template:/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkFootnotes.vue?type=template","../src/components/IncremarkFootnotes.vue","sfc-template:/Users/yishuai/develop/ai/markdown/packages/vue/src/components/Incremark.vue?type=template","../src/components/Incremark.vue","src/components/IncremarkContent.vue","sfc-template:/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkContent.vue?type=template","../src/components/IncremarkContent.vue","src/components/AutoScrollContainer.vue","sfc-template:/Users/yishuai/develop/ai/markdown/packages/vue/src/components/AutoScrollContainer.vue?type=template","../src/components/AutoScrollContainer.vue","src/ThemeProvider.vue","sfc-template:/Users/yishuai/develop/ai/markdown/packages/vue/src/ThemeProvider.vue?type=template","../src/ThemeProvider.vue","src/components/ConfigProvider.vue","sfc-template:/Users/yishuai/develop/ai/markdown/packages/vue/src/components/ConfigProvider.vue?type=template","../src/components/ConfigProvider.vue","../src/index.ts"],"sourcesContent":["import { ref, shallowRef, computed, markRaw, watch, toValue, type ComputedRef, type MaybeRefOrGetter } from 'vue'\nimport {\n createIncremarkParser,\n type IncremarkParserOptions,\n type ParsedBlock,\n type IncrementalUpdate,\n type Root,\n type TransformerPlugin,\n type AnimationEffect\n} from '@incremark/core'\nimport { useProvideDefinations } from './useProvideDefinations'\nimport { useTypewriter } from './useTypewriter'\n\n/** 打字机效果配置 */\nexport interface TypewriterOptions {\n /** 是否启用打字机效果(可响应式切换) */\n enabled?: boolean\n /** 每次显示的字符数,可以是固定值或范围 [min, max] */\n charsPerTick?: number | [number, number]\n /** 更新间隔 (ms) */\n tickInterval?: number\n /** 动画效果: 'none' | 'fade-in' | 'typing' */\n effect?: AnimationEffect\n /** 光标字符(仅 typing 效果使用) */\n cursor?: string\n /** 页面不可见时暂停 */\n pauseOnHidden?: boolean\n /** 自定义插件 */\n plugins?: TransformerPlugin[]\n}\n\nexport interface UseIncremarkOptions extends IncremarkParserOptions {\n /** 打字机配置,传入即创建 transformer(可通过 enabled 控制是否启用) */\n typewriter?: TypewriterOptions\n}\n\n/** 打字机控制对象 */\nexport interface TypewriterControls {\n /** 是否启用(只读) */\n enabled: ComputedRef<boolean>\n /** 设置是否启用 */\n setEnabled: (enabled: boolean) => void\n /** 是否正在处理中 */\n isProcessing: ComputedRef<boolean>\n /** 是否已暂停 */\n isPaused: ComputedRef<boolean>\n /** 当前动画效果 */\n effect: ComputedRef<AnimationEffect>\n /** 跳过动画,直接显示全部 */\n skip: () => void\n /** 暂停动画 */\n pause: () => void\n /** 恢复动画 */\n resume: () => void\n /** 动态更新配置 */\n setOptions: (options: Partial<TypewriterOptions>) => void\n}\n\n/** useIncremark 的返回类型 */\nexport type UseIncremarkReturn = ReturnType<typeof useIncremark>\n\n/**\n * Vue 3 Composable: Incremark 流式 Markdown 解析器\n *\n * @example\n * ```vue\n * <script setup>\n * import { useIncremark, Incremark } from '@incremark/vue'\n *\n * // 基础用法\n * const { blocks, append, finalize } = useIncremark()\n *\n * // 启用打字机效果\n * const { blocks, append, finalize, typewriter } = useIncremark({\n * typewriter: {\n * enabled: true, // 可响应式切换\n * charsPerTick: [1, 3],\n * tickInterval: 30,\n * effect: 'typing',\n * cursor: '|'\n * }\n * })\n *\n * // 动态切换打字机效果\n * typewriter.enabled.value = false\n * </script>\n *\n * <template>\n * <Incremark :blocks=\"blocks\" />\n * <button v-if=\"typewriter.isProcessing.value\" @click=\"typewriter.skip\">跳过</button>\n * </template>\n * ```\n */\nexport function useIncremark(optionsInput: MaybeRefOrGetter<UseIncremarkOptions> = {}) {\n // 内部自动提供 definitions context\n const { setDefinations, setFootnoteDefinitions, setFootnoteReferenceOrder } = useProvideDefinations()\n\n // 创建解析器的工厂函数\n function createParser(options: UseIncremarkOptions) {\n return createIncremarkParser({\n ...options,\n onChange: (state) => {\n setDefinations(state.definitions)\n setFootnoteDefinitions(state.footnoteDefinitions)\n options.onChange?.(state)\n }\n })\n }\n\n // 解析器\n let parser = createParser(toValue(optionsInput))\n\n const completedBlocks = shallowRef<ParsedBlock[]>([])\n const pendingBlocks = shallowRef<ParsedBlock[]>([])\n const isLoading = ref(false)\n const markdown = ref('')\n const isFinalized = ref(false)\n const footnoteReferenceOrder = ref<string[]>([])\n\n // 使用 useTypewriter composable 管理打字机效果\n // 传入响应式的 typewriter 配置,让 useTypewriter 内部监听变化\n const { blocks, typewriter, transformer, isAnimationComplete, displayedFootnoteReferenceOrder } = useTypewriter({\n typewriter: () => toValue(optionsInput).typewriter,\n completedBlocks,\n pendingBlocks\n })\n\n // 内容是否完全显示完成\n // 如果没有配置打字机或未启用打字机:解析完成即显示完成\n // 如果启用打字机:解析完成 + 动画完成\n const isDisplayComplete = computed(() => {\n // 没有配置打字机,或者打字机未启用:只需判断是否 finalized\n if (!toValue(optionsInput).typewriter || !typewriter.enabled.value) {\n return isFinalized.value\n }\n // 启用了打字机:需要 finalize + 动画完成\n return isFinalized.value && isAnimationComplete.value\n })\n\n // AST\n const ast = ref<Root>({\n type: 'root',\n children: []\n })\n\n /**\n * 处理解析器更新结果(统一 append 和 finalize 的更新逻辑)\n */\n function handleUpdate(update: IncrementalUpdate, isFinalize: boolean = false): void {\n markdown.value = parser.getBuffer()\n\n // 处理被更新的 blocks(需要移除的旧 blocks)\n if (update.updated.length > 0) {\n const idsToRemove = new Set(update.updated.map(b => b.id))\n completedBlocks.value = completedBlocks.value.filter(b => !idsToRemove.has(b.id))\n }\n\n if (update.completed.length > 0) {\n completedBlocks.value.push(...update.completed.map((b) => markRaw(b)))\n }\n pendingBlocks.value = update.pending.map((b) => markRaw(b))\n\n if (isFinalize) {\n // 如果还有 pending blocks,则将它们添加到 completed blocks 中\n if (pendingBlocks.value.length) {\n completedBlocks.value.push(...pendingBlocks.value.map((b) => markRaw(b)))\n pendingBlocks.value = []\n }\n isLoading.value = false\n isFinalized.value = true\n } else {\n isLoading.value = true\n }\n\n // 更新脚注引用顺序(解析器的完整顺序)\n footnoteReferenceOrder.value = update.footnoteReferenceOrder\n // 注意:这里不再直接调用 setFootnoteReferenceOrder\n // 脚注显示顺序由下面的 watch 根据打字机状态来控制\n }\n\n function append(chunk: string): IncrementalUpdate {\n const update = parser.append(chunk)\n ast.value = update.ast\n handleUpdate(update, false)\n return update\n }\n\n function finalize(): IncrementalUpdate {\n const update = parser.finalize()\n handleUpdate(update, true)\n return update\n }\n\n function abort(): IncrementalUpdate {\n return finalize()\n }\n\n function reset(): void {\n parser.reset()\n completedBlocks.value = []\n pendingBlocks.value = []\n markdown.value = ''\n isLoading.value = false\n isFinalized.value = false\n footnoteReferenceOrder.value = []\n\n // 重置 transformer\n transformer?.reset()\n }\n\n // 监听 parser 相关 options 变化,动态更新配置(排除 typewriter 配置)\n // 使用 JSON.stringify 比较,避免 deep watch 对新对象的误触发\n // 注意:astBuilder 是类,需要单独处理\n watch(\n () => {\n const opts = toValue(optionsInput)\n const { typewriter: _, astBuilder, ...parserOptions } = opts\n // astBuilder 用名称标识,因为它是类不能 JSON.stringify\n return JSON.stringify(parserOptions) + '|' + (astBuilder?.name ?? 'default')\n },\n () => {\n // 使用 updateOptions 动态更新配置(包括引擎切换),不需要重建 parser\n const opts = toValue(optionsInput)\n const { typewriter: _, ...parserOptions } = opts\n parser.updateOptions(parserOptions)\n // 同步 Vue 状态\n completedBlocks.value = []\n pendingBlocks.value = []\n markdown.value = ''\n isLoading.value = false\n isFinalized.value = false\n footnoteReferenceOrder.value = []\n transformer?.reset()\n }\n )\n\n // 监听打字机的 displayedFootnoteReferenceOrder 变化,更新脚注显示\n // 这确保脚注只在引用所在的 block 动画完成后才显示\n watch(\n displayedFootnoteReferenceOrder,\n (newOrder) => {\n setFootnoteReferenceOrder(newOrder)\n },\n { immediate: true }\n )\n\n function render(content: string): IncrementalUpdate {\n const update = parser.render(content)\n\n markdown.value = parser.getBuffer()\n completedBlocks.value = parser.getCompletedBlocks().map(b => markRaw(b))\n pendingBlocks.value = []\n isLoading.value = false\n isFinalized.value = true\n footnoteReferenceOrder.value = update.footnoteReferenceOrder\n // render 是一次性渲染,不经过打字机,直接设置脚注顺序\n setFootnoteReferenceOrder(update.footnoteReferenceOrder)\n\n return update\n }\n\n const result = {\n /** 已收集的完整 Markdown 字符串 */\n markdown,\n /** 已完成的块列表 */\n completedBlocks,\n /** 待处理的块列表 */\n pendingBlocks,\n /** 当前完整的 AST */\n ast,\n /** 用于渲染的 blocks(根据打字机设置自动处理) */\n blocks,\n /** 是否正在加载 */\n isLoading,\n /** 是否已完成(finalize) */\n isFinalized,\n /**\n * 内容是否完全显示完成\n * - 无打字机:等于 isFinalized\n * - 有打字机:isFinalized + 动画播放完成\n * 适用于控制 footnote 等需要在内容完全显示后才出现的元素\n */\n isDisplayComplete,\n /** 脚注引用的出现顺序 */\n footnoteReferenceOrder,\n /** 追加内容 */\n append,\n /** 完成解析 */\n finalize,\n /** 强制中断 */\n abort,\n /** 重置解析器和打字机 */\n reset,\n /** 一次性渲染(reset + append + finalize) */\n render,\n /** 解析器实例 */\n parser,\n /** 打字机控制 */\n typewriter\n }\n\n return result as any\n}\n","import { ref, provide, type InjectionKey, type Ref } from 'vue';\nimport type { Definition, FootnoteDefinition } from 'mdast';\n\nexport const definationsInjectionKey: InjectionKey<{\n definations: Ref<Record<string, Definition>>\n footnoteDefinitions: Ref<Record<string, FootnoteDefinition>>\n footnoteReferenceOrder: Ref<string[]>\n}> = Symbol('provideDefinations');\n\nexport function useProvideDefinations() {\n const definations = ref<Record<string, Definition>>({});\n const footnoteDefinitions = ref<Record<string, FootnoteDefinition>>({});\n const footnoteReferenceOrder = ref<string[]>([]);\n\n provide(definationsInjectionKey, {\n definations,\n footnoteDefinitions,\n footnoteReferenceOrder\n });\n\n function setDefinations(definitions: Record<string, Definition>) {\n definations.value = definitions;\n }\n\n function setFootnoteDefinitions(definitions: Record<string, FootnoteDefinition>) {\n footnoteDefinitions.value = definitions;\n }\n\n function setFootnoteReferenceOrder(order: string[]) {\n footnoteReferenceOrder.value = order;\n }\n\n function clearDefinations() {\n definations.value = {};\n }\n\n function clearFootnoteDefinitions() {\n footnoteDefinitions.value = {};\n }\n\n function clearFootnoteReferenceOrder() {\n footnoteReferenceOrder.value = [];\n }\n\n function clearAllDefinations() {\n clearDefinations();\n clearFootnoteDefinitions();\n clearFootnoteReferenceOrder();\n }\n\n return {\n setDefinations,\n setFootnoteDefinitions,\n setFootnoteReferenceOrder,\n clearDefinations,\n clearFootnoteDefinitions,\n clearFootnoteReferenceOrder,\n clearAllDefinations\n }\n\n}","/**\n * @file useTypewriter Composable - 打字机效果管理\n *\n * @description\n * 管理打字机效果的状态和控制逻辑,从 useIncremark 中拆分出来以简化代码。\n *\n * @author Incremark Team\n * @license MIT\n */\n\nimport { ref, shallowRef, computed, watch, toValue, onUnmounted, type Ref, type ComputedRef, type MaybeRefOrGetter } from 'vue'\nimport {\n createBlockTransformer,\n defaultPlugins,\n mathPlugin,\n collectFootnoteReferences,\n type RootContent,\n type ParsedBlock,\n type DisplayBlock,\n type AnimationEffect,\n type BlockTransformer\n} from '@incremark/core'\nimport type { TypewriterOptions, TypewriterControls } from './useIncremark'\nimport { addCursorToNode } from '../utils/cursor'\n\nexport interface UseTypewriterOptions {\n typewriter: MaybeRefOrGetter<TypewriterOptions | undefined>\n completedBlocks: Ref<ParsedBlock[]>\n pendingBlocks: Ref<ParsedBlock[]>\n}\n\nexport interface UseTypewriterReturn {\n /** 用于渲染的 blocks(经过打字机处理或原始blocks) */\n blocks: ComputedRef<Array<ParsedBlock & { isLastPending?: boolean }>>\n /** 打字机控制对象 */\n typewriter: TypewriterControls\n /** transformer 实例 */\n transformer: BlockTransformer<RootContent> | null\n /** 所有动画是否已完成(队列为空且没有正在处理的 block) */\n isAnimationComplete: Ref<boolean>\n /**\n * 脚注引用顺序(所有动画完成后才返回)\n * 用于控制脚注的显示时机:只有当所有 blocks 的打字机动画都完成后才显示脚注\n * 动画进行中时返回空数组\n */\n displayedFootnoteReferenceOrder: ComputedRef<string[]>\n}\n\n/**\n * useTypewriter Composable\n *\n * @description\n * 管理打字机效果的所有状态和逻辑。\n *\n * @param options - 打字机配置和数据\n * @returns 打字机状态和控制对象\n */\nexport function useTypewriter(options: UseTypewriterOptions): UseTypewriterReturn {\n const { typewriter: typewriterInput, completedBlocks, pendingBlocks } = options\n\n // 获取初始配置\n const initialConfig = toValue(typewriterInput)\n\n // 打字机状态\n const typewriterEnabled = ref(initialConfig?.enabled ?? !!initialConfig)\n const displayBlocksRef = shallowRef<DisplayBlock<RootContent>[]>([])\n const isTypewriterProcessing = ref(false)\n const isTypewriterPaused = ref(false)\n const typewriterEffect = ref<AnimationEffect>(initialConfig?.effect ?? 'none')\n const typewriterCursor = ref(initialConfig?.cursor ?? '|')\n const isAnimationComplete = ref(true) // 初始为 true(没有动画时视为完成)\n\n // 创建 transformer(如果有 typewriter 配置)\n let transformer: BlockTransformer<RootContent> | null = null\n\n if (initialConfig) {\n transformer = createBlockTransformer<RootContent>({\n charsPerTick: initialConfig.charsPerTick ?? [1, 3],\n tickInterval: initialConfig.tickInterval ?? 30,\n effect: initialConfig.effect ?? 'none',\n pauseOnHidden: initialConfig.pauseOnHidden ?? true,\n // 默认插件 + 数学公式插件(数学公式应该整体显示,不参与打字机逐字符效果)\n plugins: initialConfig.plugins ?? [...defaultPlugins, mathPlugin],\n onChange: (blocks) => {\n // console.log('onChange',blocks)\n displayBlocksRef.value = blocks as DisplayBlock<RootContent>[]\n isTypewriterProcessing.value = transformer?.isProcessing() ?? false\n isTypewriterPaused.value = transformer?.isPausedState() ?? false\n },\n onAllComplete: () => {\n // 所有动画完成\n isAnimationComplete.value = true\n }\n })\n }\n\n // 监听配置变化,更新 transformer\n watch(\n () => toValue(typewriterInput),\n (newConfig) => {\n if (!newConfig) return\n\n // 更新本地状态\n if (newConfig.enabled !== undefined) {\n typewriterEnabled.value = newConfig.enabled\n }\n if (newConfig.effect !== undefined) {\n typewriterEffect.value = newConfig.effect\n }\n if (newConfig.cursor !== undefined) {\n typewriterCursor.value = newConfig.cursor\n }\n\n // 更新 transformer 配置\n transformer?.setOptions({\n charsPerTick: newConfig.charsPerTick,\n tickInterval: newConfig.tickInterval,\n effect: newConfig.effect,\n pauseOnHidden: newConfig.pauseOnHidden\n })\n },\n { deep: true }\n )\n\n // 监听 blocks 变化,推送给 transformer\n // transformer.push() 会自动检测并更新已存在 blocks 的内容变化\n if (transformer) {\n watch(\n [completedBlocks, pendingBlocks],\n () => {\n // 直接传递原始 block 引用\n // ParsedBlock 的结构(id, node, status)已经兼容 SourceBlock\n const allBlocks = [...completedBlocks.value, ...pendingBlocks.value] as any\n transformer!.push(allBlocks)\n },\n { immediate: true }\n )\n }\n\n // 原始 blocks(不经过打字机)\n const rawBlocks = computed(() => {\n return [...completedBlocks.value, ...pendingBlocks.value]\n })\n\n // 最终用于渲染的 blocks\n const blocks = computed(() => {\n // 未启用打字机或没有 transformer:返回原始 blocks\n if (!typewriterEnabled.value || !transformer) {\n return rawBlocks.value\n }\n\n // 启用打字机:使用 displayBlocks\n return displayBlocksRef.value.map((db, index) => {\n const isPending = !db.isDisplayComplete\n const isLastPending = isPending && index === displayBlocksRef.value.length - 1\n\n // typing 效果时添加光标\n let node = db.displayNode\n if (typewriterEffect.value === 'typing' && isLastPending) {\n node = addCursorToNode(db.displayNode, typewriterCursor.value)\n }\n\n return {\n id: db.id,\n status: db.status,\n node,\n // 这些字段在打字机模式下没有意义,设为默认值以满足类型要求\n startOffset: 0,\n endOffset: 0,\n rawText: '',\n isLastPending\n }\n })\n })\n\n /**\n * 脚注引用顺序(所有动画完成后才返回)\n * 用于控制脚注的显示时机:只有当所有 blocks 的打字机动画都完成后才显示脚注\n */\n const displayedFootnoteReferenceOrder = computed(() => {\n // 未启用打字机:返回所有脚注引用(从原始 blocks 中提取)\n if (!typewriterEnabled.value || !transformer) {\n const references: string[] = []\n const seen = new Set<string>()\n for (const block of rawBlocks.value) {\n const blockRefs = collectFootnoteReferences(block.node)\n for (const ref of blockRefs) {\n if (!seen.has(ref)) {\n seen.add(ref)\n references.push(ref)\n }\n }\n }\n return references\n }\n\n // 启用打字机:只有所有动画完成后才返回脚注引用\n // 如果还有动画在进行中,返回空数组\n if (!isAnimationComplete.value) {\n return []\n }\n\n // 所有动画完成,返回全部脚注引用\n const references: string[] = []\n const seen = new Set<string>()\n for (const db of displayBlocksRef.value) {\n const blockRefs = collectFootnoteReferences(db.displayNode)\n for (const ref of blockRefs) {\n if (!seen.has(ref)) {\n seen.add(ref)\n references.push(ref)\n }\n }\n }\n return references\n })\n\n // 打字机控制对象\n const typewriterControls: TypewriterControls = {\n enabled: computed(() => typewriterEnabled.value),\n setEnabled: (value: boolean) => {\n typewriterEnabled.value = value\n },\n isProcessing: computed(() => isTypewriterProcessing.value),\n isPaused: computed(() => isTypewriterPaused.value),\n effect: computed(() => typewriterEffect.value),\n skip: () => transformer?.skip(),\n pause: () => {\n transformer?.pause()\n isTypewriterPaused.value = true\n },\n resume: () => {\n transformer?.resume()\n isTypewriterPaused.value = false\n },\n setOptions: (opts) => {\n if (opts.enabled !== undefined) {\n typewriterEnabled.value = opts.enabled\n }\n if (opts.charsPerTick !== undefined || opts.tickInterval !== undefined || opts.effect !== undefined || opts.pauseOnHidden !== undefined) {\n transformer?.setOptions({\n charsPerTick: opts.charsPerTick,\n tickInterval: opts.tickInterval,\n effect: opts.effect,\n pauseOnHidden: opts.pauseOnHidden\n })\n }\n if (opts.effect !== undefined) {\n typewriterEffect.value = opts.effect\n }\n if (opts.cursor !== undefined) {\n typewriterCursor.value = opts.cursor\n }\n }\n }\n\n // 清理\n onUnmounted(() => {\n transformer?.destroy()\n })\n\n return {\n blocks,\n typewriter: typewriterControls,\n transformer,\n isAnimationComplete,\n displayedFootnoteReferenceOrder\n }\n}\n","/**\n * @file Cursor Utils - 光标工具函数\n *\n * @description\n * 用于在 AST 节点末尾添加光标的工具函数。\n *\n * @author Incremark Team\n * @license MIT\n */\n\nimport type { RootContent } from '@incremark/core'\n\n/**\n * 在节点末尾添加光标\n *\n * @param node - 要添加光标的节点\n * @param cursor - 光标字符\n * @returns 添加了光标的新节点\n */\nexport function addCursorToNode(node: RootContent, cursor: string): RootContent {\n // 代码块不应该添加光标(会破坏代码高亮)\n if (node.type === 'code') {\n return node\n }\n\n const cloned = JSON.parse(JSON.stringify(node))\n\n function addToLast(n: { children?: unknown[]; type?: string; value?: string }): boolean {\n // 跳过代码块\n if (n.type === 'code') {\n return false\n }\n\n if (n.children && n.children.length > 0) {\n for (let i = n.children.length - 1; i >= 0; i--) {\n if (addToLast(n.children[i] as { children?: unknown[]; type?: string; value?: string })) {\n return true\n }\n }\n n.children.push({ type: 'text', value: cursor })\n return true\n }\n if (n.type === 'text' && typeof n.value === 'string') {\n n.value += cursor\n return true\n }\n if (typeof n.value === 'string') {\n n.value += cursor\n return true\n }\n return false\n }\n\n addToLast(cloned)\n return cloned\n}\n","import { computed, type Ref, type ComputedRef } from 'vue'\nimport type { ParsedBlock } from '@incremark/core'\n\nexport interface UseStreamRendererOptions {\n /** 已完成的块 */\n completedBlocks: Ref<ParsedBlock[]>\n /** 待处理的块 */\n pendingBlocks: Ref<ParsedBlock[]>\n}\n\nexport interface UseStreamRendererReturn {\n /** 已完成的块 */\n completedBlocks: ComputedRef<ParsedBlock[]>\n /** 待处理的块 */\n pendingBlocks: ComputedRef<ParsedBlock[]>\n /** 所有块 */\n allBlocks: ComputedRef<ParsedBlock[]>\n}\n\n/**\n * Vue 3 Composable: 流式渲染辅助\n *\n * 直接使用 block.id 作为稳定的渲染 key\n */\nexport function useStreamRenderer(options: UseStreamRendererOptions): UseStreamRendererReturn {\n const { completedBlocks, pendingBlocks } = options\n\n const completedBlocksComputed = computed<ParsedBlock[]>(() => completedBlocks.value)\n const pendingBlocksComputed = computed<ParsedBlock[]>(() => pendingBlocks.value)\n const allBlocks = computed(() => [...completedBlocksComputed.value, ...pendingBlocksComputed.value])\n\n return {\n completedBlocks: completedBlocksComputed,\n pendingBlocks: pendingBlocksComputed,\n allBlocks\n }\n}\n\n","import { onMounted, onUnmounted } from 'vue'\nimport { createDevTools, type DevToolsOptions } from '@incremark/devtools'\nimport type { UseIncremarkReturn } from './useIncremark'\n\nexport interface UseDevToolsOptions extends DevToolsOptions {}\n\n/**\n * Vue 3 DevTools 一行接入\n *\n * @example\n * ```vue\n * <script setup>\n * import { useIncremark, useDevTools } from '@incremark/vue'\n *\n * const incremark = useIncremark()\n * useDevTools(incremark) // 就这一行!\n * </script>\n * ```\n */\nexport function useDevTools(\n incremark: UseIncremarkReturn,\n options: UseDevToolsOptions = {}\n) {\n const devtools = createDevTools(options)\n\n // 设置 parser 的 onChange 回调\n incremark.parser.setOnChange((state: any) => {\n const blocks = [\n ...state.completedBlocks,\n ...state.pendingBlocks\n ]\n\n devtools.update({\n blocks,\n completedBlocks: state.completedBlocks,\n pendingBlocks: state.pendingBlocks,\n markdown: state.markdown,\n ast: state.ast,\n isLoading: state.pendingBlocks.length > 0\n })\n })\n\n onMounted(() => {\n devtools.mount()\n })\n\n onUnmounted(() => {\n devtools.unmount()\n // 清理回调\n incremark.parser.setOnChange(undefined)\n })\n\n return devtools\n}\n","import { ref, watch, computed, onUnmounted, type Ref, type ComputedRef } from 'vue'\nimport {\n BlockTransformer,\n createBlockTransformer,\n type TransformerOptions,\n type DisplayBlock,\n type SourceBlock,\n type AnimationEffect\n} from '@incremark/core'\n\nexport interface UseBlockTransformerOptions extends Omit<TransformerOptions, 'onChange'> {}\n\nexport interface UseBlockTransformerReturn<T = unknown> {\n /** 用于渲染的 display blocks */\n displayBlocks: ComputedRef<DisplayBlock<T>[]>\n /** 是否正在处理中 */\n isProcessing: ComputedRef<boolean>\n /** 是否已暂停 */\n isPaused: ComputedRef<boolean>\n /** 当前动画效果 */\n effect: ComputedRef<AnimationEffect>\n /** 跳过所有动画 */\n skip: () => void\n /** 重置状态 */\n reset: () => void\n /** 暂停动画 */\n pause: () => void\n /** 恢复动画 */\n resume: () => void\n /** 动态更新配置 */\n setOptions: (options: Partial<Pick<TransformerOptions, 'charsPerTick' | 'tickInterval' | 'effect' | 'pauseOnHidden'>>) => void\n /** transformer 实例(用于高级用法) */\n transformer: BlockTransformer<T>\n}\n\n/**\n * Vue 3 Composable: Block Transformer\n *\n * 用于控制 blocks 的逐步显示(打字机效果)\n * 作为解析器和渲染器之间的中间层\n *\n * 特性:\n * - 使用 requestAnimationFrame 实现流畅动画\n * - 支持随机步长 `charsPerTick: [1, 3]`\n * - 支持动画效果 `effect: 'typing'`\n * - 页面不可见时自动暂停\n *\n * @example\n * ```vue\n * <script setup>\n * import { useIncremark, useBlockTransformer, defaultPlugins } from '@incremark/vue'\n *\n * const { blocks, completedBlocks, append, finalize } = useIncremark()\n *\n * // 使用 completedBlocks 作为输入(ID 稳定)\n * const sourceBlocks = computed(() => completedBlocks.value.map(b => ({\n * id: b.id,\n * node: b.node,\n * status: b.status\n * })))\n *\n * // 添加打字机效果\n * const { displayBlocks, isProcessing, skip, effect } = useBlockTransformer(sourceBlocks, {\n * charsPerTick: [1, 3], // 随机步长\n * tickInterval: 30,\n * effect: 'typing', // 光标效果\n * plugins: defaultPlugins\n * })\n * </script>\n *\n * <template>\n * <Incremark :blocks=\"displayBlocks\" :class=\"{ 'typing': effect === 'typing' }\" />\n * <button v-if=\"isProcessing\" @click=\"skip\">跳过</button>\n * </template>\n * ```\n */\nexport function useBlockTransformer<T = unknown>(\n sourceBlocks: Ref<SourceBlock<T>[]> | ComputedRef<SourceBlock<T>[]>,\n options: UseBlockTransformerOptions = {}\n): UseBlockTransformerReturn<T> {\n const displayBlocksRef = ref<DisplayBlock<T>[]>([])\n const isProcessingRef = ref(false)\n const isPausedRef = ref(false)\n const effectRef = ref<AnimationEffect>(options.effect ?? 'none')\n\n const transformer = createBlockTransformer<T>({\n ...options,\n onChange: (blocks) => {\n displayBlocksRef.value = blocks as DisplayBlock<T>[]\n isProcessingRef.value = transformer.isProcessing()\n isPausedRef.value = transformer.isPausedState()\n }\n })\n\n // 监听源 blocks 变化\n watch(\n sourceBlocks,\n (blocks) => {\n // 推入新 blocks\n transformer.push(blocks)\n\n // 处理正在显示的 block 内容更新\n const currentDisplaying = displayBlocksRef.value.find((b) => !b.isDisplayComplete)\n if (currentDisplaying) {\n const updated = blocks.find((b) => b.id === currentDisplaying.id)\n if (updated) {\n transformer.update(updated)\n }\n }\n },\n { immediate: true, deep: true }\n )\n\n onUnmounted(() => {\n transformer.destroy()\n })\n\n return {\n displayBlocks: computed(() => displayBlocksRef.value) as ComputedRef<DisplayBlock<T>[]>,\n isProcessing: computed(() => isProcessingRef.value),\n isPaused: computed(() => isPausedRef.value),\n effect: computed(() => effectRef.value),\n skip: () => transformer.skip(),\n reset: () => transformer.reset(),\n pause: () => {\n transformer.pause()\n isPausedRef.value = true\n },\n resume: () => {\n transformer.resume()\n isPausedRef.value = false\n },\n setOptions: (opts) => {\n transformer.setOptions(opts)\n if (opts.effect !== undefined) {\n effectRef.value = opts.effect\n }\n },\n transformer\n }\n}\n","import { inject, computed, ref, type Ref, type ComputedRef, type InjectionKey } from 'vue'\nimport type { IncremarkLocale } from '@incremark/shared'\nimport { zhCN } from '@incremark/shared'\n\n/**\n * Locale 注入 key,用于 provide/inject\n */\nconst LOCALE_KEY: InjectionKey<Ref<IncremarkLocale>> = Symbol('incremark-locale')\n\n/**\n * Vue 国际化 Hook\n */\nexport interface UseLocaleReturn {\n /** 翻译函数 */\n t: ComputedRef<(key: string) => string>\n}\n\n/**\n * 使用 locale\n */\nexport function useLocale(): UseLocaleReturn {\n // 使用 inject 的默认值,如果没有 provider 则使用中文\n const locale = inject(LOCALE_KEY, ref(zhCN))\n\n const t = computed(() => (key: string) => {\n const keys = key.split('.')\n let value: any = locale.value\n for (const k of keys) {\n value = value?.[k]\n }\n return value || key\n })\n\n return { t }\n}\n\n/**\n * 提供 locale 的 key(用于 ConfigProvider)\n */\nexport { LOCALE_KEY }\n","import { inject } from 'vue'\nimport { definationsInjectionKey } from './useProvideDefinations'\n\n/**\n * support definations and footnoteDefinitions\n * @returns \n */\nexport function useDefinationsContext() {\n const definationContext = inject(definationsInjectionKey);\n\n if (!definationContext) {\n throw new Error('definationContext not found');\n }\n\n return definationContext;\n}","<script setup lang=\"ts\">\nimport { computed, type Component } from 'vue'\nimport type { ParsedBlock } from '@incremark/core'\nimport { useDefinationsContext } from '../composables/useDefinationsContext'\nimport type { UseIncremarkReturn } from '../composables/useIncremark'\nimport IncremarkRenderer from './IncremarkRenderer.vue'\nimport IncremarkFootnotes from './IncremarkFootnotes.vue'\n\n// 组件映射类型\nexport type ComponentMap = Partial<Record<string, Component>>\n\n// 可渲染的块类型(带 isLastPending 字段用于打字机光标)\nexport type RenderableBlock = ParsedBlock & { isLastPending?: boolean }\n\n/**\n * 代码块配置\n */\nexport interface CodeBlockConfig {\n /** 是否从一开始就接管渲染,而不是等到 completed 状态 */\n takeOver?: boolean\n}\n\nconst props = withDefaults(\n defineProps<{\n /** 要渲染的块列表(来自 useIncremark 的 blocks) */\n blocks?: RenderableBlock[]\n /** 内容是否完全显示完成(用于控制脚注等需要在内容完全显示后才出现的元素)\n * 如果传入了 incremark,则会自动使用 incremark.isDisplayComplete,此 prop 被忽略 */\n isDisplayComplete?: boolean\n /** 自定义组件映射,key 为节点类型 */\n components?: ComponentMap\n /** 自定义容器组件映射,key 为容器名称(如 'warning', 'info') */\n customContainers?: Record<string, Component>\n /** 自定义代码块组件映射,key 为代码语言名称(如 'echart', 'mermaid') */\n customCodeBlocks?: Record<string, Component>\n /** 代码块配置映射,key 为代码语言名称 */\n codeBlockConfigs?: Record<string, CodeBlockConfig>\n /** 待处理块的样式类名 */\n pendingClass?: string\n /** 已完成块的样式类名 */\n completedClass?: string\n /** 是否显示块状态边框 */\n showBlockStatus?: boolean\n /** 可选:useIncremark 返回的对象(用于自动注入数据) */\n incremark?: UseIncremarkReturn\n }>(),\n {\n blocks: () => [],\n isDisplayComplete: false,\n components: () => ({}),\n customContainers: () => ({}),\n customCodeBlocks: () => ({}),\n codeBlockConfigs: () => ({}),\n pendingClass: 'incremark-pending',\n completedClass: 'incremark-completed',\n showBlockStatus: false\n }\n)\n\nconst {\n footnoteReferenceOrder\n} = useDefinationsContext();\n\n// 计算实际使用的 blocks 和 isDisplayComplete\nconst actualBlocks = computed<RenderableBlock[]>(() => props.incremark?.blocks.value || props.blocks || [])\nconst actualIsDisplayComplete = computed(() => {\n // 优先使用 incremark 提供的 isDisplayComplete(已考虑打字机等状态)\n if (props.incremark) {\n return props.incremark.isDisplayComplete.value\n }\n // 否则使用用户传入的 isDisplayComplete\n return props.isDisplayComplete\n})\n\n</script>\n\n<template>\n <div class=\"incremark\">\n <!-- 主要内容块 -->\n <template v-for=\"block in actualBlocks\">\n <div\n v-if=\"block.node.type !== 'definition' && block.node.type !== 'footnoteDefinition'\"\n :key=\"block.id\"\n :class=\"[\n 'incremark-block',\n block.status === 'completed' ? completedClass : pendingClass,\n { 'incremark-show-status': showBlockStatus },\n { 'incremark-last-pending': block.isLastPending }\n ]\"\n >\n <IncremarkRenderer\n :node=\"block.node\"\n :block-status=\"block.status\"\n :custom-containers=\"customContainers\"\n :custom-code-blocks=\"customCodeBlocks\"\n :code-block-configs=\"codeBlockConfigs\"\n :components=\"components\"\n />\n </div>\n </template>\n\n <!-- 脚注列表(仅在内容完全显示后显示) -->\n <IncremarkFootnotes\n v-if=\"actualIsDisplayComplete && footnoteReferenceOrder.length > 0\"\n />\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport type { RootContent, HTML, Code } from 'mdast'\nimport type { Component } from 'vue'\nimport { computed } from 'vue'\nimport IncremarkHeading from './IncremarkHeading.vue'\nimport IncremarkParagraph from './IncremarkParagraph.vue'\nimport IncremarkCode from './IncremarkCode.vue'\nimport IncremarkList from './IncremarkList.vue'\nimport IncremarkTable from './IncremarkTable.vue'\nimport IncremarkBlockquote from './IncremarkBlockquote.vue'\nimport IncremarkThematicBreak from './IncremarkThematicBreak.vue'\nimport IncremarkMath from './IncremarkMath.vue'\nimport IncremarkHtmlElement from './IncremarkHtmlElement.vue'\nimport IncremarkContainer from './IncremarkContainer.vue'\nimport IncremarkDefault from './IncremarkDefault.vue'\nimport type { ContainerNode } from './IncremarkContainer.vue'\nimport type { CodeBlockConfig } from './Incremark.vue'\n\ntype ExtendedRootContent = RootContent | ContainerNode\n\nconst props = defineProps<{\n node: ExtendedRootContent\n customContainers?: Record<string, Component>\n customCodeBlocks?: Record<string, Component>\n codeBlockConfigs?: Record<string, CodeBlockConfig>\n blockStatus?: 'pending' | 'stable' | 'completed'\n components?: Partial<Record<string, Component>>\n}>()\n\n// 默认组件映射\nconst defaultComponentMap: Record<string, Component> = {\n heading: IncremarkHeading,\n paragraph: IncremarkParagraph,\n code: IncremarkCode,\n list: IncremarkList,\n table: IncremarkTable,\n blockquote: IncremarkBlockquote,\n thematicBreak: IncremarkThematicBreak,\n math: IncremarkMath,\n inlineMath: IncremarkMath,\n htmlElement: IncremarkHtmlElement,\n containerDirective: IncremarkContainer,\n leafDirective: IncremarkContainer,\n textDirective: IncremarkContainer,\n}\n\n// 合并用户自定义组件\nconst componentMap = computed(() => ({\n ...defaultComponentMap,\n ...props.components\n}))\n\nfunction getComponent(type: string): Component {\n return componentMap.value[type] || IncremarkDefault\n}\n\n/**\n * 检查是否是容器节点\n */\nfunction isContainerNode(node: ExtendedRootContent): node is ContainerNode {\n return (node as any).type === 'containerDirective' || \n (node as any).type === 'leafDirective' || \n (node as any).type === 'textDirective'\n}\n\n/**\n * 检查是否是 html 节点\n */\nfunction isHtmlNode(node: ExtendedRootContent): node is HTML {\n return node.type === 'html'\n}\n</script>\n\n<template>\n <!-- HTML 节点:渲染为代码块显示源代码 -->\n <pre v-if=\"isHtmlNode(node)\" class=\"incremark-html-code\"><code>{{ (node as HTML).value }}</code></pre>\n <!-- 容器节点:使用容器组件,传递 customContainers -->\n <IncremarkContainer\n v-else-if=\"isContainerNode(node)\"\n :node=\"node as ContainerNode\"\n :custom-containers=\"customContainers\"\n />\n <!-- 代码节点:特殊处理,传递 customCodeBlocks、codeBlockConfigs 和 blockStatus -->\n <IncremarkCode\n v-else-if=\"(node as RootContent).type === 'code'\"\n :node=\"node as Code\"\n :custom-code-blocks=\"customCodeBlocks\"\n :code-block-configs=\"codeBlockConfigs\"\n :block-status=\"blockStatus\"\n :default-code-component=\"components?.['code']\"\n />\n <!-- 其他节点:使用对应组件 -->\n <component v-else :is=\"getComponent((node as RootContent).type)\" :node=\"node as RootContent\" />\n</template>\n\n","<script setup lang=\"ts\">\nimport type { Heading } from 'mdast'\nimport { computed } from 'vue'\nimport IncremarkInline from './IncremarkInline.vue'\n\nconst props = defineProps<{\n node: Heading\n}>()\n\nconst tag = computed(() => `h${props.node.depth}`)\n</script>\n\n<template>\n <component :is=\"tag\" :class=\"`incremark-heading h${node.depth}`\">\n <IncremarkInline :nodes=\"node.children\" />\n </component>\n</template>\n","<script setup lang=\"ts\">\nimport type { PhrasingContent, RootContent, ImageReference, LinkReference } from 'mdast'\nimport type { TextChunk } from '@incremark/core'\nimport {\n type TextNodeWithChunks,\n hasChunks,\n getStableText,\n isHtmlNode\n} from '@incremark/shared'\nimport IncremarkMath from './IncremarkMath.vue'\nimport IncremarkHtmlElement from './IncremarkHtmlElement.vue'\nimport { useDefinationsContext } from '../composables/useDefinationsContext'\n\n// Math 节点类型\ninterface MathNode {\n type: 'math' | 'inlineMath'\n value: string\n}\n\n// HtmlElement 节点类型\ninterface HtmlElementNode {\n type: 'htmlElement'\n tagName: string\n attrs: Record<string, string>\n children: RootContent[]\n}\n\n/**\n * 类型守卫:检查是否是 htmlElement 节点\n */\nfunction isHtmlElementNode(node: PhrasingContent): node is PhrasingContent & HtmlElementNode {\n return (node as unknown as HtmlElementNode).type === 'htmlElement'\n}\n\n/**\n * 类型守卫:检查是否是 imageReference 节点\n */\nfunction isImageReference(node: PhrasingContent): node is ImageReference {\n return node.type === 'imageReference'\n}\n\n/**\n * 类型守卫:检查是否是 linkReference 节点\n */\nfunction isLinkReference(node: PhrasingContent): node is LinkReference {\n return node.type === 'linkReference'\n}\n\nconst props = defineProps<{\n nodes: PhrasingContent[]\n}>()\n\nconst {\n definations,\n footnoteDefinitions\n} = useDefinationsContext()\n\n/**\n * 获取节点的 chunks(类型安全)\n */\nfunction getChunks(node: PhrasingContent): TextChunk[] | undefined {\n if (hasChunks(node)) {\n return (node as TextNodeWithChunks).chunks\n }\n return undefined\n}\n\n/**\n * 类型守卫:检查是否是 inlineMath 节点\n * inlineMath 是 mdast-util-math 扩展的类型,不在标准 PhrasingContent 中\n */\nfunction isInlineMath(node: PhrasingContent): node is PhrasingContent & MathNode {\n return (node as unknown as MathNode).type === 'inlineMath'\n}\n\n</script>\n\n<template>\n <template v-for=\"(node, idx) in nodes\" :key=\"idx\">\n <!-- 文本(支持 chunks 渐入动画) -->\n <template v-if=\"node.type === 'text'\">\n <!-- 稳定文本(已经显示过的部分,无动画) -->\n {{ getStableText(node as TextNodeWithChunks) }}\n <!-- 新增的 chunk 部分(带渐入动画) -->\n <span \n v-for=\"chunk in getChunks(node)\" \n :key=\"chunk.createdAt\"\n class=\"incremark-fade-in\"\n >{{ chunk.text }}</span>\n </template>\n\n <!-- 行内公式 -->\n <IncremarkMath v-else-if=\"isInlineMath(node)\" :node=\"(node as unknown as MathNode)\" />\n\n <!-- htmlElement 节点(结构化的 HTML 元素) -->\n <IncremarkHtmlElement \n v-else-if=\"isHtmlElementNode(node)\" \n :node=\"(node as unknown as HtmlElementNode)\" \n />\n\n <!-- HTML 节点(原始 HTML,如未启用 htmlTree 选项) -->\n <span v-else-if=\"isHtmlNode(node)\" class=\"incremark-inline-html\" v-html=\"(node as any).value\"></span>\n\n <!-- 加粗 -->\n <strong v-else-if=\"node.type === 'strong'\">\n <IncremarkInline :nodes=\"(node.children as PhrasingContent[])\" />\n </strong>\n\n <!-- 斜体 -->\n <em v-else-if=\"node.type === 'emphasis'\">\n <IncremarkInline :nodes=\"(node.children as PhrasingContent[])\" />\n </em>\n\n <!-- 行内代码 -->\n <code v-else-if=\"node.type === 'inlineCode'\" class=\"incremark-inline-code\">{{ (node as any).value }}</code>\n\n <!-- 链接 -->\n <a\n v-else-if=\"node.type === 'link'\"\n class=\"incremark-link\"\n :href=\"node.url\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n <IncremarkInline :nodes=\"(node.children as PhrasingContent[])\" />\n </a>\n\n <!-- 图片 -->\n <img\n v-else-if=\"node.type === 'image'\"\n class=\"incremark-image\"\n :src=\"node.url\"\n :alt=\"node.alt || ''\"\n :title=\"(node as any).title || undefined\"\n loading=\"lazy\"\n />\n\n <!-- 引用式图片(imageReference) -->\n <template v-else-if=\"isImageReference(node)\">\n <img\n v-if=\"definations[node.identifier]\"\n class=\"incremark-image incremark-reference-image\"\n :src=\"definations[node.identifier].url\"\n :alt=\"(node as ImageReference).alt || ''\"\n :title=\"definations[node.identifier].title || undefined\"\n loading=\"lazy\"\n />\n <!-- 如果没有找到定义,渲染为原始文本(降级处理) -->\n <span v-else class=\"incremark-image-ref-missing\">\n ![{{ (node as ImageReference).alt }}][{{ (node as ImageReference).identifier || (node as ImageReference).label }}]\n </span>\n </template>\n\n <!-- 引用式链接(linkReference) -->\n <template v-else-if=\"isLinkReference(node)\">\n <a\n v-if=\"definations[node.identifier]\"\n class=\"incremark-link incremark-reference-link\"\n :href=\"definations[node.identifier].url\"\n :title=\"definations[node.identifier].title || undefined\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n <IncremarkInline :nodes=\"((node as LinkReference).children as PhrasingContent[])\" />\n </a>\n <!-- 如果没有找到定义,渲染为原始文本(降级处理) -->\n <span v-else class=\"incremark-link-ref-missing\">\n [{{ ((node as LinkReference).children as any[]).map((c: any) => c.value).join('') }}][{{ (node as LinkReference).identifier || (node as LinkReference).label }}]\n </span>\n </template>\n\n <!-- 脚注引用(footnoteReference) -->\n <sup v-else-if=\"node.type === 'footnoteReference'\" class=\"incremark-footnote-ref\">\n <a :href=\"`#fn-${(node as any).identifier}`\" :id=\"`fnref-${(node as any).identifier}`\">\n [{{ (node as any).identifier }}]\n </a>\n </sup>\n\n <!-- 换行 -->\n <br v-else-if=\"node.type === 'break'\" />\n\n <!-- 删除线 -->\n <del v-else-if=\"node.type === 'delete'\">\n <IncremarkInline :nodes=\"(node.children as PhrasingContent[])\" />\n </del>\n </template>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, ref, watch, shallowRef, onUnmounted } from 'vue'\n\n// Math 节点类型(来自 mdast-util-math)\ninterface MathNode {\n type: 'math' | 'inlineMath'\n value: string\n data?: {\n hName?: string\n hProperties?: Record<string, any>\n }\n}\n\nconst props = withDefaults(\n defineProps<{\n node: MathNode\n /** 渲染延迟(毫秒),用于流式输入时防抖 */\n renderDelay?: number\n }>(),\n {\n renderDelay: 0\n }\n)\n\nconst renderedHtml = ref('')\nconst renderError = ref('')\nconst isLoading = ref(false)\nconst katexRef = shallowRef<any>(null)\nlet renderTimer: ReturnType<typeof setTimeout> | null = null\n\nconst isInline = computed(() => props.node.type === 'inlineMath')\nconst formula = computed(() => props.node.value)\n\n// 带防抖动的渲染\nfunction scheduleRender() {\n if (!formula.value) {\n renderedHtml.value = ''\n return\n }\n\n // 清除之前的定时器\n if (renderTimer) {\n clearTimeout(renderTimer)\n }\n\n isLoading.value = true\n\n // 防抖动延迟渲染\n renderTimer = setTimeout(() => {\n doRender()\n }, props.renderDelay)\n}\n\nasync function doRender() {\n if (!formula.value) return\n\n try {\n // 动态导入 KaTeX\n if (!katexRef.value) {\n // @ts-ignore - katex 是可选依赖\n const katexModule = await import('katex')\n katexRef.value = katexModule.default\n }\n\n const katex = katexRef.value\n renderedHtml.value = katex.renderToString(formula.value, {\n displayMode: !isInline.value,\n throwOnError: false,\n strict: false\n })\n renderError.value = ''\n } catch (e: any) {\n // 静默失败,可能是公式不完整\n renderError.value = ''\n renderedHtml.value = ''\n } finally {\n isLoading.value = false\n }\n}\n\nonUnmounted(() => {\n if (renderTimer) {\n clearTimeout(renderTimer)\n }\n})\n\nwatch(formula, scheduleRender, { immediate: true })\n</script>\n\n<template>\n <!-- 行内公式 -->\n <span v-if=\"isInline\" class=\"incremark-math-inline\">\n <!-- 渲染成功 -->\n <span v-if=\"renderedHtml && !isLoading\" v-html=\"renderedHtml\" />\n <!-- 加载中或未渲染:显示源码 -->\n <code v-else class=\"math-source\">{{ formula }}</code>\n </span>\n <!-- 块级公式 -->\n <div v-else class=\"incremark-math-block\">\n <!-- 渲染成功 -->\n <div v-if=\"renderedHtml && !isLoading\" v-html=\"renderedHtml\" class=\"math-rendered\" />\n <!-- 加载中或未渲染:显示源码 -->\n <pre v-else class=\"math-source-block\"><code>{{ formula }}</code></pre>\n </div>\n</template>\n","import { createCommentVNode as _createCommentVNode, openBlock as _openBlock, createElementBlock as _createElementBlock, toDisplayString as _toDisplayString, createElementVNode as _createElementVNode, Fragment as _Fragment } from \"vue\"\n\nconst _hoisted_1 = {\n key: 0,\n class: \"incremark-math-inline\"\n}\nconst _hoisted_2 = [\"innerHTML\"]\nconst _hoisted_3 = { class: \"math-source\" }\nconst _hoisted_4 = { class: \"incremark-math-block\" }\nconst _hoisted_5 = [\"innerHTML\"]\nconst _hoisted_6 = { class: \"math-source-block\" }\n\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n return (_openBlock(), _createElementBlock(_Fragment, null, [\n _createCommentVNode(\" 行内公式 \"),\n ($setup.isInline)\n ? (_openBlock(), _createElementBlock(\"span\", _hoisted_1, [\n _createCommentVNode(\" 渲染成功 \"),\n ($setup.renderedHtml && !$setup.isLoading)\n ? (_openBlock(), _createElementBlock(\"span\", {\n key: 0,\n innerHTML: $setup.renderedHtml\n }, null, 8 /* PROPS */, _hoisted_2))\n : (_openBlock(), _createElementBlock(_Fragment, { key: 1 }, [\n _createCommentVNode(\" 加载中或未渲染:显示源码 \"),\n _createElementVNode(\"code\", _hoisted_3, _toDisplayString($setup.formula), 1 /* TEXT */)\n ], 2112 /* STABLE_FRAGMENT, DEV_ROOT_FRAGMENT */))\n ]))\n : (_openBlock(), _createElementBlock(_Fragment, { key: 1 }, [\n _createCommentVNode(\" 块级公式 \"),\n _createElementVNode(\"div\", _hoisted_4, [\n _createCommentVNode(\" 渲染成功 \"),\n ($setup.renderedHtml && !$setup.isLoading)\n ? (_openBlock(), _createElementBlock(\"div\", {\n key: 0,\n innerHTML: $setup.renderedHtml,\n class: \"math-rendered\"\n }, null, 8 /* PROPS */, _hoisted_5))\n : (_openBlock(), _createElementBlock(_Fragment, { key: 1 }, [\n _createCommentVNode(\" 加载中或未渲染:显示源码 \"),\n _createElementVNode(\"pre\", _hoisted_6, [\n _createElementVNode(\"code\", null, _toDisplayString($setup.formula), 1 /* TEXT */)\n ])\n ], 2112 /* STABLE_FRAGMENT, DEV_ROOT_FRAGMENT */))\n ])\n ], 2112 /* STABLE_FRAGMENT, DEV_ROOT_FRAGMENT */))\n ], 2112 /* STABLE_FRAGMENT, DEV_ROOT_FRAGMENT */))\n}","import script from \"/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkMath.vue?type=script\";import { render } from \"/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkMath.vue?type=template\"; script.render = render;script.__file = \"src/components/IncremarkMath.vue\";export default script;","<script setup lang=\"ts\">\nimport type { RootContent, PhrasingContent } from 'mdast'\nimport IncremarkInline from './IncremarkInline.vue'\n\n/**\n * HtmlElementNode 类型定义(与 @incremark/core 中的定义一致)\n */\ninterface HtmlElementNode {\n type: 'htmlElement'\n tagName: string\n attrs: Record<string, string>\n children: RootContent[]\n data?: {\n rawHtml?: string\n parsed?: boolean\n originalType?: string\n }\n}\n\ndefineProps<{\n node: HtmlElementNode\n}>()\n\n/**\n * 判断是否是行内元素\n */\nfunction isInlineElement(tagName: string): boolean {\n const inlineElements = [\n 'a', 'abbr', 'acronym', 'b', 'bdo', 'big', 'br', 'button', 'cite', \n 'code', 'dfn', 'em', 'i', 'img', 'input', 'kbd', 'label', 'map', \n 'object', 'output', 'q', 'samp', 'script', 'select', 'small', \n 'span', 'strong', 'sub', 'sup', 'textarea', 'time', 'tt', 'var'\n ]\n return inlineElements.includes(tagName.toLowerCase())\n}\n\n/**\n * 判断是否是自闭合元素\n */\nfunction isVoidElement(tagName: string): boolean {\n const voidElements = [\n 'area', 'base', 'br', 'col', 'embed', 'hr', 'img', 'input', \n 'link', 'meta', 'param', 'source', 'track', 'wbr'\n ]\n return voidElements.includes(tagName.toLowerCase())\n}\n\n/**\n * 判断子节点是否都是行内内容\n */\nfunction hasOnlyInlineChildren(children: RootContent[]): boolean {\n if (!children || children.length === 0) return true\n \n return children.every(child => {\n const type = child.type\n // 常见的行内类型\n const inlineTypes = ['text', 'strong', 'emphasis', 'inlineCode', 'link', 'image', 'break', 'html', 'htmlElement']\n if (inlineTypes.includes(type)) {\n // 如果是 htmlElement,检查是否是行内元素\n if (type === 'htmlElement') {\n return isInlineElement((child as unknown as HtmlElementNode).tagName)\n }\n return true\n }\n return false\n })\n}\n\n/**\n * 将属性对象转换为 HTML 属性字符串(用于 v-bind)\n */\nfunction getAttrs(attrs: Record<string, string>): Record<string, string> {\n // 过滤掉可能有问题的属性\n const result: Record<string, string> = {}\n for (const [key, value] of Object.entries(attrs)) {\n // 跳过事件属性(已在解析时过滤,这里双重保险)\n if (key.startsWith('on')) continue\n result[key] = value\n }\n return result\n}\n</script>\n\n<template>\n <component \n :is=\"node.tagName\" \n v-bind=\"getAttrs(node.attrs)\"\n :class=\"['incremark-html-element', `incremark-${node.tagName}`]\"\n >\n <!-- 自闭合元素没有子节点 -->\n <template v-if=\"!isVoidElement(node.tagName)\">\n <!-- 如果子节点都是行内内容,使用 IncremarkInline -->\n <template v-if=\"hasOnlyInlineChildren(node.children)\">\n <IncremarkInline :nodes=\"(node.children as PhrasingContent[])\" />\n </template>\n \n <!-- 否则递归渲染每个子节点 -->\n <template v-else>\n <template v-for=\"(child, idx) in node.children\" :key=\"idx\">\n <!-- 如果子节点是 htmlElement,递归 -->\n <IncremarkHtmlElement \n v-if=\"child.type === 'htmlElement'\" \n :node=\"(child as unknown as HtmlElementNode)\" \n />\n <!-- 如果是文本节点 -->\n <template v-else-if=\"child.type === 'text'\">\n {{ (child as any).value }}\n </template>\n <!-- 其他类型尝试用 IncremarkInline -->\n <IncremarkInline \n v-else-if=\"['strong', 'emphasis', 'inlineCode', 'link', 'image', 'break'].includes(child.type)\"\n :nodes=\"[child as PhrasingContent]\" \n />\n <!-- 段落等块级元素 -->\n <template v-else-if=\"child.type === 'paragraph'\">\n <p><IncremarkInline :nodes=\"((child as any).children as PhrasingContent[])\" /></p>\n </template>\n <!-- 其他未知类型,显示原始 -->\n <template v-else>\n <div class=\"incremark-unknown-child\">{{ child.type }}</div>\n </template>\n </template>\n </template>\n </template>\n </component>\n</template>\n\n","import { createCommentVNode as _createCommentVNode, openBlock as _openBlock, createBlock as _createBlock, renderList as _renderList, Fragment as _Fragment, createElementBlock as _createElementBlock, resolveComponent as _resolveComponent, toDisplayString as _toDisplayString, createTextVNode as _createTextVNode, createVNode as _createVNode, createElementVNode as _createElementVNode, resolveDynamicComponent as _resolveDynamicComponent, mergeProps as _mergeProps, withCtx as _withCtx } from \"vue\"\n\nconst _hoisted_1 = { class: \"incremark-unknown-child\" }\n\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_IncremarkHtmlElement = _resolveComponent(\"IncremarkHtmlElement\", true)\n\n return (_openBlock(), _createBlock(_resolveDynamicComponent($props.node.tagName), _mergeProps($setup.getAttrs($props.node.attrs), {\n class: ['incremark-html-element', `incremark-${$props.node.tagName}`]\n }), {\n default: _withCtx(() => [\n _createCommentVNode(\" 自闭合元素没有子节点 \"),\n (!$setup.isVoidElement($props.node.tagName))\n ? (_openBlock(), _createElementBlock(_Fragment, { key: 0 }, [\n _createCommentVNode(\" 如果子节点都是行内内容,使用 IncremarkInline \"),\n ($setup.hasOnlyInlineChildren($props.node.children))\n ? (_openBlock(), _createBlock($setup[\"IncremarkInline\"], {\n key: 0,\n nodes: ($props.node.children as PhrasingContent[])\n }, null, 8 /* PROPS */, [\"nodes\"]))\n : (_openBlock(), _createElementBlock(_Fragment, { key: 1 }, [\n _createCommentVNode(\" 否则递归渲染每个子节点 \"),\n (_openBlock(true), _createElementBlock(_Fragment, null, _renderList($props.node.children, (child, idx) => {\n return (_openBlock(), _createElementBlock(_Fragment, { key: idx }, [\n _createCommentVNode(\" 如果子节点是 htmlElement,递归 \"),\n (child.type === 'htmlElement')\n ? (_openBlock(), _createBlock(_component_IncremarkHtmlElement, {\n key: 0,\n node: (child as unknown as HtmlElementNode)\n }, null, 8 /* PROPS */, [\"node\"]))\n : (child.type === 'text')\n ? (_openBlock(), _createElementBlock(_Fragment, { key: 1 }, [\n _createCommentVNode(\" 如果是文本节点 \"),\n _createTextVNode(_toDisplayString((child as any).value), 1 /* TEXT */)\n ], 64 /* STABLE_FRAGMENT */))\n : (['strong', 'emphasis', 'inlineCode', 'link', 'image', 'break'].includes(child.type))\n ? (_openBlock(), _createElementBlock(_Fragment, { key: 2 }, [\n _createCommentVNode(\" 其他类型尝试用 IncremarkInline \"),\n _createVNode($setup[\"IncremarkInline\"], {\n nodes: [child as PhrasingContent]\n }, null, 8 /* PROPS */, [\"nodes\"])\n ], 2112 /* STABLE_FRAGMENT, DEV_ROOT_FRAGMENT */))\n : (child.type === 'paragraph')\n ? (_openBlock(), _createElementBlock(_Fragment, { key: 3 }, [\n _createCommentVNode(\" 段落等块级元素 \"),\n _createElementVNode(\"p\", null, [\n _createVNode($setup[\"IncremarkInline\"], {\n nodes: ((child as any).children as PhrasingContent[])\n }, null, 8 /* PROPS */, [\"nodes\"])\n ])\n ], 64 /* STABLE_FRAGMENT */))\n : (_openBlock(), _createElementBlock(_Fragment, { key: 4 }, [\n _createCommentVNode(\" 其他未知类型,显示原始 \"),\n _createElementVNode(\"div\", _hoisted_1, _toDisplayString(child.type), 1 /* TEXT */)\n ], 64 /* STABLE_FRAGMENT */))\n ], 64 /* STABLE_FRAGMENT */))\n }), 128 /* KEYED_FRAGMENT */))\n ], 64 /* STABLE_FRAGMENT */))\n ], 64 /* STABLE_FRAGMENT */))\n : _createCommentVNode(\"v-if\", true)\n ]),\n _: 1 /* STABLE */\n }, 16 /* FULL_PROPS */, [\"class\"]))\n}","import script from \"/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkHtmlElement.vue?type=script\";import { render } from \"/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkHtmlElement.vue?type=template\"; script.render = render;script.__file = \"src/components/IncremarkHtmlElement.vue\";export default script;","import { renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, toDisplayString as _toDisplayString, createTextVNode as _createTextVNode, createVNode as _createVNode, createElementVNode as _createElementVNode, resolveComponent as _resolveComponent } from \"vue\"\n\nconst _hoisted_1 = [\"innerHTML\"]\nconst _hoisted_2 = { class: \"incremark-inline-code\" }\nconst _hoisted_3 = [\"href\"]\nconst _hoisted_4 = [\"src\", \"alt\", \"title\"]\nconst _hoisted_5 = [\"src\", \"alt\", \"title\"]\nconst _hoisted_6 = { class: \"incremark-image-ref-missing\" }\nconst _hoisted_7 = [\"href\", \"title\"]\nconst _hoisted_8 = { class: \"incremark-link-ref-missing\" }\nconst _hoisted_9 = { class: \"incremark-footnote-ref\" }\nconst _hoisted_10 = [\"href\", \"id\"]\n\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_IncremarkInline = _resolveComponent(\"IncremarkInline\", true)\n\n return (_openBlock(true), _createElementBlock(_Fragment, null, _renderList($props.nodes, (node, idx) => {\n return (_openBlock(), _createElementBlock(_Fragment, { key: idx }, [\n _createCommentVNode(\" 文本(支持 chunks 渐入动画) \"),\n (node.type === 'text')\n ? (_openBlock(), _createElementBlock(_Fragment, { key: 0 }, [\n _createCommentVNode(\" 稳定文本(已经显示过的部分,无动画) \"),\n _createTextVNode(\" \" + _toDisplayString($setup.getStableText(node as TextNodeWithChunks)) + \" \", 1 /* TEXT */),\n _createCommentVNode(\" 新增的 chunk 部分(带渐入动画) \"),\n (_openBlock(true), _createElementBlock(_Fragment, null, _renderList($setup.getChunks(node), (chunk) => {\n return (_openBlock(), _createElementBlock(\"span\", {\n key: chunk.createdAt,\n class: \"incremark-fade-in\"\n }, _toDisplayString(chunk.text), 1 /* TEXT */))\n }), 128 /* KEYED_FRAGMENT */))\n ], 64 /* STABLE_FRAGMENT */))\n : ($setup.isInlineMath(node))\n ? (_openBlock(), _createElementBlock(_Fragment, { key: 1 }, [\n _createCommentVNode(\" 行内公式 \"),\n _createVNode($setup[\"IncremarkMath\"], {\n node: (node as unknown as MathNode)\n }, null, 8 /* PROPS */, [\"node\"])\n ], 2112 /* STABLE_FRAGMENT, DEV_ROOT_FRAGMENT */))\n : ($setup.isHtmlElementNode(node))\n ? (_openBlock(), _createElementBlock(_Fragment, { key: 2 }, [\n _createCommentVNode(\" htmlElement 节点(结构化的 HTML 元素) \"),\n _createVNode($setup[\"IncremarkHtmlElement\"], {\n node: (node as unknown as HtmlElementNode)\n }, null, 8 /* PROPS */, [\"node\"])\n ], 2112 /* STABLE_FRAGMENT, DEV_ROOT_FRAGMENT */))\n : ($setup.isHtmlNode(node))\n ? (_openBlock(), _createElementBlock(_Fragment, { key: 3 }, [\n _createCommentVNode(\" HTML 节点(原始 HTML,如未启用 htmlTree 选项) \"),\n _createElementVNode(\"span\", {\n class: \"incremark-inline-html\",\n innerHTML: (node as any).value\n }, null, 8 /* PROPS */, _hoisted_1)\n ], 2112 /* STABLE_FRAGMENT, DEV_ROOT_FRAGMENT */))\n : (node.type === 'strong')\n ? (_openBlock(), _createElementBlock(_Fragment, { key: 4 }, [\n _createCommentVNode(\" 加粗 \"),\n _createElementVNode(\"strong\", null, [\n _createVNode(_component_IncremarkInline, {\n nodes: (node.children as PhrasingContent[])\n }, null, 8 /* PROPS */, [\"nodes\"])\n ])\n ], 2112 /* STABLE_FRAGMENT, DEV_ROOT_FRAGMENT */))\n : (node.type === 'emphasis')\n ? (_openBlock(), _createElementBlock(_Fragment, { key: 5 }, [\n _createCommentVNode(\" 斜体 \"),\n _createElementVNode(\"em\", null, [\n _createVNode(_component_IncremarkInline, {\n nodes: (node.children as PhrasingContent[])\n }, null, 8 /* PROPS */, [\"nodes\"])\n ])\n ], 2112 /* STABLE_FRAGMENT, DEV_ROOT_FRAGMENT */))\n : (node.type === 'inlineCode')\n ? (_openBlock(), _createElementBlock(_Fragment, { key: 6 }, [\n _createCommentVNode(\" 行内代码 \"),\n _createElementVNode(\"code\", _hoisted_2, _toDisplayString((node as any).value), 1 /* TEXT */)\n ], 2112 /* STABLE_FRAGMENT, DEV_ROOT_FRAGMENT */))\n : (node.type === 'link')\n ? (_openBlock(), _createElementBlock(_Fragment, { key: 7 }, [\n _createCommentVNode(\" 链接 \"),\n _createElementVNode(\"a\", {\n class: \"incremark-link\",\n href: node.url,\n target: \"_blank\",\n rel: \"noopener noreferrer\"\n }, [\n _createVNode(_component_IncremarkInline, {\n nodes: (node.children as PhrasingContent[])\n }, null, 8 /* PROPS */, [\"nodes\"])\n ], 8 /* PROPS */, _hoisted_3)\n ], 2112 /* STABLE_FRAGMENT, DEV_ROOT_FRAGMENT */))\n : (node.type === 'image')\n ? (_openBlock(), _createElementBlock(_Fragment, { key: 8 }, [\n _createCommentVNode(\" 图片 \"),\n _createElementVNode(\"img\", {\n class: \"incremark-image\",\n src: node.url,\n alt: node.alt || '',\n title: (node as any).title || undefined,\n loading: \"lazy\"\n }, null, 8 /* PROPS */, _hoisted_4)\n ], 2112 /* STABLE_FRAGMENT, DEV_ROOT_FRAGMENT */))\n : ($setup.isImageReference(node))\n ? (_openBlock(), _createElementBlock(_Fragment, { key: 9 }, [\n _createCommentVNode(\" 引用式图片(imageReference) \"),\n ($setup.definations[node.identifier])\n ? (_openBlock(), _createElementBlock(\"img\", {\n key: 0,\n class: \"incremark-image incremark-reference-image\",\n src: $setup.definations[node.identifier].url,\n alt: (node as ImageReference).alt || '',\n title: $setup.definations[node.identifier].title || undefined,\n loading: \"lazy\"\n }, null, 8 /* PROPS */, _hoisted_5))\n : (_openBlock(), _createElementBlock(_Fragment, { key: 1 }, [\n _createCommentVNode(\" 如果没有找到定义,渲染为原始文本(降级处理) \"),\n _createElementVNode(\"span\", _hoisted_6, \" ![\" + _toDisplayString((node as ImageReference).alt) + \"][\" + _toDisplayString((node as ImageReference).identifier || (node as ImageReference).label) + \"] \", 1 /* TEXT */)\n ], 2112 /* STABLE_FRAGMENT, DEV_ROOT_FRAGMENT */))\n ], 64 /* STABLE_FRAGMENT */))\n : ($setup.isLinkReference(node))\n ? (_openBlock(), _createElementBlock(_Fragment, { key: 10 }, [\n _createCommentVNode(\" 引用式链接(linkReference) \"),\n ($setup.definations[node.identifier])\n ? (_openBlock(), _createElementBlock(\"a\", {\n key: 0,\n class: \"incremark-link incremark-reference-link\",\n href: $setup.definations[node.identifier].url,\n title: $setup.definations[node.identifier].title || undefined,\n target: \"_blank\",\n rel: \"noopener noreferrer\"\n }, [\n _createVNode(_component_IncremarkInline, {\n nodes: ((node as LinkReference).children as PhrasingContent[])\n }, null, 8 /* PROPS */, [\"nodes\"])\n ], 8 /* PROPS */, _hoisted_7))\n : (_openBlock(), _createElementBlock(_Fragment, { key: 1 }, [\n _createCommentVNode(\" 如果没有找到定义,渲染为原始文本(降级处理) \"),\n _createElementVNode(\"span\", _hoisted_8, \" [\" + _toDisplayString(((node as LinkReference).children as any[]).map((c) => c.value).join('')) + \"][\" + _toDisplayString((node as LinkReference).identifier || (node as LinkReference).label) + \"] \", 1 /* TEXT */)\n ], 2112 /* STABLE_FRAGMENT, DEV_ROOT_FRAGMENT */))\n ], 64 /* STABLE_FRAGMENT */))\n : (node.type === 'footnoteReference')\n ? (_openBlock(), _createElementBlock(_Fragment, { key: 11 }, [\n _createCommentVNode(\" 脚注引用(footnoteReference) \"),\n _createElementVNode(\"sup\", _hoisted_9, [\n _createElementVNode(\"a\", {\n href: `#fn-${(node as any).identifier}`,\n id: `fnref-${(node as any).identifier}`\n }, \" [\" + _toDisplayString((node as any).identifier) + \"] \", 9 /* TEXT, PROPS */, _hoisted_10)\n ])\n ], 2112 /* STABLE_FRAGMENT, DEV_ROOT_FRAGMENT */))\n : (node.type === 'break')\n ? (_openBlock(), _createElementBlock(_Fragment, { key: 12 }, [\n _createCommentVNode(\" 换行 \"),\n _cache[0] || (_cache[0] = _createElementVNode(\"br\", null, null, -1 /* CACHED */))\n ], 2112 /* STABLE_FRAGMENT, DEV_ROOT_FRAGMENT */))\n : (node.type === 'delete')\n ? (_openBlock(), _createElementBlock(_Fragment, { key: 13 }, [\n _createCommentVNode(\" 删除线 \"),\n _createElementVNode(\"del\", null, [\n _createVNode(_component_IncremarkInline, {\n nodes: (node.children as PhrasingContent[])\n }, null, 8 /* PROPS */, [\"nodes\"])\n ])\n ], 2112 /* STABLE_FRAGMENT, DEV_ROOT_FRAGMENT */))\n : _createCommentVNode(\"v-if\", true)\n ], 64 /* STABLE_FRAGMENT */))\n }), 128 /* KEYED_FRAGMENT */))\n}","import script from \"/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkInline.vue?type=script\";import { render } from \"/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkInline.vue?type=template\"; script.render = render;script.__file = \"src/components/IncremarkInline.vue\";export default script;","import { createVNode as _createVNode, resolveDynamicComponent as _resolveDynamicComponent, normalizeClass as _normalizeClass, withCtx as _withCtx, openBlock as _openBlock, createBlock as _createBlock } from \"vue\"\n\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n return (_openBlock(), _createBlock(_resolveDynamicComponent($setup.tag), {\n class: _normalizeClass(`incremark-heading h${$props.node.depth}`)\n }, {\n default: _withCtx(() => [\n _createVNode($setup[\"IncremarkInline\"], {\n nodes: $props.node.children\n }, null, 8 /* PROPS */, [\"nodes\"])\n ]),\n _: 1 /* STABLE */\n }, 8 /* PROPS */, [\"class\"]))\n}","import script from \"/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkHeading.vue?type=script\";import { render } from \"/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkHeading.vue?type=template\"; script.render = render;script.__file = \"src/components/IncremarkHeading.vue\";export default script;","import { createVNode as _createVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nconst _hoisted_1 = { class: \"incremark-paragraph\" }\n\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n return (_openBlock(), _createElementBlock(\"p\", _hoisted_1, [\n _createVNode($setup[\"IncremarkInline\"], {\n nodes: $props.node.children\n }, null, 8 /* PROPS */, [\"nodes\"])\n ]))\n}","import script from \"/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkParagraph.vue?type=script\";import { render } from \"/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkParagraph.vue?type=template\"; script.render = render;script.__file = \"src/components/IncremarkParagraph.vue\";export default script;","<script setup lang=\"ts\">\nimport type { Code } from 'mdast'\nimport type { Component } from 'vue'\nimport { computed, onMounted } from 'vue'\n\nimport type { CodeBlockConfig } from './Incremark.vue'\nimport IncremarkCodeMermaid from './IncremarkCodeMermaid.vue'\nimport IncremarkCodeDefault from './IncremarkCodeDefault.vue'\n\ninterface Props {\n node: Code\n /** Shiki 主题,默认 github-dark */\n theme?: string\n /** 默认回退主题(当指定主题加载失败时使用),默认 github-dark */\n fallbackTheme?: string\n /** 是否禁用代码高亮 */\n disableHighlight?: boolean\n /** Mermaid 渲染延迟(毫秒),用于流式输入时防抖 */\n mermaidDelay?: number\n /** 自定义代码块组件映射,key 为代码语言名称 */\n customCodeBlocks?: Record<string, Component>\n /** 代码块配置映射,key 为代码语言名称 */\n codeBlockConfigs?: Record<string, CodeBlockConfig>\n /** 块状态,用于判断是否使用自定义组件 */\n blockStatus?: 'pending' | 'stable' | 'completed'\n /** 默认代码块渲染组件(当不是 mermaid 且没有自定义组件时使用) */\n defaultCodeComponent?: Component\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n theme: 'github-dark',\n fallbackTheme: 'github-dark',\n disableHighlight: false,\n mermaidDelay: 500,\n customCodeBlocks: () => ({}),\n codeBlockConfigs: () => ({}),\n blockStatus: 'completed',\n defaultCodeComponent: () => IncremarkCodeDefault\n})\n\nconst language = computed(() => props.node.lang || 'text')\n\n// 检查是否有自定义代码块组件\nconst CustomCodeBlock = computed(() => {\n const component = props.customCodeBlocks?.[language.value]\n if (!component) return null\n\n // 检查该语言的配置\n const config = props.codeBlockConfigs?.[language.value]\n\n // 如果配置了 takeOver 为 true,则从一开始就使用\n if (config?.takeOver) {\n return component\n }\n\n // 否则,默认行为:只在 completed 状态使用\n if (props.blockStatus !== 'completed') {\n return null\n }\n\n return component\n})\n\n// 判断是否为 mermaid\nconst isMermaid = computed(() => language.value === 'mermaid')\n</script>\n\n<template>\n <!-- 自定义代码块组件 -->\n <component\n v-if=\"CustomCodeBlock\"\n :is=\"CustomCodeBlock\"\n :code-str=\"node.value\"\n :lang=\"language\"\n :completed=\"blockStatus === 'completed'\"\n :takeOver=\"codeBlockConfigs?.[language]?.takeOver\"\n />\n\n <!-- Mermaid 图表 -->\n <IncremarkCodeMermaid\n v-else-if=\"isMermaid\"\n :node=\"node\"\n :mermaid-delay=\"mermaidDelay\"\n />\n\n <!-- 默认代码块渲染(支持用户自定义,使用 stream 高亮)-->\n <component\n v-else\n :is=\"defaultCodeComponent\"\n :node=\"node\"\n :theme=\"theme\"\n :fallback-theme=\"fallbackTheme\"\n :disable-highlight=\"disableHighlight\"\n :block-status=\"blockStatus\"\n />\n</template>\n","<script setup lang=\"ts\">\nimport type { Code } from 'mdast'\nimport { computed, ref, onUnmounted, shallowRef, watch } from 'vue'\nimport { GravityMermaid, LucideCode, LucideEye, LucideCopy, LucideCopyCheck } from '@incremark/icons'\nimport { isClipboardAvailable } from '@incremark/shared'\nimport SvgIcon from './SvgIcon.vue'\nimport { useLocale } from '../composables/useLocale'\n\ninterface Props {\n node: Code\n /** Mermaid 渲染延迟(毫秒),用于流式输入时防抖 */\n mermaidDelay?: number\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n mermaidDelay: 500\n})\n\n// 使用 i18n\nconst { t } = useLocale()\n\nconst mermaidSvg = ref('')\nconst mermaidError = ref('')\nconst mermaidLoading = ref(false)\nconst mermaidRef = shallowRef<any>(null)\nlet mermaidTimer: ReturnType<typeof setTimeout> | null = null\n// 视图模式:'preview' | 'source'\nconst mermaidViewMode = ref<'preview' | 'source'>('preview')\n\nfunction toggleMermaidView() {\n mermaidViewMode.value = mermaidViewMode.value === 'preview' ? 'source' : 'preview'\n}\n\nconst code = computed(() => props.node.value)\n\n// Mermaid 渲染(带防抖动)\nfunction scheduleRenderMermaid() {\n if (!code.value) return\n\n // 清除之前的定时器\n if (mermaidTimer) {\n clearTimeout(mermaidTimer)\n }\n\n // 显示加载状态\n mermaidLoading.value = true\n\n // 防抖动延迟渲染\n mermaidTimer = setTimeout(() => {\n doRenderMermaid()\n }, props.mermaidDelay)\n}\n\nasync function doRenderMermaid() {\n if (!code.value) return\n\n mermaidError.value = ''\n\n try {\n // 动态导入 mermaid\n if (!mermaidRef.value) {\n // @ts-ignore - mermaid 是可选依赖\n const mermaidModule = await import('mermaid')\n mermaidRef.value = mermaidModule.default\n mermaidRef.value.initialize({\n startOnLoad: false,\n theme: 'dark',\n securityLevel: 'loose',\n suppressErrorRendering: true\n })\n }\n\n const mermaid = mermaidRef.value\n const id = `mermaid-${Date.now()}-${Math.random().toString(36).slice(2)}`\n\n const { svg } = await mermaid.render(id, code.value)\n mermaidSvg.value = svg\n } catch (e: any) {\n // 不显示错误,可能是代码还不完整\n mermaidError.value = ''\n mermaidSvg.value = ''\n } finally {\n mermaidLoading.value = false\n }\n}\n\n// 监听代码变化,重新渲染\nwatch(code, scheduleRenderMermaid, { immediate: true })\n\n// 组件卸载时清理定时器\nonUnmounted(() => {\n if (mermaidTimer) {\n clearTimeout(mermaidTimer)\n }\n if (copyTimeoutId) {\n clearTimeout(copyTimeoutId)\n }\n})\n\nconst copied = ref(false)\nlet copyTimeoutId: ReturnType<typeof setTimeout> | null = null\n\nasync function copyCode() {\n if (!isClipboardAvailable()) return\n\n try {\n await navigator.clipboard.writeText(code.value)\n copied.value = true\n\n // 清理之前的定时器\n if (copyTimeoutId) {\n clearTimeout(copyTimeoutId)\n }\n\n copyTimeoutId = setTimeout(() => {\n copied.value = false\n }, 2000)\n } catch {\n // 复制失败静默处理\n }\n}\n</script>\n\n<template>\n <div class=\"incremark-mermaid\">\n <div class=\"mermaid-header\">\n <span class=\"language\">\n <SvgIcon :svg=\"GravityMermaid\" class=\"language-icon\" />\n MERMAID\n </span>\n <div class=\"mermaid-actions\">\n <button\n class=\"code-btn\"\n @click=\"toggleMermaidView\"\n type=\"button\"\n :disabled=\"!mermaidSvg\"\n :aria-label=\"mermaidViewMode === 'preview' ? t('mermaid.viewSource') : t('mermaid.preview')\"\n :title=\"mermaidViewMode === 'preview' ? 'View Source' : 'Preview'\"\n >\n <SvgIcon :svg=\"mermaidViewMode === 'preview' ? LucideCode : LucideEye\" />\n </button>\n <button\n class=\"code-btn\"\n @click=\"copyCode\"\n type=\"button\"\n :aria-label=\"copied ? t('mermaid.copied') : t('mermaid.copy')\"\n :title=\"copied ? 'Copied!' : 'Copy'\"\n >\n <SvgIcon :svg=\"copied ? LucideCopyCheck : LucideCopy\" />\n </button>\n </div>\n </div>\n <div class=\"mermaid-content\">\n <!-- 加载中 -->\n <div v-if=\"mermaidLoading && !mermaidSvg\" class=\"mermaid-loading\">\n <pre class=\"mermaid-source-code\">{{ code }}</pre>\n </div>\n <!-- 源码模式 -->\n <pre v-else-if=\"mermaidViewMode === 'source'\" class=\"mermaid-source-code\">{{ code }}</pre>\n <!-- 预览模式 -->\n <div v-else-if=\"mermaidSvg\" v-html=\"mermaidSvg\" class=\"mermaid-svg\" />\n <!-- 无法渲染时显示源码 -->\n <pre v-else class=\"mermaid-source-code\">{{ code }}</pre>\n </div>\n </div>\n</template>\n","import { normalizeClass as _normalizeClass, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nconst _hoisted_1 = [\"innerHTML\"]\n\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n return (_openBlock(), _createElementBlock(\"span\", {\n class: _normalizeClass(['incremark-icon', $props.sizeClass]),\n innerHTML: $props.svg,\n \"aria-hidden\": \"true\"\n }, null, 10 /* CLASS, PROPS */, _hoisted_1))\n}","import script from \"/Users/yishuai/develop/ai/markdown/packages/vue/src/components/SvgIcon.vue?type=script\";import { render } from \"/Users/yishuai/develop/ai/markdown/packages/vue/src/components/SvgIcon.vue?type=template\"; script.render = render;script.__file = \"src/components/SvgIcon.vue\";export default script;","import { createVNode as _createVNode, createTextVNode as _createTextVNode, createElementVNode as _createElementVNode, createCommentVNode as _createCommentVNode, toDisplayString as _toDisplayString, openBlock as _openBlock, createElementBlock as _createElementBlock, Fragment as _Fragment } from \"vue\"\n\nconst _hoisted_1 = { class: \"incremark-mermaid\" }\nconst _hoisted_2 = { class: \"mermaid-header\" }\nconst _hoisted_3 = { class: \"language\" }\nconst _hoisted_4 = { class: \"mermaid-actions\" }\nconst _hoisted_5 = [\"disabled\", \"aria-label\", \"title\"]\nconst _hoisted_6 = [\"aria-label\", \"title\"]\nconst _hoisted_7 = { class: \"mermaid-content\" }\nconst _hoisted_8 = {\n key: 0,\n class: \"mermaid-loading\"\n}\nconst _hoisted_9 = { class: \"mermaid-source-code\" }\nconst _hoisted_10 = { class: \"mermaid-source-code\" }\nconst _hoisted_11 = [\"innerHTML\"]\nconst _hoisted_12 = { class: \"mermaid-source-code\" }\n\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n return (_openBlock(), _createElementBlock(\"div\", _hoisted_1, [\n _createElementVNode(\"div\", _hoisted_2, [\n _createElementVNode(\"span\", _hoisted_3, [\n _createVNode($setup[\"SvgIcon\"], {\n svg: $setup.GravityMermaid,\n class: \"language-icon\"\n }, null, 8 /* PROPS */, [\"svg\"]),\n _cache[0] || (_cache[0] = _createTextVNode(\" MERMAID \", -1 /* CACHED */))\n ]),\n _createElementVNode(\"div\", _hoisted_4, [\n _createElementVNode(\"button\", {\n class: \"code-btn\",\n onClick: $setup.toggleMermaidView,\n type: \"button\",\n disabled: !$setup.mermaidSvg,\n \"aria-label\": $setup.mermaidViewMode === 'preview' ? $setup.t('mermaid.viewSource') : $setup.t('mermaid.preview'),\n title: $setup.mermaidViewMode === 'preview' ? 'View Source' : 'Preview'\n }, [\n _createVNode($setup[\"SvgIcon\"], {\n svg: $setup.mermaidViewMode === 'preview' ? $setup.LucideCode : $setup.LucideEye\n }, null, 8 /* PROPS */, [\"svg\"])\n ], 8 /* PROPS */, _hoisted_5),\n _createElementVNode(\"button\", {\n class: \"code-btn\",\n onClick: $setup.copyCode,\n type: \"button\",\n \"aria-label\": $setup.copied ? $setup.t('mermaid.copied') : $setup.t('mermaid.copy'),\n title: $setup.copied ? 'Copied!' : 'Copy'\n }, [\n _createVNode($setup[\"SvgIcon\"], {\n svg: $setup.copied ? $setup.LucideCopyCheck : $setup.LucideCopy\n }, null, 8 /* PROPS */, [\"svg\"])\n ], 8 /* PROPS */, _hoisted_6)\n ])\n ]),\n _createElementVNode(\"div\", _hoisted_7, [\n _createCommentVNode(\" 加载中 \"),\n ($setup.mermaidLoading && !$setup.mermaidSvg)\n ? (_openBlock(), _createElementBlock(\"div\", _hoisted_8, [\n _createElementVNode(\"pre\", _hoisted_9, _toDisplayString($setup.code), 1 /* TEXT */)\n ]))\n : ($setup.mermaidViewMode === 'source')\n ? (_openBlock(), _createElementBlock(_Fragment, { key: 1 }, [\n _createCommentVNode(\" 源码模式 \"),\n _createElementVNode(\"pre\", _hoisted_10, _toDisplayString($setup.code), 1 /* TEXT */)\n ], 2112 /* STABLE_FRAGMENT, DEV_ROOT_FRAGMENT */))\n : ($setup.mermaidSvg)\n ? (_openBlock(), _createElementBlock(_Fragment, { key: 2 }, [\n _createCommentVNode(\" 预览模式 \"),\n _createElementVNode(\"div\", {\n innerHTML: $setup.mermaidSvg,\n class: \"mermaid-svg\"\n }, null, 8 /* PROPS */, _hoisted_11)\n ], 2112 /* STABLE_FRAGMENT, DEV_ROOT_FRAGMENT */))\n : (_openBlock(), _createElementBlock(_Fragment, { key: 3 }, [\n _createCommentVNode(\" 无法渲染时显示源码 \"),\n _createElementVNode(\"pre\", _hoisted_12, _toDisplayString($setup.code), 1 /* TEXT */)\n ], 2112 /* STABLE_FRAGMENT, DEV_ROOT_FRAGMENT */))\n ])\n ]))\n}","import script from \"/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkCodeMermaid.vue?type=script\";import { render } from \"/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkCodeMermaid.vue?type=template\"; script.render = render;script.__file = \"src/components/IncremarkCodeMermaid.vue\";export default script;","<script setup lang=\"ts\">\nimport type { Code } from 'mdast'\nimport { computed, onMounted, ref, watch } from 'vue'\nimport { LucideCopy, LucideCopyCheck } from '@incremark/icons'\nimport { isClipboardAvailable } from '@incremark/shared'\nimport SvgIcon from './SvgIcon.vue'\nimport { useShiki } from '../composables/useShiki'\nimport { useLocale } from '../composables/useLocale'\nimport CachedCodeRenderer from './CachedCodeRenderer.vue'\n\ninterface Props {\n node: Code\n /** Shiki 主题,默认 github-dark */\n theme?: string\n /** 默认回退主题(当指定主题加载失败时使用),默认 github-dark */\n fallbackTheme?: string\n /** 是否禁用代码高亮 */\n disableHighlight?: boolean\n /** block 状态 */\n blockStatus?: 'pending' | 'stable' | 'completed'\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n theme: 'github-dark',\n fallbackTheme: 'github-dark',\n disableHighlight: false,\n blockStatus: 'pending'\n})\n\nconst copied = ref(false)\n\nconst language = computed(() => props.node.lang || 'text')\nconst code = computed(() => props.node.value)\n\n// 使用 i18n\nconst { t } = useLocale()\n\n// 使用 Shiki 单例管理器\nconst { highlighterInfo, initHighlighter } = useShiki(props.theme)\n\n// 语言是否已加载完成\nconst isLanguageLoaded = ref(false)\n\n// 是否应该启用高亮(需要有代码内容才开始高亮逻辑)\nconst shouldEnableHighlight = computed(() => {\n return !props.disableHighlight && code.value && code.value.length > 0\n})\n\n// 初始化 highlighter 并加载语言\n// 只有当存在代码内容时才开始加载语言,避免流式渲染时语言标识不完整导致的错误\nwatch([highlighterInfo, language, shouldEnableHighlight], async ([info, lang, shouldHighlight]) => {\n // 如果不需要高亮,直接返回\n if (!shouldHighlight) {\n return\n }\n\n if (!info) {\n await initHighlighter()\n } else if (lang && lang !== 'text') {\n // 检查语言是否已加载\n if (!info.loadedLanguages.has(lang as any)) {\n try {\n isLanguageLoaded.value = false\n // 检查语言是否被 shiki 支持\n const supportedLangs = info.highlighter.getLoadedLanguages()\n const bundledLangs = await import('shiki').then(m => Object.keys(m.bundledLanguages || {}))\n const isSupported = supportedLangs.includes(lang) || bundledLangs.includes(lang)\n\n if (isSupported) {\n await info.highlighter.loadLanguage(lang as any)\n info.loadedLanguages.add(lang as any)\n }\n // 无论是否支持,都标记为已加载(不支持的语言会 fallback 到纯文本显示)\n isLanguageLoaded.value = true\n } catch {\n // 语言加载失败,标记为已加载(回退到无高亮)\n isLanguageLoaded.value = true\n }\n } else {\n isLanguageLoaded.value = true\n }\n } else {\n // text 语言不需要加载\n isLanguageLoaded.value = true\n }\n}, { immediate: true, deep: true })\n\nlet copyTimeoutId: ReturnType<typeof setTimeout> | null = null\n\nasync function copyCode() {\n if (!isClipboardAvailable()) return\n\n try {\n await navigator.clipboard.writeText(code.value)\n copied.value = true\n\n // 清理之前的定时器\n if (copyTimeoutId) {\n clearTimeout(copyTimeoutId)\n }\n\n copyTimeoutId = setTimeout(() => {\n copied.value = false\n }, 2000)\n } catch {\n // 复制失败静默处理\n }\n}\n</script>\n\n<template>\n <div class=\"incremark-code\">\n <div class=\"code-header\">\n <span class=\"language\">{{ language }}</span>\n <button\n class=\"code-btn\"\n @click=\"copyCode\"\n type=\"button\"\n :aria-label=\"copied ? t('code.copied') : t('code.copy')\"\n :title=\"copied ? 'Copied!' : 'Copy'\"\n >\n <SvgIcon :svg=\"copied ? LucideCopyCheck : LucideCopy\" />\n </button>\n </div>\n <div class=\"code-content\">\n <div class=\"shiki-wrapper\">\n <!-- Stream 高亮(只有当存在代码内容且语言加载完成后才渲染) -->\n <CachedCodeRenderer\n v-if=\"shouldEnableHighlight && highlighterInfo && isLanguageLoaded\"\n :code=\"code\"\n :lang=\"language\"\n :theme=\"theme\"\n :highlighter=\"highlighterInfo.highlighter\"\n />\n <!-- 无高亮模式(禁用高亮、无代码内容、或语言未加载完成时显示) -->\n <pre v-else class=\"code-fallback\"><code>{{ code }}</code></pre>\n </div>\n </div>\n </div>\n</template>\n","/**\n * Shiki Highlighter 单例管理器\n *\n * 避免重复创建 Shiki 实例,所有组件共享同一个 highlighter\n */\n\nimport { shallowRef } from 'vue'\nimport type { HighlighterGeneric, BundledLanguage, BundledTheme } from 'shiki'\n\n// ============ 类型定义 ============\n\ninterface HighlighterInfo {\n highlighter: HighlighterGeneric<BundledLanguage, BundledTheme>\n loadedLanguages: Set<BundledLanguage>\n loadedThemes: Set<BundledTheme>\n}\n\n// ============ 单例管理器 ============\n\n/** Shiki highlighter 单例管理器 */\nclass ShikiManager {\n private static instance: ShikiManager | null = null\n\n /** 存储 highlighter 实例,key 为主题名称 */\n private highlighters = new Map<string, HighlighterInfo>()\n\n private constructor() {}\n\n static getInstance(): ShikiManager {\n if (!ShikiManager.instance) {\n ShikiManager.instance = new ShikiManager()\n }\n return ShikiManager.instance\n }\n\n /**\n * 获取或创建 highlighter\n * @param theme 主题名称\n * @returns highlighter 实例\n */\n async getHighlighter(theme: BundledTheme): Promise<HighlighterInfo> {\n // 如果已存在对应主题的 highlighter,直接返回\n if (this.highlighters.has(theme)) {\n return this.highlighters.get(theme)!\n }\n\n // 创建新的 highlighter\n const { createHighlighter } = await import('shiki')\n const highlighter = await createHighlighter({\n themes: [theme],\n langs: []\n })\n\n const info: HighlighterInfo = {\n highlighter,\n loadedLanguages: new Set<BundledLanguage>(),\n loadedThemes: new Set<BundledTheme>([theme])\n }\n\n this.highlighters.set(theme, info)\n return info\n }\n\n /**\n * 加载语言(按需)\n * @param theme 主题名称\n * @param lang 语言名称\n */\n async loadLanguage(theme: BundledTheme, lang: BundledLanguage): Promise<void> {\n const info = this.highlighters.get(theme)\n if (!info || info.loadedLanguages.has(lang)) return\n\n try {\n await info.highlighter.loadLanguage(lang)\n info.loadedLanguages.add(lang)\n } catch {\n // 语言不支持,静默处理\n }\n }\n\n /**\n * 加载主题(按需)\n * @param theme 主题名称\n */\n async loadTheme(theme: BundledTheme): Promise<void> {\n const info = this.highlighters.get(theme)\n if (!info || info.loadedThemes.has(theme)) return\n\n try {\n await info.highlighter.loadTheme(theme)\n info.loadedThemes.add(theme)\n } catch {\n // 主题不支持,静默处理\n }\n }\n\n /**\n * 高亮代码\n * @param theme 主题名称\n * @param code 代码内容\n * @param lang 语言名称\n * @param fallbackTheme 回退主题\n * @returns 高亮后的 HTML\n */\n async codeToHtml(\n theme: BundledTheme,\n code: string,\n lang: BundledLanguage,\n fallbackTheme: BundledTheme\n ): Promise<string> {\n const info = this.highlighters.get(theme)\n if (!info) throw new Error('Highlighter not found')\n\n const actualLang = info.loadedLanguages.has(lang) ? lang : 'text'\n const actualTheme = info.loadedThemes.has(theme) ? theme : fallbackTheme\n\n return info.highlighter.codeToHtml(code, {\n lang: actualLang,\n theme: actualTheme\n })\n }\n\n /**\n * 清理所有 highlighter(应用退出或需要重置时调用)\n */\n disposeAll() {\n for (const [, info] of this.highlighters) {\n if (info.highlighter?.dispose) {\n info.highlighter.dispose()\n }\n }\n this.highlighters.clear()\n }\n}\n\n// ============ 延迟初始化单例 ============\n\nlet shikiManagerInstance: ShikiManager | null = null\n\n/**\n * 获取 ShikiManager 单例(延迟初始化)\n * 避免模块加载时立即创建实例,支持 SSR\n */\nfunction getShikiManager(): ShikiManager {\n if (!shikiManagerInstance) {\n shikiManagerInstance = ShikiManager.getInstance()\n }\n return shikiManagerInstance\n}\n\nexport { getShikiManager, ShikiManager }\n\n// ============ Vue 组合式函数 ============\n\n/**\n * 使用 Shiki Highlighter(组合式函数)\n *\n * @param theme 主题名称\n * @returns Shiki 相关的响应式状态和方法\n */\nexport function useShiki(theme: string) {\n const highlighterInfo = shallowRef<HighlighterInfo | null>(null)\n const isHighlighting = shallowRef(false)\n const isReady = shallowRef(false)\n\n /**\n * 初始化 highlighter(预加载)\n */\n async function initHighlighter(): Promise<void> {\n if (isReady.value) return\n\n try {\n const info = await getShikiManager().getHighlighter(theme as BundledTheme)\n highlighterInfo.value = info\n isReady.value = true\n } catch (e) {\n console.warn('Failed to initialize Shiki highlighter:', e)\n throw e\n }\n }\n\n /**\n * 获取 highlighter\n */\n async function getHighlighter(): Promise<HighlighterInfo> {\n if (!highlighterInfo.value) {\n highlighterInfo.value = await getShikiManager().getHighlighter(theme as BundledTheme)\n isReady.value = true\n }\n return highlighterInfo.value!\n }\n\n /**\n * 高亮代码\n */\n async function highlight(code: string, lang: string, fallbackTheme: string): Promise<string> {\n isHighlighting.value = true\n\n try {\n const info = await getHighlighter()\n\n const manager = getShikiManager()\n\n // 按需加载语言\n if (!info.loadedLanguages.has(lang as BundledLanguage) && lang !== 'text') {\n await manager.loadLanguage(theme as BundledTheme, lang as BundledLanguage)\n }\n\n // 按需加载主题\n if (!info.loadedThemes.has(theme as BundledTheme)) {\n await manager.loadTheme(theme as BundledTheme)\n }\n\n return await manager.codeToHtml(theme as BundledTheme, code, lang as BundledLanguage, fallbackTheme as BundledTheme)\n } catch (e) {\n throw e\n } finally {\n isHighlighting.value = false\n }\n }\n\n return {\n highlighterInfo,\n isHighlighting,\n isReady,\n initHighlighter,\n highlight\n }\n}\n\n","<script setup lang=\"ts\">\nimport { h, ref, reactive, watch, renderList, onMounted, onUnmounted } from 'vue'\nimport { CodeToTokenTransformStream } from 'shiki-stream'\nimport { getTokenStyleObject } from '@shikijs/core'\nimport { objectId } from '@antfu/utils'\n\ninterface Props {\n code: string\n lang: string\n theme: string\n highlighter: any\n}\n\nconst props = defineProps<Props>()\n\nconst emit = defineEmits<{\n 'stream-start': []\n 'stream-end': []\n 'stream-error': []\n}>()\n\n// SSR 检测:Web Streams API 只在浏览器中可用\nconst isBrowser = typeof window !== 'undefined'\n\n// Stream 错误状态\nconst hasStreamError = ref(false)\n\n// Tokens 数组\nconst tokens = reactive<any[]>([])\n\n// Stream 相关状态(只在浏览器中初始化)\nconst index = ref(0)\nlet controller: ReadableStreamController<string> | null = null\nlet textStream: ReadableStream<string> | null = null\nlet tokenStream: ReadableStream<any> | null = null\n\n// 只在浏览器环境中创建 stream\nif (isBrowser) {\n textStream = new ReadableStream<string>({\n start(_controller) {\n controller = _controller\n },\n })\n\n try {\n tokenStream = textStream.pipeThrough(\n new CodeToTokenTransformStream({\n highlighter: props.highlighter,\n lang: props.lang,\n theme: props.theme,\n allowRecalls: true,\n })\n )\n } catch (error) {\n console.error('Failed to create token stream:', error)\n hasStreamError.value = true\n emit('stream-error')\n }\n\n // 消费 stream\n if (tokenStream) {\n tokenStream.pipeTo(new WritableStream({\n write(token) {\n if ('recall' in token)\n tokens.splice(tokens.length - token.recall, token.recall)\n else\n tokens.push(token)\n },\n close: () => {\n emit('stream-end')\n },\n })).catch((error) => {\n console.error('Stream error:', error)\n hasStreamError.value = true\n emit('stream-error')\n })\n }\n}\n\n// 监听 code 变化,增量推送到流中\nwatch(() => props.code, (newCode) => {\n if (!isBrowser || !controller) return\n \n // 只处理增量更新:传入新增的部分\n if (newCode.length > index.value && !hasStreamError.value) {\n const incremental = newCode.slice(index.value)\n controller.enqueue(incremental as any)\n index.value = newCode.length\n }\n}, { immediate: true })\n\n// 渲染函数\nconst render = () => {\n // SSR 或错误时渲染原始代码\n if (hasStreamError.value || !isBrowser || tokens.length === 0) {\n return h('pre', { class: 'shiki incremark-code-stream' }, h('code', {}, props.code))\n }\n\n // 正常渲染高亮代码\n return h(\n 'pre',\n { class: 'shiki incremark-code-stream' },\n h(\n 'code',\n {},\n renderList(tokens, (token: any) => h('span', { key: objectId(token), style: token.htmlStyle || getTokenStyleObject(token) }, token.content)),\n ),\n )\n}\n\n// 组件卸载时清理\nonUnmounted(() => {\n hasStreamError.value = false\n tokens.length = 0\n index.value = 0\n})\n</script>\n\n<template>\n <component :is=\"render\" />\n</template>\n","// src/utils.ts\nfunction clone(something) {\n return doClone(something);\n}\nfunction doClone(something) {\n if (Array.isArray(something)) {\n return cloneArray(something);\n }\n if (something instanceof RegExp) {\n return something;\n }\n if (typeof something === \"object\") {\n return cloneObj(something);\n }\n return something;\n}\nfunction cloneArray(arr) {\n let r = [];\n for (let i = 0, len = arr.length; i < len; i++) {\n r[i] = doClone(arr[i]);\n }\n return r;\n}\nfunction cloneObj(obj) {\n let r = {};\n for (let key in obj) {\n r[key] = doClone(obj[key]);\n }\n return r;\n}\nfunction mergeObjects(target, ...sources) {\n sources.forEach((source) => {\n for (let key in source) {\n target[key] = source[key];\n }\n });\n return target;\n}\nfunction basename(path) {\n const idx = ~path.lastIndexOf(\"/\") || ~path.lastIndexOf(\"\\\\\");\n if (idx === 0) {\n return path;\n } else if (~idx === path.length - 1) {\n return basename(path.substring(0, path.length - 1));\n } else {\n return path.substr(~idx + 1);\n }\n}\nvar CAPTURING_REGEX_SOURCE = /\\$(\\d+)|\\${(\\d+):\\/(downcase|upcase)}/g;\nvar RegexSource = class {\n static hasCaptures(regexSource) {\n if (regexSource === null) {\n return false;\n }\n CAPTURING_REGEX_SOURCE.lastIndex = 0;\n return CAPTURING_REGEX_SOURCE.test(regexSource);\n }\n static replaceCaptures(regexSource, captureSource, captureIndices) {\n return regexSource.replace(CAPTURING_REGEX_SOURCE, (match, index, commandIndex, command) => {\n let capture = captureIndices[parseInt(index || commandIndex, 10)];\n if (capture) {\n let result = captureSource.substring(capture.start, capture.end);\n while (result[0] === \".\") {\n result = result.substring(1);\n }\n switch (command) {\n case \"downcase\":\n return result.toLowerCase();\n case \"upcase\":\n return result.toUpperCase();\n default:\n return result;\n }\n } else {\n return match;\n }\n });\n }\n};\nfunction strcmp(a, b) {\n if (a < b) {\n return -1;\n }\n if (a > b) {\n return 1;\n }\n return 0;\n}\nfunction strArrCmp(a, b) {\n if (a === null && b === null) {\n return 0;\n }\n if (!a) {\n return -1;\n }\n if (!b) {\n return 1;\n }\n let len1 = a.length;\n let len2 = b.length;\n if (len1 === len2) {\n for (let i = 0; i < len1; i++) {\n let res = strcmp(a[i], b[i]);\n if (res !== 0) {\n return res;\n }\n }\n return 0;\n }\n return len1 - len2;\n}\nfunction isValidHexColor(hex) {\n if (/^#[0-9a-f]{6}$/i.test(hex)) {\n return true;\n }\n if (/^#[0-9a-f]{8}$/i.test(hex)) {\n return true;\n }\n if (/^#[0-9a-f]{3}$/i.test(hex)) {\n return true;\n }\n if (/^#[0-9a-f]{4}$/i.test(hex)) {\n return true;\n }\n return false;\n}\nfunction escapeRegExpCharacters(value) {\n return value.replace(/[\\-\\\\\\{\\}\\*\\+\\?\\|\\^\\$\\.\\,\\[\\]\\(\\)\\#\\s]/g, \"\\\\$&\");\n}\nvar CachedFn = class {\n constructor(fn) {\n this.fn = fn;\n }\n cache = /* @__PURE__ */ new Map();\n get(key) {\n if (this.cache.has(key)) {\n return this.cache.get(key);\n }\n const value = this.fn(key);\n this.cache.set(key, value);\n return value;\n }\n};\n\n// src/theme.ts\nvar Theme = class {\n constructor(_colorMap, _defaults, _root) {\n this._colorMap = _colorMap;\n this._defaults = _defaults;\n this._root = _root;\n }\n static createFromRawTheme(source, colorMap) {\n return this.createFromParsedTheme(parseTheme(source), colorMap);\n }\n static createFromParsedTheme(source, colorMap) {\n return resolveParsedThemeRules(source, colorMap);\n }\n _cachedMatchRoot = new CachedFn(\n (scopeName) => this._root.match(scopeName)\n );\n getColorMap() {\n return this._colorMap.getColorMap();\n }\n getDefaults() {\n return this._defaults;\n }\n match(scopePath) {\n if (scopePath === null) {\n return this._defaults;\n }\n const scopeName = scopePath.scopeName;\n const matchingTrieElements = this._cachedMatchRoot.get(scopeName);\n const effectiveRule = matchingTrieElements.find(\n (v) => _scopePathMatchesParentScopes(scopePath.parent, v.parentScopes)\n );\n if (!effectiveRule) {\n return null;\n }\n return new StyleAttributes(\n effectiveRule.fontStyle,\n effectiveRule.foreground,\n effectiveRule.background\n );\n }\n};\nvar ScopeStack = class _ScopeStack {\n constructor(parent, scopeName) {\n this.parent = parent;\n this.scopeName = scopeName;\n }\n static push(path, scopeNames) {\n for (const name of scopeNames) {\n path = new _ScopeStack(path, name);\n }\n return path;\n }\n static from(...segments) {\n let result = null;\n for (let i = 0; i < segments.length; i++) {\n result = new _ScopeStack(result, segments[i]);\n }\n return result;\n }\n push(scopeName) {\n return new _ScopeStack(this, scopeName);\n }\n getSegments() {\n let item = this;\n const result = [];\n while (item) {\n result.push(item.scopeName);\n item = item.parent;\n }\n result.reverse();\n return result;\n }\n toString() {\n return this.getSegments().join(\" \");\n }\n extends(other) {\n if (this === other) {\n return true;\n }\n if (this.parent === null) {\n return false;\n }\n return this.parent.extends(other);\n }\n getExtensionIfDefined(base) {\n const result = [];\n let item = this;\n while (item && item !== base) {\n result.push(item.scopeName);\n item = item.parent;\n }\n return item === base ? result.reverse() : void 0;\n }\n};\nfunction _scopePathMatchesParentScopes(scopePath, parentScopes) {\n if (parentScopes.length === 0) {\n return true;\n }\n for (let index = 0; index < parentScopes.length; index++) {\n let scopePattern = parentScopes[index];\n let scopeMustMatch = false;\n if (scopePattern === \">\") {\n if (index === parentScopes.length - 1) {\n return false;\n }\n scopePattern = parentScopes[++index];\n scopeMustMatch = true;\n }\n while (scopePath) {\n if (_matchesScope(scopePath.scopeName, scopePattern)) {\n break;\n }\n if (scopeMustMatch) {\n return false;\n }\n scopePath = scopePath.parent;\n }\n if (!scopePath) {\n return false;\n }\n scopePath = scopePath.parent;\n }\n return true;\n}\nfunction _matchesScope(scopeName, scopePattern) {\n return scopePattern === scopeName || scopeName.startsWith(scopePattern) && scopeName[scopePattern.length] === \".\";\n}\nvar StyleAttributes = class {\n constructor(fontStyle, foregroundId, backgroundId) {\n this.fontStyle = fontStyle;\n this.foregroundId = foregroundId;\n this.backgroundId = backgroundId;\n }\n};\nfunction parseTheme(source) {\n if (!source) {\n return [];\n }\n if (!source.settings || !Array.isArray(source.settings)) {\n return [];\n }\n let settings = source.settings;\n let result = [], resultLen = 0;\n for (let i = 0, len = settings.length; i < len; i++) {\n let entry = settings[i];\n if (!entry.settings) {\n continue;\n }\n let scopes;\n if (typeof entry.scope === \"string\") {\n let _scope = entry.scope;\n _scope = _scope.replace(/^[,]+/, \"\");\n _scope = _scope.replace(/[,]+$/, \"\");\n scopes = _scope.split(\",\");\n } else if (Array.isArray(entry.scope)) {\n scopes = entry.scope;\n } else {\n scopes = [\"\"];\n }\n let fontStyle = -1 /* NotSet */;\n if (typeof entry.settings.fontStyle === \"string\") {\n fontStyle = 0 /* None */;\n let segments = entry.settings.fontStyle.split(\" \");\n for (let j = 0, lenJ = segments.length; j < lenJ; j++) {\n let segment = segments[j];\n switch (segment) {\n case \"italic\":\n fontStyle = fontStyle | 1 /* Italic */;\n break;\n case \"bold\":\n fontStyle = fontStyle | 2 /* Bold */;\n break;\n case \"underline\":\n fontStyle = fontStyle | 4 /* Underline */;\n break;\n case \"strikethrough\":\n fontStyle = fontStyle | 8 /* Strikethrough */;\n break;\n }\n }\n }\n let foreground = null;\n if (typeof entry.settings.foreground === \"string\" && isValidHexColor(entry.settings.foreground)) {\n foreground = entry.settings.foreground;\n }\n let background = null;\n if (typeof entry.settings.background === \"string\" && isValidHexColor(entry.settings.background)) {\n background = entry.settings.background;\n }\n for (let j = 0, lenJ = scopes.length; j < lenJ; j++) {\n let _scope = scopes[j].trim();\n let segments = _scope.split(\" \");\n let scope = segments[segments.length - 1];\n let parentScopes = null;\n if (segments.length > 1) {\n parentScopes = segments.slice(0, segments.length - 1);\n parentScopes.reverse();\n }\n result[resultLen++] = new ParsedThemeRule(\n scope,\n parentScopes,\n i,\n fontStyle,\n foreground,\n background\n );\n }\n }\n return result;\n}\nvar ParsedThemeRule = class {\n constructor(scope, parentScopes, index, fontStyle, foreground, background) {\n this.scope = scope;\n this.parentScopes = parentScopes;\n this.index = index;\n this.fontStyle = fontStyle;\n this.foreground = foreground;\n this.background = background;\n }\n};\nvar FontStyle = /* @__PURE__ */ ((FontStyle2) => {\n FontStyle2[FontStyle2[\"NotSet\"] = -1] = \"NotSet\";\n FontStyle2[FontStyle2[\"None\"] = 0] = \"None\";\n FontStyle2[FontStyle2[\"Italic\"] = 1] = \"Italic\";\n FontStyle2[FontStyle2[\"Bold\"] = 2] = \"Bold\";\n FontStyle2[FontStyle2[\"Underline\"] = 4] = \"Underline\";\n FontStyle2[FontStyle2[\"Strikethrough\"] = 8] = \"Strikethrough\";\n return FontStyle2;\n})(FontStyle || {});\nfunction resolveParsedThemeRules(parsedThemeRules, _colorMap) {\n parsedThemeRules.sort((a, b) => {\n let r = strcmp(a.scope, b.scope);\n if (r !== 0) {\n return r;\n }\n r = strArrCmp(a.parentScopes, b.parentScopes);\n if (r !== 0) {\n return r;\n }\n return a.index - b.index;\n });\n let defaultFontStyle = 0 /* None */;\n let defaultForeground = \"#000000\";\n let defaultBackground = \"#ffffff\";\n while (parsedThemeRules.length >= 1 && parsedThemeRules[0].scope === \"\") {\n let incomingDefaults = parsedThemeRules.shift();\n if (incomingDefaults.fontStyle !== -1 /* NotSet */) {\n defaultFontStyle = incomingDefaults.fontStyle;\n }\n if (incomingDefaults.foreground !== null) {\n defaultForeground = incomingDefaults.foreground;\n }\n if (incomingDefaults.background !== null) {\n defaultBackground = incomingDefaults.background;\n }\n }\n let colorMap = new ColorMap(_colorMap);\n let defaults = new StyleAttributes(defaultFontStyle, colorMap.getId(defaultForeground), colorMap.getId(defaultBackground));\n let root = new ThemeTrieElement(new ThemeTrieElementRule(0, null, -1 /* NotSet */, 0, 0), []);\n for (let i = 0, len = parsedThemeRules.length; i < len; i++) {\n let rule = parsedThemeRules[i];\n root.insert(0, rule.scope, rule.parentScopes, rule.fontStyle, colorMap.getId(rule.foreground), colorMap.getId(rule.background));\n }\n return new Theme(colorMap, defaults, root);\n}\nvar ColorMap = class {\n _isFrozen;\n _lastColorId;\n _id2color;\n _color2id;\n constructor(_colorMap) {\n this._lastColorId = 0;\n this._id2color = [];\n this._color2id = /* @__PURE__ */ Object.create(null);\n if (Array.isArray(_colorMap)) {\n this._isFrozen = true;\n for (let i = 0, len = _colorMap.length; i < len; i++) {\n this._color2id[_colorMap[i]] = i;\n this._id2color[i] = _colorMap[i];\n }\n } else {\n this._isFrozen = false;\n }\n }\n getId(color) {\n if (color === null) {\n return 0;\n }\n color = color.toUpperCase();\n let value = this._color2id[color];\n if (value) {\n return value;\n }\n if (this._isFrozen) {\n throw new Error(`Missing color in color map - ${color}`);\n }\n value = ++this._lastColorId;\n this._color2id[color] = value;\n this._id2color[value] = color;\n return value;\n }\n getColorMap() {\n return this._id2color.slice(0);\n }\n};\nvar emptyParentScopes = Object.freeze([]);\nvar ThemeTrieElementRule = class _ThemeTrieElementRule {\n scopeDepth;\n parentScopes;\n fontStyle;\n foreground;\n background;\n constructor(scopeDepth, parentScopes, fontStyle, foreground, background) {\n this.scopeDepth = scopeDepth;\n this.parentScopes = parentScopes || emptyParentScopes;\n this.fontStyle = fontStyle;\n this.foreground = foreground;\n this.background = background;\n }\n clone() {\n return new _ThemeTrieElementRule(this.scopeDepth, this.parentScopes, this.fontStyle, this.foreground, this.background);\n }\n static cloneArr(arr) {\n let r = [];\n for (let i = 0, len = arr.length; i < len; i++) {\n r[i] = arr[i].clone();\n }\n return r;\n }\n acceptOverwrite(scopeDepth, fontStyle, foreground, background) {\n if (this.scopeDepth > scopeDepth) {\n console.log(\"how did this happen?\");\n } else {\n this.scopeDepth = scopeDepth;\n }\n if (fontStyle !== -1 /* NotSet */) {\n this.fontStyle = fontStyle;\n }\n if (foreground !== 0) {\n this.foreground = foreground;\n }\n if (background !== 0) {\n this.background = background;\n }\n }\n};\nvar ThemeTrieElement = class _ThemeTrieElement {\n constructor(_mainRule, rulesWithParentScopes = [], _children = {}) {\n this._mainRule = _mainRule;\n this._children = _children;\n this._rulesWithParentScopes = rulesWithParentScopes;\n }\n _rulesWithParentScopes;\n static _cmpBySpecificity(a, b) {\n if (a.scopeDepth !== b.scopeDepth) {\n return b.scopeDepth - a.scopeDepth;\n }\n let aParentIndex = 0;\n let bParentIndex = 0;\n while (true) {\n if (a.parentScopes[aParentIndex] === \">\") {\n aParentIndex++;\n }\n if (b.parentScopes[bParentIndex] === \">\") {\n bParentIndex++;\n }\n if (aParentIndex >= a.parentScopes.length || bParentIndex >= b.parentScopes.length) {\n break;\n }\n const parentScopeLengthDiff = b.parentScopes[bParentIndex].length - a.parentScopes[aParentIndex].length;\n if (parentScopeLengthDiff !== 0) {\n return parentScopeLengthDiff;\n }\n aParentIndex++;\n bParentIndex++;\n }\n return b.parentScopes.length - a.parentScopes.length;\n }\n match(scope) {\n if (scope !== \"\") {\n let dotIndex = scope.indexOf(\".\");\n let head;\n let tail;\n if (dotIndex === -1) {\n head = scope;\n tail = \"\";\n } else {\n head = scope.substring(0, dotIndex);\n tail = scope.substring(dotIndex + 1);\n }\n if (this._children.hasOwnProperty(head)) {\n return this._children[head].match(tail);\n }\n }\n const rules = this._rulesWithParentScopes.concat(this._mainRule);\n rules.sort(_ThemeTrieElement._cmpBySpecificity);\n return rules;\n }\n insert(scopeDepth, scope, parentScopes, fontStyle, foreground, background) {\n if (scope === \"\") {\n this._doInsertHere(scopeDepth, parentScopes, fontStyle, foreground, background);\n return;\n }\n let dotIndex = scope.indexOf(\".\");\n let head;\n let tail;\n if (dotIndex === -1) {\n head = scope;\n tail = \"\";\n } else {\n head = scope.substring(0, dotIndex);\n tail = scope.substring(dotIndex + 1);\n }\n let child;\n if (this._children.hasOwnProperty(head)) {\n child = this._children[head];\n } else {\n child = new _ThemeTrieElement(this._mainRule.clone(), ThemeTrieElementRule.cloneArr(this._rulesWithParentScopes));\n this._children[head] = child;\n }\n child.insert(scopeDepth + 1, tail, parentScopes, fontStyle, foreground, background);\n }\n _doInsertHere(scopeDepth, parentScopes, fontStyle, foreground, background) {\n if (parentScopes === null) {\n this._mainRule.acceptOverwrite(scopeDepth, fontStyle, foreground, background);\n return;\n }\n for (let i = 0, len = this._rulesWithParentScopes.length; i < len; i++) {\n let rule = this._rulesWithParentScopes[i];\n if (strArrCmp(rule.parentScopes, parentScopes) === 0) {\n rule.acceptOverwrite(scopeDepth, fontStyle, foreground, background);\n return;\n }\n }\n if (fontStyle === -1 /* NotSet */) {\n fontStyle = this._mainRule.fontStyle;\n }\n if (foreground === 0) {\n foreground = this._mainRule.foreground;\n }\n if (background === 0) {\n background = this._mainRule.background;\n }\n this._rulesWithParentScopes.push(new ThemeTrieElementRule(scopeDepth, parentScopes, fontStyle, foreground, background));\n }\n};\n\n// src/encodedTokenAttributes.ts\nvar EncodedTokenMetadata = class _EncodedTokenMetadata {\n static toBinaryStr(encodedTokenAttributes) {\n return encodedTokenAttributes.toString(2).padStart(32, \"0\");\n }\n static print(encodedTokenAttributes) {\n const languageId = _EncodedTokenMetadata.getLanguageId(encodedTokenAttributes);\n const tokenType = _EncodedTokenMetadata.getTokenType(encodedTokenAttributes);\n const fontStyle = _EncodedTokenMetadata.getFontStyle(encodedTokenAttributes);\n const foreground = _EncodedTokenMetadata.getForeground(encodedTokenAttributes);\n const background = _EncodedTokenMetadata.getBackground(encodedTokenAttributes);\n console.log({\n languageId,\n tokenType,\n fontStyle,\n foreground,\n background\n });\n }\n static getLanguageId(encodedTokenAttributes) {\n return (encodedTokenAttributes & 255 /* LANGUAGEID_MASK */) >>> 0 /* LANGUAGEID_OFFSET */;\n }\n static getTokenType(encodedTokenAttributes) {\n return (encodedTokenAttributes & 768 /* TOKEN_TYPE_MASK */) >>> 8 /* TOKEN_TYPE_OFFSET */;\n }\n static containsBalancedBrackets(encodedTokenAttributes) {\n return (encodedTokenAttributes & 1024 /* BALANCED_BRACKETS_MASK */) !== 0;\n }\n static getFontStyle(encodedTokenAttributes) {\n return (encodedTokenAttributes & 30720 /* FONT_STYLE_MASK */) >>> 11 /* FONT_STYLE_OFFSET */;\n }\n static getForeground(encodedTokenAttributes) {\n return (encodedTokenAttributes & 16744448 /* FOREGROUND_MASK */) >>> 15 /* FOREGROUND_OFFSET */;\n }\n static getBackground(encodedTokenAttributes) {\n return (encodedTokenAttributes & 4278190080 /* BACKGROUND_MASK */) >>> 24 /* BACKGROUND_OFFSET */;\n }\n /**\n * Updates the fields in `metadata`.\n * A value of `0`, `NotSet` or `null` indicates that the corresponding field should be left as is.\n */\n static set(encodedTokenAttributes, languageId, tokenType, containsBalancedBrackets, fontStyle, foreground, background) {\n let _languageId = _EncodedTokenMetadata.getLanguageId(encodedTokenAttributes);\n let _tokenType = _EncodedTokenMetadata.getTokenType(encodedTokenAttributes);\n let _containsBalancedBracketsBit = _EncodedTokenMetadata.containsBalancedBrackets(encodedTokenAttributes) ? 1 : 0;\n let _fontStyle = _EncodedTokenMetadata.getFontStyle(encodedTokenAttributes);\n let _foreground = _EncodedTokenMetadata.getForeground(encodedTokenAttributes);\n let _background = _EncodedTokenMetadata.getBackground(encodedTokenAttributes);\n if (languageId !== 0) {\n _languageId = languageId;\n }\n if (tokenType !== 8 /* NotSet */) {\n _tokenType = fromOptionalTokenType(tokenType);\n }\n if (containsBalancedBrackets !== null) {\n _containsBalancedBracketsBit = containsBalancedBrackets ? 1 : 0;\n }\n if (fontStyle !== -1 /* NotSet */) {\n _fontStyle = fontStyle;\n }\n if (foreground !== 0) {\n _foreground = foreground;\n }\n if (background !== 0) {\n _background = background;\n }\n return (_languageId << 0 /* LANGUAGEID_OFFSET */ | _tokenType << 8 /* TOKEN_TYPE_OFFSET */ | _containsBalancedBracketsBit << 10 /* BALANCED_BRACKETS_OFFSET */ | _fontStyle << 11 /* FONT_STYLE_OFFSET */ | _foreground << 15 /* FOREGROUND_OFFSET */ | _background << 24 /* BACKGROUND_OFFSET */) >>> 0;\n }\n};\nfunction toOptionalTokenType(standardType) {\n return standardType;\n}\nfunction fromOptionalTokenType(standardType) {\n return standardType;\n}\n\n// src/matcher.ts\nfunction createMatchers(selector, matchesName) {\n const results = [];\n const tokenizer = newTokenizer(selector);\n let token = tokenizer.next();\n while (token !== null) {\n let priority = 0;\n if (token.length === 2 && token.charAt(1) === \":\") {\n switch (token.charAt(0)) {\n case \"R\":\n priority = 1;\n break;\n case \"L\":\n priority = -1;\n break;\n default:\n console.log(`Unknown priority ${token} in scope selector`);\n }\n token = tokenizer.next();\n }\n let matcher = parseConjunction();\n results.push({ matcher, priority });\n if (token !== \",\") {\n break;\n }\n token = tokenizer.next();\n }\n return results;\n function parseOperand() {\n if (token === \"-\") {\n token = tokenizer.next();\n const expressionToNegate = parseOperand();\n return (matcherInput) => !!expressionToNegate && !expressionToNegate(matcherInput);\n }\n if (token === \"(\") {\n token = tokenizer.next();\n const expressionInParents = parseInnerExpression();\n if (token === \")\") {\n token = tokenizer.next();\n }\n return expressionInParents;\n }\n if (isIdentifier(token)) {\n const identifiers = [];\n do {\n identifiers.push(token);\n token = tokenizer.next();\n } while (isIdentifier(token));\n return (matcherInput) => matchesName(identifiers, matcherInput);\n }\n return null;\n }\n function parseConjunction() {\n const matchers = [];\n let matcher = parseOperand();\n while (matcher) {\n matchers.push(matcher);\n matcher = parseOperand();\n }\n return (matcherInput) => matchers.every((matcher2) => matcher2(matcherInput));\n }\n function parseInnerExpression() {\n const matchers = [];\n let matcher = parseConjunction();\n while (matcher) {\n matchers.push(matcher);\n if (token === \"|\" || token === \",\") {\n do {\n token = tokenizer.next();\n } while (token === \"|\" || token === \",\");\n } else {\n break;\n }\n matcher = parseConjunction();\n }\n return (matcherInput) => matchers.some((matcher2) => matcher2(matcherInput));\n }\n}\nfunction isIdentifier(token) {\n return !!token && !!token.match(/[\\w\\.:]+/);\n}\nfunction newTokenizer(input) {\n let regex = /([LR]:|[\\w\\.:][\\w\\.:\\-]*|[\\,\\|\\-\\(\\)])/g;\n let match = regex.exec(input);\n return {\n next: () => {\n if (!match) {\n return null;\n }\n const res = match[0];\n match = regex.exec(input);\n return res;\n }\n };\n}\n\n// src/onigLib.ts\nvar FindOption = /* @__PURE__ */ ((FindOption2) => {\n FindOption2[FindOption2[\"None\"] = 0] = \"None\";\n FindOption2[FindOption2[\"NotBeginString\"] = 1] = \"NotBeginString\";\n FindOption2[FindOption2[\"NotEndString\"] = 2] = \"NotEndString\";\n FindOption2[FindOption2[\"NotBeginPosition\"] = 4] = \"NotBeginPosition\";\n FindOption2[FindOption2[\"DebugCall\"] = 8] = \"DebugCall\";\n return FindOption2;\n})(FindOption || {});\nfunction disposeOnigString(str) {\n if (typeof str.dispose === \"function\") {\n str.dispose();\n }\n}\n\n// src/grammar/grammarDependencies.ts\nvar TopLevelRuleReference = class {\n constructor(scopeName) {\n this.scopeName = scopeName;\n }\n toKey() {\n return this.scopeName;\n }\n};\nvar TopLevelRepositoryRuleReference = class {\n constructor(scopeName, ruleName) {\n this.scopeName = scopeName;\n this.ruleName = ruleName;\n }\n toKey() {\n return `${this.scopeName}#${this.ruleName}`;\n }\n};\nvar ExternalReferenceCollector = class {\n _references = [];\n _seenReferenceKeys = /* @__PURE__ */ new Set();\n get references() {\n return this._references;\n }\n visitedRule = /* @__PURE__ */ new Set();\n add(reference) {\n const key = reference.toKey();\n if (this._seenReferenceKeys.has(key)) {\n return;\n }\n this._seenReferenceKeys.add(key);\n this._references.push(reference);\n }\n};\nvar ScopeDependencyProcessor = class {\n constructor(repo, initialScopeName) {\n this.repo = repo;\n this.initialScopeName = initialScopeName;\n this.seenFullScopeRequests.add(this.initialScopeName);\n this.Q = [new TopLevelRuleReference(this.initialScopeName)];\n }\n seenFullScopeRequests = /* @__PURE__ */ new Set();\n seenPartialScopeRequests = /* @__PURE__ */ new Set();\n Q;\n processQueue() {\n const q = this.Q;\n this.Q = [];\n const deps = new ExternalReferenceCollector();\n for (const dep of q) {\n collectReferencesOfReference(dep, this.initialScopeName, this.repo, deps);\n }\n for (const dep of deps.references) {\n if (dep instanceof TopLevelRuleReference) {\n if (this.seenFullScopeRequests.has(dep.scopeName)) {\n continue;\n }\n this.seenFullScopeRequests.add(dep.scopeName);\n this.Q.push(dep);\n } else {\n if (this.seenFullScopeRequests.has(dep.scopeName)) {\n continue;\n }\n if (this.seenPartialScopeRequests.has(dep.toKey())) {\n continue;\n }\n this.seenPartialScopeRequests.add(dep.toKey());\n this.Q.push(dep);\n }\n }\n }\n};\nfunction collectReferencesOfReference(reference, baseGrammarScopeName, repo, result) {\n const selfGrammar = repo.lookup(reference.scopeName);\n if (!selfGrammar) {\n if (reference.scopeName === baseGrammarScopeName) {\n throw new Error(`No grammar provided for <${baseGrammarScopeName}>`);\n }\n return;\n }\n const baseGrammar = repo.lookup(baseGrammarScopeName);\n if (reference instanceof TopLevelRuleReference) {\n collectExternalReferencesInTopLevelRule({ baseGrammar, selfGrammar }, result);\n } else {\n collectExternalReferencesInTopLevelRepositoryRule(\n reference.ruleName,\n { baseGrammar, selfGrammar, repository: selfGrammar.repository },\n result\n );\n }\n const injections = repo.injections(reference.scopeName);\n if (injections) {\n for (const injection of injections) {\n result.add(new TopLevelRuleReference(injection));\n }\n }\n}\nfunction collectExternalReferencesInTopLevelRepositoryRule(ruleName, context, result) {\n if (context.repository && context.repository[ruleName]) {\n const rule = context.repository[ruleName];\n collectExternalReferencesInRules([rule], context, result);\n }\n}\nfunction collectExternalReferencesInTopLevelRule(context, result) {\n if (context.selfGrammar.patterns && Array.isArray(context.selfGrammar.patterns)) {\n collectExternalReferencesInRules(\n context.selfGrammar.patterns,\n { ...context, repository: context.selfGrammar.repository },\n result\n );\n }\n if (context.selfGrammar.injections) {\n collectExternalReferencesInRules(\n Object.values(context.selfGrammar.injections),\n { ...context, repository: context.selfGrammar.repository },\n result\n );\n }\n}\nfunction collectExternalReferencesInRules(rules, context, result) {\n for (const rule of rules) {\n if (result.visitedRule.has(rule)) {\n continue;\n }\n result.visitedRule.add(rule);\n const patternRepository = rule.repository ? mergeObjects({}, context.repository, rule.repository) : context.repository;\n if (Array.isArray(rule.patterns)) {\n collectExternalReferencesInRules(rule.patterns, { ...context, repository: patternRepository }, result);\n }\n const include = rule.include;\n if (!include) {\n continue;\n }\n const reference = parseInclude(include);\n switch (reference.kind) {\n case 0 /* Base */:\n collectExternalReferencesInTopLevelRule({ ...context, selfGrammar: context.baseGrammar }, result);\n break;\n case 1 /* Self */:\n collectExternalReferencesInTopLevelRule(context, result);\n break;\n case 2 /* RelativeReference */:\n collectExternalReferencesInTopLevelRepositoryRule(reference.ruleName, { ...context, repository: patternRepository }, result);\n break;\n case 3 /* TopLevelReference */:\n case 4 /* TopLevelRepositoryReference */:\n const selfGrammar = reference.scopeName === context.selfGrammar.scopeName ? context.selfGrammar : reference.scopeName === context.baseGrammar.scopeName ? context.baseGrammar : void 0;\n if (selfGrammar) {\n const newContext = { baseGrammar: context.baseGrammar, selfGrammar, repository: patternRepository };\n if (reference.kind === 4 /* TopLevelRepositoryReference */) {\n collectExternalReferencesInTopLevelRepositoryRule(reference.ruleName, newContext, result);\n } else {\n collectExternalReferencesInTopLevelRule(newContext, result);\n }\n } else {\n if (reference.kind === 4 /* TopLevelRepositoryReference */) {\n result.add(new TopLevelRepositoryRuleReference(reference.scopeName, reference.ruleName));\n } else {\n result.add(new TopLevelRuleReference(reference.scopeName));\n }\n }\n break;\n }\n }\n}\nvar BaseReference = class {\n kind = 0 /* Base */;\n};\nvar SelfReference = class {\n kind = 1 /* Self */;\n};\nvar RelativeReference = class {\n constructor(ruleName) {\n this.ruleName = ruleName;\n }\n kind = 2 /* RelativeReference */;\n};\nvar TopLevelReference = class {\n constructor(scopeName) {\n this.scopeName = scopeName;\n }\n kind = 3 /* TopLevelReference */;\n};\nvar TopLevelRepositoryReference = class {\n constructor(scopeName, ruleName) {\n this.scopeName = scopeName;\n this.ruleName = ruleName;\n }\n kind = 4 /* TopLevelRepositoryReference */;\n};\nfunction parseInclude(include) {\n if (include === \"$base\") {\n return new BaseReference();\n } else if (include === \"$self\") {\n return new SelfReference();\n }\n const indexOfSharp = include.indexOf(\"#\");\n if (indexOfSharp === -1) {\n return new TopLevelReference(include);\n } else if (indexOfSharp === 0) {\n return new RelativeReference(include.substring(1));\n } else {\n const scopeName = include.substring(0, indexOfSharp);\n const ruleName = include.substring(indexOfSharp + 1);\n return new TopLevelRepositoryReference(scopeName, ruleName);\n }\n}\n\n// src/rule.ts\nvar HAS_BACK_REFERENCES = /\\\\(\\d+)/;\nvar BACK_REFERENCING_END = /\\\\(\\d+)/g;\nvar ruleIdSymbol = Symbol(\"RuleId\");\nvar endRuleId = -1;\nvar whileRuleId = -2;\nfunction ruleIdFromNumber(id) {\n return id;\n}\nfunction ruleIdToNumber(id) {\n return id;\n}\nvar Rule = class {\n $location;\n id;\n _nameIsCapturing;\n _name;\n _contentNameIsCapturing;\n _contentName;\n constructor($location, id, name, contentName) {\n this.$location = $location;\n this.id = id;\n this._name = name || null;\n this._nameIsCapturing = RegexSource.hasCaptures(this._name);\n this._contentName = contentName || null;\n this._contentNameIsCapturing = RegexSource.hasCaptures(this._contentName);\n }\n get debugName() {\n const location = this.$location ? `${basename(this.$location.filename)}:${this.$location.line}` : \"unknown\";\n return `${this.constructor.name}#${this.id} @ ${location}`;\n }\n getName(lineText, captureIndices) {\n if (!this._nameIsCapturing || this._name === null || lineText === null || captureIndices === null) {\n return this._name;\n }\n return RegexSource.replaceCaptures(this._name, lineText, captureIndices);\n }\n getContentName(lineText, captureIndices) {\n if (!this._contentNameIsCapturing || this._contentName === null) {\n return this._contentName;\n }\n return RegexSource.replaceCaptures(this._contentName, lineText, captureIndices);\n }\n};\nvar CaptureRule = class extends Rule {\n retokenizeCapturedWithRuleId;\n constructor($location, id, name, contentName, retokenizeCapturedWithRuleId) {\n super($location, id, name, contentName);\n this.retokenizeCapturedWithRuleId = retokenizeCapturedWithRuleId;\n }\n dispose() {\n }\n collectPatterns(grammar, out) {\n throw new Error(\"Not supported!\");\n }\n compile(grammar, endRegexSource) {\n throw new Error(\"Not supported!\");\n }\n compileAG(grammar, endRegexSource, allowA, allowG) {\n throw new Error(\"Not supported!\");\n }\n};\nvar MatchRule = class extends Rule {\n _match;\n captures;\n _cachedCompiledPatterns;\n constructor($location, id, name, match, captures) {\n super($location, id, name, null);\n this._match = new RegExpSource(match, this.id);\n this.captures = captures;\n this._cachedCompiledPatterns = null;\n }\n dispose() {\n if (this._cachedCompiledPatterns) {\n this._cachedCompiledPatterns.dispose();\n this._cachedCompiledPatterns = null;\n }\n }\n get debugMatchRegExp() {\n return `${this._match.source}`;\n }\n collectPatterns(grammar, out) {\n out.push(this._match);\n }\n compile(grammar, endRegexSource) {\n return this._getCachedCompiledPatterns(grammar).compile(grammar);\n }\n compileAG(grammar, endRegexSource, allowA, allowG) {\n return this._getCachedCompiledPatterns(grammar).compileAG(grammar, allowA, allowG);\n }\n _getCachedCompiledPatterns(grammar) {\n if (!this._cachedCompiledPatterns) {\n this._cachedCompiledPatterns = new RegExpSourceList();\n this.collectPatterns(grammar, this._cachedCompiledPatterns);\n }\n return this._cachedCompiledPatterns;\n }\n};\nvar IncludeOnlyRule = class extends Rule {\n hasMissingPatterns;\n patterns;\n _cachedCompiledPatterns;\n constructor($location, id, name, contentName, patterns) {\n super($location, id, name, contentName);\n this.patterns = patterns.patterns;\n this.hasMissingPatterns = patterns.hasMissingPatterns;\n this._cachedCompiledPatterns = null;\n }\n dispose() {\n if (this._cachedCompiledPatterns) {\n this._cachedCompiledPatterns.dispose();\n this._cachedCompiledPatterns = null;\n }\n }\n collectPatterns(grammar, out) {\n for (const pattern of this.patterns) {\n const rule = grammar.getRule(pattern);\n rule.collectPatterns(grammar, out);\n }\n }\n compile(grammar, endRegexSource) {\n return this._getCachedCompiledPatterns(grammar).compile(grammar);\n }\n compileAG(grammar, endRegexSource, allowA, allowG) {\n return this._getCachedCompiledPatterns(grammar).compileAG(grammar, allowA, allowG);\n }\n _getCachedCompiledPatterns(grammar) {\n if (!this._cachedCompiledPatterns) {\n this._cachedCompiledPatterns = new RegExpSourceList();\n this.collectPatterns(grammar, this._cachedCompiledPatterns);\n }\n return this._cachedCompiledPatterns;\n }\n};\nvar BeginEndRule = class extends Rule {\n _begin;\n beginCaptures;\n _end;\n endHasBackReferences;\n endCaptures;\n applyEndPatternLast;\n hasMissingPatterns;\n patterns;\n _cachedCompiledPatterns;\n constructor($location, id, name, contentName, begin, beginCaptures, end, endCaptures, applyEndPatternLast, patterns) {\n super($location, id, name, contentName);\n this._begin = new RegExpSource(begin, this.id);\n this.beginCaptures = beginCaptures;\n this._end = new RegExpSource(end ? end : \"\\uFFFF\", -1);\n this.endHasBackReferences = this._end.hasBackReferences;\n this.endCaptures = endCaptures;\n this.applyEndPatternLast = applyEndPatternLast || false;\n this.patterns = patterns.patterns;\n this.hasMissingPatterns = patterns.hasMissingPatterns;\n this._cachedCompiledPatterns = null;\n }\n dispose() {\n if (this._cachedCompiledPatterns) {\n this._cachedCompiledPatterns.dispose();\n this._cachedCompiledPatterns = null;\n }\n }\n get debugBeginRegExp() {\n return `${this._begin.source}`;\n }\n get debugEndRegExp() {\n return `${this._end.source}`;\n }\n getEndWithResolvedBackReferences(lineText, captureIndices) {\n return this._end.resolveBackReferences(lineText, captureIndices);\n }\n collectPatterns(grammar, out) {\n out.push(this._begin);\n }\n compile(grammar, endRegexSource) {\n return this._getCachedCompiledPatterns(grammar, endRegexSource).compile(grammar);\n }\n compileAG(grammar, endRegexSource, allowA, allowG) {\n return this._getCachedCompiledPatterns(grammar, endRegexSource).compileAG(grammar, allowA, allowG);\n }\n _getCachedCompiledPatterns(grammar, endRegexSource) {\n if (!this._cachedCompiledPatterns) {\n this._cachedCompiledPatterns = new RegExpSourceList();\n for (const pattern of this.patterns) {\n const rule = grammar.getRule(pattern);\n rule.collectPatterns(grammar, this._cachedCompiledPatterns);\n }\n if (this.applyEndPatternLast) {\n this._cachedCompiledPatterns.push(this._end.hasBackReferences ? this._end.clone() : this._end);\n } else {\n this._cachedCompiledPatterns.unshift(this._end.hasBackReferences ? this._end.clone() : this._end);\n }\n }\n if (this._end.hasBackReferences) {\n if (this.applyEndPatternLast) {\n this._cachedCompiledPatterns.setSource(this._cachedCompiledPatterns.length() - 1, endRegexSource);\n } else {\n this._cachedCompiledPatterns.setSource(0, endRegexSource);\n }\n }\n return this._cachedCompiledPatterns;\n }\n};\nvar BeginWhileRule = class extends Rule {\n _begin;\n beginCaptures;\n whileCaptures;\n _while;\n whileHasBackReferences;\n hasMissingPatterns;\n patterns;\n _cachedCompiledPatterns;\n _cachedCompiledWhilePatterns;\n constructor($location, id, name, contentName, begin, beginCaptures, _while, whileCaptures, patterns) {\n super($location, id, name, contentName);\n this._begin = new RegExpSource(begin, this.id);\n this.beginCaptures = beginCaptures;\n this.whileCaptures = whileCaptures;\n this._while = new RegExpSource(_while, whileRuleId);\n this.whileHasBackReferences = this._while.hasBackReferences;\n this.patterns = patterns.patterns;\n this.hasMissingPatterns = patterns.hasMissingPatterns;\n this._cachedCompiledPatterns = null;\n this._cachedCompiledWhilePatterns = null;\n }\n dispose() {\n if (this._cachedCompiledPatterns) {\n this._cachedCompiledPatterns.dispose();\n this._cachedCompiledPatterns = null;\n }\n if (this._cachedCompiledWhilePatterns) {\n this._cachedCompiledWhilePatterns.dispose();\n this._cachedCompiledWhilePatterns = null;\n }\n }\n get debugBeginRegExp() {\n return `${this._begin.source}`;\n }\n get debugWhileRegExp() {\n return `${this._while.source}`;\n }\n getWhileWithResolvedBackReferences(lineText, captureIndices) {\n return this._while.resolveBackReferences(lineText, captureIndices);\n }\n collectPatterns(grammar, out) {\n out.push(this._begin);\n }\n compile(grammar, endRegexSource) {\n return this._getCachedCompiledPatterns(grammar).compile(grammar);\n }\n compileAG(grammar, endRegexSource, allowA, allowG) {\n return this._getCachedCompiledPatterns(grammar).compileAG(grammar, allowA, allowG);\n }\n _getCachedCompiledPatterns(grammar) {\n if (!this._cachedCompiledPatterns) {\n this._cachedCompiledPatterns = new RegExpSourceList();\n for (const pattern of this.patterns) {\n const rule = grammar.getRule(pattern);\n rule.collectPatterns(grammar, this._cachedCompiledPatterns);\n }\n }\n return this._cachedCompiledPatterns;\n }\n compileWhile(grammar, endRegexSource) {\n return this._getCachedCompiledWhilePatterns(grammar, endRegexSource).compile(grammar);\n }\n compileWhileAG(grammar, endRegexSource, allowA, allowG) {\n return this._getCachedCompiledWhilePatterns(grammar, endRegexSource).compileAG(grammar, allowA, allowG);\n }\n _getCachedCompiledWhilePatterns(grammar, endRegexSource) {\n if (!this._cachedCompiledWhilePatterns) {\n this._cachedCompiledWhilePatterns = new RegExpSourceList();\n this._cachedCompiledWhilePatterns.push(this._while.hasBackReferences ? this._while.clone() : this._while);\n }\n if (this._while.hasBackReferences) {\n this._cachedCompiledWhilePatterns.setSource(0, endRegexSource ? endRegexSource : \"\\uFFFF\");\n }\n return this._cachedCompiledWhilePatterns;\n }\n};\nvar RuleFactory = class _RuleFactory {\n static createCaptureRule(helper, $location, name, contentName, retokenizeCapturedWithRuleId) {\n return helper.registerRule((id) => {\n return new CaptureRule($location, id, name, contentName, retokenizeCapturedWithRuleId);\n });\n }\n static getCompiledRuleId(desc, helper, repository) {\n if (!desc.id) {\n helper.registerRule((id) => {\n desc.id = id;\n if (desc.match) {\n return new MatchRule(\n desc.$vscodeTextmateLocation,\n desc.id,\n desc.name,\n desc.match,\n _RuleFactory._compileCaptures(desc.captures, helper, repository)\n );\n }\n if (typeof desc.begin === \"undefined\") {\n if (desc.repository) {\n repository = mergeObjects({}, repository, desc.repository);\n }\n let patterns = desc.patterns;\n if (typeof patterns === \"undefined\" && desc.include) {\n patterns = [{ include: desc.include }];\n }\n return new IncludeOnlyRule(\n desc.$vscodeTextmateLocation,\n desc.id,\n desc.name,\n desc.contentName,\n _RuleFactory._compilePatterns(patterns, helper, repository)\n );\n }\n if (desc.while) {\n return new BeginWhileRule(\n desc.$vscodeTextmateLocation,\n desc.id,\n desc.name,\n desc.contentName,\n desc.begin,\n _RuleFactory._compileCaptures(desc.beginCaptures || desc.captures, helper, repository),\n desc.while,\n _RuleFactory._compileCaptures(desc.whileCaptures || desc.captures, helper, repository),\n _RuleFactory._compilePatterns(desc.patterns, helper, repository)\n );\n }\n return new BeginEndRule(\n desc.$vscodeTextmateLocation,\n desc.id,\n desc.name,\n desc.contentName,\n desc.begin,\n _RuleFactory._compileCaptures(desc.beginCaptures || desc.captures, helper, repository),\n desc.end,\n _RuleFactory._compileCaptures(desc.endCaptures || desc.captures, helper, repository),\n desc.applyEndPatternLast,\n _RuleFactory._compilePatterns(desc.patterns, helper, repository)\n );\n });\n }\n return desc.id;\n }\n static _compileCaptures(captures, helper, repository) {\n let r = [];\n if (captures) {\n let maximumCaptureId = 0;\n for (const captureId in captures) {\n if (captureId === \"$vscodeTextmateLocation\") {\n continue;\n }\n const numericCaptureId = parseInt(captureId, 10);\n if (numericCaptureId > maximumCaptureId) {\n maximumCaptureId = numericCaptureId;\n }\n }\n for (let i = 0; i <= maximumCaptureId; i++) {\n r[i] = null;\n }\n for (const captureId in captures) {\n if (captureId === \"$vscodeTextmateLocation\") {\n continue;\n }\n const numericCaptureId = parseInt(captureId, 10);\n let retokenizeCapturedWithRuleId = 0;\n if (captures[captureId].patterns) {\n retokenizeCapturedWithRuleId = _RuleFactory.getCompiledRuleId(captures[captureId], helper, repository);\n }\n r[numericCaptureId] = _RuleFactory.createCaptureRule(helper, captures[captureId].$vscodeTextmateLocation, captures[captureId].name, captures[captureId].contentName, retokenizeCapturedWithRuleId);\n }\n }\n return r;\n }\n static _compilePatterns(patterns, helper, repository) {\n let r = [];\n if (patterns) {\n for (let i = 0, len = patterns.length; i < len; i++) {\n const pattern = patterns[i];\n let ruleId = -1;\n if (pattern.include) {\n const reference = parseInclude(pattern.include);\n switch (reference.kind) {\n case 0 /* Base */:\n case 1 /* Self */:\n ruleId = _RuleFactory.getCompiledRuleId(repository[pattern.include], helper, repository);\n break;\n case 2 /* RelativeReference */:\n let localIncludedRule = repository[reference.ruleName];\n if (localIncludedRule) {\n ruleId = _RuleFactory.getCompiledRuleId(localIncludedRule, helper, repository);\n } else {\n }\n break;\n case 3 /* TopLevelReference */:\n case 4 /* TopLevelRepositoryReference */:\n const externalGrammarName = reference.scopeName;\n const externalGrammarInclude = reference.kind === 4 /* TopLevelRepositoryReference */ ? reference.ruleName : null;\n const externalGrammar = helper.getExternalGrammar(externalGrammarName, repository);\n if (externalGrammar) {\n if (externalGrammarInclude) {\n let externalIncludedRule = externalGrammar.repository[externalGrammarInclude];\n if (externalIncludedRule) {\n ruleId = _RuleFactory.getCompiledRuleId(externalIncludedRule, helper, externalGrammar.repository);\n } else {\n }\n } else {\n ruleId = _RuleFactory.getCompiledRuleId(externalGrammar.repository.$self, helper, externalGrammar.repository);\n }\n } else {\n }\n break;\n }\n } else {\n ruleId = _RuleFactory.getCompiledRuleId(pattern, helper, repository);\n }\n if (ruleId !== -1) {\n const rule = helper.getRule(ruleId);\n let skipRule = false;\n if (rule instanceof IncludeOnlyRule || rule instanceof BeginEndRule || rule instanceof BeginWhileRule) {\n if (rule.hasMissingPatterns && rule.patterns.length === 0) {\n skipRule = true;\n }\n }\n if (skipRule) {\n continue;\n }\n r.push(ruleId);\n }\n }\n }\n return {\n patterns: r,\n hasMissingPatterns: (patterns ? patterns.length : 0) !== r.length\n };\n }\n};\nvar RegExpSource = class _RegExpSource {\n source;\n ruleId;\n hasAnchor;\n hasBackReferences;\n _anchorCache;\n constructor(regExpSource, ruleId) {\n if (regExpSource && typeof regExpSource === \"string\") {\n const len = regExpSource.length;\n let lastPushedPos = 0;\n let output = [];\n let hasAnchor = false;\n for (let pos = 0; pos < len; pos++) {\n const ch = regExpSource.charAt(pos);\n if (ch === \"\\\\\") {\n if (pos + 1 < len) {\n const nextCh = regExpSource.charAt(pos + 1);\n if (nextCh === \"z\") {\n output.push(regExpSource.substring(lastPushedPos, pos));\n output.push(\"$(?!\\\\n)(?<!\\\\n)\");\n lastPushedPos = pos + 2;\n } else if (nextCh === \"A\" || nextCh === \"G\") {\n hasAnchor = true;\n }\n pos++;\n }\n }\n }\n this.hasAnchor = hasAnchor;\n if (lastPushedPos === 0) {\n this.source = regExpSource;\n } else {\n output.push(regExpSource.substring(lastPushedPos, len));\n this.source = output.join(\"\");\n }\n } else {\n this.hasAnchor = false;\n this.source = regExpSource;\n }\n if (this.hasAnchor) {\n this._anchorCache = this._buildAnchorCache();\n } else {\n this._anchorCache = null;\n }\n this.ruleId = ruleId;\n if (typeof this.source === \"string\") {\n this.hasBackReferences = HAS_BACK_REFERENCES.test(this.source);\n } else {\n this.hasBackReferences = false;\n }\n }\n clone() {\n return new _RegExpSource(this.source, this.ruleId);\n }\n setSource(newSource) {\n if (this.source === newSource) {\n return;\n }\n this.source = newSource;\n if (this.hasAnchor) {\n this._anchorCache = this._buildAnchorCache();\n }\n }\n resolveBackReferences(lineText, captureIndices) {\n if (typeof this.source !== \"string\") {\n throw new Error(\"This method should only be called if the source is a string\");\n }\n let capturedValues = captureIndices.map((capture) => {\n return lineText.substring(capture.start, capture.end);\n });\n BACK_REFERENCING_END.lastIndex = 0;\n return this.source.replace(BACK_REFERENCING_END, (match, g1) => {\n return escapeRegExpCharacters(capturedValues[parseInt(g1, 10)] || \"\");\n });\n }\n _buildAnchorCache() {\n if (typeof this.source !== \"string\") {\n throw new Error(\"This method should only be called if the source is a string\");\n }\n let A0_G0_result = [];\n let A0_G1_result = [];\n let A1_G0_result = [];\n let A1_G1_result = [];\n let pos, len, ch, nextCh;\n for (pos = 0, len = this.source.length; pos < len; pos++) {\n ch = this.source.charAt(pos);\n A0_G0_result[pos] = ch;\n A0_G1_result[pos] = ch;\n A1_G0_result[pos] = ch;\n A1_G1_result[pos] = ch;\n if (ch === \"\\\\\") {\n if (pos + 1 < len) {\n nextCh = this.source.charAt(pos + 1);\n if (nextCh === \"A\") {\n A0_G0_result[pos + 1] = \"\\uFFFF\";\n A0_G1_result[pos + 1] = \"\\uFFFF\";\n A1_G0_result[pos + 1] = \"A\";\n A1_G1_result[pos + 1] = \"A\";\n } else if (nextCh === \"G\") {\n A0_G0_result[pos + 1] = \"\\uFFFF\";\n A0_G1_result[pos + 1] = \"G\";\n A1_G0_result[pos + 1] = \"\\uFFFF\";\n A1_G1_result[pos + 1] = \"G\";\n } else {\n A0_G0_result[pos + 1] = nextCh;\n A0_G1_result[pos + 1] = nextCh;\n A1_G0_result[pos + 1] = nextCh;\n A1_G1_result[pos + 1] = nextCh;\n }\n pos++;\n }\n }\n }\n return {\n A0_G0: A0_G0_result.join(\"\"),\n A0_G1: A0_G1_result.join(\"\"),\n A1_G0: A1_G0_result.join(\"\"),\n A1_G1: A1_G1_result.join(\"\")\n };\n }\n resolveAnchors(allowA, allowG) {\n if (!this.hasAnchor || !this._anchorCache || typeof this.source !== \"string\") {\n return this.source;\n }\n if (allowA) {\n if (allowG) {\n return this._anchorCache.A1_G1;\n } else {\n return this._anchorCache.A1_G0;\n }\n } else {\n if (allowG) {\n return this._anchorCache.A0_G1;\n } else {\n return this._anchorCache.A0_G0;\n }\n }\n }\n};\nvar RegExpSourceList = class {\n _items;\n _hasAnchors;\n _cached;\n _anchorCache;\n constructor() {\n this._items = [];\n this._hasAnchors = false;\n this._cached = null;\n this._anchorCache = {\n A0_G0: null,\n A0_G1: null,\n A1_G0: null,\n A1_G1: null\n };\n }\n dispose() {\n this._disposeCaches();\n }\n _disposeCaches() {\n if (this._cached) {\n this._cached.dispose();\n this._cached = null;\n }\n if (this._anchorCache.A0_G0) {\n this._anchorCache.A0_G0.dispose();\n this._anchorCache.A0_G0 = null;\n }\n if (this._anchorCache.A0_G1) {\n this._anchorCache.A0_G1.dispose();\n this._anchorCache.A0_G1 = null;\n }\n if (this._anchorCache.A1_G0) {\n this._anchorCache.A1_G0.dispose();\n this._anchorCache.A1_G0 = null;\n }\n if (this._anchorCache.A1_G1) {\n this._anchorCache.A1_G1.dispose();\n this._anchorCache.A1_G1 = null;\n }\n }\n push(item) {\n this._items.push(item);\n this._hasAnchors = this._hasAnchors || item.hasAnchor;\n }\n unshift(item) {\n this._items.unshift(item);\n this._hasAnchors = this._hasAnchors || item.hasAnchor;\n }\n length() {\n return this._items.length;\n }\n setSource(index, newSource) {\n if (this._items[index].source !== newSource) {\n this._disposeCaches();\n this._items[index].setSource(newSource);\n }\n }\n compile(onigLib) {\n if (!this._cached) {\n let regExps = this._items.map((e) => e.source);\n this._cached = new CompiledRule(onigLib, regExps, this._items.map((e) => e.ruleId));\n }\n return this._cached;\n }\n compileAG(onigLib, allowA, allowG) {\n if (!this._hasAnchors) {\n return this.compile(onigLib);\n } else {\n if (allowA) {\n if (allowG) {\n if (!this._anchorCache.A1_G1) {\n this._anchorCache.A1_G1 = this._resolveAnchors(onigLib, allowA, allowG);\n }\n return this._anchorCache.A1_G1;\n } else {\n if (!this._anchorCache.A1_G0) {\n this._anchorCache.A1_G0 = this._resolveAnchors(onigLib, allowA, allowG);\n }\n return this._anchorCache.A1_G0;\n }\n } else {\n if (allowG) {\n if (!this._anchorCache.A0_G1) {\n this._anchorCache.A0_G1 = this._resolveAnchors(onigLib, allowA, allowG);\n }\n return this._anchorCache.A0_G1;\n } else {\n if (!this._anchorCache.A0_G0) {\n this._anchorCache.A0_G0 = this._resolveAnchors(onigLib, allowA, allowG);\n }\n return this._anchorCache.A0_G0;\n }\n }\n }\n }\n _resolveAnchors(onigLib, allowA, allowG) {\n let regExps = this._items.map((e) => e.resolveAnchors(allowA, allowG));\n return new CompiledRule(onigLib, regExps, this._items.map((e) => e.ruleId));\n }\n};\nvar CompiledRule = class {\n constructor(onigLib, regExps, rules) {\n this.regExps = regExps;\n this.rules = rules;\n this.scanner = onigLib.createOnigScanner(regExps);\n }\n scanner;\n dispose() {\n if (typeof this.scanner.dispose === \"function\") {\n this.scanner.dispose();\n }\n }\n toString() {\n const r = [];\n for (let i = 0, len = this.rules.length; i < len; i++) {\n r.push(\" - \" + this.rules[i] + \": \" + this.regExps[i]);\n }\n return r.join(\"\\n\");\n }\n findNextMatchSync(string, startPosition, options) {\n const result = this.scanner.findNextMatchSync(string, startPosition, options);\n if (!result) {\n return null;\n }\n return {\n ruleId: this.rules[result.index],\n captureIndices: result.captureIndices\n };\n }\n};\n\n// src/grammar/basicScopesAttributeProvider.ts\nvar BasicScopeAttributes = class {\n constructor(languageId, tokenType) {\n this.languageId = languageId;\n this.tokenType = tokenType;\n }\n};\nvar BasicScopeAttributesProvider = class _BasicScopeAttributesProvider {\n _defaultAttributes;\n _embeddedLanguagesMatcher;\n constructor(initialLanguageId, embeddedLanguages) {\n this._defaultAttributes = new BasicScopeAttributes(initialLanguageId, 8 /* NotSet */);\n this._embeddedLanguagesMatcher = new ScopeMatcher(Object.entries(embeddedLanguages || {}));\n }\n getDefaultAttributes() {\n return this._defaultAttributes;\n }\n getBasicScopeAttributes(scopeName) {\n if (scopeName === null) {\n return _BasicScopeAttributesProvider._NULL_SCOPE_METADATA;\n }\n return this._getBasicScopeAttributes.get(scopeName);\n }\n static _NULL_SCOPE_METADATA = new BasicScopeAttributes(0, 0);\n _getBasicScopeAttributes = new CachedFn((scopeName) => {\n const languageId = this._scopeToLanguage(scopeName);\n const standardTokenType = this._toStandardTokenType(scopeName);\n return new BasicScopeAttributes(languageId, standardTokenType);\n });\n /**\n * Given a produced TM scope, return the language that token describes or null if unknown.\n * e.g. source.html => html, source.css.embedded.html => css, punctuation.definition.tag.html => null\n */\n _scopeToLanguage(scope) {\n return this._embeddedLanguagesMatcher.match(scope) || 0;\n }\n _toStandardTokenType(scopeName) {\n const m = scopeName.match(_BasicScopeAttributesProvider.STANDARD_TOKEN_TYPE_REGEXP);\n if (!m) {\n return 8 /* NotSet */;\n }\n switch (m[1]) {\n case \"comment\":\n return 1 /* Comment */;\n case \"string\":\n return 2 /* String */;\n case \"regex\":\n return 3 /* RegEx */;\n case \"meta.embedded\":\n return 0 /* Other */;\n }\n throw new Error(\"Unexpected match for standard token type!\");\n }\n static STANDARD_TOKEN_TYPE_REGEXP = /\\b(comment|string|regex|meta\\.embedded)\\b/;\n};\nvar ScopeMatcher = class {\n values;\n scopesRegExp;\n constructor(values) {\n if (values.length === 0) {\n this.values = null;\n this.scopesRegExp = null;\n } else {\n this.values = new Map(values);\n const escapedScopes = values.map(\n ([scopeName, value]) => escapeRegExpCharacters(scopeName)\n );\n escapedScopes.sort();\n escapedScopes.reverse();\n this.scopesRegExp = new RegExp(\n `^((${escapedScopes.join(\")|(\")}))($|\\\\.)`,\n \"\"\n );\n }\n }\n match(scope) {\n if (!this.scopesRegExp) {\n return void 0;\n }\n const m = scope.match(this.scopesRegExp);\n if (!m) {\n return void 0;\n }\n return this.values.get(m[1]);\n }\n};\n\n// src/debug.ts\nvar DebugFlags = {\n InDebugMode: typeof process !== \"undefined\" && !!process.env[\"VSCODE_TEXTMATE_DEBUG\"]\n};\nvar UseOnigurumaFindOptions = false;\n\n// src/grammar/tokenizeString.ts\nvar TokenizeStringResult = class {\n constructor(stack, stoppedEarly) {\n this.stack = stack;\n this.stoppedEarly = stoppedEarly;\n }\n};\nfunction _tokenizeString(grammar, lineText, isFirstLine, linePos, stack, lineTokens, checkWhileConditions, timeLimit) {\n const lineLength = lineText.content.length;\n let STOP = false;\n let anchorPosition = -1;\n if (checkWhileConditions) {\n const whileCheckResult = _checkWhileConditions(\n grammar,\n lineText,\n isFirstLine,\n linePos,\n stack,\n lineTokens\n );\n stack = whileCheckResult.stack;\n linePos = whileCheckResult.linePos;\n isFirstLine = whileCheckResult.isFirstLine;\n anchorPosition = whileCheckResult.anchorPosition;\n }\n const startTime = Date.now();\n while (!STOP) {\n if (timeLimit !== 0) {\n const elapsedTime = Date.now() - startTime;\n if (elapsedTime > timeLimit) {\n return new TokenizeStringResult(stack, true);\n }\n }\n scanNext();\n }\n return new TokenizeStringResult(stack, false);\n function scanNext() {\n if (false) {\n console.log(\"\");\n console.log(\n `@@scanNext ${linePos}: |${lineText.content.substr(linePos).replace(/\\n$/, \"\\\\n\")}|`\n );\n }\n const r = matchRuleOrInjections(\n grammar,\n lineText,\n isFirstLine,\n linePos,\n stack,\n anchorPosition\n );\n if (!r) {\n lineTokens.produce(stack, lineLength);\n STOP = true;\n return;\n }\n const captureIndices = r.captureIndices;\n const matchedRuleId = r.matchedRuleId;\n const hasAdvanced = captureIndices && captureIndices.length > 0 ? captureIndices[0].end > linePos : false;\n if (matchedRuleId === endRuleId) {\n const poppedRule = stack.getRule(grammar);\n if (false) {\n console.log(\n \" popping \" + poppedRule.debugName + \" - \" + poppedRule.debugEndRegExp\n );\n }\n lineTokens.produce(stack, captureIndices[0].start);\n stack = stack.withContentNameScopesList(stack.nameScopesList);\n handleCaptures(\n grammar,\n lineText,\n isFirstLine,\n stack,\n lineTokens,\n poppedRule.endCaptures,\n captureIndices\n );\n lineTokens.produce(stack, captureIndices[0].end);\n const popped = stack;\n stack = stack.parent;\n anchorPosition = popped.getAnchorPos();\n if (!hasAdvanced && popped.getEnterPos() === linePos) {\n if (false) {\n console.error(\n \"[1] - Grammar is in an endless loop - Grammar pushed & popped a rule without advancing\"\n );\n }\n stack = popped;\n lineTokens.produce(stack, lineLength);\n STOP = true;\n return;\n }\n } else {\n const _rule = grammar.getRule(matchedRuleId);\n lineTokens.produce(stack, captureIndices[0].start);\n const beforePush = stack;\n const scopeName = _rule.getName(lineText.content, captureIndices);\n const nameScopesList = stack.contentNameScopesList.pushAttributed(\n scopeName,\n grammar\n );\n stack = stack.push(\n matchedRuleId,\n linePos,\n anchorPosition,\n captureIndices[0].end === lineLength,\n null,\n nameScopesList,\n nameScopesList\n );\n if (_rule instanceof BeginEndRule) {\n const pushedRule = _rule;\n if (false) {\n console.log(\n \" pushing \" + pushedRule.debugName + \" - \" + pushedRule.debugBeginRegExp\n );\n }\n handleCaptures(\n grammar,\n lineText,\n isFirstLine,\n stack,\n lineTokens,\n pushedRule.beginCaptures,\n captureIndices\n );\n lineTokens.produce(stack, captureIndices[0].end);\n anchorPosition = captureIndices[0].end;\n const contentName = pushedRule.getContentName(\n lineText.content,\n captureIndices\n );\n const contentNameScopesList = nameScopesList.pushAttributed(\n contentName,\n grammar\n );\n stack = stack.withContentNameScopesList(contentNameScopesList);\n if (pushedRule.endHasBackReferences) {\n stack = stack.withEndRule(\n pushedRule.getEndWithResolvedBackReferences(\n lineText.content,\n captureIndices\n )\n );\n }\n if (!hasAdvanced && beforePush.hasSameRuleAs(stack)) {\n if (false) {\n console.error(\n \"[2] - Grammar is in an endless loop - Grammar pushed the same rule without advancing\"\n );\n }\n stack = stack.pop();\n lineTokens.produce(stack, lineLength);\n STOP = true;\n return;\n }\n } else if (_rule instanceof BeginWhileRule) {\n const pushedRule = _rule;\n if (false) {\n console.log(\" pushing \" + pushedRule.debugName);\n }\n handleCaptures(\n grammar,\n lineText,\n isFirstLine,\n stack,\n lineTokens,\n pushedRule.beginCaptures,\n captureIndices\n );\n lineTokens.produce(stack, captureIndices[0].end);\n anchorPosition = captureIndices[0].end;\n const contentName = pushedRule.getContentName(\n lineText.content,\n captureIndices\n );\n const contentNameScopesList = nameScopesList.pushAttributed(\n contentName,\n grammar\n );\n stack = stack.withContentNameScopesList(contentNameScopesList);\n if (pushedRule.whileHasBackReferences) {\n stack = stack.withEndRule(\n pushedRule.getWhileWithResolvedBackReferences(\n lineText.content,\n captureIndices\n )\n );\n }\n if (!hasAdvanced && beforePush.hasSameRuleAs(stack)) {\n if (false) {\n console.error(\n \"[3] - Grammar is in an endless loop - Grammar pushed the same rule without advancing\"\n );\n }\n stack = stack.pop();\n lineTokens.produce(stack, lineLength);\n STOP = true;\n return;\n }\n } else {\n const matchingRule = _rule;\n if (false) {\n console.log(\n \" matched \" + matchingRule.debugName + \" - \" + matchingRule.debugMatchRegExp\n );\n }\n handleCaptures(\n grammar,\n lineText,\n isFirstLine,\n stack,\n lineTokens,\n matchingRule.captures,\n captureIndices\n );\n lineTokens.produce(stack, captureIndices[0].end);\n stack = stack.pop();\n if (!hasAdvanced) {\n if (false) {\n console.error(\n \"[4] - Grammar is in an endless loop - Grammar is not advancing, nor is it pushing/popping\"\n );\n }\n stack = stack.safePop();\n lineTokens.produce(stack, lineLength);\n STOP = true;\n return;\n }\n }\n }\n if (captureIndices[0].end > linePos) {\n linePos = captureIndices[0].end;\n isFirstLine = false;\n }\n }\n}\nfunction _checkWhileConditions(grammar, lineText, isFirstLine, linePos, stack, lineTokens) {\n let anchorPosition = stack.beginRuleCapturedEOL ? 0 : -1;\n const whileRules = [];\n for (let node = stack; node; node = node.pop()) {\n const nodeRule = node.getRule(grammar);\n if (nodeRule instanceof BeginWhileRule) {\n whileRules.push({\n rule: nodeRule,\n stack: node\n });\n }\n }\n for (let whileRule = whileRules.pop(); whileRule; whileRule = whileRules.pop()) {\n const { ruleScanner, findOptions } = prepareRuleWhileSearch(whileRule.rule, grammar, whileRule.stack.endRule, isFirstLine, linePos === anchorPosition);\n const r = ruleScanner.findNextMatchSync(lineText, linePos, findOptions);\n if (false) {\n console.log(\" scanning for while rule\");\n console.log(ruleScanner.toString());\n }\n if (r) {\n const matchedRuleId = r.ruleId;\n if (matchedRuleId !== whileRuleId) {\n stack = whileRule.stack.pop();\n break;\n }\n if (r.captureIndices && r.captureIndices.length) {\n lineTokens.produce(whileRule.stack, r.captureIndices[0].start);\n handleCaptures(grammar, lineText, isFirstLine, whileRule.stack, lineTokens, whileRule.rule.whileCaptures, r.captureIndices);\n lineTokens.produce(whileRule.stack, r.captureIndices[0].end);\n anchorPosition = r.captureIndices[0].end;\n if (r.captureIndices[0].end > linePos) {\n linePos = r.captureIndices[0].end;\n isFirstLine = false;\n }\n }\n } else {\n if (false) {\n console.log(\" popping \" + whileRule.rule.debugName + \" - \" + whileRule.rule.debugWhileRegExp);\n }\n stack = whileRule.stack.pop();\n break;\n }\n }\n return { stack, linePos, anchorPosition, isFirstLine };\n}\nfunction matchRuleOrInjections(grammar, lineText, isFirstLine, linePos, stack, anchorPosition) {\n const matchResult = matchRule(grammar, lineText, isFirstLine, linePos, stack, anchorPosition);\n const injections = grammar.getInjections();\n if (injections.length === 0) {\n return matchResult;\n }\n const injectionResult = matchInjections(injections, grammar, lineText, isFirstLine, linePos, stack, anchorPosition);\n if (!injectionResult) {\n return matchResult;\n }\n if (!matchResult) {\n return injectionResult;\n }\n const matchResultScore = matchResult.captureIndices[0].start;\n const injectionResultScore = injectionResult.captureIndices[0].start;\n if (injectionResultScore < matchResultScore || injectionResult.priorityMatch && injectionResultScore === matchResultScore) {\n return injectionResult;\n }\n return matchResult;\n}\nfunction matchRule(grammar, lineText, isFirstLine, linePos, stack, anchorPosition) {\n const rule = stack.getRule(grammar);\n const { ruleScanner, findOptions } = prepareRuleSearch(rule, grammar, stack.endRule, isFirstLine, linePos === anchorPosition);\n const r = ruleScanner.findNextMatchSync(lineText, linePos, findOptions);\n if (r) {\n return {\n captureIndices: r.captureIndices,\n matchedRuleId: r.ruleId\n };\n }\n return null;\n}\nfunction matchInjections(injections, grammar, lineText, isFirstLine, linePos, stack, anchorPosition) {\n let bestMatchRating = Number.MAX_VALUE;\n let bestMatchCaptureIndices = null;\n let bestMatchRuleId;\n let bestMatchResultPriority = 0;\n const scopes = stack.contentNameScopesList.getScopeNames();\n for (let i = 0, len = injections.length; i < len; i++) {\n const injection = injections[i];\n if (!injection.matcher(scopes)) {\n continue;\n }\n const rule = grammar.getRule(injection.ruleId);\n const { ruleScanner, findOptions } = prepareRuleSearch(rule, grammar, null, isFirstLine, linePos === anchorPosition);\n const matchResult = ruleScanner.findNextMatchSync(lineText, linePos, findOptions);\n if (!matchResult) {\n continue;\n }\n if (false) {\n console.log(` matched injection: ${injection.debugSelector}`);\n console.log(ruleScanner.toString());\n }\n const matchRating = matchResult.captureIndices[0].start;\n if (matchRating >= bestMatchRating) {\n continue;\n }\n bestMatchRating = matchRating;\n bestMatchCaptureIndices = matchResult.captureIndices;\n bestMatchRuleId = matchResult.ruleId;\n bestMatchResultPriority = injection.priority;\n if (bestMatchRating === linePos) {\n break;\n }\n }\n if (bestMatchCaptureIndices) {\n return {\n priorityMatch: bestMatchResultPriority === -1,\n captureIndices: bestMatchCaptureIndices,\n matchedRuleId: bestMatchRuleId\n };\n }\n return null;\n}\nfunction prepareRuleSearch(rule, grammar, endRegexSource, allowA, allowG) {\n if (UseOnigurumaFindOptions) {\n const ruleScanner2 = rule.compile(grammar, endRegexSource);\n const findOptions = getFindOptions(allowA, allowG);\n return { ruleScanner: ruleScanner2, findOptions };\n }\n const ruleScanner = rule.compileAG(grammar, endRegexSource, allowA, allowG);\n return { ruleScanner, findOptions: 0 /* None */ };\n}\nfunction prepareRuleWhileSearch(rule, grammar, endRegexSource, allowA, allowG) {\n if (UseOnigurumaFindOptions) {\n const ruleScanner2 = rule.compileWhile(grammar, endRegexSource);\n const findOptions = getFindOptions(allowA, allowG);\n return { ruleScanner: ruleScanner2, findOptions };\n }\n const ruleScanner = rule.compileWhileAG(grammar, endRegexSource, allowA, allowG);\n return { ruleScanner, findOptions: 0 /* None */ };\n}\nfunction getFindOptions(allowA, allowG) {\n let options = 0 /* None */;\n if (!allowA) {\n options |= 1 /* NotBeginString */;\n }\n if (!allowG) {\n options |= 4 /* NotBeginPosition */;\n }\n return options;\n}\nfunction handleCaptures(grammar, lineText, isFirstLine, stack, lineTokens, captures, captureIndices) {\n if (captures.length === 0) {\n return;\n }\n const lineTextContent = lineText.content;\n const len = Math.min(captures.length, captureIndices.length);\n const localStack = [];\n const maxEnd = captureIndices[0].end;\n for (let i = 0; i < len; i++) {\n const captureRule = captures[i];\n if (captureRule === null) {\n continue;\n }\n const captureIndex = captureIndices[i];\n if (captureIndex.length === 0) {\n continue;\n }\n if (captureIndex.start > maxEnd) {\n break;\n }\n while (localStack.length > 0 && localStack[localStack.length - 1].endPos <= captureIndex.start) {\n lineTokens.produceFromScopes(localStack[localStack.length - 1].scopes, localStack[localStack.length - 1].endPos);\n localStack.pop();\n }\n if (localStack.length > 0) {\n lineTokens.produceFromScopes(localStack[localStack.length - 1].scopes, captureIndex.start);\n } else {\n lineTokens.produce(stack, captureIndex.start);\n }\n if (captureRule.retokenizeCapturedWithRuleId) {\n const scopeName = captureRule.getName(lineTextContent, captureIndices);\n const nameScopesList = stack.contentNameScopesList.pushAttributed(scopeName, grammar);\n const contentName = captureRule.getContentName(lineTextContent, captureIndices);\n const contentNameScopesList = nameScopesList.pushAttributed(contentName, grammar);\n const stackClone = stack.push(captureRule.retokenizeCapturedWithRuleId, captureIndex.start, -1, false, null, nameScopesList, contentNameScopesList);\n const onigSubStr = grammar.createOnigString(lineTextContent.substring(0, captureIndex.end));\n _tokenizeString(\n grammar,\n onigSubStr,\n isFirstLine && captureIndex.start === 0,\n captureIndex.start,\n stackClone,\n lineTokens,\n false,\n /* no time limit */\n 0\n );\n disposeOnigString(onigSubStr);\n continue;\n }\n const captureRuleScopeName = captureRule.getName(lineTextContent, captureIndices);\n if (captureRuleScopeName !== null) {\n const base = localStack.length > 0 ? localStack[localStack.length - 1].scopes : stack.contentNameScopesList;\n const captureRuleScopesList = base.pushAttributed(captureRuleScopeName, grammar);\n localStack.push(new LocalStackElement(captureRuleScopesList, captureIndex.end));\n }\n }\n while (localStack.length > 0) {\n lineTokens.produceFromScopes(localStack[localStack.length - 1].scopes, localStack[localStack.length - 1].endPos);\n localStack.pop();\n }\n}\nvar LocalStackElement = class {\n scopes;\n endPos;\n constructor(scopes, endPos) {\n this.scopes = scopes;\n this.endPos = endPos;\n }\n};\n\n// src/grammar/grammar.ts\nfunction createGrammar(scopeName, grammar, initialLanguage, embeddedLanguages, tokenTypes, balancedBracketSelectors, grammarRepository, onigLib) {\n return new Grammar(\n scopeName,\n grammar,\n initialLanguage,\n embeddedLanguages,\n tokenTypes,\n balancedBracketSelectors,\n grammarRepository,\n onigLib\n );\n}\nfunction collectInjections(result, selector, rule, ruleFactoryHelper, grammar) {\n const matchers = createMatchers(selector, nameMatcher);\n const ruleId = RuleFactory.getCompiledRuleId(rule, ruleFactoryHelper, grammar.repository);\n for (const matcher of matchers) {\n result.push({\n debugSelector: selector,\n matcher: matcher.matcher,\n ruleId,\n grammar,\n priority: matcher.priority\n });\n }\n}\nfunction nameMatcher(identifers, scopes) {\n if (scopes.length < identifers.length) {\n return false;\n }\n let lastIndex = 0;\n return identifers.every((identifier) => {\n for (let i = lastIndex; i < scopes.length; i++) {\n if (scopesAreMatching(scopes[i], identifier)) {\n lastIndex = i + 1;\n return true;\n }\n }\n return false;\n });\n}\nfunction scopesAreMatching(thisScopeName, scopeName) {\n if (!thisScopeName) {\n return false;\n }\n if (thisScopeName === scopeName) {\n return true;\n }\n const len = scopeName.length;\n return thisScopeName.length > len && thisScopeName.substr(0, len) === scopeName && thisScopeName[len] === \".\";\n}\nvar Grammar = class {\n constructor(_rootScopeName, grammar, initialLanguage, embeddedLanguages, tokenTypes, balancedBracketSelectors, grammarRepository, _onigLib) {\n this._rootScopeName = _rootScopeName;\n this.balancedBracketSelectors = balancedBracketSelectors;\n this._onigLib = _onigLib;\n this._basicScopeAttributesProvider = new BasicScopeAttributesProvider(\n initialLanguage,\n embeddedLanguages\n );\n this._rootId = -1;\n this._lastRuleId = 0;\n this._ruleId2desc = [null];\n this._includedGrammars = {};\n this._grammarRepository = grammarRepository;\n this._grammar = initGrammar(grammar, null);\n this._injections = null;\n this._tokenTypeMatchers = [];\n if (tokenTypes) {\n for (const selector of Object.keys(tokenTypes)) {\n const matchers = createMatchers(selector, nameMatcher);\n for (const matcher of matchers) {\n this._tokenTypeMatchers.push({\n matcher: matcher.matcher,\n type: tokenTypes[selector]\n });\n }\n }\n }\n }\n _rootId;\n _lastRuleId;\n _ruleId2desc;\n _includedGrammars;\n _grammarRepository;\n _grammar;\n _injections;\n _basicScopeAttributesProvider;\n _tokenTypeMatchers;\n get themeProvider() {\n return this._grammarRepository;\n }\n dispose() {\n for (const rule of this._ruleId2desc) {\n if (rule) {\n rule.dispose();\n }\n }\n }\n createOnigScanner(sources) {\n return this._onigLib.createOnigScanner(sources);\n }\n createOnigString(sources) {\n return this._onigLib.createOnigString(sources);\n }\n getMetadataForScope(scope) {\n return this._basicScopeAttributesProvider.getBasicScopeAttributes(scope);\n }\n _collectInjections() {\n const grammarRepository = {\n lookup: (scopeName2) => {\n if (scopeName2 === this._rootScopeName) {\n return this._grammar;\n }\n return this.getExternalGrammar(scopeName2);\n },\n injections: (scopeName2) => {\n return this._grammarRepository.injections(scopeName2);\n }\n };\n const result = [];\n const scopeName = this._rootScopeName;\n const grammar = grammarRepository.lookup(scopeName);\n if (grammar) {\n const rawInjections = grammar.injections;\n if (rawInjections) {\n for (let expression in rawInjections) {\n collectInjections(\n result,\n expression,\n rawInjections[expression],\n this,\n grammar\n );\n }\n }\n const injectionScopeNames = this._grammarRepository.injections(scopeName);\n if (injectionScopeNames) {\n injectionScopeNames.forEach((injectionScopeName) => {\n const injectionGrammar = this.getExternalGrammar(injectionScopeName);\n if (injectionGrammar) {\n const selector = injectionGrammar.injectionSelector;\n if (selector) {\n collectInjections(\n result,\n selector,\n injectionGrammar,\n this,\n injectionGrammar\n );\n }\n }\n });\n }\n }\n result.sort((i1, i2) => i1.priority - i2.priority);\n return result;\n }\n getInjections() {\n if (this._injections === null) {\n this._injections = this._collectInjections();\n }\n return this._injections;\n }\n registerRule(factory) {\n const id = ++this._lastRuleId;\n const result = factory(ruleIdFromNumber(id));\n this._ruleId2desc[id] = result;\n return result;\n }\n getRule(ruleId) {\n return this._ruleId2desc[ruleIdToNumber(ruleId)];\n }\n getExternalGrammar(scopeName, repository) {\n if (this._includedGrammars[scopeName]) {\n return this._includedGrammars[scopeName];\n } else if (this._grammarRepository) {\n const rawIncludedGrammar = this._grammarRepository.lookup(scopeName);\n if (rawIncludedGrammar) {\n this._includedGrammars[scopeName] = initGrammar(\n rawIncludedGrammar,\n repository && repository.$base\n );\n return this._includedGrammars[scopeName];\n }\n }\n return void 0;\n }\n tokenizeLine(lineText, prevState, timeLimit = 0) {\n const r = this._tokenize(lineText, prevState, false, timeLimit);\n return {\n tokens: r.lineTokens.getResult(r.ruleStack, r.lineLength),\n ruleStack: r.ruleStack,\n stoppedEarly: r.stoppedEarly\n };\n }\n tokenizeLine2(lineText, prevState, timeLimit = 0) {\n const r = this._tokenize(lineText, prevState, true, timeLimit);\n return {\n tokens: r.lineTokens.getBinaryResult(r.ruleStack, r.lineLength),\n ruleStack: r.ruleStack,\n stoppedEarly: r.stoppedEarly\n };\n }\n _tokenize(lineText, prevState, emitBinaryTokens, timeLimit) {\n if (this._rootId === -1) {\n this._rootId = RuleFactory.getCompiledRuleId(\n this._grammar.repository.$self,\n this,\n this._grammar.repository\n );\n this.getInjections();\n }\n let isFirstLine;\n if (!prevState || prevState === StateStackImpl.NULL) {\n isFirstLine = true;\n const rawDefaultMetadata = this._basicScopeAttributesProvider.getDefaultAttributes();\n const defaultStyle = this.themeProvider.getDefaults();\n const defaultMetadata = EncodedTokenMetadata.set(\n 0,\n rawDefaultMetadata.languageId,\n rawDefaultMetadata.tokenType,\n null,\n defaultStyle.fontStyle,\n defaultStyle.foregroundId,\n defaultStyle.backgroundId\n );\n const rootScopeName = this.getRule(this._rootId).getName(\n null,\n null\n );\n let scopeList;\n if (rootScopeName) {\n scopeList = AttributedScopeStack.createRootAndLookUpScopeName(\n rootScopeName,\n defaultMetadata,\n this\n );\n } else {\n scopeList = AttributedScopeStack.createRoot(\n \"unknown\",\n defaultMetadata\n );\n }\n prevState = new StateStackImpl(\n null,\n this._rootId,\n -1,\n -1,\n false,\n null,\n scopeList,\n scopeList\n );\n } else {\n isFirstLine = false;\n prevState.reset();\n }\n lineText = lineText + \"\\n\";\n const onigLineText = this.createOnigString(lineText);\n const lineLength = onigLineText.content.length;\n const lineTokens = new LineTokens(\n emitBinaryTokens,\n lineText,\n this._tokenTypeMatchers,\n this.balancedBracketSelectors\n );\n const r = _tokenizeString(\n this,\n onigLineText,\n isFirstLine,\n 0,\n prevState,\n lineTokens,\n true,\n timeLimit\n );\n disposeOnigString(onigLineText);\n return {\n lineLength,\n lineTokens,\n ruleStack: r.stack,\n stoppedEarly: r.stoppedEarly\n };\n }\n};\nfunction initGrammar(grammar, base) {\n grammar = clone(grammar);\n grammar.repository = grammar.repository || {};\n grammar.repository.$self = {\n $vscodeTextmateLocation: grammar.$vscodeTextmateLocation,\n patterns: grammar.patterns,\n name: grammar.scopeName\n };\n grammar.repository.$base = base || grammar.repository.$self;\n return grammar;\n}\nvar AttributedScopeStack = class _AttributedScopeStack {\n /**\n * Invariant:\n * ```\n * if (parent && !scopePath.extends(parent.scopePath)) {\n * \tthrow new Error();\n * }\n * ```\n */\n constructor(parent, scopePath, tokenAttributes) {\n this.parent = parent;\n this.scopePath = scopePath;\n this.tokenAttributes = tokenAttributes;\n }\n static fromExtension(namesScopeList, contentNameScopesList) {\n let current = namesScopeList;\n let scopeNames = namesScopeList?.scopePath ?? null;\n for (const frame of contentNameScopesList) {\n scopeNames = ScopeStack.push(scopeNames, frame.scopeNames);\n current = new _AttributedScopeStack(current, scopeNames, frame.encodedTokenAttributes);\n }\n return current;\n }\n static createRoot(scopeName, tokenAttributes) {\n return new _AttributedScopeStack(null, new ScopeStack(null, scopeName), tokenAttributes);\n }\n static createRootAndLookUpScopeName(scopeName, tokenAttributes, grammar) {\n const rawRootMetadata = grammar.getMetadataForScope(scopeName);\n const scopePath = new ScopeStack(null, scopeName);\n const rootStyle = grammar.themeProvider.themeMatch(scopePath);\n const resolvedTokenAttributes = _AttributedScopeStack.mergeAttributes(\n tokenAttributes,\n rawRootMetadata,\n rootStyle\n );\n return new _AttributedScopeStack(null, scopePath, resolvedTokenAttributes);\n }\n get scopeName() {\n return this.scopePath.scopeName;\n }\n toString() {\n return this.getScopeNames().join(\" \");\n }\n equals(other) {\n return _AttributedScopeStack.equals(this, other);\n }\n static equals(a, b) {\n do {\n if (a === b) {\n return true;\n }\n if (!a && !b) {\n return true;\n }\n if (!a || !b) {\n return false;\n }\n if (a.scopeName !== b.scopeName || a.tokenAttributes !== b.tokenAttributes) {\n return false;\n }\n a = a.parent;\n b = b.parent;\n } while (true);\n }\n static mergeAttributes(existingTokenAttributes, basicScopeAttributes, styleAttributes) {\n let fontStyle = -1 /* NotSet */;\n let foreground = 0;\n let background = 0;\n if (styleAttributes !== null) {\n fontStyle = styleAttributes.fontStyle;\n foreground = styleAttributes.foregroundId;\n background = styleAttributes.backgroundId;\n }\n return EncodedTokenMetadata.set(\n existingTokenAttributes,\n basicScopeAttributes.languageId,\n basicScopeAttributes.tokenType,\n null,\n fontStyle,\n foreground,\n background\n );\n }\n pushAttributed(scopePath, grammar) {\n if (scopePath === null) {\n return this;\n }\n if (scopePath.indexOf(\" \") === -1) {\n return _AttributedScopeStack._pushAttributed(this, scopePath, grammar);\n }\n const scopes = scopePath.split(/ /g);\n let result = this;\n for (const scope of scopes) {\n result = _AttributedScopeStack._pushAttributed(result, scope, grammar);\n }\n return result;\n }\n static _pushAttributed(target, scopeName, grammar) {\n const rawMetadata = grammar.getMetadataForScope(scopeName);\n const newPath = target.scopePath.push(scopeName);\n const scopeThemeMatchResult = grammar.themeProvider.themeMatch(newPath);\n const metadata = _AttributedScopeStack.mergeAttributes(\n target.tokenAttributes,\n rawMetadata,\n scopeThemeMatchResult\n );\n return new _AttributedScopeStack(target, newPath, metadata);\n }\n getScopeNames() {\n return this.scopePath.getSegments();\n }\n getExtensionIfDefined(base) {\n const result = [];\n let self = this;\n while (self && self !== base) {\n result.push({\n encodedTokenAttributes: self.tokenAttributes,\n scopeNames: self.scopePath.getExtensionIfDefined(self.parent?.scopePath ?? null)\n });\n self = self.parent;\n }\n return self === base ? result.reverse() : void 0;\n }\n};\nvar StateStackImpl = class _StateStackImpl {\n /**\n * Invariant:\n * ```\n * if (contentNameScopesList !== nameScopesList && contentNameScopesList?.parent !== nameScopesList) {\n * \tthrow new Error();\n * }\n * if (this.parent && !nameScopesList.extends(this.parent.contentNameScopesList)) {\n * \tthrow new Error();\n * }\n * ```\n */\n constructor(parent, ruleId, enterPos, anchorPos, beginRuleCapturedEOL, endRule, nameScopesList, contentNameScopesList) {\n this.parent = parent;\n this.ruleId = ruleId;\n this.beginRuleCapturedEOL = beginRuleCapturedEOL;\n this.endRule = endRule;\n this.nameScopesList = nameScopesList;\n this.contentNameScopesList = contentNameScopesList;\n this.depth = this.parent ? this.parent.depth + 1 : 1;\n this._enterPos = enterPos;\n this._anchorPos = anchorPos;\n }\n _stackElementBrand = void 0;\n // TODO remove me\n static NULL = new _StateStackImpl(\n null,\n 0,\n 0,\n 0,\n false,\n null,\n null,\n null\n );\n /**\n * The position on the current line where this state was pushed.\n * This is relevant only while tokenizing a line, to detect endless loops.\n * Its value is meaningless across lines.\n */\n _enterPos;\n /**\n * The captured anchor position when this stack element was pushed.\n * This is relevant only while tokenizing a line, to restore the anchor position when popping.\n * Its value is meaningless across lines.\n */\n _anchorPos;\n /**\n * The depth of the stack.\n */\n depth;\n equals(other) {\n if (other === null) {\n return false;\n }\n return _StateStackImpl._equals(this, other);\n }\n static _equals(a, b) {\n if (a === b) {\n return true;\n }\n if (!this._structuralEquals(a, b)) {\n return false;\n }\n return AttributedScopeStack.equals(a.contentNameScopesList, b.contentNameScopesList);\n }\n /**\n * A structural equals check. Does not take into account `scopes`.\n */\n static _structuralEquals(a, b) {\n do {\n if (a === b) {\n return true;\n }\n if (!a && !b) {\n return true;\n }\n if (!a || !b) {\n return false;\n }\n if (a.depth !== b.depth || a.ruleId !== b.ruleId || a.endRule !== b.endRule) {\n return false;\n }\n a = a.parent;\n b = b.parent;\n } while (true);\n }\n clone() {\n return this;\n }\n static _reset(el) {\n while (el) {\n el._enterPos = -1;\n el._anchorPos = -1;\n el = el.parent;\n }\n }\n reset() {\n _StateStackImpl._reset(this);\n }\n pop() {\n return this.parent;\n }\n safePop() {\n if (this.parent) {\n return this.parent;\n }\n return this;\n }\n push(ruleId, enterPos, anchorPos, beginRuleCapturedEOL, endRule, nameScopesList, contentNameScopesList) {\n return new _StateStackImpl(\n this,\n ruleId,\n enterPos,\n anchorPos,\n beginRuleCapturedEOL,\n endRule,\n nameScopesList,\n contentNameScopesList\n );\n }\n getEnterPos() {\n return this._enterPos;\n }\n getAnchorPos() {\n return this._anchorPos;\n }\n getRule(grammar) {\n return grammar.getRule(this.ruleId);\n }\n toString() {\n const r = [];\n this._writeString(r, 0);\n return \"[\" + r.join(\",\") + \"]\";\n }\n _writeString(res, outIndex) {\n if (this.parent) {\n outIndex = this.parent._writeString(res, outIndex);\n }\n res[outIndex++] = `(${this.ruleId}, ${this.nameScopesList?.toString()}, ${this.contentNameScopesList?.toString()})`;\n return outIndex;\n }\n withContentNameScopesList(contentNameScopeStack) {\n if (this.contentNameScopesList === contentNameScopeStack) {\n return this;\n }\n return this.parent.push(\n this.ruleId,\n this._enterPos,\n this._anchorPos,\n this.beginRuleCapturedEOL,\n this.endRule,\n this.nameScopesList,\n contentNameScopeStack\n );\n }\n withEndRule(endRule) {\n if (this.endRule === endRule) {\n return this;\n }\n return new _StateStackImpl(\n this.parent,\n this.ruleId,\n this._enterPos,\n this._anchorPos,\n this.beginRuleCapturedEOL,\n endRule,\n this.nameScopesList,\n this.contentNameScopesList\n );\n }\n // Used to warn of endless loops\n hasSameRuleAs(other) {\n let el = this;\n while (el && el._enterPos === other._enterPos) {\n if (el.ruleId === other.ruleId) {\n return true;\n }\n el = el.parent;\n }\n return false;\n }\n toStateStackFrame() {\n return {\n ruleId: ruleIdToNumber(this.ruleId),\n beginRuleCapturedEOL: this.beginRuleCapturedEOL,\n endRule: this.endRule,\n nameScopesList: this.nameScopesList?.getExtensionIfDefined(this.parent?.nameScopesList ?? null) ?? [],\n contentNameScopesList: this.contentNameScopesList?.getExtensionIfDefined(this.nameScopesList) ?? []\n };\n }\n static pushFrame(self, frame) {\n const namesScopeList = AttributedScopeStack.fromExtension(self?.nameScopesList ?? null, frame.nameScopesList);\n return new _StateStackImpl(\n self,\n ruleIdFromNumber(frame.ruleId),\n frame.enterPos ?? -1,\n frame.anchorPos ?? -1,\n frame.beginRuleCapturedEOL,\n frame.endRule,\n namesScopeList,\n AttributedScopeStack.fromExtension(namesScopeList, frame.contentNameScopesList)\n );\n }\n};\nvar BalancedBracketSelectors = class {\n balancedBracketScopes;\n unbalancedBracketScopes;\n allowAny = false;\n constructor(balancedBracketScopes, unbalancedBracketScopes) {\n this.balancedBracketScopes = balancedBracketScopes.flatMap(\n (selector) => {\n if (selector === \"*\") {\n this.allowAny = true;\n return [];\n }\n return createMatchers(selector, nameMatcher).map((m) => m.matcher);\n }\n );\n this.unbalancedBracketScopes = unbalancedBracketScopes.flatMap(\n (selector) => createMatchers(selector, nameMatcher).map((m) => m.matcher)\n );\n }\n get matchesAlways() {\n return this.allowAny && this.unbalancedBracketScopes.length === 0;\n }\n get matchesNever() {\n return this.balancedBracketScopes.length === 0 && !this.allowAny;\n }\n match(scopes) {\n for (const excluder of this.unbalancedBracketScopes) {\n if (excluder(scopes)) {\n return false;\n }\n }\n for (const includer of this.balancedBracketScopes) {\n if (includer(scopes)) {\n return true;\n }\n }\n return this.allowAny;\n }\n};\nvar LineTokens = class {\n constructor(emitBinaryTokens, lineText, tokenTypeOverrides, balancedBracketSelectors) {\n this.balancedBracketSelectors = balancedBracketSelectors;\n this._emitBinaryTokens = emitBinaryTokens;\n this._tokenTypeOverrides = tokenTypeOverrides;\n if (false) {\n this._lineText = lineText;\n } else {\n this._lineText = null;\n }\n this._tokens = [];\n this._binaryTokens = [];\n this._lastTokenEndIndex = 0;\n }\n _emitBinaryTokens;\n /**\n * defined only if `false`.\n */\n _lineText;\n /**\n * used only if `_emitBinaryTokens` is false.\n */\n _tokens;\n /**\n * used only if `_emitBinaryTokens` is true.\n */\n _binaryTokens;\n _lastTokenEndIndex;\n _tokenTypeOverrides;\n produce(stack, endIndex) {\n this.produceFromScopes(stack.contentNameScopesList, endIndex);\n }\n produceFromScopes(scopesList, endIndex) {\n if (this._lastTokenEndIndex >= endIndex) {\n return;\n }\n if (this._emitBinaryTokens) {\n let metadata = scopesList?.tokenAttributes ?? 0;\n let containsBalancedBrackets = false;\n if (this.balancedBracketSelectors?.matchesAlways) {\n containsBalancedBrackets = true;\n }\n if (this._tokenTypeOverrides.length > 0 || this.balancedBracketSelectors && !this.balancedBracketSelectors.matchesAlways && !this.balancedBracketSelectors.matchesNever) {\n const scopes2 = scopesList?.getScopeNames() ?? [];\n for (const tokenType of this._tokenTypeOverrides) {\n if (tokenType.matcher(scopes2)) {\n metadata = EncodedTokenMetadata.set(\n metadata,\n 0,\n toOptionalTokenType(tokenType.type),\n null,\n -1 /* NotSet */,\n 0,\n 0\n );\n }\n }\n if (this.balancedBracketSelectors) {\n containsBalancedBrackets = this.balancedBracketSelectors.match(scopes2);\n }\n }\n if (containsBalancedBrackets) {\n metadata = EncodedTokenMetadata.set(\n metadata,\n 0,\n 8 /* NotSet */,\n containsBalancedBrackets,\n -1 /* NotSet */,\n 0,\n 0\n );\n }\n if (this._binaryTokens.length > 0 && this._binaryTokens[this._binaryTokens.length - 1] === metadata) {\n this._lastTokenEndIndex = endIndex;\n return;\n }\n this._binaryTokens.push(this._lastTokenEndIndex);\n this._binaryTokens.push(metadata);\n this._lastTokenEndIndex = endIndex;\n return;\n }\n const scopes = scopesList?.getScopeNames() ?? [];\n this._tokens.push({\n startIndex: this._lastTokenEndIndex,\n endIndex,\n // value: lineText.substring(lastTokenEndIndex, endIndex),\n scopes\n });\n this._lastTokenEndIndex = endIndex;\n }\n getResult(stack, lineLength) {\n if (this._tokens.length > 0 && this._tokens[this._tokens.length - 1].startIndex === lineLength - 1) {\n this._tokens.pop();\n }\n if (this._tokens.length === 0) {\n this._lastTokenEndIndex = -1;\n this.produce(stack, lineLength);\n this._tokens[this._tokens.length - 1].startIndex = 0;\n }\n return this._tokens;\n }\n getBinaryResult(stack, lineLength) {\n if (this._binaryTokens.length > 0 && this._binaryTokens[this._binaryTokens.length - 2] === lineLength - 1) {\n this._binaryTokens.pop();\n this._binaryTokens.pop();\n }\n if (this._binaryTokens.length === 0) {\n this._lastTokenEndIndex = -1;\n this.produce(stack, lineLength);\n this._binaryTokens[this._binaryTokens.length - 2] = 0;\n }\n const result = new Uint32Array(this._binaryTokens.length);\n for (let i = 0, len = this._binaryTokens.length; i < len; i++) {\n result[i] = this._binaryTokens[i];\n }\n return result;\n }\n};\n\n// src/registry.ts\nvar SyncRegistry = class {\n constructor(theme, _onigLib) {\n this._onigLib = _onigLib;\n this._theme = theme;\n }\n _grammars = /* @__PURE__ */ new Map();\n _rawGrammars = /* @__PURE__ */ new Map();\n _injectionGrammars = /* @__PURE__ */ new Map();\n _theme;\n dispose() {\n for (const grammar of this._grammars.values()) {\n grammar.dispose();\n }\n }\n setTheme(theme) {\n this._theme = theme;\n }\n getColorMap() {\n return this._theme.getColorMap();\n }\n /**\n * Add `grammar` to registry and return a list of referenced scope names\n */\n addGrammar(grammar, injectionScopeNames) {\n this._rawGrammars.set(grammar.scopeName, grammar);\n if (injectionScopeNames) {\n this._injectionGrammars.set(grammar.scopeName, injectionScopeNames);\n }\n }\n /**\n * Lookup a raw grammar.\n */\n lookup(scopeName) {\n return this._rawGrammars.get(scopeName);\n }\n /**\n * Returns the injections for the given grammar\n */\n injections(targetScope) {\n return this._injectionGrammars.get(targetScope);\n }\n /**\n * Get the default theme settings\n */\n getDefaults() {\n return this._theme.getDefaults();\n }\n /**\n * Match a scope in the theme.\n */\n themeMatch(scopePath) {\n return this._theme.match(scopePath);\n }\n /**\n * Lookup a grammar.\n */\n grammarForScopeName(scopeName, initialLanguage, embeddedLanguages, tokenTypes, balancedBracketSelectors) {\n if (!this._grammars.has(scopeName)) {\n let rawGrammar = this._rawGrammars.get(scopeName);\n if (!rawGrammar) {\n return null;\n }\n this._grammars.set(scopeName, createGrammar(\n scopeName,\n rawGrammar,\n initialLanguage,\n embeddedLanguages,\n tokenTypes,\n balancedBracketSelectors,\n this,\n this._onigLib\n ));\n }\n return this._grammars.get(scopeName);\n }\n};\n\n// src/index.ts\nvar Registry = class {\n _options;\n _syncRegistry;\n _ensureGrammarCache;\n constructor(options) {\n this._options = options;\n this._syncRegistry = new SyncRegistry(\n Theme.createFromRawTheme(options.theme, options.colorMap),\n options.onigLib\n );\n this._ensureGrammarCache = /* @__PURE__ */ new Map();\n }\n dispose() {\n this._syncRegistry.dispose();\n }\n /**\n * Change the theme. Once called, no previous `ruleStack` should be used anymore.\n */\n setTheme(theme, colorMap) {\n this._syncRegistry.setTheme(Theme.createFromRawTheme(theme, colorMap));\n }\n /**\n * Returns a lookup array for color ids.\n */\n getColorMap() {\n return this._syncRegistry.getColorMap();\n }\n /**\n * Load the grammar for `scopeName` and all referenced included grammars asynchronously.\n * Please do not use language id 0.\n */\n loadGrammarWithEmbeddedLanguages(initialScopeName, initialLanguage, embeddedLanguages) {\n return this.loadGrammarWithConfiguration(initialScopeName, initialLanguage, { embeddedLanguages });\n }\n /**\n * Load the grammar for `scopeName` and all referenced included grammars asynchronously.\n * Please do not use language id 0.\n */\n loadGrammarWithConfiguration(initialScopeName, initialLanguage, configuration) {\n return this._loadGrammar(\n initialScopeName,\n initialLanguage,\n configuration.embeddedLanguages,\n configuration.tokenTypes,\n new BalancedBracketSelectors(\n configuration.balancedBracketSelectors || [],\n configuration.unbalancedBracketSelectors || []\n )\n );\n }\n /**\n * Load the grammar for `scopeName` and all referenced included grammars asynchronously.\n */\n loadGrammar(initialScopeName) {\n return this._loadGrammar(initialScopeName, 0, null, null, null);\n }\n _loadGrammar(initialScopeName, initialLanguage, embeddedLanguages, tokenTypes, balancedBracketSelectors) {\n const dependencyProcessor = new ScopeDependencyProcessor(this._syncRegistry, initialScopeName);\n while (dependencyProcessor.Q.length > 0) {\n dependencyProcessor.Q.map((request) => this._loadSingleGrammar(request.scopeName));\n dependencyProcessor.processQueue();\n }\n return this._grammarForScopeName(\n initialScopeName,\n initialLanguage,\n embeddedLanguages,\n tokenTypes,\n balancedBracketSelectors\n );\n }\n _loadSingleGrammar(scopeName) {\n if (!this._ensureGrammarCache.has(scopeName)) {\n this._doLoadSingleGrammar(scopeName);\n this._ensureGrammarCache.set(scopeName, true);\n }\n }\n _doLoadSingleGrammar(scopeName) {\n const grammar = this._options.loadGrammar(scopeName);\n if (grammar) {\n const injections = typeof this._options.getInjections === \"function\" ? this._options.getInjections(scopeName) : void 0;\n this._syncRegistry.addGrammar(grammar, injections);\n }\n }\n /**\n * Adds a rawGrammar.\n */\n addGrammar(rawGrammar, injections = [], initialLanguage = 0, embeddedLanguages = null) {\n this._syncRegistry.addGrammar(rawGrammar, injections);\n return this._grammarForScopeName(rawGrammar.scopeName, initialLanguage, embeddedLanguages);\n }\n /**\n * Get the grammar for `scopeName`. The grammar must first be created via `loadGrammar` or `addGrammar`.\n */\n _grammarForScopeName(scopeName, initialLanguage = 0, embeddedLanguages = null, tokenTypes = null, balancedBracketSelectors = null) {\n return this._syncRegistry.grammarForScopeName(\n scopeName,\n initialLanguage,\n embeddedLanguages,\n tokenTypes,\n balancedBracketSelectors\n );\n }\n};\nvar INITIAL = StateStackImpl.NULL;\nexport {\n EncodedTokenMetadata,\n FindOption,\n FontStyle,\n INITIAL,\n Registry,\n Theme,\n disposeOnigString\n};\n","import { ShikiError as ShikiError$1 } from '@shikijs/types';\nexport * from '@shikijs/types';\nimport { FontStyle, INITIAL, EncodedTokenMetadata, Registry as Registry$1, Theme } from '@shikijs/vscode-textmate';\nimport { toHtml } from 'hast-util-to-html';\n\nfunction resolveColorReplacements(theme, options) {\n const replacements = typeof theme === \"string\" ? {} : { ...theme.colorReplacements };\n const themeName = typeof theme === \"string\" ? theme : theme.name;\n for (const [key, value] of Object.entries(options?.colorReplacements || {})) {\n if (typeof value === \"string\")\n replacements[key] = value;\n else if (key === themeName)\n Object.assign(replacements, value);\n }\n return replacements;\n}\nfunction applyColorReplacements(color, replacements) {\n if (!color)\n return color;\n return replacements?.[color?.toLowerCase()] || color;\n}\n\nfunction toArray(x) {\n return Array.isArray(x) ? x : [x];\n}\nasync function normalizeGetter(p) {\n return Promise.resolve(typeof p === \"function\" ? p() : p).then((r) => r.default || r);\n}\nfunction isPlainLang(lang) {\n return !lang || [\"plaintext\", \"txt\", \"text\", \"plain\"].includes(lang);\n}\nfunction isSpecialLang(lang) {\n return lang === \"ansi\" || isPlainLang(lang);\n}\nfunction isNoneTheme(theme) {\n return theme === \"none\";\n}\nfunction isSpecialTheme(theme) {\n return isNoneTheme(theme);\n}\n\nfunction addClassToHast(node, className) {\n if (!className)\n return node;\n node.properties ||= {};\n node.properties.class ||= [];\n if (typeof node.properties.class === \"string\")\n node.properties.class = node.properties.class.split(/\\s+/g);\n if (!Array.isArray(node.properties.class))\n node.properties.class = [];\n const targets = Array.isArray(className) ? className : className.split(/\\s+/g);\n for (const c of targets) {\n if (c && !node.properties.class.includes(c))\n node.properties.class.push(c);\n }\n return node;\n}\n\nfunction splitLines(code, preserveEnding = false) {\n if (code.length === 0) {\n return [[\"\", 0]];\n }\n const parts = code.split(/(\\r?\\n)/g);\n let index = 0;\n const lines = [];\n for (let i = 0; i < parts.length; i += 2) {\n const line = preserveEnding ? parts[i] + (parts[i + 1] || \"\") : parts[i];\n lines.push([line, index]);\n index += parts[i].length;\n index += parts[i + 1]?.length || 0;\n }\n return lines;\n}\nfunction createPositionConverter(code) {\n const lines = splitLines(code, true).map(([line]) => line);\n function indexToPos(index) {\n if (index === code.length) {\n return {\n line: lines.length - 1,\n character: lines[lines.length - 1].length\n };\n }\n let character = index;\n let line = 0;\n for (const lineText of lines) {\n if (character < lineText.length)\n break;\n character -= lineText.length;\n line++;\n }\n return { line, character };\n }\n function posToIndex(line, character) {\n let index = 0;\n for (let i = 0; i < line; i++)\n index += lines[i].length;\n index += character;\n return index;\n }\n return {\n lines,\n indexToPos,\n posToIndex\n };\n}\nfunction guessEmbeddedLanguages(code, _lang, highlighter) {\n const langs = /* @__PURE__ */ new Set();\n for (const match of code.matchAll(/:?lang=[\"']([^\"']+)[\"']/g)) {\n const lang = match[1].toLowerCase().trim();\n if (lang)\n langs.add(lang);\n }\n for (const match of code.matchAll(/(?:```|~~~)([\\w-]+)/g)) {\n const lang = match[1].toLowerCase().trim();\n if (lang)\n langs.add(lang);\n }\n for (const match of code.matchAll(/\\\\begin\\{([\\w-]+)\\}/g)) {\n const lang = match[1].toLowerCase().trim();\n if (lang)\n langs.add(lang);\n }\n for (const match of code.matchAll(/<script\\s+(?:type|lang)=[\"']([^\"']+)[\"']/gi)) {\n const fullType = match[1].toLowerCase().trim();\n const lang = fullType.includes(\"/\") ? fullType.split(\"/\").pop() : fullType;\n if (lang)\n langs.add(lang);\n }\n if (!highlighter)\n return Array.from(langs);\n const bundle = highlighter.getBundledLanguages();\n return Array.from(langs).filter((l) => l && bundle[l]);\n}\n\nconst DEFAULT_COLOR_LIGHT_DARK = \"light-dark()\";\nconst COLOR_KEYS = [\"color\", \"background-color\"];\n\nfunction splitToken(token, offsets) {\n let lastOffset = 0;\n const tokens = [];\n for (const offset of offsets) {\n if (offset > lastOffset) {\n tokens.push({\n ...token,\n content: token.content.slice(lastOffset, offset),\n offset: token.offset + lastOffset\n });\n }\n lastOffset = offset;\n }\n if (lastOffset < token.content.length) {\n tokens.push({\n ...token,\n content: token.content.slice(lastOffset),\n offset: token.offset + lastOffset\n });\n }\n return tokens;\n}\nfunction splitTokens(tokens, breakpoints) {\n const sorted = Array.from(breakpoints instanceof Set ? breakpoints : new Set(breakpoints)).sort((a, b) => a - b);\n if (!sorted.length)\n return tokens;\n return tokens.map((line) => {\n return line.flatMap((token) => {\n const breakpointsInToken = sorted.filter((i) => token.offset < i && i < token.offset + token.content.length).map((i) => i - token.offset).sort((a, b) => a - b);\n if (!breakpointsInToken.length)\n return token;\n return splitToken(token, breakpointsInToken);\n });\n });\n}\nfunction flatTokenVariants(merged, variantsOrder, cssVariablePrefix, defaultColor, colorsRendering = \"css-vars\") {\n const token = {\n content: merged.content,\n explanation: merged.explanation,\n offset: merged.offset\n };\n const styles = variantsOrder.map((t) => getTokenStyleObject(merged.variants[t]));\n const styleKeys = new Set(styles.flatMap((t) => Object.keys(t)));\n const mergedStyles = {};\n const varKey = (idx, key) => {\n const keyName = key === \"color\" ? \"\" : key === \"background-color\" ? \"-bg\" : `-${key}`;\n return cssVariablePrefix + variantsOrder[idx] + (key === \"color\" ? \"\" : keyName);\n };\n styles.forEach((cur, idx) => {\n for (const key of styleKeys) {\n const value = cur[key] || \"inherit\";\n if (idx === 0 && defaultColor && COLOR_KEYS.includes(key)) {\n if (defaultColor === DEFAULT_COLOR_LIGHT_DARK && styles.length > 1) {\n const lightIndex = variantsOrder.findIndex((t) => t === \"light\");\n const darkIndex = variantsOrder.findIndex((t) => t === \"dark\");\n if (lightIndex === -1 || darkIndex === -1)\n throw new ShikiError$1('When using `defaultColor: \"light-dark()\"`, you must provide both `light` and `dark` themes');\n const lightValue = styles[lightIndex][key] || \"inherit\";\n const darkValue = styles[darkIndex][key] || \"inherit\";\n mergedStyles[key] = `light-dark(${lightValue}, ${darkValue})`;\n if (colorsRendering === \"css-vars\")\n mergedStyles[varKey(idx, key)] = value;\n } else {\n mergedStyles[key] = value;\n }\n } else {\n if (colorsRendering === \"css-vars\")\n mergedStyles[varKey(idx, key)] = value;\n }\n }\n });\n token.htmlStyle = mergedStyles;\n return token;\n}\nfunction getTokenStyleObject(token) {\n const styles = {};\n if (token.color)\n styles.color = token.color;\n if (token.bgColor)\n styles[\"background-color\"] = token.bgColor;\n if (token.fontStyle) {\n if (token.fontStyle & FontStyle.Italic)\n styles[\"font-style\"] = \"italic\";\n if (token.fontStyle & FontStyle.Bold)\n styles[\"font-weight\"] = \"bold\";\n const decorations = [];\n if (token.fontStyle & FontStyle.Underline)\n decorations.push(\"underline\");\n if (token.fontStyle & FontStyle.Strikethrough)\n decorations.push(\"line-through\");\n if (decorations.length)\n styles[\"text-decoration\"] = decorations.join(\" \");\n }\n return styles;\n}\nfunction stringifyTokenStyle(token) {\n if (typeof token === \"string\")\n return token;\n return Object.entries(token).map(([key, value]) => `${key}:${value}`).join(\";\");\n}\n\nconst _grammarStateMap = /* @__PURE__ */ new WeakMap();\nfunction setLastGrammarStateToMap(keys, state) {\n _grammarStateMap.set(keys, state);\n}\nfunction getLastGrammarStateFromMap(keys) {\n return _grammarStateMap.get(keys);\n}\nclass GrammarState {\n /**\n * Theme to Stack mapping\n */\n _stacks = {};\n lang;\n get themes() {\n return Object.keys(this._stacks);\n }\n get theme() {\n return this.themes[0];\n }\n get _stack() {\n return this._stacks[this.theme];\n }\n /**\n * Static method to create a initial grammar state.\n */\n static initial(lang, themes) {\n return new GrammarState(\n Object.fromEntries(toArray(themes).map((theme) => [theme, INITIAL])),\n lang\n );\n }\n constructor(...args) {\n if (args.length === 2) {\n const [stacksMap, lang] = args;\n this.lang = lang;\n this._stacks = stacksMap;\n } else {\n const [stack, lang, theme] = args;\n this.lang = lang;\n this._stacks = { [theme]: stack };\n }\n }\n /**\n * Get the internal stack object.\n * @internal\n */\n getInternalStack(theme = this.theme) {\n return this._stacks[theme];\n }\n getScopes(theme = this.theme) {\n return getScopes(this._stacks[theme]);\n }\n toJSON() {\n return {\n lang: this.lang,\n theme: this.theme,\n themes: this.themes,\n scopes: this.getScopes()\n };\n }\n}\nfunction getScopes(stack) {\n const scopes = [];\n const visited = /* @__PURE__ */ new Set();\n function pushScope(stack2) {\n if (visited.has(stack2))\n return;\n visited.add(stack2);\n const name = stack2?.nameScopesList?.scopeName;\n if (name)\n scopes.push(name);\n if (stack2.parent)\n pushScope(stack2.parent);\n }\n pushScope(stack);\n return scopes;\n}\nfunction getGrammarStack(state, theme) {\n if (!(state instanceof GrammarState))\n throw new ShikiError$1(\"Invalid grammar state\");\n return state.getInternalStack(theme);\n}\n\nfunction transformerDecorations() {\n const map = /* @__PURE__ */ new WeakMap();\n function getContext(shiki) {\n if (!map.has(shiki.meta)) {\n let normalizePosition = function(p) {\n if (typeof p === \"number\") {\n if (p < 0 || p > shiki.source.length)\n throw new ShikiError$1(`Invalid decoration offset: ${p}. Code length: ${shiki.source.length}`);\n return {\n ...converter.indexToPos(p),\n offset: p\n };\n } else {\n const line = converter.lines[p.line];\n if (line === void 0)\n throw new ShikiError$1(`Invalid decoration position ${JSON.stringify(p)}. Lines length: ${converter.lines.length}`);\n let character = p.character;\n if (character < 0)\n character = line.length + character;\n if (character < 0 || character > line.length)\n throw new ShikiError$1(`Invalid decoration position ${JSON.stringify(p)}. Line ${p.line} length: ${line.length}`);\n return {\n ...p,\n character,\n offset: converter.posToIndex(p.line, character)\n };\n }\n };\n const converter = createPositionConverter(shiki.source);\n const decorations = (shiki.options.decorations || []).map((d) => ({\n ...d,\n start: normalizePosition(d.start),\n end: normalizePosition(d.end)\n }));\n verifyIntersections(decorations);\n map.set(shiki.meta, {\n decorations,\n converter,\n source: shiki.source\n });\n }\n return map.get(shiki.meta);\n }\n return {\n name: \"shiki:decorations\",\n tokens(tokens) {\n if (!this.options.decorations?.length)\n return;\n const ctx = getContext(this);\n const breakpoints = ctx.decorations.flatMap((d) => [d.start.offset, d.end.offset]);\n const splitted = splitTokens(tokens, breakpoints);\n return splitted;\n },\n code(codeEl) {\n if (!this.options.decorations?.length)\n return;\n const ctx = getContext(this);\n const lines = Array.from(codeEl.children).filter((i) => i.type === \"element\" && i.tagName === \"span\");\n if (lines.length !== ctx.converter.lines.length)\n throw new ShikiError$1(`Number of lines in code element (${lines.length}) does not match the number of lines in the source (${ctx.converter.lines.length}). Failed to apply decorations.`);\n function applyLineSection(line, start, end, decoration) {\n const lineEl = lines[line];\n let text = \"\";\n let startIndex = -1;\n let endIndex = -1;\n if (start === 0)\n startIndex = 0;\n if (end === 0)\n endIndex = 0;\n if (end === Number.POSITIVE_INFINITY)\n endIndex = lineEl.children.length;\n if (startIndex === -1 || endIndex === -1) {\n for (let i = 0; i < lineEl.children.length; i++) {\n text += stringify(lineEl.children[i]);\n if (startIndex === -1 && text.length === start)\n startIndex = i + 1;\n if (endIndex === -1 && text.length === end)\n endIndex = i + 1;\n }\n }\n if (startIndex === -1)\n throw new ShikiError$1(`Failed to find start index for decoration ${JSON.stringify(decoration.start)}`);\n if (endIndex === -1)\n throw new ShikiError$1(`Failed to find end index for decoration ${JSON.stringify(decoration.end)}`);\n const children = lineEl.children.slice(startIndex, endIndex);\n if (!decoration.alwaysWrap && children.length === lineEl.children.length) {\n applyDecoration(lineEl, decoration, \"line\");\n } else if (!decoration.alwaysWrap && children.length === 1 && children[0].type === \"element\") {\n applyDecoration(children[0], decoration, \"token\");\n } else {\n const wrapper = {\n type: \"element\",\n tagName: \"span\",\n properties: {},\n children\n };\n applyDecoration(wrapper, decoration, \"wrapper\");\n lineEl.children.splice(startIndex, children.length, wrapper);\n }\n }\n function applyLine(line, decoration) {\n lines[line] = applyDecoration(lines[line], decoration, \"line\");\n }\n function applyDecoration(el, decoration, type) {\n const properties = decoration.properties || {};\n const transform = decoration.transform || ((i) => i);\n el.tagName = decoration.tagName || \"span\";\n el.properties = {\n ...el.properties,\n ...properties,\n class: el.properties.class\n };\n if (decoration.properties?.class)\n addClassToHast(el, decoration.properties.class);\n el = transform(el, type) || el;\n return el;\n }\n const lineApplies = [];\n const sorted = ctx.decorations.sort((a, b) => b.start.offset - a.start.offset || a.end.offset - b.end.offset);\n for (const decoration of sorted) {\n const { start, end } = decoration;\n if (start.line === end.line) {\n applyLineSection(start.line, start.character, end.character, decoration);\n } else if (start.line < end.line) {\n applyLineSection(start.line, start.character, Number.POSITIVE_INFINITY, decoration);\n for (let i = start.line + 1; i < end.line; i++)\n lineApplies.unshift(() => applyLine(i, decoration));\n applyLineSection(end.line, 0, end.character, decoration);\n }\n }\n lineApplies.forEach((i) => i());\n }\n };\n}\nfunction verifyIntersections(items) {\n for (let i = 0; i < items.length; i++) {\n const foo = items[i];\n if (foo.start.offset > foo.end.offset)\n throw new ShikiError$1(`Invalid decoration range: ${JSON.stringify(foo.start)} - ${JSON.stringify(foo.end)}`);\n for (let j = i + 1; j < items.length; j++) {\n const bar = items[j];\n const isFooHasBarStart = foo.start.offset <= bar.start.offset && bar.start.offset < foo.end.offset;\n const isFooHasBarEnd = foo.start.offset < bar.end.offset && bar.end.offset <= foo.end.offset;\n const isBarHasFooStart = bar.start.offset <= foo.start.offset && foo.start.offset < bar.end.offset;\n const isBarHasFooEnd = bar.start.offset < foo.end.offset && foo.end.offset <= bar.end.offset;\n if (isFooHasBarStart || isFooHasBarEnd || isBarHasFooStart || isBarHasFooEnd) {\n if (isFooHasBarStart && isFooHasBarEnd)\n continue;\n if (isBarHasFooStart && isBarHasFooEnd)\n continue;\n if (isBarHasFooStart && foo.start.offset === foo.end.offset)\n continue;\n if (isFooHasBarEnd && bar.start.offset === bar.end.offset)\n continue;\n throw new ShikiError$1(`Decorations ${JSON.stringify(foo.start)} and ${JSON.stringify(bar.start)} intersect.`);\n }\n }\n }\n}\nfunction stringify(el) {\n if (el.type === \"text\")\n return el.value;\n if (el.type === \"element\")\n return el.children.map(stringify).join(\"\");\n return \"\";\n}\n\nconst builtInTransformers = [\n /* @__PURE__ */ transformerDecorations()\n];\nfunction getTransformers(options) {\n const transformers = sortTransformersByEnforcement(options.transformers || []);\n return [\n ...transformers.pre,\n ...transformers.normal,\n ...transformers.post,\n ...builtInTransformers\n ];\n}\nfunction sortTransformersByEnforcement(transformers) {\n const pre = [];\n const post = [];\n const normal = [];\n for (const transformer of transformers) {\n switch (transformer.enforce) {\n case \"pre\":\n pre.push(transformer);\n break;\n case \"post\":\n post.push(transformer);\n break;\n default:\n normal.push(transformer);\n }\n }\n return { pre, post, normal };\n}\n\n// src/colors.ts\nvar namedColors = [\n \"black\",\n \"red\",\n \"green\",\n \"yellow\",\n \"blue\",\n \"magenta\",\n \"cyan\",\n \"white\",\n \"brightBlack\",\n \"brightRed\",\n \"brightGreen\",\n \"brightYellow\",\n \"brightBlue\",\n \"brightMagenta\",\n \"brightCyan\",\n \"brightWhite\"\n];\n\n// src/decorations.ts\nvar decorations = {\n 1: \"bold\",\n 2: \"dim\",\n 3: \"italic\",\n 4: \"underline\",\n 7: \"reverse\",\n 8: \"hidden\",\n 9: \"strikethrough\"\n};\n\n// src/parser.ts\nfunction findSequence(value, position) {\n const nextEscape = value.indexOf(\"\\x1B\", position);\n if (nextEscape !== -1) {\n if (value[nextEscape + 1] === \"[\") {\n const nextClose = value.indexOf(\"m\", nextEscape);\n if (nextClose !== -1) {\n return {\n sequence: value.substring(nextEscape + 2, nextClose).split(\";\"),\n startPosition: nextEscape,\n position: nextClose + 1\n };\n }\n }\n }\n return {\n position: value.length\n };\n}\nfunction parseColor(sequence) {\n const colorMode = sequence.shift();\n if (colorMode === \"2\") {\n const rgb = sequence.splice(0, 3).map((x) => Number.parseInt(x));\n if (rgb.length !== 3 || rgb.some((x) => Number.isNaN(x)))\n return;\n return {\n type: \"rgb\",\n rgb\n };\n } else if (colorMode === \"5\") {\n const index = sequence.shift();\n if (index) {\n return { type: \"table\", index: Number(index) };\n }\n }\n}\nfunction parseSequence(sequence) {\n const commands = [];\n while (sequence.length > 0) {\n const code = sequence.shift();\n if (!code)\n continue;\n const codeInt = Number.parseInt(code);\n if (Number.isNaN(codeInt))\n continue;\n if (codeInt === 0) {\n commands.push({ type: \"resetAll\" });\n } else if (codeInt <= 9) {\n const decoration = decorations[codeInt];\n if (decoration) {\n commands.push({\n type: \"setDecoration\",\n value: decorations[codeInt]\n });\n }\n } else if (codeInt <= 29) {\n const decoration = decorations[codeInt - 20];\n if (decoration) {\n commands.push({\n type: \"resetDecoration\",\n value: decoration\n });\n if (decoration === \"dim\") {\n commands.push({\n type: \"resetDecoration\",\n value: \"bold\"\n });\n }\n }\n } else if (codeInt <= 37) {\n commands.push({\n type: \"setForegroundColor\",\n value: { type: \"named\", name: namedColors[codeInt - 30] }\n });\n } else if (codeInt === 38) {\n const color = parseColor(sequence);\n if (color) {\n commands.push({\n type: \"setForegroundColor\",\n value: color\n });\n }\n } else if (codeInt === 39) {\n commands.push({\n type: \"resetForegroundColor\"\n });\n } else if (codeInt <= 47) {\n commands.push({\n type: \"setBackgroundColor\",\n value: { type: \"named\", name: namedColors[codeInt - 40] }\n });\n } else if (codeInt === 48) {\n const color = parseColor(sequence);\n if (color) {\n commands.push({\n type: \"setBackgroundColor\",\n value: color\n });\n }\n } else if (codeInt === 49) {\n commands.push({\n type: \"resetBackgroundColor\"\n });\n } else if (codeInt === 53) {\n commands.push({\n type: \"setDecoration\",\n value: \"overline\"\n });\n } else if (codeInt === 55) {\n commands.push({\n type: \"resetDecoration\",\n value: \"overline\"\n });\n } else if (codeInt >= 90 && codeInt <= 97) {\n commands.push({\n type: \"setForegroundColor\",\n value: { type: \"named\", name: namedColors[codeInt - 90 + 8] }\n });\n } else if (codeInt >= 100 && codeInt <= 107) {\n commands.push({\n type: \"setBackgroundColor\",\n value: { type: \"named\", name: namedColors[codeInt - 100 + 8] }\n });\n }\n }\n return commands;\n}\nfunction createAnsiSequenceParser() {\n let foreground = null;\n let background = null;\n let decorations2 = /* @__PURE__ */ new Set();\n return {\n parse(value) {\n const tokens = [];\n let position = 0;\n do {\n const findResult = findSequence(value, position);\n const text = findResult.sequence ? value.substring(position, findResult.startPosition) : value.substring(position);\n if (text.length > 0) {\n tokens.push({\n value: text,\n foreground,\n background,\n decorations: new Set(decorations2)\n });\n }\n if (findResult.sequence) {\n const commands = parseSequence(findResult.sequence);\n for (const styleToken of commands) {\n if (styleToken.type === \"resetAll\") {\n foreground = null;\n background = null;\n decorations2.clear();\n } else if (styleToken.type === \"resetForegroundColor\") {\n foreground = null;\n } else if (styleToken.type === \"resetBackgroundColor\") {\n background = null;\n } else if (styleToken.type === \"resetDecoration\") {\n decorations2.delete(styleToken.value);\n }\n }\n for (const styleToken of commands) {\n if (styleToken.type === \"setForegroundColor\") {\n foreground = styleToken.value;\n } else if (styleToken.type === \"setBackgroundColor\") {\n background = styleToken.value;\n } else if (styleToken.type === \"setDecoration\") {\n decorations2.add(styleToken.value);\n }\n }\n }\n position = findResult.position;\n } while (position < value.length);\n return tokens;\n }\n };\n}\n\n// src/palette.ts\nvar defaultNamedColorsMap = {\n black: \"#000000\",\n red: \"#bb0000\",\n green: \"#00bb00\",\n yellow: \"#bbbb00\",\n blue: \"#0000bb\",\n magenta: \"#ff00ff\",\n cyan: \"#00bbbb\",\n white: \"#eeeeee\",\n brightBlack: \"#555555\",\n brightRed: \"#ff5555\",\n brightGreen: \"#00ff00\",\n brightYellow: \"#ffff55\",\n brightBlue: \"#5555ff\",\n brightMagenta: \"#ff55ff\",\n brightCyan: \"#55ffff\",\n brightWhite: \"#ffffff\"\n};\nfunction createColorPalette(namedColorsMap = defaultNamedColorsMap) {\n function namedColor(name) {\n return namedColorsMap[name];\n }\n function rgbColor(rgb) {\n return `#${rgb.map((x) => Math.max(0, Math.min(x, 255)).toString(16).padStart(2, \"0\")).join(\"\")}`;\n }\n let colorTable;\n function getColorTable() {\n if (colorTable) {\n return colorTable;\n }\n colorTable = [];\n for (let i = 0; i < namedColors.length; i++) {\n colorTable.push(namedColor(namedColors[i]));\n }\n let levels = [0, 95, 135, 175, 215, 255];\n for (let r = 0; r < 6; r++) {\n for (let g = 0; g < 6; g++) {\n for (let b = 0; b < 6; b++) {\n colorTable.push(rgbColor([levels[r], levels[g], levels[b]]));\n }\n }\n }\n let level = 8;\n for (let i = 0; i < 24; i++, level += 10) {\n colorTable.push(rgbColor([level, level, level]));\n }\n return colorTable;\n }\n function tableColor(index) {\n return getColorTable()[index];\n }\n function value(color) {\n switch (color.type) {\n case \"named\":\n return namedColor(color.name);\n case \"rgb\":\n return rgbColor(color.rgb);\n case \"table\":\n return tableColor(color.index);\n }\n }\n return {\n value\n };\n}\n\nconst defaultAnsiColors = {\n black: \"#000000\",\n red: \"#cd3131\",\n green: \"#0DBC79\",\n yellow: \"#E5E510\",\n blue: \"#2472C8\",\n magenta: \"#BC3FBC\",\n cyan: \"#11A8CD\",\n white: \"#E5E5E5\",\n brightBlack: \"#666666\",\n brightRed: \"#F14C4C\",\n brightGreen: \"#23D18B\",\n brightYellow: \"#F5F543\",\n brightBlue: \"#3B8EEA\",\n brightMagenta: \"#D670D6\",\n brightCyan: \"#29B8DB\",\n brightWhite: \"#FFFFFF\"\n};\nfunction tokenizeAnsiWithTheme(theme, fileContents, options) {\n const colorReplacements = resolveColorReplacements(theme, options);\n const lines = splitLines(fileContents);\n const ansiPalette = Object.fromEntries(\n namedColors.map((name) => {\n const key = `terminal.ansi${name[0].toUpperCase()}${name.substring(1)}`;\n const themeColor = theme.colors?.[key];\n return [name, themeColor || defaultAnsiColors[name]];\n })\n );\n const colorPalette = createColorPalette(ansiPalette);\n const parser = createAnsiSequenceParser();\n return lines.map(\n (line) => parser.parse(line[0]).map((token) => {\n let color;\n let bgColor;\n if (token.decorations.has(\"reverse\")) {\n color = token.background ? colorPalette.value(token.background) : theme.bg;\n bgColor = token.foreground ? colorPalette.value(token.foreground) : theme.fg;\n } else {\n color = token.foreground ? colorPalette.value(token.foreground) : theme.fg;\n bgColor = token.background ? colorPalette.value(token.background) : void 0;\n }\n color = applyColorReplacements(color, colorReplacements);\n bgColor = applyColorReplacements(bgColor, colorReplacements);\n if (token.decorations.has(\"dim\"))\n color = dimColor(color);\n let fontStyle = FontStyle.None;\n if (token.decorations.has(\"bold\"))\n fontStyle |= FontStyle.Bold;\n if (token.decorations.has(\"italic\"))\n fontStyle |= FontStyle.Italic;\n if (token.decorations.has(\"underline\"))\n fontStyle |= FontStyle.Underline;\n if (token.decorations.has(\"strikethrough\"))\n fontStyle |= FontStyle.Strikethrough;\n return {\n content: token.value,\n offset: line[1],\n // TODO: more accurate offset? might need to fork ansi-sequence-parser\n color,\n bgColor,\n fontStyle\n };\n })\n );\n}\nfunction dimColor(color) {\n const hexMatch = color.match(/#([0-9a-f]{3,8})/i);\n if (hexMatch) {\n const hex = hexMatch[1];\n if (hex.length === 8) {\n const alpha = Math.round(Number.parseInt(hex.slice(6, 8), 16) / 2).toString(16).padStart(2, \"0\");\n return `#${hex.slice(0, 6)}${alpha}`;\n } else if (hex.length === 6) {\n return `#${hex}80`;\n } else if (hex.length === 4) {\n const r = hex[0];\n const g = hex[1];\n const b = hex[2];\n const a = hex[3];\n const alpha = Math.round(Number.parseInt(`${a}${a}`, 16) / 2).toString(16).padStart(2, \"0\");\n return `#${r}${r}${g}${g}${b}${b}${alpha}`;\n } else if (hex.length === 3) {\n const r = hex[0];\n const g = hex[1];\n const b = hex[2];\n return `#${r}${r}${g}${g}${b}${b}80`;\n }\n }\n const cssVarMatch = color.match(/var\\((--[\\w-]+-ansi-[\\w-]+)\\)/);\n if (cssVarMatch)\n return `var(${cssVarMatch[1]}-dim)`;\n return color;\n}\n\nfunction codeToTokensBase(internal, code, options = {}) {\n const {\n theme: themeName = internal.getLoadedThemes()[0]\n } = options;\n const lang = internal.resolveLangAlias(options.lang || \"text\");\n if (isPlainLang(lang) || isNoneTheme(themeName))\n return splitLines(code).map((line) => [{ content: line[0], offset: line[1] }]);\n const { theme, colorMap } = internal.setTheme(themeName);\n if (lang === \"ansi\")\n return tokenizeAnsiWithTheme(theme, code, options);\n const _grammar = internal.getLanguage(options.lang || \"text\");\n if (options.grammarState) {\n if (options.grammarState.lang !== _grammar.name) {\n throw new ShikiError$1(`Grammar state language \"${options.grammarState.lang}\" does not match highlight language \"${_grammar.name}\"`);\n }\n if (!options.grammarState.themes.includes(theme.name)) {\n throw new ShikiError$1(`Grammar state themes \"${options.grammarState.themes}\" do not contain highlight theme \"${theme.name}\"`);\n }\n }\n return tokenizeWithTheme(code, _grammar, theme, colorMap, options);\n}\nfunction getLastGrammarState(...args) {\n if (args.length === 2) {\n return getLastGrammarStateFromMap(args[1]);\n }\n const [internal, code, options = {}] = args;\n const {\n lang = \"text\",\n theme: themeName = internal.getLoadedThemes()[0]\n } = options;\n if (isPlainLang(lang) || isNoneTheme(themeName))\n throw new ShikiError$1(\"Plain language does not have grammar state\");\n if (lang === \"ansi\")\n throw new ShikiError$1(\"ANSI language does not have grammar state\");\n const { theme, colorMap } = internal.setTheme(themeName);\n const _grammar = internal.getLanguage(lang);\n return new GrammarState(\n _tokenizeWithTheme(code, _grammar, theme, colorMap, options).stateStack,\n _grammar.name,\n theme.name\n );\n}\nfunction tokenizeWithTheme(code, grammar, theme, colorMap, options) {\n const result = _tokenizeWithTheme(code, grammar, theme, colorMap, options);\n const grammarState = new GrammarState(\n result.stateStack,\n grammar.name,\n theme.name\n );\n setLastGrammarStateToMap(result.tokens, grammarState);\n return result.tokens;\n}\nfunction _tokenizeWithTheme(code, grammar, theme, colorMap, options) {\n const colorReplacements = resolveColorReplacements(theme, options);\n const {\n tokenizeMaxLineLength = 0,\n tokenizeTimeLimit = 500\n } = options;\n const lines = splitLines(code);\n let stateStack = options.grammarState ? getGrammarStack(options.grammarState, theme.name) ?? INITIAL : options.grammarContextCode != null ? _tokenizeWithTheme(\n options.grammarContextCode,\n grammar,\n theme,\n colorMap,\n {\n ...options,\n grammarState: void 0,\n grammarContextCode: void 0\n }\n ).stateStack : INITIAL;\n let actual = [];\n const final = [];\n for (let i = 0, len = lines.length; i < len; i++) {\n const [line, lineOffset] = lines[i];\n if (line === \"\") {\n actual = [];\n final.push([]);\n continue;\n }\n if (tokenizeMaxLineLength > 0 && line.length >= tokenizeMaxLineLength) {\n actual = [];\n final.push([{\n content: line,\n offset: lineOffset,\n color: \"\",\n fontStyle: 0\n }]);\n continue;\n }\n let resultWithScopes;\n let tokensWithScopes;\n let tokensWithScopesIndex;\n if (options.includeExplanation) {\n resultWithScopes = grammar.tokenizeLine(line, stateStack, tokenizeTimeLimit);\n tokensWithScopes = resultWithScopes.tokens;\n tokensWithScopesIndex = 0;\n }\n const result = grammar.tokenizeLine2(line, stateStack, tokenizeTimeLimit);\n const tokensLength = result.tokens.length / 2;\n for (let j = 0; j < tokensLength; j++) {\n const startIndex = result.tokens[2 * j];\n const nextStartIndex = j + 1 < tokensLength ? result.tokens[2 * j + 2] : line.length;\n if (startIndex === nextStartIndex)\n continue;\n const metadata = result.tokens[2 * j + 1];\n const color = applyColorReplacements(\n colorMap[EncodedTokenMetadata.getForeground(metadata)],\n colorReplacements\n );\n const fontStyle = EncodedTokenMetadata.getFontStyle(metadata);\n const token = {\n content: line.substring(startIndex, nextStartIndex),\n offset: lineOffset + startIndex,\n color,\n fontStyle\n };\n if (options.includeExplanation) {\n const themeSettingsSelectors = [];\n if (options.includeExplanation !== \"scopeName\") {\n for (const setting of theme.settings) {\n let selectors;\n switch (typeof setting.scope) {\n case \"string\":\n selectors = setting.scope.split(/,/).map((scope) => scope.trim());\n break;\n case \"object\":\n selectors = setting.scope;\n break;\n default:\n continue;\n }\n themeSettingsSelectors.push({\n settings: setting,\n selectors: selectors.map((selector) => selector.split(/ /))\n });\n }\n }\n token.explanation = [];\n let offset = 0;\n while (startIndex + offset < nextStartIndex) {\n const tokenWithScopes = tokensWithScopes[tokensWithScopesIndex];\n const tokenWithScopesText = line.substring(\n tokenWithScopes.startIndex,\n tokenWithScopes.endIndex\n );\n offset += tokenWithScopesText.length;\n token.explanation.push({\n content: tokenWithScopesText,\n scopes: options.includeExplanation === \"scopeName\" ? explainThemeScopesNameOnly(\n tokenWithScopes.scopes\n ) : explainThemeScopesFull(\n themeSettingsSelectors,\n tokenWithScopes.scopes\n )\n });\n tokensWithScopesIndex += 1;\n }\n }\n actual.push(token);\n }\n final.push(actual);\n actual = [];\n stateStack = result.ruleStack;\n }\n return {\n tokens: final,\n stateStack\n };\n}\nfunction explainThemeScopesNameOnly(scopes) {\n return scopes.map((scope) => ({ scopeName: scope }));\n}\nfunction explainThemeScopesFull(themeSelectors, scopes) {\n const result = [];\n for (let i = 0, len = scopes.length; i < len; i++) {\n const scope = scopes[i];\n result[i] = {\n scopeName: scope,\n themeMatches: explainThemeScope(themeSelectors, scope, scopes.slice(0, i))\n };\n }\n return result;\n}\nfunction matchesOne(selector, scope) {\n return selector === scope || scope.substring(0, selector.length) === selector && scope[selector.length] === \".\";\n}\nfunction matches(selectors, scope, parentScopes) {\n if (!matchesOne(selectors[selectors.length - 1], scope))\n return false;\n let selectorParentIndex = selectors.length - 2;\n let parentIndex = parentScopes.length - 1;\n while (selectorParentIndex >= 0 && parentIndex >= 0) {\n if (matchesOne(selectors[selectorParentIndex], parentScopes[parentIndex]))\n selectorParentIndex -= 1;\n parentIndex -= 1;\n }\n if (selectorParentIndex === -1)\n return true;\n return false;\n}\nfunction explainThemeScope(themeSettingsSelectors, scope, parentScopes) {\n const result = [];\n for (const { selectors, settings } of themeSettingsSelectors) {\n for (const selectorPieces of selectors) {\n if (matches(selectorPieces, scope, parentScopes)) {\n result.push(settings);\n break;\n }\n }\n }\n return result;\n}\n\nfunction codeToTokensWithThemes(internal, code, options) {\n const themes = Object.entries(options.themes).filter((i) => i[1]).map((i) => ({ color: i[0], theme: i[1] }));\n const themedTokens = themes.map((t) => {\n const tokens2 = codeToTokensBase(internal, code, {\n ...options,\n theme: t.theme\n });\n const state = getLastGrammarStateFromMap(tokens2);\n const theme = typeof t.theme === \"string\" ? t.theme : t.theme.name;\n return {\n tokens: tokens2,\n state,\n theme\n };\n });\n const tokens = syncThemesTokenization(\n ...themedTokens.map((i) => i.tokens)\n );\n const mergedTokens = tokens[0].map(\n (line, lineIdx) => line.map((_token, tokenIdx) => {\n const mergedToken = {\n content: _token.content,\n variants: {},\n offset: _token.offset\n };\n if (\"includeExplanation\" in options && options.includeExplanation) {\n mergedToken.explanation = _token.explanation;\n }\n tokens.forEach((t, themeIdx) => {\n const {\n content: _,\n explanation: __,\n offset: ___,\n ...styles\n } = t[lineIdx][tokenIdx];\n mergedToken.variants[themes[themeIdx].color] = styles;\n });\n return mergedToken;\n })\n );\n const mergedGrammarState = themedTokens[0].state ? new GrammarState(\n Object.fromEntries(themedTokens.map((s) => [s.theme, s.state?.getInternalStack(s.theme)])),\n themedTokens[0].state.lang\n ) : void 0;\n if (mergedGrammarState)\n setLastGrammarStateToMap(mergedTokens, mergedGrammarState);\n return mergedTokens;\n}\nfunction syncThemesTokenization(...themes) {\n const outThemes = themes.map(() => []);\n const count = themes.length;\n for (let i = 0; i < themes[0].length; i++) {\n const lines = themes.map((t) => t[i]);\n const outLines = outThemes.map(() => []);\n outThemes.forEach((t, i2) => t.push(outLines[i2]));\n const indexes = lines.map(() => 0);\n const current = lines.map((l) => l[0]);\n while (current.every((t) => t)) {\n const minLength = Math.min(...current.map((t) => t.content.length));\n for (let n = 0; n < count; n++) {\n const token = current[n];\n if (token.content.length === minLength) {\n outLines[n].push(token);\n indexes[n] += 1;\n current[n] = lines[n][indexes[n]];\n } else {\n outLines[n].push({\n ...token,\n content: token.content.slice(0, minLength)\n });\n current[n] = {\n ...token,\n content: token.content.slice(minLength),\n offset: token.offset + minLength\n };\n }\n }\n }\n }\n return outThemes;\n}\n\nfunction codeToTokens(internal, code, options) {\n let bg;\n let fg;\n let tokens;\n let themeName;\n let rootStyle;\n let grammarState;\n if (\"themes\" in options) {\n const {\n defaultColor = \"light\",\n cssVariablePrefix = \"--shiki-\",\n colorsRendering = \"css-vars\"\n } = options;\n const themes = Object.entries(options.themes).filter((i) => i[1]).map((i) => ({ color: i[0], theme: i[1] })).sort((a, b) => a.color === defaultColor ? -1 : b.color === defaultColor ? 1 : 0);\n if (themes.length === 0)\n throw new ShikiError$1(\"`themes` option must not be empty\");\n const themeTokens = codeToTokensWithThemes(\n internal,\n code,\n options\n );\n grammarState = getLastGrammarStateFromMap(themeTokens);\n if (defaultColor && DEFAULT_COLOR_LIGHT_DARK !== defaultColor && !themes.find((t) => t.color === defaultColor))\n throw new ShikiError$1(`\\`themes\\` option must contain the defaultColor key \\`${defaultColor}\\``);\n const themeRegs = themes.map((t) => internal.getTheme(t.theme));\n const themesOrder = themes.map((t) => t.color);\n tokens = themeTokens.map((line) => line.map((token) => flatTokenVariants(token, themesOrder, cssVariablePrefix, defaultColor, colorsRendering)));\n if (grammarState)\n setLastGrammarStateToMap(tokens, grammarState);\n const themeColorReplacements = themes.map((t) => resolveColorReplacements(t.theme, options));\n fg = mapThemeColors(themes, themeRegs, themeColorReplacements, cssVariablePrefix, defaultColor, \"fg\", colorsRendering);\n bg = mapThemeColors(themes, themeRegs, themeColorReplacements, cssVariablePrefix, defaultColor, \"bg\", colorsRendering);\n themeName = `shiki-themes ${themeRegs.map((t) => t.name).join(\" \")}`;\n rootStyle = defaultColor ? void 0 : [fg, bg].join(\";\");\n } else if (\"theme\" in options) {\n const colorReplacements = resolveColorReplacements(options.theme, options);\n tokens = codeToTokensBase(\n internal,\n code,\n options\n );\n const _theme = internal.getTheme(options.theme);\n bg = applyColorReplacements(_theme.bg, colorReplacements);\n fg = applyColorReplacements(_theme.fg, colorReplacements);\n themeName = _theme.name;\n grammarState = getLastGrammarStateFromMap(tokens);\n } else {\n throw new ShikiError$1(\"Invalid options, either `theme` or `themes` must be provided\");\n }\n return {\n tokens,\n fg,\n bg,\n themeName,\n rootStyle,\n grammarState\n };\n}\nfunction mapThemeColors(themes, themeRegs, themeColorReplacements, cssVariablePrefix, defaultColor, property, colorsRendering) {\n return themes.map((t, idx) => {\n const value = applyColorReplacements(themeRegs[idx][property], themeColorReplacements[idx]) || \"inherit\";\n const cssVar = `${cssVariablePrefix + t.color}${property === \"bg\" ? \"-bg\" : \"\"}:${value}`;\n if (idx === 0 && defaultColor) {\n if (defaultColor === DEFAULT_COLOR_LIGHT_DARK && themes.length > 1) {\n const lightIndex = themes.findIndex((t2) => t2.color === \"light\");\n const darkIndex = themes.findIndex((t2) => t2.color === \"dark\");\n if (lightIndex === -1 || darkIndex === -1)\n throw new ShikiError$1('When using `defaultColor: \"light-dark()\"`, you must provide both `light` and `dark` themes');\n const lightValue = applyColorReplacements(themeRegs[lightIndex][property], themeColorReplacements[lightIndex]) || \"inherit\";\n const darkValue = applyColorReplacements(themeRegs[darkIndex][property], themeColorReplacements[darkIndex]) || \"inherit\";\n return `light-dark(${lightValue}, ${darkValue});${cssVar}`;\n }\n return value;\n }\n if (colorsRendering === \"css-vars\") {\n return cssVar;\n }\n return null;\n }).filter((i) => !!i).join(\";\");\n}\n\nfunction codeToHast(internal, code, options, transformerContext = {\n meta: {},\n options,\n codeToHast: (_code, _options) => codeToHast(internal, _code, _options),\n codeToTokens: (_code, _options) => codeToTokens(internal, _code, _options)\n}) {\n let input = code;\n for (const transformer of getTransformers(options))\n input = transformer.preprocess?.call(transformerContext, input, options) || input;\n let {\n tokens,\n fg,\n bg,\n themeName,\n rootStyle,\n grammarState\n } = codeToTokens(internal, input, options);\n const {\n mergeWhitespaces = true,\n mergeSameStyleTokens = false\n } = options;\n if (mergeWhitespaces === true)\n tokens = mergeWhitespaceTokens(tokens);\n else if (mergeWhitespaces === \"never\")\n tokens = splitWhitespaceTokens(tokens);\n if (mergeSameStyleTokens) {\n tokens = mergeAdjacentStyledTokens(tokens);\n }\n const contextSource = {\n ...transformerContext,\n get source() {\n return input;\n }\n };\n for (const transformer of getTransformers(options))\n tokens = transformer.tokens?.call(contextSource, tokens) || tokens;\n return tokensToHast(\n tokens,\n {\n ...options,\n fg,\n bg,\n themeName,\n rootStyle: options.rootStyle === false ? false : options.rootStyle ?? rootStyle\n },\n contextSource,\n grammarState\n );\n}\nfunction tokensToHast(tokens, options, transformerContext, grammarState = getLastGrammarStateFromMap(tokens)) {\n const transformers = getTransformers(options);\n const lines = [];\n const root = {\n type: \"root\",\n children: []\n };\n const {\n structure = \"classic\",\n tabindex = \"0\"\n } = options;\n const properties = {\n class: `shiki ${options.themeName || \"\"}`\n };\n if (options.rootStyle !== false) {\n if (options.rootStyle != null)\n properties.style = options.rootStyle;\n else\n properties.style = `background-color:${options.bg};color:${options.fg}`;\n }\n if (tabindex !== false && tabindex != null)\n properties.tabindex = tabindex.toString();\n for (const [key, value] of Object.entries(options.meta || {})) {\n if (!key.startsWith(\"_\"))\n properties[key] = value;\n }\n let preNode = {\n type: \"element\",\n tagName: \"pre\",\n properties,\n children: [],\n data: options.data\n };\n let codeNode = {\n type: \"element\",\n tagName: \"code\",\n properties: {},\n children: lines\n };\n const lineNodes = [];\n const context = {\n ...transformerContext,\n structure,\n addClassToHast,\n get source() {\n return transformerContext.source;\n },\n get tokens() {\n return tokens;\n },\n get options() {\n return options;\n },\n get root() {\n return root;\n },\n get pre() {\n return preNode;\n },\n get code() {\n return codeNode;\n },\n get lines() {\n return lineNodes;\n }\n };\n tokens.forEach((line, idx) => {\n if (idx) {\n if (structure === \"inline\")\n root.children.push({ type: \"element\", tagName: \"br\", properties: {}, children: [] });\n else if (structure === \"classic\")\n lines.push({ type: \"text\", value: \"\\n\" });\n }\n let lineNode = {\n type: \"element\",\n tagName: \"span\",\n properties: { class: \"line\" },\n children: []\n };\n let col = 0;\n for (const token of line) {\n let tokenNode = {\n type: \"element\",\n tagName: \"span\",\n properties: {\n ...token.htmlAttrs\n },\n children: [{ type: \"text\", value: token.content }]\n };\n const style = stringifyTokenStyle(token.htmlStyle || getTokenStyleObject(token));\n if (style)\n tokenNode.properties.style = style;\n for (const transformer of transformers)\n tokenNode = transformer?.span?.call(context, tokenNode, idx + 1, col, lineNode, token) || tokenNode;\n if (structure === \"inline\")\n root.children.push(tokenNode);\n else if (structure === \"classic\")\n lineNode.children.push(tokenNode);\n col += token.content.length;\n }\n if (structure === \"classic\") {\n for (const transformer of transformers)\n lineNode = transformer?.line?.call(context, lineNode, idx + 1) || lineNode;\n lineNodes.push(lineNode);\n lines.push(lineNode);\n } else if (structure === \"inline\") {\n lineNodes.push(lineNode);\n }\n });\n if (structure === \"classic\") {\n for (const transformer of transformers)\n codeNode = transformer?.code?.call(context, codeNode) || codeNode;\n preNode.children.push(codeNode);\n for (const transformer of transformers)\n preNode = transformer?.pre?.call(context, preNode) || preNode;\n root.children.push(preNode);\n } else if (structure === \"inline\") {\n const syntheticLines = [];\n let currentLine = {\n type: \"element\",\n tagName: \"span\",\n properties: { class: \"line\" },\n children: []\n };\n for (const child of root.children) {\n if (child.type === \"element\" && child.tagName === \"br\") {\n syntheticLines.push(currentLine);\n currentLine = {\n type: \"element\",\n tagName: \"span\",\n properties: { class: \"line\" },\n children: []\n };\n } else if (child.type === \"element\" || child.type === \"text\") {\n currentLine.children.push(child);\n }\n }\n syntheticLines.push(currentLine);\n const syntheticCode = {\n type: \"element\",\n tagName: \"code\",\n properties: {},\n children: syntheticLines\n };\n let transformedCode = syntheticCode;\n for (const transformer of transformers)\n transformedCode = transformer?.code?.call(context, transformedCode) || transformedCode;\n root.children = [];\n for (let i = 0; i < transformedCode.children.length; i++) {\n if (i > 0)\n root.children.push({ type: \"element\", tagName: \"br\", properties: {}, children: [] });\n const line = transformedCode.children[i];\n if (line.type === \"element\")\n root.children.push(...line.children);\n }\n }\n let result = root;\n for (const transformer of transformers)\n result = transformer?.root?.call(context, result) || result;\n if (grammarState)\n setLastGrammarStateToMap(result, grammarState);\n return result;\n}\nfunction mergeWhitespaceTokens(tokens) {\n return tokens.map((line) => {\n const newLine = [];\n let carryOnContent = \"\";\n let firstOffset;\n line.forEach((token, idx) => {\n const isDecorated = token.fontStyle && (token.fontStyle & FontStyle.Underline || token.fontStyle & FontStyle.Strikethrough);\n const couldMerge = !isDecorated;\n if (couldMerge && token.content.match(/^\\s+$/) && line[idx + 1]) {\n if (firstOffset === void 0)\n firstOffset = token.offset;\n carryOnContent += token.content;\n } else {\n if (carryOnContent) {\n if (couldMerge) {\n newLine.push({\n ...token,\n offset: firstOffset,\n content: carryOnContent + token.content\n });\n } else {\n newLine.push(\n {\n content: carryOnContent,\n offset: firstOffset\n },\n token\n );\n }\n firstOffset = void 0;\n carryOnContent = \"\";\n } else {\n newLine.push(token);\n }\n }\n });\n return newLine;\n });\n}\nfunction splitWhitespaceTokens(tokens) {\n return tokens.map((line) => {\n return line.flatMap((token) => {\n if (token.content.match(/^\\s+$/))\n return token;\n const match = token.content.match(/^(\\s*)(.*?)(\\s*)$/);\n if (!match)\n return token;\n const [, leading, content, trailing] = match;\n if (!leading && !trailing)\n return token;\n const expanded = [{\n ...token,\n offset: token.offset + leading.length,\n content\n }];\n if (leading) {\n expanded.unshift({\n content: leading,\n offset: token.offset\n });\n }\n if (trailing) {\n expanded.push({\n content: trailing,\n offset: token.offset + leading.length + content.length\n });\n }\n return expanded;\n });\n });\n}\nfunction mergeAdjacentStyledTokens(tokens) {\n return tokens.map((line) => {\n const newLine = [];\n for (const token of line) {\n if (newLine.length === 0) {\n newLine.push({ ...token });\n continue;\n }\n const prevToken = newLine[newLine.length - 1];\n const prevStyle = stringifyTokenStyle(prevToken.htmlStyle || getTokenStyleObject(prevToken));\n const currentStyle = stringifyTokenStyle(token.htmlStyle || getTokenStyleObject(token));\n const isPrevDecorated = prevToken.fontStyle && (prevToken.fontStyle & FontStyle.Underline || prevToken.fontStyle & FontStyle.Strikethrough);\n const isDecorated = token.fontStyle && (token.fontStyle & FontStyle.Underline || token.fontStyle & FontStyle.Strikethrough);\n if (!isPrevDecorated && !isDecorated && prevStyle === currentStyle) {\n prevToken.content += token.content;\n } else {\n newLine.push({ ...token });\n }\n }\n return newLine;\n });\n}\n\nconst hastToHtml = toHtml;\nfunction codeToHtml(internal, code, options) {\n const context = {\n meta: {},\n options,\n codeToHast: (_code, _options) => codeToHast(internal, _code, _options),\n codeToTokens: (_code, _options) => codeToTokens(internal, _code, _options)\n };\n let result = hastToHtml(codeToHast(internal, code, options, context));\n for (const transformer of getTransformers(options))\n result = transformer.postprocess?.call(context, result, options) || result;\n return result;\n}\n\nconst VSCODE_FALLBACK_EDITOR_FG = { light: \"#333333\", dark: \"#bbbbbb\" };\nconst VSCODE_FALLBACK_EDITOR_BG = { light: \"#fffffe\", dark: \"#1e1e1e\" };\nconst RESOLVED_KEY = \"__shiki_resolved\";\nfunction normalizeTheme(rawTheme) {\n if (rawTheme?.[RESOLVED_KEY])\n return rawTheme;\n const theme = {\n ...rawTheme\n };\n if (theme.tokenColors && !theme.settings) {\n theme.settings = theme.tokenColors;\n delete theme.tokenColors;\n }\n theme.type ||= \"dark\";\n theme.colorReplacements = { ...theme.colorReplacements };\n theme.settings ||= [];\n let { bg, fg } = theme;\n if (!bg || !fg) {\n const globalSetting = theme.settings ? theme.settings.find((s) => !s.name && !s.scope) : void 0;\n if (globalSetting?.settings?.foreground)\n fg = globalSetting.settings.foreground;\n if (globalSetting?.settings?.background)\n bg = globalSetting.settings.background;\n if (!fg && theme?.colors?.[\"editor.foreground\"])\n fg = theme.colors[\"editor.foreground\"];\n if (!bg && theme?.colors?.[\"editor.background\"])\n bg = theme.colors[\"editor.background\"];\n if (!fg)\n fg = theme.type === \"light\" ? VSCODE_FALLBACK_EDITOR_FG.light : VSCODE_FALLBACK_EDITOR_FG.dark;\n if (!bg)\n bg = theme.type === \"light\" ? VSCODE_FALLBACK_EDITOR_BG.light : VSCODE_FALLBACK_EDITOR_BG.dark;\n theme.fg = fg;\n theme.bg = bg;\n }\n if (!(theme.settings[0] && theme.settings[0].settings && !theme.settings[0].scope)) {\n theme.settings.unshift({\n settings: {\n foreground: theme.fg,\n background: theme.bg\n }\n });\n }\n let replacementCount = 0;\n const replacementMap = /* @__PURE__ */ new Map();\n function getReplacementColor(value) {\n if (replacementMap.has(value))\n return replacementMap.get(value);\n replacementCount += 1;\n const hex = `#${replacementCount.toString(16).padStart(8, \"0\").toLowerCase()}`;\n if (theme.colorReplacements?.[`#${hex}`])\n return getReplacementColor(value);\n replacementMap.set(value, hex);\n return hex;\n }\n theme.settings = theme.settings.map((setting) => {\n const replaceFg = setting.settings?.foreground && !setting.settings.foreground.startsWith(\"#\");\n const replaceBg = setting.settings?.background && !setting.settings.background.startsWith(\"#\");\n if (!replaceFg && !replaceBg)\n return setting;\n const clone = {\n ...setting,\n settings: {\n ...setting.settings\n }\n };\n if (replaceFg) {\n const replacement = getReplacementColor(setting.settings.foreground);\n theme.colorReplacements[replacement] = setting.settings.foreground;\n clone.settings.foreground = replacement;\n }\n if (replaceBg) {\n const replacement = getReplacementColor(setting.settings.background);\n theme.colorReplacements[replacement] = setting.settings.background;\n clone.settings.background = replacement;\n }\n return clone;\n });\n for (const key of Object.keys(theme.colors || {})) {\n if (key === \"editor.foreground\" || key === \"editor.background\" || key.startsWith(\"terminal.ansi\")) {\n if (!theme.colors[key]?.startsWith(\"#\")) {\n const replacement = getReplacementColor(theme.colors[key]);\n theme.colorReplacements[replacement] = theme.colors[key];\n theme.colors[key] = replacement;\n }\n }\n }\n Object.defineProperty(theme, RESOLVED_KEY, {\n enumerable: false,\n writable: false,\n value: true\n });\n return theme;\n}\n\nasync function resolveLangs(langs) {\n return Array.from(new Set((await Promise.all(\n langs.filter((l) => !isSpecialLang(l)).map(async (lang) => await normalizeGetter(lang).then((r) => Array.isArray(r) ? r : [r]))\n )).flat()));\n}\nasync function resolveThemes(themes) {\n const resolved = await Promise.all(\n themes.map(\n async (theme) => isSpecialTheme(theme) ? null : normalizeTheme(await normalizeGetter(theme))\n )\n );\n return resolved.filter((i) => !!i);\n}\n\nlet _emitDeprecation = 3;\nlet _emitError = false;\nfunction enableDeprecationWarnings(emitDeprecation = true, emitError = false) {\n _emitDeprecation = emitDeprecation;\n _emitError = emitError;\n}\nfunction warnDeprecated(message, version = 3) {\n if (!_emitDeprecation)\n return;\n if (typeof _emitDeprecation === \"number\" && version > _emitDeprecation)\n return;\n if (_emitError) {\n throw new Error(`[SHIKI DEPRECATE]: ${message}`);\n } else {\n console.trace(`[SHIKI DEPRECATE]: ${message}`);\n }\n}\n\nclass ShikiError extends Error {\n constructor(message) {\n super(message);\n this.name = \"ShikiError\";\n }\n}\n\nfunction resolveLangAlias(name, alias) {\n if (!alias)\n return name;\n if (alias[name]) {\n const resolved = /* @__PURE__ */ new Set([name]);\n while (alias[name]) {\n name = alias[name];\n if (resolved.has(name))\n throw new ShikiError(`Circular alias \\`${Array.from(resolved).join(\" -> \")} -> ${name}\\``);\n resolved.add(name);\n }\n }\n return name;\n}\n\nclass Registry extends Registry$1 {\n constructor(_resolver, _themes, _langs, _alias = {}) {\n super(_resolver);\n this._resolver = _resolver;\n this._themes = _themes;\n this._langs = _langs;\n this._alias = _alias;\n this._themes.map((t) => this.loadTheme(t));\n this.loadLanguages(this._langs);\n }\n _resolvedThemes = /* @__PURE__ */ new Map();\n _resolvedGrammars = /* @__PURE__ */ new Map();\n _langMap = /* @__PURE__ */ new Map();\n _langGraph = /* @__PURE__ */ new Map();\n _textmateThemeCache = /* @__PURE__ */ new WeakMap();\n _loadedThemesCache = null;\n _loadedLanguagesCache = null;\n getTheme(theme) {\n if (typeof theme === \"string\")\n return this._resolvedThemes.get(theme);\n else\n return this.loadTheme(theme);\n }\n loadTheme(theme) {\n const _theme = normalizeTheme(theme);\n if (_theme.name) {\n this._resolvedThemes.set(_theme.name, _theme);\n this._loadedThemesCache = null;\n }\n return _theme;\n }\n getLoadedThemes() {\n if (!this._loadedThemesCache)\n this._loadedThemesCache = [...this._resolvedThemes.keys()];\n return this._loadedThemesCache;\n }\n // Override and re-implement this method to cache the textmate themes as `TextMateTheme.createFromRawTheme`\n // is expensive. Themes can switch often especially for dual-theme support.\n //\n // The parent class also accepts `colorMap` as the second parameter, but since we don't use that,\n // we omit here so it's easier to cache the themes.\n setTheme(theme) {\n let textmateTheme = this._textmateThemeCache.get(theme);\n if (!textmateTheme) {\n textmateTheme = Theme.createFromRawTheme(theme);\n this._textmateThemeCache.set(theme, textmateTheme);\n }\n this._syncRegistry.setTheme(textmateTheme);\n }\n getGrammar(name) {\n name = resolveLangAlias(name, this._alias);\n return this._resolvedGrammars.get(name);\n }\n loadLanguage(lang) {\n if (this.getGrammar(lang.name))\n return;\n const embeddedLazilyBy = new Set(\n [...this._langMap.values()].filter((i) => i.embeddedLangsLazy?.includes(lang.name))\n );\n this._resolver.addLanguage(lang);\n const grammarConfig = {\n balancedBracketSelectors: lang.balancedBracketSelectors || [\"*\"],\n unbalancedBracketSelectors: lang.unbalancedBracketSelectors || []\n };\n this._syncRegistry._rawGrammars.set(lang.scopeName, lang);\n const g = this.loadGrammarWithConfiguration(lang.scopeName, 1, grammarConfig);\n g.name = lang.name;\n this._resolvedGrammars.set(lang.name, g);\n if (lang.aliases) {\n lang.aliases.forEach((alias) => {\n this._alias[alias] = lang.name;\n });\n }\n this._loadedLanguagesCache = null;\n if (embeddedLazilyBy.size) {\n for (const e of embeddedLazilyBy) {\n this._resolvedGrammars.delete(e.name);\n this._loadedLanguagesCache = null;\n this._syncRegistry?._injectionGrammars?.delete(e.scopeName);\n this._syncRegistry?._grammars?.delete(e.scopeName);\n this.loadLanguage(this._langMap.get(e.name));\n }\n }\n }\n dispose() {\n super.dispose();\n this._resolvedThemes.clear();\n this._resolvedGrammars.clear();\n this._langMap.clear();\n this._langGraph.clear();\n this._loadedThemesCache = null;\n }\n loadLanguages(langs) {\n for (const lang of langs)\n this.resolveEmbeddedLanguages(lang);\n const langsGraphArray = Array.from(this._langGraph.entries());\n const missingLangs = langsGraphArray.filter(([_, lang]) => !lang);\n if (missingLangs.length) {\n const dependents = langsGraphArray.filter(([_, lang]) => {\n if (!lang)\n return false;\n const embedded = lang.embeddedLanguages || lang.embeddedLangs;\n return embedded?.some((l) => missingLangs.map(([name]) => name).includes(l));\n }).filter((lang) => !missingLangs.includes(lang));\n throw new ShikiError(`Missing languages ${missingLangs.map(([name]) => `\\`${name}\\``).join(\", \")}, required by ${dependents.map(([name]) => `\\`${name}\\``).join(\", \")}`);\n }\n for (const [_, lang] of langsGraphArray)\n this._resolver.addLanguage(lang);\n for (const [_, lang] of langsGraphArray)\n this.loadLanguage(lang);\n }\n getLoadedLanguages() {\n if (!this._loadedLanguagesCache) {\n this._loadedLanguagesCache = [\n .../* @__PURE__ */ new Set([...this._resolvedGrammars.keys(), ...Object.keys(this._alias)])\n ];\n }\n return this._loadedLanguagesCache;\n }\n resolveEmbeddedLanguages(lang) {\n this._langMap.set(lang.name, lang);\n this._langGraph.set(lang.name, lang);\n const embedded = lang.embeddedLanguages ?? lang.embeddedLangs;\n if (embedded) {\n for (const embeddedLang of embedded)\n this._langGraph.set(embeddedLang, this._langMap.get(embeddedLang));\n }\n }\n}\n\nclass Resolver {\n _langs = /* @__PURE__ */ new Map();\n _scopeToLang = /* @__PURE__ */ new Map();\n _injections = /* @__PURE__ */ new Map();\n _onigLib;\n constructor(engine, langs) {\n this._onigLib = {\n createOnigScanner: (patterns) => engine.createScanner(patterns),\n createOnigString: (s) => engine.createString(s)\n };\n langs.forEach((i) => this.addLanguage(i));\n }\n get onigLib() {\n return this._onigLib;\n }\n getLangRegistration(langIdOrAlias) {\n return this._langs.get(langIdOrAlias);\n }\n loadGrammar(scopeName) {\n return this._scopeToLang.get(scopeName);\n }\n addLanguage(l) {\n this._langs.set(l.name, l);\n if (l.aliases) {\n l.aliases.forEach((a) => {\n this._langs.set(a, l);\n });\n }\n this._scopeToLang.set(l.scopeName, l);\n if (l.injectTo) {\n l.injectTo.forEach((i) => {\n if (!this._injections.get(i))\n this._injections.set(i, []);\n this._injections.get(i).push(l.scopeName);\n });\n }\n }\n getInjections(scopeName) {\n const scopeParts = scopeName.split(\".\");\n let injections = [];\n for (let i = 1; i <= scopeParts.length; i++) {\n const subScopeName = scopeParts.slice(0, i).join(\".\");\n injections = [...injections, ...this._injections.get(subScopeName) || []];\n }\n return injections;\n }\n}\n\nlet instancesCount = 0;\nfunction createShikiInternalSync(options) {\n instancesCount += 1;\n if (options.warnings !== false && instancesCount >= 10 && instancesCount % 10 === 0)\n console.warn(`[Shiki] ${instancesCount} instances have been created. Shiki is supposed to be used as a singleton, consider refactoring your code to cache your highlighter instance; Or call \\`highlighter.dispose()\\` to release unused instances.`);\n let isDisposed = false;\n if (!options.engine)\n throw new ShikiError(\"`engine` option is required for synchronous mode\");\n const langs = (options.langs || []).flat(1);\n const themes = (options.themes || []).flat(1).map(normalizeTheme);\n const resolver = new Resolver(options.engine, langs);\n const _registry = new Registry(resolver, themes, langs, options.langAlias);\n let _lastTheme;\n function resolveLangAlias$1(name) {\n return resolveLangAlias(name, options.langAlias);\n }\n function getLanguage(name) {\n ensureNotDisposed();\n const _lang = _registry.getGrammar(typeof name === \"string\" ? name : name.name);\n if (!_lang)\n throw new ShikiError(`Language \\`${name}\\` not found, you may need to load it first`);\n return _lang;\n }\n function getTheme(name) {\n if (name === \"none\")\n return { bg: \"\", fg: \"\", name: \"none\", settings: [], type: \"dark\" };\n ensureNotDisposed();\n const _theme = _registry.getTheme(name);\n if (!_theme)\n throw new ShikiError(`Theme \\`${name}\\` not found, you may need to load it first`);\n return _theme;\n }\n function setTheme(name) {\n ensureNotDisposed();\n const theme = getTheme(name);\n if (_lastTheme !== name) {\n _registry.setTheme(theme);\n _lastTheme = name;\n }\n const colorMap = _registry.getColorMap();\n return {\n theme,\n colorMap\n };\n }\n function getLoadedThemes() {\n ensureNotDisposed();\n return _registry.getLoadedThemes();\n }\n function getLoadedLanguages() {\n ensureNotDisposed();\n return _registry.getLoadedLanguages();\n }\n function loadLanguageSync(...langs2) {\n ensureNotDisposed();\n _registry.loadLanguages(langs2.flat(1));\n }\n async function loadLanguage(...langs2) {\n return loadLanguageSync(await resolveLangs(langs2));\n }\n function loadThemeSync(...themes2) {\n ensureNotDisposed();\n for (const theme of themes2.flat(1)) {\n _registry.loadTheme(theme);\n }\n }\n async function loadTheme(...themes2) {\n ensureNotDisposed();\n return loadThemeSync(await resolveThemes(themes2));\n }\n function ensureNotDisposed() {\n if (isDisposed)\n throw new ShikiError(\"Shiki instance has been disposed\");\n }\n function dispose() {\n if (isDisposed)\n return;\n isDisposed = true;\n _registry.dispose();\n instancesCount -= 1;\n }\n return {\n setTheme,\n getTheme,\n getLanguage,\n getLoadedThemes,\n getLoadedLanguages,\n resolveLangAlias: resolveLangAlias$1,\n loadLanguage,\n loadLanguageSync,\n loadTheme,\n loadThemeSync,\n dispose,\n [Symbol.dispose]: dispose\n };\n}\n\nasync function createShikiInternal(options) {\n if (!options.engine) {\n warnDeprecated(\"`engine` option is required. Use `createOnigurumaEngine` or `createJavaScriptRegexEngine` to create an engine.\");\n }\n const [\n themes,\n langs,\n engine\n ] = await Promise.all([\n resolveThemes(options.themes || []),\n resolveLangs(options.langs || []),\n options.engine\n ]);\n return createShikiInternalSync({\n ...options,\n themes,\n langs,\n engine\n });\n}\n\nasync function createHighlighterCore(options) {\n const internal = await createShikiInternal(options);\n return {\n getLastGrammarState: (...args) => getLastGrammarState(internal, ...args),\n codeToTokensBase: (code, options2) => codeToTokensBase(internal, code, options2),\n codeToTokensWithThemes: (code, options2) => codeToTokensWithThemes(internal, code, options2),\n codeToTokens: (code, options2) => codeToTokens(internal, code, options2),\n codeToHast: (code, options2) => codeToHast(internal, code, options2),\n codeToHtml: (code, options2) => codeToHtml(internal, code, options2),\n getBundledLanguages: () => ({}),\n getBundledThemes: () => ({}),\n ...internal,\n getInternalContext: () => internal\n };\n}\nfunction createHighlighterCoreSync(options) {\n const internal = createShikiInternalSync(options);\n return {\n getLastGrammarState: (...args) => getLastGrammarState(internal, ...args),\n codeToTokensBase: (code, options2) => codeToTokensBase(internal, code, options2),\n codeToTokensWithThemes: (code, options2) => codeToTokensWithThemes(internal, code, options2),\n codeToTokens: (code, options2) => codeToTokens(internal, code, options2),\n codeToHast: (code, options2) => codeToHast(internal, code, options2),\n codeToHtml: (code, options2) => codeToHtml(internal, code, options2),\n getBundledLanguages: () => ({}),\n getBundledThemes: () => ({}),\n ...internal,\n getInternalContext: () => internal\n };\n}\nfunction makeSingletonHighlighterCore(createHighlighter) {\n let _shiki;\n async function getSingletonHighlighterCore2(options) {\n if (!_shiki) {\n _shiki = createHighlighter({\n ...options,\n themes: options.themes || [],\n langs: options.langs || []\n });\n return _shiki;\n } else {\n const s = await _shiki;\n await Promise.all([\n s.loadTheme(...options.themes || []),\n s.loadLanguage(...options.langs || [])\n ]);\n return s;\n }\n }\n return getSingletonHighlighterCore2;\n}\nconst getSingletonHighlighterCore = /* @__PURE__ */ makeSingletonHighlighterCore(createHighlighterCore);\n\nfunction createBundledHighlighter(options) {\n const bundledLanguages = options.langs;\n const bundledThemes = options.themes;\n const engine = options.engine;\n async function createHighlighter(options2) {\n function resolveLang(lang) {\n if (typeof lang === \"string\") {\n lang = options2.langAlias?.[lang] || lang;\n if (isSpecialLang(lang))\n return [];\n const bundle = bundledLanguages[lang];\n if (!bundle)\n throw new ShikiError$1(`Language \\`${lang}\\` is not included in this bundle. You may want to load it from external source.`);\n return bundle;\n }\n return lang;\n }\n function resolveTheme(theme) {\n if (isSpecialTheme(theme))\n return \"none\";\n if (typeof theme === \"string\") {\n const bundle = bundledThemes[theme];\n if (!bundle)\n throw new ShikiError$1(`Theme \\`${theme}\\` is not included in this bundle. You may want to load it from external source.`);\n return bundle;\n }\n return theme;\n }\n const _themes = (options2.themes ?? []).map((i) => resolveTheme(i));\n const langs = (options2.langs ?? []).map((i) => resolveLang(i));\n const core = await createHighlighterCore({\n engine: options2.engine ?? engine(),\n ...options2,\n themes: _themes,\n langs\n });\n return {\n ...core,\n loadLanguage(...langs2) {\n return core.loadLanguage(...langs2.map(resolveLang));\n },\n loadTheme(...themes) {\n return core.loadTheme(...themes.map(resolveTheme));\n },\n getBundledLanguages() {\n return bundledLanguages;\n },\n getBundledThemes() {\n return bundledThemes;\n }\n };\n }\n return createHighlighter;\n}\nfunction makeSingletonHighlighter(createHighlighter) {\n let _shiki;\n async function getSingletonHighlighter(options = {}) {\n if (!_shiki) {\n _shiki = createHighlighter({\n ...options,\n themes: [],\n langs: []\n });\n const s = await _shiki;\n await Promise.all([\n s.loadTheme(...options.themes || []),\n s.loadLanguage(...options.langs || [])\n ]);\n return s;\n } else {\n const s = await _shiki;\n await Promise.all([\n s.loadTheme(...options.themes || []),\n s.loadLanguage(...options.langs || [])\n ]);\n return s;\n }\n }\n return getSingletonHighlighter;\n}\nfunction createSingletonShorthands(createHighlighter, config) {\n const getSingletonHighlighter = makeSingletonHighlighter(createHighlighter);\n async function get(code, options) {\n const shiki = await getSingletonHighlighter({\n langs: [options.lang],\n themes: \"theme\" in options ? [options.theme] : Object.values(options.themes)\n });\n const langs = await config?.guessEmbeddedLanguages?.(code, options.lang, shiki);\n if (langs) {\n await shiki.loadLanguage(...langs);\n }\n return shiki;\n }\n return {\n getSingletonHighlighter(options) {\n return getSingletonHighlighter(options);\n },\n async codeToHtml(code, options) {\n const shiki = await get(code, options);\n return shiki.codeToHtml(code, options);\n },\n async codeToHast(code, options) {\n const shiki = await get(code, options);\n return shiki.codeToHast(code, options);\n },\n async codeToTokens(code, options) {\n const shiki = await get(code, options);\n return shiki.codeToTokens(code, options);\n },\n async codeToTokensBase(code, options) {\n const shiki = await get(code, options);\n return shiki.codeToTokensBase(code, options);\n },\n async codeToTokensWithThemes(code, options) {\n const shiki = await get(code, options);\n return shiki.codeToTokensWithThemes(code, options);\n },\n async getLastGrammarState(code, options) {\n const shiki = await getSingletonHighlighter({\n langs: [options.lang],\n themes: [options.theme]\n });\n return shiki.getLastGrammarState(code, options);\n }\n };\n}\nconst createdBundledHighlighter = createBundledHighlighter;\n\nfunction createCssVariablesTheme(options = {}) {\n const {\n name = \"css-variables\",\n variablePrefix = \"--shiki-\",\n fontStyle = true\n } = options;\n const variable = (name2) => {\n if (options.variableDefaults?.[name2])\n return `var(${variablePrefix}${name2}, ${options.variableDefaults[name2]})`;\n return `var(${variablePrefix}${name2})`;\n };\n const theme = {\n name,\n type: \"dark\",\n colors: {\n \"editor.foreground\": variable(\"foreground\"),\n \"editor.background\": variable(\"background\"),\n \"terminal.ansiBlack\": variable(\"ansi-black\"),\n \"terminal.ansiRed\": variable(\"ansi-red\"),\n \"terminal.ansiGreen\": variable(\"ansi-green\"),\n \"terminal.ansiYellow\": variable(\"ansi-yellow\"),\n \"terminal.ansiBlue\": variable(\"ansi-blue\"),\n \"terminal.ansiMagenta\": variable(\"ansi-magenta\"),\n \"terminal.ansiCyan\": variable(\"ansi-cyan\"),\n \"terminal.ansiWhite\": variable(\"ansi-white\"),\n \"terminal.ansiBrightBlack\": variable(\"ansi-bright-black\"),\n \"terminal.ansiBrightRed\": variable(\"ansi-bright-red\"),\n \"terminal.ansiBrightGreen\": variable(\"ansi-bright-green\"),\n \"terminal.ansiBrightYellow\": variable(\"ansi-bright-yellow\"),\n \"terminal.ansiBrightBlue\": variable(\"ansi-bright-blue\"),\n \"terminal.ansiBrightMagenta\": variable(\"ansi-bright-magenta\"),\n \"terminal.ansiBrightCyan\": variable(\"ansi-bright-cyan\"),\n \"terminal.ansiBrightWhite\": variable(\"ansi-bright-white\")\n },\n tokenColors: [\n {\n scope: [\n \"keyword.operator.accessor\",\n \"meta.group.braces.round.function.arguments\",\n \"meta.template.expression\",\n \"markup.fenced_code meta.embedded.block\"\n ],\n settings: {\n foreground: variable(\"foreground\")\n }\n },\n {\n scope: \"emphasis\",\n settings: {\n fontStyle: \"italic\"\n }\n },\n {\n scope: [\"strong\", \"markup.heading.markdown\", \"markup.bold.markdown\"],\n settings: {\n fontStyle: \"bold\"\n }\n },\n {\n scope: [\"markup.italic.markdown\"],\n settings: {\n fontStyle: \"italic\"\n }\n },\n {\n scope: \"meta.link.inline.markdown\",\n settings: {\n fontStyle: \"underline\",\n foreground: variable(\"token-link\")\n }\n },\n {\n scope: [\"string\", \"markup.fenced_code\", \"markup.inline\"],\n settings: {\n foreground: variable(\"token-string\")\n }\n },\n {\n scope: [\"comment\", \"string.quoted.docstring.multi\"],\n settings: {\n foreground: variable(\"token-comment\")\n }\n },\n {\n scope: [\n \"constant.numeric\",\n \"constant.language\",\n \"constant.other.placeholder\",\n \"constant.character.format.placeholder\",\n \"variable.language.this\",\n \"variable.other.object\",\n \"variable.other.class\",\n \"variable.other.constant\",\n \"meta.property-name\",\n \"meta.property-value\",\n \"support\"\n ],\n settings: {\n foreground: variable(\"token-constant\")\n }\n },\n {\n scope: [\n \"keyword\",\n \"storage.modifier\",\n \"storage.type\",\n \"storage.control.clojure\",\n \"entity.name.function.clojure\",\n \"entity.name.tag.yaml\",\n \"support.function.node\",\n \"support.type.property-name.json\",\n \"punctuation.separator.key-value\",\n \"punctuation.definition.template-expression\"\n ],\n settings: {\n foreground: variable(\"token-keyword\")\n }\n },\n {\n scope: \"variable.parameter.function\",\n settings: {\n foreground: variable(\"token-parameter\")\n }\n },\n {\n scope: [\n \"support.function\",\n \"entity.name.type\",\n \"entity.other.inherited-class\",\n \"meta.function-call\",\n \"meta.instance.constructor\",\n \"entity.other.attribute-name\",\n \"entity.name.function\",\n \"constant.keyword.clojure\"\n ],\n settings: {\n foreground: variable(\"token-function\")\n }\n },\n {\n scope: [\n \"entity.name.tag\",\n \"string.quoted\",\n \"string.regexp\",\n \"string.interpolated\",\n \"string.template\",\n \"string.unquoted.plain.out.yaml\",\n \"keyword.other.template\"\n ],\n settings: {\n foreground: variable(\"token-string-expression\")\n }\n },\n {\n scope: [\n \"punctuation.definition.arguments\",\n \"punctuation.definition.dict\",\n \"punctuation.separator\",\n \"meta.function-call.arguments\"\n ],\n settings: {\n foreground: variable(\"token-punctuation\")\n }\n },\n {\n // [Custom] Markdown links\n scope: [\n \"markup.underline.link\",\n \"punctuation.definition.metadata.markdown\"\n ],\n settings: {\n foreground: variable(\"token-link\")\n }\n },\n {\n // [Custom] Markdown list\n scope: [\"beginning.punctuation.definition.list.markdown\"],\n settings: {\n foreground: variable(\"token-string\")\n }\n },\n {\n // [Custom] Markdown punctuation definition brackets\n scope: [\n \"punctuation.definition.string.begin.markdown\",\n \"punctuation.definition.string.end.markdown\",\n \"string.other.link.title.markdown\",\n \"string.other.link.description.markdown\"\n ],\n settings: {\n foreground: variable(\"token-keyword\")\n }\n },\n {\n // [Custom] Diff\n scope: [\n \"markup.inserted\",\n \"meta.diff.header.to-file\",\n \"punctuation.definition.inserted\"\n ],\n settings: {\n foreground: variable(\"token-inserted\")\n }\n },\n {\n scope: [\n \"markup.deleted\",\n \"meta.diff.header.from-file\",\n \"punctuation.definition.deleted\"\n ],\n settings: {\n foreground: variable(\"token-deleted\")\n }\n },\n {\n scope: [\n \"markup.changed\",\n \"punctuation.definition.changed\"\n ],\n settings: {\n foreground: variable(\"token-changed\")\n }\n }\n ]\n };\n if (!fontStyle) {\n theme.tokenColors = theme.tokenColors?.map((tokenColor) => {\n if (tokenColor.settings?.fontStyle)\n delete tokenColor.settings.fontStyle;\n return tokenColor;\n });\n }\n return theme;\n}\n\nexport { addClassToHast, applyColorReplacements, codeToHast, codeToHtml, codeToTokens, codeToTokensBase, codeToTokensWithThemes, createBundledHighlighter, createCssVariablesTheme, createHighlighterCore, createHighlighterCoreSync, createPositionConverter, createShikiInternal, createShikiInternalSync, createSingletonShorthands, createdBundledHighlighter, enableDeprecationWarnings, flatTokenVariants, getSingletonHighlighterCore, getTokenStyleObject, guessEmbeddedLanguages, hastToHtml, isNoneTheme, isPlainLang, isSpecialLang, isSpecialTheme, makeSingletonHighlighter, makeSingletonHighlighterCore, normalizeGetter, normalizeTheme, resolveColorReplacements, splitLines, splitToken, splitTokens, stringifyTokenStyle, toArray, tokenizeAnsiWithTheme, tokenizeWithTheme, tokensToHast, transformerDecorations, warnDeprecated };\n","import { resolveDynamicComponent as _resolveDynamicComponent, openBlock as _openBlock, createBlock as _createBlock } from \"vue\"\n\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n return (_openBlock(), _createBlock(_resolveDynamicComponent($setup.render)))\n}","import script from \"/Users/yishuai/develop/ai/markdown/packages/vue/src/components/CachedCodeRenderer.vue?type=script\";import { render } from \"/Users/yishuai/develop/ai/markdown/packages/vue/src/components/CachedCodeRenderer.vue?type=template\"; script.render = render;script.__file = \"src/components/CachedCodeRenderer.vue\";export default script;","import { toDisplayString as _toDisplayString, createElementVNode as _createElementVNode, createVNode as _createVNode, createCommentVNode as _createCommentVNode, openBlock as _openBlock, createBlock as _createBlock, Fragment as _Fragment, createElementBlock as _createElementBlock } from \"vue\"\n\nconst _hoisted_1 = { class: \"incremark-code\" }\nconst _hoisted_2 = { class: \"code-header\" }\nconst _hoisted_3 = { class: \"language\" }\nconst _hoisted_4 = [\"aria-label\", \"title\"]\nconst _hoisted_5 = { class: \"code-content\" }\nconst _hoisted_6 = { class: \"shiki-wrapper\" }\nconst _hoisted_7 = { class: \"code-fallback\" }\n\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n return (_openBlock(), _createElementBlock(\"div\", _hoisted_1, [\n _createElementVNode(\"div\", _hoisted_2, [\n _createElementVNode(\"span\", _hoisted_3, _toDisplayString($setup.language), 1 /* TEXT */),\n _createElementVNode(\"button\", {\n class: \"code-btn\",\n onClick: $setup.copyCode,\n type: \"button\",\n \"aria-label\": $setup.copied ? $setup.t('code.copied') : $setup.t('code.copy'),\n title: $setup.copied ? 'Copied!' : 'Copy'\n }, [\n _createVNode($setup[\"SvgIcon\"], {\n svg: $setup.copied ? $setup.LucideCopyCheck : $setup.LucideCopy\n }, null, 8 /* PROPS */, [\"svg\"])\n ], 8 /* PROPS */, _hoisted_4)\n ]),\n _createElementVNode(\"div\", _hoisted_5, [\n _createElementVNode(\"div\", _hoisted_6, [\n _createCommentVNode(\" Stream 高亮(只有当存在代码内容且语言加载完成后才渲染) \"),\n ($setup.shouldEnableHighlight && $setup.highlighterInfo && $setup.isLanguageLoaded)\n ? (_openBlock(), _createBlock($setup[\"CachedCodeRenderer\"], {\n key: 0,\n code: $setup.code,\n lang: $setup.language,\n theme: $props.theme,\n highlighter: $setup.highlighterInfo.highlighter\n }, null, 8 /* PROPS */, [\"code\", \"lang\", \"theme\", \"highlighter\"]))\n : (_openBlock(), _createElementBlock(_Fragment, { key: 1 }, [\n _createCommentVNode(\" 无高亮模式(禁用高亮、无代码内容、或语言未加载完成时显示) \"),\n _createElementVNode(\"pre\", _hoisted_7, [\n _createElementVNode(\"code\", null, _toDisplayString($setup.code), 1 /* TEXT */)\n ])\n ], 2112 /* STABLE_FRAGMENT, DEV_ROOT_FRAGMENT */))\n ])\n ])\n ]))\n}","import script from \"/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkCodeDefault.vue?type=script\";import { render } from \"/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkCodeDefault.vue?type=template\"; script.render = render;script.__file = \"src/components/IncremarkCodeDefault.vue\";export default script;","import { createCommentVNode as _createCommentVNode, resolveDynamicComponent as _resolveDynamicComponent, openBlock as _openBlock, createBlock as _createBlock, createVNode as _createVNode, Fragment as _Fragment, createElementBlock as _createElementBlock } from \"vue\"\n\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n return (_openBlock(), _createElementBlock(_Fragment, null, [\n _createCommentVNode(\" 自定义代码块组件 \"),\n ($setup.CustomCodeBlock)\n ? (_openBlock(), _createBlock(_resolveDynamicComponent($setup.CustomCodeBlock), {\n key: 0,\n \"code-str\": $props.node.value,\n lang: $setup.language,\n completed: $props.blockStatus === 'completed',\n takeOver: $props.codeBlockConfigs?.[$setup.language]?.takeOver\n }, null, 8 /* PROPS */, [\"code-str\", \"lang\", \"completed\", \"takeOver\"]))\n : ($setup.isMermaid)\n ? (_openBlock(), _createElementBlock(_Fragment, { key: 1 }, [\n _createCommentVNode(\" Mermaid 图表 \"),\n _createVNode($setup[\"IncremarkCodeMermaid\"], {\n node: $props.node,\n \"mermaid-delay\": $props.mermaidDelay\n }, null, 8 /* PROPS */, [\"node\", \"mermaid-delay\"])\n ], 2112 /* STABLE_FRAGMENT, DEV_ROOT_FRAGMENT */))\n : (_openBlock(), _createElementBlock(_Fragment, { key: 2 }, [\n _createCommentVNode(\" 默认代码块渲染(支持用户自定义,使用 stream 高亮)\"),\n (_openBlock(), _createBlock(_resolveDynamicComponent($props.defaultCodeComponent), {\n node: $props.node,\n theme: $props.theme,\n \"fallback-theme\": $props.fallbackTheme,\n \"disable-highlight\": $props.disableHighlight,\n \"block-status\": $props.blockStatus\n }, null, 8 /* PROPS */, [\"node\", \"theme\", \"fallback-theme\", \"disable-highlight\", \"block-status\"]))\n ], 2112 /* STABLE_FRAGMENT, DEV_ROOT_FRAGMENT */))\n ], 2112 /* STABLE_FRAGMENT, DEV_ROOT_FRAGMENT */))\n}","import script from \"/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkCode.vue?type=script\";import { render } from \"/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkCode.vue?type=template\"; script.render = render;script.__file = \"src/components/IncremarkCode.vue\";export default script;","<script setup lang=\"ts\">\nimport type { List, ListItem, RootContent } from 'mdast'\nimport { computed } from 'vue'\nimport IncremarkInline from './IncremarkInline.vue'\nimport IncremarkRenderer from './IncremarkRenderer.vue'\n\n// 设置组件名称以支持递归引用\ndefineOptions({\n name: 'IncremarkList'\n})\n\nconst props = defineProps<{\n node: List\n}>()\n\nconst tag = computed(() => props.node.ordered ? 'ol' : 'ul')\n\n/**\n * 获取列表项的内联内容(来自第一个 paragraph)\n */\nfunction getItemInlineContent(item: ListItem) {\n const firstChild = item.children[0]\n if (firstChild?.type === 'paragraph') {\n return firstChild.children\n }\n return []\n}\n\n/**\n * 获取列表项的块级子节点(嵌套列表、代码块等)\n * 排除第一个 paragraph,因为它已经被 getItemInlineContent 处理\n */\nfunction getItemBlockChildren(item: ListItem): RootContent[] {\n return item.children.filter((child, index) => {\n // 第一个 paragraph 已经被处理为内联内容\n if (index === 0 && child.type === 'paragraph') {\n return false\n }\n return true\n })\n}\n\n/**\n * 检查列表项是否有块级子节点(嵌套列表等)\n */\nfunction hasBlockChildren(item: ListItem): boolean {\n return getItemBlockChildren(item).length > 0\n}\n</script>\n\n<template>\n <component \n :is=\"tag\" \n class=\"incremark-list\" \n :class=\"{ 'task-list': node.children.some(item => item.checked !== null && item.checked !== undefined) }\"\n :start=\"node.start || undefined\"\n>\n <li\n v-for=\"(item, index) in node.children\"\n :key=\"index\"\n class=\"incremark-list-item\"\n :class=\"{ 'task-item': item.checked !== null && item.checked !== undefined }\"\n >\n <label v-if=\"item.checked !== null && item.checked !== undefined\" class=\"task-label\">\n <input\n type=\"checkbox\"\n :checked=\"item.checked\"\n disabled\n class=\"checkbox\"\n />\n <span class=\"task-content\">\n <IncremarkInline :nodes=\"getItemInlineContent(item)\" />\n </span>\n </label>\n <template v-else>\n <IncremarkInline :nodes=\"getItemInlineContent(item)\" />\n <!-- 递归渲染所有块级内容(嵌套列表、heading、blockquote、code、table 等) -->\n <template v-if=\"hasBlockChildren(item)\">\n <template v-for=\"(child, childIndex) in getItemBlockChildren(item)\" :key=\"childIndex\">\n <IncremarkRenderer :node=\"child\" />\n </template>\n </template>\n </template>\n </li>\n </component>\n</template>\n\n","import { renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, createElementVNode as _createElementVNode, createVNode as _createVNode, createCommentVNode as _createCommentVNode, createBlock as _createBlock, normalizeClass as _normalizeClass, resolveDynamicComponent as _resolveDynamicComponent, withCtx as _withCtx } from \"vue\"\n\nconst _hoisted_1 = {\n key: 0,\n class: \"task-label\"\n}\nconst _hoisted_2 = [\"checked\"]\nconst _hoisted_3 = { class: \"task-content\" }\n\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n return (_openBlock(), _createBlock(_resolveDynamicComponent($setup.tag), {\n class: _normalizeClass([\"incremark-list\", { 'task-list': $props.node.children.some(item => item.checked !== null && item.checked !== undefined) }]),\n start: $props.node.start || undefined\n }, {\n default: _withCtx(() => [\n (_openBlock(true), _createElementBlock(_Fragment, null, _renderList($props.node.children, (item, index) => {\n return (_openBlock(), _createElementBlock(\"li\", {\n key: index,\n class: _normalizeClass([\"incremark-list-item\", { 'task-item': item.checked !== null && item.checked !== undefined }])\n }, [\n (item.checked !== null && item.checked !== undefined)\n ? (_openBlock(), _createElementBlock(\"label\", _hoisted_1, [\n _createElementVNode(\"input\", {\n type: \"checkbox\",\n checked: item.checked,\n disabled: \"\",\n class: \"checkbox\"\n }, null, 8 /* PROPS */, _hoisted_2),\n _createElementVNode(\"span\", _hoisted_3, [\n _createVNode($setup[\"IncremarkInline\"], {\n nodes: $setup.getItemInlineContent(item)\n }, null, 8 /* PROPS */, [\"nodes\"])\n ])\n ]))\n : (_openBlock(), _createElementBlock(_Fragment, { key: 1 }, [\n _createVNode($setup[\"IncremarkInline\"], {\n nodes: $setup.getItemInlineContent(item)\n }, null, 8 /* PROPS */, [\"nodes\"]),\n _createCommentVNode(\" 递归渲染所有块级内容(嵌套列表、heading、blockquote、code、table 等) \"),\n ($setup.hasBlockChildren(item))\n ? (_openBlock(true), _createElementBlock(_Fragment, { key: 0 }, _renderList($setup.getItemBlockChildren(item), (child, childIndex) => {\n return (_openBlock(), _createBlock($setup[\"IncremarkRenderer\"], {\n key: childIndex,\n node: child\n }, null, 8 /* PROPS */, [\"node\"]))\n }), 128 /* KEYED_FRAGMENT */))\n : _createCommentVNode(\"v-if\", true)\n ], 64 /* STABLE_FRAGMENT */))\n ], 2 /* CLASS */))\n }), 128 /* KEYED_FRAGMENT */))\n ]),\n _: 1 /* STABLE */\n }, 8 /* PROPS */, [\"class\", \"start\"]))\n}","import script from \"/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkList.vue?type=script\";import { render } from \"/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkList.vue?type=template\"; script.render = render;script.__file = \"src/components/IncremarkList.vue\";export default script;","<script setup lang=\"ts\">\nimport type { Table, TableCell, PhrasingContent } from 'mdast'\nimport IncremarkInline from './IncremarkInline.vue'\n\ndefineProps<{\n node: Table\n}>()\n\nfunction getCellContent(cell: TableCell): PhrasingContent[] {\n return cell.children as PhrasingContent[]\n}\n</script>\n\n<template>\n <div class=\"incremark-table-wrapper\">\n <table class=\"incremark-table\">\n <thead>\n <tr v-if=\"node.children[0]\">\n <th \n v-for=\"(cell, cellIndex) in node.children[0].children\" \n :key=\"cellIndex\"\n :class=\"`incremark-table-align-${node.align?.[cellIndex] || 'left'}`\"\n >\n <IncremarkInline :nodes=\"getCellContent(cell)\" />\n </th>\n </tr>\n </thead>\n <tbody>\n <tr v-for=\"(row, rowIndex) in node.children.slice(1)\" :key=\"rowIndex\">\n <td \n v-for=\"(cell, cellIndex) in row.children\" \n :key=\"cellIndex\"\n :class=\"`incremark-table-align-${node.align?.[cellIndex] || 'left'}`\"\n >\n <IncremarkInline :nodes=\"getCellContent(cell)\" />\n </td>\n </tr>\n </tbody>\n </table>\n </div>\n</template>\n\n","import { renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, createVNode as _createVNode, normalizeClass as _normalizeClass, createCommentVNode as _createCommentVNode, createElementVNode as _createElementVNode } from \"vue\"\n\nconst _hoisted_1 = { class: \"incremark-table-wrapper\" }\nconst _hoisted_2 = { class: \"incremark-table\" }\nconst _hoisted_3 = { key: 0 }\n\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n return (_openBlock(), _createElementBlock(\"div\", _hoisted_1, [\n _createElementVNode(\"table\", _hoisted_2, [\n _createElementVNode(\"thead\", null, [\n ($props.node.children[0])\n ? (_openBlock(), _createElementBlock(\"tr\", _hoisted_3, [\n (_openBlock(true), _createElementBlock(_Fragment, null, _renderList($props.node.children[0].children, (cell, cellIndex) => {\n return (_openBlock(), _createElementBlock(\"th\", {\n key: cellIndex,\n class: _normalizeClass(`incremark-table-align-${$props.node.align?.[cellIndex] || 'left'}`)\n }, [\n _createVNode($setup[\"IncremarkInline\"], {\n nodes: $setup.getCellContent(cell)\n }, null, 8 /* PROPS */, [\"nodes\"])\n ], 2 /* CLASS */))\n }), 128 /* KEYED_FRAGMENT */))\n ]))\n : _createCommentVNode(\"v-if\", true)\n ]),\n _createElementVNode(\"tbody\", null, [\n (_openBlock(true), _createElementBlock(_Fragment, null, _renderList($props.node.children.slice(1), (row, rowIndex) => {\n return (_openBlock(), _createElementBlock(\"tr\", { key: rowIndex }, [\n (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(row.children, (cell, cellIndex) => {\n return (_openBlock(), _createElementBlock(\"td\", {\n key: cellIndex,\n class: _normalizeClass(`incremark-table-align-${$props.node.align?.[cellIndex] || 'left'}`)\n }, [\n _createVNode($setup[\"IncremarkInline\"], {\n nodes: $setup.getCellContent(cell)\n }, null, 8 /* PROPS */, [\"nodes\"])\n ], 2 /* CLASS */))\n }), 128 /* KEYED_FRAGMENT */))\n ]))\n }), 128 /* KEYED_FRAGMENT */))\n ])\n ])\n ]))\n}","import script from \"/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkTable.vue?type=script\";import { render } from \"/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkTable.vue?type=template\"; script.render = render;script.__file = \"src/components/IncremarkTable.vue\";export default script;","import { renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, createBlock as _createBlock } from \"vue\"\n\nconst _hoisted_1 = { class: \"incremark-blockquote\" }\n\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n return (_openBlock(), _createElementBlock(\"blockquote\", _hoisted_1, [\n (_openBlock(true), _createElementBlock(_Fragment, null, _renderList($props.node.children, (child, index) => {\n return (_openBlock(), _createBlock($setup[\"IncremarkRenderer\"], {\n key: index,\n node: child\n }, null, 8 /* PROPS */, [\"node\"]))\n }), 128 /* KEYED_FRAGMENT */))\n ]))\n}","import script from \"/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkBlockquote.vue?type=script\";import { render } from \"/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkBlockquote.vue?type=template\"; script.render = render;script.__file = \"src/components/IncremarkBlockquote.vue\";export default script;","import { openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nconst _hoisted_1 = { class: \"incremark-hr\" }\n\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n return (_openBlock(), _createElementBlock(\"hr\", _hoisted_1))\n}","import script from \"/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkThematicBreak.vue?type=script\";import { render } from \"/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkThematicBreak.vue?type=template\"; script.render = render;script.__file = \"src/components/IncremarkThematicBreak.vue\";export default script;","<script setup lang=\"ts\">\nimport type { RootContent } from 'mdast'\nimport type { Component } from 'vue'\nimport IncremarkRenderer from './IncremarkRenderer.vue'\n\n/**\n * 容器节点类型定义\n * 根据 directive 解析后的结构\n */\nexport interface ContainerNode {\n type: 'containerDirective' | 'leafDirective' | 'textDirective'\n name: string\n attributes?: Record<string, string>\n children?: RootContent[]\n}\n\nconst props = defineProps<{\n node: ContainerNode\n customContainers?: Record<string, Component>\n}>()\n\n/**\n * 解析 attributes 字符串为对象\n * directive 的 attributes 可能是字符串格式,需要解析\n */\nfunction parseOptions(attributes?: Record<string, string>): Record<string, any> {\n if (!attributes) return {}\n \n const options: Record<string, any> = {}\n for (const [key, value] of Object.entries(attributes)) {\n // 尝试解析 JSON 值\n try {\n options[key] = JSON.parse(value)\n } catch {\n // 如果不是 JSON,直接使用字符串值\n options[key] = value\n }\n }\n return options\n}\n\nconst containerName = props.node.name\nconst options = parseOptions(props.node.attributes)\nconst CustomContainer = props.customContainers?.[containerName]\n\n// 如果没有自定义容器组件,使用默认渲染\nconst hasCustomContainer = !!CustomContainer\n</script>\n\n<template>\n <!-- 如果有自定义容器组件,使用自定义组件 -->\n <component\n v-if=\"hasCustomContainer\"\n :is=\"CustomContainer\"\n :name=\"containerName\"\n :options=\"options\"\n >\n <!-- 将容器内容作为默认 slot 传递 -->\n <template v-if=\"node.children && node.children.length > 0\">\n <template v-for=\"(child, index) in node.children\" :key=\"index\">\n <IncremarkRenderer :node=\"child\" />\n </template>\n </template>\n </component>\n \n <!-- 如果没有自定义容器组件,使用默认渲染 -->\n <div v-else :class=\"['incremark-container', `incremark-container-${containerName}`]\">\n <div v-if=\"node.children && node.children.length > 0\" class=\"incremark-container-content\">\n <template v-for=\"(child, index) in node.children\" :key=\"index\">\n <IncremarkRenderer :node=\"child\" />\n </template>\n </div>\n </div>\n</template>\n\n","import { createCommentVNode as _createCommentVNode, renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, createBlock as _createBlock, resolveDynamicComponent as _resolveDynamicComponent, withCtx as _withCtx, normalizeClass as _normalizeClass, createElementVNode as _createElementVNode } from \"vue\"\n\nconst _hoisted_1 = {\n key: 0,\n class: \"incremark-container-content\"\n}\n\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n return (_openBlock(), _createElementBlock(_Fragment, null, [\n _createCommentVNode(\" 如果有自定义容器组件,使用自定义组件 \"),\n ($setup.hasCustomContainer)\n ? (_openBlock(), _createBlock(_resolveDynamicComponent($setup.CustomContainer), {\n key: 0,\n name: $setup.containerName,\n options: $setup.options\n }, {\n default: _withCtx(() => [\n _createCommentVNode(\" 将容器内容作为默认 slot 传递 \"),\n ($props.node.children && $props.node.children.length > 0)\n ? (_openBlock(true), _createElementBlock(_Fragment, { key: 0 }, _renderList($props.node.children, (child, index) => {\n return (_openBlock(), _createBlock($setup[\"IncremarkRenderer\"], {\n key: index,\n node: child\n }, null, 8 /* PROPS */, [\"node\"]))\n }), 128 /* KEYED_FRAGMENT */))\n : _createCommentVNode(\"v-if\", true)\n ]),\n _: 1 /* STABLE */\n }, 8 /* PROPS */, [\"name\", \"options\"]))\n : (_openBlock(), _createElementBlock(_Fragment, { key: 1 }, [\n _createCommentVNode(\" 如果没有自定义容器组件,使用默认渲染 \"),\n _createElementVNode(\"div\", {\n class: _normalizeClass(['incremark-container', `incremark-container-${$setup.containerName}`])\n }, [\n ($props.node.children && $props.node.children.length > 0)\n ? (_openBlock(), _createElementBlock(\"div\", _hoisted_1, [\n (_openBlock(true), _createElementBlock(_Fragment, null, _renderList($props.node.children, (child, index) => {\n return (_openBlock(), _createBlock($setup[\"IncremarkRenderer\"], {\n key: index,\n node: child\n }, null, 8 /* PROPS */, [\"node\"]))\n }), 128 /* KEYED_FRAGMENT */))\n ]))\n : _createCommentVNode(\"v-if\", true)\n ], 2 /* CLASS */)\n ], 2112 /* STABLE_FRAGMENT, DEV_ROOT_FRAGMENT */))\n ], 2112 /* STABLE_FRAGMENT, DEV_ROOT_FRAGMENT */))\n}","import script from \"/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkContainer.vue?type=script\";import { render } from \"/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkContainer.vue?type=template\"; script.render = render;script.__file = \"src/components/IncremarkContainer.vue\";export default script;","import { toDisplayString as _toDisplayString, createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nconst _hoisted_1 = { class: \"incremark-default\" }\nconst _hoisted_2 = { class: \"type-badge\" }\n\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n return (_openBlock(), _createElementBlock(\"div\", _hoisted_1, [\n _createElementVNode(\"span\", _hoisted_2, _toDisplayString($props.node.type), 1 /* TEXT */),\n _createElementVNode(\"pre\", null, _toDisplayString(JSON.stringify($props.node, null, 2)), 1 /* TEXT */)\n ]))\n}","import script from \"/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkDefault.vue?type=script\";import { render } from \"/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkDefault.vue?type=template\"; script.render = render;script.__file = \"src/components/IncremarkDefault.vue\";export default script;","import { createCommentVNode as _createCommentVNode, toDisplayString as _toDisplayString, createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock, createVNode as _createVNode, Fragment as _Fragment, resolveDynamicComponent as _resolveDynamicComponent, createBlock as _createBlock } from \"vue\"\n\nconst _hoisted_1 = {\n key: 0,\n class: \"incremark-html-code\"\n}\n\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n return (_openBlock(), _createElementBlock(_Fragment, null, [\n _createCommentVNode(\" HTML 节点:渲染为代码块显示源代码 \"),\n ($setup.isHtmlNode($props.node))\n ? (_openBlock(), _createElementBlock(\"pre\", _hoisted_1, [\n _createElementVNode(\"code\", null, _toDisplayString(($props.node as HTML).value), 1 /* TEXT */)\n ]))\n : ($setup.isContainerNode($props.node))\n ? (_openBlock(), _createElementBlock(_Fragment, { key: 1 }, [\n _createCommentVNode(\" 容器节点:使用容器组件,传递 customContainers \"),\n _createVNode($setup[\"IncremarkContainer\"], {\n node: $props.node as ContainerNode,\n \"custom-containers\": $props.customContainers\n }, null, 8 /* PROPS */, [\"node\", \"custom-containers\"])\n ], 2112 /* STABLE_FRAGMENT, DEV_ROOT_FRAGMENT */))\n : (($props.node as RootContent).type === 'code')\n ? (_openBlock(), _createElementBlock(_Fragment, { key: 2 }, [\n _createCommentVNode(\" 代码节点:特殊处理,传递 customCodeBlocks、codeBlockConfigs 和 blockStatus \"),\n _createVNode($setup[\"IncremarkCode\"], {\n node: $props.node as Code,\n \"custom-code-blocks\": $props.customCodeBlocks,\n \"code-block-configs\": $props.codeBlockConfigs,\n \"block-status\": $props.blockStatus,\n \"default-code-component\": $props.components?.['code']\n }, null, 8 /* PROPS */, [\"node\", \"custom-code-blocks\", \"code-block-configs\", \"block-status\", \"default-code-component\"])\n ], 2112 /* STABLE_FRAGMENT, DEV_ROOT_FRAGMENT */))\n : (_openBlock(), _createElementBlock(_Fragment, { key: 3 }, [\n _createCommentVNode(\" 其他节点:使用对应组件 \"),\n (_openBlock(), _createBlock(_resolveDynamicComponent($setup.getComponent(($props.node as RootContent).type)), {\n node: $props.node as RootContent\n }, null, 8 /* PROPS */, [\"node\"]))\n ], 2112 /* STABLE_FRAGMENT, DEV_ROOT_FRAGMENT */))\n ], 2112 /* STABLE_FRAGMENT, DEV_ROOT_FRAGMENT */))\n}","import script from \"/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkRenderer.vue?type=script\";import { render } from \"/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkRenderer.vue?type=template\"; script.render = render;script.__file = \"src/components/IncremarkRenderer.vue\";export default script;","<!--\n/**\n * 脚注列表组件\n *\n * 在文档底部渲染所有脚注定义,按引用出现的顺序排列\n *\n * @component IncremarkFootnotes\n *\n * @remarks\n * 样式定义在 @incremark/theme 中的 footnotes.less\n * footnoteReferenceOrder 自动从 context 获取,无需手动传递\n */\n-->\n<script setup lang=\"ts\">\nimport { computed } from 'vue'\nimport type { FootnoteDefinition, RootContent } from 'mdast'\nimport { useDefinationsContext } from '../composables/useDefinationsContext'\nimport IncremarkRenderer from './IncremarkRenderer.vue'\n\nconst { footnoteDefinitions, footnoteReferenceOrder } = useDefinationsContext()\n\n/**\n * 按引用顺序排列的脚注列表\n * 只显示已有定义的脚注\n */\nconst orderedFootnotes = computed<Array<{ identifier: string; definition: FootnoteDefinition }>>(() => {\n return footnoteReferenceOrder.value\n .map(identifier => ({\n identifier,\n definition: footnoteDefinitions.value[identifier]\n }))\n .filter(item => item.definition !== undefined)\n})\n\n/**\n * 是否有脚注需要显示\n */\nconst hasFootnotes = computed(() => orderedFootnotes.value.length > 0)\n</script>\n\n<template>\n <section v-if=\"hasFootnotes\" class=\"incremark-footnotes\">\n <hr class=\"incremark-footnotes-divider\" />\n <ol class=\"incremark-footnotes-list\">\n <li\n v-for=\"(item, index) in orderedFootnotes\"\n :key=\"item.identifier\"\n :id=\"`fn-${item.identifier}`\"\n class=\"incremark-footnote-item\"\n >\n <div class=\"incremark-footnote-content\">\n <!-- 脚注序号 -->\n <span class=\"incremark-footnote-number\">{{ index + 1 }}.</span>\n \n <!-- 脚注内容 -->\n <div class=\"incremark-footnote-body\">\n <IncremarkRenderer\n v-for=\"(child, childIndex) in item.definition.children\"\n :key=\"childIndex\"\n :node=\"(child as RootContent)\"\n />\n </div>\n </div>\n \n <!-- 返回链接 -->\n <a \n :href=\"`#fnref-${item.identifier}`\" \n class=\"incremark-footnote-backref\"\n aria-label=\"返回引用位置\"\n >\n ↩\n </a>\n </li>\n </ol>\n </section>\n</template>\n\n\n","import { createElementVNode as _createElementVNode, renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, toDisplayString as _toDisplayString, createBlock as _createBlock } from \"vue\"\n\nconst _hoisted_1 = {\n key: 0,\n class: \"incremark-footnotes\"\n}\nconst _hoisted_2 = { class: \"incremark-footnotes-list\" }\nconst _hoisted_3 = [\"id\"]\nconst _hoisted_4 = { class: \"incremark-footnote-content\" }\nconst _hoisted_5 = { class: \"incremark-footnote-number\" }\nconst _hoisted_6 = { class: \"incremark-footnote-body\" }\nconst _hoisted_7 = [\"href\"]\n\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n return ($setup.hasFootnotes)\n ? (_openBlock(), _createElementBlock(\"section\", _hoisted_1, [\n _cache[0] || (_cache[0] = _createElementVNode(\"hr\", { class: \"incremark-footnotes-divider\" }, null, -1 /* CACHED */)),\n _createElementVNode(\"ol\", _hoisted_2, [\n (_openBlock(true), _createElementBlock(_Fragment, null, _renderList($setup.orderedFootnotes, (item, index) => {\n return (_openBlock(), _createElementBlock(\"li\", {\n key: item.identifier,\n id: `fn-${item.identifier}`,\n class: \"incremark-footnote-item\"\n }, [\n _createElementVNode(\"div\", _hoisted_4, [\n _createCommentVNode(\" 脚注序号 \"),\n _createElementVNode(\"span\", _hoisted_5, _toDisplayString(index + 1) + \".\", 1 /* TEXT */),\n _createCommentVNode(\" 脚注内容 \"),\n _createElementVNode(\"div\", _hoisted_6, [\n (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(item.definition.children, (child, childIndex) => {\n return (_openBlock(), _createBlock($setup[\"IncremarkRenderer\"], {\n key: childIndex,\n node: (child as RootContent)\n }, null, 8 /* PROPS */, [\"node\"]))\n }), 128 /* KEYED_FRAGMENT */))\n ])\n ]),\n _createCommentVNode(\" 返回链接 \"),\n _createElementVNode(\"a\", {\n href: `#fnref-${item.identifier}`,\n class: \"incremark-footnote-backref\",\n \"aria-label\": \"返回引用位置\"\n }, \" ↩ \", 8 /* PROPS */, _hoisted_7)\n ], 8 /* PROPS */, _hoisted_3))\n }), 128 /* KEYED_FRAGMENT */))\n ])\n ]))\n : _createCommentVNode(\"v-if\", true)\n}","import script from \"/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkFootnotes.vue?type=script\";import { render } from \"/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkFootnotes.vue?type=template\"; script.render = render;script.__file = \"src/components/IncremarkFootnotes.vue\";export default script;","import { createCommentVNode as _createCommentVNode, renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, createVNode as _createVNode, normalizeClass as _normalizeClass, createBlock as _createBlock } from \"vue\"\n\nconst _hoisted_1 = { class: \"incremark\" }\n\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n return (_openBlock(), _createElementBlock(\"div\", _hoisted_1, [\n _createCommentVNode(\" 主要内容块 \"),\n (_openBlock(true), _createElementBlock(_Fragment, null, _renderList($setup.actualBlocks, (block) => {\n return (_openBlock(), _createElementBlock(_Fragment, null, [\n (block.node.type !== 'definition' && block.node.type !== 'footnoteDefinition')\n ? (_openBlock(), _createElementBlock(\"div\", {\n key: block.id,\n class: _normalizeClass([\n 'incremark-block',\n block.status === 'completed' ? $props.completedClass : $props.pendingClass,\n { 'incremark-show-status': $props.showBlockStatus },\n { 'incremark-last-pending': block.isLastPending }\n ])\n }, [\n _createVNode($setup[\"IncremarkRenderer\"], {\n node: block.node,\n \"block-status\": block.status,\n \"custom-containers\": $props.customContainers,\n \"custom-code-blocks\": $props.customCodeBlocks,\n \"code-block-configs\": $props.codeBlockConfigs,\n components: $props.components\n }, null, 8 /* PROPS */, [\"node\", \"block-status\", \"custom-containers\", \"custom-code-blocks\", \"code-block-configs\", \"components\"])\n ], 2 /* CLASS */))\n : _createCommentVNode(\"v-if\", true)\n ], 64 /* STABLE_FRAGMENT */))\n }), 256 /* UNKEYED_FRAGMENT */)),\n _createCommentVNode(\" 脚注列表(仅在内容完全显示后显示) \"),\n ($setup.actualIsDisplayComplete && $setup.footnoteReferenceOrder.length > 0)\n ? (_openBlock(), _createBlock($setup[\"IncremarkFootnotes\"], { key: 0 }))\n : _createCommentVNode(\"v-if\", true)\n ]))\n}","import script from \"/Users/yishuai/develop/ai/markdown/packages/vue/src/components/Incremark.vue?type=script\";import { render } from \"/Users/yishuai/develop/ai/markdown/packages/vue/src/components/Incremark.vue?type=template\"; script.render = render;script.__file = \"src/components/Incremark.vue\";export default script;","<script setup lang=\"ts\">\n import { computed, watch } from 'vue';\n import { useIncremark } from '../composables';\n import { IncremarkContentProps } from '../types';\n import Incremark from './Incremark.vue';\n\n const props = defineProps<IncremarkContentProps>()\n\n const incremarkOptions = computed(() => ({\n gfm: true,\n htmlTree: true,\n containers: true,\n math: true,\n ...props.incremarkOptions\n }))\n\n const { blocks, append, finalize, render, reset, isDisplayComplete, markdown } = useIncremark(incremarkOptions);\n\n const isStreamMode = computed(() => typeof props.stream === 'function');\n\n async function handleStreamInput() {\n if (!props.stream) return;\n\n try {\n const stream = props.stream();\n\n for await (const chunk of stream) {\n append(chunk);\n } \n\n finalize();\n } catch (error) {\n console.error('Stream error: ', error);\n finalize();\n }\n }\n\n function handleContentInput(newContent?: string, oldContent?: string) {\n if (!newContent) {\n if (oldContent) {\n reset();\n }\n return;\n }\n\n if (newContent?.startsWith(oldContent ?? '')) {\n const delta = newContent.slice((oldContent || '').length)\n append(delta);\n } else {\n render(newContent);\n }\n }\n\n watch(() => props.content, async (newContent, oldContent) => {\n if (isStreamMode.value) {\n await handleStreamInput();\n } else {\n handleContentInput(newContent, oldContent);\n }\n }, { immediate: true });\n\n watch(() => props.isFinished, (newIsFinished) => {\n if (newIsFinished && props.content === markdown.value) {\n finalize();\n }\n }, { immediate: true })\n</script>\n\n<template>\n <Incremark \n :blocks=\"blocks\"\n :pending-class=\"pendingClass\"\n :is-display-complete=\"isDisplayComplete\"\n :show-block-status=\"showBlockStatus\"\n :components=\"components\"\n :custom-containers=\"customContainers\"\n :custom-code-blocks=\"customCodeBlocks\"\n :code-block-configs=\"codeBlockConfigs\"\n />\n</template>","import { openBlock as _openBlock, createBlock as _createBlock } from \"vue\"\n\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n return (_openBlock(), _createBlock($setup[\"Incremark\"], {\n blocks: $setup.blocks,\n \"pending-class\": $props.pendingClass,\n \"is-display-complete\": $setup.isDisplayComplete,\n \"show-block-status\": $props.showBlockStatus,\n components: $props.components,\n \"custom-containers\": $props.customContainers,\n \"custom-code-blocks\": $props.customCodeBlocks,\n \"code-block-configs\": $props.codeBlockConfigs\n }, null, 8 /* PROPS */, [\"blocks\", \"pending-class\", \"is-display-complete\", \"show-block-status\", \"components\", \"custom-containers\", \"custom-code-blocks\", \"code-block-configs\"]))\n}","import script from \"/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkContent.vue?type=script\";import { render } from \"/Users/yishuai/develop/ai/markdown/packages/vue/src/components/IncremarkContent.vue?type=template\"; script.render = render;script.__file = \"src/components/IncremarkContent.vue\";export default script;","<script setup lang=\"ts\">\nimport { ref, watch, onMounted, onUnmounted, nextTick } from 'vue'\n\nconst props = withDefaults(defineProps<{\n /** 是否启用自动滚动 */\n enabled?: boolean\n /** 触发自动滚动的底部阈值(像素) */\n threshold?: number\n /** 滚动行为 */\n behavior?: ScrollBehavior\n}>(), {\n enabled: true,\n threshold: 50,\n behavior: 'instant'\n})\n\nconst containerRef = ref<HTMLDivElement | null>(null)\nconst isUserScrolledUp = ref(false)\n\n// 记录上一次滚动位置,用于判断滚动方向\nlet lastScrollTop = 0\nlet lastScrollHeight = 0\n\n/**\n * 检查是否在底部附近\n */\nfunction isNearBottom(): boolean {\n const container = containerRef.value\n if (!container) return true\n \n const { scrollTop, scrollHeight, clientHeight } = container\n return scrollHeight - scrollTop - clientHeight <= props.threshold\n}\n\n/**\n * 滚动到底部\n */\nfunction scrollToBottom(force = false): void {\n const container = containerRef.value\n if (!container) return\n \n // 如果用户手动向上滚动了,且不是强制滚动,则不自动滚动\n if (isUserScrolledUp.value && !force) return\n \n container.scrollTo({\n top: container.scrollHeight,\n behavior: props.behavior\n })\n}\n\n/**\n * 检查是否有滚动条\n */\nfunction hasScrollbar(): boolean {\n const container = containerRef.value\n if (!container) return false\n return container.scrollHeight > container.clientHeight\n}\n\n/**\n * 处理滚动事件\n */\nfunction handleScroll(): void {\n const container = containerRef.value\n if (!container) return\n \n const { scrollTop, scrollHeight, clientHeight } = container\n \n // 如果没有滚动条,恢复自动滚动\n if (scrollHeight <= clientHeight) {\n isUserScrolledUp.value = false\n lastScrollTop = 0\n lastScrollHeight = scrollHeight\n return\n }\n \n // 检查用户是否滚动到底部附近\n if (isNearBottom()) {\n // 用户滚动到底部,恢复自动滚动\n isUserScrolledUp.value = false\n } else {\n // 判断是否是用户主动向上滚动\n // 条件:scrollTop 减少(向上滚动)且 scrollHeight 没有变化(不是因为内容增加)\n const isScrollingUp = scrollTop < lastScrollTop\n const isContentUnchanged = scrollHeight === lastScrollHeight\n \n if (isScrollingUp && isContentUnchanged) {\n // 用户主动向上滚动,暂停自动滚动\n isUserScrolledUp.value = true\n }\n }\n \n // 更新记录\n lastScrollTop = scrollTop\n lastScrollHeight = scrollHeight\n}\n\n// 监听 slot 内容变化(使用 MutationObserver)\nlet observer: MutationObserver | null = null\n\nonMounted(() => {\n if (!containerRef.value) return\n \n // 初始化滚动位置记录\n lastScrollTop = containerRef.value.scrollTop\n lastScrollHeight = containerRef.value.scrollHeight\n \n observer = new MutationObserver(() => {\n nextTick(() => {\n if (!containerRef.value) return\n \n // 如果没有滚动条,重置状态\n if (!hasScrollbar()) {\n isUserScrolledUp.value = false\n }\n \n // 更新 scrollHeight 记录(内容变化后)\n lastScrollHeight = containerRef.value.scrollHeight\n \n // 自动滚动\n if (props.enabled && !isUserScrolledUp.value) {\n scrollToBottom()\n }\n })\n })\n \n observer.observe(containerRef.value, {\n childList: true,\n subtree: true,\n characterData: true\n })\n})\n\nonUnmounted(() => {\n observer?.disconnect()\n})\n\n// 暴露方法给父组件\ndefineExpose({\n /** 强制滚动到底部 */\n scrollToBottom: () => scrollToBottom(true),\n /** 是否用户手动向上滚动了 */\n isUserScrolledUp: () => isUserScrolledUp.value,\n /** 容器元素引用 */\n container: containerRef\n})\n</script>\n\n<template>\n <div\n ref=\"containerRef\"\n class=\"auto-scroll-container\"\n @scroll=\"handleScroll\"\n >\n <slot />\n </div>\n</template>\n","import { renderSlot as _renderSlot, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n return (_openBlock(), _createElementBlock(\"div\", {\n ref: \"containerRef\",\n class: \"auto-scroll-container\",\n onScroll: $setup.handleScroll\n }, [\n _renderSlot(_ctx.$slots, \"default\")\n ], 544 /* NEED_HYDRATION, NEED_PATCH */))\n}","import script from \"/Users/yishuai/develop/ai/markdown/packages/vue/src/components/AutoScrollContainer.vue?type=script\";import { render } from \"/Users/yishuai/develop/ai/markdown/packages/vue/src/components/AutoScrollContainer.vue?type=template\"; script.render = render;script.__file = \"src/components/AutoScrollContainer.vue\";export default script;","<script setup lang=\"ts\">\nimport { ref, watch } from 'vue'\nimport type { DesignTokens } from '@incremark/theme'\nimport { applyTheme } from '@incremark/theme'\nimport { isServer } from '@incremark/shared'\n\n/**\n * 主题配置,可以是:\n * - 字符串:'default' | 'dark'\n * - 完整主题对象:DesignTokens\n * - 部分主题对象:Partial<DesignTokens>(会合并到默认主题)\n */\nconst props = withDefaults(\n defineProps<{\n theme: 'default' | 'dark' | DesignTokens | Partial<DesignTokens>\n class?: string\n }>(),\n {\n class: ''\n }\n)\n\nconst containerRef = ref<HTMLElement>()\n\nwatch(\n () => props.theme,\n (theme) => {\n if (isServer()) return\n\n if (containerRef.value) {\n applyTheme(containerRef.value, theme)\n }\n },\n { immediate: true }\n)\n</script>\n\n<template>\n <div ref=\"containerRef\" :class=\"props.class\" class=\"incremark-theme-provider\">\n <slot />\n </div>\n</template>\n\n","import { renderSlot as _renderSlot, normalizeClass as _normalizeClass, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n return (_openBlock(), _createElementBlock(\"div\", {\n ref: \"containerRef\",\n class: _normalizeClass([$setup.props.class, \"incremark-theme-provider\"])\n }, [\n _renderSlot(_ctx.$slots, \"default\")\n ], 2 /* CLASS */))\n}","import script from \"/Users/yishuai/develop/ai/markdown/packages/vue/src/ThemeProvider.vue?type=script\";import { render } from \"/Users/yishuai/develop/ai/markdown/packages/vue/src/ThemeProvider.vue?type=template\"; script.render = render;script.__file = \"src/ThemeProvider.vue\";export default script;","<script setup lang=\"ts\">\nimport { provide, ref, watch, type Ref } from 'vue'\nimport type { IncremarkLocale } from '@incremark/shared'\nimport { zhCN } from '@incremark/shared'\nimport { LOCALE_KEY } from '../composables/useLocale'\n\ninterface Props {\n /** locale 对象 */\n locale?: IncremarkLocale\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n locale: () => zhCN\n})\n\n// 提供 locale 给子组件(确保不是 undefined)\nconst localeRef: Ref<IncremarkLocale> = ref(props.locale || zhCN)\nprovide(LOCALE_KEY, localeRef)\n\n// 监听 locale 变化\nwatch(\n () => props.locale,\n (newLocale) => {\n if (newLocale) {\n localeRef.value = newLocale\n }\n },\n { deep: true }\n)\n</script>\n\n<template>\n <slot />\n</template>\n","import { renderSlot as _renderSlot } from \"vue\"\n\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n return _renderSlot(_ctx.$slots, \"default\")\n}","import script from \"/Users/yishuai/develop/ai/markdown/packages/vue/src/components/ConfigProvider.vue?type=script\";import { render } from \"/Users/yishuai/develop/ai/markdown/packages/vue/src/components/ConfigProvider.vue?type=template\"; script.render = render;script.__file = \"src/components/ConfigProvider.vue\";export default script;","// Composables\nexport { useIncremark, useStreamRenderer, useDevTools, useBlockTransformer, useLocale } from './composables'\nexport { useProvideDefinations } from './composables/useProvideDefinations'\nexport { useDefinationsContext } from './composables/useDefinationsContext'\nexport type {\n UseIncremarkOptions,\n TypewriterOptions,\n TypewriterControls,\n UseStreamRendererOptions,\n UseDevToolsOptions,\n UseBlockTransformerOptions,\n UseBlockTransformerReturn\n} from './composables'\n\n// Components\nexport * from './components';\n\nexport { default as ThemeProvider } from './ThemeProvider.vue'\nexport { default as ConfigProvider } from './components/ConfigProvider.vue'\n\n// Re-export core types\nexport type {\n ParsedBlock,\n IncrementalUpdate,\n ParserOptions,\n BlockStatus,\n Root,\n RootContent,\n // Transformer types\n SourceBlock,\n DisplayBlock,\n TransformerPlugin,\n TransformerOptions,\n TransformerState,\n AnimationEffect\n} from '@incremark/core'\n\n// Re-export mdast types\nexport type {\n Root as MdastRoot,\n Parent,\n // Nodes\n Heading,\n Paragraph,\n Code,\n Blockquote,\n List,\n ListItem,\n Table,\n TableCell,\n ThematicBreak,\n // Inline\n Text,\n PhrasingContent,\n InlineCode,\n Link,\n LinkReference,\n Image,\n ImageReference,\n // HTML\n HTML,\n // Definitions\n Definition,\n FootnoteDefinition\n} from 'mdast'\n\n// Re-export transformer utilities and plugins\nexport {\n BlockTransformer,\n createBlockTransformer,\n countChars,\n sliceAst,\n cloneNode,\n codeBlockPlugin,\n mermaidPlugin,\n imagePlugin,\n mathPlugin,\n thematicBreakPlugin,\n defaultPlugins,\n allPlugins,\n createPlugin\n} from '@incremark/core'\n\n// Re-export theme utilities\nexport {\n type DesignTokens,\n defaultTheme,\n darkTheme,\n generateCSSVars,\n mergeTheme,\n applyTheme\n} from '@incremark/theme'\n\n// Re-export i18n utilities\nimport { en as enShared, zhCN as zhCNShared } from '@incremark/shared'\nimport type { IncremarkLocale } from '@incremark/shared'\n\nexport { enShared as en, zhCNShared as zhCN }\nexport type { IncremarkLocale }\n"],"mappings":"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","names":["ref","shallowRef","computed","watch","toValue","ref","ref","blocks","references","seen","toValue","shallowRef","ref","computed","watch","render","computed","onUnmounted","ref","watch","computed","onUnmounted","createBlockTransformer","computed","ref","inject","inject","computed","computed","computed","computed","ref","watch","shallowRef","onUnmounted","IncremarkMath_default","_createCommentVNode","_openBlock","_Fragment","_createElementBlock","_toDisplayString","_createElementVNode","_hoisted_1","render","render","IncremarkHtmlElement_default","_renderList","_Fragment","_openBlock","_createElementBlock","_createCommentVNode","_toDisplayString","_createTextVNode","_createVNode","_createElementVNode","_resolveComponent","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","render","IncremarkInline_default","render","computed","_createVNode","_resolveDynamicComponent","_withCtx","_openBlock","_createBlock","render","render","IncremarkHeading_default","_createVNode","_openBlock","_createElementBlock","_hoisted_1","render","render","IncremarkParagraph_default","computed","computed","ref","onUnmounted","shallowRef","watch","_normalizeClass","_openBlock","_createElementBlock","_hoisted_1","render","render","SvgIcon_default","ref","shallowRef","computed","watch","onUnmounted","_createVNode","_createTextVNode","_createElementVNode","_createCommentVNode","_toDisplayString","_openBlock","_createElementBlock","_Fragment","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","_hoisted_10","_hoisted_12","render","render","IncremarkCodeMermaid_default","computed","ref","watch","LucideCopy","LucideCopyCheck","isClipboardAvailable","shallowRef","shallowRef","ref","watch","onUnmounted","ref","watch","render","onUnmounted","_resolveDynamicComponent","_openBlock","_createBlock","render","render","CachedCodeRenderer_default","ref","computed","watch","isClipboardAvailable","_toDisplayString","_createElementVNode","_createVNode","_createCommentVNode","_openBlock","_createBlock","_Fragment","_createElementBlock","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","render","render","IncremarkCodeDefault_default","computed","_createCommentVNode","_resolveDynamicComponent","_openBlock","_createBlock","_createVNode","_Fragment","_createElementBlock","render","render","IncremarkCode_default","computed","computed","_renderList","_Fragment","_openBlock","_createElementBlock","_createElementVNode","_createVNode","_createCommentVNode","_createBlock","_normalizeClass","_resolveDynamicComponent","_withCtx","_hoisted_1","_hoisted_2","_hoisted_3","render","render","IncremarkList_default","_renderList","_Fragment","_openBlock","_createElementBlock","_createVNode","_normalizeClass","_createCommentVNode","_createElementVNode","_hoisted_1","_hoisted_2","_hoisted_3","render","render","IncremarkTable_default","_renderList","_Fragment","_openBlock","_createElementBlock","_createBlock","_hoisted_1","render","render","IncremarkBlockquote_default","_openBlock","_createElementBlock","_hoisted_1","render","render","IncremarkThematicBreak_default","options","_createCommentVNode","_renderList","_Fragment","_openBlock","_createElementBlock","_createBlock","_resolveDynamicComponent","_withCtx","_normalizeClass","_createElementVNode","_hoisted_1","render","render","IncremarkContainer_default","_toDisplayString","_createElementVNode","_openBlock","_createElementBlock","_hoisted_1","_hoisted_2","render","render","IncremarkDefault_default","IncremarkHeading_default","IncremarkParagraph_default","IncremarkCode_default","IncremarkList_default","IncremarkTable_default","IncremarkBlockquote_default","IncremarkThematicBreak_default","IncremarkMath_default","IncremarkHtmlElement_default","IncremarkContainer_default","computed","IncremarkDefault_default","isHtmlNode","_createCommentVNode","_toDisplayString","_createElementVNode","_openBlock","_createElementBlock","_createVNode","_Fragment","_resolveDynamicComponent","_createBlock","_hoisted_1","render","IncremarkRenderer_default","render","computed","computed","_createElementVNode","_renderList","_Fragment","_openBlock","_createElementBlock","_createCommentVNode","_toDisplayString","_createBlock","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","render","render","IncremarkFootnotes_default","computed","_createCommentVNode","_renderList","_Fragment","_openBlock","_createElementBlock","_createVNode","_normalizeClass","_createBlock","_hoisted_1","render","render","Incremark_default","computed","watch","computed","render","watch","_openBlock","_createBlock","render","render","IncremarkContent_default","ref","onMounted","onUnmounted","_openBlock","_createElementBlock","render","render","AutoScrollContainer_default","ref","watch","_renderSlot","_normalizeClass","_openBlock","_createElementBlock","render","render","ThemeProvider_default","provide","ref","watch","zhCN","ref","zhCN","provide","watch","_renderSlot","render","render","ConfigProvider_default","BlockTransformer","createBlockTransformer","mathPlugin","defaultPlugins","applyTheme"]}
|