@incremark/core 0.1.1 → 0.2.0

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.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/detector/index.ts","../src/parser/IncremarkParser.ts","../src/utils/index.ts","../src/transformer/utils.ts","../src/transformer/BlockTransformer.ts","../src/transformer/plugins.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["/**\n * 块类型检测与边界判断\n *\n * Markdown 块级元素的识别规则\n */\n\nimport type { BlockContext, ContainerConfig, ContainerMatch } from '../types'\n\n// ============ 预编译正则表达式(性能优化) ============\n\nconst RE_FENCE_START = /^(\\s*)((`{3,})|(~{3,}))/\nconst RE_EMPTY_LINE = /^\\s*$/\nconst RE_HEADING = /^#{1,6}\\s/\nconst RE_THEMATIC_BREAK = /^(\\*{3,}|-{3,}|_{3,})\\s*$/\nconst RE_UNORDERED_LIST = /^(\\s*)([-*+])\\s/\nconst RE_ORDERED_LIST = /^(\\s*)(\\d{1,9})[.)]\\s/\nconst RE_BLOCKQUOTE = /^\\s{0,3}>/\nconst RE_HTML_BLOCK_1 = /^\\s{0,3}<(script|pre|style|textarea|!--|!DOCTYPE|\\?|!\\[CDATA\\[)/i\nconst RE_HTML_BLOCK_2 = /^\\s{0,3}<\\/?[a-zA-Z][a-zA-Z0-9-]*(\\s|>|$)/\nconst RE_TABLE_DELIMITER = /^\\|?\\s*:?-{3,}:?\\s*(\\|\\s*:?-{3,}:?\\s*)*\\|?$/\nconst RE_ESCAPE_SPECIAL = /[.*+?^${}()|[\\]\\\\]/g\n\n/** fence 结束模式缓存 */\nconst fenceEndPatternCache = new Map<string, RegExp>()\n\n/** 容器模式缓存 */\nconst containerPatternCache = new Map<string, RegExp>()\n\n// ============ 代码块检测 ============\n\n/**\n * 检测行是否是代码块 fence 开始\n */\nexport function detectFenceStart(line: string): { char: string; length: number } | null {\n const match = line.match(RE_FENCE_START)\n if (match) {\n const fence = match[2]\n const char = fence[0]\n return { char, length: fence.length }\n }\n return null\n}\n\n/**\n * 检测行是否是代码块 fence 结束\n */\nexport function detectFenceEnd(line: string, context: BlockContext): boolean {\n if (!context.inFencedCode || !context.fenceChar || !context.fenceLength) {\n return false\n }\n\n // 使用缓存的正则表达式\n const cacheKey = `${context.fenceChar}-${context.fenceLength}`\n let pattern = fenceEndPatternCache.get(cacheKey)\n if (!pattern) {\n pattern = new RegExp(`^\\\\s{0,3}${context.fenceChar}{${context.fenceLength},}\\\\s*$`)\n fenceEndPatternCache.set(cacheKey, pattern)\n }\n return pattern.test(line)\n}\n\n// ============ 行类型检测 ============\n\n/**\n * 检测是否是空行或仅包含空白字符\n */\nexport function isEmptyLine(line: string): boolean {\n return RE_EMPTY_LINE.test(line)\n}\n\n/**\n * 检测是否是标题行\n */\nexport function isHeading(line: string): boolean {\n return RE_HEADING.test(line)\n}\n\n/**\n * 检测是否是 thematic break(水平线)\n */\nexport function isThematicBreak(line: string): boolean {\n return RE_THEMATIC_BREAK.test(line.trim())\n}\n\n/**\n * 检测是否是列表项开始\n */\nexport function isListItemStart(line: string): { ordered: boolean; indent: number } | null {\n // 无序列表: - * +\n const unordered = line.match(RE_UNORDERED_LIST)\n if (unordered) {\n return { ordered: false, indent: unordered[1].length }\n }\n\n // 有序列表: 1. 2) 等\n const ordered = line.match(RE_ORDERED_LIST)\n if (ordered) {\n return { ordered: true, indent: ordered[1].length }\n }\n\n return null\n}\n\n/**\n * 检测是否是引用块开始\n */\nexport function isBlockquoteStart(line: string): boolean {\n return RE_BLOCKQUOTE.test(line)\n}\n\n/**\n * 检测是否是 HTML 块\n */\nexport function isHtmlBlock(line: string): boolean {\n return RE_HTML_BLOCK_1.test(line) || RE_HTML_BLOCK_2.test(line)\n}\n\n/**\n * 检测表格分隔行\n */\nexport function isTableDelimiter(line: string): boolean {\n return RE_TABLE_DELIMITER.test(line.trim())\n}\n\n// ============ 容器检测 ============\n\n/**\n * 检测容器开始或结束\n *\n * 支持格式:\n * - ::: name 开始\n * - ::: name attr 开始(带属性)\n * - ::: 结束\n * - :::::: name 开始(更长的标记,用于嵌套)\n */\nexport function detectContainer(line: string, config?: ContainerConfig): ContainerMatch | null {\n const marker = config?.marker || ':'\n const minLength = config?.minMarkerLength || 3\n\n // 使用缓存的正则表达式\n const cacheKey = `${marker}-${minLength}`\n let pattern = containerPatternCache.get(cacheKey)\n if (!pattern) {\n const escapedMarker = marker.replace(RE_ESCAPE_SPECIAL, '\\\\$&')\n pattern = new RegExp(\n `^(\\\\s*)(${escapedMarker}{${minLength},})(?:\\\\s+(\\\\w[\\\\w-]*))?(?:\\\\s+(.*))?\\\\s*$`\n )\n containerPatternCache.set(cacheKey, pattern)\n }\n\n const match = line.match(pattern)\n if (!match) {\n return null\n }\n\n const markerLength = match[2].length\n const name = match[3] || ''\n const isEnd = !name && !match[4]\n\n if (!isEnd && config?.allowedNames && config.allowedNames.length > 0) {\n if (!config.allowedNames.includes(name)) {\n return null\n }\n }\n\n return { name, markerLength, isEnd }\n}\n\n/**\n * 检测容器结束\n */\nexport function detectContainerEnd(\n line: string,\n context: BlockContext,\n config?: ContainerConfig\n): boolean {\n if (!context.inContainer || !context.containerMarkerLength) {\n return false\n }\n\n const result = detectContainer(line, config)\n if (!result) {\n return false\n }\n\n return result.isEnd && result.markerLength >= context.containerMarkerLength\n}\n\n// ============ 边界检测 ============\n\n/**\n * 判断两行之间是否构成块边界\n */\nexport function isBlockBoundary(\n prevLine: string,\n currentLine: string,\n context: BlockContext\n): boolean {\n if (context.inFencedCode) {\n return detectFenceEnd(currentLine, context)\n }\n\n if (isEmptyLine(prevLine) && !isEmptyLine(currentLine)) {\n return true\n }\n\n if (isHeading(currentLine) && !isEmptyLine(prevLine)) {\n return true\n }\n\n if (isThematicBreak(currentLine)) {\n return true\n }\n\n if (detectFenceStart(currentLine)) {\n return true\n }\n\n return false\n}\n\n// ============ 上下文管理 ============\n\n/**\n * 创建初始上下文\n */\nexport function createInitialContext(): BlockContext {\n return {\n inFencedCode: false,\n listDepth: 0,\n blockquoteDepth: 0,\n inContainer: false,\n containerDepth: 0\n }\n}\n\n/**\n * 更新上下文(处理一行后)\n */\nexport function updateContext(\n line: string,\n context: BlockContext,\n containerConfig?: ContainerConfig | boolean\n): BlockContext {\n const newContext = { ...context }\n\n const containerCfg =\n containerConfig === true ? {} : containerConfig === false ? undefined : containerConfig\n\n // 代码块优先级最高\n if (context.inFencedCode) {\n if (detectFenceEnd(line, context)) {\n newContext.inFencedCode = false\n newContext.fenceChar = undefined\n newContext.fenceLength = undefined\n }\n return newContext\n }\n\n const fence = detectFenceStart(line)\n if (fence) {\n newContext.inFencedCode = true\n newContext.fenceChar = fence.char\n newContext.fenceLength = fence.length\n return newContext\n }\n\n // 容器处理\n if (containerCfg !== undefined) {\n if (context.inContainer) {\n if (detectContainerEnd(line, context, containerCfg)) {\n newContext.containerDepth = context.containerDepth - 1\n if (newContext.containerDepth === 0) {\n newContext.inContainer = false\n newContext.containerMarkerLength = undefined\n newContext.containerName = undefined\n }\n return newContext\n }\n\n const nested = detectContainer(line, containerCfg)\n if (nested && !nested.isEnd) {\n newContext.containerDepth = context.containerDepth + 1\n return newContext\n }\n } else {\n const container = detectContainer(line, containerCfg)\n if (container && !container.isEnd) {\n newContext.inContainer = true\n newContext.containerMarkerLength = container.markerLength\n newContext.containerName = container.name\n newContext.containerDepth = 1\n return newContext\n }\n }\n }\n\n return newContext\n}\n\n","/**\n * 增量 Markdown 解析器\n *\n * 设计思路:\n * 1. 维护一个文本缓冲区,接收流式输入\n * 2. 识别\"稳定边界\"(如空行、标题等),将已完成的块标记为 completed\n * 3. 对于正在接收的块,每次重新解析,但只解析该块的内容\n * 4. 复杂嵌套节点(如列表、引用)作为整体处理,直到确认完成\n */\n\nimport { fromMarkdown } from 'mdast-util-from-markdown'\nimport { gfmFromMarkdown } from 'mdast-util-gfm'\nimport { gfm } from 'micromark-extension-gfm'\nimport type { Extension as MicromarkExtension } from 'micromark-util-types'\nimport type { Extension as MdastExtension } from 'mdast-util-from-markdown'\n\nimport type {\n Root,\n RootContent,\n ParsedBlock,\n IncrementalUpdate,\n ParserOptions,\n BlockStatus,\n BlockContext,\n ContainerConfig\n} from '../types'\n\nimport {\n createInitialContext,\n updateContext,\n isEmptyLine,\n detectFenceStart,\n isHeading,\n isThematicBreak,\n isBlockquoteStart,\n isListItemStart,\n detectContainer\n} from '../detector'\n\n// ============ 解析器类 ============\n\nexport class IncremarkParser {\n private buffer = ''\n private lines: string[] = []\n /** 行偏移量前缀和:lineOffsets[i] = 第i行起始位置的偏移量 */\n private lineOffsets: number[] = [0]\n private completedBlocks: ParsedBlock[] = []\n private pendingStartLine = 0\n private blockIdCounter = 0\n private context: BlockContext\n private options: ParserOptions\n /** 缓存的容器配置,避免重复计算 */\n private readonly containerConfig: ContainerConfig | undefined\n /** 上次 append 返回的 pending blocks,用于 getAst 复用 */\n private lastPendingBlocks: ParsedBlock[] = []\n\n constructor(options: ParserOptions = {}) {\n this.options = {\n gfm: true,\n ...options\n }\n this.context = createInitialContext()\n // 初始化容器配置(构造时计算一次)\n this.containerConfig = this.computeContainerConfig()\n }\n\n private generateBlockId(): string {\n return `block-${++this.blockIdCounter}`\n }\n\n private computeContainerConfig(): ContainerConfig | undefined {\n const containers = this.options.containers\n if (!containers) return undefined\n return containers === true ? {} : containers\n }\n\n private parse(text: string): Root {\n const extensions: MicromarkExtension[] = []\n const mdastExtensions: MdastExtension[] = []\n\n if (this.options.gfm) {\n extensions.push(gfm())\n mdastExtensions.push(...gfmFromMarkdown())\n }\n\n // 如果用户传入了自定义扩展,添加它们\n if (this.options.extensions) {\n extensions.push(...this.options.extensions)\n }\n if (this.options.mdastExtensions) {\n mdastExtensions.push(...this.options.mdastExtensions)\n }\n\n return fromMarkdown(text, { extensions, mdastExtensions })\n }\n\n /**\n * 增量更新 lines 和 lineOffsets\n * 只处理新增的内容,避免全量 split\n */\n private updateLines(): void {\n const prevLineCount = this.lines.length\n\n if (prevLineCount === 0) {\n // 首次输入,直接 split\n this.lines = this.buffer.split('\\n')\n this.lineOffsets = [0]\n for (let i = 0; i < this.lines.length; i++) {\n this.lineOffsets.push(this.lineOffsets[i] + this.lines[i].length + 1)\n }\n return\n }\n\n // 找到最后一个不完整的行(可能被新 chunk 续上)\n const lastLineStart = this.lineOffsets[prevLineCount - 1]\n const textFromLastLine = this.buffer.slice(lastLineStart)\n\n // 重新 split 最后一行及之后的内容\n const newLines = textFromLastLine.split('\\n')\n\n // 替换最后一行并追加新行\n this.lines.length = prevLineCount - 1\n this.lineOffsets.length = prevLineCount\n\n for (let i = 0; i < newLines.length; i++) {\n this.lines.push(newLines[i])\n const prevOffset = this.lineOffsets[this.lineOffsets.length - 1]\n this.lineOffsets.push(prevOffset + newLines[i].length + 1)\n }\n }\n\n /**\n * O(1) 获取行偏移量\n */\n private getLineOffset(lineIndex: number): number {\n return this.lineOffsets[lineIndex] ?? 0\n }\n\n /**\n * 查找稳定边界\n * 返回稳定边界行号和该行对应的上下文(用于后续更新,避免重复计算)\n */\n private findStableBoundary(): { line: number; contextAtLine: BlockContext } {\n let stableLine = -1\n let stableContext: BlockContext = this.context\n let tempContext = { ...this.context }\n\n for (let i = this.pendingStartLine; i < this.lines.length; i++) {\n const line = this.lines[i]\n const wasInFencedCode = tempContext.inFencedCode\n const wasInContainer = tempContext.inContainer\n const wasContainerDepth = tempContext.containerDepth\n\n tempContext = updateContext(line, tempContext, this.containerConfig)\n\n if (wasInFencedCode && !tempContext.inFencedCode) {\n if (i < this.lines.length - 1) {\n stableLine = i\n stableContext = { ...tempContext }\n }\n continue\n }\n\n if (tempContext.inFencedCode) {\n continue\n }\n\n if (wasInContainer && wasContainerDepth === 1 && !tempContext.inContainer) {\n if (i < this.lines.length - 1) {\n stableLine = i\n stableContext = { ...tempContext }\n }\n continue\n }\n\n if (tempContext.inContainer) {\n continue\n }\n\n const stablePoint = this.checkStability(i)\n if (stablePoint >= 0) {\n stableLine = stablePoint\n stableContext = { ...tempContext }\n }\n }\n\n return { line: stableLine, contextAtLine: stableContext }\n }\n\n private checkStability(lineIndex: number): number {\n // 第一行永远不稳定\n if (lineIndex === 0) {\n return -1\n }\n\n const line = this.lines[lineIndex]\n const prevLine = this.lines[lineIndex - 1]\n\n // 前一行是独立块(标题、分割线),该块已完成\n if (isHeading(prevLine) || isThematicBreak(prevLine)) {\n return lineIndex - 1\n }\n\n // 最后一行不稳定(可能还有更多内容)\n if (lineIndex >= this.lines.length - 1) {\n return -1\n }\n\n // 前一行非空时,如果当前行是新块开始,则前一块已完成\n if (!isEmptyLine(prevLine)) {\n // 新标题开始\n if (isHeading(line)) {\n return lineIndex - 1\n }\n\n // 新代码块开始\n if (detectFenceStart(line)) {\n return lineIndex - 1\n }\n\n // 新引用块开始(排除连续引用)\n if (isBlockquoteStart(line) && !isBlockquoteStart(prevLine)) {\n return lineIndex - 1\n }\n\n // 新列表开始(排除连续列表项)\n if (isListItemStart(line) && !isListItemStart(prevLine)) {\n return lineIndex - 1\n }\n\n // 新容器开始\n if (this.containerConfig !== undefined) {\n const container = detectContainer(line, this.containerConfig)\n if (container && !container.isEnd) {\n const prevContainer = detectContainer(prevLine, this.containerConfig)\n if (!prevContainer || prevContainer.isEnd) {\n return lineIndex - 1\n }\n }\n }\n }\n\n // 空行标志段落结束\n if (isEmptyLine(line) && !isEmptyLine(prevLine)) {\n return lineIndex\n }\n\n return -1\n }\n\n private nodesToBlocks(\n nodes: RootContent[],\n startOffset: number,\n rawText: string,\n status: BlockStatus\n ): ParsedBlock[] {\n const blocks: ParsedBlock[] = []\n let currentOffset = startOffset\n\n for (const node of nodes) {\n const nodeStart = node.position?.start?.offset ?? currentOffset\n const nodeEnd = node.position?.end?.offset ?? currentOffset + 1\n const nodeText = rawText.substring(nodeStart - startOffset, nodeEnd - startOffset)\n\n blocks.push({\n id: this.generateBlockId(),\n status,\n node,\n startOffset: nodeStart,\n endOffset: nodeEnd,\n rawText: nodeText\n })\n\n currentOffset = nodeEnd\n }\n\n return blocks\n }\n\n /**\n * 追加新的 chunk 并返回增量更新\n */\n append(chunk: string): IncrementalUpdate {\n this.buffer += chunk\n this.updateLines()\n\n const { line: stableBoundary, contextAtLine } = this.findStableBoundary()\n\n const update: IncrementalUpdate = {\n completed: [],\n updated: [],\n pending: [],\n ast: { type: 'root', children: [] }\n }\n\n if (stableBoundary >= this.pendingStartLine && stableBoundary >= 0) {\n const stableText = this.lines.slice(this.pendingStartLine, stableBoundary + 1).join('\\n')\n const stableOffset = this.getLineOffset(this.pendingStartLine)\n\n const ast = this.parse(stableText)\n const newBlocks = this.nodesToBlocks(ast.children, stableOffset, stableText, 'completed')\n\n this.completedBlocks.push(...newBlocks)\n update.completed = newBlocks\n\n // 直接使用 findStableBoundary 计算好的上下文,避免重复遍历\n this.context = contextAtLine\n this.pendingStartLine = stableBoundary + 1\n }\n\n if (this.pendingStartLine < this.lines.length) {\n const pendingText = this.lines.slice(this.pendingStartLine).join('\\n')\n\n if (pendingText.trim()) {\n const pendingOffset = this.getLineOffset(this.pendingStartLine)\n const ast = this.parse(pendingText)\n\n update.pending = this.nodesToBlocks(ast.children, pendingOffset, pendingText, 'pending')\n }\n }\n\n // 缓存 pending blocks 供 getAst 使用\n this.lastPendingBlocks = update.pending\n\n update.ast = {\n type: 'root',\n children: [...this.completedBlocks.map((b) => b.node), ...update.pending.map((b) => b.node)]\n }\n\n // 触发状态变化回调\n this.emitChange(update.pending)\n\n return update\n }\n\n /**\n * 触发状态变化回调\n */\n private emitChange(pendingBlocks: ParsedBlock[] = []): void {\n if (this.options.onChange) {\n this.options.onChange({\n completedBlocks: this.completedBlocks,\n pendingBlocks,\n markdown: this.buffer,\n ast: {\n type: 'root',\n children: [\n ...this.completedBlocks.map((b) => b.node),\n ...pendingBlocks.map((b) => b.node)\n ]\n }\n })\n }\n }\n\n /**\n * 标记解析完成,处理剩余内容\n * 也可用于强制中断时(如用户点击停止),将 pending 内容标记为 completed\n */\n finalize(): IncrementalUpdate {\n const update: IncrementalUpdate = {\n completed: [],\n updated: [],\n pending: [],\n ast: { type: 'root', children: [] }\n }\n\n if (this.pendingStartLine < this.lines.length) {\n const remainingText = this.lines.slice(this.pendingStartLine).join('\\n')\n\n if (remainingText.trim()) {\n const remainingOffset = this.getLineOffset(this.pendingStartLine)\n const ast = this.parse(remainingText)\n\n const finalBlocks = this.nodesToBlocks(\n ast.children,\n remainingOffset,\n remainingText,\n 'completed'\n )\n\n this.completedBlocks.push(...finalBlocks)\n update.completed = finalBlocks\n }\n }\n\n // 清空 pending 缓存\n this.lastPendingBlocks = []\n this.pendingStartLine = this.lines.length\n\n update.ast = {\n type: 'root',\n children: this.completedBlocks.map((b) => b.node)\n }\n\n // 触发状态变化回调\n this.emitChange([])\n\n return update\n }\n\n /**\n * 强制中断解析,将所有待处理内容标记为完成\n * 语义上等同于 finalize(),但名称更清晰\n */\n abort(): IncrementalUpdate {\n return this.finalize()\n }\n\n /**\n * 获取当前完整的 AST\n * 复用上次 append 的 pending 结果,避免重复解析\n */\n getAst(): Root {\n return {\n type: 'root',\n children: [\n ...this.completedBlocks.map((b) => b.node),\n ...this.lastPendingBlocks.map((b) => b.node)\n ]\n }\n }\n\n /**\n * 获取所有已完成的块\n */\n getCompletedBlocks(): ParsedBlock[] {\n return [...this.completedBlocks]\n }\n\n /**\n * 获取当前缓冲区内容\n */\n getBuffer(): string {\n return this.buffer\n }\n\n /**\n * 设置状态变化回调(用于 DevTools 等)\n */\n setOnChange(callback: ((state: import('../types').ParserState) => void) | undefined): void {\n this.options.onChange = callback\n }\n\n /**\n * 重置解析器状态\n */\n reset(): void {\n this.buffer = ''\n this.lines = []\n this.lineOffsets = [0]\n this.completedBlocks = []\n this.pendingStartLine = 0\n this.blockIdCounter = 0\n this.context = createInitialContext()\n this.lastPendingBlocks = []\n\n // 触发状态变化回调\n this.emitChange([])\n }\n\n /**\n * 一次性渲染完整 Markdown(reset + append + finalize)\n * @param content 完整的 Markdown 内容\n * @returns 解析结果\n */\n render(content: string): IncrementalUpdate {\n this.reset()\n this.append(content)\n return this.finalize()\n }\n}\n\n/**\n * 创建 Incremark 解析器实例\n */\nexport function createIncremarkParser(options?: ParserOptions): IncremarkParser {\n return new IncremarkParser(options)\n}\n","/**\n * 工具函数\n */\n\n/**\n * 生成唯一 ID\n */\nlet idCounter = 0\nexport function generateId(prefix = 'block'): string {\n return `${prefix}-${++idCounter}`\n}\n\n/**\n * 重置 ID 计数器(用于测试)\n */\nexport function resetIdCounter(): void {\n idCounter = 0\n}\n\n/**\n * 计算行的偏移量\n */\nexport function calculateLineOffset(lines: string[], lineIndex: number): number {\n let offset = 0\n for (let i = 0; i < lineIndex && i < lines.length; i++) {\n offset += lines[i].length + 1 // +1 for newline\n }\n return offset\n}\n\n/**\n * 将文本按行分割\n */\nexport function splitLines(text: string): string[] {\n return text.split('\\n')\n}\n\n/**\n * 合并行为文本\n */\nexport function joinLines(lines: string[], start: number, end: number): string {\n return lines.slice(start, end + 1).join('\\n')\n}\n\n","import type { RootContent, Text } from 'mdast'\nimport type { AstNode } from '../types'\n\n/**\n * 文本块片段(用于渐入动画)\n */\nexport interface TextChunk {\n /** 文本内容 */\n text: string\n /** 创建时间戳 */\n createdAt: number\n}\n\n/**\n * 扩展的文本节点(支持 chunks)\n */\nexport interface TextNodeWithChunks extends Text {\n /** 稳定部分的长度(不需要动画) */\n stableLength?: number\n /** 临时的文本片段,用于渐入动画 */\n chunks?: TextChunk[]\n}\n\n/**\n * 计算 AST 节点的总字符数\n */\nexport function countChars(node: RootContent): number {\n return countCharsInNode(node as AstNode)\n}\n\n/**\n * 计算单个 AST 节点的字符数(内部辅助函数)\n */\nfunction countCharsInNode(n: AstNode): number {\n if (n.value && typeof n.value === 'string') {\n return n.value.length\n }\n if (n.children && Array.isArray(n.children)) {\n let count = 0\n for (const child of n.children) {\n count += countCharsInNode(child)\n }\n return count\n }\n // 其他节点(如 thematicBreak, image)算作 1 个字符\n return 1\n}\n\n/**\n * 累积的 chunks 信息\n */\nexport interface AccumulatedChunks {\n /** 已经稳定显示的字符数(不需要动画) */\n stableChars: number\n /** 累积的 chunk 列表 */\n chunks: TextChunk[]\n}\n\n/** chunk 范围信息 */\ninterface ChunkRange {\n start: number\n end: number\n chunk: TextChunk\n}\n\n/**\n * 截断 AST 节点,只保留前 maxChars 个字符\n * 支持 chunks(用于渐入动画)\n * 支持增量模式:跳过已处理的字符,只处理新增部分\n * \n * @param node 原始节点\n * @param maxChars 最大字符数\n * @param accumulatedChunks 累积的 chunks 信息(用于渐入动画)\n * @param skipChars 跳过前 N 个字符(已处理的部分,用于增量追加)\n * @returns 截断后的节点,如果 maxChars <= 0 返回 null\n */\nexport function sliceAst(\n node: RootContent, \n maxChars: number,\n accumulatedChunks?: AccumulatedChunks,\n skipChars: number = 0\n): RootContent | null {\n if (maxChars <= 0) return null\n if (skipChars >= maxChars) return null\n\n let remaining = maxChars - skipChars // 只处理新增部分\n let charIndex = 0\n \n // 计算 chunks 在文本中的范围\n const chunkRanges: ChunkRange[] = []\n if (accumulatedChunks && accumulatedChunks.chunks.length > 0) {\n let chunkStart = accumulatedChunks.stableChars\n for (const chunk of accumulatedChunks.chunks) {\n chunkRanges.push({\n start: chunkStart,\n end: chunkStart + chunk.text.length,\n chunk\n })\n chunkStart += chunk.text.length\n }\n }\n\n function process(n: AstNode): AstNode | null {\n if (remaining <= 0) return null\n\n // 文本类节点:截断 value,可能添加 chunks\n if (n.value && typeof n.value === 'string') {\n const nodeStart = charIndex\n const nodeEnd = charIndex + n.value.length\n \n // 如果整个节点都在 skipChars 之前,跳过\n if (nodeEnd <= skipChars) {\n charIndex = nodeEnd\n return null\n }\n \n // 如果节点跨越 skipChars,需要从 skipChars 位置开始取\n const skipInNode = Math.max(0, skipChars - nodeStart)\n const take = Math.min(n.value.length - skipInNode, remaining)\n remaining -= take\n if (take === 0) return null\n\n const slicedValue = n.value.slice(skipInNode, skipInNode + take)\n charIndex = nodeEnd\n \n const result: AstNode & { stableLength?: number; chunks?: TextChunk[] } = { \n ...n, \n value: slicedValue \n }\n \n // 检查是否有 chunks 落在这个节点范围内\n if (chunkRanges.length > 0 && accumulatedChunks) {\n const nodeChunks: TextChunk[] = []\n let firstChunkLocalStart = take // 第一个 chunk 在节点中的起始位置\n \n for (const range of chunkRanges) {\n // 计算 chunk 与当前节点的交集(考虑 skipChars)\n const overlapStart = Math.max(range.start, nodeStart + skipInNode)\n const overlapEnd = Math.min(range.end, nodeStart + skipInNode + take)\n \n if (overlapStart < overlapEnd) {\n // 有交集,提取对应的文本(相对于 slicedValue)\n const localStart = overlapStart - (nodeStart + skipInNode)\n const localEnd = overlapEnd - (nodeStart + skipInNode)\n const chunkText = slicedValue.slice(localStart, localEnd)\n \n if (chunkText.length > 0) {\n // 记录第一个 chunk 的起始位置\n if (nodeChunks.length === 0) {\n firstChunkLocalStart = localStart\n }\n nodeChunks.push({\n text: chunkText,\n createdAt: range.chunk.createdAt\n })\n }\n }\n }\n \n if (nodeChunks.length > 0) {\n result.stableLength = firstChunkLocalStart\n result.chunks = nodeChunks\n }\n }\n \n return result\n }\n\n // 容器节点:递归处理 children\n if (n.children && Array.isArray(n.children)) {\n const newChildren: AstNode[] = []\n let childCharIndex = charIndex\n \n for (const child of n.children) {\n if (remaining <= 0) break\n \n // 计算子节点的字符范围\n const childChars = countCharsInNode(child as AstNode)\n const childStart = childCharIndex\n const childEnd = childCharIndex + childChars\n \n // 如果子节点完全在 skipChars 之前,跳过\n if (childEnd <= skipChars) {\n childCharIndex = childEnd\n continue\n }\n \n // 如果子节点跨越 skipChars,需要处理\n // 临时更新 charIndex 以便子节点正确处理 skipChars\n const savedCharIndex = charIndex\n charIndex = childStart\n const processed = process(child)\n charIndex = savedCharIndex\n \n if (processed) {\n newChildren.push(processed)\n }\n \n childCharIndex = childEnd\n }\n \n if (newChildren.length === 0) {\n return null\n }\n return { ...n, children: newChildren }\n }\n\n // 其他节点(如 thematicBreak, image)\n remaining -= 1\n charIndex += 1\n return { ...n }\n }\n\n return process(node as AstNode) as RootContent | null\n}\n\n/**\n * 增量追加:将新增的字符范围追加到现有的 displayNode\n * 这是真正的增量追加实现,只处理新增部分,不重复遍历已稳定的节点\n * \n * @param baseNode 已截断的基础节点(稳定的部分)\n * @param sourceNode 原始完整节点\n * @param startChars 起始字符位置(已处理的字符数)\n * @param endChars 结束字符位置(新的进度)\n * @param accumulatedChunks 累积的 chunks 信息(用于渐入动画)\n * @returns 追加后的完整节点\n */\nexport function appendToAst(\n baseNode: RootContent,\n sourceNode: RootContent,\n startChars: number,\n endChars: number,\n accumulatedChunks?: AccumulatedChunks\n): RootContent {\n // 如果新增字符数为 0,直接返回 baseNode\n if (endChars <= startChars) {\n return baseNode\n }\n\n // 从 sourceNode 中提取新增的字符范围(跳过已处理的部分)\n const newChars = endChars - startChars\n const newPart = sliceAst(sourceNode, endChars, accumulatedChunks, startChars)\n \n // 如果提取失败,返回 baseNode\n if (!newPart) {\n return baseNode\n }\n\n // 将新增部分合并到 baseNode\n return mergeAstNodes(baseNode, newPart)\n}\n\n/**\n * 合并两个 AST 节点\n * 将 newPart 追加到 baseNode 的最后一个可追加节点中\n */\nfunction mergeAstNodes(baseNode: RootContent, newPart: RootContent): RootContent {\n // 如果两个节点类型不同,无法合并,返回 baseNode\n if (baseNode.type !== newPart.type) {\n return baseNode\n }\n\n const base = baseNode as AstNode\n const part = newPart as AstNode\n\n // 如果是文本节点,合并文本和 chunks\n if (base.value && typeof base.value === 'string' && part.value && typeof part.value === 'string') {\n const baseChunks = (base as TextNodeWithChunks).chunks || []\n const partChunks = (part as TextNodeWithChunks).chunks || []\n \n // 合并所有 chunks:累积所有读取的 chunks\n // chunks 数组包含每次读取的新文本片段,它们 join 到一起就是 value\n const mergedChunks = [...baseChunks, ...partChunks]\n \n // 根据设计:value = stableText + chunks[0].text + chunks[1].text + ... + chunks[n].text\n // base.value = baseStableText + baseChunks[0].text + ... + baseChunks[n].text\n // part.value = partStableText + partChunks[0].text + ... + partChunks[m].text\n // 合并后:value = base.value + part.value(完整文本)\n const mergedValue = base.value + part.value\n \n // stableLength 是稳定部分的长度(不需要动画的部分)\n // base 的稳定部分保持不变,base 的 chunks 和 part 的 chunks 都需要动画\n const baseStableLength = (base as TextNodeWithChunks).stableLength ?? 0\n \n // 验证:mergedValue 应该等于 baseStableText + 所有 chunks 的文本\n // baseStableText = base.value.slice(0, baseStableLength)\n // 所有 chunks 的文本 = baseChunks + partChunks 的文本\n const result = {\n ...base,\n value: mergedValue,\n stableLength: mergedChunks.length > 0 ? baseStableLength : undefined,\n chunks: mergedChunks.length > 0 ? mergedChunks : undefined\n } as TextNodeWithChunks\n \n return result as RootContent\n }\n\n // 如果是容器节点,合并 children\n if (base.children && Array.isArray(base.children) && part.children && Array.isArray(part.children)) {\n // 如果 base 的最后一个子节点和 part 的第一个子节点类型相同,尝试合并\n if (base.children.length > 0 && part.children.length > 0) {\n const lastBaseChild = base.children[base.children.length - 1]\n const firstPartChild = part.children[0]\n \n if (lastBaseChild.type === firstPartChild.type) {\n // 尝试合并最后一个和第一个子节点\n const merged = mergeAstNodes(lastBaseChild as RootContent, firstPartChild as RootContent)\n return {\n ...base,\n children: [\n ...base.children.slice(0, -1),\n merged as AstNode,\n ...part.children.slice(1)\n ]\n } as RootContent\n }\n }\n\n // 否则直接追加所有子节点\n return {\n ...base,\n children: [...base.children, ...part.children]\n } as RootContent\n }\n\n // 其他情况,返回 baseNode(无法合并)\n return baseNode\n}\n\n/**\n * 深拷贝 AST 节点\n * 使用递归浅拷贝实现,比 JSON.parse/stringify 更高效\n * 且保持对象结构完整性\n */\nexport function cloneNode<T extends RootContent>(node: T): T {\n // 优先使用 structuredClone(Node 17+ / 现代浏览器)\n if (typeof structuredClone === 'function') {\n return structuredClone(node)\n }\n \n // 回退到递归拷贝\n return deepClone(node) as T\n}\n\n/**\n * 递归深拷贝对象\n */\nfunction deepClone<T>(obj: T): T {\n if (obj === null || typeof obj !== 'object') {\n return obj\n }\n\n if (Array.isArray(obj)) {\n return obj.map(item => deepClone(item)) as T\n }\n\n const cloned = {} as T\n for (const key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\n cloned[key] = deepClone(obj[key])\n }\n }\n return cloned\n}\n","import type { RootContent } from 'mdast'\nimport type { AstNode } from '../types'\nimport type {\n SourceBlock,\n DisplayBlock,\n TransformerOptions,\n TransformerState,\n TransformerPlugin,\n AnimationEffect\n} from './types'\nimport { countChars as defaultCountChars, sliceAst as defaultSliceAst, appendToAst, type TextChunk, type AccumulatedChunks } from './utils'\n\n/**\n * Block Transformer\n *\n * 用于控制 blocks 的逐步显示(打字机效果)\n * 作为解析器和渲染器之间的中间层\n *\n * 特性:\n * - 使用 requestAnimationFrame 实现流畅动画\n * - 支持随机步长,模拟真实打字效果\n * - 支持 typing 动画效果\n * - 页面不可见时自动暂停,节省资源\n * - 插件系统支持自定义节点处理\n *\n * @example\n * ```typescript\n * const transformer = new BlockTransformer({\n * charsPerTick: [1, 3], // 随机 1-3 个字符\n * tickInterval: 30,\n * effect: 'typing',\n * onChange: (displayBlocks) => {\n * // 更新 UI\n * }\n * })\n *\n * // 推入新 blocks\n * transformer.push(blocks)\n *\n * // 获取当前显示状态\n * const displayBlocks = transformer.getDisplayBlocks()\n * ```\n */\nexport class BlockTransformer<T = unknown> {\n private state: TransformerState<T>\n private options: {\n charsPerTick: number | [number, number]\n tickInterval: number\n effect: AnimationEffect\n plugins: TransformerPlugin[]\n onChange: (displayBlocks: DisplayBlock<T>[]) => void\n pauseOnHidden: boolean\n }\n private rafId: number | null = null\n private lastTickTime = 0\n private isRunning = false\n private isPaused = false\n private chunks: TextChunk[] = [] // 累积的 chunks(用于 fade-in 动画)\n private visibilityHandler: (() => void) | null = null\n \n // ============ 性能优化:缓存机制 ============\n /** 缓存的已截断 displayNode(稳定的部分,避免重复遍历) */\n private cachedDisplayNode: RootContent | null = null\n /** 缓存的字符数(避免重复计算) */\n private cachedTotalChars: number | null = null\n /** 当前缓存的进度(对应 cachedDisplayNode) */\n private cachedProgress: number = 0\n\n constructor(options: TransformerOptions = {}) {\n this.options = {\n charsPerTick: options.charsPerTick ?? 1,\n tickInterval: options.tickInterval ?? 20,\n effect: options.effect ?? 'none',\n plugins: options.plugins ?? [],\n onChange: options.onChange ?? (() => {}),\n pauseOnHidden: options.pauseOnHidden ?? true\n }\n\n this.state = {\n completedBlocks: [],\n currentBlock: null,\n currentProgress: 0,\n pendingBlocks: []\n }\n\n // 设置页面可见性监听\n if (this.options.pauseOnHidden && typeof document !== 'undefined') {\n this.setupVisibilityHandler()\n }\n }\n\n /**\n * 推入新的 blocks\n * 会自动过滤已存在的 blocks\n */\n push(blocks: SourceBlock<T>[]): void {\n const existingIds = this.getAllBlockIds()\n\n // 找出新增的 blocks\n const newBlocks = blocks.filter((b) => !existingIds.has(b.id))\n\n if (newBlocks.length > 0) {\n this.state.pendingBlocks.push(...newBlocks)\n this.startIfNeeded()\n }\n\n // 如果当前正在显示的 block 内容更新了(pending block 变化)\n if (this.state.currentBlock) {\n const updated = blocks.find((b) => b.id === this.state.currentBlock!.id)\n if (updated && updated.node !== this.state.currentBlock.node) {\n // 内容更新,清除缓存\n this.clearCache()\n \n const oldTotal = this.cachedTotalChars ?? this.countChars(this.state.currentBlock.node)\n const newTotal = this.countChars(updated.node)\n \n // 如果字符数减少了(AST 结构变化,如 **xxx 变成 **xxx**)\n // 重新计算进度,保持相对位置\n if (newTotal < oldTotal || newTotal < this.state.currentProgress) {\n this.state.currentProgress = Math.min(this.state.currentProgress, newTotal)\n }\n \n // 内容更新,更新引用\n this.state.currentBlock = updated\n // 如果之前暂停了(因为到达末尾),重新开始\n if (!this.rafId && !this.isPaused) {\n if (this.state.currentProgress < newTotal) {\n this.startIfNeeded()\n }\n }\n }\n }\n }\n\n /**\n * 更新指定 block(用于 pending block 内容增加时)\n */\n update(block: SourceBlock<T>): void {\n if (this.state.currentBlock?.id === block.id) {\n const oldTotal = this.cachedTotalChars ?? this.countChars(this.state.currentBlock.node)\n const newTotal = this.countChars(block.node)\n\n this.state.currentBlock = block\n\n // 如果内容增加了且之前暂停了,继续\n if (newTotal > oldTotal && !this.rafId && !this.isPaused && this.state.currentProgress >= oldTotal) {\n // 内容变化,清除缓存\n this.clearCache()\n this.startIfNeeded()\n }\n }\n }\n\n /**\n * 跳过所有动画,直接显示全部内容\n */\n skip(): void {\n this.stop()\n\n const allBlocks = [\n ...this.state.completedBlocks,\n ...(this.state.currentBlock ? [this.state.currentBlock] : []),\n ...this.state.pendingBlocks\n ]\n\n this.state = {\n completedBlocks: allBlocks,\n currentBlock: null,\n currentProgress: 0,\n pendingBlocks: []\n }\n this.chunks = []\n this.clearCache()\n\n this.emit()\n }\n\n /**\n * 重置状态\n */\n reset(): void {\n this.stop()\n this.state = {\n completedBlocks: [],\n currentBlock: null,\n currentProgress: 0,\n pendingBlocks: []\n }\n this.chunks = []\n this.clearCache()\n this.emit()\n }\n\n /**\n * 暂停动画\n */\n pause(): void {\n this.isPaused = true\n this.cancelRaf()\n }\n\n /**\n * 恢复动画\n */\n resume(): void {\n if (this.isPaused) {\n this.isPaused = false\n this.startIfNeeded()\n }\n }\n\n /**\n * 获取用于渲染的 display blocks\n * 优化:使用缓存的 displayNode,避免重复遍历已稳定的节点\n */\n getDisplayBlocks(): DisplayBlock<T>[] {\n const result: DisplayBlock<T>[] = []\n\n // 已完成的 blocks\n for (const block of this.state.completedBlocks) {\n result.push({\n ...block,\n displayNode: block.node,\n progress: 1,\n isDisplayComplete: true\n })\n }\n\n // 当前正在显示的 block\n if (this.state.currentBlock) {\n // 使用缓存的字符数\n const total = this.getTotalChars()\n \n // 如果进度变化了或缓存无效,更新缓存的 displayNode\n if (this.state.currentProgress !== this.cachedProgress || !this.cachedDisplayNode) {\n this.updateCachedDisplayNode()\n }\n\n result.push({\n ...this.state.currentBlock,\n displayNode: this.cachedDisplayNode || { type: 'paragraph', children: [] },\n progress: total > 0 ? this.state.currentProgress / total : 1,\n isDisplayComplete: false\n })\n }\n\n return result\n }\n\n /**\n * 是否正在处理中\n */\n isProcessing(): boolean {\n return this.isRunning || this.state.currentBlock !== null || this.state.pendingBlocks.length > 0\n }\n\n /**\n * 是否已暂停\n */\n isPausedState(): boolean {\n return this.isPaused\n }\n\n /**\n * 获取内部状态(用于调试)\n */\n getState(): Readonly<TransformerState<T>> {\n return { ...this.state }\n }\n\n /**\n * 动态更新配置\n */\n setOptions(options: Partial<Pick<TransformerOptions, 'charsPerTick' | 'tickInterval' | 'effect' | 'pauseOnHidden'>>): void {\n if (options.charsPerTick !== undefined) {\n this.options.charsPerTick = options.charsPerTick\n }\n if (options.tickInterval !== undefined) {\n this.options.tickInterval = options.tickInterval\n }\n if (options.effect !== undefined) {\n this.options.effect = options.effect\n }\n if (options.pauseOnHidden !== undefined) {\n this.options.pauseOnHidden = options.pauseOnHidden\n if (options.pauseOnHidden && typeof document !== 'undefined') {\n this.setupVisibilityHandler()\n } else {\n this.removeVisibilityHandler()\n }\n }\n }\n\n /**\n * 获取当前配置\n */\n getOptions(): { \n charsPerTick: number | [number, number]\n tickInterval: number\n effect: AnimationEffect\n } {\n return {\n charsPerTick: this.options.charsPerTick,\n tickInterval: this.options.tickInterval,\n effect: this.options.effect\n }\n }\n\n /**\n * 获取当前动画效果\n */\n getEffect(): AnimationEffect {\n return this.options.effect\n }\n\n /**\n * 销毁,清理资源\n */\n destroy(): void {\n this.stop()\n this.removeVisibilityHandler()\n }\n\n // ============ 私有方法 ============\n\n private getAllBlockIds(): Set<string> {\n return new Set([\n ...this.state.completedBlocks.map((b) => b.id),\n this.state.currentBlock?.id,\n ...this.state.pendingBlocks.map((b) => b.id)\n ].filter((id): id is string => id !== undefined))\n }\n\n private setupVisibilityHandler(): void {\n if (this.visibilityHandler) return\n\n this.visibilityHandler = () => {\n if (document.hidden) {\n this.pause()\n } else {\n this.resume()\n }\n }\n\n document.addEventListener('visibilitychange', this.visibilityHandler)\n }\n\n private removeVisibilityHandler(): void {\n if (this.visibilityHandler) {\n document.removeEventListener('visibilitychange', this.visibilityHandler)\n this.visibilityHandler = null\n }\n }\n\n private startIfNeeded(): void {\n if (this.rafId || this.isPaused) return\n\n if (!this.state.currentBlock && this.state.pendingBlocks.length > 0) {\n this.state.currentBlock = this.state.pendingBlocks.shift()!\n this.state.currentProgress = 0\n this.clearCache() // 新 block,清除缓存\n }\n\n if (this.state.currentBlock) {\n this.isRunning = true\n this.lastTickTime = 0\n this.scheduleNextFrame()\n }\n }\n\n private scheduleNextFrame(): void {\n this.rafId = requestAnimationFrame((time) => this.animationFrame(time))\n }\n\n private animationFrame(time: number): void {\n this.rafId = null\n\n // 计算是否应该执行 tick\n if (this.lastTickTime === 0) {\n this.lastTickTime = time\n }\n\n const elapsed = time - this.lastTickTime\n\n if (elapsed >= this.options.tickInterval) {\n this.lastTickTime = time\n this.tick()\n }\n\n // 如果还在运行,继续调度\n if (this.isRunning && !this.isPaused) {\n this.scheduleNextFrame()\n }\n }\n\n private tick(): void {\n const block = this.state.currentBlock\n if (!block) {\n this.processNext()\n return\n }\n\n // 使用缓存的字符数,避免重复计算\n const total = this.getTotalChars()\n const step = this.getStep()\n const prevProgress = this.state.currentProgress\n \n this.state.currentProgress = Math.min(prevProgress + step, total)\n\n // 如果是 fade-in 效果,添加新的 chunk\n if (this.options.effect === 'fade-in' && this.state.currentProgress > prevProgress) {\n // 从 block.node 中提取新增的字符\n const newText = this.extractText(block.node, prevProgress, this.state.currentProgress)\n if (newText.length > 0) {\n this.chunks.push({\n text: newText,\n createdAt: Date.now()\n })\n }\n }\n\n this.emit()\n\n if (this.state.currentProgress >= total) {\n // 当前 block 完成,清空 chunks 和缓存\n this.notifyComplete(block.node)\n this.state.completedBlocks.push(block)\n this.state.currentBlock = null\n this.state.currentProgress = 0\n this.chunks = []\n this.clearCache()\n this.processNext()\n }\n }\n\n /**\n * 从 AST 节点中提取指定范围的文本\n */\n private extractText(node: RootContent, start: number, end: number): string {\n let result = ''\n let charIndex = 0\n\n function traverse(n: AstNode): boolean {\n if (charIndex >= end) return false\n\n if (n.value && typeof n.value === 'string') {\n const nodeStart = charIndex\n const nodeEnd = charIndex + n.value.length\n charIndex = nodeEnd\n\n // 计算交集\n const overlapStart = Math.max(start, nodeStart)\n const overlapEnd = Math.min(end, nodeEnd)\n\n if (overlapStart < overlapEnd) {\n result += n.value.slice(overlapStart - nodeStart, overlapEnd - nodeStart)\n }\n return charIndex < end\n }\n\n if (n.children && Array.isArray(n.children)) {\n for (const child of n.children) {\n if (!traverse(child)) return false\n }\n }\n\n return true\n }\n\n traverse(node as AstNode)\n return result\n }\n\n private getStep(): number {\n const { charsPerTick } = this.options\n if (typeof charsPerTick === 'number') {\n return charsPerTick\n }\n // 随机步长\n const [min, max] = charsPerTick\n return Math.floor(Math.random() * (max - min + 1)) + min\n }\n\n private processNext(): void {\n if (this.state.pendingBlocks.length > 0) {\n this.state.currentBlock = this.state.pendingBlocks.shift()!\n this.state.currentProgress = 0\n this.chunks = []\n this.clearCache() // 新 block,清除缓存\n this.emit()\n // 继续运行(rAF 已经在调度中)\n } else {\n this.isRunning = false\n this.cancelRaf()\n this.emit()\n }\n }\n\n private cancelRaf(): void {\n if (this.rafId) {\n cancelAnimationFrame(this.rafId)\n this.rafId = null\n }\n }\n\n private stop(): void {\n this.cancelRaf()\n this.isRunning = false\n this.isPaused = false\n }\n\n private emit(): void {\n this.options.onChange(this.getDisplayBlocks())\n }\n\n // ============ 插件调用 ============\n\n private countChars(node: RootContent): number {\n // 先找匹配的插件\n for (const plugin of this.options.plugins) {\n if (plugin.match?.(node) && plugin.countChars) {\n const result = plugin.countChars(node)\n if (result !== undefined) return result\n }\n }\n // 默认计算\n return defaultCountChars(node)\n }\n\n private sliceNode(node: RootContent, chars: number, accumulatedChunks?: AccumulatedChunks): RootContent | null {\n // 先找匹配的插件\n for (const plugin of this.options.plugins) {\n if (plugin.match?.(node) && plugin.sliceNode) {\n const total = this.countChars(node)\n const result = plugin.sliceNode(node, chars, total)\n if (result !== null) return result\n }\n }\n // 默认截断,传入累积的 chunks\n return defaultSliceAst(node, chars, accumulatedChunks)\n }\n\n private notifyComplete(node: RootContent): void {\n for (const plugin of this.options.plugins) {\n if (plugin.match?.(node) && plugin.onComplete) {\n plugin.onComplete(node)\n }\n }\n }\n\n // ============ 缓存管理方法 ============\n\n /**\n * 更新缓存的 displayNode\n * 使用真正的增量追加模式:只处理新增部分,不重复遍历已稳定的节点\n */\n private updateCachedDisplayNode(): void {\n const block = this.state.currentBlock\n if (!block) {\n this.cachedDisplayNode = null\n this.cachedProgress = 0\n return\n }\n\n const currentProgress = this.state.currentProgress\n\n // 如果进度减少了(内容更新导致),需要重新截断\n if (currentProgress < this.cachedProgress) {\n this.cachedDisplayNode = this.sliceNode(\n block.node,\n currentProgress,\n this.getAccumulatedChunks()\n )\n this.cachedProgress = currentProgress\n return\n }\n\n // 如果进度增加了,使用增量追加模式\n if (currentProgress > this.cachedProgress && this.cachedDisplayNode) {\n // 真正的增量追加:只处理新增部分,不重复遍历已稳定的节点\n this.cachedDisplayNode = appendToAst(\n this.cachedDisplayNode,\n block.node,\n this.cachedProgress,\n currentProgress,\n this.getAccumulatedChunks()\n )\n this.cachedProgress = currentProgress\n } else if (!this.cachedDisplayNode) {\n // 首次截断\n this.cachedDisplayNode = this.sliceNode(\n block.node,\n currentProgress,\n this.getAccumulatedChunks()\n )\n this.cachedProgress = currentProgress\n }\n }\n\n /**\n * 获取总字符数(带缓存)\n */\n private getTotalChars(): number {\n if (this.cachedTotalChars === null && this.state.currentBlock) {\n this.cachedTotalChars = this.countChars(this.state.currentBlock.node)\n }\n return this.cachedTotalChars ?? 0\n }\n\n /**\n * 清除缓存(当 block 切换或内容更新时)\n */\n private clearCache(): void {\n this.cachedDisplayNode = null\n this.cachedTotalChars = null\n this.cachedProgress = 0\n }\n\n /**\n * 获取累积的 chunks(用于 fade-in 效果)\n */\n private getAccumulatedChunks(): AccumulatedChunks | undefined {\n if (this.options.effect === 'fade-in' && this.chunks.length > 0) {\n return { stableChars: 0, chunks: this.chunks }\n }\n return undefined\n }\n}\n\n/**\n * 创建 BlockTransformer 实例的工厂函数\n */\nexport function createBlockTransformer<T = unknown>(\n options?: TransformerOptions\n): BlockTransformer<T> {\n return new BlockTransformer<T>(options)\n}\n\n\n\n","import type { RootContent, Code } from 'mdast'\nimport type { TransformerPlugin } from './types'\n\n/**\n * 代码块插件:整体出现,不逐字符显示\n * \n * 注意:默认不启用,代码块默认参与打字机效果\n * 如需整体显示代码块,可手动添加此插件\n */\nexport const codeBlockPlugin: TransformerPlugin = {\n name: 'code-block',\n match: (node: RootContent) => node.type === 'code',\n countChars: () => 1, // 算作 1 个字符,整体出现\n sliceNode: (node, displayedChars, totalChars) => {\n // 要么全部显示,要么不显示\n return displayedChars >= totalChars ? node : null\n }\n}\n\n/**\n * Mermaid 图表插件:整体出现\n * \n * 注意:默认不启用,mermaid 默认参与打字机效果\n * 如需整体显示 mermaid,可手动添加此插件\n */\nexport const mermaidPlugin: TransformerPlugin = {\n name: 'mermaid',\n match: (node: RootContent) => {\n if (node.type !== 'code') return false\n const codeNode = node as Code\n return codeNode.lang === 'mermaid'\n },\n countChars: () => 1,\n sliceNode: (node, displayedChars) => (displayedChars > 0 ? node : null)\n}\n\n/**\n * 图片插件:立即显示(不参与打字机效果)\n * 图片没有文本内容,应立即显示\n */\nexport const imagePlugin: TransformerPlugin = {\n name: 'image',\n match: (node: RootContent) => node.type === 'image',\n countChars: () => 0 // 0 字符,立即显示\n}\n\n/**\n * 数学公式插件:整体出现\n * \n * 注意:默认不启用,数学公式默认参与打字机效果\n * 如需整体显示公式,可手动添加此插件\n */\nexport const mathPlugin: TransformerPlugin = {\n name: 'math',\n match: (node: RootContent) => {\n const type = node.type as string\n return type === 'math' || type === 'inlineMath'\n },\n countChars: () => 1,\n sliceNode: (node, displayedChars) => (displayedChars > 0 ? node : null)\n}\n\n/**\n * 分割线插件:立即显示\n * 分隔线没有文本内容,应立即显示\n */\nexport const thematicBreakPlugin: TransformerPlugin = {\n name: 'thematic-break',\n match: (node: RootContent) => node.type === 'thematicBreak',\n countChars: () => 0\n}\n\n/**\n * 默认插件集合\n * \n * 只包含确实需要特殊处理的节点:\n * - 图片:无文本内容,立即显示\n * - 分隔线:无文本内容,立即显示\n * \n * 代码块、mermaid、数学公式默认参与打字机效果\n * 如需整体显示,可手动添加对应插件\n */\nexport const defaultPlugins: TransformerPlugin[] = [\n imagePlugin,\n thematicBreakPlugin\n]\n\n/**\n * 完整插件集合(所有特殊节点整体显示)\n * 包含代码块、mermaid、数学公式等的整体显示\n */\nexport const allPlugins: TransformerPlugin[] = [\n mermaidPlugin, // mermaid 优先于普通 code block\n codeBlockPlugin,\n imagePlugin,\n mathPlugin,\n thematicBreakPlugin\n]\n\n/**\n * 创建自定义插件的辅助函数\n */\nexport function createPlugin(\n name: string,\n matcher: (node: RootContent) => boolean,\n options: Partial<Omit<TransformerPlugin, 'name' | 'match'>> = {}\n): TransformerPlugin {\n return {\n name,\n match: matcher,\n ...options\n }\n}\n"]}
1
+ {"version":3,"sources":["../../../node_modules/devlop/lib/default.js","../../../node_modules/micromark-util-normalize-identifier/index.js","../../../node_modules/mdast-util-gfm-footnote/lib/index.js","../src/extensions/html-extension/index.ts","../src/extensions/micromark-reference-extension.ts","../../../node_modules/micromark-factory-space/index.js","../../../node_modules/micromark-core-commonmark/lib/blank-line.js","../../../node_modules/micromark-extension-gfm-footnote/lib/syntax.js","../src/extensions/micromark-gfm-footnote-incremental.ts","../src/detector/index.ts","../src/utils/index.ts","../src/parser/IncremarkParser.ts","../src/transformer/utils.ts","../src/transformer/BlockTransformer.ts","../src/transformer/plugins.ts"],"names":["match","ok","markdownSpace","markdownLineEnding","markdownLineEndingOrSpace","codes","constants"],"mappings":"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","file":"index.js","sourcesContent":["export function deprecate(fn) {\n return fn\n}\n\nexport function equal() {}\n\nexport function ok() {}\n\nexport function unreachable() {}\n","/**\n * Normalize an identifier (as found in references, definitions).\n *\n * Collapses markdown whitespace, trim, and then lower- and uppercase.\n *\n * Some characters are considered “uppercase”, such as U+03F4 (`ϴ`), but if their\n * lowercase counterpart (U+03B8 (`θ`)) is uppercased will result in a different\n * uppercase character (U+0398 (`Θ`)).\n * So, to get a canonical form, we perform both lower- and uppercase.\n *\n * Using uppercase last makes sure keys will never interact with default\n * prototypal values (such as `constructor`): nothing in the prototype of\n * `Object` is uppercase.\n *\n * @param {string} value\n * Identifier to normalize.\n * @returns {string}\n * Normalized identifier.\n */\nexport function normalizeIdentifier(value) {\n return value\n // Collapse markdown whitespace.\n .replace(/[\\t\\n\\r ]+/g, \" \")\n // Trim.\n .replace(/^ | $/g, '')\n // Some characters are considered “uppercase”, but if their lowercase\n // counterpart is uppercased will result in a different uppercase\n // character.\n // Hence, to get that form, we perform both lower- and uppercase.\n // Upper case makes sure keys will not interact with default prototypal\n // methods: no method is uppercase.\n .toLowerCase().toUpperCase();\n}","/**\n * @import {\n * CompileContext,\n * Extension as FromMarkdownExtension,\n * Handle as FromMarkdownHandle\n * } from 'mdast-util-from-markdown'\n * @import {ToMarkdownOptions} from 'mdast-util-gfm-footnote'\n * @import {\n * Handle as ToMarkdownHandle,\n * Map,\n * Options as ToMarkdownExtension\n * } from 'mdast-util-to-markdown'\n * @import {FootnoteDefinition, FootnoteReference} from 'mdast'\n */\n\nimport {ok as assert} from 'devlop'\nimport {normalizeIdentifier} from 'micromark-util-normalize-identifier'\n\nfootnoteReference.peek = footnoteReferencePeek\n\n/**\n * @this {CompileContext}\n * @type {FromMarkdownHandle}\n */\nfunction enterFootnoteCallString() {\n this.buffer()\n}\n\n/**\n * @this {CompileContext}\n * @type {FromMarkdownHandle}\n */\nfunction enterFootnoteCall(token) {\n this.enter({type: 'footnoteReference', identifier: '', label: ''}, token)\n}\n\n/**\n * @this {CompileContext}\n * @type {FromMarkdownHandle}\n */\nfunction enterFootnoteDefinitionLabelString() {\n this.buffer()\n}\n\n/**\n * @this {CompileContext}\n * @type {FromMarkdownHandle}\n */\nfunction enterFootnoteDefinition(token) {\n this.enter(\n {type: 'footnoteDefinition', identifier: '', label: '', children: []},\n token\n )\n}\n\n/**\n * @this {CompileContext}\n * @type {FromMarkdownHandle}\n */\nfunction exitFootnoteCallString(token) {\n const label = this.resume()\n const node = this.stack[this.stack.length - 1]\n assert(node.type === 'footnoteReference')\n node.identifier = normalizeIdentifier(\n this.sliceSerialize(token)\n ).toLowerCase()\n node.label = label\n}\n\n/**\n * @this {CompileContext}\n * @type {FromMarkdownHandle}\n */\nfunction exitFootnoteCall(token) {\n this.exit(token)\n}\n\n/**\n * @this {CompileContext}\n * @type {FromMarkdownHandle}\n */\nfunction exitFootnoteDefinitionLabelString(token) {\n const label = this.resume()\n const node = this.stack[this.stack.length - 1]\n assert(node.type === 'footnoteDefinition')\n node.identifier = normalizeIdentifier(\n this.sliceSerialize(token)\n ).toLowerCase()\n node.label = label\n}\n\n/**\n * @this {CompileContext}\n * @type {FromMarkdownHandle}\n */\nfunction exitFootnoteDefinition(token) {\n this.exit(token)\n}\n\n/** @type {ToMarkdownHandle} */\nfunction footnoteReferencePeek() {\n return '['\n}\n\n/**\n * @type {ToMarkdownHandle}\n * @param {FootnoteReference} node\n */\nfunction footnoteReference(node, _, state, info) {\n const tracker = state.createTracker(info)\n let value = tracker.move('[^')\n const exit = state.enter('footnoteReference')\n const subexit = state.enter('reference')\n value += tracker.move(\n state.safe(state.associationId(node), {after: ']', before: value})\n )\n subexit()\n exit()\n value += tracker.move(']')\n return value\n}\n\n/**\n * Create an extension for `mdast-util-from-markdown` to enable GFM footnotes\n * in markdown.\n *\n * @returns {FromMarkdownExtension}\n * Extension for `mdast-util-from-markdown`.\n */\nexport function gfmFootnoteFromMarkdown() {\n return {\n enter: {\n gfmFootnoteCallString: enterFootnoteCallString,\n gfmFootnoteCall: enterFootnoteCall,\n gfmFootnoteDefinitionLabelString: enterFootnoteDefinitionLabelString,\n gfmFootnoteDefinition: enterFootnoteDefinition\n },\n exit: {\n gfmFootnoteCallString: exitFootnoteCallString,\n gfmFootnoteCall: exitFootnoteCall,\n gfmFootnoteDefinitionLabelString: exitFootnoteDefinitionLabelString,\n gfmFootnoteDefinition: exitFootnoteDefinition\n }\n }\n}\n\n/**\n * Create an extension for `mdast-util-to-markdown` to enable GFM footnotes\n * in markdown.\n *\n * @param {ToMarkdownOptions | null | undefined} [options]\n * Configuration (optional).\n * @returns {ToMarkdownExtension}\n * Extension for `mdast-util-to-markdown`.\n */\nexport function gfmFootnoteToMarkdown(options) {\n // To do: next major: change default.\n let firstLineBlank = false\n\n if (options && options.firstLineBlank) {\n firstLineBlank = true\n }\n\n return {\n handlers: {footnoteDefinition, footnoteReference},\n // This is on by default already.\n unsafe: [{character: '[', inConstruct: ['label', 'phrasing', 'reference']}]\n }\n\n /**\n * @type {ToMarkdownHandle}\n * @param {FootnoteDefinition} node\n */\n function footnoteDefinition(node, _, state, info) {\n const tracker = state.createTracker(info)\n let value = tracker.move('[^')\n const exit = state.enter('footnoteDefinition')\n const subexit = state.enter('label')\n value += tracker.move(\n state.safe(state.associationId(node), {before: value, after: ']'})\n )\n subexit()\n\n value += tracker.move(']:')\n\n if (node.children && node.children.length > 0) {\n tracker.shift(4)\n\n value += tracker.move(\n (firstLineBlank ? '\\n' : ' ') +\n state.indentLines(\n state.containerFlow(node, tracker.current()),\n firstLineBlank ? mapAll : mapExceptFirst\n )\n )\n }\n\n exit()\n\n return value\n }\n}\n\n/** @type {Map} */\nfunction mapExceptFirst(line, index, blank) {\n return index === 0 ? line : mapAll(line, index, blank)\n}\n\n/** @type {Map} */\nfunction mapAll(line, index, blank) {\n return (blank ? '' : ' ') + line\n}\n","import type { Parent, RootContent, Root, PhrasingContent, HTML } from 'mdast'\nimport type { Extension as MdastExtension } from 'mdast-util-from-markdown'\n\ndeclare module 'mdast' {\n interface RootContentMap {\n htmlElement: HtmlElementNode\n }\n interface PhrasingContentMap {\n htmlElement: HtmlElementNode\n }\n}\n\n// ============ 类型定义 ============\n\n/**\n * 自定义 HTML 元素节点类型\n */\nexport interface HtmlElementNode extends Parent {\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\n/**\n * HTML 属性信息\n */\nexport interface HtmlAttrInfo {\n name: string\n value: string\n}\n\n/**\n * 解析后的 HTML 标签信息\n */\nexport interface ParsedHtmlTag {\n tagName: string\n attrs: Record<string, string>\n isClosing: boolean\n isSelfClosing: boolean\n rawHtml: string\n}\n\n/**\n * HTML 树扩展配置\n */\nexport interface HtmlTreeExtensionOptions {\n /**\n * 标签黑名单 - 这些标签会被过滤掉(XSS 防护)\n * 默认包含危险标签:script, style, iframe, object, embed, form, input, button, textarea, select\n */\n tagBlacklist?: string[]\n \n /**\n * 属性黑名单 - 这些属性会被过滤掉(XSS 防护)\n * 默认包含所有 on* 事件属性和 javascript: 协议\n */\n attrBlacklist?: string[]\n \n /**\n * 协议黑名单 - URL 属性中禁止的协议\n * 默认包含 javascript:, vbscript:, data: (允许 data:image/)\n */\n protocolBlacklist?: string[]\n \n /**\n * 是否保留原始 HTML 在 data 中\n * 默认为 true\n */\n preserveRawHtml?: boolean\n \n /**\n * 自定义标签处理器\n * 可以对特定标签进行自定义处理\n */\n tagHandlers?: Record<string, (node: HtmlElementNode) => HtmlElementNode | null>\n}\n\n// ============ 默认配置 ============\n\n/**\n * 危险标签黑名单(XSS 防护)\n */\nexport const DEFAULT_TAG_BLACKLIST = [\n 'script',\n 'style',\n 'iframe',\n 'object',\n 'embed',\n 'form',\n 'input',\n 'button',\n 'textarea',\n 'select',\n 'meta',\n 'link',\n 'base',\n 'frame',\n 'frameset',\n 'applet',\n 'noscript',\n 'template'\n]\n\n/**\n * 危险属性黑名单(XSS 防护)\n * 包含所有 on* 事件属性\n */\nexport const DEFAULT_ATTR_BLACKLIST = [\n // 事件属性通过正则匹配\n 'formaction',\n 'xlink:href',\n 'xmlns',\n 'srcdoc'\n]\n\n/**\n * 危险协议黑名单\n */\nexport const DEFAULT_PROTOCOL_BLACKLIST = [\n 'javascript:',\n 'vbscript:',\n 'data:' // 注意:data:image/ 会被特殊处理允许\n]\n\n/**\n * URL 类属性列表(需要检查协议)\n */\nconst URL_ATTRS = ['href', 'src', 'action', 'formaction', 'poster', 'background']\n\n// ============ HTML 解析工具 ============\n\n/**\n * HTML 内容类型\n */\nexport type HtmlContentType = 'opening' | 'closing' | 'self-closing' | 'fragment' | 'unknown'\n\n/**\n * 自闭合标签列表\n */\nconst VOID_ELEMENTS = ['br', 'hr', 'img', 'input', 'meta', 'link', 'area', 'base', 'col', 'embed', 'source', 'track', 'wbr']\n\n/**\n * 判断 HTML 内容的类型\n * - opening: 单个开标签,如 <span class=\"foo\">\n * - closing: 单个闭标签,如 </span>\n * - self-closing: 自闭合标签,如 <br /> 或 <img src=\"...\">\n * - fragment: 完整的 HTML 片段,包含多个标签\n * - unknown: 无法识别\n */\nexport function detectHtmlContentType(html: string): HtmlContentType {\n const trimmed = html.trim()\n \n // 空内容\n if (!trimmed) return 'unknown'\n \n // 不是以 < 开头\n if (!trimmed.startsWith('<')) return 'unknown'\n \n // 检查是否是单个闭标签: </tagName>\n const closingMatch = trimmed.match(/^<\\/([a-zA-Z][a-zA-Z0-9-]*)\\s*>$/)\n if (closingMatch) {\n return 'closing'\n }\n \n // 检查是否是单个开标签或自闭合标签\n // 单个标签不应该包含其他 < 字符(除了在属性值中)\n // 使用更精确的匹配:从开头到第一个 > 之间不应该有未转义的 <\n const singleTagMatch = trimmed.match(/^<([a-zA-Z][a-zA-Z0-9-]*)(\\s[^]*?)?(\\/?)>$/)\n if (singleTagMatch) {\n const [fullMatch, tagName, attrsString, selfClosingSlash] = singleTagMatch\n \n // 检查属性字符串中是否有未闭合的 < \n // 如果有,说明这可能是一个片段而不是单个标签\n if (attrsString) {\n // 统计属性字符串中的 < 数量(不在引号内的)\n let inQuote = ''\n let hasUnquotedBracket = false\n for (let i = 0; i < attrsString.length; i++) {\n const char = attrsString[i]\n if (inQuote) {\n if (char === inQuote) inQuote = ''\n } else {\n if (char === '\"' || char === \"'\") inQuote = char\n else if (char === '<') {\n hasUnquotedBracket = true\n break\n }\n }\n }\n if (hasUnquotedBracket) {\n return 'fragment'\n }\n }\n \n // 判断是否是自闭合\n const isSelfClosing = selfClosingSlash === '/' || VOID_ELEMENTS.includes(tagName.toLowerCase())\n return isSelfClosing ? 'self-closing' : 'opening'\n }\n \n // 检查是否包含多个标签(片段)\n // 统计 < 的数量\n let bracketCount = 0\n for (const char of trimmed) {\n if (char === '<') bracketCount++\n }\n if (bracketCount > 1) {\n return 'fragment'\n }\n \n return 'unknown'\n}\n\n/**\n * 解析单个 HTML 标签(开标签、闭标签或自闭合标签)\n * 只处理单个标签,不处理完整的 HTML 片段\n */\nexport function parseHtmlTag(html: string): ParsedHtmlTag | null {\n const trimmed = html.trim()\n const contentType = detectHtmlContentType(trimmed)\n \n // 只处理单个标签\n if (contentType !== 'opening' && contentType !== 'closing' && contentType !== 'self-closing') {\n return null\n }\n \n // 闭标签\n if (contentType === 'closing') {\n const match = trimmed.match(/^<\\/([a-zA-Z][a-zA-Z0-9-]*)\\s*>$/)\n if (!match) return null\n return {\n tagName: match[1].toLowerCase(),\n attrs: {},\n isClosing: true,\n isSelfClosing: false,\n rawHtml: html\n }\n }\n \n // 开标签或自闭合标签\n const match = trimmed.match(/^<([a-zA-Z][a-zA-Z0-9-]*)(\\s[^]*?)?(\\/?)>$/)\n if (!match) return null\n \n const [, tagName, attrsString, selfClosingSlash] = match\n const isSelfClosing = selfClosingSlash === '/' || VOID_ELEMENTS.includes(tagName.toLowerCase())\n \n // 解析属性\n const attrs: Record<string, string> = {}\n if (attrsString) {\n // 匹配属性:name=\"value\", name='value', name=value, name\n const attrRegex = /([a-zA-Z_:][-a-zA-Z0-9_:.]*)\\s*(?:=\\s*(?:\"([^\"]*)\"|'([^']*)'|([^\\s\"'=<>`]+)))?/g\n let attrMatch\n while ((attrMatch = attrRegex.exec(attrsString)) !== null) {\n const [, name, doubleQuoted, singleQuoted, unquoted] = attrMatch\n const value = doubleQuoted ?? singleQuoted ?? unquoted ?? ''\n attrs[name.toLowerCase()] = decodeHtmlEntities(value)\n }\n }\n \n return {\n tagName: tagName.toLowerCase(),\n attrs,\n isClosing: false,\n isSelfClosing,\n rawHtml: html\n }\n}\n\n/**\n * 解码 HTML 实体\n */\nfunction decodeHtmlEntities(text: string): string {\n const entities: Record<string, string> = {\n '&amp;': '&',\n '&lt;': '<',\n '&gt;': '>',\n '&quot;': '\"',\n '&#39;': \"'\",\n '&apos;': \"'\",\n '&nbsp;': ' '\n }\n \n return text.replace(/&(?:#(\\d+)|#x([a-fA-F0-9]+)|([a-zA-Z]+));/g, (match, dec, hex, name) => {\n if (dec) return String.fromCharCode(parseInt(dec, 10))\n if (hex) return String.fromCharCode(parseInt(hex, 16))\n return entities[`&${name};`] || match\n })\n}\n\n/**\n * 内部函数:直接解析单个 HTML 标签(不进行类型检测)\n * 用于 parseHtmlFragment 中已经通过正则分离出的标签\n */\nfunction parseTagDirect(tag: string): ParsedHtmlTag | null {\n const trimmed = tag.trim()\n \n // 闭标签\n const closingMatch = trimmed.match(/^<\\/([a-zA-Z][a-zA-Z0-9-]*)\\s*>$/)\n if (closingMatch) {\n return {\n tagName: closingMatch[1].toLowerCase(),\n attrs: {},\n isClosing: true,\n isSelfClosing: false,\n rawHtml: tag\n }\n }\n \n // 开标签或自闭合标签(允许多行属性)\n const openMatch = trimmed.match(/^<([a-zA-Z][a-zA-Z0-9-]*)([\\s\\S]*?)(\\/?)>$/)\n if (!openMatch) return null\n \n const [, tagName, attrsString, selfClosingSlash] = openMatch\n const isSelfClosing = selfClosingSlash === '/' || VOID_ELEMENTS.includes(tagName.toLowerCase())\n \n // 解析属性\n const attrs: Record<string, string> = {}\n if (attrsString) {\n // 匹配属性:name=\"value\", name='value', name=value, name\n const attrRegex = /([a-zA-Z_:][-a-zA-Z0-9_:.]*)\\s*(?:=\\s*(?:\"([^\"]*)\"|'([^']*)'|([^\\s\"'=<>`]+)))?/g\n let attrMatch\n while ((attrMatch = attrRegex.exec(attrsString)) !== null) {\n const [, name, doubleQuoted, singleQuoted, unquoted] = attrMatch\n const value = doubleQuoted ?? singleQuoted ?? unquoted ?? ''\n attrs[name.toLowerCase()] = decodeHtmlEntities(value)\n }\n }\n \n return {\n tagName: tagName.toLowerCase(),\n attrs,\n isClosing: false,\n isSelfClosing,\n rawHtml: tag\n }\n}\n\n/**\n * 解析完整的 HTML 片段为 AST\n */\nexport function parseHtmlFragment(html: string, options: HtmlTreeExtensionOptions = {}): HtmlElementNode[] {\n const result: HtmlElementNode[] = []\n const stack: HtmlElementNode[] = []\n \n // 使用正则逐个提取标签和文本\n const tokenRegex = /(<\\/?[a-zA-Z][^>]*>)|([^<]+)/g\n let match\n \n while ((match = tokenRegex.exec(html)) !== null) {\n const [, tag, text] = match\n \n if (tag) {\n // 使用 parseTagDirect 直接解析,避免类型检测误判\n const parsed = parseTagDirect(tag)\n if (!parsed) continue\n \n // 检查标签黑名单\n if (isTagBlacklisted(parsed.tagName, options)) {\n continue\n }\n \n if (parsed.isClosing) {\n // 结束标签:向上查找匹配的开始标签\n let found = false\n for (let i = stack.length - 1; i >= 0; i--) {\n if (stack[i].tagName === parsed.tagName) {\n // 找到匹配,弹出并关闭\n const node = stack.pop()!\n if (stack.length > 0) {\n stack[stack.length - 1].children.push(node)\n } else {\n result.push(node)\n }\n found = true\n break\n }\n }\n // 未找到匹配的开始标签,忽略该结束标签\n if (!found) continue\n } else {\n // 开始标签或自闭合标签\n const sanitizedAttrs = sanitizeAttrs(parsed.attrs, options)\n \n const node: HtmlElementNode = {\n type: 'htmlElement',\n tagName: parsed.tagName,\n attrs: sanitizedAttrs,\n children: [],\n data: options.preserveRawHtml !== false ? {\n rawHtml: tag,\n parsed: true\n } : undefined\n }\n \n if (parsed.isSelfClosing) {\n // 自闭合标签直接添加\n if (stack.length > 0) {\n stack[stack.length - 1].children.push(node)\n } else {\n result.push(node)\n }\n } else {\n // 开始标签,入栈\n stack.push(node)\n }\n }\n } else if (text && text.trim()) {\n // 文本节点\n const textNode: RootContent = {\n type: 'text',\n value: text\n } as RootContent\n \n if (stack.length > 0) {\n stack[stack.length - 1].children.push(textNode)\n }\n // 顶层纯文本不处理(应该已经被 markdown 解析器处理)\n }\n }\n \n // 处理未闭合的标签(从栈中弹出)\n while (stack.length > 0) {\n const node = stack.pop()!\n if (stack.length > 0) {\n stack[stack.length - 1].children.push(node)\n } else {\n result.push(node)\n }\n }\n \n return result\n}\n\n// ============ XSS 防护 ============\n\n/**\n * 检查标签是否在黑名单中\n */\nfunction isTagBlacklisted(tagName: string, options: HtmlTreeExtensionOptions): boolean {\n const blacklist = options.tagBlacklist ?? DEFAULT_TAG_BLACKLIST\n return blacklist.includes(tagName.toLowerCase())\n}\n\n/**\n * 检查属性是否在黑名单中\n */\nfunction isAttrBlacklisted(attrName: string, options: HtmlTreeExtensionOptions): boolean {\n const name = attrName.toLowerCase()\n const blacklist = options.attrBlacklist ?? DEFAULT_ATTR_BLACKLIST\n \n // 检查 on* 事件属性\n if (name.startsWith('on')) return true\n \n return blacklist.includes(name)\n}\n\n/**\n * 检查 URL 是否包含危险协议\n */\nfunction isProtocolDangerous(url: string, options: HtmlTreeExtensionOptions): boolean {\n const protocolBlacklist = options.protocolBlacklist ?? DEFAULT_PROTOCOL_BLACKLIST\n const normalizedUrl = url.trim().toLowerCase()\n \n for (const protocol of protocolBlacklist) {\n if (normalizedUrl.startsWith(protocol)) {\n // 特殊处理:允许 data:image/\n if (protocol === 'data:' && normalizedUrl.startsWith('data:image/')) {\n return false\n }\n return true\n }\n }\n \n return false\n}\n\n/**\n * 清理属性,移除危险属性\n */\nfunction sanitizeAttrs(\n attrs: Record<string, string>,\n options: HtmlTreeExtensionOptions\n): Record<string, string> {\n const result: Record<string, string> = {}\n \n for (const [name, value] of Object.entries(attrs)) {\n // 检查属性黑名单\n if (isAttrBlacklisted(name, options)) continue\n \n // 检查 URL 属性的协议\n if (URL_ATTRS.includes(name.toLowerCase())) {\n if (isProtocolDangerous(value, options)) continue\n }\n \n result[name] = value\n }\n \n return result\n}\n\n// ============ AST 转换器 ============\n\n/**\n * 检查是否是 HTML 节点\n */\nfunction isHtmlNode(node: RootContent): node is HTML {\n return node.type === 'html'\n}\n\n/**\n * 检查节点是否有子节点\n */\nfunction hasChildren(node: RootContent | Root): node is Parent & RootContent {\n return 'children' in node && Array.isArray((node as Parent).children)\n}\n\n/**\n * 处理 HTML 节点数组,将开始标签、内容、结束标签合并为结构化节点\n */\nfunction processHtmlNodesInArray(\n nodes: RootContent[],\n options: HtmlTreeExtensionOptions\n): RootContent[] {\n const result: RootContent[] = []\n let i = 0\n \n while (i < nodes.length) {\n const node = nodes[i]\n \n if (isHtmlNode(node)) {\n // 首先检测 HTML 内容类型\n const contentType = detectHtmlContentType(node.value)\n \n if (contentType === 'fragment') {\n // 完整的 HTML 片段,解析为 HTML 树\n const fragmentNodes = parseHtmlFragment(node.value, options)\n if (fragmentNodes.length > 0) {\n result.push(...fragmentNodes)\n } else {\n // 无法解析,保留原节点\n result.push(node)\n }\n i++\n } else if (contentType === 'self-closing') {\n // 自闭合标签\n const parsed = parseHtmlTag(node.value)\n if (parsed && !isTagBlacklisted(parsed.tagName, options)) {\n const elementNode: HtmlElementNode = {\n type: 'htmlElement',\n tagName: parsed.tagName,\n attrs: sanitizeAttrs(parsed.attrs, options),\n children: [],\n data: options.preserveRawHtml !== false ? {\n rawHtml: node.value,\n parsed: true,\n originalType: 'html'\n } : undefined\n }\n result.push(elementNode)\n }\n i++\n } else if (contentType === 'closing') {\n // 孤立的结束标签,跳过(通常已被开标签处理)\n i++\n } else if (contentType === 'opening') {\n // 开始标签:收集子节点直到找到对应的结束标签\n const parsed = parseHtmlTag(node.value)\n if (!parsed || isTagBlacklisted(parsed.tagName, options)) {\n i++\n continue\n }\n \n const tagName = parsed.tagName\n const contentNodes: RootContent[] = []\n let depth = 1\n let j = i + 1\n let foundClosing = false\n \n while (j < nodes.length && depth > 0) {\n const nextNode = nodes[j]\n \n if (isHtmlNode(nextNode)) {\n const nextType = detectHtmlContentType(nextNode.value)\n \n if (nextType === 'closing') {\n const nextParsed = parseHtmlTag(nextNode.value)\n if (nextParsed && nextParsed.tagName === tagName) {\n depth--\n if (depth === 0) {\n foundClosing = true\n break\n }\n }\n } else if (nextType === 'opening') {\n const nextParsed = parseHtmlTag(nextNode.value)\n if (nextParsed && nextParsed.tagName === tagName) {\n depth++\n }\n }\n // fragment 和 self-closing 不影响深度\n }\n \n contentNodes.push(nextNode)\n j++\n }\n \n // 创建结构化节点\n const elementNode: HtmlElementNode = {\n type: 'htmlElement',\n tagName: parsed.tagName,\n attrs: sanitizeAttrs(parsed.attrs, options),\n children: processHtmlNodesInArray(contentNodes, options),\n data: options.preserveRawHtml !== false ? {\n rawHtml: node.value,\n parsed: true,\n originalType: 'html'\n } : undefined\n }\n \n result.push(elementNode)\n i = foundClosing ? j + 1 : j\n } else {\n // unknown 类型,保留原节点\n result.push(node)\n i++\n }\n } else {\n // 非 HTML 节点,递归处理子节点\n if (hasChildren(node)) {\n const processed = processHtmlNodesInArray(\n (node as Parent).children as RootContent[],\n options\n )\n result.push({\n ...node,\n children: processed\n } as RootContent)\n } else {\n result.push(node)\n }\n i++\n }\n }\n \n return result\n}\n\n/**\n * 转换整个 AST,处理所有 HTML 节点\n */\nexport function transformHtmlNodes(ast: Root, options: HtmlTreeExtensionOptions = {}): Root {\n return {\n ...ast,\n children: processHtmlNodesInArray(ast.children, options) as Root['children']\n }\n}\n\n/**\n * 创建 HTML 树转换器\n * 这是一个 unified 兼容的转换器\n */\nexport function createHtmlTreeTransformer(options: HtmlTreeExtensionOptions = {}) {\n return function transformer(tree: Root): Root {\n return transformHtmlNodes(tree, options)\n }\n}\n\n// ============ mdast 扩展(用于 fromMarkdown) ============\n\n/**\n * mdast-util-from-markdown 扩展\n * 注意:此扩展主要用于类型声明,实际转换在后处理阶段完成\n */\nexport const htmlTreeExtension: MdastExtension = {\n enter: {},\n exit: {}\n}\n\n// ============ 便捷工具函数 ============\n\n/**\n * 判断节点是否是 HtmlElementNode\n */\nexport function isHtmlElementNode(node: RootContent): node is HtmlElementNode {\n return node.type === 'htmlElement'\n}\n\n/**\n * 遍历所有 HTML 元素节点\n */\nexport function walkHtmlElements(\n node: RootContent | Root,\n callback: (node: HtmlElementNode, parent: Parent | Root | null) => void,\n parent: Parent | Root | null = null\n): void {\n if (isHtmlElementNode(node as RootContent)) {\n callback(node as HtmlElementNode, parent)\n }\n \n if (hasChildren(node as RootContent) || node.type === 'root') {\n const children = (node as Parent | Root).children\n for (const child of children) {\n walkHtmlElements(child, callback, node as Parent | Root)\n }\n }\n}\n\n/**\n * 查找特定标签的所有节点\n */\nexport function findHtmlElementsByTag(\n root: Root,\n tagName: string\n): HtmlElementNode[] {\n const result: HtmlElementNode[] = []\n \n walkHtmlElements(root, (node) => {\n if (node.tagName === tagName.toLowerCase()) {\n result.push(node)\n }\n })\n \n return result\n}\n\n/**\n * 将 HtmlElementNode 转回 HTML 字符串\n */\nexport function htmlElementToString(node: HtmlElementNode): string {\n const { tagName, attrs, children } = node\n \n // 构建属性字符串\n const attrsStr = Object.entries(attrs)\n .map(([name, value]) => {\n if (value === '') return name\n return `${name}=\"${escapeHtml(value)}\"`\n })\n .join(' ')\n \n const openTag = attrsStr ? `<${tagName} ${attrsStr}>` : `<${tagName}>`\n \n // 自闭合标签\n if (children.length === 0 && isSelfClosingTag(tagName)) {\n return attrsStr ? `<${tagName} ${attrsStr} />` : `<${tagName} />`\n }\n \n // 递归处理子节点\n const childrenStr = children.map(child => {\n if (child.type === 'text') {\n return (child as { value: string }).value\n }\n if (isHtmlElementNode(child)) {\n return htmlElementToString(child)\n }\n // 其他节点类型保持原样(实际使用中可能需要扩展)\n return ''\n }).join('')\n \n return `${openTag}${childrenStr}</${tagName}>`\n}\n\n/**\n * 检查是否是自闭合标签\n */\nfunction isSelfClosingTag(tagName: string): boolean {\n return ['br', 'hr', 'img', 'input', 'meta', 'link', 'area', 'base', 'col', 'embed', 'source', 'track', 'wbr'].includes(tagName.toLowerCase())\n}\n\n/**\n * HTML 转义\n */\nfunction escapeHtml(text: string): string {\n return text\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&#39;')\n}\n\n// ============ 导出 ============\n\nexport {\n DEFAULT_TAG_BLACKLIST as HTML_TAG_BLACKLIST,\n DEFAULT_ATTR_BLACKLIST as HTML_ATTR_BLACKLIST,\n DEFAULT_PROTOCOL_BLACKLIST as HTML_PROTOCOL_BLACKLIST\n}\n","/**\n * @file Micromark 扩展:支持增量解析的 Reference 语法\n * \n * @description\n * 在增量解析场景中,引用式图片/链接(如 `![Alt][id]`)可能在定义(`[id]: url`)之前出现。\n * 标准 micromark 会检查 parser.defined,如果 id 未定义就解析为文本。\n * \n * 本扩展通过覆盖 labelEnd 构造,移除 parser.defined 检查,\n * 使得 reference 语法总是被解析为 reference token,\n * 由渲染层根据实际的 definitionMap 决定如何渲染。\n * \n * @module micromark-reference-extension\n * \n * @features\n * - ✅ 支持所有 resource 语法(带 title 的图片/链接)\n * - ✅ 支持所有 reference 语法(full, collapsed, shortcut)\n * - ✅ 延迟验证:解析时不检查定义是否存在\n * - ✅ 使用官方 factory 函数,保证与 CommonMark 标准一致\n * \n * @dependencies\n * - micromark-factory-destination: 解析 URL(支持尖括号、括号平衡)\n * - micromark-factory-title: 解析 title(支持三种引号,支持多行)\n * - micromark-factory-label: 解析 label(支持转义、长度限制)\n * - micromark-factory-whitespace: 解析空白符(正确生成 lineEnding/linePrefix token)\n * - micromark-util-character: 字符判断工具\n * - micromark-util-symbol: 常量(codes, types, constants)\n * - micromark-util-types: TypeScript 类型定义\n * \n * @see {@link https://github.com/micromark/micromark} - micromark 官方文档\n * @see {@link https://spec.commonmark.org/0.30/#images} - CommonMark 图片规范\n * @see {@link https://spec.commonmark.org/0.30/#links} - CommonMark 链接规范\n * \n * @example\n * ```typescript\n * import { micromarkReferenceExtension } from './micromark-reference-extension'\n * import { fromMarkdown } from 'mdast-util-from-markdown'\n * \n * const extensions = [micromarkReferenceExtension()]\n * const ast = fromMarkdown(text, { extensions })\n * ```\n * \n * @author Incremark Team\n * @license MIT\n */\n\nimport type {\n Code,\n Construct,\n Extension,\n Event,\n Resolver,\n State,\n TokenizeContext,\n Tokenizer,\n Token\n} from 'micromark-util-types'\nimport { codes, types, constants } from 'micromark-util-symbol'\nimport { \n markdownLineEnding, \n markdownSpace, \n markdownLineEndingOrSpace \n} from 'micromark-util-character'\nimport { factoryDestination } from 'micromark-factory-destination'\nimport { factoryTitle } from 'micromark-factory-title'\nimport { factoryLabel } from 'micromark-factory-label'\nimport { factoryWhitespace } from 'micromark-factory-whitespace'\n\n/**\n * 创建支持增量解析的 reference 扩展\n * \n * 这个扩展覆盖了 micromark-core-commonmark 中的 labelEnd 构造,\n * 移除了对 parser.defined 的检查,使得 reference 语法总是被解析为 reference token,\n * 即使对应的 definition 尚未出现。\n * \n * @returns Micromark 扩展对象\n * \n * @remarks\n * - labelEnd 在 text 中注册,键是 `codes.rightSquareBracket`(']')\n * - 我们使用相同的键来覆盖它\n * - 根据 combineExtensions 的逻辑,后添加的扩展会先被尝试\n * \n * @example\n * ```typescript\n * // 在 IncremarkParser 中使用\n * const extensions = [\n * gfm(),\n * micromarkReferenceExtension() // 最后添加,确保覆盖\n * ]\n * const ast = fromMarkdown(text, { extensions })\n * ```\n */\nexport function micromarkReferenceExtension(): Extension {\n // 关键:不使用 disable,直接覆盖\n // 根据 combineExtensions 的逻辑,后添加的扩展会先被尝试(before 数组会被插入到 existing 的开头)\n return {\n // 在 text 中使用 codes.rightSquareBracket 键覆盖 labelEnd\n text: {\n [codes.rightSquareBracket]: {\n name: 'labelEnd',\n resolveAll: resolveAllLabelEnd,\n resolveTo: resolveToLabelEnd,\n tokenize: tokenizeLabelEnd,\n // 添加 add: 'before' 确保先被尝试\n add: 'before'\n } as Construct\n }\n }\n}\n\n/**\n * Resolve all label end events.\n * 从原始代码复制,保持不变。\n */\nfunction resolveAllLabelEnd(events: Event[]): Event[] {\n let index = -1\n const newEvents: Event[] = []\n while (++index < events.length) {\n const token = events[index][1]\n newEvents.push(events[index])\n\n if (\n token.type === types.labelImage ||\n token.type === types.labelLink ||\n token.type === types.labelEnd\n ) {\n // Remove the marker.\n const offset = token.type === types.labelImage ? 4 : 2\n token.type = types.data\n index += offset\n }\n }\n\n // If the events are equal, we don't have to copy newEvents to events\n if (events.length !== newEvents.length) {\n // 简化:直接替换\n events.length = 0\n events.push(...newEvents)\n }\n\n return events\n}\n\n/**\n * Resolve to label end.\n * 这是关键函数,负责将 labelEnd 和 reference 关联到 image/link。\n * 需要完整实现,否则 mdast 无法找到 image/link token。\n */\nfunction resolveToLabelEnd(events: Event[], context: any): Event[] {\n let index = events.length\n let offset = 0\n /** @type {any} */\n let token: any\n /** @type {number | undefined} */\n let open: number | undefined\n /** @type {number | undefined} */\n let close: number | undefined\n /** @type {Array<Event>} */\n let media: Event[]\n\n // Find an opening.\n while (index--) {\n token = events[index][1]\n\n if (open !== undefined) {\n // If we see another link, or inactive link label, we've been here before.\n if (\n token.type === types.link ||\n (token.type === types.labelLink && token._inactive)\n ) {\n break\n }\n\n // Mark other link openings as inactive, as we can't have links in links.\n if (events[index][0] === 'enter' && token.type === types.labelLink) {\n token._inactive = true\n }\n } else if (close !== undefined) {\n if (\n events[index][0] === 'enter' &&\n (token.type === types.labelImage || token.type === types.labelLink) &&\n !token._balanced\n ) {\n open = index\n\n if (token.type !== types.labelLink) {\n offset = 2\n break\n }\n }\n } else if (token.type === types.labelEnd) {\n close = index\n }\n }\n\n if (open === undefined || close === undefined) {\n // 如果没有找到匹配的 open 和 close,直接返回\n return events\n }\n\n const group = {\n type: events[open][1].type === types.labelLink ? types.link : types.image,\n start: {...events[open][1].start},\n end: {...events[events.length - 1][1].end}\n }\n\n const label = {\n type: types.label,\n start: {...events[open][1].start},\n end: {...events[close][1].end}\n }\n\n const text = {\n type: types.labelText,\n start: {...events[open + offset + 2][1].end},\n end: {...events[close - 2][1].start}\n }\n\n media = [\n ['enter', group, context],\n ['enter', label, context]\n ]\n\n // Opening marker.\n media.push(...events.slice(open + 1, open + offset + 3))\n\n // Text open.\n media.push(['enter', text, context])\n\n // Between (label text content)\n // 简化:直接使用 events,不调用 resolveAll\n media.push(...events.slice(open + offset + 4, close - 3))\n\n // Text close, marker close, label close.\n media.push(\n ['exit', text, context],\n events[close - 2],\n events[close - 1],\n ['exit', label, context]\n )\n\n // Reference, resource, or so.\n media.push(...events.slice(close + 1))\n\n // Media close.\n media.push(['exit', group, context])\n\n // 替换 events\n events.splice(open, events.length - open, ...media)\n\n return events\n}\n\n/**\n * Tokenize label end,支持增量解析\n * \n * 关键修改:\n * 1. 移除了对 parser.defined 的检查\n * 2. 在 after 函数中,总是尝试解析为 reference\n * 3. 在 referenceFullAfter 中,总是返回 ok\n * \n * 注意:这是一个简化实现,主要目的是让 reference 语法总是被解析为 reference token。\n * 完整的实现需要 factoryLabel、factoryDestination 等工具函数,但这些不在公共 npm 包中。\n * 这个简化版本应该能够处理基本的 reference 语法。\n */\nfunction tokenizeLabelEnd(\n this: TokenizeContext,\n effects: Parameters<Tokenizer>[0],\n ok: State,\n nok: State\n): State {\n const self = this\n let index = self.events.length\n /** @type {any} */\n let labelStart: any\n\n // Find an opening.\n while (index--) {\n if (\n (self.events[index][1].type === types.labelImage ||\n self.events[index][1].type === types.labelLink) &&\n !self.events[index][1]._balanced\n ) {\n labelStart = self.events[index][1]\n break\n }\n }\n\n return start as State\n\n /**\n * Start of label end.\n */\n function start(code: Code): State | void {\n // If there is not an okay opening.\n if (!labelStart) {\n return nok(code)\n }\n\n // If the corresponding label (link) start is marked as inactive,\n // it means we'd be wrapping a link, like this:\n //\n // ```markdown\n // > | a [b [c](d) e](f) g.\n // ^\n // ```\n //\n // We can't have that, so it's just balanced brackets.\n if (labelStart._inactive) {\n return labelEndNok(code)\n }\n\n // 检测脚注引用:如果标签以 ^ 开头,交给 GFM 脚注扩展处理\n // 注意:这里只检查 labelLink,不检查 labelImage\n // 因为脚注引用是 [^1],不是 ![^1]\n if (labelStart.type === types.labelLink) {\n const labelText = self.sliceSerialize({start: labelStart.end, end: self.now()})\n if (labelText.startsWith('^')) {\n // 这是脚注引用,交给 GFM 脚注扩展处理\n return nok(code)\n }\n }\n\n // 关键修改:移除了对 parser.defined 的检查\n // 原始代码会检查:\n // defined = self.parser.defined.includes(\n // normalizeIdentifier(\n // self.sliceSerialize({start: labelStart.end, end: self.now()})\n // )\n // )\n\n effects.enter(types.labelEnd)\n effects.enter(types.labelMarker)\n effects.consume(code)\n effects.exit(types.labelMarker)\n effects.exit(types.labelEnd)\n return after as State\n }\n\n /**\n * After `]`.\n */\n function after(code: Code): State | void {\n // Resource (`[asd](fgh)`)?\n if (code === codes.leftParenthesis) {\n // 对于 resource,保持原始逻辑(总是尝试解析)\n // 注意:resource 不依赖于 definition,所以应该总是能正确解析\n // 如果解析失败,返回 labelEndNok,避免被错误解析为 shortcut reference\n return effects.attempt(\n {\n tokenize: tokenizeResource,\n partial: false\n },\n labelEndOk as State,\n labelEndNok as State // 修复:resource 解析失败时返回 nok\n )(code)\n }\n\n // Full (`[asd][fgh]`) or collapsed (`[asd][]`) reference?\n if (code === codes.leftSquareBracket) {\n // 关键修改:总是尝试解析为 reference,不检查 defined\n return effects.attempt(\n {\n tokenize: tokenizeReferenceFull,\n partial: false\n },\n labelEndOk as State,\n referenceNotFull as State // 修改:即使不是 full reference,也尝试 collapsed\n )(code)\n }\n\n // Shortcut (`[asd]`) reference?\n // 关键修改:总是返回 ok,让后续处理\n return labelEndOk(code) as State\n }\n\n /**\n * After `]`, at `[`, but not at a full reference.\n */\n function referenceNotFull(code: Code): State | void {\n return effects.attempt(\n {\n tokenize: tokenizeReferenceCollapsed,\n partial: false\n },\n labelEndOk as State,\n labelEndOk as State // 修改:即使失败也返回 ok\n )(code)\n }\n\n /**\n * Done, we found something.\n */\n function labelEndOk(code: Code): State | void {\n return ok(code) as State\n }\n\n /**\n * Done, it's nothing.\n */\n function labelEndNok(code: Code): State | void {\n labelStart._balanced = true\n return nok(code)\n }\n}\n\n/**\n * 解析 resource 语法:[text](url) 或 [text](url \"title\")\n * \n * 支持的语法:\n * - [text](url)\n * - [text](url \"title\")\n * - [text](url 'title')\n * - [text](url (title))\n * - [text](<url with spaces>)\n * - [text](url \"title with \\\"escaped\\\"\")\n * \n * 完整实现:使用官方 factory 函数保证与 CommonMark 标准一致\n * \n * @param effects - Token 生成器\n * @param ok - 成功时的状态函数\n * @param nok - 失败时的状态函数\n * @returns 起始状态函数\n */\nfunction tokenizeResource(\n this: TokenizeContext,\n effects: Parameters<Tokenizer>[0],\n ok: State,\n nok: State\n): State {\n return resourceStart\n\n /**\n * 在 resource 起始位置,期望 '('\n * \n * ```markdown\n * > | [a](b) c\n * ^\n * ```\n * \n * @param code - 当前字符编码\n */\n function resourceStart(code: Code): State | undefined {\n if (code !== codes.leftParenthesis) {\n return nok(code)\n }\n \n effects.enter(types.resource)\n effects.enter(types.resourceMarker)\n effects.consume(code)\n effects.exit(types.resourceMarker)\n return resourceBefore\n }\n\n /**\n * 在 '(' 之后,可能有空白符\n * \n * ```markdown\n * > | [a]( b) c\n * ^\n * ```\n * \n * @param code - 当前字符编码\n */\n function resourceBefore(code: Code): State | undefined {\n return markdownLineEndingOrSpace(code)\n ? factoryWhitespace(effects, resourceOpen)(code)\n : resourceOpen(code)\n }\n\n /**\n * 在空白符之后,期望 destination 或 ')'\n * \n * ```markdown\n * > | [a](b) c\n * ^\n * ```\n * \n * @param code - 当前字符编码\n */\n function resourceOpen(code: Code): State | undefined {\n // 空 resource: [text]()\n if (code === codes.rightParenthesis) {\n return resourceEnd(code)\n }\n\n // 使用官方 factoryDestination 解析 URL\n return factoryDestination(\n effects,\n resourceDestinationAfter,\n resourceDestinationMissing,\n types.resourceDestination,\n types.resourceDestinationLiteral,\n types.resourceDestinationLiteralMarker,\n types.resourceDestinationRaw,\n types.resourceDestinationString,\n constants.linkResourceDestinationBalanceMax\n )(code)\n }\n\n /**\n * 在 destination 之后,可能有空白符或 title\n * \n * ```markdown\n * > | [a](b ) c\n * ^\n * ```\n * \n * @param code - 当前字符编码\n */\n function resourceDestinationAfter(code: Code): State | undefined {\n return markdownLineEndingOrSpace(code)\n ? factoryWhitespace(effects, resourceBetween)(code)\n : resourceEnd(code)\n }\n\n /**\n * Destination 解析失败(格式错误)\n * \n * ```markdown\n * > | [a](<<) b\n * ^\n * ```\n * \n * @param code - 当前字符编码\n */\n function resourceDestinationMissing(code: Code): State | undefined {\n return nok(code)\n }\n\n /**\n * 在 destination 和空白符之后,可能有 title\n * \n * ```markdown\n * > | [a](b \"c\") d\n * ^\n * ```\n * \n * @param code - 当前字符编码\n */\n function resourceBetween(code: Code): State | undefined {\n // 检测 title 起始标记:双引号、单引号或左括号\n if (\n code === codes.quotationMark ||\n code === codes.apostrophe ||\n code === codes.leftParenthesis\n ) {\n // 使用官方 factoryTitle 解析 title\n return factoryTitle(\n effects,\n resourceTitleAfter,\n nok,\n types.resourceTitle,\n types.resourceTitleMarker,\n types.resourceTitleString\n )(code)\n }\n\n // 没有 title,直接结束\n return resourceEnd(code)\n }\n\n /**\n * 在 title 之后,可能有空白符\n * \n * ```markdown\n * > | [a](b \"c\" ) d\n * ^\n * ```\n * \n * @param code - 当前字符编码\n */\n function resourceTitleAfter(code: Code): State | undefined {\n return markdownLineEndingOrSpace(code)\n ? factoryWhitespace(effects, resourceEnd)(code)\n : resourceEnd(code)\n }\n\n /**\n * 在 resource 结束位置,期望 ')'\n * \n * ```markdown\n * > | [a](b) c\n * ^\n * ```\n * \n * @param code - 当前字符编码\n */\n function resourceEnd(code: Code): State | undefined {\n if (code === codes.rightParenthesis) {\n effects.enter(types.resourceMarker)\n effects.consume(code)\n effects.exit(types.resourceMarker)\n effects.exit(types.resource)\n return ok\n }\n\n return nok(code)\n }\n}\n\n/**\n * 解析 full reference:[text][id]\n * \n * 注意:不检查 id 是否已定义(支持增量解析的核心特性)\n * \n * @param effects - Token 生成器\n * @param ok - 成功时的状态函数\n * @param nok - 失败时的状态函数\n * @returns 起始状态函数\n */\nfunction tokenizeReferenceFull(\n this: TokenizeContext,\n effects: Parameters<Tokenizer>[0],\n ok: State,\n nok: State\n): State {\n const self = this\n\n return referenceFull\n\n /**\n * 在 reference 起始位置,期望 '['\n * \n * ```markdown\n * > | [a][b] d\n * ^\n * ```\n * \n * @param code - 当前字符编码\n */\n function referenceFull(code: Code): State | undefined {\n if (code !== codes.leftSquareBracket) {\n return nok(code)\n }\n \n // 使用官方 factoryLabel 解析 [id]\n // 使用 .call() 确保正确的 this 上下文\n return factoryLabel.call(\n self,\n effects,\n referenceFullAfter,\n referenceFullMissing,\n types.reference,\n types.referenceMarker,\n types.referenceString\n )(code)\n }\n\n /**\n * 在 reference 结束后\n * \n * 🔑 核心特性:总是返回 ok,不检查 parser.defined\n * 这使得增量解析场景下,前向引用能够正常工作\n * \n * ```markdown\n * > | [a][b] d\n * ^\n * ```\n * \n * @param code - 当前字符编码\n */\n function referenceFullAfter(code: Code): State | undefined {\n // 关键修改:不检查 parser.defined\n // \n // 原始 micromark-core-commonmark 的代码:\n // return self.parser.defined.includes(\n // normalizeIdentifier(\n // self.sliceSerialize(self.events[self.events.length - 1][1]).slice(1, -1)\n // )\n // ) ? ok(code) : nok(code)\n //\n // 修改后:总是返回 ok,延迟验证到渲染层\n return ok(code)\n }\n\n /**\n * Reference label 格式错误\n * \n * ```markdown\n * > | [a][b d\n * ^\n * ```\n * \n * @param code - 当前字符编码\n */\n function referenceFullMissing(code: Code): State | undefined {\n return nok(code)\n }\n}\n\n/**\n * Tokenize collapsed reference (e.g., `[text][]`).\n */\nfunction tokenizeReferenceCollapsed(\n this: TokenizeContext,\n effects: Parameters<Tokenizer>[0],\n ok: State,\n nok: State\n): State {\n return referenceCollapsedStart as State\n\n function referenceCollapsedStart(code: Code): State | void {\n if (code !== codes.leftSquareBracket) {\n return nok(code)\n }\n effects.enter(types.reference)\n effects.enter(types.referenceMarker)\n effects.consume(code)\n effects.exit(types.referenceMarker)\n return referenceCollapsedOpen as State\n }\n\n function referenceCollapsedOpen(code: Code): State | void {\n if (code === codes.rightSquareBracket) {\n effects.enter(types.referenceMarker)\n effects.consume(code)\n effects.exit(types.referenceMarker)\n effects.exit(types.reference)\n return ok as State\n }\n return nok(code)\n }\n}\n\n","/**\n * @import {Effects, State, TokenType} from 'micromark-util-types'\n */\n\nimport { markdownSpace } from 'micromark-util-character';\n\n// To do: implement `spaceOrTab`, `spaceOrTabMinMax`, `spaceOrTabWithOptions`.\n\n/**\n * Parse spaces and tabs.\n *\n * There is no `nok` parameter:\n *\n * * spaces in markdown are often optional, in which case this factory can be\n * used and `ok` will be switched to whether spaces were found or not\n * * one line ending or space can be detected with `markdownSpace(code)` right\n * before using `factorySpace`\n *\n * ###### Examples\n *\n * Where `␉` represents a tab (plus how much it expands) and `␠` represents a\n * single space.\n *\n * ```markdown\n * ␉\n * ␠␠␠␠\n * ␉␠\n * ```\n *\n * @param {Effects} effects\n * Context.\n * @param {State} ok\n * State switched to when successful.\n * @param {TokenType} type\n * Type (`' \\t'`).\n * @param {number | undefined} [max=Infinity]\n * Max (exclusive).\n * @returns {State}\n * Start state.\n */\nexport function factorySpace(effects, ok, type, max) {\n const limit = max ? max - 1 : Number.POSITIVE_INFINITY;\n let size = 0;\n return start;\n\n /** @type {State} */\n function start(code) {\n if (markdownSpace(code)) {\n effects.enter(type);\n return prefix(code);\n }\n return ok(code);\n }\n\n /** @type {State} */\n function prefix(code) {\n if (markdownSpace(code) && size++ < limit) {\n effects.consume(code);\n return prefix;\n }\n effects.exit(type);\n return ok(code);\n }\n}","/**\n * @import {\n * Construct,\n * State,\n * TokenizeContext,\n * Tokenizer\n * } from 'micromark-util-types'\n */\n\nimport { factorySpace } from 'micromark-factory-space';\nimport { markdownLineEnding, markdownSpace } from 'micromark-util-character';\n/** @type {Construct} */\nexport const blankLine = {\n partial: true,\n tokenize: tokenizeBlankLine\n};\n\n/**\n * @this {TokenizeContext}\n * Context.\n * @type {Tokenizer}\n */\nfunction tokenizeBlankLine(effects, ok, nok) {\n return start;\n\n /**\n * Start of blank line.\n *\n * > 👉 **Note**: `␠` represents a space character.\n *\n * ```markdown\n * > | ␠␠␊\n * ^\n * > | ␊\n * ^\n * ```\n *\n * @type {State}\n */\n function start(code) {\n return markdownSpace(code) ? factorySpace(effects, after, \"linePrefix\")(code) : after(code);\n }\n\n /**\n * At eof/eol, after optional whitespace.\n *\n * > 👉 **Note**: `␠` represents a space character.\n *\n * ```markdown\n * > | ␠␠␊\n * ^\n * > | ␊\n * ^\n * ```\n *\n * @type {State}\n */\n function after(code) {\n return code === null || markdownLineEnding(code) ? ok(code) : nok(code);\n }\n}","/**\n * @import {Event, Exiter, Extension, Resolver, State, Token, TokenizeContext, Tokenizer} from 'micromark-util-types'\n */\n\nimport { blankLine } from 'micromark-core-commonmark';\nimport { factorySpace } from 'micromark-factory-space';\nimport { markdownLineEndingOrSpace } from 'micromark-util-character';\nimport { normalizeIdentifier } from 'micromark-util-normalize-identifier';\nconst indent = {\n tokenize: tokenizeIndent,\n partial: true\n};\n\n// To do: micromark should support a `_hiddenGfmFootnoteSupport`, which only\n// affects label start (image).\n// That will let us drop `tokenizePotentialGfmFootnote*`.\n// It currently has a `_hiddenFootnoteSupport`, which affects that and more.\n// That can be removed when `micromark-extension-footnote` is archived.\n\n/**\n * Create an extension for `micromark` to enable GFM footnote syntax.\n *\n * @returns {Extension}\n * Extension for `micromark` that can be passed in `extensions` to\n * enable GFM footnote syntax.\n */\nexport function gfmFootnote() {\n /** @type {Extension} */\n return {\n document: {\n [91]: {\n name: 'gfmFootnoteDefinition',\n tokenize: tokenizeDefinitionStart,\n continuation: {\n tokenize: tokenizeDefinitionContinuation\n },\n exit: gfmFootnoteDefinitionEnd\n }\n },\n text: {\n [91]: {\n name: 'gfmFootnoteCall',\n tokenize: tokenizeGfmFootnoteCall\n },\n [93]: {\n name: 'gfmPotentialFootnoteCall',\n add: 'after',\n tokenize: tokenizePotentialGfmFootnoteCall,\n resolveTo: resolveToPotentialGfmFootnoteCall\n }\n }\n };\n}\n\n// To do: remove after micromark update.\n/**\n * @this {TokenizeContext}\n * @type {Tokenizer}\n */\nfunction tokenizePotentialGfmFootnoteCall(effects, ok, nok) {\n const self = this;\n let index = self.events.length;\n const defined = self.parser.gfmFootnotes || (self.parser.gfmFootnotes = []);\n /** @type {Token} */\n let labelStart;\n\n // Find an opening.\n while (index--) {\n const token = self.events[index][1];\n if (token.type === \"labelImage\") {\n labelStart = token;\n break;\n }\n\n // Exit if we’ve walked far enough.\n if (token.type === 'gfmFootnoteCall' || token.type === \"labelLink\" || token.type === \"label\" || token.type === \"image\" || token.type === \"link\") {\n break;\n }\n }\n return start;\n\n /**\n * @type {State}\n */\n function start(code) {\n if (!labelStart || !labelStart._balanced) {\n return nok(code);\n }\n const id = normalizeIdentifier(self.sliceSerialize({\n start: labelStart.end,\n end: self.now()\n }));\n if (id.codePointAt(0) !== 94 || !defined.includes(id.slice(1))) {\n return nok(code);\n }\n effects.enter('gfmFootnoteCallLabelMarker');\n effects.consume(code);\n effects.exit('gfmFootnoteCallLabelMarker');\n return ok(code);\n }\n}\n\n// To do: remove after micromark update.\n/** @type {Resolver} */\nfunction resolveToPotentialGfmFootnoteCall(events, context) {\n let index = events.length;\n /** @type {Token | undefined} */\n let labelStart;\n\n // Find an opening.\n while (index--) {\n if (events[index][1].type === \"labelImage\" && events[index][0] === 'enter') {\n labelStart = events[index][1];\n break;\n }\n }\n // Change the `labelImageMarker` to a `data`.\n events[index + 1][1].type = \"data\";\n events[index + 3][1].type = 'gfmFootnoteCallLabelMarker';\n\n // The whole (without `!`):\n /** @type {Token} */\n const call = {\n type: 'gfmFootnoteCall',\n start: Object.assign({}, events[index + 3][1].start),\n end: Object.assign({}, events[events.length - 1][1].end)\n };\n // The `^` marker\n /** @type {Token} */\n const marker = {\n type: 'gfmFootnoteCallMarker',\n start: Object.assign({}, events[index + 3][1].end),\n end: Object.assign({}, events[index + 3][1].end)\n };\n // Increment the end 1 character.\n marker.end.column++;\n marker.end.offset++;\n marker.end._bufferIndex++;\n /** @type {Token} */\n const string = {\n type: 'gfmFootnoteCallString',\n start: Object.assign({}, marker.end),\n end: Object.assign({}, events[events.length - 1][1].start)\n };\n /** @type {Token} */\n const chunk = {\n type: \"chunkString\",\n contentType: 'string',\n start: Object.assign({}, string.start),\n end: Object.assign({}, string.end)\n };\n\n /** @type {Array<Event>} */\n const replacement = [\n // Take the `labelImageMarker` (now `data`, the `!`)\n events[index + 1], events[index + 2], ['enter', call, context],\n // The `[`\n events[index + 3], events[index + 4],\n // The `^`.\n ['enter', marker, context], ['exit', marker, context],\n // Everything in between.\n ['enter', string, context], ['enter', chunk, context], ['exit', chunk, context], ['exit', string, context],\n // The ending (`]`, properly parsed and labelled).\n events[events.length - 2], events[events.length - 1], ['exit', call, context]];\n events.splice(index, events.length - index + 1, ...replacement);\n return events;\n}\n\n/**\n * @this {TokenizeContext}\n * @type {Tokenizer}\n */\nfunction tokenizeGfmFootnoteCall(effects, ok, nok) {\n const self = this;\n const defined = self.parser.gfmFootnotes || (self.parser.gfmFootnotes = []);\n let size = 0;\n /** @type {boolean} */\n let data;\n\n // Note: the implementation of `markdown-rs` is different, because it houses\n // core *and* extensions in one project.\n // Therefore, it can include footnote logic inside `label-end`.\n // We can’t do that, but luckily, we can parse footnotes in a simpler way than\n // needed for labels.\n return start;\n\n /**\n * Start of footnote label.\n *\n * ```markdown\n * > | a [^b] c\n * ^\n * ```\n *\n * @type {State}\n */\n function start(code) {\n effects.enter('gfmFootnoteCall');\n effects.enter('gfmFootnoteCallLabelMarker');\n effects.consume(code);\n effects.exit('gfmFootnoteCallLabelMarker');\n return callStart;\n }\n\n /**\n * After `[`, at `^`.\n *\n * ```markdown\n * > | a [^b] c\n * ^\n * ```\n *\n * @type {State}\n */\n function callStart(code) {\n if (code !== 94) return nok(code);\n effects.enter('gfmFootnoteCallMarker');\n effects.consume(code);\n effects.exit('gfmFootnoteCallMarker');\n effects.enter('gfmFootnoteCallString');\n effects.enter('chunkString').contentType = 'string';\n return callData;\n }\n\n /**\n * In label.\n *\n * ```markdown\n * > | a [^b] c\n * ^\n * ```\n *\n * @type {State}\n */\n function callData(code) {\n if (\n // Too long.\n size > 999 ||\n // Closing brace with nothing.\n code === 93 && !data ||\n // Space or tab is not supported by GFM for some reason.\n // `\\n` and `[` not being supported makes sense.\n code === null || code === 91 || markdownLineEndingOrSpace(code)) {\n return nok(code);\n }\n if (code === 93) {\n effects.exit('chunkString');\n const token = effects.exit('gfmFootnoteCallString');\n if (!defined.includes(normalizeIdentifier(self.sliceSerialize(token)))) {\n return nok(code);\n }\n effects.enter('gfmFootnoteCallLabelMarker');\n effects.consume(code);\n effects.exit('gfmFootnoteCallLabelMarker');\n effects.exit('gfmFootnoteCall');\n return ok;\n }\n if (!markdownLineEndingOrSpace(code)) {\n data = true;\n }\n size++;\n effects.consume(code);\n return code === 92 ? callEscape : callData;\n }\n\n /**\n * On character after escape.\n *\n * ```markdown\n * > | a [^b\\c] d\n * ^\n * ```\n *\n * @type {State}\n */\n function callEscape(code) {\n if (code === 91 || code === 92 || code === 93) {\n effects.consume(code);\n size++;\n return callData;\n }\n return callData(code);\n }\n}\n\n/**\n * @this {TokenizeContext}\n * @type {Tokenizer}\n */\nfunction tokenizeDefinitionStart(effects, ok, nok) {\n const self = this;\n const defined = self.parser.gfmFootnotes || (self.parser.gfmFootnotes = []);\n /** @type {string} */\n let identifier;\n let size = 0;\n /** @type {boolean | undefined} */\n let data;\n return start;\n\n /**\n * Start of GFM footnote definition.\n *\n * ```markdown\n * > | [^a]: b\n * ^\n * ```\n *\n * @type {State}\n */\n function start(code) {\n effects.enter('gfmFootnoteDefinition')._container = true;\n effects.enter('gfmFootnoteDefinitionLabel');\n effects.enter('gfmFootnoteDefinitionLabelMarker');\n effects.consume(code);\n effects.exit('gfmFootnoteDefinitionLabelMarker');\n return labelAtMarker;\n }\n\n /**\n * In label, at caret.\n *\n * ```markdown\n * > | [^a]: b\n * ^\n * ```\n *\n * @type {State}\n */\n function labelAtMarker(code) {\n if (code === 94) {\n effects.enter('gfmFootnoteDefinitionMarker');\n effects.consume(code);\n effects.exit('gfmFootnoteDefinitionMarker');\n effects.enter('gfmFootnoteDefinitionLabelString');\n effects.enter('chunkString').contentType = 'string';\n return labelInside;\n }\n return nok(code);\n }\n\n /**\n * In label.\n *\n * > 👉 **Note**: `cmark-gfm` prevents whitespace from occurring in footnote\n * > definition labels.\n *\n * ```markdown\n * > | [^a]: b\n * ^\n * ```\n *\n * @type {State}\n */\n function labelInside(code) {\n if (\n // Too long.\n size > 999 ||\n // Closing brace with nothing.\n code === 93 && !data ||\n // Space or tab is not supported by GFM for some reason.\n // `\\n` and `[` not being supported makes sense.\n code === null || code === 91 || markdownLineEndingOrSpace(code)) {\n return nok(code);\n }\n if (code === 93) {\n effects.exit('chunkString');\n const token = effects.exit('gfmFootnoteDefinitionLabelString');\n identifier = normalizeIdentifier(self.sliceSerialize(token));\n effects.enter('gfmFootnoteDefinitionLabelMarker');\n effects.consume(code);\n effects.exit('gfmFootnoteDefinitionLabelMarker');\n effects.exit('gfmFootnoteDefinitionLabel');\n return labelAfter;\n }\n if (!markdownLineEndingOrSpace(code)) {\n data = true;\n }\n size++;\n effects.consume(code);\n return code === 92 ? labelEscape : labelInside;\n }\n\n /**\n * After `\\`, at a special character.\n *\n * > 👉 **Note**: `cmark-gfm` currently does not support escaped brackets:\n * > <https://github.com/github/cmark-gfm/issues/240>\n *\n * ```markdown\n * > | [^a\\*b]: c\n * ^\n * ```\n *\n * @type {State}\n */\n function labelEscape(code) {\n if (code === 91 || code === 92 || code === 93) {\n effects.consume(code);\n size++;\n return labelInside;\n }\n return labelInside(code);\n }\n\n /**\n * After definition label.\n *\n * ```markdown\n * > | [^a]: b\n * ^\n * ```\n *\n * @type {State}\n */\n function labelAfter(code) {\n if (code === 58) {\n effects.enter('definitionMarker');\n effects.consume(code);\n effects.exit('definitionMarker');\n if (!defined.includes(identifier)) {\n defined.push(identifier);\n }\n\n // Any whitespace after the marker is eaten, forming indented code\n // is not possible.\n // No space is also fine, just like a block quote marker.\n return factorySpace(effects, whitespaceAfter, 'gfmFootnoteDefinitionWhitespace');\n }\n return nok(code);\n }\n\n /**\n * After definition prefix.\n *\n * ```markdown\n * > | [^a]: b\n * ^\n * ```\n *\n * @type {State}\n */\n function whitespaceAfter(code) {\n // `markdown-rs` has a wrapping token for the prefix that is closed here.\n return ok(code);\n }\n}\n\n/**\n * @this {TokenizeContext}\n * @type {Tokenizer}\n */\nfunction tokenizeDefinitionContinuation(effects, ok, nok) {\n /// Start of footnote definition continuation.\n ///\n /// ```markdown\n /// | [^a]: b\n /// > | c\n /// ^\n /// ```\n //\n // Either a blank line, which is okay, or an indented thing.\n return effects.check(blankLine, ok, effects.attempt(indent, ok, nok));\n}\n\n/** @type {Exiter} */\nfunction gfmFootnoteDefinitionEnd(effects) {\n effects.exit('gfmFootnoteDefinition');\n}\n\n/**\n * @this {TokenizeContext}\n * @type {Tokenizer}\n */\nfunction tokenizeIndent(effects, ok, nok) {\n const self = this;\n return factorySpace(effects, afterPrefix, 'gfmFootnoteDefinitionIndent', 4 + 1);\n\n /**\n * @type {State}\n */\n function afterPrefix(code) {\n const tail = self.events[self.events.length - 1];\n return tail && tail[1].type === 'gfmFootnoteDefinitionIndent' && tail[2].sliceSerialize(tail[1], true).length === 4 ? ok(code) : nok(code);\n }\n}","/**\n * @file GFM 脚注扩展的增量解析补丁\n * \n * @description\n * GFM 脚注扩展会检查 parser.gfmFootnotes 来验证定义是否存在。\n * 在增量解析场景下,定义可能在引用之后才出现,导致引用无法被正确解析。\n * \n * 本补丁移除定义检查,使脚注引用总是被解析为 footnoteReference。\n * \n * @module micromark-gfm-footnote-incremental\n * \n * @features\n * - ✅ 移除脚注引用的定义检查(支持前向引用)\n * - ✅ 覆盖 text[91] (`[`) 和 text[93] (`]`) 的处理\n * - ✅ 延迟验证:解析时不检查定义是否存在\n */\n\nimport type { Extension, Code, State, TokenizeContext, Tokenizer } from 'micromark-util-types'\nimport { gfmFootnote } from 'micromark-extension-gfm-footnote'\nimport { normalizeIdentifier } from 'micromark-util-normalize-identifier'\nimport { codes, constants } from 'micromark-util-symbol'\nimport { markdownLineEndingOrSpace } from 'micromark-util-character'\n\n/**\n * 创建支持增量解析的 GFM 脚注扩展\n * \n * 这个扩展基于官方 gfmFootnote(),但移除了定义检查,支持前向引用\n * \n * @returns Micromark 扩展对象\n * \n * @example\n * ```typescript\n * import { gfmFootnoteIncremental } from './micromark-gfm-footnote-incremental'\n * \n * const extensions = [\n * gfm(),\n * micromarkReferenceExtension(),\n * gfmFootnoteIncremental() // 最后添加,确保覆盖\n * ]\n * ```\n */\nexport function gfmFootnoteIncremental(): Extension {\n const original = gfmFootnote()\n \n return {\n ...original,\n text: {\n ...original.text,\n // 覆盖 text[91] (`[` 的处理) - 这是脚注引用解析的起点\n [codes.leftSquareBracket]: {\n ...original.text![codes.leftSquareBracket],\n tokenize: tokenizeGfmFootnoteCallIncremental\n },\n // 覆盖 text[93] (`]` 的处理) - 用于处理 ![^1] 这样的情况\n [codes.rightSquareBracket]: {\n ...original.text![codes.rightSquareBracket],\n tokenize: tokenizePotentialGfmFootnoteCallIncremental\n }\n }\n }\n}\n\n/**\n * Tokenize 脚注引用 `[^id]`,移除定义检查\n * \n * 🔑 关键修改:不检查 parser.gfmFootnotes,总是允许解析脚注引用\n * \n * @param effects - Token 生成器\n * @param ok - 成功时的状态函数\n * @param nok - 失败时的状态函数\n * @returns 起始状态函数\n */\nfunction tokenizeGfmFootnoteCallIncremental(\n this: TokenizeContext,\n effects: Parameters<Tokenizer>[0],\n ok: State,\n nok: State\n): State {\n const self = this\n let size = 0\n let data = false\n\n return start\n\n /**\n * 脚注引用起始位置\n * \n * ```markdown\n * > | a [^b] c\n * ^\n * ```\n */\n function start(code: Code): State | undefined {\n if (code !== codes.leftSquareBracket) {\n return nok(code)\n }\n\n effects.enter('gfmFootnoteCall')\n effects.enter('gfmFootnoteCallLabelMarker')\n effects.consume(code)\n effects.exit('gfmFootnoteCallLabelMarker')\n return callStart\n }\n\n /**\n * 在 `[` 之后,期望 `^`\n * \n * ```markdown\n * > | a [^b] c\n * ^\n * ```\n */\n function callStart(code: Code): State | undefined {\n if (code !== codes.caret) {\n return nok(code)\n }\n\n effects.enter('gfmFootnoteCallMarker')\n effects.consume(code)\n effects.exit('gfmFootnoteCallMarker')\n effects.enter('gfmFootnoteCallString')\n const token = effects.enter('chunkString')\n token.contentType = 'string'\n return callData\n }\n\n /**\n * 在脚注标识符中\n * \n * ```markdown\n * > | a [^b] c\n * ^\n * ```\n */\n function callData(code: Code): State | undefined {\n if (\n // 太长\n size > constants.linkReferenceSizeMax ||\n // 右括号但没有数据\n (code === codes.rightSquareBracket && !data) ||\n // EOF、换行、空格、制表符、左括号不支持\n code === codes.eof ||\n code === codes.leftSquareBracket ||\n markdownLineEndingOrSpace(code)\n ) {\n return nok(code)\n }\n\n if (code === codes.rightSquareBracket) {\n effects.exit('chunkString')\n effects.exit('gfmFootnoteCallString')\n\n // 🔑 关键修改:移除定义检查\n // 原始代码:\n // const token = effects.exit('gfmFootnoteCallString')\n // if (!defined.includes(normalizeIdentifier(self.sliceSerialize(token)))) {\n // return nok(code)\n // }\n\n effects.enter('gfmFootnoteCallLabelMarker')\n effects.consume(code)\n effects.exit('gfmFootnoteCallLabelMarker')\n effects.exit('gfmFootnoteCall')\n return ok\n }\n\n if (!markdownLineEndingOrSpace(code)) {\n data = true\n }\n\n size++\n effects.consume(code)\n return code === codes.backslash ? callEscape : callData\n }\n\n /**\n * 在转义字符之后\n * \n * ```markdown\n * > | a [^b\\c] d\n * ^\n * ```\n */\n function callEscape(code: Code): State | undefined {\n if (\n code === codes.leftSquareBracket ||\n code === codes.backslash ||\n code === codes.rightSquareBracket\n ) {\n effects.consume(code)\n size++\n return callData\n }\n\n return callData(code)\n }\n}\n\n/**\n * Tokenize 潜在的脚注引用 `![^id]`,移除定义检查\n * \n * 用于处理图片标记后的脚注引用(虽然这不是标准语法,但 GFM 会尝试解析)\n * \n * @param effects - Token 生成器\n * @param ok - 成功时的状态函数\n * @param nok - 失败时的状态函数\n * @returns 起始状态函数\n */\nfunction tokenizePotentialGfmFootnoteCallIncremental(\n this: TokenizeContext,\n effects: Parameters<Tokenizer>[0],\n ok: State,\n nok: State\n): State {\n const self = this\n let index = self.events.length\n let labelStart: any\n\n // 查找开始的 labelImage token\n while (index--) {\n const token = self.events[index][1]\n if (token.type === 'labelImage') {\n labelStart = token\n break\n }\n\n // 如果走得太远就退出\n if (\n token.type === 'gfmFootnoteCall' ||\n token.type === 'labelLink' ||\n token.type === 'label' ||\n token.type === 'image' ||\n token.type === 'link'\n ) {\n break\n }\n }\n\n return start\n\n function start(code: Code): State | undefined {\n if (code !== codes.rightSquareBracket) {\n return nok(code)\n }\n\n if (!labelStart || !labelStart._balanced) {\n return nok(code)\n }\n\n const id = normalizeIdentifier(\n self.sliceSerialize({\n start: labelStart.end,\n end: self.now()\n })\n )\n\n // 只检查是否以 ^ 开头,不检查定义是否存在\n if (id.codePointAt(0) !== codes.caret) {\n return nok(code)\n }\n\n // 🔑 关键修改:移除定义检查\n // 原始代码:\n // const defined = self.parser.gfmFootnotes || (self.parser.gfmFootnotes = [])\n // if (!defined.includes(id.slice(1))) {\n // return nok(code)\n // }\n\n effects.enter('gfmFootnoteCallLabelMarker')\n effects.consume(code)\n effects.exit('gfmFootnoteCallLabelMarker')\n return ok(code)\n }\n}\n\n","/**\n * 块类型检测与边界判断\n *\n * Markdown 块级元素的识别规则\n */\n\nimport type { BlockContext, ContainerConfig, ContainerMatch } from '../types'\n\n// ============ 预编译正则表达式(性能优化) ============\n\nconst RE_FENCE_START = /^(\\s*)((`{3,})|(~{3,}))/\nconst RE_EMPTY_LINE = /^\\s*$/\nconst RE_HEADING = /^#{1,6}\\s/\nconst RE_THEMATIC_BREAK = /^(\\*{3,}|-{3,}|_{3,})\\s*$/\nconst RE_UNORDERED_LIST = /^(\\s*)([-*+])\\s/\nconst RE_ORDERED_LIST = /^(\\s*)(\\d{1,9})[.)]\\s/\nconst RE_BLOCKQUOTE = /^\\s{0,3}>/\nconst RE_HTML_BLOCK_1 = /^\\s{0,3}<(script|pre|style|textarea|!--|!DOCTYPE|\\?|!\\[CDATA\\[)/i\nconst RE_HTML_BLOCK_2 = /^\\s{0,3}<\\/?[a-zA-Z][a-zA-Z0-9-]*(\\s|>|$)/\nconst RE_TABLE_DELIMITER = /^\\|?\\s*:?-{3,}:?\\s*(\\|\\s*:?-{3,}:?\\s*)*\\|?$/\nconst RE_ESCAPE_SPECIAL = /[.*+?^${}()|[\\]\\\\]/g\nconst RE_FOOTNOTE_DEFINITION = /^\\[\\^[^\\]]+\\]:\\s/\nconst RE_FOOTNOTE_CONTINUATION = /^(?: |\\t)/\n\n/** fence 结束模式缓存 */\nconst fenceEndPatternCache = new Map<string, RegExp>()\n\n/** 容器模式缓存 */\nconst containerPatternCache = new Map<string, RegExp>()\n\n// ============ 代码块检测 ============\n\n/**\n * 检测行是否是代码块 fence 开始\n */\nexport function detectFenceStart(line: string): { char: string; length: number } | null {\n const match = line.match(RE_FENCE_START)\n if (match) {\n const fence = match[2]\n const char = fence[0]\n return { char, length: fence.length }\n }\n return null\n}\n\n/**\n * 检测行是否是代码块 fence 结束\n */\nexport function detectFenceEnd(line: string, context: BlockContext): boolean {\n if (!context.inFencedCode || !context.fenceChar || !context.fenceLength) {\n return false\n }\n\n // 使用缓存的正则表达式\n const cacheKey = `${context.fenceChar}-${context.fenceLength}`\n let pattern = fenceEndPatternCache.get(cacheKey)\n if (!pattern) {\n pattern = new RegExp(`^\\\\s{0,3}${context.fenceChar}{${context.fenceLength},}\\\\s*$`)\n fenceEndPatternCache.set(cacheKey, pattern)\n }\n return pattern.test(line)\n}\n\n// ============ 行类型检测 ============\n\n/**\n * 检测是否是空行或仅包含空白字符\n */\nexport function isEmptyLine(line: string): boolean {\n return RE_EMPTY_LINE.test(line)\n}\n\n/**\n * 检测是否是标题行\n */\nexport function isHeading(line: string): boolean {\n return RE_HEADING.test(line)\n}\n\n/**\n * 检测是否是 thematic break(水平线)\n */\nexport function isThematicBreak(line: string): boolean {\n return RE_THEMATIC_BREAK.test(line.trim())\n}\n\n/**\n * 检测是否是列表项开始\n */\nexport function isListItemStart(line: string): { ordered: boolean; indent: number } | null {\n // 无序列表: - * +\n const unordered = line.match(RE_UNORDERED_LIST)\n if (unordered) {\n return { ordered: false, indent: unordered[1].length }\n }\n\n // 有序列表: 1. 2) 等\n const ordered = line.match(RE_ORDERED_LIST)\n if (ordered) {\n return { ordered: true, indent: ordered[1].length }\n }\n\n return null\n}\n\n/**\n * 检测是否是引用块开始\n */\nexport function isBlockquoteStart(line: string): boolean {\n return RE_BLOCKQUOTE.test(line)\n}\n\n/**\n * 检测是否是 HTML 块\n */\nexport function isHtmlBlock(line: string): boolean {\n return RE_HTML_BLOCK_1.test(line) || RE_HTML_BLOCK_2.test(line)\n}\n\n/**\n * 检测表格分隔行\n */\nexport function isTableDelimiter(line: string): boolean {\n return RE_TABLE_DELIMITER.test(line.trim())\n}\n\n// ============ 脚注检测 ============\n\n/**\n * 检测是否是脚注定义的起始行\n * 格式: [^id]: content\n * \n * @example\n * isFootnoteDefinitionStart('[^1]: 脚注内容') // true\n * isFootnoteDefinitionStart('[^note]: 内容') // true\n * isFootnoteDefinitionStart(' 缩进内容') // false\n */\nexport function isFootnoteDefinitionStart(line: string): boolean {\n return RE_FOOTNOTE_DEFINITION.test(line)\n}\n\n/**\n * 检测是否是脚注定义的延续行(缩进行)\n * 至少4个空格或1个tab\n * \n * @example\n * isFootnoteContinuation(' 第二行') // true\n * isFootnoteContinuation('\\t第二行') // true\n * isFootnoteContinuation(' 两个空格') // false\n */\nexport function isFootnoteContinuation(line: string): boolean {\n return RE_FOOTNOTE_CONTINUATION.test(line)\n}\n\n// ============ 容器检测 ============\n\n/**\n * 检测容器开始或结束\n *\n * 支持格式:\n * - ::: name 开始\n * - ::: name attr 开始(带属性)\n * - ::: 结束\n * - :::::: name 开始(更长的标记,用于嵌套)\n */\nexport function detectContainer(line: string, config?: ContainerConfig): ContainerMatch | null {\n const marker = config?.marker || ':'\n const minLength = config?.minMarkerLength || 3\n\n // 使用缓存的正则表达式\n const cacheKey = `${marker}-${minLength}`\n let pattern = containerPatternCache.get(cacheKey)\n if (!pattern) {\n const escapedMarker = marker.replace(RE_ESCAPE_SPECIAL, '\\\\$&')\n pattern = new RegExp(\n `^(\\\\s*)(${escapedMarker}{${minLength},})(?:\\\\s+(\\\\w[\\\\w-]*))?(?:\\\\s+(.*))?\\\\s*$`\n )\n containerPatternCache.set(cacheKey, pattern)\n }\n\n const match = line.match(pattern)\n if (!match) {\n return null\n }\n\n const markerLength = match[2].length\n const name = match[3] || ''\n const isEnd = !name && !match[4]\n\n if (!isEnd && config?.allowedNames && config.allowedNames.length > 0) {\n if (!config.allowedNames.includes(name)) {\n return null\n }\n }\n\n return { name, markerLength, isEnd }\n}\n\n/**\n * 检测容器结束\n */\nexport function detectContainerEnd(\n line: string,\n context: BlockContext,\n config?: ContainerConfig\n): boolean {\n if (!context.inContainer || !context.containerMarkerLength) {\n return false\n }\n\n const result = detectContainer(line, config)\n if (!result) {\n return false\n }\n\n return result.isEnd && result.markerLength >= context.containerMarkerLength\n}\n\n// ============ 边界检测 ============\n\n/**\n * 判断两行之间是否构成块边界\n */\nexport function isBlockBoundary(\n prevLine: string,\n currentLine: string,\n context: BlockContext\n): boolean {\n if (context.inFencedCode) {\n return detectFenceEnd(currentLine, context)\n }\n\n if (isEmptyLine(prevLine) && !isEmptyLine(currentLine)) {\n return true\n }\n\n if (isHeading(currentLine) && !isEmptyLine(prevLine)) {\n return true\n }\n\n if (isThematicBreak(currentLine)) {\n return true\n }\n\n if (detectFenceStart(currentLine)) {\n return true\n }\n\n return false\n}\n\n// ============ 上下文管理 ============\n\n/**\n * 创建初始上下文\n */\nexport function createInitialContext(): BlockContext {\n return {\n inFencedCode: false,\n listDepth: 0,\n blockquoteDepth: 0,\n inContainer: false,\n containerDepth: 0\n }\n}\n\n/**\n * 更新上下文(处理一行后)\n */\nexport function updateContext(\n line: string,\n context: BlockContext,\n containerConfig?: ContainerConfig | boolean\n): BlockContext {\n const newContext = { ...context }\n\n const containerCfg =\n containerConfig === true ? {} : containerConfig === false ? undefined : containerConfig\n\n // 代码块优先级最高\n if (context.inFencedCode) {\n if (detectFenceEnd(line, context)) {\n newContext.inFencedCode = false\n newContext.fenceChar = undefined\n newContext.fenceLength = undefined\n }\n return newContext\n }\n\n const fence = detectFenceStart(line)\n if (fence) {\n newContext.inFencedCode = true\n newContext.fenceChar = fence.char\n newContext.fenceLength = fence.length\n return newContext\n }\n\n // 容器处理\n if (containerCfg !== undefined) {\n if (context.inContainer) {\n if (detectContainerEnd(line, context, containerCfg)) {\n newContext.containerDepth = context.containerDepth - 1\n if (newContext.containerDepth === 0) {\n newContext.inContainer = false\n newContext.containerMarkerLength = undefined\n newContext.containerName = undefined\n }\n return newContext\n }\n\n const nested = detectContainer(line, containerCfg)\n if (nested && !nested.isEnd) {\n newContext.containerDepth = context.containerDepth + 1\n return newContext\n }\n } else {\n const container = detectContainer(line, containerCfg)\n if (container && !container.isEnd) {\n newContext.inContainer = true\n newContext.containerMarkerLength = container.markerLength\n newContext.containerName = container.name\n newContext.containerDepth = 1\n return newContext\n }\n }\n }\n\n return newContext\n}\n\n","/**\n * 工具函数\n */\n\nimport type { Definition, FootnoteDefinition, RootContent } from \"mdast\"\n\n/**\n * 生成唯一 ID\n */\nlet idCounter = 0\nexport function generateId(prefix = 'block'): string {\n return `${prefix}-${++idCounter}`\n}\n\n/**\n * 重置 ID 计数器(用于测试)\n */\nexport function resetIdCounter(): void {\n idCounter = 0\n}\n\n/**\n * 计算行的偏移量\n */\nexport function calculateLineOffset(lines: string[], lineIndex: number): number {\n let offset = 0\n for (let i = 0; i < lineIndex && i < lines.length; i++) {\n offset += lines[i].length + 1 // +1 for newline\n }\n return offset\n}\n\n/**\n * 将文本按行分割\n */\nexport function splitLines(text: string): string[] {\n return text.split('\\n')\n}\n\n/**\n * 合并行为文本\n */\nexport function joinLines(lines: string[], start: number, end: number): string {\n return lines.slice(start, end + 1).join('\\n')\n}\n\nexport function isDefinitionNode(node: RootContent): node is Definition {\n return node.type === 'definition'\n}\n\nexport function isFootnoteDefinitionNode(node: RootContent): node is FootnoteDefinition {\n return node.type === 'footnoteDefinition'\n}","/**\n * 增量 Markdown 解析器\n *\n * 设计思路:\n * 1. 维护一个文本缓冲区,接收流式输入\n * 2. 识别\"稳定边界\"(如空行、标题等),将已完成的块标记为 completed\n * 3. 对于正在接收的块,每次重新解析,但只解析该块的内容\n * 4. 复杂嵌套节点(如列表、引用)作为整体处理,直到确认完成\n */\n\nimport { fromMarkdown } from 'mdast-util-from-markdown'\nimport { gfmFromMarkdown } from 'mdast-util-gfm'\nimport { gfm } from 'micromark-extension-gfm'\nimport { gfmFootnoteFromMarkdown } from 'mdast-util-gfm-footnote'\nimport type { Extension as MicromarkExtension } from 'micromark-util-types'\nimport type { Extension as MdastExtension } from 'mdast-util-from-markdown'\n\nimport type {\n Root,\n RootContent,\n ParsedBlock,\n IncrementalUpdate,\n ParserOptions,\n BlockStatus,\n BlockContext,\n ContainerConfig,\n ParserState\n} from '../types'\n\nimport { transformHtmlNodes, type HtmlTreeExtensionOptions } from '../extensions/html-extension'\nimport { micromarkReferenceExtension } from '../extensions/micromark-reference-extension'\nimport { gfmFootnoteIncremental } from '../extensions/micromark-gfm-footnote-incremental'\nimport type { HTML, Paragraph, Text, Parent as MdastParent, Definition, FootnoteDefinition } from 'mdast'\nimport type { DefinitionMap, FootnoteDefinitionMap } from '../types'\n\nimport {\n createInitialContext,\n updateContext,\n isEmptyLine,\n detectFenceStart,\n isHeading,\n isThematicBreak,\n isBlockquoteStart,\n isListItemStart,\n detectContainer,\n isFootnoteDefinitionStart,\n isFootnoteContinuation\n} from '../detector'\nimport { isDefinitionNode, isFootnoteDefinitionNode } from '../utils'\n\n// ============ 解析器类 ============\n\nexport class IncremarkParser {\n private buffer = ''\n private lines: string[] = []\n /** 行偏移量前缀和:lineOffsets[i] = 第i行起始位置的偏移量 */\n private lineOffsets: number[] = [0]\n private completedBlocks: ParsedBlock[] = []\n private pendingStartLine = 0\n private blockIdCounter = 0\n private context: BlockContext\n private options: ParserOptions\n /** 缓存的容器配置,避免重复计算 */\n private readonly containerConfig: ContainerConfig | undefined\n /** 缓存的 HTML 树配置,避免重复计算 */\n private readonly htmlTreeConfig: HtmlTreeExtensionOptions | undefined\n /** 上次 append 返回的 pending blocks,用于 getAst 复用 */\n private lastPendingBlocks: ParsedBlock[] = []\n /** Definition 映射表(用于引用式图片和链接) */\n private definitionMap: DefinitionMap = {}\n /** Footnote Definition 映射表 */\n private footnoteDefinitionMap: FootnoteDefinitionMap = {}\n /** Footnote Reference 出现顺序(按引用在文档中的顺序) */\n private footnoteReferenceOrder: string[] = []\n\n constructor(options: ParserOptions = {}) {\n this.options = {\n gfm: true,\n ...options\n }\n this.context = createInitialContext()\n // 初始化容器配置(构造时计算一次)\n this.containerConfig = this.computeContainerConfig()\n // 初始化 HTML 树配置\n this.htmlTreeConfig = this.computeHtmlTreeConfig()\n }\n\n private generateBlockId(): string {\n return `block-${++this.blockIdCounter}`\n }\n\n private computeContainerConfig(): ContainerConfig | undefined {\n const containers = this.options.containers\n if (!containers) return undefined\n return containers === true ? {} : containers\n }\n\n private computeHtmlTreeConfig(): HtmlTreeExtensionOptions | undefined {\n const htmlTree = this.options.htmlTree\n if (!htmlTree) return undefined\n return htmlTree === true ? {} : htmlTree\n }\n\n /**\n * 将 HTML 节点转换为纯文本\n * 递归处理 AST 中所有 html 类型的节点\n * - 块级 HTML 节点 → 转换为 paragraph 包含 text\n * - 内联 HTML 节点(在段落内部)→ 转换为 text 节点\n */\n private convertHtmlToText(ast: Root): Root {\n // 处理内联节点(段落内部的 children)\n const processInlineChildren = (children: unknown[]): unknown[] => {\n return children.map(node => {\n const n = node as RootContent\n // 内联 html 节点转换为纯文本节点\n if (n.type === 'html') {\n const htmlNode = n as HTML\n const textNode: Text = {\n type: 'text',\n value: htmlNode.value,\n position: htmlNode.position\n }\n return textNode\n }\n \n // 递归处理有 children 的内联节点(如 strong, emphasis 等)\n if ('children' in n && Array.isArray(n.children)) {\n const parent = n as MdastParent\n return {\n ...parent,\n children: processInlineChildren(parent.children)\n }\n }\n \n return n\n })\n }\n\n // 处理块级节点\n const processBlockChildren = (children: RootContent[]): RootContent[] => {\n return children.map(node => {\n // 块级 html 节点转换为段落包含纯文本\n if (node.type === 'html') {\n const htmlNode = node as HTML\n const textNode: Text = {\n type: 'text',\n value: htmlNode.value\n }\n const paragraphNode: Paragraph = {\n type: 'paragraph',\n children: [textNode],\n position: htmlNode.position\n }\n return paragraphNode as RootContent\n }\n \n // 递归处理有 children 的块级节点\n if ('children' in node && Array.isArray(node.children)) {\n const parent = node as MdastParent\n // 对于段落等内联容器,使用 processInlineChildren\n if (node.type === 'paragraph' || node.type === 'heading' || \n node.type === 'tableCell' || node.type === 'delete' ||\n node.type === 'emphasis' || node.type === 'strong' ||\n node.type === 'link' || node.type === 'linkReference') {\n return {\n ...parent,\n children: processInlineChildren(parent.children)\n } as RootContent\n }\n // 对于其他块级容器,递归处理\n return {\n ...parent,\n children: processBlockChildren(parent.children as RootContent[])\n } as RootContent\n }\n \n return node\n })\n }\n \n return {\n ...ast,\n children: processBlockChildren(ast.children)\n }\n }\n\n private parse(text: string): Root {\n const extensions: MicromarkExtension[] = []\n const mdastExtensions: MdastExtension[] = []\n\n // 先添加 GFM(包含原始的脚注扩展)\n if (this.options.gfm) {\n extensions.push(gfm())\n mdastExtensions.push(...gfmFromMarkdown(), gfmFootnoteFromMarkdown())\n }\n\n // 如果用户传入了自定义扩展,添加它们\n if (this.options.extensions) {\n extensions.push(...this.options.extensions)\n }\n if (this.options.mdastExtensions) {\n mdastExtensions.push(...this.options.mdastExtensions)\n }\n\n // 添加增量脚注扩展,覆盖 GFM 脚注的定义检查\n // ⚠️ 必须在 micromarkReferenceExtension 之前添加\n // 因为 micromarkReferenceExtension 会拦截 `]`,并将 `[^1]` 交给脚注扩展处理\n if (this.options.gfm) {\n extensions.push(gfmFootnoteIncremental())\n }\n \n // 添加 reference 扩展(支持增量解析),覆盖 commonmark 的 labelEnd\n // ⚠️ 必须最后添加,确保它能拦截 `]` 并正确处理脚注\n extensions.push(micromarkReferenceExtension())\n\n // 生成 AST\n let ast = fromMarkdown(text, { extensions, mdastExtensions })\n \n // 如果启用了 HTML 树转换,应用转换\n if (this.htmlTreeConfig) {\n ast = transformHtmlNodes(ast, this.htmlTreeConfig)\n } else {\n // 如果未启用 HTML 树,将 HTML 节点转换为纯文本\n ast = this.convertHtmlToText(ast)\n }\n \n return ast\n }\n\n private updateDefinationsFromComplatedBlocks(blocks: ParsedBlock[]): void{\n for (const block of blocks) {\n this.definitionMap = {\n ...this.definitionMap,\n ...this.findDefinition(block)\n }\n\n this.footnoteDefinitionMap = {\n ...this.footnoteDefinitionMap,\n ...this.findFootnoteDefinition(block)\n }\n }\n }\n\n private findDefinition(block: ParsedBlock): DefinitionMap {\n const definitions: Definition[] = [];\n\n function findDefination(node: RootContent) {\n if (isDefinitionNode(node)) {\n definitions.push(node as Definition);\n }\n \n if ('children' in node && Array.isArray(node.children)) {\n for (const child of node.children) {\n findDefination(child as RootContent);\n }\n }\n }\n\n findDefination(block.node);\n \n return definitions.reduce<DefinitionMap>((acc, node) => {\n acc[node.identifier] = node;\n return acc;\n }, {});\n\n }\n\n private findFootnoteDefinition(block: ParsedBlock): FootnoteDefinitionMap {\n const footnoteDefinitions: FootnoteDefinition[] = [];\n\n function findFootnoteDefinition(node: RootContent) {\n if (isFootnoteDefinitionNode(node)) {\n footnoteDefinitions.push(node as FootnoteDefinition);\n }\n }\n\n findFootnoteDefinition(block.node);\n\n return footnoteDefinitions.reduce<FootnoteDefinitionMap>((acc, node) => {\n acc[node.identifier] = node;\n return acc;\n }, {});\n }\n\n /**\n * 收集 AST 中的脚注引用(按出现顺序)\n * 用于确定脚注的显示顺序\n */\n private collectFootnoteReferences(nodes: RootContent[]): void {\n const visitNode = (node: any): void => {\n if (!node) return\n\n // 检查是否是脚注引用\n if (node.type === 'footnoteReference') {\n const identifier = node.identifier\n // 去重:只记录第一次出现的位置\n if (!this.footnoteReferenceOrder.includes(identifier)) {\n this.footnoteReferenceOrder.push(identifier)\n }\n }\n\n // 递归遍历子节点\n if (node.children && Array.isArray(node.children)) {\n node.children.forEach(visitNode)\n }\n }\n\n nodes.forEach(visitNode)\n }\n\n /**\n * 增量更新 lines 和 lineOffsets\n * 只处理新增的内容,避免全量 split\n */\n private updateLines(): void {\n const prevLineCount = this.lines.length\n\n if (prevLineCount === 0) {\n // 首次输入,直接 split\n this.lines = this.buffer.split('\\n')\n this.lineOffsets = [0]\n for (let i = 0; i < this.lines.length; i++) {\n this.lineOffsets.push(this.lineOffsets[i] + this.lines[i].length + 1)\n }\n return\n }\n\n // 找到最后一个不完整的行(可能被新 chunk 续上)\n const lastLineStart = this.lineOffsets[prevLineCount - 1]\n const textFromLastLine = this.buffer.slice(lastLineStart)\n\n // 重新 split 最后一行及之后的内容\n const newLines = textFromLastLine.split('\\n')\n\n // 替换最后一行并追加新行\n this.lines.length = prevLineCount - 1\n this.lineOffsets.length = prevLineCount\n\n for (let i = 0; i < newLines.length; i++) {\n this.lines.push(newLines[i])\n const prevOffset = this.lineOffsets[this.lineOffsets.length - 1]\n this.lineOffsets.push(prevOffset + newLines[i].length + 1)\n }\n }\n\n /**\n * O(1) 获取行偏移量\n */\n private getLineOffset(lineIndex: number): number {\n return this.lineOffsets[lineIndex] ?? 0\n }\n\n /**\n * 查找稳定边界\n * 返回稳定边界行号和该行对应的上下文(用于后续更新,避免重复计算)\n */\n private findStableBoundary(): { line: number; contextAtLine: BlockContext } {\n let stableLine = -1\n let stableContext: BlockContext = this.context\n let tempContext = { ...this.context }\n\n for (let i = this.pendingStartLine; i < this.lines.length; i++) {\n const line = this.lines[i]\n const wasInFencedCode = tempContext.inFencedCode\n const wasInContainer = tempContext.inContainer\n const wasContainerDepth = tempContext.containerDepth\n\n tempContext = updateContext(line, tempContext, this.containerConfig)\n\n if (wasInFencedCode && !tempContext.inFencedCode) {\n if (i < this.lines.length - 1) {\n stableLine = i\n stableContext = { ...tempContext }\n }\n continue\n }\n\n if (tempContext.inFencedCode) {\n continue\n }\n\n if (wasInContainer && wasContainerDepth === 1 && !tempContext.inContainer) {\n if (i < this.lines.length - 1) {\n stableLine = i\n stableContext = { ...tempContext }\n }\n continue\n }\n\n if (tempContext.inContainer) {\n continue\n }\n\n const stablePoint = this.checkStability(i)\n if (stablePoint >= 0) {\n stableLine = stablePoint\n stableContext = { ...tempContext }\n }\n }\n\n return { line: stableLine, contextAtLine: stableContext }\n }\n\n private checkStability(lineIndex: number): number {\n // 第一行永远不稳定\n if (lineIndex === 0) {\n return -1\n }\n\n const line = this.lines[lineIndex]\n const prevLine = this.lines[lineIndex - 1]\n\n // 前一行是独立块(标题、分割线),该块已完成\n if (isHeading(prevLine) || isThematicBreak(prevLine)) {\n return lineIndex - 1\n }\n\n // 最后一行不稳定(可能还有更多内容)\n if (lineIndex >= this.lines.length - 1) {\n return -1\n }\n\n // ============ 脚注定义的特殊处理 ============\n \n // 情况 1: 前一行是脚注定义开始\n if (isFootnoteDefinitionStart(prevLine)) {\n // 当前行是空行或缩进行,脚注可能继续(不稳定)\n if (isEmptyLine(line) || isFootnoteContinuation(line)) {\n return -1\n }\n // 当前行是新脚注定义,前一个脚注完成\n if (isFootnoteDefinitionStart(line)) {\n return lineIndex - 1\n }\n // 当前行是非缩进的新块,前一个脚注完成\n // 这种情况会在后续的判断中处理\n }\n \n // 情况 2: 前一行是缩进行,可能是脚注延续\n if (!isEmptyLine(prevLine) && isFootnoteContinuation(prevLine)) {\n // 向上查找最近的脚注定义\n const footnoteStartLine = this.findFootnoteStart(lineIndex - 1)\n if (footnoteStartLine >= 0) {\n // 确认属于脚注定义\n // 当前行仍然是缩进或空行,脚注继续(不稳定)\n if (isEmptyLine(line) || isFootnoteContinuation(line)) {\n return -1\n }\n // 当前行是新脚注定义,前一个脚注完成\n if (isFootnoteDefinitionStart(line)) {\n return lineIndex - 1\n }\n // 当前行是非缩进的新块,前一个脚注完成\n return lineIndex - 1\n }\n }\n\n // 前一行非空时,如果当前行是新块开始,则前一块已完成\n if (!isEmptyLine(prevLine)) {\n // 新脚注定义开始(排除连续脚注定义)\n if (isFootnoteDefinitionStart(line) && !isFootnoteDefinitionStart(prevLine)) {\n return lineIndex - 1\n }\n\n // 新标题开始\n if (isHeading(line)) {\n return lineIndex - 1\n }\n\n // 新代码块开始\n if (detectFenceStart(line)) {\n return lineIndex - 1\n }\n\n // 新引用块开始(排除连续引用)\n if (isBlockquoteStart(line) && !isBlockquoteStart(prevLine)) {\n return lineIndex - 1\n }\n\n // 新列表开始(排除连续列表项)\n if (isListItemStart(line) && !isListItemStart(prevLine)) {\n return lineIndex - 1\n }\n\n // 新容器开始\n if (this.containerConfig !== undefined) {\n const container = detectContainer(line, this.containerConfig)\n if (container && !container.isEnd) {\n const prevContainer = detectContainer(prevLine, this.containerConfig)\n if (!prevContainer || prevContainer.isEnd) {\n return lineIndex - 1\n }\n }\n }\n }\n\n // 空行标志段落结束\n if (isEmptyLine(line) && !isEmptyLine(prevLine)) {\n return lineIndex\n }\n\n return -1\n }\n\n /**\n * 从指定行向上查找脚注定义的起始行\n * \n * @param fromLine 开始查找的行索引\n * @returns 脚注起始行索引,如果不属于脚注返回 -1\n * \n * @example\n * // 假设 lines 为:\n * // 0: \"[^1]: 第一行\"\n * // 1: \" 第二行\"\n * // 2: \" 第三行\"\n * findFootnoteStart(2) // 返回 0\n * findFootnoteStart(1) // 返回 0\n */\n private findFootnoteStart(fromLine: number): number {\n // 限制向上查找的最大行数,避免性能问题\n const maxLookback = 20\n const startLine = Math.max(0, fromLine - maxLookback)\n \n for (let i = fromLine; i >= startLine; i--) {\n const line = this.lines[i]\n \n // 遇到脚注定义起始行\n if (isFootnoteDefinitionStart(line)) {\n return i\n }\n \n // 遇到空行,继续向上查找(可能是脚注内部的段落分隔)\n if (isEmptyLine(line)) {\n continue\n }\n \n // 遇到非缩进的普通行,说明不属于脚注\n if (!isFootnoteContinuation(line)) {\n return -1\n }\n }\n \n return -1\n }\n\n private nodesToBlocks(\n nodes: RootContent[],\n startOffset: number,\n rawText: string,\n status: BlockStatus\n ): ParsedBlock[] {\n const blocks: ParsedBlock[] = []\n let currentOffset = startOffset\n\n for (const node of nodes) {\n const nodeStart = node.position?.start?.offset ?? currentOffset\n const nodeEnd = node.position?.end?.offset ?? currentOffset + 1\n const nodeText = rawText.substring(nodeStart - startOffset, nodeEnd - startOffset)\n\n blocks.push({\n id: this.generateBlockId(),\n status,\n node,\n startOffset: nodeStart,\n endOffset: nodeEnd,\n rawText: nodeText\n })\n\n currentOffset = nodeEnd\n }\n\n return blocks\n }\n\n /**\n * 追加新的 chunk 并返回增量更新\n */\n append(chunk: string): IncrementalUpdate {\n this.buffer += chunk\n this.updateLines()\n\n const { line: stableBoundary, contextAtLine } = this.findStableBoundary()\n\n const update: IncrementalUpdate = {\n completed: [],\n updated: [],\n pending: [],\n ast: { type: 'root', children: [] },\n definitions: {},\n footnoteDefinitions: {},\n footnoteReferenceOrder: []\n }\n\n if (stableBoundary >= this.pendingStartLine && stableBoundary >= 0) {\n const stableText = this.lines.slice(this.pendingStartLine, stableBoundary + 1).join('\\n')\n const stableOffset = this.getLineOffset(this.pendingStartLine)\n\n const ast = this.parse(stableText)\n const newBlocks = this.nodesToBlocks(ast.children, stableOffset, stableText, 'completed')\n\n this.completedBlocks.push(...newBlocks)\n update.completed = newBlocks\n\n // 更新 definitions 从新完成的 blocks\n this.updateDefinationsFromComplatedBlocks(newBlocks)\n\n // 直接使用 findStableBoundary 计算好的上下文,避免重复遍历\n this.context = contextAtLine\n this.pendingStartLine = stableBoundary + 1\n }\n\n if (this.pendingStartLine < this.lines.length) {\n const pendingText = this.lines.slice(this.pendingStartLine).join('\\n')\n\n if (pendingText.trim()) {\n const pendingOffset = this.getLineOffset(this.pendingStartLine)\n const ast = this.parse(pendingText)\n\n update.pending = this.nodesToBlocks(ast.children, pendingOffset, pendingText, 'pending')\n }\n }\n\n // 缓存 pending blocks 供 getAst 使用\n this.lastPendingBlocks = update.pending\n\n update.ast = {\n type: 'root',\n children: [...this.completedBlocks.map((b) => b.node), ...update.pending.map((b) => b.node)]\n }\n\n // 收集脚注引用顺序\n this.collectFootnoteReferences(update.ast.children)\n\n // 填充 definitions 和 footnote 相关数据\n update.definitions = this.getDefinitionMap()\n update.footnoteDefinitions = this.getFootnoteDefinitionMap()\n update.footnoteReferenceOrder = this.getFootnoteReferenceOrder()\n\n // 触发状态变化回调\n this.emitChange(update.pending)\n\n return update\n }\n\n /**\n * 触发状态变化回调\n */\n private emitChange(pendingBlocks: ParsedBlock[] = []): void {\n if (this.options.onChange) {\n const state: ParserState = {\n completedBlocks: this.completedBlocks,\n pendingBlocks,\n markdown: this.buffer,\n ast: {\n type: 'root',\n children: [\n ...this.completedBlocks.map((b) => b.node),\n ...pendingBlocks.map((b) => b.node)\n ]\n },\n definitions: { ...this.definitionMap },\n footnoteDefinitions: { ...this.footnoteDefinitionMap }\n }\n this.options.onChange(state)\n }\n }\n\n /**\n * 标记解析完成,处理剩余内容\n * 也可用于强制中断时(如用户点击停止),将 pending 内容标记为 completed\n */\n finalize(): IncrementalUpdate {\n const update: IncrementalUpdate = {\n completed: [],\n updated: [],\n pending: [],\n ast: { type: 'root', children: [] },\n definitions: {},\n footnoteDefinitions: {},\n footnoteReferenceOrder: []\n }\n\n if (this.pendingStartLine < this.lines.length) {\n const remainingText = this.lines.slice(this.pendingStartLine).join('\\n')\n\n if (remainingText.trim()) {\n const remainingOffset = this.getLineOffset(this.pendingStartLine)\n const ast = this.parse(remainingText)\n\n const finalBlocks = this.nodesToBlocks(\n ast.children,\n remainingOffset,\n remainingText,\n 'completed'\n )\n\n this.completedBlocks.push(...finalBlocks)\n update.completed = finalBlocks\n\n // 更新 definitions 从最终完成的 blocks\n this.updateDefinationsFromComplatedBlocks(finalBlocks)\n }\n }\n\n // 清空 pending 缓存\n this.lastPendingBlocks = []\n this.pendingStartLine = this.lines.length\n\n update.ast = {\n type: 'root',\n children: this.completedBlocks.map((b) => b.node)\n }\n\n // 收集脚注引用顺序\n this.collectFootnoteReferences(update.ast.children)\n\n // 填充 definitions 和 footnote 相关数据\n update.definitions = this.getDefinitionMap()\n update.footnoteDefinitions = this.getFootnoteDefinitionMap()\n update.footnoteReferenceOrder = this.getFootnoteReferenceOrder()\n\n // 触发状态变化回调\n this.emitChange([])\n\n return update\n }\n\n /**\n * 强制中断解析,将所有待处理内容标记为完成\n * 语义上等同于 finalize(),但名称更清晰\n */\n abort(): IncrementalUpdate {\n return this.finalize()\n }\n\n /**\n * 获取当前完整的 AST\n * 复用上次 append 的 pending 结果,避免重复解析\n */\n getAst(): Root {\n const children = [\n ...this.completedBlocks.map((b) => b.node),\n ...this.lastPendingBlocks.map((b) => b.node)\n ]\n\n // 收集脚注引用顺序\n this.collectFootnoteReferences(children)\n\n return {\n type: 'root',\n children\n }\n }\n\n /**\n * 获取所有已完成的块\n */\n getCompletedBlocks(): ParsedBlock[] {\n return [...this.completedBlocks]\n }\n\n /**\n * 获取当前缓冲区内容\n */\n getBuffer(): string {\n return this.buffer\n }\n\n /**\n * 获取 Definition 映射表(用于引用式图片和链接)\n */\n getDefinitionMap(): DefinitionMap {\n return { ...this.definitionMap }\n }\n\n /**\n * 获取 Footnote Definition 映射表\n */\n getFootnoteDefinitionMap(): FootnoteDefinitionMap {\n return { ...this.footnoteDefinitionMap }\n }\n\n /**\n * 获取脚注引用的出现顺序\n */\n getFootnoteReferenceOrder(): string[] {\n return [...this.footnoteReferenceOrder]\n }\n\n /**\n * 设置状态变化回调(用于 DevTools 等)\n */\n setOnChange(callback: ((state: import('../types').ParserState) => void) | undefined): void {\n const originalOnChange = this.options.onChange;\n this.options.onChange = (state: ParserState) => {\n originalOnChange?.(state);\n callback?.(state);\n }\n }\n\n /**\n * 重置解析器状态\n */\n reset(): void {\n this.buffer = ''\n this.lines = []\n this.lineOffsets = [0]\n this.completedBlocks = []\n this.pendingStartLine = 0\n this.blockIdCounter = 0\n this.context = createInitialContext()\n this.lastPendingBlocks = []\n // 清空 definition 映射\n this.definitionMap = {}\n this.footnoteDefinitionMap = {}\n this.footnoteReferenceOrder = []\n\n // 触发状态变化回调\n this.emitChange([])\n }\n\n /**\n * 一次性渲染完整 Markdown(reset + append + finalize)\n * @param content 完整的 Markdown 内容\n * @returns 解析结果\n */\n render(content: string): IncrementalUpdate {\n this.reset()\n this.append(content)\n return this.finalize()\n }\n}\n\n/**\n * 创建 Incremark 解析器实例\n */\nexport function createIncremarkParser(options?: ParserOptions): IncremarkParser {\n return new IncremarkParser(options)\n}\n","import type { RootContent, Text } from 'mdast'\nimport type { AstNode } from '../types'\n\n/**\n * 文本块片段(用于渐入动画)\n */\nexport interface TextChunk {\n /** 文本内容 */\n text: string\n /** 创建时间戳 */\n createdAt: number\n}\n\n/**\n * 扩展的文本节点(支持 chunks)\n */\nexport interface TextNodeWithChunks extends Text {\n /** 稳定部分的长度(不需要动画) */\n stableLength?: number\n /** 临时的文本片段,用于渐入动画 */\n chunks?: TextChunk[]\n}\n\n/**\n * 计算 AST 节点的总字符数\n */\nexport function countChars(node: RootContent): number {\n return countCharsInNode(node as AstNode)\n}\n\n/**\n * 计算单个 AST 节点的字符数(内部辅助函数)\n */\nfunction countCharsInNode(n: AstNode): number {\n if (n.value && typeof n.value === 'string') {\n return n.value.length\n }\n if (n.children && Array.isArray(n.children)) {\n let count = 0\n for (const child of n.children) {\n count += countCharsInNode(child)\n }\n return count\n }\n // 其他节点(如 thematicBreak, image)算作 1 个字符\n return 1\n}\n\n/**\n * 累积的 chunks 信息\n */\nexport interface AccumulatedChunks {\n /** 已经稳定显示的字符数(不需要动画) */\n stableChars: number\n /** 累积的 chunk 列表 */\n chunks: TextChunk[]\n}\n\n/** chunk 范围信息 */\ninterface ChunkRange {\n start: number\n end: number\n chunk: TextChunk\n}\n\n/**\n * 截断 AST 节点,只保留前 maxChars 个字符\n * 支持 chunks(用于渐入动画)\n * 支持增量模式:跳过已处理的字符,只处理新增部分\n * \n * @param node 原始节点\n * @param maxChars 最大字符数\n * @param accumulatedChunks 累积的 chunks 信息(用于渐入动画)\n * @param skipChars 跳过前 N 个字符(已处理的部分,用于增量追加)\n * @returns 截断后的节点,如果 maxChars <= 0 返回 null\n */\nexport function sliceAst(\n node: RootContent, \n maxChars: number,\n accumulatedChunks?: AccumulatedChunks,\n skipChars: number = 0\n): RootContent | null {\n if (maxChars <= 0) return null\n if (skipChars >= maxChars) return null\n\n let remaining = maxChars - skipChars // 只处理新增部分\n let charIndex = 0\n \n // 计算 chunks 在文本中的范围\n const chunkRanges: ChunkRange[] = []\n if (accumulatedChunks && accumulatedChunks.chunks.length > 0) {\n let chunkStart = accumulatedChunks.stableChars\n for (const chunk of accumulatedChunks.chunks) {\n chunkRanges.push({\n start: chunkStart,\n end: chunkStart + chunk.text.length,\n chunk\n })\n chunkStart += chunk.text.length\n }\n }\n\n function process(n: AstNode): AstNode | null {\n if (remaining <= 0) return null\n\n // 文本类节点:截断 value,可能添加 chunks\n if (n.value && typeof n.value === 'string') {\n const nodeStart = charIndex\n const nodeEnd = charIndex + n.value.length\n \n // 如果整个节点都在 skipChars 之前,跳过\n if (nodeEnd <= skipChars) {\n charIndex = nodeEnd\n return null\n }\n \n // 如果节点跨越 skipChars,需要从 skipChars 位置开始取\n const skipInNode = Math.max(0, skipChars - nodeStart)\n const take = Math.min(n.value.length - skipInNode, remaining)\n remaining -= take\n if (take === 0) return null\n\n const slicedValue = n.value.slice(skipInNode, skipInNode + take)\n charIndex = nodeEnd\n \n const result: AstNode & { stableLength?: number; chunks?: TextChunk[] } = { \n ...n, \n value: slicedValue \n }\n \n // 检查是否有 chunks 落在这个节点范围内\n if (chunkRanges.length > 0 && accumulatedChunks) {\n const nodeChunks: TextChunk[] = []\n let firstChunkLocalStart = take // 第一个 chunk 在节点中的起始位置\n \n for (const range of chunkRanges) {\n // 计算 chunk 与当前节点的交集(考虑 skipChars)\n const overlapStart = Math.max(range.start, nodeStart + skipInNode)\n const overlapEnd = Math.min(range.end, nodeStart + skipInNode + take)\n \n if (overlapStart < overlapEnd) {\n // 有交集,提取对应的文本(相对于 slicedValue)\n const localStart = overlapStart - (nodeStart + skipInNode)\n const localEnd = overlapEnd - (nodeStart + skipInNode)\n const chunkText = slicedValue.slice(localStart, localEnd)\n \n if (chunkText.length > 0) {\n // 记录第一个 chunk 的起始位置\n if (nodeChunks.length === 0) {\n firstChunkLocalStart = localStart\n }\n nodeChunks.push({\n text: chunkText,\n createdAt: range.chunk.createdAt\n })\n }\n }\n }\n \n if (nodeChunks.length > 0) {\n result.stableLength = firstChunkLocalStart\n result.chunks = nodeChunks\n }\n }\n \n return result\n }\n\n // 容器节点:递归处理 children\n if (n.children && Array.isArray(n.children)) {\n const newChildren: AstNode[] = []\n let childCharIndex = charIndex\n \n for (const child of n.children) {\n if (remaining <= 0) break\n \n // 计算子节点的字符范围\n const childChars = countCharsInNode(child as AstNode)\n const childStart = childCharIndex\n const childEnd = childCharIndex + childChars\n \n // 如果子节点完全在 skipChars 之前,跳过\n if (childEnd <= skipChars) {\n childCharIndex = childEnd\n continue\n }\n \n // 如果子节点跨越 skipChars,需要处理\n // 临时更新 charIndex 以便子节点正确处理 skipChars\n const savedCharIndex = charIndex\n charIndex = childStart\n const processed = process(child)\n charIndex = savedCharIndex\n \n if (processed) {\n newChildren.push(processed)\n }\n \n childCharIndex = childEnd\n }\n \n if (newChildren.length === 0) {\n return null\n }\n return { ...n, children: newChildren }\n }\n\n // 其他节点(如 thematicBreak, image)\n remaining -= 1\n charIndex += 1\n return { ...n }\n }\n\n return process(node as AstNode) as RootContent | null\n}\n\n/**\n * 增量追加:将新增的字符范围追加到现有的 displayNode\n * 这是真正的增量追加实现,只处理新增部分,不重复遍历已稳定的节点\n * \n * @param baseNode 已截断的基础节点(稳定的部分)\n * @param sourceNode 原始完整节点\n * @param startChars 起始字符位置(已处理的字符数)\n * @param endChars 结束字符位置(新的进度)\n * @param accumulatedChunks 累积的 chunks 信息(用于渐入动画)\n * @returns 追加后的完整节点\n */\nexport function appendToAst(\n baseNode: RootContent,\n sourceNode: RootContent,\n startChars: number,\n endChars: number,\n accumulatedChunks?: AccumulatedChunks\n): RootContent {\n // 如果新增字符数为 0,直接返回 baseNode\n if (endChars <= startChars) {\n return baseNode\n }\n\n // 从 sourceNode 中提取新增的字符范围(跳过已处理的部分)\n const newChars = endChars - startChars\n const newPart = sliceAst(sourceNode, endChars, accumulatedChunks, startChars)\n \n // 如果提取失败,返回 baseNode\n if (!newPart) {\n return baseNode\n }\n\n // 将新增部分合并到 baseNode\n return mergeAstNodes(baseNode, newPart)\n}\n\n/**\n * 合并两个 AST 节点\n * 将 newPart 追加到 baseNode 的最后一个可追加节点中\n */\nfunction mergeAstNodes(baseNode: RootContent, newPart: RootContent): RootContent {\n // 如果两个节点类型不同,无法合并,返回 baseNode\n if (baseNode.type !== newPart.type) {\n return baseNode\n }\n\n const base = baseNode as AstNode\n const part = newPart as AstNode\n\n // 如果是文本节点,合并文本和 chunks\n if (base.value && typeof base.value === 'string' && part.value && typeof part.value === 'string') {\n const baseChunks = (base as TextNodeWithChunks).chunks || []\n const partChunks = (part as TextNodeWithChunks).chunks || []\n \n // 合并所有 chunks:累积所有读取的 chunks\n // chunks 数组包含每次读取的新文本片段,它们 join 到一起就是 value\n const mergedChunks = [...baseChunks, ...partChunks]\n \n // 根据设计:value = stableText + chunks[0].text + chunks[1].text + ... + chunks[n].text\n // base.value = baseStableText + baseChunks[0].text + ... + baseChunks[n].text\n // part.value = partStableText + partChunks[0].text + ... + partChunks[m].text\n // 合并后:value = base.value + part.value(完整文本)\n const mergedValue = base.value + part.value\n \n // stableLength 是稳定部分的长度(不需要动画的部分)\n // base 的稳定部分保持不变,base 的 chunks 和 part 的 chunks 都需要动画\n const baseStableLength = (base as TextNodeWithChunks).stableLength ?? 0\n \n // 验证:mergedValue 应该等于 baseStableText + 所有 chunks 的文本\n // baseStableText = base.value.slice(0, baseStableLength)\n // 所有 chunks 的文本 = baseChunks + partChunks 的文本\n const result = {\n ...base,\n value: mergedValue,\n stableLength: mergedChunks.length > 0 ? baseStableLength : undefined,\n chunks: mergedChunks.length > 0 ? mergedChunks : undefined\n } as TextNodeWithChunks\n \n return result as RootContent\n }\n\n // 如果是容器节点,合并 children\n if (base.children && Array.isArray(base.children) && part.children && Array.isArray(part.children)) {\n // 如果 base 的最后一个子节点和 part 的第一个子节点类型相同,尝试合并\n if (base.children.length > 0 && part.children.length > 0) {\n const lastBaseChild = base.children[base.children.length - 1]\n const firstPartChild = part.children[0]\n \n if (lastBaseChild.type === firstPartChild.type) {\n // 尝试合并最后一个和第一个子节点\n const merged = mergeAstNodes(lastBaseChild as RootContent, firstPartChild as RootContent)\n return {\n ...base,\n children: [\n ...base.children.slice(0, -1),\n merged as AstNode,\n ...part.children.slice(1)\n ]\n } as RootContent\n }\n }\n\n // 否则直接追加所有子节点\n return {\n ...base,\n children: [...base.children, ...part.children]\n } as RootContent\n }\n\n // 其他情况,返回 baseNode(无法合并)\n return baseNode\n}\n\n/**\n * 深拷贝 AST 节点\n * 使用递归浅拷贝实现,比 JSON.parse/stringify 更高效\n * 且保持对象结构完整性\n */\nexport function cloneNode<T extends RootContent>(node: T): T {\n // 优先使用 structuredClone(Node 17+ / 现代浏览器)\n if (typeof structuredClone === 'function') {\n return structuredClone(node)\n }\n \n // 回退到递归拷贝\n return deepClone(node) as T\n}\n\n/**\n * 递归深拷贝对象\n */\nfunction deepClone<T>(obj: T): T {\n if (obj === null || typeof obj !== 'object') {\n return obj\n }\n\n if (Array.isArray(obj)) {\n return obj.map(item => deepClone(item)) as T\n }\n\n const cloned = {} as T\n for (const key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\n cloned[key] = deepClone(obj[key])\n }\n }\n return cloned\n}\n","import type { RootContent } from 'mdast'\nimport type { AstNode } from '../types'\nimport type {\n SourceBlock,\n DisplayBlock,\n TransformerOptions,\n TransformerState,\n TransformerPlugin,\n AnimationEffect\n} from './types'\nimport { countChars as defaultCountChars, sliceAst as defaultSliceAst, appendToAst, type TextChunk, type AccumulatedChunks } from './utils'\n\n/**\n * Block Transformer\n *\n * 用于控制 blocks 的逐步显示(打字机效果)\n * 作为解析器和渲染器之间的中间层\n *\n * 特性:\n * - 使用 requestAnimationFrame 实现流畅动画\n * - 支持随机步长,模拟真实打字效果\n * - 支持 typing 动画效果\n * - 页面不可见时自动暂停,节省资源\n * - 插件系统支持自定义节点处理\n *\n * @example\n * ```typescript\n * const transformer = new BlockTransformer({\n * charsPerTick: [1, 3], // 随机 1-3 个字符\n * tickInterval: 30,\n * effect: 'typing',\n * onChange: (displayBlocks) => {\n * // 更新 UI\n * }\n * })\n *\n * // 推入新 blocks\n * transformer.push(blocks)\n *\n * // 获取当前显示状态\n * const displayBlocks = transformer.getDisplayBlocks()\n * ```\n */\nexport class BlockTransformer<T = unknown> {\n private state: TransformerState<T>\n private options: {\n charsPerTick: number | [number, number]\n tickInterval: number\n effect: AnimationEffect\n plugins: TransformerPlugin[]\n onChange: (displayBlocks: DisplayBlock<T>[]) => void\n pauseOnHidden: boolean\n }\n private rafId: number | null = null\n private lastTickTime = 0\n private isRunning = false\n private isPaused = false\n private chunks: TextChunk[] = [] // 累积的 chunks(用于 fade-in 动画)\n private visibilityHandler: (() => void) | null = null\n \n // ============ 性能优化:缓存机制 ============\n /** 缓存的已截断 displayNode(稳定的部分,避免重复遍历) */\n private cachedDisplayNode: RootContent | null = null\n /** 缓存的字符数(避免重复计算) */\n private cachedTotalChars: number | null = null\n /** 当前缓存的进度(对应 cachedDisplayNode) */\n private cachedProgress: number = 0\n\n constructor(options: TransformerOptions = {}) {\n this.options = {\n charsPerTick: options.charsPerTick ?? 1,\n tickInterval: options.tickInterval ?? 20,\n effect: options.effect ?? 'none',\n plugins: options.plugins ?? [],\n onChange: options.onChange ?? (() => {}),\n pauseOnHidden: options.pauseOnHidden ?? true\n }\n\n this.state = {\n completedBlocks: [],\n currentBlock: null,\n currentProgress: 0,\n pendingBlocks: []\n }\n\n // 设置页面可见性监听\n if (this.options.pauseOnHidden && typeof document !== 'undefined') {\n this.setupVisibilityHandler()\n }\n }\n\n /**\n * 推入新的 blocks\n * 会自动过滤已存在的 blocks\n */\n push(blocks: SourceBlock<T>[]): void {\n const existingIds = this.getAllBlockIds()\n\n // 找出新增的 blocks\n const newBlocks = blocks.filter((b) => !existingIds.has(b.id))\n\n if (newBlocks.length > 0) {\n this.state.pendingBlocks.push(...newBlocks)\n this.startIfNeeded()\n }\n\n // 如果当前正在显示的 block 内容更新了(pending block 变化)\n if (this.state.currentBlock) {\n const updated = blocks.find((b) => b.id === this.state.currentBlock!.id)\n if (updated && updated.node !== this.state.currentBlock.node) {\n // 内容更新,清除缓存\n this.clearCache()\n \n const oldTotal = this.cachedTotalChars ?? this.countChars(this.state.currentBlock.node)\n const newTotal = this.countChars(updated.node)\n \n // 如果字符数减少了(AST 结构变化,如 **xxx 变成 **xxx**)\n // 重新计算进度,保持相对位置\n if (newTotal < oldTotal || newTotal < this.state.currentProgress) {\n this.state.currentProgress = Math.min(this.state.currentProgress, newTotal)\n }\n \n // 内容更新,更新引用\n this.state.currentBlock = updated\n // 如果之前暂停了(因为到达末尾),重新开始\n if (!this.rafId && !this.isPaused) {\n if (this.state.currentProgress < newTotal) {\n this.startIfNeeded()\n }\n }\n }\n }\n }\n\n /**\n * 更新指定 block(用于 pending block 内容增加时)\n */\n update(block: SourceBlock<T>): void {\n if (this.state.currentBlock?.id === block.id) {\n const oldTotal = this.cachedTotalChars ?? this.countChars(this.state.currentBlock.node)\n const newTotal = this.countChars(block.node)\n\n this.state.currentBlock = block\n\n // 如果内容增加了且之前暂停了,继续\n if (newTotal > oldTotal && !this.rafId && !this.isPaused && this.state.currentProgress >= oldTotal) {\n // 内容变化,清除缓存\n this.clearCache()\n this.startIfNeeded()\n }\n }\n }\n\n /**\n * 跳过所有动画,直接显示全部内容\n */\n skip(): void {\n this.stop()\n\n const allBlocks = [\n ...this.state.completedBlocks,\n ...(this.state.currentBlock ? [this.state.currentBlock] : []),\n ...this.state.pendingBlocks\n ]\n\n this.state = {\n completedBlocks: allBlocks,\n currentBlock: null,\n currentProgress: 0,\n pendingBlocks: []\n }\n this.chunks = []\n this.clearCache()\n\n this.emit()\n }\n\n /**\n * 重置状态\n */\n reset(): void {\n this.stop()\n this.state = {\n completedBlocks: [],\n currentBlock: null,\n currentProgress: 0,\n pendingBlocks: []\n }\n this.chunks = []\n this.clearCache()\n this.emit()\n }\n\n /**\n * 暂停动画\n */\n pause(): void {\n this.isPaused = true\n this.cancelRaf()\n }\n\n /**\n * 恢复动画\n */\n resume(): void {\n if (this.isPaused) {\n this.isPaused = false\n this.startIfNeeded()\n }\n }\n\n /**\n * 获取用于渲染的 display blocks\n * 优化:使用缓存的 displayNode,避免重复遍历已稳定的节点\n */\n getDisplayBlocks(): DisplayBlock<T>[] {\n const result: DisplayBlock<T>[] = []\n\n // 已完成的 blocks\n for (const block of this.state.completedBlocks) {\n result.push({\n ...block,\n displayNode: block.node,\n progress: 1,\n isDisplayComplete: true\n })\n }\n\n // 当前正在显示的 block\n if (this.state.currentBlock) {\n // 使用缓存的字符数\n const total = this.getTotalChars()\n \n // 如果进度变化了或缓存无效,更新缓存的 displayNode\n if (this.state.currentProgress !== this.cachedProgress || !this.cachedDisplayNode) {\n this.updateCachedDisplayNode()\n }\n\n result.push({\n ...this.state.currentBlock,\n displayNode: this.cachedDisplayNode || { type: 'paragraph', children: [] },\n progress: total > 0 ? this.state.currentProgress / total : 1,\n isDisplayComplete: false\n })\n }\n\n return result\n }\n\n /**\n * 是否正在处理中\n */\n isProcessing(): boolean {\n return this.isRunning || this.state.currentBlock !== null || this.state.pendingBlocks.length > 0\n }\n\n /**\n * 是否已暂停\n */\n isPausedState(): boolean {\n return this.isPaused\n }\n\n /**\n * 获取内部状态(用于调试)\n */\n getState(): Readonly<TransformerState<T>> {\n return { ...this.state }\n }\n\n /**\n * 动态更新配置\n */\n setOptions(options: Partial<Pick<TransformerOptions, 'charsPerTick' | 'tickInterval' | 'effect' | 'pauseOnHidden'>>): void {\n if (options.charsPerTick !== undefined) {\n this.options.charsPerTick = options.charsPerTick\n }\n if (options.tickInterval !== undefined) {\n this.options.tickInterval = options.tickInterval\n }\n if (options.effect !== undefined) {\n this.options.effect = options.effect\n }\n if (options.pauseOnHidden !== undefined) {\n this.options.pauseOnHidden = options.pauseOnHidden\n if (options.pauseOnHidden && typeof document !== 'undefined') {\n this.setupVisibilityHandler()\n } else {\n this.removeVisibilityHandler()\n }\n }\n }\n\n /**\n * 获取当前配置\n */\n getOptions(): { \n charsPerTick: number | [number, number]\n tickInterval: number\n effect: AnimationEffect\n } {\n return {\n charsPerTick: this.options.charsPerTick,\n tickInterval: this.options.tickInterval,\n effect: this.options.effect\n }\n }\n\n /**\n * 获取当前动画效果\n */\n getEffect(): AnimationEffect {\n return this.options.effect\n }\n\n /**\n * 销毁,清理资源\n */\n destroy(): void {\n this.stop()\n this.removeVisibilityHandler()\n }\n\n // ============ 私有方法 ============\n\n private getAllBlockIds(): Set<string> {\n return new Set([\n ...this.state.completedBlocks.map((b) => b.id),\n this.state.currentBlock?.id,\n ...this.state.pendingBlocks.map((b) => b.id)\n ].filter((id): id is string => id !== undefined))\n }\n\n private setupVisibilityHandler(): void {\n if (this.visibilityHandler) return\n\n this.visibilityHandler = () => {\n if (document.hidden) {\n this.pause()\n } else {\n this.resume()\n }\n }\n\n document.addEventListener('visibilitychange', this.visibilityHandler)\n }\n\n private removeVisibilityHandler(): void {\n if (this.visibilityHandler) {\n document.removeEventListener('visibilitychange', this.visibilityHandler)\n this.visibilityHandler = null\n }\n }\n\n private startIfNeeded(): void {\n if (this.rafId || this.isPaused) return\n\n if (!this.state.currentBlock && this.state.pendingBlocks.length > 0) {\n this.state.currentBlock = this.state.pendingBlocks.shift()!\n this.state.currentProgress = 0\n this.clearCache() // 新 block,清除缓存\n }\n\n if (this.state.currentBlock) {\n this.isRunning = true\n this.lastTickTime = 0\n this.scheduleNextFrame()\n }\n }\n\n private scheduleNextFrame(): void {\n this.rafId = requestAnimationFrame((time) => this.animationFrame(time))\n }\n\n private animationFrame(time: number): void {\n this.rafId = null\n\n // 计算是否应该执行 tick\n if (this.lastTickTime === 0) {\n this.lastTickTime = time\n }\n\n const elapsed = time - this.lastTickTime\n\n if (elapsed >= this.options.tickInterval) {\n this.lastTickTime = time\n this.tick()\n }\n\n // 如果还在运行,继续调度\n if (this.isRunning && !this.isPaused) {\n this.scheduleNextFrame()\n }\n }\n\n private tick(): void {\n const block = this.state.currentBlock\n if (!block) {\n this.processNext()\n return\n }\n\n // 使用缓存的字符数,避免重复计算\n const total = this.getTotalChars()\n const step = this.getStep()\n const prevProgress = this.state.currentProgress\n \n this.state.currentProgress = Math.min(prevProgress + step, total)\n\n // 如果是 fade-in 效果,添加新的 chunk\n if (this.options.effect === 'fade-in' && this.state.currentProgress > prevProgress) {\n // 从 block.node 中提取新增的字符\n const newText = this.extractText(block.node, prevProgress, this.state.currentProgress)\n if (newText.length > 0) {\n this.chunks.push({\n text: newText,\n createdAt: Date.now()\n })\n }\n }\n\n this.emit()\n\n if (this.state.currentProgress >= total) {\n // 当前 block 完成,清空 chunks 和缓存\n this.notifyComplete(block.node)\n this.state.completedBlocks.push(block)\n this.state.currentBlock = null\n this.state.currentProgress = 0\n this.chunks = []\n this.clearCache()\n this.processNext()\n }\n }\n\n /**\n * 从 AST 节点中提取指定范围的文本\n */\n private extractText(node: RootContent, start: number, end: number): string {\n let result = ''\n let charIndex = 0\n\n function traverse(n: AstNode): boolean {\n if (charIndex >= end) return false\n\n if (n.value && typeof n.value === 'string') {\n const nodeStart = charIndex\n const nodeEnd = charIndex + n.value.length\n charIndex = nodeEnd\n\n // 计算交集\n const overlapStart = Math.max(start, nodeStart)\n const overlapEnd = Math.min(end, nodeEnd)\n\n if (overlapStart < overlapEnd) {\n result += n.value.slice(overlapStart - nodeStart, overlapEnd - nodeStart)\n }\n return charIndex < end\n }\n\n if (n.children && Array.isArray(n.children)) {\n for (const child of n.children) {\n if (!traverse(child)) return false\n }\n }\n\n return true\n }\n\n traverse(node as AstNode)\n return result\n }\n\n private getStep(): number {\n const { charsPerTick } = this.options\n if (typeof charsPerTick === 'number') {\n return charsPerTick\n }\n // 随机步长\n const [min, max] = charsPerTick\n return Math.floor(Math.random() * (max - min + 1)) + min\n }\n\n private processNext(): void {\n if (this.state.pendingBlocks.length > 0) {\n this.state.currentBlock = this.state.pendingBlocks.shift()!\n this.state.currentProgress = 0\n this.chunks = []\n this.clearCache() // 新 block,清除缓存\n this.emit()\n // 继续运行(rAF 已经在调度中)\n } else {\n this.isRunning = false\n this.cancelRaf()\n this.emit()\n }\n }\n\n private cancelRaf(): void {\n if (this.rafId) {\n cancelAnimationFrame(this.rafId)\n this.rafId = null\n }\n }\n\n private stop(): void {\n this.cancelRaf()\n this.isRunning = false\n this.isPaused = false\n }\n\n private emit(): void {\n this.options.onChange(this.getDisplayBlocks())\n }\n\n // ============ 插件调用 ============\n\n private countChars(node: RootContent): number {\n // 先找匹配的插件\n for (const plugin of this.options.plugins) {\n if (plugin.match?.(node) && plugin.countChars) {\n const result = plugin.countChars(node)\n if (result !== undefined) return result\n }\n }\n // 默认计算\n return defaultCountChars(node)\n }\n\n private sliceNode(node: RootContent, chars: number, accumulatedChunks?: AccumulatedChunks): RootContent | null {\n // 先找匹配的插件\n for (const plugin of this.options.plugins) {\n if (plugin.match?.(node) && plugin.sliceNode) {\n const total = this.countChars(node)\n const result = plugin.sliceNode(node, chars, total)\n if (result !== null) return result\n }\n }\n // 默认截断,传入累积的 chunks\n return defaultSliceAst(node, chars, accumulatedChunks)\n }\n\n private notifyComplete(node: RootContent): void {\n for (const plugin of this.options.plugins) {\n if (plugin.match?.(node) && plugin.onComplete) {\n plugin.onComplete(node)\n }\n }\n }\n\n // ============ 缓存管理方法 ============\n\n /**\n * 更新缓存的 displayNode\n * 使用真正的增量追加模式:只处理新增部分,不重复遍历已稳定的节点\n */\n private updateCachedDisplayNode(): void {\n const block = this.state.currentBlock\n if (!block) {\n this.cachedDisplayNode = null\n this.cachedProgress = 0\n return\n }\n\n const currentProgress = this.state.currentProgress\n\n // 如果进度减少了(内容更新导致),需要重新截断\n if (currentProgress < this.cachedProgress) {\n this.cachedDisplayNode = this.sliceNode(\n block.node,\n currentProgress,\n this.getAccumulatedChunks()\n )\n this.cachedProgress = currentProgress\n return\n }\n\n // 如果进度增加了,使用增量追加模式\n if (currentProgress > this.cachedProgress && this.cachedDisplayNode) {\n // 真正的增量追加:只处理新增部分,不重复遍历已稳定的节点\n this.cachedDisplayNode = appendToAst(\n this.cachedDisplayNode,\n block.node,\n this.cachedProgress,\n currentProgress,\n this.getAccumulatedChunks()\n )\n this.cachedProgress = currentProgress\n } else if (!this.cachedDisplayNode) {\n // 首次截断\n this.cachedDisplayNode = this.sliceNode(\n block.node,\n currentProgress,\n this.getAccumulatedChunks()\n )\n this.cachedProgress = currentProgress\n }\n }\n\n /**\n * 获取总字符数(带缓存)\n */\n private getTotalChars(): number {\n if (this.cachedTotalChars === null && this.state.currentBlock) {\n this.cachedTotalChars = this.countChars(this.state.currentBlock.node)\n }\n return this.cachedTotalChars ?? 0\n }\n\n /**\n * 清除缓存(当 block 切换或内容更新时)\n */\n private clearCache(): void {\n this.cachedDisplayNode = null\n this.cachedTotalChars = null\n this.cachedProgress = 0\n }\n\n /**\n * 获取累积的 chunks(用于 fade-in 效果)\n */\n private getAccumulatedChunks(): AccumulatedChunks | undefined {\n if (this.options.effect === 'fade-in' && this.chunks.length > 0) {\n return { stableChars: 0, chunks: this.chunks }\n }\n return undefined\n }\n}\n\n/**\n * 创建 BlockTransformer 实例的工厂函数\n */\nexport function createBlockTransformer<T = unknown>(\n options?: TransformerOptions\n): BlockTransformer<T> {\n return new BlockTransformer<T>(options)\n}\n\n\n\n","import type { RootContent, Code } from 'mdast'\nimport type { TransformerPlugin } from './types'\n\n/**\n * 代码块插件:整体出现,不逐字符显示\n * \n * 注意:默认不启用,代码块默认参与打字机效果\n * 如需整体显示代码块,可手动添加此插件\n */\nexport const codeBlockPlugin: TransformerPlugin = {\n name: 'code-block',\n match: (node: RootContent) => node.type === 'code',\n countChars: () => 1, // 算作 1 个字符,整体出现\n sliceNode: (node, displayedChars, totalChars) => {\n // 要么全部显示,要么不显示\n return displayedChars >= totalChars ? node : null\n }\n}\n\n/**\n * Mermaid 图表插件:整体出现\n * \n * 注意:默认不启用,mermaid 默认参与打字机效果\n * 如需整体显示 mermaid,可手动添加此插件\n */\nexport const mermaidPlugin: TransformerPlugin = {\n name: 'mermaid',\n match: (node: RootContent) => {\n if (node.type !== 'code') return false\n const codeNode = node as Code\n return codeNode.lang === 'mermaid'\n },\n countChars: () => 1,\n sliceNode: (node, displayedChars) => (displayedChars > 0 ? node : null)\n}\n\n/**\n * 图片插件:立即显示(不参与打字机效果)\n * 图片没有文本内容,应立即显示\n */\nexport const imagePlugin: TransformerPlugin = {\n name: 'image',\n match: (node: RootContent) => node.type === 'image',\n countChars: () => 0 // 0 字符,立即显示\n}\n\n/**\n * 数学公式插件:整体出现\n * \n * 注意:默认不启用,数学公式默认参与打字机效果\n * 如需整体显示公式,可手动添加此插件\n */\nexport const mathPlugin: TransformerPlugin = {\n name: 'math',\n match: (node: RootContent) => {\n const type = node.type as string\n return type === 'math' || type === 'inlineMath'\n },\n countChars: () => 1,\n sliceNode: (node, displayedChars) => (displayedChars > 0 ? node : null)\n}\n\n/**\n * 分割线插件:立即显示\n * 分隔线没有文本内容,应立即显示\n */\nexport const thematicBreakPlugin: TransformerPlugin = {\n name: 'thematic-break',\n match: (node: RootContent) => node.type === 'thematicBreak',\n countChars: () => 0\n}\n\n/**\n * 默认插件集合\n * \n * 只包含确实需要特殊处理的节点:\n * - 图片:无文本内容,立即显示\n * - 分隔线:无文本内容,立即显示\n * \n * 代码块、mermaid、数学公式默认参与打字机效果\n * 如需整体显示,可手动添加对应插件\n */\nexport const defaultPlugins: TransformerPlugin[] = [\n imagePlugin,\n thematicBreakPlugin\n]\n\n/**\n * 完整插件集合(所有特殊节点整体显示)\n * 包含代码块、mermaid、数学公式等的整体显示\n */\nexport const allPlugins: TransformerPlugin[] = [\n mermaidPlugin, // mermaid 优先于普通 code block\n codeBlockPlugin,\n imagePlugin,\n mathPlugin,\n thematicBreakPlugin\n]\n\n/**\n * 创建自定义插件的辅助函数\n */\nexport function createPlugin(\n name: string,\n matcher: (node: RootContent) => boolean,\n options: Partial<Omit<TransformerPlugin, 'name' | 'match'>> = {}\n): TransformerPlugin {\n return {\n name,\n match: matcher,\n ...options\n }\n}\n"]}