@incremark/core 0.2.6 → 0.3.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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/extensions/html-extension/index.ts","../../../src/parser/ast/types.ts","../../../src/extensions/marked-extensions/explicitDefinitionExtension.ts","../../../src/extensions/marked-extensions/optimisticReferenceExtension.ts","../../../src/extensions/marked-extensions/mathExtension.ts","../../../src/extensions/marked-extensions/footnoteDefinitionExtension.ts","../../../src/extensions/marked-extensions/inlineHtmlExtension.ts","../../../src/parser/ast/markedHelpers.ts","../../../src/parser/ast/MarkedAstBuildter.ts","../../../src/engines/marked/index.ts"],"names":["match","Lexer"],"mappings":"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","file":"index.js","sourcesContent":["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 *\n * CommonMark 规范中,HTML 块会在空行处被截断,导致:\n * - `<div>\\ncontent` 和 `</div>` 被分成独立的 HTML 节点\n *\n * 此函数通过追踪未闭合的标签,将分散的 HTML 节点合并回完整的片段\n */\nfunction mergeFragmentedHtmlNodes(nodes: RootContent[]): RootContent[] {\n const result: RootContent[] = []\n let i = 0\n\n\n while (i < nodes.length) {\n const node = nodes[i]\n\n if (!isHtmlNode(node)) {\n result.push(node)\n i++\n continue\n }\n\n // 检测当前 HTML 节点中是否有未闭合的标签\n const unclosedTags = findUnclosedTags(node.value)\n\n if (unclosedTags.length === 0) {\n // 没有未闭合标签,直接添加\n result.push(node)\n i++\n continue\n }\n\n // 有未闭合标签,尝试向后查找闭合标签\n const mergedParts: string[] = [node.value]\n let j = i + 1\n let currentUnclosed = [...unclosedTags]\n\n while (j < nodes.length && currentUnclosed.length > 0) {\n const nextNode = nodes[j]\n\n if (isHtmlNode(nextNode)) {\n // 检查这个节点是否包含我们需要的闭合标签\n const closingInfo = checkClosingTags(nextNode.value, currentUnclosed)\n\n if (closingInfo.hasRelevantClosing) {\n mergedParts.push(nextNode.value)\n currentUnclosed = closingInfo.remainingUnclosed\n\n if (currentUnclosed.length === 0) {\n // 所有标签都已闭合,停止合并\n j++\n break\n }\n } else {\n // 这个 HTML 节点不包含我们需要的闭合标签\n // 但可能是中间内容,也需要包含\n mergedParts.push(nextNode.value)\n }\n } else {\n // 非 HTML 节点(可能是 paragraph 等),停止合并\n // 因为这意味着内容结构已经改变\n break\n }\n\n j++\n }\n\n if (mergedParts.length > 1) {\n // 成功合并了多个节点\n const mergedValue = mergedParts.join('\\n')\n const mergedNode: HTML = {\n type: 'html',\n value: mergedValue\n }\n result.push(mergedNode)\n i = j\n } else {\n // 无法合并,保留原节点\n result.push(node)\n i++\n }\n }\n\n return result\n}\n\n/**\n * 查找 HTML 内容中未闭合的标签\n */\nfunction findUnclosedTags(html: string): string[] {\n const tagStack: string[] = []\n\n // 匹配所有标签\n const tagRegex = /<\\/?([a-zA-Z][a-zA-Z0-9-]*)[^>]*\\/?>/g\n let match\n\n while ((match = tagRegex.exec(html)) !== null) {\n const fullTag = match[0]\n const tagName = match[1].toLowerCase()\n\n // 跳过自闭合标签\n if (VOID_ELEMENTS.includes(tagName) || fullTag.endsWith('/>')) {\n continue\n }\n\n if (fullTag.startsWith('</')) {\n // 闭合标签\n const lastIndex = tagStack.lastIndexOf(tagName)\n if (lastIndex !== -1) {\n tagStack.splice(lastIndex, 1)\n }\n } else {\n // 开标签\n tagStack.push(tagName)\n }\n }\n\n return tagStack\n}\n\n/**\n * 检查 HTML 内容中是否包含指定标签的闭合标签\n */\nfunction checkClosingTags(\n html: string,\n unclosedTags: string[]\n): { hasRelevantClosing: boolean; remainingUnclosed: string[] } {\n const remaining = [...unclosedTags]\n let hasRelevant = false\n\n // 匹配闭合标签\n const closeTagRegex = /<\\/([a-zA-Z][a-zA-Z0-9-]*)\\s*>/g\n let match\n\n while ((match = closeTagRegex.exec(html)) !== null) {\n const tagName = match[1].toLowerCase()\n const index = remaining.lastIndexOf(tagName)\n if (index !== -1) {\n remaining.splice(index, 1)\n hasRelevant = true\n }\n }\n\n return {\n hasRelevantClosing: hasRelevant,\n remainingUnclosed: remaining\n }\n}\n\n/**\n * 处理 HTML 节点数组,将开始标签、内容、结束标签合并为结构化节点\n */\nfunction processHtmlNodesInArray(\n nodes: RootContent[],\n options: HtmlTreeExtensionOptions\n): RootContent[] {\n // 预处理:合并被空行分割的 HTML 节点\n const mergedNodes = mergeFragmentedHtmlNodes(nodes)\n\n const result: RootContent[] = []\n let i = 0\n \n while (i < mergedNodes.length) {\n const node = mergedNodes[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 < mergedNodes.length && depth > 0) {\n const nextNode = mergedNodes[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 * AST 构建器统一接口和类型定义\n *\n * 支持两种引擎:\n * - marked: 极速模式,速度更快\n * - micromark: 稳定模式,更可靠,支持 div 内嵌 markdown\n */\n\nimport type { Root, RootContent } from 'mdast'\nimport type { Extension as MicromarkExtension } from 'micromark-util-types'\nimport type { Extension as MdastExtension } from 'mdast-util-from-markdown'\nimport type { MarkedExtension } from 'marked'\nimport type { ParsedBlock, BlockStatus, ParserOptions, ContainerConfig } from '../../types'\n\n/**\n * 引擎类型\n */\nexport type EngineType = 'marked' | 'micromark'\n\n/**\n * AST 构建器接口\n * 所有引擎实现必须遵循此接口\n */\nexport interface IAstBuilder {\n /** 容器配置(用于边界检测) */\n readonly containerConfig: ContainerConfig | undefined\n\n /**\n * 解析文本为 AST\n * @param text Markdown 文本\n * @returns AST\n */\n parse(text: string): Root\n\n /**\n * 将 AST 节点转换为 ParsedBlock\n */\n nodesToBlocks(\n nodes: RootContent[],\n startOffset: number,\n rawText: string,\n status: BlockStatus,\n generateBlockId: () => string\n ): ParsedBlock[]\n}\n\n/**\n * Marked 引擎扩展配置\n */\nexport interface MarkedEngineExtension {\n /** marked 扩展列表 */\n extensions: MarkedExtension[]\n}\n\n/**\n * Micromark 引擎扩展配置\n */\nexport interface MicromarkEngineExtension {\n /** micromark 语法扩展 */\n extensions: MicromarkExtension[]\n /** mdast 转换扩展 */\n mdastExtensions: MdastExtension[]\n}\n\n/**\n * 统一插件格式\n *\n * 插件可以同时支持多个引擎,运行时会根据当前引擎选择对应配置\n *\n * @example\n * ```ts\n * const myPlugin: IncremarkPlugin = {\n * name: 'my-plugin',\n * type: 'both', // 支持两种引擎\n * marked: {\n * extensions: [myMarkedExtension]\n * },\n * micromark: {\n * extensions: [myMicromarkExt],\n * mdastExtensions: [myMdastExt]\n * }\n * }\n * ```\n */\nexport interface IncremarkPlugin {\n /** 插件名称 */\n name: string\n\n /**\n * 插件支持的引擎类型\n * - 'marked': 仅支持 marked 引擎\n * - 'micromark': 仅支持 micromark 引擎\n * - 'both': 同时支持两种引擎\n */\n type: 'marked' | 'micromark' | 'both'\n\n /**\n * Marked 引擎配置\n * 当 type 为 'marked' 或 'both' 时必须提供\n */\n marked?: MarkedEngineExtension\n\n /**\n * Micromark 引擎配置\n * 当 type 为 'micromark' 或 'both' 时必须提供\n */\n micromark?: MicromarkEngineExtension\n}\n\n/**\n * 引擎特定的解析器选项\n *\n * 注意:不再包含 engine 选项,引擎切换通过注入 astBuilder 类实现\n * 这样可以确保 tree-shaking 正常工作\n */\nexport interface EngineParserOptions extends Omit<ParserOptions, 'extensions' | 'mdastExtensions'> {\n /**\n * 统一插件列表\n * 插件会根据当前引擎自动选择对应的扩展配置\n */\n plugins?: IncremarkPlugin[]\n\n /**\n * Micromark 扩展(仅 micromark 引擎使用)\n * @deprecated 建议使用 plugins 统一配置\n */\n extensions?: MicromarkExtension[]\n\n /**\n * Mdast 扩展(仅 micromark 引擎使用)\n * @deprecated 建议使用 plugins 统一配置\n */\n mdastExtensions?: MdastExtension[]\n\n /**\n * Marked 扩展(仅 marked 引擎使用)\n * @deprecated 建议使用 plugins 统一配置\n */\n markedExtensions?: MarkedExtension[]\n}\n\n/**\n * 从插件列表中提取 marked 扩展\n */\nexport function extractMarkedExtensions(plugins: IncremarkPlugin[]): MarkedExtension[] {\n const extensions: MarkedExtension[] = []\n for (const plugin of plugins) {\n if ((plugin.type === 'marked' || plugin.type === 'both') && plugin.marked) {\n extensions.push(...plugin.marked.extensions)\n }\n }\n return extensions\n}\n\n/**\n * 从插件列表中提取 micromark 扩展\n */\nexport function extractMicromarkExtensions(plugins: IncremarkPlugin[]): {\n extensions: MicromarkExtension[]\n mdastExtensions: MdastExtension[]\n} {\n const extensions: MicromarkExtension[] = []\n const mdastExtensions: MdastExtension[] = []\n\n for (const plugin of plugins) {\n if ((plugin.type === 'micromark' || plugin.type === 'both') && plugin.micromark) {\n extensions.push(...plugin.micromark.extensions)\n mdastExtensions.push(...plugin.micromark.mdastExtensions)\n }\n }\n\n return { extensions, mdastExtensions }\n}\n\n/**\n * 验证插件配置是否与引擎兼容\n */\nexport function validatePluginsForEngine(\n plugins: IncremarkPlugin[],\n engine: EngineType\n): { valid: boolean; incompatible: string[] } {\n const incompatible: string[] = []\n\n for (const plugin of plugins) {\n if (engine === 'marked' && plugin.type === 'micromark') {\n incompatible.push(plugin.name)\n } else if (engine === 'micromark' && plugin.type === 'marked') {\n incompatible.push(plugin.name)\n }\n }\n\n return {\n valid: incompatible.length === 0,\n incompatible\n }\n}\n","/**\n * 显式 Definition 扩展\n *\n * 作用:捕获 [id]: ... 整行,手动解析,并立即注册到 marked 的 links 表中。\n * 这能让 marked 原生逻辑正确识别后续的引用图片。\n *\n * 注意:start 函数必须严格匹配 definition 格式 [id]:,否则会干扰 ![alt][id] 的解析\n */\n\nimport type { TokenizerExtension } from 'marked'\nimport type { ExplicitDefinitionToken } from './types'\n\n/**\n * 创建显式定义扩展\n *\n * @returns marked 扩展对象\n */\nexport function createExplicitDefinitionExtension(): TokenizerExtension {\n return {\n name: 'explicitDefinition',\n level: 'block',\n // 🔑 关键修复:start 必须匹配完整的 definition 模式 [id]:,\n // 而不能只匹配 [,否则会把 ![alt][id] 中的 [alt] 误认为是 definition 开头\n // 同时排除脚注定义 [^id]:\n start(src: string): number | undefined {\n // 匹配 [id]: 但不匹配 [^id]:(脚注定义)\n const match = src.match(/^ {0,3}\\[(?!\\^)[^\\]]+\\]:/m)\n return match?.index\n },\n tokenizer(this: any, src: string): ExplicitDefinitionToken | undefined {\n // 匹配整行:[id]: ... 直到换行,但排除脚注定义 [^id]:\n const rule = /^ {0,3}\\[(?!\\^)[^\\]]+\\]:.*?(?:\\n+|$)/\n const match = rule.exec(src)\n\n if (match) {\n const raw = match[0]\n // 手动解析内部结构:提取 identifier, url, title\n // 使用 \\S+ 匹配 URL,防止被怪异空格截断\n const contentMatch = raw.match(\n /^ {0,3}\\[([^\\]]+)\\]:\\s*(\\S+)(?:\\s+[\"'(](.*?)[\"')])?/\n )\n\n if (contentMatch) {\n const identifier = contentMatch[1].toLowerCase()\n const url = contentMatch[2]\n const title = contentMatch[3]\n\n // ⚡️ 关键步骤:立即注册到 marked 上下文\n // 这样 marked 在解析后续的 ![Alt][id] 时就能找到定义,从而生成正确的 Image Token\n if (this.lexer?.tokens?.links) {\n this.lexer.tokens.links[identifier] = { href: url, title }\n }\n\n return {\n type: 'explicitDefinition',\n raw,\n identifier,\n url,\n title\n }\n }\n\n // 如果捕获了行但解析失败,依然返回 raw Token,防止它漏到 paragraph 里被 Reference 误伤\n return { type: 'explicitDefinition', raw, identifier: '', url: '' }\n }\n return undefined\n },\n renderer(): string {\n return ''\n }\n } as TokenizerExtension\n}\n\n","/**\n * 乐观引用解析扩展\n *\n * 作用:仅当 marked 原生无法解析(即 ID 不存在)时,强制生成引用节点。\n * 注意:需要排除脚注引用 [^id],让脚注处理逻辑来处理\n */\n\nimport type { TokenizerExtension } from 'marked'\nimport type { OptimisticRefToken } from './types'\n\n/**\n * 创建乐观引用扩展\n *\n * @returns marked 扩展对象\n */\nexport function createOptimisticReferenceExtension(): TokenizerExtension {\n return {\n name: 'optimisticReference',\n level: 'inline',\n start(src: string): number | undefined {\n return src.match(/!?\\[/)?.index\n },\n tokenizer(this: any, src: string): OptimisticRefToken | undefined {\n // 匹配 ![...][...] 或 [...][...]\n const rule =\n /^(!?)\\[((?:\\[[^\\]]*\\]|[^\\[\\]]|\\](?=[^\\[]*\\]))*)\\](?:\\s*\\[((?:\\[[^\\]]*\\]|[^\\[\\]]|\\](?=[^\\[]*\\]))*)\\])?/\n const match = rule.exec(src)\n\n if (match) {\n const fullMatch = match[0]\n\n // 1. 如果是标准链接 [text](url),跳过\n if (src.length > fullMatch.length && src[fullMatch.length] === '(') {\n return undefined\n }\n\n // 2. ⚡️ 防抢断:如果后面紧跟 ':',说明这是 Definition 的一部分,坚决不碰\n if (src.length > fullMatch.length && src[fullMatch.length] === ':') {\n return undefined\n }\n\n const isImage = match[1] === '!'\n const text = match[2]\n const refRaw = match[3]\n\n // 3. ⚡️ 排除脚注引用:如果文本以 ^ 开头,这是脚注引用 [^id],交给脚注处理逻辑\n if (text.startsWith('^')) {\n return undefined\n }\n\n let identifier = ''\n let referenceType: 'shortcut' | 'collapsed' | 'full' = 'shortcut'\n\n if (refRaw !== undefined) {\n if (refRaw === '') {\n referenceType = 'collapsed'\n identifier = text\n } else {\n referenceType = 'full'\n identifier = refRaw\n }\n } else {\n referenceType = 'shortcut'\n identifier = text\n // 排除 Checkbox\n if (text.match(/^[ xX]$/)) {\n return undefined\n }\n }\n\n return {\n type: 'optimisticReference',\n raw: fullMatch,\n isImage,\n text,\n identifier: identifier.toLowerCase(),\n label: identifier,\n referenceType\n }\n }\n return undefined\n },\n renderer(): string {\n return ''\n }\n } as TokenizerExtension\n}\n\n","/**\n * 数学公式扩展\n *\n * 提供块级和行内数学公式的支持\n * - 块级:$$...$$ 格式\n * - 行内:$...$ 格式\n */\n\nimport type { TokenizerExtension } from 'marked'\nimport type { BlockMathToken, InlineMathToken } from './types'\n\n/**\n * 创建块级数学公式扩展\n *\n * 解析 $$...$$ 格式的块级公式\n *\n * @returns marked 扩展对象\n */\nexport function createBlockMathExtension(): TokenizerExtension {\n return {\n name: 'blockMath',\n level: 'block',\n start(src: string): number | undefined {\n // 匹配行首的 $$ (允许前面有空格)\n const match = src.match(/^ {0,3}\\$\\$/m)\n return match?.index\n },\n tokenizer(src: string): BlockMathToken | undefined {\n // 匹配 $$...$$ 块级公式(支持多行,允许行首空格)\n const rule = /^ {0,3}\\$\\$([\\s\\S]*?)\\$\\$ *(?:\\n+|$)/\n const match = rule.exec(src)\n if (match) {\n return {\n type: 'blockMath',\n raw: match[0],\n text: match[1].trim()\n }\n }\n return undefined\n },\n renderer(): string {\n return ''\n }\n } as TokenizerExtension\n}\n\n/**\n * 创建行内数学公式扩展\n *\n * 解析 $...$ 格式的行内公式\n *\n * @returns marked 扩展对象\n */\nexport function createInlineMathExtension(): TokenizerExtension {\n return {\n name: 'inlineMath',\n level: 'inline',\n start(src: string): number | undefined {\n const index = src.indexOf('$')\n if (index === -1) return undefined\n // 排除 $$ 开头(那是块级公式)\n if (src[index + 1] === '$') return undefined\n return index\n },\n tokenizer(src: string): InlineMathToken | undefined {\n // 匹配 $...$ 行内公式(不匹配 $$)\n // 使用非贪婪匹配,支持转义的 \\$\n const rule = /^\\$(?!\\$)((?:\\\\.|[^\\\\\\n$])+?)\\$(?!\\d)/\n const match = rule.exec(src)\n if (match) {\n return {\n type: 'inlineMath',\n raw: match[0],\n text: match[1].trim()\n }\n }\n return undefined\n },\n renderer(): string {\n return ''\n }\n } as TokenizerExtension\n}\n\n","/**\n * 脚注定义扩展\n *\n * 解析 [^id]: content 格式的脚注定义\n * 支持多行脚注(后续行需要 4 空格缩进)\n */\n\nimport type { TokenizerExtension } from 'marked'\nimport type { FootnoteDefinitionBlockToken } from './types'\n\n/**\n * 创建脚注定义扩展\n *\n * @returns marked 扩展对象\n */\nexport function createFootnoteDefinitionExtension(): TokenizerExtension {\n return {\n name: 'footnoteDefinitionBlock',\n level: 'block',\n start(src: string): number | undefined {\n // 匹配 [^id]: 格式的开头\n const match = src.match(/^ {0,3}\\[\\^[^\\]]+\\]:/m)\n return match?.index\n },\n tokenizer(src: string): FootnoteDefinitionBlockToken | undefined {\n // 匹配脚注定义的第一行:[^id]: content\n // 脚注标识符可以包含字母、数字、下划线、连字符\n const firstLineRule = /^ {0,3}\\[\\^([a-zA-Z0-9_-]+)\\]:\\s*(.*)/\n const firstLineMatch = firstLineRule.exec(src)\n\n if (!firstLineMatch) return undefined\n\n const identifier = firstLineMatch[1]\n let content = firstLineMatch[2]\n let raw = firstLineMatch[0]\n\n // 计算第一行后剩余的内容\n const remaining = src.slice(raw.length)\n\n // 处理多行脚注:后续行需要至少 4 空格缩进,或者是空行后的缩进行\n // 使用 lines 数组来简化处理\n const lines = remaining.split('\\n')\n let lineIndex = 0\n\n // 跳过第一个空字符串(如果 remaining 以 \\n 开头)\n if (lines[0] === '' && remaining.startsWith('\\n')) {\n lineIndex = 1\n raw += '\\n'\n content += '\\n'\n }\n\n while (lineIndex < lines.length) {\n const line = lines[lineIndex]\n\n // 空行:继续检查下一行是否有缩进\n if (line.trim() === '') {\n // 预检查:空行后是否有缩进行?\n let hasIndentedLineAfter = false\n for (let j = lineIndex + 1; j < lines.length; j++) {\n const nextLine = lines[j]\n if (nextLine.trim() === '') continue // 跳过连续空行\n if (nextLine.match(/^( |\\t)/)) {\n hasIndentedLineAfter = true\n }\n break\n }\n\n if (hasIndentedLineAfter) {\n raw += line + (lineIndex < lines.length - 1 ? '\\n' : '')\n content += '\\n' + line\n lineIndex++\n continue\n } else {\n // 空行后没有缩进行,结束脚注\n break\n }\n }\n\n // 检查是否有 4 空格缩进(脚注延续行)\n if (line.match(/^( |\\t)/)) {\n raw += line + (lineIndex < lines.length - 1 ? '\\n' : '')\n content += '\\n' + line\n lineIndex++\n continue\n }\n\n // 遇到新的脚注定义,结束当前脚注\n if (line.match(/^ {0,3}\\[\\^[^\\]]+\\]:/)) {\n break\n }\n\n // 遇到非缩进非空行,结束脚注\n break\n }\n\n // 如果最后有尾随空行,移除它们(不影响 raw,只影响 content)\n const trimmedContent = content.replace(/\\n+$/, '')\n\n return {\n type: 'footnoteDefinitionBlock',\n raw,\n identifier,\n content: trimmedContent\n }\n },\n renderer(): string {\n return ''\n }\n } as TokenizerExtension\n}\n\n","/**\n * 内联 HTML 扩展\n *\n * 解析内联 HTML 标签(如 <span>text</span>)\n * 用于与 Micromark 保持一致的 HTML 处理行为\n */\n\nimport type { TokenizerExtension } from 'marked'\nimport type { InlineHtmlToken } from './types'\n\n/**\n * HTML 标签正则表达式\n *\n * 匹配:\n * - 开标签: <tag> 或 <tag attr=\"value\">\n * - 闭标签: </tag>\n * - 自闭合: <tag /> 或 <br>\n */\nconst SELF_CLOSING_TAGS = new Set([\n 'area', 'base', 'br', 'col', 'embed', 'hr', 'img', 'input',\n 'link', 'meta', 'param', 'source', 'track', 'wbr'\n])\n\n/**\n * 创建内联 HTML 扩展\n *\n * @returns marked 扩展对象\n */\nexport function createInlineHtmlExtension(): TokenizerExtension {\n return {\n name: 'inlineHtml',\n level: 'inline',\n start(src: string): number | undefined {\n // 查找 < 字符,但排除转义和特殊情况\n const index = src.indexOf('<')\n if (index === -1) return undefined\n\n // 检查是否是有效的 HTML 标签开始\n const afterLt = src.slice(index + 1)\n // 必须是字母开头(开标签)或 / 后跟字母(闭标签)\n if (!/^[a-zA-Z\\/]/.test(afterLt)) return undefined\n\n return index\n },\n tokenizer(src: string): InlineHtmlToken | undefined {\n // 尝试匹配完整的 HTML 元素(开标签 + 内容 + 闭标签)\n const completeTagMatch = matchCompleteHtmlElement(src)\n if (completeTagMatch) {\n return {\n type: 'inlineHtml',\n raw: completeTagMatch,\n text: completeTagMatch\n }\n }\n\n // 尝试匹配自闭合标签\n const selfClosingMatch = matchSelfClosingTag(src)\n if (selfClosingMatch) {\n return {\n type: 'inlineHtml',\n raw: selfClosingMatch,\n text: selfClosingMatch\n }\n }\n\n return undefined\n },\n renderer(): string {\n return ''\n }\n } as TokenizerExtension\n}\n\n/**\n * 匹配完整的 HTML 元素(开标签 + 内容 + 闭标签)\n *\n * 支持嵌套,但限制深度以避免性能问题\n */\nfunction matchCompleteHtmlElement(src: string): string | null {\n // 匹配开标签\n const openTagMatch = /^<([a-zA-Z][a-zA-Z0-9]*)((?:\\s+[a-zA-Z_:][a-zA-Z0-9_.:-]*(?:\\s*=\\s*(?:\"[^\"]*\"|'[^']*'|[^\\s\"'=<>`]+))?)*)\\s*>/.exec(src)\n if (!openTagMatch) return null\n\n const tagName = openTagMatch[1].toLowerCase()\n const openTag = openTagMatch[0]\n\n // 如果是自闭合标签,不需要找闭标签\n if (SELF_CLOSING_TAGS.has(tagName)) {\n return openTag\n }\n\n // 查找对应的闭标签\n const afterOpenTag = src.slice(openTag.length)\n\n // 简单的嵌套计数\n let depth = 1\n let pos = 0\n const openPattern = new RegExp(`<${tagName}(?:\\\\s[^>]*)?>`, 'gi')\n const closePattern = new RegExp(`</${tagName}>`, 'gi')\n\n while (depth > 0 && pos < afterOpenTag.length) {\n // 重置 lastIndex\n openPattern.lastIndex = pos\n closePattern.lastIndex = pos\n\n const nextOpen = openPattern.exec(afterOpenTag)\n const nextClose = closePattern.exec(afterOpenTag)\n\n if (!nextClose) {\n // 没有找到闭标签,说明 HTML 不完整\n return null\n }\n\n if (nextOpen && nextOpen.index < nextClose.index) {\n // 先遇到开标签,深度 +1\n depth++\n pos = nextOpen.index + nextOpen[0].length\n } else {\n // 先遇到闭标签,深度 -1\n depth--\n pos = nextClose.index + nextClose[0].length\n }\n }\n\n if (depth === 0) {\n return src.slice(0, openTag.length + pos)\n }\n\n return null\n}\n\n/**\n * 匹配自闭合标签\n */\nfunction matchSelfClosingTag(src: string): string | null {\n // 匹配 <tag /> 格式\n const explicitSelfClosing = /^<([a-zA-Z][a-zA-Z0-9]*)((?:\\s+[a-zA-Z_:][a-zA-Z0-9_.:-]*(?:\\s*=\\s*(?:\"[^\"]*\"|'[^']*'|[^\\s\"'=<>`]+))?)*)\\s*\\/>/.exec(src)\n if (explicitSelfClosing) {\n return explicitSelfClosing[0]\n }\n\n // 匹配隐式自闭合标签(如 <br>、<img src=\"...\">)\n const implicitSelfClosing = /^<([a-zA-Z][a-zA-Z0-9]*)((?:\\s+[a-zA-Z_:][a-zA-Z0-9_.:-]*(?:\\s*=\\s*(?:\"[^\"]*\"|'[^']*'|[^\\s\"'=<>`]+))?)*)\\s*>/.exec(src)\n if (implicitSelfClosing && SELF_CLOSING_TAGS.has(implicitSelfClosing[1].toLowerCase())) {\n return implicitSelfClosing[0]\n }\n\n return null\n}\n\n","/**\n * Marked Token 到 MDAST 节点转换助手\n *\n * 将 marked 解析产生的 Token 转换为标准的 mdast 节点\n * 严格遵循 marked 类型定义和 mdast 规范\n *\n * 支持通过 TransformContext 扩展自定义 token 类型的转换\n */\n\nimport { Lexer, type Token, type Tokens } from 'marked'\nimport type {\n RootContent,\n PhrasingContent,\n Heading,\n Paragraph,\n Code,\n Blockquote,\n List,\n ListItem,\n Table,\n TableRow,\n TableCell,\n ThematicBreak,\n HTML,\n Text,\n Link,\n Image,\n Strong,\n Emphasis,\n InlineCode,\n Break,\n Delete,\n FootnoteReference,\n FootnoteDefinition,\n Definition,\n ImageReference,\n LinkReference\n} from 'mdast'\n// 从 mdast 插件导入扩展类型\nimport type { Math, InlineMath } from 'mdast-util-math'\nimport type { ContainerDirective } from 'mdast-util-directive'\nimport type {\n ContainerToken,\n FootnoteDefToken,\n OptimisticRefToken,\n ExplicitDefinitionToken,\n BlockMathToken,\n InlineMathToken,\n FootnoteDefinitionBlockToken,\n ExtendedToken,\n InlineHtmlToken\n} from '../../extensions/marked-extensions'\nimport { parseHtmlFragment, type HtmlElementNode } from '../../extensions/html-extension'\n\n// ============ 类型定义 ============\n\n/**\n * 扩展的 ListItem,包含 spread 属性\n */\ninterface ExtendedListItem extends ListItem {\n spread?: boolean\n}\n\n/**\n * 块级 Token 转换函数类型\n *\n * 用于自定义扩展的 token 转换\n */\nexport type BlockTokenTransformer = (\n token: ExtendedToken,\n ctx: TransformContext\n) => RootContent | null | undefined\n\n/**\n * 行内 Token 转换函数类型\n *\n * 用于自定义扩展的 token 转换\n */\nexport type InlineTokenTransformer = (\n token: ExtendedToken,\n ctx: TransformContext\n) => PhrasingContent | PhrasingContent[] | null | undefined\n\n// ============ 转换上下文 ============\n\n/**\n * 转换上下文,用于递归转换时传递信息\n *\n * 支持通过 customBlockTransformers 和 customInlineTransformers 扩展自定义类型\n */\nexport interface TransformContext {\n /**\n * 转换块级 tokens(递归)\n */\n transformTokens: (tokens: Tokens.Generic[] | undefined) => RootContent[]\n\n /**\n * 转换带位置信息的 tokens\n */\n transformTokensWithPosition: (tokens: Tokens.Generic[] | undefined) => RootContent[]\n\n /**\n * 转换行内 tokens\n */\n transformInline: (tokens: Token[] | undefined) => PhrasingContent[]\n\n /**\n * 解析脚注内容为 AST 节点\n */\n parseFootnoteContent: (content: string) => RootContent[]\n\n /**\n * 自定义块级 token 转换器映射\n *\n * key 为 token.type,value 为转换函数\n * 优先于内置转换器执行\n *\n * @example\n * ```ts\n * customBlockTransformers: {\n * myCustomBlock: (token, ctx) => ({\n * type: 'myCustomNode',\n * data: token.data\n * })\n * }\n * ```\n */\n customBlockTransformers?: Record<string, BlockTokenTransformer>\n\n /**\n * 自定义行内 token 转换器映射\n *\n * key 为 token.type,value 为转换函数\n * 优先于内置转换器执行\n */\n customInlineTransformers?: Record<string, InlineTokenTransformer>\n}\n\n// ============ 块级转换 ============\n\n/**\n * 转换块级数学公式\n *\n * 生成 mdast-util-math 兼容的 Math 节点\n */\nexport function transformBlockMath(token: BlockMathToken): Math {\n return {\n type: 'math',\n value: token.text,\n meta: null\n }\n}\n\n/**\n * 转换脚注定义块\n */\nexport function transformFootnoteDefinitionBlock(\n token: FootnoteDefinitionBlockToken,\n ctx: TransformContext\n): FootnoteDefinition {\n // 类型断言说明:parseFootnoteContent 返回 RootContent[]\n // 而 FootnoteDefinition['children'] 要求 (BlockContent | DefinitionContent)[]\n // 实际上脚注内容解析后确实是块级内容,类型安全\n const children = ctx.parseFootnoteContent(token.content) as FootnoteDefinition['children']\n return {\n type: 'footnoteDefinition',\n identifier: token.identifier,\n label: token.identifier,\n children\n }\n}\n\n/**\n * 转换显式定义\n */\nexport function transformExplicitDefinition(token: ExplicitDefinitionToken): Definition | null {\n if (!token.identifier || !token.url) return null\n return {\n type: 'definition',\n identifier: token.identifier,\n label: token.identifier,\n url: token.url,\n title: token.title ?? null\n }\n}\n\n/**\n * 转换 marked 原生的 def token\n */\nexport function transformDef(token: Tokens.Def): Definition | FootnoteDefinition {\n // 检查是否是脚注定义 [^id]: content\n if (token.tag.startsWith('^')) {\n const footnoteId = token.tag.slice(1)\n return {\n type: 'footnoteDefinition',\n identifier: footnoteId,\n label: footnoteId,\n children: [\n {\n type: 'paragraph',\n children: [{ type: 'text', value: token.href }]\n }\n ]\n }\n }\n return {\n type: 'definition',\n identifier: token.tag,\n label: token.tag,\n url: token.href,\n title: token.title ?? null\n }\n}\n\n/**\n * 转换容器指令\n *\n * 生成 mdast-util-directive 兼容的 ContainerDirective 节点\n */\nexport function transformContainer(\n token: ContainerToken,\n ctx: TransformContext\n): ContainerDirective {\n const attributes: Record<string, string> = {}\n const attrRegex = /([a-zA-Z0-9_-]+)=?(\"([^\"]*)\"|'([^']*)'|([^ ]*))?/g\n let match\n while ((match = attrRegex.exec(token.attrs)) !== null) {\n attributes[match[1]] = match[3] || match[4] || match[5] || ''\n }\n // 类型断言说明:transformTokensWithPosition 返回 RootContent[]\n // 而 ContainerDirective['children'] 要求 (BlockContent | DefinitionContent)[]\n // 实际上容器内容确实是块级内容,类型安全\n const children = ctx.transformTokensWithPosition(token.tokens) as ContainerDirective['children']\n return {\n type: 'containerDirective',\n name: token.name,\n attributes,\n children\n }\n}\n\n/**\n * 转换脚注定义(预处理阶段生成的)\n */\nexport function transformFootnoteDefToken(\n token: FootnoteDefToken,\n ctx: TransformContext\n): FootnoteDefinition {\n return {\n type: 'footnoteDefinition',\n identifier: token.identifier,\n label: token.identifier,\n children: [\n {\n type: 'paragraph',\n children: ctx.transformInline(token.tokens)\n }\n ]\n }\n}\n\n/**\n * 转换标题\n */\nexport function transformHeading(token: Tokens.Heading, ctx: TransformContext): Heading {\n return {\n type: 'heading',\n depth: token.depth as 1 | 2 | 3 | 4 | 5 | 6,\n children: ctx.transformInline(token.tokens)\n }\n}\n\n/**\n * 转换段落\n */\nexport function transformParagraph(token: Tokens.Paragraph, ctx: TransformContext): Paragraph {\n return {\n type: 'paragraph',\n children: ctx.transformInline(token.tokens)\n }\n}\n\n/**\n * 转换代码块\n */\nexport function transformCode(token: Tokens.Code): Code {\n return {\n type: 'code',\n lang: token.lang || null,\n meta: null, // 对齐 micromark 输出\n value: token.text\n }\n}\n\n/**\n * 转换引用块\n */\nexport function transformBlockquote(\n token: Tokens.Blockquote,\n ctx: TransformContext\n): Blockquote {\n // 类型断言说明:\n // 1. token.tokens 是 Token[],需转为 Tokens.Generic[](marked 内部类型差异)\n // 2. transformTokens 返回 RootContent[],而 Blockquote['children'] 要求 (BlockContent | DefinitionContent)[]\n // 实际上引用块内容确实是块级内容,类型安全\n const children = ctx.transformTokens(token.tokens as Tokens.Generic[]) as Blockquote['children']\n return {\n type: 'blockquote',\n children\n }\n}\n\n/**\n * 转换列表\n */\nexport function transformList(token: Tokens.List, ctx: TransformContext): List {\n // 类型断言说明:\n // 1. item.tokens 是 Token[],需转为 Tokens.Generic[](marked 内部类型差异)\n // 2. transformTokens 返回 RootContent[],而 ListItem['children'] 要求 (BlockContent | DefinitionContent)[]\n // 实际上列表项内容确实是块级内容,类型安全\n const children: ListItem[] = token.items.map((item) => ({\n type: 'listItem' as const,\n spread: item.loose,\n checked: item.checked ?? null, // 对齐 micromark 输出(GFM 任务列表)\n children: ctx.transformTokens(item.tokens as Tokens.Generic[]) as ListItem['children']\n }))\n return {\n type: 'list',\n ordered: token.ordered,\n start: token.ordered ? (token.start || 1) : null, // 对齐 micromark:有序列表有 start,无序列表为 null\n spread: token.loose,\n children\n }\n}\n\n/**\n * 转换表格\n */\nexport function transformTable(token: Tokens.Table, ctx: TransformContext): Table {\n const headerCells: TableCell[] = token.header.map((cell) => ({\n type: 'tableCell',\n children: ctx.transformInline(cell.tokens)\n }))\n\n const bodyRows: TableRow[] = token.rows.map((row) => ({\n type: 'tableRow',\n children: row.map((cell) => ({\n type: 'tableCell',\n children: ctx.transformInline(cell.tokens)\n }))\n }))\n\n return {\n type: 'table',\n align: token.align as ('left' | 'right' | 'center' | null)[] | undefined,\n children: [{ type: 'tableRow', children: headerCells }, ...bodyRows]\n }\n}\n\n/**\n * 转换分隔线\n */\nexport function transformHr(): ThematicBreak {\n return { type: 'thematicBreak' }\n}\n\n/**\n * 转换 HTML\n */\nexport function transformHtml(token: Tokens.HTML): HTML {\n return {\n type: 'html',\n value: token.text\n }\n}\n\n/**\n * 转换文本块(顶级)\n */\nexport function transformTextBlock(token: Tokens.Text, ctx: TransformContext): Paragraph {\n if (token.tokens) {\n return {\n type: 'paragraph',\n children: ctx.transformInline(token.tokens)\n }\n }\n return {\n type: 'paragraph',\n children: [{ type: 'text', value: token.text }]\n }\n}\n\n// ============ 行内转换 ============\n\n/**\n * 转换行内数学公式\n *\n * 生成 mdast-util-math 兼容的 InlineMath 节点\n */\nexport function transformInlineMath(token: InlineMathToken): InlineMath {\n return {\n type: 'inlineMath',\n value: token.text\n }\n}\n\n/**\n * 转换乐观引用\n */\nexport function transformOptimisticReference(\n token: OptimisticRefToken,\n ctx: TransformContext\n): ImageReference | LinkReference {\n if (token.isImage) {\n return {\n type: 'imageReference',\n identifier: token.identifier,\n label: token.label,\n referenceType: token.referenceType,\n alt: token.text\n }\n }\n const labelChildren = ctx.transformInline(new Lexer().inlineTokens(token.text))\n return {\n type: 'linkReference',\n identifier: token.identifier,\n label: token.label,\n referenceType: token.referenceType,\n children: labelChildren.length ? labelChildren : [{ type: 'text', value: token.text }]\n }\n}\n\n/**\n * 转换链接\n */\nexport function transformLink(token: Tokens.Link, ctx: TransformContext): FootnoteReference | Link {\n // 检查是否是脚注引用:text 以 ^ 开头(如 [^1])\n if (token.text.startsWith('^') && token.text.length > 1) {\n const footnoteId = token.text.slice(1)\n return {\n type: 'footnoteReference',\n identifier: footnoteId,\n label: footnoteId\n }\n }\n return {\n type: 'link',\n url: token.href,\n title: token.title || null, // 对齐 micromark 输出\n children: ctx.transformInline(token.tokens)\n }\n}\n\n/**\n * 转换图片\n */\nexport function transformImage(token: Tokens.Image): Image {\n return {\n type: 'image',\n url: token.href,\n title: token.title || null, // 对齐 micromark 输出\n alt: token.text\n }\n}\n\n/**\n * 转换文本(包含脚注引用提取)\n */\nexport function transformText(token: Tokens.Text | Tokens.Escape): (Text | FootnoteReference)[] {\n const results: (Text | FootnoteReference)[] = []\n const text = token.text\n const footnoteRegex = /\\[\\^([a-zA-Z0-9_-]+)\\]/g\n let lastIndex = 0\n let match\n\n while ((match = footnoteRegex.exec(text)) !== null) {\n if (match.index > lastIndex) {\n results.push({\n type: 'text',\n value: text.substring(lastIndex, match.index)\n })\n }\n results.push({\n type: 'footnoteReference',\n identifier: match[1],\n label: match[1]\n })\n lastIndex = match.index + match[0].length\n }\n\n if (lastIndex < text.length) {\n results.push({\n type: 'text',\n value: text.substring(lastIndex)\n })\n }\n\n return results\n}\n\n/**\n * 转换加粗\n */\nexport function transformStrong(token: Tokens.Strong, ctx: TransformContext): Strong {\n return {\n type: 'strong',\n children: ctx.transformInline(token.tokens)\n }\n}\n\n/**\n * 转换斜体\n */\nexport function transformEmphasis(token: Tokens.Em, ctx: TransformContext): Emphasis {\n return {\n type: 'emphasis',\n children: ctx.transformInline(token.tokens)\n }\n}\n\n/**\n * 转换行内代码\n */\nexport function transformCodespan(token: Tokens.Codespan): InlineCode {\n return {\n type: 'inlineCode',\n value: token.text\n }\n}\n\n/**\n * 转换换行\n */\nexport function transformBreak(): Break {\n return { type: 'break' }\n}\n\n/**\n * 转换删除线\n */\nexport function transformDelete(token: Tokens.Del, ctx: TransformContext): Delete {\n return {\n type: 'delete',\n children: ctx.transformInline(token.tokens)\n }\n}\n\n/**\n * 转换内联 HTML\n *\n * 将内联 HTML token 转换为 HtmlElementNode 节点\n * 如果解析失败,回退为普通文本节点\n */\nexport function transformInlineHtml(\n token: InlineHtmlToken\n): PhrasingContent | PhrasingContent[] {\n // 使用 html-extension 的解析器\n const parsed = parseHtmlFragment(token.text)\n\n if (parsed.length > 0) {\n // 成功解析为 HtmlElementNode\n return parsed as unknown as PhrasingContent[]\n }\n\n // 解析失败,回退为文本节点\n return { type: 'text', value: token.text }\n}\n\n// ============ 主转换函数 ============\n\n// ============ 类型守卫 ============\n\n/**\n * 检查 token 是否为指定类型\n * 通过 type 字段判断,避免 as unknown as 的类型断言\n */\nfunction isTokenType<T extends ExtendedToken>(\n token: ExtendedToken,\n type: T['type']\n): token is T {\n return token.type === type\n}\n\n/**\n * 内置块级转换器映射\n *\n * 注意:由于 TypeScript 的类型系统限制,在回调中需要使用类型断言\n * 这是因为 Record 的 value 类型是统一的 BlockTokenTransformer\n * 而每个具体的转换函数需要特定的 token 类型\n */\nconst builtinBlockTransformers: Record<string, BlockTokenTransformer> = {\n blockMath: (token) => {\n if (isTokenType<BlockMathToken>(token, 'blockMath')) return transformBlockMath(token)\n return null\n },\n footnoteDefinitionBlock: (token, ctx) => {\n if (isTokenType<FootnoteDefinitionBlockToken>(token, 'footnoteDefinitionBlock'))\n return transformFootnoteDefinitionBlock(token, ctx)\n return null\n },\n explicitDefinition: (token) => {\n if (isTokenType<ExplicitDefinitionToken>(token, 'explicitDefinition'))\n return transformExplicitDefinition(token)\n return null\n },\n def: (token) => {\n if (isTokenType<Tokens.Def>(token, 'def')) return transformDef(token)\n return null\n },\n container: (token, ctx) => {\n if (isTokenType<ContainerToken>(token, 'container')) return transformContainer(token, ctx)\n return null\n },\n footnoteDefinition: (token, ctx) => {\n if (isTokenType<FootnoteDefToken>(token, 'footnoteDefinition'))\n return transformFootnoteDefToken(token, ctx)\n return null\n },\n heading: (token, ctx) => {\n if (isTokenType<Tokens.Heading>(token, 'heading')) return transformHeading(token, ctx)\n return null\n },\n paragraph: (token, ctx) => {\n if (isTokenType<Tokens.Paragraph>(token, 'paragraph')) return transformParagraph(token, ctx)\n return null\n },\n code: (token) => {\n if (isTokenType<Tokens.Code>(token, 'code')) return transformCode(token)\n return null\n },\n blockquote: (token, ctx) => {\n if (isTokenType<Tokens.Blockquote>(token, 'blockquote')) return transformBlockquote(token, ctx)\n return null\n },\n list: (token, ctx) => {\n if (isTokenType<Tokens.List>(token, 'list')) return transformList(token, ctx)\n return null\n },\n table: (token, ctx) => {\n if (isTokenType<Tokens.Table>(token, 'table')) return transformTable(token, ctx)\n return null\n },\n hr: () => transformHr(),\n html: (token) => {\n if (isTokenType<Tokens.HTML>(token, 'html')) return transformHtml(token)\n return null\n },\n space: () => null,\n text: (token, ctx) => {\n if (isTokenType<Tokens.Text>(token, 'text')) return transformTextBlock(token, ctx)\n return null\n }\n}\n\n/**\n * 内置行内转换器映射\n */\nconst builtinInlineTransformers: Record<string, InlineTokenTransformer> = {\n inlineMath: (token) => {\n if (isTokenType<InlineMathToken>(token, 'inlineMath')) return transformInlineMath(token)\n return null\n },\n optimisticReference: (token, ctx) => {\n if (isTokenType<OptimisticRefToken>(token, 'optimisticReference'))\n return transformOptimisticReference(token, ctx)\n return null\n },\n link: (token, ctx) => {\n if (isTokenType<Tokens.Link>(token, 'link')) return transformLink(token, ctx)\n return null\n },\n image: (token) => {\n if (isTokenType<Tokens.Image>(token, 'image')) return transformImage(token)\n return null\n },\n text: (token) => {\n if (isTokenType<Tokens.Text>(token, 'text')) return transformText(token)\n return null\n },\n escape: (token) => {\n if (isTokenType<Tokens.Escape>(token, 'escape')) return transformText(token)\n return null\n },\n strong: (token, ctx) => {\n if (isTokenType<Tokens.Strong>(token, 'strong')) return transformStrong(token, ctx)\n return null\n },\n em: (token, ctx) => {\n if (isTokenType<Tokens.Em>(token, 'em')) return transformEmphasis(token, ctx)\n return null\n },\n codespan: (token) => {\n if (isTokenType<Tokens.Codespan>(token, 'codespan')) return transformCodespan(token)\n return null\n },\n br: () => transformBreak(),\n del: (token, ctx) => {\n if (isTokenType<Tokens.Del>(token, 'del')) return transformDelete(token, ctx)\n return null\n },\n inlineHtml: (token) => {\n if (isTokenType<InlineHtmlToken>(token, 'inlineHtml')) return transformInlineHtml(token)\n return null\n }\n}\n\n/**\n * 转换单个块级 Token 为 MDAST 节点\n *\n * 转换优先级:\n * 1. 自定义转换器(customBlockTransformers)\n * 2. 内置转换器\n * 3. 回退处理(带 text 属性的 token 转为段落)\n *\n * @param token 要转换的 token\n * @param ctx 转换上下文\n * @returns MDAST 节点或 null\n */\nexport function transformBlockToken(token: ExtendedToken, ctx: TransformContext): RootContent | null {\n const tokenType = token.type\n\n // 1. 优先使用自定义转换器\n if (ctx.customBlockTransformers?.[tokenType]) {\n const result = ctx.customBlockTransformers[tokenType](token, ctx)\n if (result !== undefined) return result\n }\n\n // 2. 使用内置转换器\n if (builtinBlockTransformers[tokenType]) {\n const result = builtinBlockTransformers[tokenType](token, ctx)\n if (result !== undefined) return result\n }\n\n // 3. 回退处理:带 text 属性的 token 转为段落\n if ('text' in token && typeof token.text === 'string') {\n const paragraph: Paragraph = {\n type: 'paragraph',\n children: [{ type: 'text', value: token.text }]\n }\n return paragraph\n }\n\n return null\n}\n\n/**\n * 转换单个行内 Token 为 MDAST 节点\n *\n * 转换优先级:\n * 1. 自定义转换器(customInlineTransformers)\n * 2. 内置转换器\n * 3. 回退处理(带 text 属性的 token 转为文本节点)\n *\n * @param token 要转换的 token\n * @param ctx 转换上下文\n * @returns MDAST 节点或 null\n */\nexport function transformInlineToken(\n token: ExtendedToken,\n ctx: TransformContext\n): PhrasingContent | PhrasingContent[] | null {\n const tokenType = token.type\n\n // 1. 优先使用自定义转换器\n if (ctx.customInlineTransformers?.[tokenType]) {\n const result = ctx.customInlineTransformers[tokenType](token, ctx)\n if (result !== undefined) return result\n }\n\n // 2. 使用内置转换器\n if (builtinInlineTransformers[tokenType]) {\n const result = builtinInlineTransformers[tokenType](token, ctx)\n if (result !== undefined) return result\n }\n\n // 3. 回退处理:带 text 属性的 token 转为文本节点\n if ('text' in token && typeof token.text === 'string') {\n const text: Text = { type: 'text', value: token.text }\n return text\n }\n\n return null\n}\n\n/**\n * 获取内置块级转换器(用于扩展或覆盖)\n */\nexport function getBuiltinBlockTransformers(): Readonly<Record<string, BlockTokenTransformer>> {\n return builtinBlockTransformers\n}\n\n/**\n * 获取内置行内转换器(用于扩展或覆盖)\n */\nexport function getBuiltinInlineTransformers(): Readonly<Record<string, InlineTokenTransformer>> {\n return builtinInlineTransformers\n}\n","/**\n * Marked AST 构建器(极速模式)\n *\n * 基于 marked 解析器\n * 特点:\n * - 速度更快\n * - 适合流式渲染场景\n *\n */\n\nimport { lexer, Lexer, type Tokens, type Token, type MarkedExtension } from 'marked'\nimport type {\n Root,\n RootContent,\n PhrasingContent\n} from 'mdast'\nimport type { ParsedBlock, BlockStatus, ContainerConfig } from '../../types'\nimport { transformHtmlNodes, type HtmlTreeExtensionOptions } from '../../extensions/html-extension'\nimport type { IAstBuilder, EngineParserOptions } from './types'\nimport { extractMarkedExtensions } from './types'\n\n// 导入扩展\nimport {\n createExplicitDefinitionExtension,\n createOptimisticReferenceExtension,\n createBlockMathExtension,\n createInlineMathExtension,\n createFootnoteDefinitionExtension,\n createInlineHtmlExtension,\n type ContainerToken,\n type FootnoteDefToken\n} from '../../extensions/marked-extensions'\n\n// 导入转换助手\nimport {\n transformBlockToken,\n transformInlineToken,\n type TransformContext\n} from './markedHelpers'\n\n// ============ 类型定义 ============\ntype LinkDefinitions = Record<string, { href: string; title?: string }>\n\n/**\n * Marked AST 构建器\n *\n * 使用 marked 解析 Markdown,速度更快\n * 适用于流式渲染和高性能场景\n */\nexport class MarkedAstBuilder implements IAstBuilder {\n readonly containerConfig: ContainerConfig | undefined\n readonly htmlTreeOptions: HtmlTreeExtensionOptions | undefined\n private globalLinks: LinkDefinitions = {}\n /** 用户传入的 marked 扩展 */\n private readonly userExtensions: MarkedExtension[] = []\n /** 转换上下文(用于递归转换) */\n private readonly transformContext: TransformContext\n\n constructor(private options: EngineParserOptions = {}) {\n this.containerConfig = typeof options.containers === 'object'\n ? options.containers\n : (options.containers === true ? {} : undefined)\n\n this.htmlTreeOptions = typeof options.htmlTree === 'object'\n ? options.htmlTree\n : (options.htmlTree === true ? {} : undefined)\n\n // 收集用户扩展\n if (options.plugins) {\n this.userExtensions.push(...extractMarkedExtensions(options.plugins))\n }\n if (options.markedExtensions) {\n this.userExtensions.push(...options.markedExtensions)\n }\n\n // 初始化转换上下文\n this.transformContext = {\n transformTokens: this.transformTokens.bind(this),\n transformTokensWithPosition: this.transformTokensWithPosition.bind(this),\n transformInline: this.transformInline.bind(this),\n parseFootnoteContent: this.parseFootnoteContent.bind(this)\n }\n }\n\n parse(text: string): Root {\n // 1. 文本清洗:这是解决 URL 截断的第一道防线\n const normalizedText = text.replace(/[\\u00A0\\u200b\\u202f]/g, ' ')\n\n // 2. 构造 Extensions\n const optimisticRefExt = createOptimisticReferenceExtension()\n const explicitDefExt = createExplicitDefinitionExtension()\n const footnoteDefExt = createFootnoteDefinitionExtension()\n\n // 收集用户扩展中的 block/inline tokenizers\n const userBlockExts: any[] = []\n const userBlockStartExts: any[] = []\n const userInlineExts: any[] = []\n const userInlineStartExts: any[] = []\n\n for (const ext of this.userExtensions) {\n if ((ext as any).level === 'block') {\n if ((ext as any).tokenizer) userBlockExts.push((ext as any).tokenizer)\n if ((ext as any).start) userBlockStartExts.push((ext as any).start)\n } else if ((ext as any).level === 'inline') {\n if ((ext as any).tokenizer) userInlineExts.push((ext as any).tokenizer)\n if ((ext as any).start) userInlineStartExts.push((ext as any).start)\n }\n }\n\n // 脚注定义扩展需要在 explicitDefinitionExtension 之前,确保 [^id]: 优先被脚注扩展处理\n const blockExts: any[] = [\n footnoteDefExt.tokenizer,\n explicitDefExt.tokenizer,\n ...userBlockExts\n ]\n const blockStartExts: any[] = [\n footnoteDefExt.start,\n explicitDefExt.start,\n ...userBlockStartExts\n ]\n const inlineExts: any[] = [optimisticRefExt.tokenizer, ...userInlineExts]\n const inlineStartExts: any[] = [optimisticRefExt.start, ...userInlineStartExts]\n\n // Math 扩展(仅当 options.math 为 true 时启用)\n if (this.options.math) {\n const blockMathExt = createBlockMathExtension()\n const inlineMathExt = createInlineMathExtension()\n blockExts.unshift(blockMathExt.tokenizer)\n blockStartExts.unshift(blockMathExt.start)\n inlineExts.unshift(inlineMathExt.tokenizer)\n inlineStartExts.unshift(inlineMathExt.start)\n }\n\n // 内联 HTML 扩展(仅当 options.htmlTree 启用时)\n // 这使得内联 HTML 能够被识别为完整的 token,与 Micromark 行为一致\n if (this.htmlTreeOptions) {\n const inlineHtmlExt = createInlineHtmlExtension()\n inlineExts.unshift(inlineHtmlExt.tokenizer)\n inlineStartExts.unshift(inlineHtmlExt.start)\n }\n\n const lexerOptions: any = {\n gfm: true,\n breaks: false, // 关闭软换行转 break,与 Micromark 保持一致\n ...this.options,\n extensions: {\n inline: inlineExts,\n startInline: inlineStartExts,\n block: blockExts,\n startBlock: blockStartExts\n }\n }\n\n const lexerInstance = new Lexer(lexerOptions)\n\n // 3. 注入历史 Links\n if (lexerInstance.tokens && (lexerInstance.tokens as any).links) {\n Object.assign((lexerInstance.tokens as any).links, this.globalLinks)\n }\n\n // 4. 执行解析\n let tokens = lexerInstance.lex(normalizedText) as Token[]\n\n // 5. 保存 Links\n if (lexerInstance.tokens && (lexerInstance.tokens as any).links) {\n Object.assign(this.globalLinks, (lexerInstance.tokens as any).links)\n }\n\n // 6. 预处理\n tokens = this.preprocessTokens(tokens)\n\n // 7. 转换 AST\n let children = this.transformTokensWithPosition(tokens)\n\n // 8. HTML 后处理\n if (this.htmlTreeOptions) {\n children = this.processHtmlNodes(children)\n }\n\n return {\n type: 'root',\n children\n }\n }\n\n /**\n * 预处理 tokens\n *\n * 处理容器指令和遗留的脚注定义(从 paragraph 中提取)\n */\n private preprocessTokens(tokens: Token[]): Token[] {\n const result: Token[] = []\n let i = 0\n\n while (i < tokens.length) {\n const token = tokens[i]\n\n if (token.type === 'paragraph') {\n const text = (token as Tokens.Paragraph).text\n\n // 处理遗留的脚注定义(从 paragraph 中提取)\n const footnoteMatch = text.match(/^\\[\\^([a-zA-Z0-9_-]+)\\]:\\s+([\\s\\S]*)$/)\n if (footnoteMatch) {\n const defToken: FootnoteDefToken = {\n type: 'footnoteDefinition',\n identifier: footnoteMatch[1],\n text: footnoteMatch[2],\n tokens: new Lexer().inlineTokens(footnoteMatch[2]),\n raw: token.raw\n }\n result.push(defToken as unknown as Token)\n i++\n continue\n }\n\n // 处理容器指令\n const containerStartMatch = text.match(/^:::(\\s*)([a-zA-Z0-9_-]+)(.*?)(\\n|$)/)\n if (containerStartMatch) {\n const name = containerStartMatch[2]\n const attrs = containerStartMatch[3].trim()\n let rawAccumulator = ''\n let j = i\n let depth = 0\n let foundEnd = false\n let contentRaw = ''\n\n while (j < tokens.length) {\n const currentToken = tokens[j]\n rawAccumulator += currentToken.raw\n const lines = rawAccumulator.split('\\n')\n depth = 0\n let startLineIndex = -1\n let endLineIndex = -1\n\n for (let k = 0; k < lines.length; k++) {\n const line = lines[k]\n if (line.match(/^:::(\\s*)([a-zA-Z0-9_-]+)/)) {\n if (depth === 0 && startLineIndex === -1) startLineIndex = k\n depth++\n } else if (line.trim() === ':::') {\n depth--\n if (depth === 0) {\n endLineIndex = k\n foundEnd = true\n break\n }\n }\n }\n\n if (foundEnd) {\n const contentLines = lines.slice(startLineIndex + 1, endLineIndex)\n contentRaw = contentLines.join('\\n')\n const remainingLines = lines.slice(endLineIndex + 1)\n const remainingText = remainingLines.join('\\n')\n\n const containerToken: ContainerToken = {\n type: 'container',\n name,\n attrs,\n tokens: this.preprocessTokens(lexer(contentRaw)),\n raw: rawAccumulator\n }\n result.push(containerToken as unknown as Token)\n\n if (remainingText.trim()) {\n const remainingTokens = this.preprocessTokens(lexer(remainingText))\n result.push(...remainingTokens)\n }\n\n i = j + 1\n break\n }\n j++\n }\n\n if (foundEnd) continue\n }\n }\n\n result.push(token)\n i++\n }\n\n return result\n }\n\n /**\n * 转换 tokens 为 MDAST 节点(带位置信息)\n */\n private transformTokensWithPosition(tokens: Tokens.Generic[] | undefined): RootContent[] {\n if (!tokens) return []\n\n const results: RootContent[] = []\n let currentOffset = 0\n\n for (const token of tokens) {\n const rawLength = token.raw?.length ?? 0\n const node = transformBlockToken(token as Token, this.transformContext)\n\n if (node) {\n node.position = {\n start: { line: 0, column: 0, offset: currentOffset },\n end: { line: 0, column: 0, offset: currentOffset + rawLength }\n }\n results.push(node)\n }\n\n currentOffset += rawLength\n }\n\n return results\n }\n\n /**\n * 转换 tokens 为 MDAST 节点(不带位置信息)\n */\n private transformTokens(tokens: Tokens.Generic[] | undefined): RootContent[] {\n if (!tokens) return []\n return tokens\n .map((t) => transformBlockToken(t as Token, this.transformContext))\n .filter(Boolean) as RootContent[]\n }\n\n /**\n * 转换行内 tokens\n */\n private transformInline(tokens: Token[] | undefined): PhrasingContent[] {\n if (!tokens) return []\n\n const results: PhrasingContent[] = []\n\n for (const token of tokens) {\n const result = transformInlineToken(token, this.transformContext)\n if (result) {\n if (Array.isArray(result)) {\n results.push(...result)\n } else {\n results.push(result)\n }\n }\n }\n\n return results\n }\n\n /**\n * 解析脚注内容为 AST 节点\n */\n private parseFootnoteContent(content: string): RootContent[] {\n if (!content.trim()) {\n return []\n }\n\n // 移除脚注延续行的前导缩进(4 空格或 1 tab)\n const normalizedContent = content\n .split('\\n')\n .map((line, index) => {\n // 第一行不需要移除缩进\n if (index === 0) return line\n // 后续行移除 4 空格或 1 tab 的缩进\n if (line.startsWith(' ')) return line.slice(4)\n if (line.startsWith('\\t')) return line.slice(1)\n return line\n })\n .join('\\n')\n\n // 使用简单的 Lexer 解析内容\n const contentLexer = new Lexer({ gfm: true, breaks: true })\n const tokens = contentLexer.lex(normalizedContent)\n\n return this.transformTokens(tokens)\n }\n\n /**\n * 处理 HTML 节点\n *\n * 使用 html-extension 的 transformHtmlNodes 来处理:\n * - 合并被空行分割的 HTML 节点\n * - 将 HTML 解析为 HtmlElementNode 树结构\n */\n private processHtmlNodes(nodes: RootContent[]): RootContent[] {\n // 构造一个临时的 Root 节点,使用 transformHtmlNodes 处理\n const tempRoot: Root = {\n type: 'root',\n children: nodes as Root['children']\n }\n\n const transformed = transformHtmlNodes(tempRoot, this.htmlTreeOptions)\n return transformed.children as RootContent[]\n }\n\n /**\n * 将 AST 节点转换为 ParsedBlock\n */\n nodesToBlocks(\n nodes: RootContent[],\n startOffset: number,\n rawText: string,\n status: BlockStatus,\n generateBlockId: () => string\n ): ParsedBlock[] {\n const blocks: ParsedBlock[] = []\n\n for (const node of nodes) {\n const relativeStart = node.position?.start?.offset ?? 0\n const relativeEnd = node.position?.end?.offset ?? rawText.length\n const nodeText = rawText.substring(relativeStart, relativeEnd)\n const absoluteStart = startOffset + relativeStart\n const absoluteEnd = startOffset + relativeEnd\n\n blocks.push({\n id: generateBlockId(),\n status,\n node,\n startOffset: absoluteStart,\n endOffset: absoluteEnd,\n rawText: nodeText\n })\n }\n\n return blocks\n }\n}\n\n/**\n * AstBuilder 别名(向后兼容)\n */\nexport const AstBuilder = MarkedAstBuilder\n","/**\n * Marked 引擎入口(极速模式)\n *\n * 单独导入此模块可以实现 tree-shaking,避免打包 micromark 相关依赖\n *\n * @example\n * ```ts\n * import { createMarkedParser } from '@incremark/core/engines/marked'\n *\n * const parser = createMarkedParser({ gfm: true, math: true })\n * ```\n */\n\nexport { MarkedAstBuilder, AstBuilder } from '../../parser/ast/MarkedAstBuildter'\nexport type {\n EngineParserOptions,\n IncremarkPlugin,\n MarkedEngineExtension,\n IAstBuilder\n} from '../../parser/ast/types'\n\n// 导出创建解析器的工厂函数\nimport { MarkedAstBuilder } from '../../parser/ast/MarkedAstBuildter'\nimport type { EngineParserOptions } from '../../parser/ast/types'\n\n/**\n * 创建 Marked 引擎的 AST 构建器\n */\nexport function createMarkedBuilder(options: EngineParserOptions = {}): MarkedAstBuilder {\n return new MarkedAstBuilder(options)\n}\n"]}
@@ -0,0 +1,106 @@
1
+ import { Root, RootContent } from 'mdast';
2
+ import { C as ContainerConfig, B as BlockStatus, P as ParsedBlock } from '../../index-mZ7yCqNH.js';
3
+ import { I as IAstBuilder, E as EngineParserOptions } from '../../types-C_EW5vfp.js';
4
+ export { b as IncremarkPlugin, c as MicromarkEngineExtension } from '../../types-C_EW5vfp.js';
5
+ import 'micromark-util-types';
6
+ import 'mdast-util-from-markdown';
7
+ import 'marked';
8
+
9
+ /**
10
+ * Micromark AST 构建器(稳定模式)
11
+ *
12
+ * 基于 micromark + mdast-util-from-markdown
13
+ * 特点:
14
+ * - 更稳定可靠
15
+ * - 支持 div 内嵌 markdown
16
+ * - 丰富的扩展生态
17
+ */
18
+
19
+ /**
20
+ * Micromark AST 构建器
21
+ *
22
+ * 使用 micromark + mdast-util-from-markdown 解析 Markdown
23
+ * 适用于需要稳定性和高级特性的场景
24
+ */
25
+ declare class MicromarkAstBuilder implements IAstBuilder {
26
+ private readonly options;
27
+ readonly containerConfig: ContainerConfig | undefined;
28
+ private readonly htmlTreeConfig;
29
+ /** 缓存的扩展实例,避免每次 parse 都重新创建 */
30
+ private readonly cachedExtensions;
31
+ private readonly cachedMdastExtensions;
32
+ constructor(options?: EngineParserOptions);
33
+ /**
34
+ * 初始化并缓存扩展实例
35
+ */
36
+ private initExtensions;
37
+ /**
38
+ * 计算容器配置
39
+ */
40
+ private computeContainerConfig;
41
+ /**
42
+ * 计算 HTML 树配置
43
+ */
44
+ private computeHtmlTreeConfig;
45
+ /**
46
+ * 解析文本为 AST
47
+ *
48
+ * @param text Markdown 文本
49
+ * @returns AST
50
+ */
51
+ parse(text: string): Root;
52
+ /**
53
+ * 将 HTML 节点转换为纯文本(当未启用 HTML 树转换时)
54
+ *
55
+ * @param ast AST
56
+ * @returns 转换后的 AST
57
+ */
58
+ private convertHtmlToText;
59
+ /**
60
+ * 处理块级节点
61
+ */
62
+ private processBlockChildren;
63
+ /**
64
+ * 处理内联节点
65
+ */
66
+ private processInlineChildren;
67
+ /**
68
+ * 将块级 HTML 节点转换为段落
69
+ */
70
+ private convertBlockHtmlToParagraph;
71
+ /**
72
+ * 将内联 HTML 节点转换为纯文本节点
73
+ */
74
+ private convertInlineHtmlToText;
75
+ /**
76
+ * 将 AST 节点转换为 ParsedBlock
77
+ *
78
+ * @param nodes AST 节点列表
79
+ * @param startOffset 起始偏移量
80
+ * @param rawText 原始文本
81
+ * @param status 块状态
82
+ * @param generateBlockId 生成块 ID 的函数
83
+ * @returns ParsedBlock 列表
84
+ */
85
+ nodesToBlocks(nodes: RootContent[], startOffset: number, rawText: string, status: BlockStatus, generateBlockId: () => string): ParsedBlock[];
86
+ }
87
+
88
+ /**
89
+ * Micromark 引擎入口(稳定模式)
90
+ *
91
+ * 单独导入此模块可以实现 tree-shaking,避免打包 marked 相关依赖
92
+ *
93
+ * @example
94
+ * ```ts
95
+ * import { createMicromarkParser } from '@incremark/core/engines/micromark'
96
+ *
97
+ * const parser = createMicromarkParser({ gfm: true, math: true })
98
+ * ```
99
+ */
100
+
101
+ /**
102
+ * 创建 Micromark 引擎的 AST 构建器
103
+ */
104
+ declare function createMicromarkBuilder(options?: EngineParserOptions): MicromarkAstBuilder;
105
+
106
+ export { EngineParserOptions, IAstBuilder, MicromarkAstBuilder, createMicromarkBuilder };