lark-docx2md 0.5.1 → 0.5.2
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,"file":"converter-vuRwWoA4.js","names":["sleep","registry","logger"],"sources":["../src/client.ts","../src/core/registry.ts","../src/md-ast/parser.ts","../src/md-ast/parsers/page.ts","../src/md-ast/parsers/text.ts","../src/md-ast/parsers/heading.ts","../src/md-ast/parsers/bullet.ts","../src/md-ast/parsers/ordered.ts","../src/md-ast/parsers/code.ts","../src/md-ast/parsers/quote.ts","../src/md-ast/parsers/equation.ts","../src/md-ast/parsers/todo.ts","../src/md-ast/parsers/callout.ts","../src/md-ast/parsers/divider.ts","../src/md-ast/parsers/grid.ts","../src/md-ast/parsers/image.ts","../src/md-ast/parsers/table.ts","../src/md-ast/parsers/quoteContainer.ts","../src/md-ast/parsers/whiteboard.ts","../src/md-ast/parsers/sheet.ts","../src/md-ast/parsers/index.ts","../src/md-ast/serializer.ts","../src/whiteboard/utils.ts","../src/whiteboard/defs.ts","../src/whiteboard/node-renderer.ts","../src/whiteboard/text.ts","../src/whiteboard/render-context.ts","../src/whiteboard/shape-paths.ts","../src/whiteboard/renderers/composite-shape.ts","../src/whiteboard/renderers/connector.ts","../src/whiteboard/renderers/table.ts","../src/whiteboard/renderers/mind-map.ts","../src/whiteboard/renderers/simple.ts","../src/whiteboard/renderers/index.ts","../src/whiteboard/index.ts","../src/whiteboard/plain-text.ts","../src/whiteboard/yaml/converters.ts","../src/whiteboard/yaml/serialize.ts","../src/whiteboard/yaml/index.ts","../src/sheet/index.ts","../src/logger.ts","../src/md-ast/transformer.ts","../src/title-filter.ts","../src/converter.ts"],"sourcesContent":["import * as lark from '@larksuiteoapi/node-sdk';\nimport { LoggerLevel } from '@larksuiteoapi/node-sdk';\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport type { DocInfo, DocxBlock, WhiteboardNode } from './types.js';\n\nconst sleep = (ms: number) => new Promise(resolve => setTimeout(resolve, ms));\nconst RATE_LIMIT_MAX_RETRIES = 3;\nconst RATE_LIMIT_RETRY_DELAY = 500;\n\nexport function createClient (appId: string, appSecret: string, loggerLevel: LoggerLevel = LoggerLevel.warn) {\n const client = new lark.Client({ appId, appSecret, loggerLevel });\n\n async function call<T> (name: string, fn: () => Promise<{ code?: number; msg?: string; data?: T }>): Promise<T> {\n for (let attempt = 0; attempt <= RATE_LIMIT_MAX_RETRIES; attempt++) {\n let res;\n try {\n res = await fn();\n } catch (e: any) {\n const code = e.response?.data?.code;\n const msg = e.response?.data?.msg;\n if (code === 99991400 && attempt < RATE_LIMIT_MAX_RETRIES) {\n await sleep(RATE_LIMIT_RETRY_DELAY * (attempt + 1));\n continue;\n }\n const error = e.response?.data?.error;\n if (error) {\n throw new Error(`${name} failed: [${code}] ${msg}: \\n${JSON.stringify(error, null, 2)}`);\n }\n throw e;\n }\n if (res.code !== 0) {\n throw new Error(`${name} failed: [${res.code}] ${res.msg}`);\n }\n return res.data!;\n }\n throw new Error(`${name} failed: 频率限制重试次数已用尽`);\n }\n\n async function getWikiNodeInfo (token: string) {\n const data = await call('getWikiNodeInfo', () =>\n client.wiki.v2.space.getNode({ params: { token } }),\n );\n return data.node!;\n }\n\n async function getDocxDocument (docToken: string): Promise<DocInfo> {\n const data = await call('getDocxDocument', () =>\n client.docx.v1.document.get({ path: { document_id: docToken } }),\n );\n const doc = data.document!;\n return { documentId: doc.document_id!, title: doc.title! };\n }\n\n /**\n * 分页获取文档所有块。\n * @param docToken\n * @param pageHandler 可选回调,每页 blocks 传入,返回 false 则提前终止分页。\n * 不传时收集所有块后一次性返回。\n */\n async function getDocxBlocks (docToken: string, pageHandler?: (blocks: DocxBlock[]) => boolean): Promise<DocxBlock[]> {\n const allBlocks: DocxBlock[] = [];\n let pageToken: string | undefined;\n for (let i = 0; true ; i++) {\n if (i > 0) {\n // 单个应用调用频率上限为每秒 5 次\n await sleep(100);\n }\n const data = await call('getDocxBlocks', () =>\n client.docx.v1.documentBlock.list({\n path: { document_id: docToken },\n params: { page_size: 500, document_revision_id: -1, page_token: pageToken },\n }),\n );\n const items = (data.items ?? []) as DocxBlock[];\n if (pageHandler) {\n const shouldContinue = pageHandler(items);\n allBlocks.push(...items);\n if (!shouldContinue) break;\n } else {\n allBlocks.push(...items);\n }\n if (!data.has_more) break;\n pageToken = data.page_token;\n }\n return allBlocks;\n }\n\n /**\n *\n * @param fileTokens 一次最多可传递 5 个素材的 token\n * @return {Record<string, string>} Record<token, downloadLink>\n */\n async function batchGetTmpDownloadUrl (fileTokens: string[]): Promise<Record<string, string>> {\n const data = await call('batchGetTmpDownloadUrl', () =>\n client.drive.v1.media.batchGetTmpDownloadUrl({ params: { file_tokens: fileTokens } }),\n );\n const list = data.tmp_download_urls ?? [];\n const result: Record<string, string> = {};\n for (const { file_token, tmp_download_url } of list) {\n result[file_token] = tmp_download_url;\n }\n return result;\n }\n\n async function downloadImage (imgToken: string, outDir: string): Promise<string> {\n try {\n const resp = await client.drive.v1.media.download({ path: { file_token: imgToken } });\n fs.mkdirSync(outDir, { recursive: true });\n const ext = (resp.headers?.['content-type'] as string)?.includes('png') ? '.png' : '.jpg';\n const filename = path.join(outDir, `${imgToken}${ext}`);\n await resp.writeFile(filename);\n return filename;\n } catch (error: any) {\n if (error.status === 401) {\n throw new Error(`下载图片[${imgToken}]异常, 检查是否有接口 https://open.feishu.cn/document/server-docs/docs/drive-v1/media/download 的权限`);\n }\n if (error.status === 403) {\n throw new Error(`下载图片[${imgToken}]异常, 应用的文档权限大于等于文档本身“谁可以创建副本、打印和下载”的权限`);\n }\n throw error;\n }\n }\n\n async function getWhiteboardNodes (whiteboardId: string): Promise<WhiteboardNode[]> {\n const data = await call('getWhiteboardNodes', () =>\n client.board.v1.whiteboardNode.list({ path: { whiteboard_id: whiteboardId } }),\n );\n return data.nodes ?? [];\n }\n\n async function downloadWhiteboardAsImage (whiteboardId: string, outDir: string): Promise<any> {\n const resp = await client.board.v1.whiteboard.downloadAsImage({\n path: {\n whiteboard_id: whiteboardId,\n },\n },\n );\n fs.mkdirSync(outDir, { recursive: true });\n const ext = (resp.headers?.['content-type'] as string)?.includes('png') ? '.png' : '.jpg';\n const filename = path.join(outDir, `${whiteboardId}${ext}`);\n await resp.writeFile(filename);\n return filename;\n }\n\n // ─── Sheet APIs ─────────────────────────────────────────────────────────────\n\n async function getSpreadsheetInfo (token: string): Promise<{ title: string; url?: string }> {\n const data = await call('getSpreadsheetInfo', () =>\n client.sheets.v3.spreadsheet.get({ path: { spreadsheet_token: token } }),\n );\n const spreadsheet = (data as any).spreadsheet ?? data;\n return { title: spreadsheet.title ?? '', url: spreadsheet.url };\n }\n\n async function listSheets (token: string): Promise<any[]> {\n const data = await call('listSheets', () =>\n client.sheets.v3.spreadsheetSheet.query({ path: { spreadsheet_token: token } }),\n );\n return (data as any).sheets ?? [];\n }\n\n async function getSheetMeta (token: string, sheetId: string): Promise<any> {\n const data = await call('getSheetMeta', () =>\n client.sheets.v3.spreadsheetSheet.get({\n path: { spreadsheet_token: token, sheet_id: sheetId },\n }),\n );\n return (data as any).sheet ?? data;\n }\n\n async function readSheetValues (\n token: string,\n range: string,\n ): Promise<any[][]> {\n // 使用 client.request 走 SDK 通用请求通道,确保自动附加 tenant_access_token 鉴权头\n const resp: any = await (client as any).request({\n url: `https://open.feishu.cn/open-apis/sheets/v2/spreadsheets/${token}/values/${encodeURIComponent(range)}`,\n method: 'GET',\n params: {\n valueRenderOption: 'UnformattedValue',\n dateTimeRenderOption: 'FormattedString',\n },\n headers: { 'Content-Type': 'application/json; charset=utf-8' },\n });\n if (resp?.code !== 0) {\n throw new Error(`readSheetValues failed: [${resp?.code}] ${resp?.msg}`);\n }\n return resp.data?.valueRange?.values ?? [];\n }\n\n return {\n getWikiNodeInfo, getDocxDocument, getDocxBlocks, downloadImage, batchGetTmpDownloadUrl, getWhiteboardNodes,\n downloadWhiteboardAsImage, getSpreadsheetInfo, listSheets, getSheetMeta, readSheetValues,\n };\n}\n\nexport type LarkClient = ReturnType<typeof createClient>;\n","export class Registry<K, V> {\n private map = new Map<K, V>();\n\n register (key: K, value: V): void {\n this.map.set(key, value);\n }\n\n get (key: K): V | undefined {\n return this.map.get(key);\n }\n\n has (key: K): boolean {\n return this.map.has(key);\n }\n\n getAll (): ReadonlyMap<K, V> {\n return this.map;\n }\n}\n","import { Registry } from '../core/registry.js';\nimport type { DocInfo, DocxBlock, TextBody, TextElement } from '../types.js';\nimport type { MdBlockNode, MdInlineNode } from './types.js';\n\nexport interface BlockParser {\n blockType: number;\n\n parse (block: DocxBlock, ctx: ParserContext): MdBlockNode | null;\n}\n\nexport interface ParserContext {\n blockMap: Map<string, DocxBlock>;\n\n parseBlock (block: DocxBlock): MdBlockNode | null;\n\n parseText (body: TextBody): MdInlineNode[];\n\n parseInline (e: TextElement): MdInlineNode[];\n\n parseChildren (block: DocxBlock): MdBlockNode[];\n}\n\nexport class Parser {\n private registry = new Registry<number, BlockParser>();\n\n register (parser: BlockParser): void {\n this.registry.register(parser.blockType, parser);\n }\n\n parse (doc: DocInfo, blocks: DocxBlock[]): MdBlockNode {\n const blockMap = new Map<string, DocxBlock>();\n for (const b of blocks) {\n if (b.block_id) blockMap.set(b.block_id, b);\n }\n\n const ctx: ParserContext = {\n blockMap,\n parseBlock: (block: DocxBlock): MdBlockNode | null => {\n const bt = block.block_type;\n if (bt === undefined || bt === null) return null;\n const parser = this.registry.get(bt);\n if (parser) {\n return parser.parse(block, ctx);\n }\n // GridColumn(25) is handled inside Grid parser\n return null;\n },\n parseText: (body: TextBody): MdInlineNode[] => {\n const inline = body.elements.length > 1;\n return body.elements.flatMap(e => parseElement(e, inline));\n },\n parseInline: (e: TextElement): MdInlineNode[] => {\n return parseElement(e, true);\n },\n parseChildren: (block: DocxBlock): MdBlockNode[] => {\n const children: MdBlockNode[] = [];\n for (const id of block.children ?? []) {\n const child = blockMap.get(id);\n if (child) {\n const node = ctx.parseBlock(child);\n if (node) children.push(node);\n }\n }\n return children;\n },\n };\n\n const entry = blockMap.get(doc.documentId);\n if (entry) {\n const node = ctx.parseBlock(entry);\n if (node) return node;\n }\n\n // Fallback: create a page node with all root-level blocks\n const rootBlocks = blocks.filter(b => !b.parent_id);\n return {\n type: 'page',\n title: [],\n children: rootBlocks.map(b => ctx.parseBlock(b)).filter((n): n is MdBlockNode => n !== null),\n };\n }\n}\n\nfunction parseElement (e: TextElement, inline: boolean): MdInlineNode[] {\n if (e.text_run) {\n return [parseTextRun(e.text_run)];\n }\n if (e.mention_user) {\n return [{ type: 'mentionUser', userId: e.mention_user.user_id }];\n }\n if (e.mention_doc) {\n const url = e.mention_doc.url ? decodeURIComponent(e.mention_doc.url) : '';\n return [{ type: 'mentionDoc', title: e.mention_doc.title ?? '', url }];\n }\n if (e.equation) {\n return [{ type: 'equation', content: e.equation.content.replace(/\\n$/, ''), inline }];\n }\n return [];\n}\n\nfunction parseTextRun (tr: NonNullable<TextElement['text_run']>): MdInlineNode {\n const s = tr.text_element_style;\n\n // 基础节点:inline_code 作为叶子节点替代 text,其他样式在其外层逐层包裹\n let node: MdInlineNode = s?.inline_code\n ? { type: 'inlineCode', content: tr.content }\n : { type: 'text', content: tr.content };\n\n if (!s) return node;\n\n // 自内向外逐层包裹,以支持多样式叠加(例如:粗斜体、粗体链接、带下划线的删除线等)\n // 包裹顺序:link → underline → strikethrough → italic → bold\n // bold 放在最外层以兼容更多 Markdown 渲染器的嵌套解析\n if (s.link) {\n node = { type: 'link', url: decodeURIComponent(s.link.url), children: [node] };\n }\n if (s.underline) {\n node = { type: 'underline', children: [node] };\n }\n if (s.strikethrough) {\n node = { type: 'strikethrough', children: [node] };\n }\n if (s.italic) {\n node = { type: 'italic', children: [node] };\n }\n if (s.bold) {\n node = { type: 'bold', children: [node] };\n }\n\n return node;\n}\n","import type { BlockParser, ParserContext } from '../parser.js';\nimport type { DocxBlock } from '../../types.js';\nimport type { MdBlockNode } from '../types.js';\n\nexport const pageParser: BlockParser = {\n blockType: 1,\n parse (block: DocxBlock, ctx: ParserContext): MdBlockNode {\n return {\n type: 'page',\n title: block.page ? ctx.parseText(block.page) : [],\n children: ctx.parseChildren(block),\n };\n },\n};\n","import type { BlockParser, ParserContext } from '../parser.js';\nimport type { DocxBlock } from '../../types.js';\nimport type { MdBlockNode } from '../types.js';\n\nexport const textParser: BlockParser = {\n blockType: 2,\n parse (block: DocxBlock, ctx: ParserContext): MdBlockNode {\n return {\n type: 'paragraph',\n children: block.text ? ctx.parseText(block.text) : [],\n };\n },\n};\n","import type { BlockParser, ParserContext } from '../parser.js';\nimport type { DocxBlock } from '../../types.js';\nimport type { MdBlockNode } from '../types.js';\n\nfunction createHeadingParser (level: number, blockType: number): BlockParser {\n return {\n blockType,\n parse (block: DocxBlock, ctx: ParserContext): MdBlockNode {\n const headingKey = `heading${level}` as keyof DocxBlock;\n const body = block[headingKey] as DocxBlock['text'] | undefined;\n return {\n type: 'heading',\n level,\n children: body ? ctx.parseText(body) : [],\n };\n },\n };\n}\n\nexport const heading1Parser = createHeadingParser(1, 3);\nexport const heading2Parser = createHeadingParser(2, 4);\nexport const heading3Parser = createHeadingParser(3, 5);\nexport const heading4Parser = createHeadingParser(4, 6);\nexport const heading5Parser = createHeadingParser(5, 7);\nexport const heading6Parser = createHeadingParser(6, 8);\nexport const heading7Parser = createHeadingParser(7, 9);\nexport const heading8Parser = createHeadingParser(8, 10);\nexport const heading9Parser = createHeadingParser(9, 11);\n","import type { BlockParser, ParserContext } from '../parser.js';\nimport type { DocxBlock } from '../../types.js';\nimport type { MdBlockNode } from '../types.js';\n\nexport const bulletParser: BlockParser = {\n blockType: 12,\n parse (block: DocxBlock, ctx: ParserContext): MdBlockNode {\n return {\n type: 'bullet',\n text: block.bullet ? ctx.parseText(block.bullet) : [],\n children: ctx.parseChildren(block),\n };\n },\n};\n","import type { BlockParser, ParserContext } from '../parser.js';\nimport type { DocxBlock } from '../../types.js';\nimport type { MdBlockNode } from '../types.js';\n\nexport const orderedParser: BlockParser = {\n blockType: 13,\n parse (block: DocxBlock, ctx: ParserContext): MdBlockNode {\n const parent = block.parent_id ? ctx.blockMap.get(block.parent_id) : undefined;\n let order = 1;\n if (parent?.children) {\n const idx = parent.children.indexOf(block.block_id!);\n for (let i = idx - 1; i >= 0; i--) {\n const sib = ctx.blockMap.get(parent.children[i]!);\n if (sib?.block_type === 13) order++;\n else break;\n }\n }\n return {\n type: 'ordered',\n order,\n text: block.ordered ? ctx.parseText(block.ordered) : [],\n children: ctx.parseChildren(block),\n };\n },\n};\n","import type { BlockParser, ParserContext } from '../parser.js';\nimport type { DocxBlock } from '../../types.js';\nimport type { MdBlockNode } from '../types.js';\n\nconst codeLangMap: Record<number, string> = {\n 1: '', 2: 'abap', 3: 'ada', 4: 'apache', 5: 'apex', 6: 'assembly', 7: 'bash', 8: 'csharp',\n 9: 'cpp', 10: 'c', 11: 'cobol', 12: 'css', 13: 'coffeescript', 14: 'd', 15: 'dart',\n 16: 'delphi', 17: 'django', 18: 'dockerfile', 19: 'erlang', 20: 'fortran', 21: 'foxpro',\n 22: 'go', 23: 'groovy', 24: 'html', 25: 'htmlbars', 26: 'http', 27: 'haskell', 28: 'json',\n 29: 'java', 30: 'javascript', 31: 'julia', 32: 'kotlin', 33: 'latex', 34: 'lisp',\n 35: 'logo', 36: 'lua', 37: 'matlab', 38: 'makefile', 39: 'markdown', 40: 'nginx',\n 41: 'objectivec', 42: 'openedge-abl', 43: 'php', 44: 'perl', 45: 'postscript',\n 46: 'powershell', 47: 'prolog', 48: 'protobuf', 49: 'python', 50: 'r', 51: 'rpg',\n 52: 'ruby', 53: 'rust', 54: 'sas', 55: 'scss', 56: 'sql', 57: 'scala', 58: 'scheme',\n 59: 'scratch', 60: 'shell', 61: 'swift', 62: 'thrift', 63: 'typescript', 64: 'vbscript',\n 65: 'vbnet', 66: 'xml', 67: 'yaml',\n};\n\nexport const codeParser: BlockParser = {\n blockType: 14,\n parse (block: DocxBlock, _ctx: ParserContext): MdBlockNode {\n const lang = codeLangMap[block.code?.style?.language ?? 1] ?? '';\n const content = block.code?.elements?.map(e => e.text_run?.content ?? '').join('') ?? '';\n return {\n type: 'codeBlock',\n lang,\n content,\n };\n },\n};\n","import type { BlockParser, ParserContext } from '../parser.js';\nimport type { DocxBlock } from '../../types.js';\nimport type { MdBlockNode } from '../types.js';\n\nexport const quoteParser: BlockParser = {\n blockType: 15,\n parse (block: DocxBlock, ctx: ParserContext): MdBlockNode {\n return {\n type: 'quote',\n children: block.quote ? [{ type: 'paragraph', children: ctx.parseText(block.quote) }] : [],\n };\n },\n};\n","import type { BlockParser, ParserContext } from '../parser.js';\nimport type { DocxBlock } from '../../types.js';\nimport type { MdBlockNode } from '../types.js';\n\nexport const equationParser: BlockParser = {\n blockType: 16,\n parse (block: DocxBlock, ctx: ParserContext): MdBlockNode {\n return {\n type: 'paragraph',\n children: block.equation ? ctx.parseText(block.equation) : [],\n };\n },\n};\n","import type { BlockParser, ParserContext } from '../parser.js';\nimport type { DocxBlock } from '../../types.js';\nimport type { MdBlockNode } from '../types.js';\n\nexport const todoParser: BlockParser = {\n blockType: 17,\n parse (block: DocxBlock, ctx: ParserContext): MdBlockNode {\n return {\n type: 'todo',\n checked: block.todo?.style?.done ?? false,\n text: block.todo ? ctx.parseText(block.todo) : [],\n };\n },\n};\n","import type { BlockParser, ParserContext } from '../parser.js';\nimport type { DocxBlock } from '../../types.js';\nimport type { MdBlockNode } from '../types.js';\n\nexport const calloutParser: BlockParser = {\n blockType: 19,\n parse (block: DocxBlock, ctx: ParserContext): MdBlockNode {\n return {\n type: 'callout',\n children: ctx.parseChildren(block),\n };\n },\n};\n","import type { BlockParser } from '../parser.js';\nimport type { DocxBlock } from '../../types.js';\nimport type { MdBlockNode } from '../types.js';\n\nexport const dividerParser: BlockParser = {\n blockType: 22,\n parse (_block: DocxBlock, _ctx): MdBlockNode {\n return { type: 'divider' };\n },\n};\n","import type { BlockParser, ParserContext } from '../parser.js';\nimport type { DocxBlock } from '../../types.js';\nimport type { MdBlockNode } from '../types.js';\n\nexport const gridParser: BlockParser = {\n blockType: 24,\n parse (block: DocxBlock, ctx: ParserContext): MdBlockNode {\n const children: MdBlockNode[] = [];\n for (const colId of block.children ?? []) {\n const col = ctx.blockMap.get(colId);\n if (!col) continue;\n for (const id of col.children ?? []) {\n const child = ctx.blockMap.get(id);\n if (child) {\n const node = ctx.parseBlock(child);\n if (node) children.push(node);\n }\n }\n }\n return { type: 'grid', children };\n },\n};\n","import type { BlockParser } from '../parser.js';\nimport type { DocxBlock } from '../../types.js';\nimport type { MdBlockNode } from '../types.js';\n\nexport const imageParser: BlockParser = {\n blockType: 27,\n parse (block: DocxBlock, _ctx): MdBlockNode {\n const token = block.image?.token ?? '';\n return {\n type: 'image',\n alt: `图片-${token}`,\n src: token,\n };\n },\n};\n","import type { BlockParser, ParserContext } from '../parser.js';\nimport type { DocxBlock } from '../../types.js';\nimport type { MdBlockNode, MdInlineNode, MdTableRow } from '../types.js';\n\nexport const tableParser: BlockParser = {\n blockType: 31,\n parse (block: DocxBlock, ctx: ParserContext): MdBlockNode {\n const t = block.table!;\n const cols = t.property.column_size;\n const mergeInfos = t.property.merge_info ?? [];\n\n const rows: MdTableRow[] = [];\n\n for (let i = 0; i < (t.cells?.length ?? 0); i++) {\n const cellId = t.cells![i]!;\n const cell = ctx.blockMap.get(cellId);\n\n // Collect inline content from cell children\n const content: MdBlockNode[] = [];\n if (cell) {\n for (const childId of cell.children ?? []) {\n const child = ctx.blockMap.get(childId);\n if (!child) continue;\n const node = ctx.parseBlock(child);\n if (node) content.push(node);\n }\n }\n\n // Flatten block content to inline nodes (for table cells)\n const inlineContent = flattenToInline(content);\n\n const row = Math.floor(i / cols);\n const col = i % cols;\n if (!rows[row]) rows[row] = { cells: [] };\n rows[row]!.cells[col] = { content: inlineContent };\n }\n\n // Apply merge_info using array index (legacy logic)\n for (let i = 0; i < mergeInfos.length; i++) {\n const m = mergeInfos[i]!;\n const row = Math.floor(i / cols);\n const col = i % cols;\n if (rows[row]?.cells[col]) {\n rows[row]!.cells[col]!.rowSpan = m.row_span > 1 ? m.row_span : undefined;\n rows[row]!.cells[col]!.colSpan = m.col_span > 1 ? m.col_span : undefined;\n }\n }\n\n // Build skip set for cells covered by rowSpan / colSpan\n const skipSet = new Set<string>();\n for (let r = 0; r < rows.length; r++) {\n for (let c = 0; c < (rows[r]?.cells.length ?? 0); c++) {\n const cell = rows[r]!.cells[c]!;\n const rs = cell.rowSpan ?? 1;\n const cs = cell.colSpan ?? 1;\n if (rs > 1 || cs > 1) {\n for (let rr = r; rr < r + rs; rr++) {\n for (let cc = c; cc < c + cs; cc++) {\n if (rr === r && cc === c) continue;\n skipSet.add(`${rr}-${cc}`);\n }\n }\n }\n }\n }\n\n // Filter out covered cells\n const filteredRows: MdTableRow[] = [];\n for (let r = 0; r < rows.length; r++) {\n const cells = [];\n for (let c = 0; c < (rows[r]?.cells.length ?? 0); c++) {\n if (!skipSet.has(`${r}-${c}`)) {\n cells.push(rows[r]!.cells[c]!);\n }\n }\n if (cells.length > 0) {\n filteredRows.push({ cells });\n }\n }\n\n return { type: 'table', rows: filteredRows };\n },\n};\n\nfunction flattenToInline (nodes: MdBlockNode[]): MdInlineNode[] {\n const result: MdInlineNode[] = [];\n for (const node of nodes) {\n if (node.type === 'paragraph') {\n result.push(...node.children);\n }\n }\n return result;\n}\n","import type { BlockParser, ParserContext } from '../parser.js';\nimport type { DocxBlock } from '../../types.js';\nimport type { MdBlockNode } from '../types.js';\n\nexport const quoteContainerParser: BlockParser = {\n blockType: 34,\n parse (block: DocxBlock, ctx: ParserContext): MdBlockNode {\n return {\n type: 'quote',\n children: ctx.parseChildren(block),\n };\n },\n};\n","import type { BlockParser } from '../parser.js';\nimport type { DocxBlock } from '../../types.js';\nimport type { MdBlockNode } from '../types.js';\n\nexport const whiteboardParser: BlockParser = {\n blockType: 43,\n parse (block: DocxBlock, _ctx): MdBlockNode {\n const token = block.board?.token ?? '';\n return {\n type: 'whiteboard',\n token,\n };\n },\n};\n","import type { BlockParser, ParserContext } from '../parser.js';\nimport type { DocxBlock } from '../../types.js';\nimport type { MdBlockNode } from '../types.js';\n\nexport const sheetBlockParser: BlockParser = {\n blockType: 30,\n parse (block: DocxBlock, _ctx: ParserContext): MdBlockNode {\n const token = (block as any).sheet?.token ?? '';\n return { type: 'sheet', token };\n },\n};\n","import type { Parser } from '../parser.js';\nimport { pageParser } from './page.js';\nimport { textParser } from './text.js';\nimport {\n heading1Parser, heading2Parser, heading3Parser, heading4Parser, heading5Parser, heading6Parser, heading7Parser,\n heading8Parser, heading9Parser,\n} from './heading.js';\nimport { bulletParser } from './bullet.js';\nimport { orderedParser } from './ordered.js';\nimport { codeParser } from './code.js';\nimport { quoteParser } from './quote.js';\nimport { equationParser } from './equation.js';\nimport { todoParser } from './todo.js';\nimport { calloutParser } from './callout.js';\nimport { dividerParser } from './divider.js';\nimport { gridParser } from './grid.js';\nimport { imageParser } from './image.js';\nimport { tableParser } from './table.js';\nimport { quoteContainerParser } from './quoteContainer.js';\nimport { whiteboardParser } from './whiteboard.js';\nimport { sheetBlockParser } from './sheet.js';\n\nexport function registerBuiltinParsers (parser: Parser): void {\n parser.register(pageParser);\n parser.register(textParser);\n parser.register(heading1Parser);\n parser.register(heading2Parser);\n parser.register(heading3Parser);\n parser.register(heading4Parser);\n parser.register(heading5Parser);\n parser.register(heading6Parser);\n parser.register(heading7Parser);\n parser.register(heading8Parser);\n parser.register(heading9Parser);\n parser.register(bulletParser);\n parser.register(orderedParser);\n parser.register(codeParser);\n parser.register(quoteParser);\n parser.register(equationParser);\n parser.register(todoParser);\n parser.register(calloutParser);\n parser.register(dividerParser);\n parser.register(gridParser);\n parser.register(imageParser);\n parser.register(tableParser);\n parser.register(quoteContainerParser);\n parser.register(whiteboardParser);\n parser.register(sheetBlockParser);\n}\n","import { Registry } from '../core/registry.js';\nimport type { DocSourceType } from './transformer.js';\nimport type { MdBlockNode, MdInlineNode } from './types.js';\n\nexport interface NodeSerializer {\n type: string;\n\n serialize (node: MdBlockNode, ctx: SerializeContext): string;\n}\n\nexport interface SerializeOptions {\n sourceType?: DocSourceType;\n}\n\nexport interface SerializeContext {\n sourceType: DocSourceType;\n\n serialize (node: MdBlockNode, indent?: number): string;\n\n serializeInline (nodes: MdInlineNode[]): string;\n}\n\nexport class MdSerializer {\n private registry = new Registry<string, NodeSerializer>();\n\n register (serializer: NodeSerializer): void {\n this.registry.register(serializer.type, serializer);\n }\n\n serialize (root: MdBlockNode, options: SerializeOptions = {}): string {\n const ctx: SerializeContext = {\n sourceType: options.sourceType ?? 'docx',\n serialize: (node: MdBlockNode, indent = 0): string => {\n const serializer = this.registry.get(node.type);\n if (serializer) {\n return serializer.serialize(node, ctx);\n }\n return '';\n },\n serializeInline: (nodes: MdInlineNode[]): string => {\n return nodes.map(n => serializeInlineNode(n)).join('');\n },\n };\n return ctx.serialize(root);\n }\n}\n\nfunction serializeInlineNode (node: MdInlineNode): string {\n switch (node.type) {\n case 'text':\n return node.content;\n case 'bold':\n return `**${node.children.map(serializeInlineNode).join('')}**`;\n case 'italic':\n return `_${node.children.map(serializeInlineNode).join('')}_`;\n case 'strikethrough':\n return `~~${node.children.map(serializeInlineNode).join('')}~~`;\n case 'underline':\n return `<u>${node.children.map(serializeInlineNode).join('')}</u>`;\n case 'inlineCode':\n return `\\`${node.content}\\``;\n case 'link':\n return `[${node.children.map(serializeInlineNode).join('')}](${node.url})`;\n case 'mentionUser':\n return node.userId;\n case 'mentionDoc':\n return `[${node.title}](${node.url})`;\n case 'equation':\n return node.inline ? `$${node.content}$` : `$$${node.content}$$`;\n default:\n return '';\n }\n}\n\n// ─── Built-in Serializers ───────────────────────────────────────────────────\n\nconst pageSerializer: NodeSerializer = {\n type: 'page',\n serialize (node, ctx) {\n if (node.type !== 'page') return '';\n const title = ctx.serializeInline(node.title);\n let s = title ? `# ${title}\\n\\n` : '';\n s += node.children.map(child => ctx.serialize(child)).join('');\n return s;\n },\n};\n\nconst headingSerializer: NodeSerializer = {\n type: 'heading',\n serialize (node, ctx) {\n if (node.type !== 'heading') return '';\n return `${'#'.repeat(node.level)} ${ctx.serializeInline(node.children)}\\n\\n`;\n },\n};\n\nconst paragraphSerializer: NodeSerializer = {\n type: 'paragraph',\n serialize (node, ctx) {\n if (node.type !== 'paragraph') return '';\n return `${ctx.serializeInline(node.children)}\\n\\n`;\n },\n};\n\nconst bulletSerializer: NodeSerializer = {\n type: 'bullet',\n serialize (node, ctx) {\n if (node.type !== 'bullet') return '';\n let s = `- ${ctx.serializeInline(node.text)}\\n`;\n for (const child of node.children) {\n const childStr = ctx.serialize(child);\n if (childStr) {\n s += childStr.split('\\n').map((line, i, arr) => {\n if (!line && i === arr.length - 1) return '';\n return `\\t${line}`;\n }).join('\\n');\n }\n }\n return s;\n },\n};\n\nconst orderedSerializer: NodeSerializer = {\n type: 'ordered',\n serialize (node, ctx) {\n if (node.type !== 'ordered') return '';\n let s = `${node.order}. ${ctx.serializeInline(node.text)}\\n`;\n for (const child of node.children) {\n const childStr = ctx.serialize(child);\n if (childStr) {\n s += childStr.split('\\n').map((line, i, arr) => {\n if (!line && i === arr.length - 1) return '';\n return `\\t${line}`;\n }).join('\\n');\n }\n }\n return s;\n },\n};\n\nconst codeBlockSerializer: NodeSerializer = {\n type: 'codeBlock',\n serialize (node) {\n if (node.type !== 'codeBlock') return '';\n return `\\`\\`\\`${node.lang}\n${node.content}\n\\`\\`\\`\n\n`;\n },\n};\n\nconst todoSerializer: NodeSerializer = {\n type: 'todo',\n serialize (node, ctx) {\n if (node.type !== 'todo') return '';\n const checked = node.checked ? 'x' : ' ';\n return `- [${checked}] ${ctx.serializeInline(node.text)}\\n`;\n },\n};\n\nconst calloutSerializer: NodeSerializer = {\n type: 'callout',\n serialize (node, ctx) {\n if (node.type !== 'callout') return '';\n let s = '>[!TIP]\\n';\n for (const child of node.children) {\n const childStr = ctx.serialize(child);\n if (childStr) {\n s += childStr.split('\\n').map((line, i, arr) => {\n if (!line && i === arr.length - 1) return '';\n return `> ${line}`;\n }).join('\\n');\n }\n }\n return s;\n },\n};\n\nconst quoteSerializer: NodeSerializer = {\n type: 'quote',\n serialize (node, ctx) {\n if (node.type !== 'quote') return '';\n let s = '';\n for (const child of node.children) {\n const childStr = ctx.serialize(child);\n if (childStr) {\n s += childStr.split('\\n').map((line, i, arr) => {\n if (!line && i === arr.length - 1) return '';\n return `> ${line}`;\n }).join('\\n');\n }\n }\n return s;\n },\n};\n\nconst dividerSerializer: NodeSerializer = {\n type: 'divider',\n serialize () {\n return '---\\n\\n';\n },\n};\n\nconst imageSerializer: NodeSerializer = {\n type: 'image',\n serialize (node) {\n if (node.type !== 'image') return '';\n return `\\n`;\n },\n};\n\nconst whiteboardSerializer: NodeSerializer = {\n type: 'whiteboard',\n serialize (node) {\n if (node.type !== 'whiteboard') return '';\n return `\\n`;\n },\n};\n\nconst tableSerializer: NodeSerializer = {\n type: 'table',\n serialize (node, ctx) {\n if (node.type !== 'table') return '';\n let buf = '<table>\\n';\n for (const row of node.rows) {\n buf += '<tr>\\n';\n for (const cell of row.cells) {\n let attrs = '';\n if (cell.rowSpan && cell.rowSpan > 1) attrs += ` rowspan=\"${cell.rowSpan}\"`;\n if (cell.colSpan && cell.colSpan > 1) attrs += ` colspan=\"${cell.colSpan}\"`;\n const content = ctx.serializeInline(cell.content);\n buf += `<td${attrs}>${content}</td>`;\n }\n buf += '</tr>\\n';\n }\n buf += '</table>\\n';\n return buf;\n },\n};\n\nconst gridSerializer: NodeSerializer = {\n type: 'grid',\n serialize (node, ctx) {\n if (node.type !== 'grid') return '';\n return node.children.map(child => ctx.serialize(child)).join('');\n },\n};\n\nconst htmlSerializer: NodeSerializer = {\n type: 'html',\n serialize (node) {\n if (node.type !== 'html') return '';\n return node.content;\n },\n};\n\nconst sheetResolvedSerializer: NodeSerializer = {\n type: 'sheetResolved',\n serialize (node, ctx) {\n if (node.type !== 'sheetResolved') return '';\n let out = '';\n for (const s of node.sheets) {\n if (ctx.sourceType === 'sheet') {\n out += `## ${node.title}-${s.title}\\n\\n`;\n }\n if (s.error) { out += `> ${s.error}\\n\\n`; continue; }\n if (!s.rows.length) { out += '_(空表)_\\n\\n'; continue; }\n const [head, ...body] = s.rows;\n if (!head) { out += '_(空表)_\\n\\n'; continue; }\n out += `| ${head.join(' | ')} |\\n`;\n out += `| ${head.map(() => '---').join(' | ')} |\\n`;\n for (const r of body) out += `| ${r.join(' | ')} |\\n`;\n out += '\\n';\n }\n return out;\n },\n};\n\nexport function registerBuiltinSerializers (serializer: MdSerializer): void {\n serializer.register(pageSerializer);\n serializer.register(headingSerializer);\n serializer.register(paragraphSerializer);\n serializer.register(bulletSerializer);\n serializer.register(orderedSerializer);\n serializer.register(codeBlockSerializer);\n serializer.register(todoSerializer);\n serializer.register(calloutSerializer);\n serializer.register(quoteSerializer);\n serializer.register(dividerSerializer);\n serializer.register(imageSerializer);\n serializer.register(whiteboardSerializer);\n serializer.register(tableSerializer);\n serializer.register(gridSerializer);\n serializer.register(htmlSerializer);\n serializer.register(sheetResolvedSerializer);\n}\n","import type { WNode, WStyle } from './types.js';\n\n// ─── Node Traversal ─────────────────────────────────────────────────────────\n\nexport type NodePredicate = (node: WNode) => boolean;\n\n/**\n * 遍历节点树,对每个节点执行回调。\n * 基于 parent_id / children 关系构建树,深度优先遍历。\n */\nexport function walkNodes (\n nodes: WNode[],\n visitor: (node: WNode, parent: WNode | null, depth: number) => void | false,\n): void {\n const nodeMap = new Map<string, WNode>();\n for (const n of nodes) {\n if (n.id) nodeMap.set(n.id, n);\n }\n\n // 找到根节点(无 parent_id)\n const roots = nodes.filter(n => !n.parent_id);\n\n function walk (node: WNode, parent: WNode | null, depth: number): void {\n const result = visitor(node, parent, depth);\n if (result === false) return; // 返回 false 时跳过子节点\n\n // 遍历 children\n const childIds = node.children ?? [];\n for (const cid of childIds) {\n const child = nodeMap.get(cid);\n if (child) walk(child, node, depth + 1);\n }\n\n // 遍历 table cells 中引用的子节点\n if (node.table?.cells) {\n for (const cell of node.table.cells) {\n const cellChildren = cell.children ?? [];\n for (const cid of cellChildren) {\n const child = nodeMap.get(cid);\n if (child) walk(child, node, depth + 1);\n }\n }\n }\n\n // 遍历 mind_map_root 的方向子节点\n if (node.mind_map_root) {\n const dirs = [\n ...(node.mind_map_root.up_children ?? []),\n ...(node.mind_map_root.down_children ?? []),\n ...(node.mind_map_root.left_children ?? []),\n ...(node.mind_map_root.right_children ?? []),\n ];\n for (const cid of dirs) {\n const child = nodeMap.get(cid);\n if (child) walk(child, node, depth + 1);\n }\n }\n\n // 遍历 mind_map_node 的子节点\n if (node.mind_map_node?.children) {\n for (const cid of node.mind_map_node.children) {\n const child = nodeMap.get(cid);\n if (child) walk(child, node, depth + 1);\n }\n }\n }\n\n for (const root of roots) {\n walk(root, null, 0);\n }\n}\n\n/**\n * 过滤节点树:排除不满足 predicate 的节点及其所有后代。\n * 返回过滤后的扁平数组,同时修正 children 引用。\n */\nexport function filterNodes (nodes: WNode[], predicate: NodePredicate): WNode[] {\n const excluded = new Set<string>();\n\n // 先标记所有需要排除的节点\n walkNodes(nodes, (node, _parent, _depth) => {\n if (!node.id) return;\n // 如果父节点已被排除,子节点也排除\n if (node.parent_id && excluded.has(node.parent_id)) {\n excluded.add(node.id);\n return false;\n }\n if (!predicate(node)) {\n excluded.add(node.id);\n return false; // 跳过子树\n }\n });\n\n // 过滤并修正 children 引用\n return nodes\n .filter(n => !n.id || !excluded.has(n.id))\n .map(n => {\n const patched = { ...n };\n if (patched.children) {\n patched.children = patched.children.filter(id => !excluded.has(id));\n }\n if (patched.table?.cells) {\n patched.table = {\n ...patched.table,\n cells: patched.table.cells.map(cell => ({\n ...cell,\n children: cell.children?.filter(id => !excluded.has(id)),\n })),\n };\n }\n if (patched.mind_map_root) {\n patched.mind_map_root = {\n ...patched.mind_map_root,\n up_children: patched.mind_map_root.up_children?.filter(id => !excluded.has(id)),\n down_children: patched.mind_map_root.down_children?.filter(id => !excluded.has(id)),\n left_children: patched.mind_map_root.left_children?.filter(id => !excluded.has(id)),\n right_children: patched.mind_map_root.right_children?.filter(id => !excluded.has(id)),\n };\n }\n if (patched.mind_map_node?.children) {\n patched.mind_map_node = {\n ...patched.mind_map_node,\n children: patched.mind_map_node.children.filter(id => !excluded.has(id)),\n };\n }\n return patched;\n });\n}\n\n// ─── Constants ───────────────────────────────────────────────────────────────\n\nexport const PADDING = 24;\n\nexport const BORDER_WIDTH_MAP: Record<string, number> = {\n extra_narrow: 0.5,\n narrow: 1,\n medium: 2,\n bold: 3,\n};\n\nexport const DASH_ARRAY_MAP: Record<string, string> = {\n solid: '',\n none: '',\n dash: '8,4',\n dot: '2,2',\n};\n\n// ─── Utility Functions ───────────────────────────────────────────────────────\n\n/** 将数值四舍五入到 2 位小数,去除尾部多余零 */\nexport function r (v: number): number {\n return Math.round(v * 100) / 100;\n}\n\nexport function esc (s: string): string {\n return s.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>').replace(/\"/g, '"');\n}\n\nexport function styleAttrs (s?: WStyle): string {\n if (!s) return 'fill=\"none\" stroke=\"#333\"';\n const parts: string[] = [];\n // fill\n if (s.fill_color) parts.push(`fill=\"${s.fill_color}\"`);\n else parts.push('fill=\"none\"');\n // fill-opacity: 省略默认值 1\n if (s.fill_opacity != null && s.fill_opacity !== 100) parts.push(`fill-opacity=\"${r(s.fill_opacity / 100)}\"`);\n // stroke\n if (s.border_style === 'none') parts.push('stroke=\"none\"');\n else if (s.border_color) parts.push(`stroke=\"${s.border_color}\"`);\n else parts.push('stroke=\"#333\"');\n // stroke-width: 省略默认值 1\n const sw = BORDER_WIDTH_MAP[s.border_width ?? 'narrow'] ?? 1;\n if (sw !== 1) parts.push(`stroke-width=\"${sw}\"`);\n // stroke-opacity: 省略默认值 1\n if (s.border_opacity != null && s.border_opacity !== 100) parts.push(`stroke-opacity=\"${r(s.border_opacity / 100)}\"`);\n // stroke-dasharray\n const dash = s.border_style ? DASH_ARRAY_MAP[s.border_style] : '';\n if (dash) parts.push(`stroke-dasharray=\"${dash}\"`);\n return parts.join(' ');\n}\n\nexport function transformAttr (n: WNode): string {\n const parts: string[] = [];\n if (n.x != null || n.y != null) parts.push(`translate(${r(n.x ?? 0)},${r(n.y ?? 0)})`);\n if (n.angle) {\n const cx = r((n.width ?? 0) / 2);\n const cy = r((n.height ?? 0) / 2);\n parts.push(`rotate(${r(n.angle)},${cx},${cy})`);\n }\n if (n.style?.h_flip || n.style?.v_flip) {\n const sx = n.style.h_flip ? -1 : 1;\n const sy = n.style.v_flip ? -1 : 1;\n const cx = r((n.width ?? 0) / 2);\n const cy = r((n.height ?? 0) / 2);\n parts.push(`translate(${cx},${cy}) scale(${sx},${sy}) translate(${-cx},${-cy})`);\n }\n return parts.length ? ` transform=\"${parts.join(' ')}\"` : '';\n}\n\n/** 需要保留 data-type 的节点类型(有特殊语义) */\nconst TYPED_NODES = new Set(['paint', 'group', 'image', 'section', 'table', 'mind_map']);\n\nconst debugAll = typeof process !== 'undefined' && !!process.env.WHITEBOARD_DEBUG;\n\n/** 生成节点的公共属性:data-id(仅在被引用或 debug 时输出)+ 可选 data-type */\nexport function nodeDataAttrs (n: WNode, referencedIds?: ReadonlySet<string>): string {\n const showId = n.id && (debugAll || referencedIds?.has(n.id));\n const id = showId ? ` data-id=\"${n.id}\"` : '';\n const dt = TYPED_NODES.has(n.type) ? ` data-type=\"${n.type}\"` : '';\n return `${id}${dt}`;\n}\n\n/** 包裹 <g> 标签,自动过滤空内容,并附加节点数据属性 */\nexport function gWrap (tf: string, parts: string[], n?: WNode, referencedIds?: ReadonlySet<string>, extraAttrs?: string): string {\n const inner = parts.filter(Boolean).join('\\n');\n const da = n ? nodeDataAttrs(n, referencedIds) : '';\n const extra = extraAttrs ? ` ${extraAttrs}` : '';\n return `<g${tf}${da}${extra}>${inner ? '\\n' + inner + '\\n' : ''}</g>`;\n}\n","// ─── SVG Defs (arrow markers, on-demand) ─────────────────────────────────────\n\nconst MARKER_DEFS: Record<string, string> = {\n 'arrow-line': '<marker id=\"arrow-line\" viewBox=\"0 0 10 10\" refX=\"10\" refY=\"5\" markerWidth=\"8\" markerHeight=\"8\" orient=\"auto-start-reverse\"><path d=\"M0 0L10 5L0 10\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"/></marker>',\n 'arrow-triangle': '<marker id=\"arrow-triangle\" viewBox=\"0 0 10 10\" refX=\"10\" refY=\"5\" markerWidth=\"8\" markerHeight=\"8\" orient=\"auto-start-reverse\"><path d=\"M0 0L10 5L0 10Z\" fill=\"currentColor\"/></marker>',\n 'arrow-empty-triangle': '<marker id=\"arrow-empty-triangle\" viewBox=\"0 0 10 10\" refX=\"10\" refY=\"5\" markerWidth=\"8\" markerHeight=\"8\" orient=\"auto-start-reverse\"><path d=\"M0 0L10 5L0 10Z\" fill=\"#fff\" stroke=\"currentColor\"/></marker>',\n 'arrow-circle': '<marker id=\"arrow-circle\" viewBox=\"0 0 10 10\" refX=\"5\" refY=\"5\" markerWidth=\"8\" markerHeight=\"8\" orient=\"auto-start-reverse\"><circle cx=\"5\" cy=\"5\" r=\"4\" fill=\"currentColor\"/></marker>',\n 'arrow-empty-circle': '<marker id=\"arrow-empty-circle\" viewBox=\"0 0 10 10\" refX=\"5\" refY=\"5\" markerWidth=\"8\" markerHeight=\"8\" orient=\"auto-start-reverse\"><circle cx=\"5\" cy=\"5\" r=\"4\" fill=\"#fff\" stroke=\"currentColor\"/></marker>',\n 'arrow-diamond': '<marker id=\"arrow-diamond\" viewBox=\"0 0 12 12\" refX=\"6\" refY=\"6\" markerWidth=\"10\" markerHeight=\"10\" orient=\"auto-start-reverse\"><path d=\"M0 6L6 0L12 6L6 12Z\" fill=\"currentColor\"/></marker>',\n 'arrow-empty-diamond': '<marker id=\"arrow-empty-diamond\" viewBox=\"0 0 12 12\" refX=\"6\" refY=\"6\" markerWidth=\"10\" markerHeight=\"10\" orient=\"auto-start-reverse\"><path d=\"M0 6L6 0L12 6L6 12Z\" fill=\"#fff\" stroke=\"currentColor\"/></marker>',\n};\n\nexport function renderDefs (usedMarkers: Set<string>): string {\n if (usedMarkers.size === 0) return '';\n const markers = [...usedMarkers].map(id => MARKER_DEFS[id]).filter(Boolean).join('');\n return `<defs>${markers}</defs>`;\n}\n\nconst ARROW_STYLE_MAP: Record<string, string> = {\n line_arrow: 'arrow-line',\n triangle_arrow: 'arrow-triangle',\n empty_triangle_arrow: 'arrow-empty-triangle',\n circle_arrow: 'arrow-circle',\n empty_circle_arrow: 'arrow-empty-circle',\n diamond_arrow: 'arrow-diamond',\n empty_diamond_arrow: 'arrow-empty-diamond',\n single_arrow: 'arrow-triangle',\n multi_arrow: 'arrow-triangle',\n exact_single_arrow: 'arrow-triangle',\n x_arrow: 'arrow-line',\n};\n\nexport function arrowMarkerRef (style: string | undefined, usedMarkers: Set<string>): string {\n if (!style || style === 'none') return '';\n const id = ARROW_STYLE_MAP[style];\n if (!id) return '';\n usedMarkers.add(id);\n return `url(#${id})`;\n}\n","import { Registry } from '../core/registry.js';\nimport type { NodeRenderer } from './types.js';\n\n// ─── Renderer Registry ──────────────────────────────────────────────────────\n\nconst registry = new Registry<string, NodeRenderer>();\n\nexport function registerRenderer (renderer: NodeRenderer): void {\n registry.register(renderer.type, renderer);\n}\n\nexport function getRenderer (type: string): NodeRenderer | undefined {\n return registry.get(type);\n}\n\nexport function getAllRenderers (): ReadonlyMap<string, NodeRenderer> {\n return registry.getAll();\n}\n","import type { WParagraph, WRichText, WText } from './types.js';\nimport { esc, r } from './utils.js';\n\n// ─── Text Rendering ──────────────────────────────────────────────────────────\n\nexport function renderTextContent (text: WText | undefined, w: number, h: number): string {\n if (!text) return '';\n\n // 优先使用 rich_text\n if (text.rich_text?.paragraphs?.length) {\n return renderRichText(text.rich_text, text, w, h);\n }\n\n // 降级到纯文本\n if (!text.text) return '';\n const fontSize = text.font_size ?? 14;\n const color = text.text_color ?? '#333';\n const lineHeight = fontSize * 1.4;\n const anchor = alignToAnchor(text.horizontal_align);\n const tx = alignToX(text.horizontal_align, w);\n const maxWidth = w - 8;\n\n // 拆分换行 + 自动折行\n const allLines = wrapTextLines(text.text, maxWidth, fontSize);\n const startY = calcMultilineStartY(text.vertical_align, h, fontSize, allLines.length, lineHeight);\n\n const attrs: string[] = [`font-size=\"${fontSize}\"`, `fill=\"${color}\"`];\n if (text.font_weight === 'bold') attrs.push('font-weight=\"bold\"');\n if (text.italic) attrs.push('font-style=\"italic\"');\n if (anchor !== 'start') attrs.push(`text-anchor=\"${anchor}\"`);\n const deco = textDecoration(text.underline, text.line_through);\n if (deco) attrs.push(`text-decoration=\"${deco}\"`);\n\n if (allLines.length <= 1) {\n const ty = startY;\n attrs.push(`x=\"${r(tx)}\"`, `y=\"${r(ty)}\"`);\n const rot = textRotation(text.angle, tx, ty);\n if (rot) attrs.push(`transform=\"${rot}\"`);\n const bgRect = textBgRect(text.text_background_color, tx, ty, estimateTextWidth(allLines[0] ?? '', fontSize), fontSize, anchor);\n return bgRect + `<text ${attrs.join(' ')}>${esc(allLines[0] ?? '')}</text>`;\n }\n\n // 多行:使用 tspan 逐行定位\n const tspans = allLines.map((line, i) =>\n `<tspan x=\"${r(tx)}\" y=\"${r(startY + i * lineHeight)}\">${esc(line)}</tspan>`,\n ).join('');\n return `<text ${attrs.join(' ')}>${tspans}</text>`;\n}\n\n// ─── Rich Text ───────────────────────────────────────────────────────────────\n\nfunction renderRichText (rt: WRichText, parentText: WText, w: number, h: number): string {\n const fontSize = parentText.font_size ?? 14;\n const lineHeight = fontSize * 1.4;\n const maxWidth = w - 8;\n const anchor = alignToAnchor(parentText.horizontal_align);\n const tx = alignToX(parentText.horizontal_align, w);\n const anchorAttr = anchor !== 'start' ? ` text-anchor=\"${anchor}\"` : '';\n\n // 将所有段落流式布局为视觉行\n const visualLines: string[] = [];\n for (const para of rt.paragraphs ?? []) {\n const segments = extractSegments(para, parentText);\n const paraLines = flowSegmentsIntoLines(segments, maxWidth);\n visualLines.push(...paraLines);\n }\n if (visualLines.length === 0) return '';\n\n const startY = calcMultilineStartY(parentText.vertical_align, h, fontSize, visualLines.length, lineHeight);\n return visualLines.map((spans, i) => {\n const y = startY + i * lineHeight;\n return `<text x=\"${r(tx)}\" y=\"${r(y)}\"${anchorAttr}>${spans}</text>`;\n }).join('\\n');\n}\n\n// ─── Segment extraction & flow layout ────────────────────────────────────────\n\ninterface TextSegment {\n text: string;\n attrs: string;\n wrapPrefix: string;\n wrapSuffix: string;\n fontSize: number;\n}\n\nfunction extractSegments (para: WParagraph, parentText: WText): TextSegment[] {\n const segments: TextSegment[] = [];\n for (const el of (para.elements ?? [])) {\n if (el.element_type === 0 && el.text_element) {\n segments.push({\n text: el.text_element.text ?? '',\n attrs: spanStyleAttr(el.text_element.text_style, parentText),\n wrapPrefix: '', wrapSuffix: '',\n fontSize: el.text_element.text_style?.font_size ?? parentText.font_size ?? 14,\n });\n } else if (el.element_type === 1 && el.link_element) {\n const href = el.link_element.herf ?? '';\n segments.push({\n text: el.link_element.text ?? href,\n attrs: spanStyleAttr(el.link_element.text_style, parentText, '#1677ff'),\n wrapPrefix: `<a href=\"${esc(href)}\">`, wrapSuffix: '</a>',\n fontSize: el.link_element.text_style?.font_size ?? parentText.font_size ?? 14,\n });\n } else if (el.element_type === 3 && el.mention_doc_element) {\n const url = el.mention_doc_element.doc_url ?? '';\n segments.push({\n text: '[doc]',\n attrs: spanStyleAttr(el.mention_doc_element.text_style, parentText, '#1677ff'),\n wrapPrefix: `<a href=\"${esc(url)}\">`, wrapSuffix: '</a>',\n fontSize: el.mention_doc_element.text_style?.font_size ?? parentText.font_size ?? 14,\n });\n }\n }\n return segments;\n}\n\nfunction flowSegmentsIntoLines (segments: TextSegment[], maxWidth: number): string[] {\n const lines: string[] = [];\n let curParts: string[] = [];\n let curWidth = 0;\n\n const flush = () => {\n lines.push(curParts.join(''));\n curParts = [];\n curWidth = 0;\n };\n\n for (const seg of segments) {\n const parts = seg.text.split('\\n');\n for (let pi = 0; pi < parts.length; pi++) {\n if (pi > 0) flush(); // 显式换行\n const part = parts[pi]!;\n if (!part) continue;\n\n const pw = estimateTextWidth(part, seg.fontSize);\n if (curWidth + pw <= maxWidth || curWidth === 0) {\n curParts.push(renderSegSpan(part, seg));\n curWidth += pw;\n } else {\n // 字符级折行\n let remaining = part;\n while (remaining.length > 0) {\n const avail = curWidth === 0 ? maxWidth : maxWidth - curWidth;\n const { fitted, rest } = fitChars(remaining, avail, seg.fontSize);\n if (!fitted && curWidth > 0) {\n flush();\n continue;\n }\n const text = fitted || remaining.charAt(0);\n curParts.push(renderSegSpan(text, seg));\n curWidth += estimateTextWidth(text, seg.fontSize);\n remaining = fitted ? rest : remaining.slice(1);\n if (remaining.length > 0) flush();\n }\n }\n }\n }\n if (curParts.length > 0) flush();\n return lines.length ? lines : [''];\n}\n\nfunction renderSegSpan (text: string, seg: TextSegment): string {\n const tspan = `<tspan ${seg.attrs}>${esc(text)}</tspan>`;\n return seg.wrapPrefix ? `${seg.wrapPrefix}${tspan}${seg.wrapSuffix}` : tspan;\n}\n\n// ─── Style helpers ───────────────────────────────────────────────────────────\n\nfunction spanStyleAttr (\n s: { font_weight?: string; font_size?: number; text_color?: string; text_background_color?: string; line_through?: boolean; underline?: boolean; italic?: boolean } | undefined,\n parentText: WText,\n defaultColor?: string,\n): string {\n const fontSize = s?.font_size ?? parentText.font_size ?? 14;\n const color = s?.text_color ?? parentText.text_color ?? defaultColor ?? '#333';\n const attrs: string[] = [`font-size=\"${fontSize}\"`, `fill=\"${color}\"`];\n if (s?.font_weight === 'bold' || parentText.font_weight === 'bold') attrs.push('font-weight=\"bold\"');\n if (s?.italic || parentText.italic) attrs.push('font-style=\"italic\"');\n const deco = textDecoration(s?.underline || parentText.underline, s?.line_through || parentText.line_through);\n if (deco) attrs.push(`text-decoration=\"${deco}\"`);\n return attrs.join(' ');\n}\n\n/** 合并 underline + line-through,避免重复属性覆盖 */\nfunction textDecoration (underline?: boolean, lineThrough?: boolean): string {\n const parts: string[] = [];\n if (underline) parts.push('underline');\n if (lineThrough) parts.push('line-through');\n return parts.join(' ');\n}\n\n/** 文字旋转 transform */\nfunction textRotation (angle: number | undefined, cx: number, cy: number): string {\n if (!angle) return '';\n return `rotate(${angle},${r(cx)},${r(cy)})`;\n}\n\n/** 文字背景色矩形(SVG text 无 background 属性,用 rect 模拟)*/\nfunction textBgRect (bgColor: string | undefined, tx: number, ty: number, estWidth: number, fontSize: number, anchor: string): string {\n if (!bgColor) return '';\n let rx = tx;\n if (anchor === 'middle') rx = tx - estWidth / 2;\n else if (anchor === 'end') rx = tx - estWidth;\n return `<rect x=\"${r(rx)}\" y=\"${r(ty - fontSize)}\" width=\"${r(estWidth)}\" height=\"${r(fontSize * 1.3)}\" fill=\"${bgColor}\" rx=\"2\"/>`;\n}\n\n// ─── Layout helpers ──────────────────────────────────────────────────────────\n\nfunction alignToAnchor (align?: string): string {\n return align === 'right' ? 'end' : align === 'center' ? 'middle' : 'start';\n}\n\nfunction alignToX (align: string | undefined, w: number): number {\n return align === 'right' ? w : align === 'center' ? w / 2 : 4;\n}\n\nfunction calcTextY (align: string | undefined, h: number, fontSize: number): number {\n if (align === 'bottom') return h - 4;\n if (align === 'mid') return h / 2 + fontSize / 3;\n return fontSize + 4; // top (default)\n}\n\nfunction calcMultilineStartY (align: string | undefined, h: number, fontSize: number, lineCount: number, lineHeight: number): number {\n if (lineCount <= 1) return calcTextY(align, h, fontSize);\n if (align === 'bottom') return h - 4 - (lineCount - 1) * lineHeight;\n if (align === 'mid') {\n const blockH = (lineCount - 1) * lineHeight + fontSize;\n return (h - blockH) / 2 + fontSize;\n }\n return fontSize + 4; // top\n}\n\n// ─── Text measurement & wrapping ─────────────────────────────────────────────\n\nconst CJK_RE = /[\\u2E80-\\u9FFF\\uF900-\\uFAFF\\uFE30-\\uFE4F\\uFF00-\\uFFEF]/;\n\nfunction estimateTextWidth (text: string, fontSize: number): number {\n let w = 0;\n for (const ch of text) {\n w += CJK_RE.test(ch) ? fontSize * 0.9 : fontSize * 0.55;\n }\n return w;\n}\n\n/** 按 \\n 拆分 + 自动折行 */\nfunction wrapTextLines (text: string, maxWidth: number, fontSize: number): string[] {\n const rawLines = text.split('\\n');\n const result: string[] = [];\n for (const raw of rawLines) {\n if (maxWidth <= 0 || estimateTextWidth(raw, fontSize) <= maxWidth) {\n result.push(raw);\n continue;\n }\n let line = '';\n let lw = 0;\n for (const ch of raw) {\n const cw = CJK_RE.test(ch) ? fontSize * 0.9 : fontSize * 0.55;\n if (lw + cw > maxWidth && line.length > 0) {\n result.push(line);\n line = ch;\n lw = cw;\n } else {\n line += ch;\n lw += cw;\n }\n }\n if (line) result.push(line);\n }\n return result.length ? result : [''];\n}\n\n/** 在 maxWidth 内尽可能多地装入字符 */\nfunction fitChars (text: string, maxWidth: number, fontSize: number): { fitted: string; rest: string } {\n let w = 0;\n let i = 0;\n for (const ch of text) {\n const cw = CJK_RE.test(ch) ? fontSize * 0.9 : fontSize * 0.55;\n if (w + cw > maxWidth && i > 0) break;\n w += cw;\n i++;\n }\n return { fitted: text.slice(0, i), rest: text.slice(i) };\n}\n\n// ─── Cell Text ───────────────────────────────────────────────────────────────\n\n/** 表格单元格文本渲染:支持全量样式 + rich_text,回退到 tbl.meta.text */\nexport function renderCellText (\n cellText: WText,\n metaText: WText | undefined,\n cx: number, cy: number, cw: number, ch: number,\n): string {\n // 合并单元格文本和表格默认文本样式\n const merged: WText = {\n text: cellText.text,\n font_size: cellText.font_size ?? metaText?.font_size ?? 14,\n font_weight: cellText.font_weight ?? metaText?.font_weight,\n text_color: cellText.text_color ?? metaText?.text_color ?? '#333',\n text_background_color: cellText.text_background_color ?? metaText?.text_background_color,\n horizontal_align: cellText.horizontal_align ?? metaText?.horizontal_align,\n vertical_align: cellText.vertical_align ?? metaText?.vertical_align,\n italic: cellText.italic ?? metaText?.italic,\n underline: cellText.underline ?? metaText?.underline,\n line_through: cellText.line_through ?? metaText?.line_through,\n angle: cellText.angle ?? metaText?.angle,\n rich_text: cellText.rich_text ?? metaText?.rich_text,\n } as WText;\n\n // 渲染时需要在单元格内坐标系中偏移\n const inner = renderTextContent(merged, cw, ch);\n if (!inner) return '';\n return `<g transform=\"translate(${r(cx)},${r(cy)})\">${inner}</g>`;\n}\n","import type { RenderContext, WNode } from './types.js';\nimport { getRenderer } from './node-renderer.js';\nimport { gWrap, styleAttrs, transformAttr } from './utils.js';\nimport { renderTextContent } from './text.js';\n\n// ─── Default Render Context ─────────────────────────────────────────────────\n\nexport class DefaultRenderContext implements RenderContext {\n readonly nodeMap: ReadonlyMap<string, WNode>;\n readonly usedMarkers: Set<string>;\n readonly mindMapChildrenMap: ReadonlyMap<string, string[]>;\n readonly referencedIds: ReadonlySet<string>;\n\n constructor (opts: {\n nodeMap: Map<string, WNode>;\n usedMarkers: Set<string>;\n mindMapChildrenMap: Map<string, string[]>;\n referencedIds: Set<string>;\n }) {\n this.nodeMap = opts.nodeMap;\n this.usedMarkers = opts.usedMarkers;\n this.mindMapChildrenMap = opts.mindMapChildrenMap;\n this.referencedIds = opts.referencedIds;\n }\n\n renderNode (node: WNode): string {\n const renderer = getRenderer(node.type);\n if (renderer) return renderer.render(node, this);\n return this.renderFallback(node);\n }\n\n renderChildren (node: WNode): string {\n if (!node.children?.length) return '';\n return node.children\n .map(id => {\n const child = this.nodeMap.get(id);\n return child ? this.renderNode(child) : '';\n })\n .filter(Boolean)\n .join('\\n');\n }\n\n private renderFallback (n: WNode): string {\n const w = n.width ?? 80;\n const h = n.height ?? 40;\n const tf = transformAttr(n);\n const sa = styleAttrs(n.style);\n const text = renderTextContent(n.text, w, h);\n const children = this.renderChildren(n);\n return gWrap(tf, [`<rect width=\"${w}\" height=\"${h}\" ${sa} rx=\"2\"/>`, text, children], n, this.referencedIds, undefined);\n }\n}\n","import type { WNode } from './types.js';\nimport { BORDER_WIDTH_MAP, r } from './utils.js';\n\n// ─── Shape Path Registry ────────────────────────────────────────────────────\n\nexport type ShapePathFn = (w: number, h: number, sa: string, n: WNode) => string;\n\nconst registry = new Map<string, ShapePathFn>();\n\nexport function registerShapePath (types: string | string[], fn: ShapePathFn): void {\n const arr = Array.isArray(types) ? types : [types];\n for (const t of arr) registry.set(t, fn);\n}\n\nexport function getShapePath (type: string): ShapePathFn | undefined {\n return registry.get(type);\n}\n\n// ─── Default shape (fallback) ───────────────────────────────────────────────\n\nexport const defaultShapePath: ShapePathFn = (w, h, sa) =>\n `<rect width=\"${w}\" height=\"${h}\" rx=\"4\" ry=\"4\" ${sa}/>`;\n\n// ─── Register all built-in shapes ───────────────────────────────────────────\n\nregisterShapePath(\n ['rect', 'predefined_process', 'condition_shape', 'condition_shape2'],\n (w, h, sa) => `<rect width=\"${w}\" height=\"${h}\" ${sa}/>`,\n);\n\nregisterShapePath(\n ['round_rect', 'flow_chart_round_rect', 'data_flow_round_rect', 'mind_node_round_rect'],\n (w, h, sa) => `<rect width=\"${w}\" height=\"${h}\" rx=\"8\" ${sa}/>`,\n);\n\nregisterShapePath(\n ['round_rect2', 'flow_chart_round_rect2', 'mind_node_full_round_rect'],\n (w, h, sa) => `<rect width=\"${w}\" height=\"${h}\" rx=\"${r(Math.min(w, h) / 2)}\" ${sa}/>`,\n);\n\nregisterShapePath(\n ['ellipse', 'data_flow_ellipse', 'state_start', 'state_end'],\n (w, h, sa) => `<ellipse cx=\"${w / 2}\" cy=\"${h / 2}\" rx=\"${w / 2}\" ry=\"${h / 2}\" ${sa}/>`,\n);\n\nregisterShapePath(\n ['diamond', 'flow_chart_diamond'],\n (w, h, sa) => `<polygon points=\"${w / 2},0 ${w},${h / 2} ${w / 2},${h} 0,${h / 2}\" ${sa}/>`,\n);\n\nregisterShapePath('triangle', (w, h, sa) =>\n `<polygon points=\"${w / 2},0 ${w},${h} 0,${h}\" ${sa}/>`);\n\nregisterShapePath('right_triangle', (w, h, sa) =>\n `<polygon points=\"0,0 ${w},${h} 0,${h}\" ${sa}/>`);\n\nregisterShapePath(['hexagon', 'flow_chart_hexagon'], (w, h, sa) => {\n const dx = w * 0.2;\n return `<polygon points=\"${dx},0 ${w - dx},0 ${w},${h / 2} ${w - dx},${h} ${dx},${h} 0,${h / 2}\" ${sa}/>`;\n});\n\nregisterShapePath('pentagon', (w, h, sa) => {\n const cx = w / 2, top = 0, bot = h;\n const midY = h * 0.38;\n return `<polygon points=\"${cx},${top} ${w},${midY} ${w * 0.82},${bot} ${w * 0.18},${bot} 0,${midY}\" ${sa}/>`;\n});\n\nregisterShapePath('octagon', (w, h, sa) => {\n const d = Math.min(w, h) * 0.29;\n return `<polygon points=\"${d},0 ${w - d},0 ${w},${d} ${w},${h - d} ${w - d},${h} ${d},${h} 0,${h - d} 0,${d}\" ${sa}/>`;\n});\n\nregisterShapePath('star', (w, h, sa) => renderStar(5, w, h, sa));\nregisterShapePath('star2', (w, h, sa) => renderStar(8, w, h, sa));\nregisterShapePath('star3', (w, h, sa) => renderStar(4, w, h, sa));\nregisterShapePath('star4', (w, h, sa) => renderStar(6, w, h, sa));\n\nregisterShapePath(['parallelogram', 'flow_chart_parallelogram'], (w, h, sa) => {\n const dx = w * 0.2;\n return `<polygon points=\"${dx},0 ${w},0 ${w - dx},${h} 0,${h}\" ${sa}/>`;\n});\n\nregisterShapePath(['trapezoid', 'flow_chart_trapezoid'], (w, h, sa) => {\n const dx = w * 0.2;\n return `<polygon points=\"${dx},0 ${w - dx},0 ${w},${h} 0,${h}\" ${sa}/>`;\n});\n\nregisterShapePath(['cylinder', 'flow_chart_cylinder', 'data_base'], (w, h, sa, n) => {\n const ry = h * 0.1;\n return [\n `<ellipse cx=\"${w / 2}\" cy=\"${ry}\" rx=\"${w / 2}\" ry=\"${ry}\" ${sa}/>`,\n `<rect x=\"0\" y=\"${ry}\" width=\"${w}\" height=\"${h - 2 * ry}\" ${sa} stroke=\"none\"/>`,\n `<line x1=\"0\" y1=\"${ry}\" x2=\"0\" y2=\"${h - ry}\" stroke=\"${n.style?.border_color ?? '#333'}\" stroke-width=\"${BORDER_WIDTH_MAP[n.style?.border_width ?? 'narrow'] ?? 1}\"/>`,\n `<line x1=\"${w}\" y1=\"${ry}\" x2=\"${w}\" y2=\"${h - ry}\" stroke=\"${n.style?.border_color ?? '#333'}\" stroke-width=\"${BORDER_WIDTH_MAP[n.style?.border_width ?? 'narrow'] ?? 1}\"/>`,\n `<ellipse cx=\"${w / 2}\" cy=\"${h - ry}\" rx=\"${w / 2}\" ry=\"${ry}\" ${sa}/>`,\n ].join('\\n');\n});\n\nregisterShapePath('forward_arrow', (w, h, sa) => {\n const aw = w * 0.3, midY = h / 2, barH = h * 0.3;\n return `<polygon points=\"0,${midY - barH} ${w - aw},${midY - barH} ${w - aw},0 ${w},${midY} ${w - aw},${h} ${w - aw},${midY + barH} 0,${midY + barH}\" ${sa}/>`;\n});\n\nregisterShapePath('backward_arrow', (w, h, sa) => {\n const aw = w * 0.3, midY = h / 2, barH = h * 0.3;\n return `<polygon points=\"${w},${midY - barH} ${aw},${midY - barH} ${aw},0 0,${midY} ${aw},${h} ${aw},${midY + barH} ${w},${midY + barH}\" ${sa}/>`;\n});\n\nregisterShapePath('double_arrow', (w, h, sa) => {\n const aw = w * 0.2, midY = h / 2, barH = h * 0.25;\n return `<polygon points=\"${aw},${midY - barH} ${w - aw},${midY - barH} ${w - aw},0 ${w},${midY} ${w - aw},${h} ${w - aw},${midY + barH} ${aw},${midY + barH} ${aw},${h} 0,${midY} ${aw},0\" ${sa}/>`;\n});\n\nregisterShapePath('cross', (w, h, sa) => {\n const t = Math.min(w, h) * 0.33;\n const cx = w / 2, cy = h / 2;\n return `<polygon points=\"${cx - t / 2},0 ${cx + t / 2},0 ${cx + t / 2},${cy - t / 2} ${w},${cy - t / 2} ${w},${cy + t / 2} ${cx + t / 2},${cy + t / 2} ${cx + t / 2},${h} ${cx - t / 2},${h} ${cx - t / 2},${cy + t / 2} 0,${cy + t / 2} 0,${cy - t / 2} ${cx - t / 2},${cy - t / 2}\" ${sa}/>`;\n});\n\nregisterShapePath('cloud', (w, h, sa) =>\n `<ellipse cx=\"${w / 2}\" cy=\"${h / 2}\" rx=\"${w / 2}\" ry=\"${h / 2}\" ${sa}/>`);\n\nregisterShapePath(['bubble', 'rect_bubble'], (w, h, sa, n) => {\n const type = n.composite_shape?.type ?? 'bubble';\n const tailH = h * 0.15;\n const bodyH = h - tailH;\n const rx = type === 'bubble' ? Math.min(w, bodyH) / 2 : 4;\n return [\n `<rect width=\"${w}\" height=\"${bodyH}\" rx=\"${rx}\" ry=\"${rx}\" ${sa}/>`,\n `<polygon points=\"${w * 0.2},${bodyH} ${w * 0.35},${h} ${w * 0.4},${bodyH}\" ${sa}/>`,\n ].join('\\n');\n});\n\nregisterShapePath('actor', (w, h, sa, n) => {\n const headR = Math.min(w, h) * 0.15;\n const cx = w / 2;\n const headY = headR + 2;\n const bodyTop = headY + headR + 2;\n const bodyBot = h * 0.6;\n const legBot = h - 2;\n const strokeAttr = `stroke=\"${n.style?.border_color ?? '#333'}\" stroke-width=\"${BORDER_WIDTH_MAP[n.style?.border_width ?? 'narrow'] ?? 1}\" fill=\"none\"`;\n return [\n `<circle cx=\"${cx}\" cy=\"${headY}\" r=\"${headR}\" ${sa}/>`,\n `<line x1=\"${cx}\" y1=\"${bodyTop}\" x2=\"${cx}\" y2=\"${bodyBot}\" ${strokeAttr}/>`,\n `<line x1=\"${w * 0.15}\" y1=\"${bodyTop + 10}\" x2=\"${w * 0.85}\" y2=\"${bodyTop + 10}\" ${strokeAttr}/>`,\n `<line x1=\"${cx}\" y1=\"${bodyBot}\" x2=\"${w * 0.2}\" y2=\"${legBot}\" ${strokeAttr}/>`,\n `<line x1=\"${cx}\" y1=\"${bodyBot}\" x2=\"${w * 0.8}\" y2=\"${legBot}\" ${strokeAttr}/>`,\n ].join('\\n');\n});\n\nregisterShapePath('circular_ring', (w, h, sa, n) => {\n const outer = Math.min(w, h) / 2;\n const ratio = n.composite_shape?.circular_ring?.sector_ratio ?? 0.5;\n const inner = outer * (1 - ratio);\n return [\n `<circle cx=\"${w / 2}\" cy=\"${h / 2}\" r=\"${outer}\" ${sa}/>`,\n `<circle cx=\"${w / 2}\" cy=\"${h / 2}\" r=\"${inner}\" fill=\"white\" stroke=\"none\"/>`,\n ].join('\\n');\n});\n\nregisterShapePath('pie', (w, h, sa, n) => {\n const pie = n.composite_shape?.pie;\n if (!pie) return `<ellipse cx=\"${w / 2}\" cy=\"${h / 2}\" rx=\"${w / 2}\" ry=\"${h / 2}\" ${sa}/>`;\n const cx = w / 2, cy = h / 2;\n const radius = pie.radius || Math.min(w, h) / 2;\n const startA = ((pie.start_radial_line_angle ?? 0) * Math.PI) / 180;\n const endA = startA - ((pie.central_angle ?? 360) * Math.PI) / 180;\n const x1 = cx + radius * Math.cos(startA);\n const y1 = cy + radius * Math.sin(startA);\n const x2 = cx + radius * Math.cos(endA);\n const y2 = cy + radius * Math.sin(endA);\n const largeArc = (pie.central_angle ?? 360) > 180 ? 1 : 0;\n return `<path d=\"M ${cx} ${cy} L ${x1} ${y1} A ${radius} ${radius} 0 ${largeArc} 0 ${x2} ${y2} Z\" ${sa}/>`;\n});\n\nregisterShapePath('cube', (w, h, sa) => {\n const d = Math.min(w, h) * 0.2;\n return [\n `<polygon points=\"0,${d} ${w - d},${d} ${w - d},${h} 0,${h}\" ${sa}/>`,\n `<polygon points=\"0,${d} ${d},0 ${w},0 ${w - d},${d}\" ${sa}/>`,\n `<polygon points=\"${w - d},${d} ${w},0 ${w},${h - d} ${w - d},${h}\" ${sa}/>`,\n ].join('\\n');\n});\n\nregisterShapePath('document_shape', (w, h, sa) => {\n const waveH = h * 0.1;\n return `<path d=\"M 0 0 L ${w} 0 L ${w} ${h - waveH} Q ${w * 0.75} ${h - 2 * waveH} ${w / 2} ${h - waveH} Q ${w * 0.25} ${h} 0 ${h - waveH} Z\" ${sa}/>`;\n});\n\nregisterShapePath('brace', (w, h, _sa, n) => {\n const midY = h / 2;\n return `<path d=\"M ${w} 0 Q ${w * 0.6} 0 ${w * 0.5} ${midY * 0.4} Q ${w * 0.4} ${midY} 0 ${midY} Q ${w * 0.4} ${midY} ${w * 0.5} ${midY + midY * 0.6} Q ${w * 0.6} ${h} ${w} ${h}\" fill=\"none\" stroke=\"${n.style?.border_color ?? '#333'}\" stroke-width=\"${BORDER_WIDTH_MAP[n.style?.border_width ?? 'narrow'] ?? 1}\"/>`;\n});\n\nregisterShapePath('brace_reverse', (w, h, _sa, n) => {\n const midY = h / 2;\n return `<path d=\"M 0 0 Q ${w * 0.4} 0 ${w * 0.5} ${midY * 0.4} Q ${w * 0.6} ${midY} ${w} ${midY} Q ${w * 0.6} ${midY} ${w * 0.5} ${midY + midY * 0.6} Q ${w * 0.4} ${h} 0 ${h}\" fill=\"none\" stroke=\"${n.style?.border_color ?? '#333'}\" stroke-width=\"${BORDER_WIDTH_MAP[n.style?.border_width ?? 'narrow'] ?? 1}\"/>`;\n});\n\n// ─── Helpers ────────────────────────────────────────────────────────────────\n\nfunction renderStar (points: number, w: number, h: number, sa: string): string {\n const cx = w / 2, cy = h / 2;\n const outerR = Math.min(w, h) / 2;\n const innerR = outerR * 0.4;\n const pts: string[] = [];\n for (let i = 0; i < points * 2; i++) {\n const angle = (Math.PI * i) / points - Math.PI / 2;\n const radius = i % 2 === 0 ? outerR : innerR;\n pts.push(`${cx + radius * Math.cos(angle)},${cy + radius * Math.sin(angle)}`);\n }\n return `<polygon points=\"${pts.join(' ')}\" ${sa}/>`;\n}\n","import type { NodeRenderer, RenderContext, WNode } from '../types.js';\nimport { gWrap, styleAttrs, transformAttr } from '../utils.js';\nimport { renderTextContent } from '../text.js';\nimport { defaultShapePath, getShapePath } from '../shape-paths.js';\n\n// ─── Composite Shape Renderer ───────────────────────────────────────────────\n\nexport const compositeShapeRenderer: NodeRenderer = {\n type: 'composite_shape',\n render (n: WNode, ctx: RenderContext): string {\n const w = n.width ?? 100;\n const h = n.height ?? 60;\n const sa = styleAttrs(n.style);\n const tf = transformAttr(n);\n const shapeType = n.composite_shape?.type ?? 'rect';\n\n const pathFn = getShapePath(shapeType) ?? defaultShapePath;\n const shape = pathFn(w, h, sa, n);\n const text = renderTextContent(n.text, w, h);\n const children = ctx.renderChildren(n);\n\n return gWrap(tf, [shape, text, children], n, ctx.referencedIds, `data-shape=\"${shapeType}\"`);\n },\n};\n","import type { NodeRenderer, RenderContext, WConnector, WNode } from '../types.js';\nimport { BORDER_WIDTH_MAP, DASH_ARRAY_MAP, esc, r } from '../utils.js';\nimport { arrowMarkerRef } from '../defs.js';\n\n// ─── Connector Renderer ─────────────────────────────────────────────────────\n\nexport const connectorRenderer: NodeRenderer = {\n type: 'connector',\n render (n: WNode, ctx: RenderContext): string {\n const conn = n.connector;\n if (!conn) return '';\n const pts = resolveConnectorPoints(conn, ctx.nodeMap, n);\n if (pts.length < 2) return '';\n\n const strokeColor = n.style?.border_color ?? '#333';\n const sw = BORDER_WIDTH_MAP[n.style?.border_width ?? 'narrow'] ?? 1;\n const dash = n.style?.border_style ? DASH_ARRAY_MAP[n.style.border_style] ?? '' : '';\n const dashAttr = dash ? ` stroke-dasharray=\"${dash}\"` : '';\n\n const startMarker = arrowMarkerRef(conn.start?.arrow_style, ctx.usedMarkers);\n const endMarker = arrowMarkerRef(conn.end?.arrow_style, ctx.usedMarkers);\n const markerStart = startMarker ? ` marker-start=\"${startMarker}\"` : '';\n const markerEnd = endMarker ? ` marker-end=\"${endMarker}\"` : '';\n\n const shape = conn.shape ?? 'straight';\n let pathD: string;\n\n if (shape === 'curve' && pts.length >= 2) {\n pathD = buildCurvePath(pts);\n } else {\n pathD = `M ${pts.map(p => `${r(p.x)} ${r(p.y)}`).join(' L ')}`;\n }\n\n const fromId = conn.start?.attached_object?.id ?? conn.start_object?.id ?? '';\n const toId = conn.end?.attached_object?.id ?? conn.end_object?.id ?? '';\n const dataAttrs = `${n.id ? ` data-id=\"${n.id}\"` : ''} data-connector-shape=\"${shape}\"${fromId ? ` data-from=\"${fromId}\"` : ''}${toId ? ` data-to=\"${toId}\"` : ''}`;\n\n const swAttr = sw !== 1 ? ` stroke-width=\"${sw}\"` : '';\n const pathEl = `<path d=\"${pathD}\" fill=\"none\" stroke=\"${strokeColor}\"${swAttr}${dashAttr}${markerStart}${markerEnd}/>`;\n\n const captions: string[] = [];\n if (conn.captions?.data?.length) {\n const mid = pts.length >= 2\n ? { x: (pts[0]!.x + pts[pts.length - 1]!.x) / 2, y: (pts[0]!.y + pts[pts.length - 1]!.y) / 2 }\n : pts[0]!;\n for (const caption of conn.captions.data) {\n if (caption?.text) {\n const fontSize = caption.font_size ?? 12;\n const color = caption.text_color ?? '#333';\n captions.push(`<text x=\"${r(mid.x)}\" y=\"${r(mid.y - 6)}\" font-size=\"${fontSize}\" fill=\"${color}\" text-anchor=\"middle\">${esc(caption.text)}</text>`);\n }\n }\n }\n\n const inner = [pathEl, ...captions].join('\\n');\n return `<g${dataAttrs}>\\n${inner}\\n</g>`;\n },\n};\n\n// ─── Connector Point Resolution ─────────────────────────────────────────────\n\nexport function resolveConnectorPoints (conn: WConnector, nodeMap: ReadonlyMap<string, WNode>, connNode?: WNode): { x: number; y: number }[] {\n const pts: { x: number; y: number }[] = [];\n\n const resolveEnd = (\n end: WConnector['start'] | WConnector['end'],\n endObj: WConnector['start_object'] | WConnector['end_object'],\n ) => {\n if (end?.attached_object?.id) {\n const target = nodeMap.get(end.attached_object.id);\n if (target && target.x != null && target.y != null) {\n const relPos = end.attached_object.position;\n const px = (relPos?.x ?? 0.5) * (target.width ?? 0);\n const py = (relPos?.y ?? 0.5) * (target.height ?? 0);\n return { x: target.x + px, y: target.y + py };\n }\n }\n if (end?.position) {\n return { x: end.position.x ?? 0, y: end.position.y ?? 0 };\n }\n if (endObj?.id) {\n const target = nodeMap.get(endObj.id);\n if (target && target.x != null && target.y != null) {\n const relPos = endObj.position;\n const px = (relPos?.x ?? 0.5) * (target.width ?? 0);\n const py = (relPos?.y ?? 0.5) * (target.height ?? 0);\n return { x: target.x + px, y: target.y + py };\n }\n }\n return null;\n };\n\n const start = resolveEnd(conn.start, conn.start_object);\n const end = resolveEnd(conn.end, conn.end_object);\n if (start) pts.push(start);\n if (conn.turning_points) {\n const ox = connNode?.x ?? 0;\n const oy = connNode?.y ?? 0;\n for (const tp of conn.turning_points) {\n if (tp.x != null && tp.y != null) pts.push({ x: ox + tp.x, y: oy + tp.y });\n }\n }\n if (end) pts.push(end);\n return pts;\n}\n\n// ─── Curve Path Builder ─────────────────────────────────────────────────────\n\nfunction buildCurvePath (pts: { x: number; y: number }[]): string {\n if (pts.length === 2) {\n const dx = (pts[1]!.x - pts[0]!.x) / 3;\n return `M ${pts[0]!.x} ${pts[0]!.y} C ${pts[0]!.x + dx} ${pts[0]!.y} ${pts[1]!.x - dx} ${pts[1]!.y} ${pts[1]!.x} ${pts[1]!.y}`;\n }\n let d = `M ${pts[0]!.x} ${pts[0]!.y}`;\n for (let i = 1; i < pts.length; i++) {\n const prev = pts[i - 1]!;\n const cur = pts[i]!;\n const mx = (prev.x + cur.x) / 2;\n const my = (prev.y + cur.y) / 2;\n d += ` Q ${prev.x} ${prev.y} ${mx} ${my}`;\n }\n const last = pts[pts.length - 1]!;\n d += ` T ${last.x} ${last.y}`;\n return d;\n}\n","import type { NodeRenderer, RenderContext, WNode, WStyle } from '../types.js';\nimport { nodeDataAttrs, r, styleAttrs, transformAttr } from '../utils.js';\nimport { renderCellText } from '../text.js';\n\n// ─── Table Renderer ─────────────────────────────────────────────────────────\n\nexport const tableRenderer: NodeRenderer = {\n type: 'table',\n render (n: WNode, ctx: RenderContext): string {\n const tf = transformAttr(n);\n const tbl = n.table;\n if (!tbl?.meta) return `<g${tf}${nodeDataAttrs(n, ctx.referencedIds)}/>`;\n\n const w = n.width ?? 200;\n const rowNum = tbl.meta.row_num ?? 1;\n const colNum = tbl.meta.col_num ?? 1;\n const rowSizes = tbl.meta.row_sizes ?? [];\n const colSizes = tbl.meta.col_sizes ?? [];\n\n const rSize = (ri: number) => rowSizes[ri] ?? (0);\n const cSize = (ci: number) => colSizes[ci] ?? (0);\n const rowY = (ri: number) => {\n let v = 0;\n for (let i = 0; i < ri; i++) v += rSize(i) || (h / rowNum);\n return v;\n };\n const colX = (ci: number) => {\n let v = 0;\n for (let i = 0; i < ci; i++) v += cSize(i) || (w / colNum);\n return v;\n };\n\n const rowSizeSum = rowSizes.reduce((a, b) => a + b, 0);\n let childMaxY = 0;\n if (tbl.cells) {\n for (const cell of tbl.cells) {\n if (cell.children) {\n for (const childId of cell.children) {\n const child = ctx.nodeMap.get(childId);\n if (child && child.y != null) {\n childMaxY = Math.max(childMaxY, child.y + (child.height ?? 0));\n }\n }\n }\n }\n }\n const h = Math.max(n.height ?? 0, rowSizeSum, childMaxY) || 100;\n\n // 构建合并占用网格\n const owner: string[][] = Array.from({ length: rowNum }, () => Array(colNum).fill(''));\n const spanMap = new Map<string, { rowSpan: number; colSpan: number }>();\n\n if (tbl.cells) {\n for (const cell of tbl.cells) {\n const rs = cell.merge_info?.row_span ?? 1;\n const cs = cell.merge_info?.col_span ?? 1;\n if (rs <= 1 && cs <= 1) continue;\n const ri = (cell.row_index ?? 1) - 1;\n const ci = (cell.col_index ?? 1) - 1;\n const key = `${ri},${ci}`;\n spanMap.set(key, { rowSpan: rs, colSpan: cs });\n for (let dr = 0; dr < rs; dr++) {\n for (let dc = 0; dc < cs; dc++) {\n if (ri + dr < rowNum && ci + dc < colNum) {\n owner[ri + dr]![ci + dc] = key;\n }\n }\n }\n }\n for (const cell of tbl.cells) {\n const ri = (cell.row_index ?? 1) - 1;\n const ci = (cell.col_index ?? 1) - 1;\n const key = `${ri},${ci}`;\n if (!spanMap.has(key)) {\n spanMap.set(key, { rowSpan: 1, colSpan: 1 });\n }\n if (!owner[ri]?.[ci]) {\n owner[ri]![ci] = key;\n }\n }\n }\n\n const borderColor = n.style?.border_color ?? '#ccc';\n const sa = styleAttrs(tbl.meta.style as WStyle | undefined);\n const lines: string[] = [`<g${tf}${nodeDataAttrs(n, ctx.referencedIds)}>`, `<rect width=\"${w}\" height=\"${r(h)}\" ${sa}/>`];\n\n // 行线\n for (let ri = 0; ri < rowNum - 1; ri++) {\n const y = rowY(ri + 1);\n let segStart = 0;\n let ci = 0;\n while (ci < colNum) {\n const aboveOwner = owner[ri]?.[ci] ?? '';\n const belowOwner = owner[ri + 1]?.[ci] ?? '';\n if (aboveOwner && aboveOwner === belowOwner) {\n if (ci > segStart) {\n const x1 = colX(segStart);\n const x2 = colX(ci);\n lines.push(`<line x1=\"${r(x1)}\" y1=\"${r(y)}\" x2=\"${r(x2)}\" y2=\"${r(y)}\" stroke=\"${borderColor}\" stroke-width=\"0.5\"/>`);\n }\n const span = spanMap.get(aboveOwner);\n const srcCol = parseInt(aboveOwner.split(',')[1]!);\n ci = srcCol + (span?.colSpan ?? 1);\n segStart = ci;\n } else {\n ci++;\n }\n }\n if (segStart < colNum) {\n const x1 = colX(segStart);\n lines.push(`<line x1=\"${r(x1)}\" y1=\"${r(y)}\" x2=\"${w}\" y2=\"${r(y)}\" stroke=\"${borderColor}\" stroke-width=\"0.5\"/>`);\n }\n }\n\n // 列线\n for (let ci = 0; ci < colNum - 1; ci++) {\n const x = colX(ci + 1);\n let segStart = 0;\n let ri = 0;\n while (ri < rowNum) {\n const leftOwner = owner[ri]?.[ci] ?? '';\n const rightOwner = owner[ri]?.[ci + 1] ?? '';\n if (leftOwner && leftOwner === rightOwner) {\n if (ri > segStart) {\n const y1 = rowY(segStart);\n const y2 = rowY(ri);\n lines.push(`<line x1=\"${r(x)}\" y1=\"${r(y1)}\" x2=\"${r(x)}\" y2=\"${r(y2)}\" stroke=\"${borderColor}\" stroke-width=\"0.5\"/>`);\n }\n const span = spanMap.get(leftOwner);\n const srcRow = parseInt(leftOwner.split(',')[0]!);\n ri = srcRow + (span?.rowSpan ?? 1);\n segStart = ri;\n } else {\n ri++;\n }\n }\n if (segStart < rowNum) {\n const y1 = rowY(segStart);\n lines.push(`<line x1=\"${r(x)}\" y1=\"${r(y1)}\" x2=\"${r(x)}\" y2=\"${r(h)}\" stroke=\"${borderColor}\" stroke-width=\"0.5\"/>`);\n }\n }\n\n // 单元格内容\n if (tbl.cells) {\n const rowMap = new Map<number, typeof tbl.cells>();\n for (const cell of tbl.cells) {\n const ri = (cell.row_index ?? 1) - 1;\n if (!rowMap.has(ri)) rowMap.set(ri, []);\n rowMap.get(ri)!.push(cell);\n }\n\n const sortedRows = [...rowMap.keys()].sort((a, b) => a - b);\n for (const ri of sortedRows) {\n const cells = rowMap.get(ri)!;\n const cy = rowY(ri);\n\n lines.push(`<g data-node-type=\"tr\" transform=\"translate(0,${r(cy)})\">`);\n\n const sortedCells = [...cells].sort((a, b) => ((a.col_index ?? 1) - (b.col_index ?? 1)));\n for (const cell of sortedCells) {\n const ci = (cell.col_index ?? 1) - 1;\n const rs = cell.merge_info?.row_span ?? 1;\n const cs = cell.merge_info?.col_span ?? 1;\n const cx = colX(ci);\n let cw = 0;\n for (let c = ci; c < ci + cs && c < colNum; c++) cw += cSize(c) || (w / colNum);\n let ch = 0;\n for (let rv = ri; rv < ri + rs && rv < rowNum; rv++) ch += rSize(rv) || (h / rowNum);\n\n const spanAttrs = (rs > 1 || cs > 1) ? ` data-rowspan=\"${rs}\" data-colspan=\"${cs}\"` : '';\n lines.push(`<g data-node-type=\"td\" data-col=\"${ci + 1}\"${spanAttrs}>`);\n\n if (cell.style?.fill_color) {\n const opacity = cell.style.fill_opacity != null ? cell.style.fill_opacity / 100 : 1;\n lines.push(`<rect x=\"${r(cx)}\" y=\"0\" width=\"${r(cw)}\" height=\"${r(ch)}\" fill=\"${cell.style.fill_color}\" fill-opacity=\"${opacity}\"/>`);\n }\n\n if (cell.text) {\n const cellText = renderCellText(cell.text, tbl.meta.text, cx, 0, cw, ch);\n if (cellText) lines.push(cellText);\n }\n\n // 子节点的 x/y 已经是相对表格原点的坐标,需要反向抵消 tr 的行偏移\n if (cell.children) {\n lines.push(`<g transform=\"translate(0,${r(-cy)})\">`);\n for (const childId of cell.children) {\n const child = ctx.nodeMap.get(childId);\n if (child) {\n lines.push(ctx.renderNode(child));\n }\n }\n lines.push('</g>');\n }\n\n lines.push('</g>');\n }\n\n lines.push('</g>');\n }\n }\n\n lines.push('</g>');\n return lines.join('\\n');\n },\n};\n","import type { NodeRenderer, RenderContext, WNode } from '../types.js';\nimport { gWrap, r, styleAttrs, transformAttr } from '../utils.js';\nimport { renderTextContent } from '../text.js';\n\n// ─── Mind Map Renderer ──────────────────────────────────────────────────────\n\nexport const mindMapRenderer: NodeRenderer = {\n type: 'mind_map',\n render (n: WNode, ctx: RenderContext): string {\n const w = n.width ?? 100;\n const h = n.height ?? 40;\n const tf = transformAttr(n);\n const sa = styleAttrs(n.style);\n const text = renderTextContent(n.text, w, h);\n const children = ctx.renderChildren(n);\n\n const shape = renderMindMapNodeShape(\n n.mind_map_root?.type ?? n.mind_map_node?.type ?? 'mind_map_round_rect',\n w, h, sa,\n );\n\n const mindMapContent = renderMindMapChildren(n, ctx, 0);\n\n const layout = n.mind_map_root?.layout ?? '';\n const rootAttrs = `data-mind-level=\"0\"${layout ? ` data-mind-layout=\"${layout}\"` : ''}`;\n return gWrap(tf, [shape, text, children, mindMapContent], n, ctx.referencedIds, rootAttrs);\n },\n};\n\n// ─── Shared shape helper (eliminates duplication) ───────────────────────────\n\nfunction renderMindMapNodeShape (shapeType: string, w: number, h: number, sa: string): string {\n if (shapeType === 'mind_map_full_round_rect' || shapeType === 'mind_node_full_round_rect') {\n return `<rect width=\"${w}\" height=\"${h}\" rx=\"${r(Math.min(w, h) / 2)}\" ${sa}/>`;\n }\n if (shapeType === 'mind_map_text' || shapeType === 'mind_node_text') {\n return '';\n }\n return `<rect width=\"${w}\" height=\"${h}\" rx=\"6\" ${sa}/>`;\n}\n\n// ─── Recursive children rendering ───────────────────────────────────────────\n\nfunction renderMindMapChildren (\n parent: WNode, ctx: RenderContext, parentLevel: number,\n): string {\n if (!parent.id) return '';\n const childIds = ctx.mindMapChildrenMap.get(parent.id);\n if (!childIds?.length) return '';\n\n const px = parent.x ?? 0, py = parent.y ?? 0;\n const pw = parent.width ?? 100, ph = parent.height ?? 40;\n const strokeColor = parent.style?.border_color ?? '#999';\n\n // 获取全局 line_style(从根节点取)\n let lineStyle = 'round_angle';\n let rootNode: WNode | undefined = parent;\n while (rootNode && !rootNode.mind_map_root) {\n const rpid: string | undefined = rootNode.mind_map_node?.parent_id ?? rootNode.mind_map?.parent_id;\n rootNode = rpid ? ctx.nodeMap.get(rpid) : undefined;\n }\n if (rootNode?.mind_map_root?.line_style) lineStyle = rootNode.mind_map_root.line_style;\n\n // 根节点方向列表\n const dirListMap = new Map<string, string>();\n if (rootNode?.mind_map_root) {\n for (const id of rootNode.mind_map_root.right_children ?? []) dirListMap.set(id, 'right');\n for (const id of rootNode.mind_map_root.left_children ?? []) dirListMap.set(id, 'left');\n for (const id of rootNode.mind_map_root.up_children ?? []) dirListMap.set(id, 'up');\n for (const id of rootNode.mind_map_root.down_children ?? []) dirListMap.set(id, 'down');\n }\n\n const parts: string[] = [];\n for (const cid of childIds) {\n const child = ctx.nodeMap.get(cid);\n if (!child || child.x == null || child.y == null) continue;\n\n const cx = child.x, cy = child.y;\n const cw = child.width ?? 100, ch = child.height ?? 40;\n\n const dir = dirListMap.get(cid) ?? getMindMapChildDir(cid, parent, child, ctx.nodeMap, dirListMap);\n\n // 局部坐标连线\n const relCx = cx - px, relCy = cy - py;\n let fromX: number, fromY: number, toX: number, toY: number;\n switch (dir) {\n case 'right':\n fromX = pw;\n fromY = ph / 2;\n toX = relCx;\n toY = relCy + ch / 2;\n break;\n case 'left':\n fromX = 0;\n fromY = ph / 2;\n toX = relCx + cw;\n toY = relCy + ch / 2;\n break;\n case 'down':\n fromX = pw / 2;\n fromY = ph;\n toX = relCx + cw / 2;\n toY = relCy;\n break;\n case 'up':\n fromX = pw / 2;\n fromY = 0;\n toX = relCx + cw / 2;\n toY = relCy + ch;\n break;\n default:\n fromX = pw;\n fromY = ph / 2;\n toX = relCx;\n toY = relCy + ch / 2;\n }\n const pathD = buildMindMapPolyline(fromX, fromY, toX, toY, dir, lineStyle);\n parts.push(`<path d=\"${pathD}\" fill=\"none\" stroke=\"${strokeColor}\" stroke-width=\"1.5\"/>`);\n\n // 子节点本身\n const cTf = ` transform=\"translate(${r(relCx)},${r(relCy)})\"`;\n const cSa = styleAttrs(child.style);\n const cText = renderTextContent(child.text, cw, ch);\n const cShape = renderMindMapNodeShape(\n child.mind_map_node?.type ?? 'mind_map_round_rect',\n cw, ch, cSa,\n );\n\n const childLevel = parentLevel + 1;\n const grandChildren = renderMindMapChildren(child, ctx, childLevel);\n const mindParentId = child.mind_map_node?.parent_id ?? child.mind_map?.parent_id ?? '';\n const childAttrs = `data-mind-level=\"${childLevel}\"${mindParentId ? ` data-mind-parent=\"${mindParentId}\"` : ''} data-mind-dir=\"${dir}\"`;\n parts.push(gWrap(cTf, [cShape, cText, grandChildren], child, ctx.referencedIds, childAttrs));\n }\n return parts.join('\\n');\n}\n\nfunction getMindMapChildDir (\n childId: string, parent: WNode, child: WNode,\n nodeMap: ReadonlyMap<string, WNode>, dirListMap: Map<string, string>,\n): string {\n let ancestor: WNode | undefined = parent;\n while (ancestor?.id && !dirListMap.has(ancestor.id)) {\n const apid: string | undefined = ancestor.mind_map_node?.parent_id ?? ancestor.mind_map?.parent_id;\n ancestor = apid ? nodeMap.get(apid) : undefined;\n }\n if (ancestor?.id && dirListMap.has(ancestor.id)) {\n const dir = dirListMap.get(ancestor.id)!;\n dirListMap.set(childId, dir);\n return dir;\n }\n const px = parent.x ?? 0, py = parent.y ?? 0;\n const pw = parent.width ?? 100, ph = parent.height ?? 40;\n const cx = child.x ?? 0, cy = child.y ?? 0, cw = child.width ?? 100;\n let dir: string;\n if (cx >= px + pw) dir = 'right';\n else if (cx + cw <= px) dir = 'left';\n else if (cy >= py + ph) dir = 'down';\n else dir = 'up';\n dirListMap.set(childId, dir);\n return dir;\n}\n\nfunction buildMindMapPolyline (\n fromX: number, fromY: number, toX: number, toY: number,\n dir: string, lineStyle: string,\n): string {\n if (dir === 'left' || dir === 'right') {\n const midX = (fromX + toX) / 2;\n const dy = Math.abs(toY - fromY);\n if (dy < 1) return `M${r(fromX)},${r(fromY)} L${r(toX)},${r(toY)}`;\n if (lineStyle === 'curve') {\n return `M${r(fromX)},${r(fromY)} C${r(midX)},${r(fromY)} ${r(midX)},${r(toY)} ${r(toX)},${r(toY)}`;\n }\n if (lineStyle === 'round_angle') {\n const radius = Math.min(Math.abs(midX - fromX), dy / 2, 8);\n const sy = toY > fromY ? 1 : -1;\n const rx = dir === 'right' ? radius : -radius;\n return `M${r(fromX)},${r(fromY)} L${r(midX - rx)},${r(fromY)} Q${r(midX)},${r(fromY)} ${r(midX)},${r(fromY + sy * radius)} L${r(midX)},${r(toY - sy * radius)} Q${r(midX)},${r(toY)} ${r(midX + rx)},${r(toY)} L${r(toX)},${r(toY)}`;\n }\n return `M${r(fromX)},${r(fromY)} L${r(midX)},${r(fromY)} L${r(midX)},${r(toY)} L${r(toX)},${r(toY)}`;\n } else {\n const midY = (fromY + toY) / 2;\n const dx = Math.abs(toX - fromX);\n if (dx < 1) return `M${r(fromX)},${r(fromY)} L${r(toX)},${r(toY)}`;\n if (lineStyle === 'curve') {\n return `M${r(fromX)},${r(fromY)} C${r(fromX)},${r(midY)} ${r(toX)},${r(midY)} ${r(toX)},${r(toY)}`;\n }\n if (lineStyle === 'round_angle') {\n const radius = Math.min(Math.abs(midY - fromY), dx / 2, 8);\n const sx = toX > fromX ? 1 : -1;\n const ry = dir === 'down' ? radius : -radius;\n return `M${r(fromX)},${r(fromY)} L${r(fromX)},${r(midY - ry)} Q${r(fromX)},${r(midY)} ${r(fromX + sx * radius)},${r(midY)} L${r(toX - sx * radius)},${r(midY)} Q${r(toX)},${r(midY)} ${r(toX)},${r(midY + ry)} L${r(toX)},${r(toY)}`;\n }\n return `M${r(fromX)},${r(fromY)} L${r(fromX)},${r(midY)} L${r(toX)},${r(midY)} L${r(toX)},${r(toY)}`;\n }\n}\n","import type { NodeRenderer, RenderContext, WNode } from '../types.js';\nimport { esc, gWrap, nodeDataAttrs, r, styleAttrs, transformAttr } from '../utils.js';\nimport { renderTextContent } from '../text.js';\n\n// ─── Text Shape ─────────────────────────────────────────────────────────────\n\nexport const textShapeRenderer: NodeRenderer = {\n type: 'text_shape',\n render (n: WNode, ctx: RenderContext): string {\n const w = n.width ?? 100;\n const h = n.height ?? 40;\n const tf = transformAttr(n);\n const text = renderTextContent(n.text, w, h);\n return gWrap(tf, [text], n, ctx.referencedIds);\n },\n};\n\n// ─── Image ──────────────────────────────────────────────────────────────────\n\nexport const imageRenderer: NodeRenderer = {\n type: 'image',\n render (n: WNode, ctx: RenderContext): string {\n const w = n.width ?? 100;\n const h = n.height ?? 100;\n const tf = transformAttr(n);\n const token = n.image?.token ?? '';\n const sa = styleAttrs(n.style);\n const da = nodeDataAttrs(n, ctx.referencedIds);\n return `<g${tf}${da}><rect width=\"${w}\" height=\"${h}\" ${sa} rx=\"2\"/><image href=\"${token}\" width=\"${w}\" height=\"${h}\"/></g>`;\n },\n};\n\n// ─── Group ──────────────────────────────────────────────────────────────────\n\nexport const groupRenderer: NodeRenderer = {\n type: 'group',\n render (n: WNode, ctx: RenderContext): string {\n const children = ctx.renderChildren(n);\n return gWrap('', [children], n, ctx.referencedIds);\n },\n};\n\n// ─── Sticky Note ────────────────────────────────────────────────────────────\n\nexport const stickyNoteRenderer: NodeRenderer = {\n type: 'sticky_note',\n render (n: WNode, ctx: RenderContext): string {\n const w = n.width ?? 120;\n const h = n.height ?? 120;\n const tf = transformAttr(n);\n const bgColor = n.style?.fill_color ?? '#FFF9B1';\n const sa = `fill=\"${bgColor}\" stroke=\"${n.style?.border_color ?? '#E6D F6C'}\"`;\n const text = renderTextContent(n.text, w, h);\n return gWrap(tf, [`<rect width=\"${w}\" height=\"${h}\" rx=\"4\" ${sa}/>`, text], n, ctx.referencedIds);\n },\n};\n\n// ─── Section ────────────────────────────────────────────────────────────────\n\nexport const sectionRenderer: NodeRenderer = {\n type: 'section',\n render (n: WNode, ctx: RenderContext): string {\n const w = n.width ?? 200;\n const h = n.height ?? 150;\n const tf = transformAttr(n);\n const sa = styleAttrs(n.style);\n const title = n.section?.title ?? '';\n const children = ctx.renderChildren(n);\n const sectionAttrs = title ? `data-title=\"${esc(title)}\"` : '';\n return gWrap(tf, [\n `<rect width=\"${w}\" height=\"${h}\" ${sa}/>`,\n title ? `<text x=\"8\" y=\"18\" font-size=\"14\" fill=\"#333\" font-weight=\"bold\">${esc(title)}</text>` : '',\n children,\n ], n, ctx.referencedIds, sectionAttrs);\n },\n};\n\n// ─── Paint ──────────────────────────────────────────────────────────────────\n\nexport const paintRenderer: NodeRenderer = {\n type: 'paint',\n render (n: WNode): string {\n const paint = n.paint;\n if (!paint?.lines?.length) return '';\n const ox = n.x ?? 0;\n const oy = n.y ?? 0;\n const color = paint.color ?? '#333';\n const sw = paint.width ?? 2;\n const da = n.id ? ` data-id=\"${n.id}\"` : '';\n const paintType = paint.type ?? 'marker';\n const opAttr = paintType === 'highlight' ? ' stroke-opacity=\"0.4\"' : '';\n\n if (paint.lines.length === 1) {\n const p = paint.lines[0];\n const cx = r(ox + (p!.x ?? 0));\n const cy = r(oy + (p!.y ?? 0));\n const radius = r(sw / 2);\n return `<circle cx=\"${cx}\" cy=\"${cy}\" r=\"${radius}\" fill=\"${color}\"${opAttr} data-type=\"paint\" data-paint-type=\"${paintType}\"${da}/>`;\n }\n\n const pts = paint.lines.map(p => `${r(ox + (p.x ?? 0))},${r(oy + (p.y ?? 0))}`).join(' ');\n return `<polyline points=\"${pts}\" fill=\"none\" stroke=\"${color}\" stroke-width=\"${sw}\"${opAttr} stroke-linecap=\"round\" stroke-linejoin=\"round\" data-type=\"paint\" data-paint-type=\"${paintType}\"${da}/>`;\n },\n};\n\n// ─── SVG Node ───────────────────────────────────────────────────────────────\n\nexport const svgNodeRenderer: NodeRenderer = {\n type: 'svg',\n render (n: WNode, ctx: RenderContext): string {\n const tf = transformAttr(n);\n const code = n.svg?.svg_code ?? '';\n if (!code) return '';\n const w = n.width;\n const h = n.height;\n let adjusted = code;\n if (w != null && h != null) {\n adjusted = adjusted.replace(\n /(<svg\\b[^>]*?)\\s*width=[\"'][^\"']*[\"']/i,\n `$1 width=\"${w}\"`,\n );\n adjusted = adjusted.replace(\n /(<svg\\b[^>]*?)\\s*height=[\"'][^\"']*[\"']/i,\n `$1 height=\"${h}\"`,\n );\n if (!/viewBox/i.test(adjusted)) {\n const origW = code.match(/\\bwidth=[\"']([\\d.]+)[\"']/i);\n const origH = code.match(/\\bheight=[\"']([\\d.]+)[\"']/i);\n if (origW && origH) {\n adjusted = adjusted.replace(\n /(<svg\\b)/i,\n `$1 viewBox=\"0 0 ${origW[1]} ${origH[1]}\"`,\n );\n }\n }\n }\n return gWrap(tf, [adjusted], n, ctx.referencedIds);\n },\n};\n","import { registerRenderer } from '../node-renderer.js';\nimport { compositeShapeRenderer } from './composite-shape.js';\nimport { connectorRenderer } from './connector.js';\nimport { tableRenderer } from './table.js';\nimport { mindMapRenderer } from './mind-map.js';\nimport {\n groupRenderer, imageRenderer, paintRenderer, sectionRenderer, stickyNoteRenderer, svgNodeRenderer, textShapeRenderer,\n} from './simple.js';\n\n// ─── Register all built-in renderers ────────────────────────────────────────\n\nexport function registerAllRenderers (): void {\n registerRenderer(compositeShapeRenderer);\n registerRenderer(connectorRenderer);\n registerRenderer(tableRenderer);\n registerRenderer(mindMapRenderer);\n registerRenderer(textShapeRenderer);\n registerRenderer(imageRenderer);\n registerRenderer(groupRenderer);\n registerRenderer(stickyNoteRenderer);\n registerRenderer(sectionRenderer);\n registerRenderer(paintRenderer);\n registerRenderer(svgNodeRenderer);\n}\n\n// Re-export resolveConnectorPoints for ViewBox calculation\nexport { resolveConnectorPoints } from './connector.js';\n","import type { BBox, WNode } from './types.js';\nimport type { SvgBackground } from '../types.js';\nimport { PADDING, r } from './utils.js';\nimport { renderDefs } from './defs.js';\nimport { DefaultRenderContext } from './render-context.js';\nimport { registerAllRenderers, resolveConnectorPoints } from './renderers/index.js';\n\n// Ensure shape paths are loaded (side-effect import)\nimport './shape-paths.js';\n\n// Register all built-in renderers once\nregisterAllRenderers();\n\n// ─── Shared Node Context Preparation ────────────────────────────────────────\n\nexport interface NodeContext {\n nodeMap: Map<string, WNode>;\n mindMapChildrenMap: Map<string, string[]>;\n mindMapChildIds: Set<string>;\n rootNodes: WNode[];\n referencedIds: Set<string>;\n}\n\n/**\n * 预处理节点数组,构建 SVG/YAML 管线共享的上下文数据\n */\nexport function prepareNodeContext (nodes: WNode[]): NodeContext {\n const nodeMap = new Map<string, WNode>();\n for (const n of nodes) {\n if (n.id) nodeMap.set(n.id, n);\n }\n\n // 构建思维导图父→子映射\n const mindMapChildrenMap = new Map<string, string[]>();\n const mindMapChildIds = new Set<string>();\n for (const n of nodes) {\n if (n.type !== 'mind_map' || !n.id) continue;\n const pid = n.mind_map_node?.parent_id ?? n.mind_map?.parent_id;\n if (!pid) continue;\n mindMapChildIds.add(n.id);\n let list = mindMapChildrenMap.get(pid);\n if (!list) {\n list = [];\n mindMapChildrenMap.set(pid, list);\n }\n list.push(n.id);\n }\n\n // 仅渲染根节点\n const rootNodes = nodes\n .filter(n => !n.parent_id && !mindMapChildIds.has(n.id ?? ''))\n .sort((a, b) => (a.z_index ?? 0) - (b.z_index ?? 0));\n\n // 收集被引用的 ID\n const referencedIds = new Set<string>();\n for (const n of nodes) {\n if (n.type === 'connector' && n.connector) {\n const fromId = n.connector.start?.attached_object?.id ?? n.connector.start_object?.id;\n const toId = n.connector.end?.attached_object?.id ?? n.connector.end_object?.id;\n if (fromId) referencedIds.add(fromId);\n if (toId) referencedIds.add(toId);\n }\n const mindParentId = n.mind_map_node?.parent_id ?? n.mind_map?.parent_id;\n if (mindParentId) referencedIds.add(mindParentId);\n }\n\n return { nodeMap, mindMapChildrenMap, mindMapChildIds, rootNodes, referencedIds };\n}\n\n// ─── Main Entry ──────────────────────────────────────────────────────────────\n\nexport type { SvgBackground } from '../types.js';\n\n/**\n * 将飞书画板节点数组转换为 SVG 字符串\n */\nexport function whiteboardNodesToSvg (nodes: WNode[], bg: SvgBackground = 'none'): string {\n const { nodeMap, mindMapChildrenMap, rootNodes, referencedIds } = prepareNodeContext(nodes);\n\n // 创建渲染上下文\n const usedMarkers = new Set<string>();\n const ctx = new DefaultRenderContext({\n nodeMap,\n usedMarkers,\n mindMapChildrenMap,\n referencedIds,\n });\n\n const bbox = calcViewBox(nodes, nodeMap);\n const vb = `${r(bbox.minX)} ${r(bbox.minY)} ${r(bbox.maxX - bbox.minX)} ${r(bbox.maxY - bbox.minY)}`;\n const w = r(bbox.maxX - bbox.minX);\n const h = r(bbox.maxY - bbox.minY);\n\n const body = rootNodes.map(n => ctx.renderNode(n)).join('\\n');\n const defs = renderDefs(usedMarkers);\n\n const parts = [`<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"${vb}\" width=\"${w}\" height=\"${h}\">`];\n\n const extraDefs: string[] = [];\n const bgRects: string[] = [];\n if (bg === 'dot') {\n extraDefs.push('<pattern id=\"grid\" width=\"40\" height=\"40\" patternUnits=\"userSpaceOnUse\"><circle cx=\"20\" cy=\"20\" r=\"0.8\" fill=\"#ccc\"/></pattern>');\n bgRects.push(`<rect x=\"${r(bbox.minX)}\" y=\"${r(bbox.minY)}\" width=\"${w}\" height=\"${h}\" fill=\"#fff\"/>`);\n bgRects.push(`<rect x=\"${r(bbox.minX)}\" y=\"${r(bbox.minY)}\" width=\"${w}\" height=\"${h}\" fill=\"url(#grid)\"/>`);\n } else if (bg !== 'none') {\n bgRects.push(`<rect x=\"${r(bbox.minX)}\" y=\"${r(bbox.minY)}\" width=\"${w}\" height=\"${h}\" fill=\"${bg}\"/>`);\n }\n const markerDefs = defs ? defs.slice(6, -7) : '';\n const allDefs = [...extraDefs, markerDefs].filter(Boolean).join('');\n if (allDefs) parts.push(`<defs>${allDefs}</defs>`);\n if (bgRects.length) parts.push(bgRects.join(''));\n parts.push(body, '</svg>');\n return parts.join('\\n');\n}\n\n// ─── ViewBox Calculation ─────────────────────────────────────────────────────\n\nfunction calcViewBox (nodes: WNode[], nodeMap: Map<string, WNode>): BBox {\n let minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity;\n\n function expand (x1: number, y1: number, x2: number, y2: number) {\n minX = Math.min(minX, x1);\n minY = Math.min(minY, y1);\n maxX = Math.max(maxX, x2);\n maxY = Math.max(maxY, y2);\n }\n\n for (const n of nodes) {\n if (n.parent_id) continue;\n\n if (n.type === 'connector') {\n expandConnector(n, nodeMap, expand);\n continue;\n }\n if (n.type === 'paint') {\n expandPaint(n, expand);\n continue;\n }\n if (n.x == null || n.y == null) continue;\n const w = n.width ?? 0;\n const h = n.height ?? 0;\n if (n.angle) {\n const rb = rotatedBounds(n.x, n.y, w, h, n.angle);\n expand(rb.minX, rb.minY, rb.maxX, rb.maxY);\n } else {\n expand(n.x, n.y, n.x + w, n.y + h);\n }\n }\n\n if (!isFinite(minX)) {\n return { minX: 0, minY: 0, maxX: 800, maxY: 600 };\n }\n return {\n minX: minX - PADDING,\n minY: minY - PADDING,\n maxX: maxX + PADDING,\n maxY: maxY + PADDING,\n };\n}\n\nfunction expandConnector (\n n: WNode,\n nodeMap: Map<string, WNode>,\n expand: (x1: number, y1: number, x2: number, y2: number) => void,\n) {\n const conn = n.connector;\n if (!conn) return;\n const pts = resolveConnectorPoints(conn, nodeMap, n);\n for (const p of pts) {\n expand(p.x, p.y, p.x, p.y);\n }\n}\n\nfunction expandPaint (\n n: WNode,\n expand: (x1: number, y1: number, x2: number, y2: number) => void,\n) {\n const paint = n.paint;\n if (!paint?.lines) return;\n const ox = n.x ?? 0;\n const oy = n.y ?? 0;\n for (const p of paint.lines) {\n const px = ox + (p.x ?? 0);\n const py = oy + (p.y ?? 0);\n expand(px, py, px, py);\n }\n}\n\nfunction rotatedBounds (x: number, y: number, w: number, h: number, angleDeg: number): BBox {\n const cx = x + w / 2;\n const cy = y + h / 2;\n const rad = (angleDeg * Math.PI) / 180;\n const cos = Math.cos(rad);\n const sin = Math.sin(rad);\n const corners = [[-w / 2, -h / 2], [w / 2, -h / 2], [w / 2, h / 2], [-w / 2, h / 2]];\n let bMinX = Infinity, bMinY = Infinity, bMaxX = -Infinity, bMaxY = -Infinity;\n for (const [dx, dy] of corners) {\n const rx = cx + dx! * cos - dy! * sin;\n const ry = cy + dx! * sin + dy! * cos;\n bMinX = Math.min(bMinX, rx);\n bMinY = Math.min(bMinY, ry);\n bMaxX = Math.max(bMaxX, rx);\n bMaxY = Math.max(bMaxY, ry);\n }\n return { minX: bMinX, minY: bMinY, maxX: bMaxX, maxY: bMaxY };\n}\n","import type { WRichText, WText } from './types.js';\n\n// ─── Plain Text Extraction ──────────────────────────────────────────────────\n\n/**\n * 从 WText 中提取纯文本,无任何 SVG 渲染逻辑。\n * YAML 管线使用此函数获取节点的文本内容。\n */\nexport function extractPlainText (text: WText | undefined): string {\n if (!text) return '';\n\n // 优先使用 rich_text\n if (text.rich_text?.paragraphs?.length) {\n return extractRichTextPlain(text.rich_text);\n }\n\n return text.text ?? '';\n}\n\nfunction extractRichTextPlain (rt: WRichText): string {\n const lines: string[] = [];\n for (const para of rt.paragraphs ?? []) {\n const parts: string[] = [];\n for (const el of para.elements ?? []) {\n if (el.element_type === 0 && el.text_element) {\n parts.push(el.text_element.text ?? '');\n } else if (el.element_type === 1 && el.link_element) {\n parts.push(el.link_element.text ?? el.link_element.herf ?? '');\n } else if (el.element_type === 3 && el.mention_doc_element) {\n parts.push(el.mention_doc_element.doc_url ?? '[doc]');\n }\n }\n lines.push(parts.join(''));\n }\n return lines.join('\\n');\n}\n","import type { WNode } from '../types.js';\nimport type { NodeContext } from '../index.js';\nimport type { YamlMindMapNode, YamlNode, YamlTableCell } from './types.js';\nimport { extractPlainText } from '../plain-text.js';\n\n// ─── Discarded node types (no semantic value for AI) ────────────────────────\n\nconst DISCARDED_TYPES = new Set(['paint', 'svg']);\n\n// ─── Converter Registry ─────────────────────────────────────────────────────\n\ntype ConvertFn = (node: WNode, nctx: NodeContext, referencedIds: Set<string>) => YamlNode | null;\n\nconst converterMap = new Map<string, ConvertFn>();\n\nfunction register (type: string, fn: ConvertFn): void {\n converterMap.set(type, fn);\n}\n\n// ─── Public API ─────────────────────────────────────────────────────────────\n\n/**\n * 将单个 WNode 转换为 YamlNode(如果需要丢弃则返回 null)\n */\nexport function convertNode (node: WNode, nctx: NodeContext, referencedIds?: Set<string>): YamlNode | null {\n if (!node.type || DISCARDED_TYPES.has(node.type)) return null;\n const refs = referencedIds ?? nctx.referencedIds;\n const fn = converterMap.get(node.type);\n if (fn) return fn(node, nctx, refs);\n return convertFallback(node, nctx, refs);\n}\n\n// ─── Shared Helpers ─────────────────────────────────────────────────────────\n\nfunction convertChildren (node: WNode, nctx: NodeContext, referencedIds: Set<string>): YamlNode[] | undefined {\n if (!node.children?.length) return undefined;\n const result: YamlNode[] = [];\n for (const childId of node.children) {\n const child = nctx.nodeMap.get(childId);\n if (child) {\n const converted = convertNode(child, nctx, referencedIds);\n if (converted) result.push(converted);\n }\n }\n return result.length ? result : undefined;\n}\n\nfunction base (node: WNode, referencedIds: Set<string>): YamlNode {\n const out: YamlNode = { type: node.type ?? 'unknown' };\n if (node.id && referencedIds.has(node.id)) {\n out.id = node.id;\n }\n return out;\n}\n\n// ─── Composite Shape ────────────────────────────────────────────────────────\n\nregister('composite_shape', (n, nctx, refs) => {\n const out: YamlNode = {};\n if (n.id && refs.has(n.id)) out.id = n.id;\n out.shape = n.composite_shape?.type ?? 'rect';\n const text = extractPlainText(n.text);\n if (text) out.text = text;\n out.children = convertChildren(n, nctx, refs);\n return out;\n});\n\n// ─── Text Shape ─────────────────────────────────────────────────────────────\n\nregister('text_shape', (n, _nctx, refs) => {\n const out = base(n, refs);\n const text = extractPlainText(n.text);\n if (text) out.text = text;\n return out;\n});\n\n// ─── Image ──────────────────────────────────────────────────────────────────\n\nregister('image', (n, _nctx, refs) => {\n const out = base(n, refs);\n out.token = n.image?.token ?? '';\n return out;\n});\n\n// ─── Connector ──────────────────────────────────────────────────────────────\n\nregister('connector', (n, _nctx, refs) => {\n const conn = n.connector;\n if (!conn) return null;\n\n const out: YamlNode = {};\n if (n.id && refs.has(n.id)) out.id = n.id;\n out.from = conn.start?.attached_object?.id ?? conn.start_object?.id ?? '';\n out.to = conn.end?.attached_object?.id ?? conn.end_object?.id ?? '';\n out.connector_shape = conn.shape ?? 'straight';\n\n // 连接器文本标签\n if (conn.captions?.data?.length) {\n const labels = conn.captions.data\n .map(c => c?.text)\n .filter(Boolean) as string[];\n if (labels.length) out.label = labels.join(' ');\n }\n\n // 箭头样式\n const startArrow = conn.start?.arrow_style;\n const endArrow = conn.end?.arrow_style;\n if (startArrow && startArrow !== 'none') out.start_arrow = startArrow;\n if (endArrow && endArrow !== 'none') out.end_arrow = endArrow;\n\n return out;\n});\n\n// ─── Group ──────────────────────────────────────────────────────────────────\n\nregister('group', (n, nctx, refs) => {\n const out = base(n, refs);\n out.children = convertChildren(n, nctx, refs);\n return out;\n});\n\n// ─── Section ────────────────────────────────────────────────────────────────\n\nregister('section', (n, nctx, refs) => {\n const out = base(n, refs);\n const title = n.section?.title;\n if (title) out.title = title;\n out.children = convertChildren(n, nctx, refs);\n return out;\n});\n\n// ─── Sticky Note ────────────────────────────────────────────────────────────\n\nregister('sticky_note', (n, _nctx, refs) => {\n const out = base(n, refs);\n const text = extractPlainText(n.text);\n if (text) out.text = text;\n out.color = n.style?.fill_color;\n return out;\n});\n\n// ─── Table ──────────────────────────────────────────────────────────────────\n\nregister('table', (n, nctx, refs) => {\n const tbl = n.table;\n if (!tbl?.meta) return base(n, refs);\n\n const out = base(n, refs);\n out.rows = tbl.meta.row_num ?? 0;\n out.cols = tbl.meta.col_num ?? 0;\n\n if (tbl.cells?.length) {\n const cells: YamlTableCell[] = [];\n for (const cell of tbl.cells) {\n const yamlCell: YamlTableCell = {\n row: cell.row_index ?? 1,\n col: cell.col_index ?? 1,\n };\n\n // 单元格文本\n const cellText = extractPlainText(cell.text);\n if (cellText) yamlCell.text = cellText;\n\n // 合并信息\n const rs = cell.merge_info?.row_span ?? 1;\n const cs = cell.merge_info?.col_span ?? 1;\n if (rs > 1) yamlCell.row_span = rs;\n if (cs > 1) yamlCell.col_span = cs;\n\n // 子节点(表格单元格内可嵌套任意节点)\n if (cell.children?.length) {\n const childNodes: YamlNode[] = [];\n for (const childId of cell.children) {\n const child = nctx.nodeMap.get(childId);\n if (child) {\n const converted = convertNode(child, nctx, refs);\n if (converted) childNodes.push(converted);\n }\n }\n if (childNodes.length) yamlCell.children = childNodes;\n }\n\n cells.push(yamlCell);\n }\n out.cells = cells;\n }\n\n return out;\n});\n\n// ─── Mind Map ───────────────────────────────────────────────────────────────\n\nregister('mind_map', (n, nctx, refs) => {\n // 只处理根节点(有 mind_map_root),子节点递归处理\n if (!n.mind_map_root) return null;\n\n const out = base(n, refs);\n out.mind_map = buildMindMapTree(n, nctx);\n return out;\n});\n\nfunction buildMindMapTree (node: WNode, nctx: NodeContext): YamlMindMapNode {\n const result: YamlMindMapNode = {};\n\n // 思维导图节点不会被 connector 引用,无需 id\n\n const text = extractPlainText(node.text);\n if (text) result.text = text;\n\n const childIds = nctx.mindMapChildrenMap.get(node.id ?? '');\n if (childIds?.length) {\n const children: YamlMindMapNode[] = [];\n for (const cid of childIds) {\n const child = nctx.nodeMap.get(cid);\n if (child) children.push(buildMindMapTree(child, nctx));\n }\n if (children.length) result.children = children;\n }\n\n return result;\n}\n\n// ─── Fallback ───────────────────────────────────────────────────────────────\n\nfunction convertFallback (node: WNode, nctx: NodeContext, referencedIds: Set<string>): YamlNode {\n const out = base(node, referencedIds);\n const text = extractPlainText(node.text);\n if (text) out.text = text;\n out.children = convertChildren(node, nctx, referencedIds);\n return out;\n}\n","// ─── Lightweight YAML Serializer ────────────────────────────────────────────\n// No external dependencies. Supports the subset of YAML needed for whiteboard output:\n// strings, numbers, booleans, null, arrays, objects, and nested combinations.\n\n/**\n * Serialize a value to YAML string.\n */\nexport function serializeYaml (value: unknown): string {\n const lines: string[] = [];\n writeValue(lines, value, 0, false);\n return lines.join('\\n') + '\\n';\n}\n\nfunction writeValue (lines: string[], value: unknown, indent: number, inlineKey: boolean): void {\n if (value === null || value === undefined) {\n // null values are simply omitted when used as object values (handled in writeObject)\n if (inlineKey) lines.push('null');\n return;\n }\n\n if (typeof value === 'string') {\n lines.push(yamlString(value));\n return;\n }\n\n if (typeof value === 'number' || typeof value === 'boolean') {\n lines.push(String(value));\n return;\n }\n\n if (Array.isArray(value)) {\n writeArray(lines, value, indent);\n return;\n }\n\n if (typeof value === 'object') {\n writeObject(lines, value as Record<string, unknown>, indent, inlineKey);\n return;\n }\n\n lines.push(String(value));\n}\n\nfunction writeArray (lines: string[], arr: unknown[], indent: number): void {\n if (arr.length === 0) {\n lines.push(' '.repeat(indent) + '[]');\n return;\n }\n\n const pad = ' '.repeat(indent);\n for (const item of arr) {\n if (item === null || item === undefined) continue;\n\n if (typeof item === 'object' && !Array.isArray(item)) {\n // Object items: first key on same line as `-`, rest indented\n const obj = item as Record<string, unknown>;\n const entries = Object.entries(obj).filter(([, v]) => v !== undefined && v !== null);\n if (entries.length === 0) continue;\n\n const [firstKey, firstVal] = entries[0]!;\n if (typeof firstVal === 'string' && firstVal.includes('\\n')) {\n // 多行字符串:literal block scalar\n const innerPad = ' '.repeat(indent + 4);\n const contentLines = firstVal.split('\\n');\n lines.push(`${pad}- ${firstKey}: |`);\n for (const line of contentLines) {\n lines.push(innerPad + line);\n }\n } else if (isScalar(firstVal)) {\n lines.push(`${pad}- ${firstKey}: ${scalarToString(firstVal)}`);\n } else {\n lines.push(`${pad}- ${firstKey}:`);\n const subLines: string[] = [];\n writeValue(subLines, firstVal, indent + 4, false);\n for (const sl of subLines) lines.push(sl);\n }\n\n for (let i = 1; i < entries.length; i++) {\n const [key, val] = entries[i]!;\n writeObjectEntry(lines, key, val, indent + 2);\n }\n } else {\n // Scalar items\n if (typeof item === 'string' && item.includes('\\n')) {\n const innerPad = ' '.repeat(indent + 4);\n const contentLines = item.split('\\n');\n lines.push(`${pad}- |`);\n for (const line of contentLines) {\n lines.push(innerPad + line);\n }\n } else {\n const subLines: string[] = [];\n writeValue(subLines, item, indent + 2, false);\n if (subLines.length > 0) {\n lines.push(`${pad}- ${subLines[0]!.trimStart()}`);\n for (let i = 1; i < subLines.length; i++) lines.push(subLines[i]!);\n }\n }\n }\n }\n}\n\nfunction writeObject (lines: string[], obj: Record<string, unknown>, indent: number, inlineKey: boolean): void {\n const entries = Object.entries(obj).filter(([, v]) => v !== undefined && v !== null);\n if (entries.length === 0) {\n lines.push('{}');\n return;\n }\n\n // Small flat objects can be inlined: { x: 1, y: 2 }\n if (canInline(obj, entries)) {\n const parts = entries.map(([k, v]) => `${k}: ${scalarToString(v)}`);\n lines.push(`{${parts.join(', ')}}`);\n return;\n }\n\n // Multi-line object\n if (inlineKey) {\n // First entry on same line\n const [firstKey, firstVal] = entries[0]!;\n if (isScalar(firstVal)) {\n lines.push('');\n writeObjectEntry(lines, firstKey, firstVal, indent);\n } else {\n lines.push('');\n writeObjectEntry(lines, firstKey, firstVal, indent);\n }\n for (let i = 1; i < entries.length; i++) {\n writeObjectEntry(lines, entries[i]![0], entries[i]![1], indent);\n }\n } else {\n for (const [key, val] of entries) {\n writeObjectEntry(lines, key, val, indent);\n }\n }\n}\n\nfunction writeObjectEntry (lines: string[], key: string, value: unknown, indent: number): void {\n const pad = ' '.repeat(indent);\n if (typeof value === 'string' && value.includes('\\n')) {\n // 多行字符串:literal block scalar,每行缩进 = indent + 2\n const innerPad = ' '.repeat(indent + 2);\n const contentLines = value.split('\\n');\n lines.push(`${pad}${key}: |`);\n for (const line of contentLines) {\n lines.push(innerPad + line);\n }\n } else if (isScalar(value)) {\n lines.push(`${pad}${key}: ${scalarToString(value)}`);\n } else {\n lines.push(`${pad}${key}:`);\n const subLines: string[] = [];\n writeValue(subLines, value, indent + 2, false);\n for (const sl of subLines) lines.push(sl);\n }\n}\n\n// ─── Helpers ────────────────────────────────────────────────────────────────\n\nfunction isScalar (v: unknown): boolean {\n return v === null || v === undefined || typeof v === 'string' || typeof v === 'number' || typeof v === 'boolean';\n}\n\nfunction scalarToString (v: unknown): string {\n if (v === null || v === undefined) return 'null';\n if (typeof v === 'string') return yamlString(v);\n return String(v);\n}\n\n/** Inline only small flat objects with all scalar values (e.g. position, size) */\nfunction canInline (obj: Record<string, unknown>, entries: [string, unknown][]): boolean {\n if (entries.length > 4) return false;\n for (const [, v] of entries) {\n if (!isScalar(v)) return false;\n if (typeof v === 'string' && v.length > 60) return false;\n }\n return true;\n}\n\n/** Properly quote a YAML string value */\nfunction yamlString (s: string): string {\n if (s === '') return '\"\"';\n // Strings that need quoting\n if (needsQuoting(s)) {\n return '\"' + s.replace(/\\\\/g, '\\\\\\\\').replace(/\"/g, '\\\\\"') + '\"';\n }\n return s;\n}\n\nfunction needsQuoting (s: string): boolean {\n // Starts with special chars\n if (/^[&*!|>%@`'\"{}\\[\\],#?:-]/.test(s)) return true;\n // Contains chars that could confuse YAML parsers\n if (/[:#]/.test(s)) return true;\n // Looks like number/bool/null\n if (/^(true|false|null|yes|no|on|off|\\d[\\d.eE+-]*)$/i.test(s)) return true;\n // Contains trailing/leading spaces\n if (s !== s.trim()) return true;\n return false;\n}\n","import type { WNode } from '../types.js';\nimport type { YamlWhiteboardResult } from './types.js';\nimport { prepareNodeContext } from '../index.js';\nimport { convertNode } from './converters.js';\nimport { serializeYaml } from './serialize.js';\n\n// ─── YAML Pipeline Entry ────────────────────────────────────────────────────\n\n/**\n * 将飞书画板节点数组转换为 YAML 字符串(AI 友好的结构化数据)\n */\nexport function whiteboardNodesToYaml (nodes: WNode[]): YamlWhiteboardResult {\n const nctx = prepareNodeContext(nodes);\n\n // 转换所有根节点\n const yamlNodes = nctx.rootNodes\n .map(n => convertNode(n, nctx))\n .filter((n): n is NonNullable<typeof n> => n !== null);\n\n // 收集图片 token\n const imageTokens: string[] = [];\n collectImageTokens(yamlNodes, imageTokens);\n\n // 序列化\n const data = { whiteboard: { nodes: yamlNodes } };\n const yaml = serializeYaml(data);\n\n return { yaml, imageTokens };\n}\n\n/** 递归收集所有 image 节点的 token */\nfunction collectImageTokens (nodes: { type?: string; token?: string; children?: any[]; cells?: any[]; [k: string]: unknown }[], out: string[]): void {\n for (const node of nodes) {\n if (node.type === 'image' && node.token) {\n out.push(node.token as string);\n }\n if (Array.isArray(node.children)) {\n collectImageTokens(node.children, out);\n }\n if (Array.isArray(node.cells)) {\n for (const cell of node.cells) {\n if (Array.isArray(cell.children)) {\n collectImageTokens(cell.children, out);\n }\n }\n }\n }\n}\n","// ─── Sheet Utilities ─────────────────────────────────────────────────────────\n\nexport interface Merge {\n start_row_index?: number;\n end_row_index?: number;\n start_column_index?: number;\n end_column_index?: number;\n}\n\nexport interface ResolvedSheet {\n title: string;\n hidden?: boolean;\n kind: 'grid' | 'bitable' | 'unknown';\n /** 合并已展开后的二维字符串数组 */\n rows: string[][];\n /** 出错时的占位文本 */\n error?: string;\n}\n\n// ─── cellToMd: 富文本 → 纯 Markdown 字符串 ─────────────────────────────────\n\nconst escapeCell = (s: string) => s.replace(/\\|/g, '\\\\|').replace(/\\n/g, '<br>');\n\nexport function cellToMd (cell: unknown): string {\n if (cell == null) return '';\n if (typeof cell !== 'object') return escapeCell(String(cell));\n if (Array.isArray(cell)) return cell.map(cellToMd).join('');\n const o = cell as Record<string, any>;\n switch (o.type) {\n case 'text':\n return escapeCell(String(o.text ?? ''));\n case 'url':\n return `[${escapeCell(o.text ?? o.link ?? '')}](${o.link ?? ''})`;\n case 'mentionUser':\n return `@${escapeCell(o.name ?? o.textArr?.join('') ?? '')}`;\n case 'formula':\n return `\\`${escapeCell(o.text ?? '')}\\``;\n default:\n // v2 接口可能直接返回 { text, link } 结构\n if (o.text != null) return escapeCell(String(o.text));\n return '';\n }\n}\n\n// ─── expandMerges: 合并区填入左上角原值 ──────────────────────────────────────\n\nexport function expandMerges (rows: string[][], merges: Merge[]): string[][] {\n const grid = rows.map(r => r.slice());\n for (const m of merges) {\n const r0 = m.start_row_index ?? 0;\n const r1 = m.end_row_index ?? r0;\n const c0 = m.start_column_index ?? 0;\n const c1 = m.end_column_index ?? c0;\n const v = grid[r0]?.[c0] ?? '';\n for (let r = r0; r <= r1; r++) {\n if (!grid[r]) grid[r] = [];\n for (let c = c0; c <= c1; c++) {\n if (r === r0 && c === c0) continue;\n grid[r]![c] = v;\n }\n }\n }\n return grid;\n}\n\n// ─── trimTrailingEmpty: 裁剪末尾的空行和空列 ──────────────────────────────\n//\n// 若末尾若干行的所有单元格都为空(null/undefined/空字符串),则移除这些行;\n// 列同理(从右向左判断)。中间的空行/空列保留不动。\n\nconst isEmptyCell = (v: unknown): boolean => v == null || v === '';\n\nexport function trimTrailingEmpty (rows: string[][]): string[][] {\n // 末尾空行:找到最后一个含非空单元格的行\n let lastRow = -1;\n for (let r = 0; r < rows.length; r++) {\n if ((rows[r] ?? []).some(c => !isEmptyCell(c))) lastRow = r;\n }\n if (lastRow < 0) return [];\n const trimmedRows = rows.slice(0, lastRow + 1);\n\n // 末尾空列:遍历每一行的最右侧非空列,取最大值\n let lastCol = -1;\n for (const row of trimmedRows) {\n for (let c = (row?.length ?? 0) - 1; c >= 0; c--) {\n if (!isEmptyCell(row[c])) {\n if (c > lastCol) lastCol = c;\n break;\n }\n }\n }\n if (lastCol < 0) return trimmedRows.map(() => []);\n return trimmedRows.map(r => (r ?? []).slice(0, lastCol + 1));\n}\n\n// ─── columnIndexToLetter: 列号 → 字母(1-based: 1→A, 26→Z, 27→AA) ────────\n\nexport function columnIndexToLetter (n: number): string {\n let result = '';\n while (n > 0) {\n n--;\n result = String.fromCharCode(65 + (n % 26)) + result;\n n = Math.floor(n / 26);\n }\n return result;\n}\n","import { LoggerLevel } from '@larksuiteoapi/node-sdk';\n\nconst COLORS: Record<number, string> = {\n [LoggerLevel.fatal]: '\\x1b[35m', // magenta\n [LoggerLevel.error]: '\\x1b[31m', // red\n [LoggerLevel.warn]: '\\x1b[33m', // yellow\n [LoggerLevel.info]: '\\x1b[36m', // cyan\n [LoggerLevel.debug]: '\\x1b[32m', // green\n [LoggerLevel.trace]: '\\x1b[90m', // gray\n};\nconst RESET = '\\x1b[0m';\nconst LEVEL_NAMES = ['FATAL', 'ERROR', 'WARN', 'INFO', 'DEBUG', 'TRACE'];\nlet minLogLevel = LoggerLevel.trace;\n\nfunction log (level: LoggerLevel, module: string, ...args: unknown[]) {\n if (level > minLogLevel) return;\n const time = new Date().toISOString();\n const color = COLORS[level] ?? '';\n const name = LEVEL_NAMES[level] ?? 'INFO';\n process.stderr.write(`${time} ${color}[${name}]${RESET} [${module}] ${args.map(String).join(' ')}\\n`);\n}\n\nexport function setLogLevel (level: LoggerLevel) {\n minLogLevel = level;\n}\n\nexport function createLogger (module: string) {\n return {\n fatal: (...args: unknown[]) => log(LoggerLevel.fatal, module, ...args),\n error: (...args: unknown[]) => log(LoggerLevel.error, module, ...args),\n warn: (...args: unknown[]) => log(LoggerLevel.warn, module, ...args),\n info: (...args: unknown[]) => log(LoggerLevel.info, module, ...args),\n debug: (...args: unknown[]) => log(LoggerLevel.debug, module, ...args),\n trace: (...args: unknown[]) => log(LoggerLevel.trace, module, ...args),\n };\n}\n","import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport type { LarkClient } from '../client.js';\nimport type { ConvertOptions, WbImageMode } from '../types.js';\nimport { whiteboardNodesToSvg } from '../whiteboard/index.js';\nimport { whiteboardNodesToYaml } from '../whiteboard/yaml/index.js';\nimport { filterNodes } from '../whiteboard/utils.js';\nimport { cellToMd, expandMerges, trimTrailingEmpty, columnIndexToLetter } from '../sheet/index.js';\nimport type { ResolvedSheet } from '../sheet/index.js';\nimport { createLogger } from '../logger.js';\nimport type { MdBlockNode } from './types.js';\n\nconst logger = createLogger('transformer');\n\nconst sleep = (ms: number) => new Promise(resolve => setTimeout(resolve, ms));\n\nexport type DocSourceType = 'docx' | 'sheet';\n\nexport class MdTransformer {\n constructor (\n private client: LarkClient,\n private opts: ConvertOptions,\n private sourceType: DocSourceType = 'docx',\n ) {}\n\n async transform (ast: MdBlockNode): Promise<void> {\n // 1. Collect tokens\n const { imageTokens, whiteboardTokens, sheetRefs } = collectTokens(ast);\n\n // 2. Resolve images\n const imageMap = await this.resolveImages(imageTokens);\n\n // 3. Resolve whiteboards\n const whiteboardMap = await this.resolveWhiteboards(whiteboardTokens);\n\n // 4. Resolve sheets\n const sheetMap = await this.resolveSheets(sheetRefs);\n\n // 5. Replace in AST\n replaceInAst(ast, imageMap, whiteboardMap, sheetMap);\n }\n\n // ─── Image Resolution ──────────────────────────────────────────────────────\n\n private async resolveImages (tokens: string[]): Promise<Map<string, string>> {\n const map = new Map<string, string>();\n const uniqueTokens = [...new Set(tokens)];\n if (uniqueTokens.length === 0) return map;\n\n if (this.opts.imageMode === 'online' || this.opts.agent === true) {\n for (let i = 0; i < uniqueTokens.length; i += 5) {\n const batch = uniqueTokens.slice(i, i + 5);\n const urlMap = await this.client.batchGetTmpDownloadUrl(batch);\n for (const token of batch) {\n const url = urlMap[token];\n if (url) {\n map.set(token, url);\n logger.info('Resolved image URL:', token);\n }\n }\n }\n } else {\n // local\n const imgDir = path.join(this.opts.output, 'static');\n for (const token of uniqueTokens) {\n let localPath = await this.client.downloadImage(token, imgDir);\n localPath = path.relative(this.opts.output, localPath);\n map.set(token, localPath);\n logger.info('Downloaded image:', localPath);\n }\n }\n return map;\n }\n\n // ─── Whiteboard Resolution ─────────────────────────────────────────────────\n\n private async resolveWhiteboards (tokens: string[]): Promise<Map<string, MdBlockNode>> {\n const map = new Map<string, MdBlockNode>();\n for (const token of tokens) {\n try {\n logger.info('Fetching whiteboard nodes:', token);\n const wbNodes = await this.client.getWhiteboardNodes(token);\n logger.info(`Whiteboard ${token}: ${wbNodes.length} nodes`);\n\n let node: MdBlockNode;\n if (this.opts.wbFormat === 'yaml') {\n node = await this.processWhiteboardYaml(token, wbNodes);\n } else {\n node = await this.processWhiteboardSvg(token, wbNodes);\n }\n map.set(token, node);\n } catch (e: any) {\n logger.warn(`Failed to render whiteboard ${token}:`, e.message);\n }\n }\n return map;\n }\n\n private async processWhiteboardSvg (\n token: string,\n wbNodes: import('../types.js').WhiteboardNode[],\n ): Promise<MdBlockNode> {\n const effectiveNodes = this.opts.wbFormat === 'inline-svg'\n ? filterNodes(wbNodes, n => n.type !== 'paint' && n.type !== 'svg')\n : wbNodes;\n\n let svgContent = whiteboardNodesToSvg(effectiveNodes, this.opts.wbBg);\n\n // Resolve images inside SVG\n const imgTokens = effectiveNodes\n .filter(n => n.type === 'image' && n.image?.token)\n .map(n => n.image!.token!);\n if (imgTokens.length > 0) {\n svgContent = await this.resolveSvgImages(svgContent, imgTokens);\n }\n\n if (this.opts.wbFormat === 'base64') {\n return {\n type: 'image',\n alt: `画板-${token}`,\n src: `data:image/svg+xml;base64,${Buffer.from(svgContent).toString('base64')}`,\n };\n } else if (this.opts.wbFormat === 'svg') {\n const svgDir = path.join(this.opts.output, 'static');\n fs.mkdirSync(svgDir, { recursive: true });\n const svgPath = path.join(svgDir, `${token}.svg`);\n fs.writeFileSync(svgPath, svgContent);\n const relPath = path.relative(this.opts.output, svgPath);\n logger.info('Generated whiteboard SVG:', relPath);\n return {\n type: 'image',\n alt: `画板-${token}`,\n src: relPath,\n };\n } else {\n // inline-svg\n return {\n type: 'html',\n content: svgContent,\n };\n }\n }\n\n private async processWhiteboardYaml (\n token: string,\n wbNodes: import('../types.js').WhiteboardNode[],\n ): Promise<MdBlockNode> {\n const { yaml: yamlContent, imageTokens } = whiteboardNodesToYaml(wbNodes);\n let resolvedYaml = yamlContent;\n\n let effectiveMode: WbImageMode = this.opts.wbImageMode;\n if (effectiveMode === 'base64') {\n logger.warn('YAML mode does not support base64 image embedding, falling back to online mode');\n effectiveMode = 'online';\n }\n\n if (imageTokens.length > 0) {\n resolvedYaml = await this.resolveYamlImages(resolvedYaml, imageTokens, effectiveMode);\n }\n\n return {\n type: 'codeBlock',\n lang: 'yaml',\n content: resolvedYaml,\n };\n }\n\n // ─── SVG Image Resolution ──────────────────────────────────────────────────\n\n private async resolveSvgImages (svgContent: string, imgTokens: string[]): Promise<string> {\n const mode: WbImageMode = this.opts.wbImageMode ?? 'online';\n if (mode === 'online') {\n for (let i = 0; i < imgTokens.length; i += 5) {\n const batch = imgTokens.slice(i, i + 5);\n const urlMap = await this.client.batchGetTmpDownloadUrl(batch);\n for (const token of batch) {\n const onlineUrl = urlMap[token];\n if (onlineUrl) {\n svgContent = svgContent.split(`href=\"${token}\"`).join(`href=\"${onlineUrl}\"`);\n logger.info('Replaced whiteboard image with online URL:', token);\n }\n }\n }\n } else {\n const imgDir = path.join(this.opts.output, 'static');\n for (const token of imgTokens) {\n const localPath = await this.client.downloadImage(token, imgDir);\n if (mode === 'base64') {\n const buf = fs.readFileSync(localPath);\n const ext = path.extname(localPath).slice(1);\n const mime = ext === 'png' ? 'image/png' : 'image/jpeg';\n const dataUri = `data:${mime};base64,${buf.toString('base64')}`;\n svgContent = svgContent.split(`href=\"${token}\"`).join(`href=\"${dataUri}\"`);\n logger.info('Embedded whiteboard image as base64:', token);\n } else {\n const relPath = path.basename(localPath);\n svgContent = svgContent.split(`href=\"${token}\"`).join(`href=\"${relPath}\"`);\n logger.info('Replaced whiteboard image with local path:', relPath);\n }\n }\n }\n return svgContent;\n }\n\n // ─── YAML Image Resolution ─────────────────────────────────────────────────\n\n private async resolveYamlImages (\n yamlContent: string,\n imgTokens: string[],\n mode: 'online' | 'local',\n ): Promise<string> {\n if (mode === 'online') {\n for (let i = 0; i < imgTokens.length; i += 5) {\n const batch = imgTokens.slice(i, i + 5);\n const urlMap = await this.client.batchGetTmpDownloadUrl(batch);\n for (const token of batch) {\n const onlineUrl = urlMap[token];\n if (onlineUrl) {\n yamlContent = yamlContent.split(token).join(onlineUrl);\n logger.info('Replaced YAML image token with online URL:', token);\n }\n }\n }\n } else {\n const imgDir = path.join(this.opts.output, 'static');\n for (const token of imgTokens) {\n const localPath = await this.client.downloadImage(token, imgDir);\n const relPath = path.relative(this.opts.output, localPath);\n yamlContent = yamlContent.split(token).join(relPath);\n logger.info('Replaced YAML image token with local path:', relPath);\n }\n }\n return yamlContent;\n }\n\n // ─── Sheet Resolution ─────────────────────────────────────────────────────────\n\n private async resolveSheets (refs: SheetRef[]): Promise<Map<string, MdBlockNode>> {\n const map = new Map<string, MdBlockNode>();\n const uniqueRefs = refs.filter((r, i, arr) => arr.findIndex(x => x.raw === r.raw) === i);\n if (uniqueRefs.length === 0) return map;\n\n for (const { raw, spreadsheetToken, sheetId } of uniqueRefs) {\n if (!spreadsheetToken) continue;\n try {\n const info = await this.client.getSpreadsheetInfo(spreadsheetToken);\n const list = await this.client.listSheets(spreadsheetToken);\n const sheetsToProcess = this.sourceType === 'sheet' && !sheetId\n ? list\n : list.filter(s => s.sheet_id === sheetId);\n const resolved: ResolvedSheet[] = [];\n\n for (const s of sheetsToProcess) {\n if (s.hidden) continue;\n if (s.resource_type && s.resource_type !== 'sheet') {\n resolved.push({\n title: s.title ?? '', kind: 'bitable', rows: [],\n error: `非网格表(${s.resource_type}),已跳过`,\n });\n continue;\n }\n try {\n const meta = await this.client.getSheetMeta(spreadsheetToken, s.sheet_id!);\n const { row_count = 0, column_count = 0 } = meta.grid_properties ?? {};\n if (!row_count || !column_count) {\n resolved.push({ title: s.title ?? '', kind: 'grid', rows: [] });\n continue;\n }\n const endCol = columnIndexToLetter(column_count);\n const values = await this.client.readSheetValues(\n spreadsheetToken, `${s.sheet_id}!A1:${endCol}${row_count}`,\n );\n const flat = (values ?? []).map((row: any[]) => row.map(cellToMd));\n const expanded = expandMerges(flat, meta.merges ?? []);\n const trimmed = trimTrailingEmpty(expanded);\n resolved.push({ title: s.title ?? '', kind: 'grid', rows: trimmed });\n } catch (e: any) {\n resolved.push({\n title: s.title ?? '', kind: 'grid', rows: [],\n error: `读取失败:${e.message}`,\n });\n } finally {\n await sleep(600);\n }\n }\n map.set(raw, {\n type: 'sheetResolved',\n title: info.title ?? '',\n sheets: resolved,\n });\n } catch (e: any) {\n logger.warn(`Failed to resolve sheet ${raw}:`, e.message);\n map.set(raw, { type: 'sheetResolved', title: '', sheets: [] });\n }\n }\n return map;\n }\n}\n\n// ─── AST Traversal Utilities ─────────────────────────────────────────────────\n\ninterface SheetRef {\n /** 原始 token(SpreadsheetToken_SheetID),用于 AST 匹配 */\n raw: string;\n /** 电子表格 token */\n spreadsheetToken: string;\n /** 工作表 ID(可选) */\n sheetId?: string;\n}\n\nfunction collectTokens (node: MdBlockNode) {\n const imageTokens: string[] = [];\n const whiteboardTokens: string[] = [];\n const sheetRefs: SheetRef[] = [];\n traverseBlockAst(node, n => {\n switch (n.type) {\n case 'image':\n imageTokens.push(n.src);\n break;\n case 'whiteboard':\n whiteboardTokens.push(n.token);\n break;\n case 'sheet': {\n // token 格式为 SpreadsheetToken_SheetID,以最后一个下划线拆分\n const lastIdx = n.token.lastIndexOf('_');\n const spreadsheetToken = lastIdx > 0 ? n.token.slice(0, lastIdx) : n.token;\n const sheetId = lastIdx > 0 ? n.token.slice(lastIdx + 1) : undefined;\n sheetRefs.push({ raw: n.token, spreadsheetToken, sheetId });\n break;\n }\n }\n });\n return { imageTokens, whiteboardTokens, sheetRefs };\n}\n\nfunction replaceInAst (\n node: MdBlockNode,\n imageMap: Map<string, string>,\n whiteboardMap: Map<string, MdBlockNode>,\n sheetMap: Map<string, MdBlockNode>,\n): void {\n if (node.type === 'image') {\n const newSrc = imageMap.get(node.src);\n if (newSrc) {\n (node as MdBlockNode & { src: string }).src = newSrc;\n }\n return;\n }\n\n if (!hasBlockChildren(node)) return;\n\n const children = node.children as MdBlockNode[];\n for (let i = 0; i < children.length; i++) {\n const child = children[i]!;\n if (child.type === 'whiteboard') {\n const replacement = whiteboardMap.get(child.token);\n if (replacement) {\n children[i] = replacement;\n continue;\n }\n }\n if (child.type === 'sheet') {\n const replacement = sheetMap.get(child.token);\n if (replacement) {\n children[i] = replacement;\n continue;\n }\n }\n if (child.type === 'image') {\n const newSrc = imageMap.get(child.src);\n if (newSrc) {\n (child as MdBlockNode & { src: string }).src = newSrc;\n }\n }\n replaceInAst(child, imageMap, whiteboardMap, sheetMap);\n }\n}\n\nfunction traverseBlockAst (node: MdBlockNode, visitor: (node: MdBlockNode) => void): void {\n visitor(node);\n if (!hasBlockChildren(node)) return;\n for (const child of (node.children as MdBlockNode[])) {\n traverseBlockAst(child, visitor);\n }\n}\n\nfunction hasBlockChildren (node: MdBlockNode): node is Extract<\n MdBlockNode,\n { type: 'page' | 'bullet' | 'ordered' | 'callout' | 'quote' | 'grid' }\n> {\n return (\n node.type === 'page' ||\n node.type === 'bullet' ||\n node.type === 'ordered' ||\n node.type === 'callout' ||\n node.type === 'quote' ||\n node.type === 'grid'\n );\n}\n","import type { DocxBlock } from './types.js';\n\n/** 标题过滤器的状态 */\ntype FilterState = 'scanning' | 'collecting' | 'done';\n\n/** 标题过滤器配置 */\nexport interface TitleFilterOptions {\n /** 要匹配的标题文本(会 trim 后比较) */\n title: string;\n}\n\n/** 标题过滤器结果 */\nexport interface TitleFilterResult {\n /** 过滤后的 blocks(包含匹配标题及其子级) */\n blocks: DocxBlock[];\n /** 是否已找到匹配 */\n matched: boolean;\n /** 扫描期间遇到的所有 heading(按出现顺序,不去重;仅 scanning 阶段收集) */\n availableHeadings: Array<{ level: number; text: string }>;\n}\n\n/**\n * 获取标题块的层级(1~9),非标题块返回 null。\n * block_type 3~11 对应 heading 1~9\n */\nexport function getHeadingLevel (block: DocxBlock): number | null {\n const bt = block.block_type;\n if (bt !== undefined && bt >= 3 && bt <= 11) {\n return bt - 2;\n }\n return null;\n}\n\n/**\n * 从 DocxBlock 中提取标题文本(trim),非标题块返回 null。\n */\nexport function extractHeadingText (block: DocxBlock): string | null {\n const level = getHeadingLevel(block);\n if (level === null) return null;\n const headingKey = `heading${level}` as keyof DocxBlock;\n const body = block[headingKey] as { elements?: Array<{ text_run?: { content?: string } }> } | undefined;\n if (!body?.elements) return null;\n const text = body.elements\n .map(e => e.text_run?.content ?? '')\n .join('');\n return text.trim();\n}\n\n/**\n * 创建标题过滤器,返回一个 pageHandler 兼容的回调和结果获取器。\n * 纯函数工厂,无副作用,易于测试。\n */\nexport function createTitleFilter (options: TitleFilterOptions): {\n /** 传入 getDocxBlocks 的 pageHandler */\n pageHandler: (blocks: DocxBlock[]) => boolean;\n /** 获取最终结果 */\n getResult: () => TitleFilterResult;\n} {\n const targetTitle = options.title.trim();\n let state: FilterState = 'scanning';\n let matchedLevel = 0;\n const collected: DocxBlock[] = [];\n const seenHeadings: Array<{ level: number; text: string }> = [];\n\n function pageHandler (blocks: DocxBlock[]): boolean {\n for (const block of blocks) {\n // page 节点(block_type=1)始终保留\n if (block.block_type === 1) {\n collected.push(block);\n continue;\n }\n switch (state) {\n case 'scanning': {\n const level = getHeadingLevel(block);\n if (level !== null) {\n const text = extractHeadingText(block) ?? '';\n // 记录扫描到的所有标题(不去重、按出现顺序),用于未匹配时给出可用标题列表\n seenHeadings.push({ level, text });\n if (text === targetTitle) {\n state = 'collecting';\n matchedLevel = level;\n collected.push(block);\n }\n }\n break;\n }\n case 'collecting': {\n const level = getHeadingLevel(block);\n // 遇到同级或更高级别标题(level <= matchedLevel),收集结束\n if (level !== null && level <= matchedLevel) {\n state = 'done';\n return false;\n }\n collected.push(block);\n break;\n }\n case 'done':\n return false;\n }\n }\n return state !== 'done';\n }\n\n function getResult (): TitleFilterResult {\n return {\n blocks: [...collected],\n matched: state === 'collecting' || state === 'done',\n availableHeadings: [...seenHeadings],\n };\n }\n\n return { pageHandler, getResult };\n}\n","import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { LoggerLevel } from '@larksuiteoapi/node-sdk';\nimport { createClient } from './client.js';\nimport { Parser } from './md-ast/parser.js';\nimport { registerBuiltinParsers } from './md-ast/parsers/index.js';\nimport { MdSerializer, registerBuiltinSerializers } from './md-ast/serializer.js';\nimport { MdTransformer } from './md-ast/transformer.js';\nimport { createLogger } from './logger.js';\nimport type { ConvertOptions, ConvertResult, DocxBlock } from './types.js';\nimport { createTitleFilter } from './title-filter.js';\n\nconst logger = createLogger('converter');\n\n// ─── URL Parsing ─────────────────────────────────────────────────────────────\n\nexport function parseWikiUrl (url: string): { docType: string; docToken: string; sheetId?: string } {\n const m = url.match(/^https:\\/\\/[\\w.-]+\\/(docs|docx|wiki|sheets)\\/([a-zA-Z0-9]+)/);\n if (!m) throw new Error('Invalid feishu document URL');\n // 解析 ?sheet=XXX 查询参数(仅对 sheets 类型有意义)\n const sheetId = new URL(url).searchParams.get('sheet') ?? undefined;\n return { docType: m[1]!, docToken: m[2]!, sheetId };\n}\n\n// ─── Core Convert ────────────────────────────────────────────────────────────\n\nexport async function convert (opts: ConvertOptions): Promise<ConvertResult> {\n const { docType, docToken: rawToken, sheetId } = parseWikiUrl(opts.url);\n logger.info('Captured document token:', rawToken, sheetId ? `sheetId: ${sheetId}` : '');\n\n const sdkLoggerLevel = opts.agent ? LoggerLevel.error : LoggerLevel.warn;\n const client = createClient(opts.appId, opts.appSecret, sdkLoggerLevel);\n\n // 1. 解析文档 token 与类型\n let docToken = rawToken;\n let objType: string = docType; // 'docx' | 'docs' | 'sheet' | 'wiki'\n\n if (docType === 'wiki') {\n const node = await client.getWikiNodeInfo(docToken);\n docToken = node.obj_token!;\n objType = node.obj_type as string ?? 'docx';\n logger.info('Resolved wiki node:', objType, docToken);\n } else if (docType === 'sheets') {\n objType = 'sheet';\n }\n\n let ast: import('./md-ast/types.js').MdBlockNode;\n\n if (objType === 'sheet') {\n // 独立 sheet 流程:有 sheetId 时拼接为 token_sheetId 格式\n const info = await client.getSpreadsheetInfo(docToken);\n const sheetToken = sheetId ? `${docToken}_${sheetId}` : docToken;\n ast = {\n type: 'page',\n title: [{ type: 'text', content: info.title ?? '' }],\n children: [{ type: 'sheet', token: sheetToken }],\n };\n } else {\n // 原 docx 流程\n const doc = await client.getDocxDocument(docToken);\n let blocks: DocxBlock[];\n if (opts.filterTitle) {\n const filter = createTitleFilter({ title: opts.filterTitle });\n await client.getDocxBlocks(docToken, filter.pageHandler);\n const result = filter.getResult();\n if (!result.matched) {\n let msg = `No heading matched \"${opts.filterTitle}\". Please verify the heading text.`;\n if (result.availableHeadings.length > 0) {\n const list = result.availableHeadings\n .map(h => `${'#'.repeat(h.level)} ${h.text}`)\n .join('\\n');\n msg += `\\n\\nAvailable headings in the document:\\n\\n${list}`;\n }\n throw new Error(msg);\n }\n blocks = result.blocks;\n } else {\n blocks = await client.getDocxBlocks(docToken);\n }\n logger.info(`Fetched ${blocks.length} blocks`);\n\n const parser = new Parser();\n registerBuiltinParsers(parser);\n ast = parser.parse(doc, blocks);\n }\n\n // 异步后处理\n const transformer = new MdTransformer(client, opts, objType === 'sheet' ? 'sheet' : 'docx');\n await transformer.transform(ast);\n\n // 序列化为 markdown\n const serializer = new MdSerializer();\n registerBuiltinSerializers(serializer);\n const markdown = serializer.serialize(ast, { sourceType: objType === 'sheet' ? 'sheet' : 'docx' });\n\n // 输出:非 agent 模式、或 agent='local' 模式都需要落盘\n let filePath: string | undefined;\n if (!opts.agent || opts.agent === 'local') {\n fs.mkdirSync(opts.output, { recursive: true });\n filePath = path.resolve(opts.output, `${docToken}.md`);\n fs.writeFileSync(filePath, markdown);\n logger.info('Downloaded markdown file to', filePath);\n }\n\n return { markdown, docToken, filePath };\n}\n"],"mappings":"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"}
|