@one2x/medeo-rte 0.0.0-stage → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (145) hide show
  1. package/README.md +209 -2
  2. package/dist/chunks/types-I0yc5X7i.js +18 -0
  3. package/dist/chunks/types-I0yc5X7i.js.map +1 -0
  4. package/dist/formula.js +186 -0
  5. package/dist/formula.js.map +1 -0
  6. package/dist/index.js +5503 -0
  7. package/dist/index.js.map +1 -0
  8. package/dist/style.css +718 -0
  9. package/dist/types/commands/index.d.ts +4 -0
  10. package/dist/types/commands/index.d.ts.map +1 -0
  11. package/dist/types/commands/selfcheck.d.ts +2 -0
  12. package/dist/types/commands/selfcheck.d.ts.map +1 -0
  13. package/dist/types/commands/shortcuts.d.ts +48 -0
  14. package/dist/types/commands/shortcuts.d.ts.map +1 -0
  15. package/dist/types/commands/types.d.ts +69 -0
  16. package/dist/types/commands/types.d.ts.map +1 -0
  17. package/dist/types/convert/clipboard.d.ts +7 -0
  18. package/dist/types/convert/clipboard.d.ts.map +1 -0
  19. package/dist/types/convert/markdown.d.ts +30 -0
  20. package/dist/types/convert/markdown.d.ts.map +1 -0
  21. package/dist/types/convert/mdPaste.d.ts +8 -0
  22. package/dist/types/convert/mdPaste.d.ts.map +1 -0
  23. package/dist/types/editor.d.ts +469 -0
  24. package/dist/types/editor.d.ts.map +1 -0
  25. package/dist/types/edits/editResult.d.ts +62 -0
  26. package/dist/types/edits/editResult.d.ts.map +1 -0
  27. package/dist/types/edits/index.d.ts +12 -0
  28. package/dist/types/edits/index.d.ts.map +1 -0
  29. package/dist/types/edits/selfcheck.d.ts +2 -0
  30. package/dist/types/edits/selfcheck.d.ts.map +1 -0
  31. package/dist/types/edits/transaction.d.ts +35 -0
  32. package/dist/types/edits/transaction.d.ts.map +1 -0
  33. package/dist/types/edits/undoStack.d.ts +50 -0
  34. package/dist/types/edits/undoStack.d.ts.map +1 -0
  35. package/dist/types/embed/code.d.ts +9 -0
  36. package/dist/types/embed/code.d.ts.map +1 -0
  37. package/dist/types/embed/formula-katex.d.ts +4 -0
  38. package/dist/types/embed/formula-katex.d.ts.map +1 -0
  39. package/dist/types/embed/formula-mathlive.d.ts +6 -0
  40. package/dist/types/embed/formula-mathlive.d.ts.map +1 -0
  41. package/dist/types/embed/formula.d.ts +8 -0
  42. package/dist/types/embed/formula.d.ts.map +1 -0
  43. package/dist/types/embed/host.d.ts +70 -0
  44. package/dist/types/embed/host.d.ts.map +1 -0
  45. package/dist/types/embed/image.d.ts +3 -0
  46. package/dist/types/embed/image.d.ts.map +1 -0
  47. package/dist/types/embed/index.d.ts +20 -0
  48. package/dist/types/embed/index.d.ts.map +1 -0
  49. package/dist/types/embed/ref.d.ts +25 -0
  50. package/dist/types/embed/ref.d.ts.map +1 -0
  51. package/dist/types/embed/registry.d.ts +6 -0
  52. package/dist/types/embed/registry.d.ts.map +1 -0
  53. package/dist/types/embed/slot.d.ts +15 -0
  54. package/dist/types/embed/slot.d.ts.map +1 -0
  55. package/dist/types/embed/types.d.ts +53 -0
  56. package/dist/types/embed/types.d.ts.map +1 -0
  57. package/dist/types/embed/video.d.ts +3 -0
  58. package/dist/types/embed/video.d.ts.map +1 -0
  59. package/dist/types/formula.d.ts +15 -0
  60. package/dist/types/formula.d.ts.map +1 -0
  61. package/dist/types/index.d.ts +39 -0
  62. package/dist/types/index.d.ts.map +1 -0
  63. package/dist/types/input/ime.d.ts +27 -0
  64. package/dist/types/input/ime.d.ts.map +1 -0
  65. package/dist/types/input/keyboard.d.ts +21 -0
  66. package/dist/types/input/keyboard.d.ts.map +1 -0
  67. package/dist/types/layout/engine.d.ts +55 -0
  68. package/dist/types/layout/engine.d.ts.map +1 -0
  69. package/dist/types/layout/harness.d.ts +3 -0
  70. package/dist/types/layout/harness.d.ts.map +1 -0
  71. package/dist/types/layout/measure.d.ts +37 -0
  72. package/dist/types/layout/measure.d.ts.map +1 -0
  73. package/dist/types/layout/refMetrics.d.ts +5 -0
  74. package/dist/types/layout/refMetrics.d.ts.map +1 -0
  75. package/dist/types/layout/selfcheck.d.ts +2 -0
  76. package/dist/types/layout/selfcheck.d.ts.map +1 -0
  77. package/dist/types/layout/style.d.ts +4 -0
  78. package/dist/types/layout/style.d.ts.map +1 -0
  79. package/dist/types/layout/types.d.ts +133 -0
  80. package/dist/types/layout/types.d.ts.map +1 -0
  81. package/dist/types/layout/wrap.d.ts +65 -0
  82. package/dist/types/layout/wrap.d.ts.map +1 -0
  83. package/dist/types/model/blocks.d.ts +66 -0
  84. package/dist/types/model/blocks.d.ts.map +1 -0
  85. package/dist/types/model/document.d.ts +102 -0
  86. package/dist/types/model/document.d.ts.map +1 -0
  87. package/dist/types/model/fragment.d.ts +7 -0
  88. package/dist/types/model/fragment.d.ts.map +1 -0
  89. package/dist/types/model/markers.d.ts +14 -0
  90. package/dist/types/model/markers.d.ts.map +1 -0
  91. package/dist/types/model/types.d.ts +155 -0
  92. package/dist/types/model/types.d.ts.map +1 -0
  93. package/dist/types/model/virtualBlock.d.ts +44 -0
  94. package/dist/types/model/virtualBlock.d.ts.map +1 -0
  95. package/dist/types/mutations/apply.d.ts +14 -0
  96. package/dist/types/mutations/apply.d.ts.map +1 -0
  97. package/dist/types/mutations/index.d.ts +15 -0
  98. package/dist/types/mutations/index.d.ts.map +1 -0
  99. package/dist/types/mutations/invert.d.ts +21 -0
  100. package/dist/types/mutations/invert.d.ts.map +1 -0
  101. package/dist/types/mutations/ranges.d.ts +39 -0
  102. package/dist/types/mutations/ranges.d.ts.map +1 -0
  103. package/dist/types/mutations/registry.d.ts +27 -0
  104. package/dist/types/mutations/registry.d.ts.map +1 -0
  105. package/dist/types/mutations/selection.d.ts +12 -0
  106. package/dist/types/mutations/selection.d.ts.map +1 -0
  107. package/dist/types/mutations/selfcheck.d.ts +2 -0
  108. package/dist/types/mutations/selfcheck.d.ts.map +1 -0
  109. package/dist/types/mutations/transform.d.ts +33 -0
  110. package/dist/types/mutations/transform.d.ts.map +1 -0
  111. package/dist/types/mutations/types.d.ts +128 -0
  112. package/dist/types/mutations/types.d.ts.map +1 -0
  113. package/dist/types/operations/context.d.ts +47 -0
  114. package/dist/types/operations/context.d.ts.map +1 -0
  115. package/dist/types/operations/entity.d.ts +18 -0
  116. package/dist/types/operations/entity.d.ts.map +1 -0
  117. package/dist/types/operations/harness.d.ts +54 -0
  118. package/dist/types/operations/harness.d.ts.map +1 -0
  119. package/dist/types/operations/index.d.ts +20 -0
  120. package/dist/types/operations/index.d.ts.map +1 -0
  121. package/dist/types/operations/primitives.d.ts +35 -0
  122. package/dist/types/operations/primitives.d.ts.map +1 -0
  123. package/dist/types/operations/resolve.d.ts +31 -0
  124. package/dist/types/operations/resolve.d.ts.map +1 -0
  125. package/dist/types/operations/selfcheck.d.ts +2 -0
  126. package/dist/types/operations/selfcheck.d.ts.map +1 -0
  127. package/dist/types/operations/slice.d.ts +28 -0
  128. package/dist/types/operations/slice.d.ts.map +1 -0
  129. package/dist/types/operations/style.d.ts +20 -0
  130. package/dist/types/operations/style.d.ts.map +1 -0
  131. package/dist/types/operations/table.d.ts +14 -0
  132. package/dist/types/operations/table.d.ts.map +1 -0
  133. package/dist/types/operations/text.d.ts +20 -0
  134. package/dist/types/operations/text.d.ts.map +1 -0
  135. package/dist/types/operations/virtualBlock.d.ts +44 -0
  136. package/dist/types/operations/virtualBlock.d.ts.map +1 -0
  137. package/dist/types/paint/canvasPainter.d.ts +37 -0
  138. package/dist/types/paint/canvasPainter.d.ts.map +1 -0
  139. package/dist/types/paint/decorations.d.ts +19 -0
  140. package/dist/types/paint/decorations.d.ts.map +1 -0
  141. package/dist/types/paint/htmlPainter.d.ts +19 -0
  142. package/dist/types/paint/htmlPainter.d.ts.map +1 -0
  143. package/dist/types/paint/types.d.ts +36 -0
  144. package/dist/types/paint/types.d.ts.map +1 -0
  145. package/package.json +64 -4
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../src/embed/code.ts","../src/embed/image.ts","../src/model/markers.ts","../src/model/blocks.ts","../src/model/types.ts","../src/model/virtualBlock.ts","../src/layout/measure.ts","../src/layout/refMetrics.ts","../src/layout/style.ts","../src/layout/wrap.ts","../src/layout/engine.ts","../src/paint/decorations.ts","../src/embed/ref.ts","../src/embed/slot.ts","../src/embed/video.ts","../src/embed/host.ts","../src/embed/registry.ts","../src/embed/index.ts","../src/mutations/types.ts","../src/mutations/apply.ts","../src/model/fragment.ts","../src/mutations/invert.ts","../src/mutations/ranges.ts","../src/mutations/transform.ts","../src/mutations/selection.ts","../src/edits/editResult.ts","../src/operations/context.ts","../src/operations/resolve.ts","../src/operations/primitives.ts","../src/operations/style.ts","../src/convert/markdown.ts","../src/model/document.ts","../src/operations/entity.ts","../src/operations/virtualBlock.ts","../src/operations/text.ts","../src/operations/table.ts","../src/convert/mdPaste.ts","../src/operations/slice.ts","../src/edits/transaction.ts","../src/edits/undoStack.ts","../src/input/ime.ts","../src/commands/shortcuts.ts","../src/input/keyboard.ts","../src/convert/clipboard.ts","../src/paint/canvasPainter.ts","../src/paint/htmlPainter.ts","../src/editor.ts"],"sourcesContent":["import { EmbedEntity } from '../model/types';\nimport { EmbedBox, EmbedPlugin, emitEmbedChange } from './types';\n\nexport const CODE_LANGUAGES = ['plain', 'javascript', 'typescript', 'python', 'json', 'html', 'css'] as const;\nconst BAR_H = 28;\nconst LINE_H = 18;\nconst PAD = 12;\n\nexport function measureCode(entity: EmbedEntity, contentWidth: number): { width: number; height: number } {\n const lines = Math.max(1, (entity.code ?? '').split('\\n').length);\n const width = Math.max(160, entity.width || contentWidth);\n return { width, height: BAR_H + PAD * 2 + lines * LINE_H };\n}\n\nexport const codePlugin: EmbedPlugin = {\n kind: 'code',\n keepAspectRatio: false,\n interactive: true,\n overlayOnCanvas: true,\n measure: measureCode,\n create(box) {\n const root = document.createElement('div');\n root.className = 'mini-embed mini-code mini-embed-interactive';\n const bar = document.createElement('div');\n bar.className = 'mini-code-bar';\n const sel = document.createElement('select');\n sel.className = 'mini-code-lang';\n for (const lang of CODE_LANGUAGES) {\n const opt = document.createElement('option');\n opt.value = lang;\n opt.textContent = lang;\n sel.appendChild(opt);\n }\n bar.appendChild(sel);\n const input = document.createElement('textarea');\n input.className = 'mini-code-input';\n input.spellcheck = false;\n input.value = box.entity.code ?? '';\n sel.value = box.entity.language ?? 'plain';\n root.append(bar, input);\n\n sel.addEventListener('change', () => {\n emitEmbedChange(root, { id: box.entity.id, patch: { language: sel.value } }, true);\n });\n input.addEventListener('input', () => {\n emitEmbedChange(root, { id: box.entity.id, patch: { code: input.value } });\n });\n input.addEventListener('blur', () => {\n emitEmbedChange(root, { id: box.entity.id, patch: { code: input.value } }, true);\n });\n return root;\n },\n update(el, box) {\n const sel = el.querySelector<HTMLSelectElement>('.mini-code-lang');\n const input = el.querySelector<HTMLTextAreaElement>('.mini-code-input');\n if (sel && document.activeElement !== sel) sel.value = box.entity.language ?? 'plain';\n if (input && document.activeElement !== input) input.value = box.entity.code ?? '';\n },\n paintCanvasBackdrop(ctx, box) {\n ctx.fillStyle = '#f4f6f8';\n ctx.fillRect(box.x, box.y, box.w, box.h);\n }\n};\n","import { EmbedBox, EmbedPlugin } from './types';\n\nexport const imagePlugin: EmbedPlugin = {\n kind: 'image',\n keepAspectRatio: true,\n interactive: false,\n overlayOnCanvas: false,\n measure(entity) {\n return { width: entity.width, height: entity.height };\n },\n create(box) {\n const node = document.createElement('img');\n node.className = 'mini-embed mini-image';\n node.draggable = false;\n node.src = box.entity.src ?? '';\n return node;\n },\n update(el, box) {\n const img = el as HTMLImageElement;\n if (box.entity.src && img.src !== box.entity.src) img.src = box.entity.src;\n el.classList.toggle('is-inline', box.h <= 32);\n },\n paintCanvasBackdrop(ctx, box, imageOf) {\n const src = box.entity.src;\n if (!src) return;\n const node = imageOf(src);\n if (!node.complete || node.naturalWidth <= 0) return;\n if (box.h <= 32) {\n ctx.save();\n ctx.beginPath();\n ctx.roundRect(box.x, box.y, box.w, box.h, 6);\n ctx.clip();\n ctx.drawImage(node, box.x, box.y, box.w, box.h);\n ctx.restore();\n return;\n }\n ctx.drawImage(node, box.x, box.y, box.w, box.h);\n }\n};\n","/** 文档流里的结构标记:每个标记占一个下标,和普通字符一样参与排版与选区。 */\nexport const MARKERS = {\n PARAGRAPH: '\\n',\n IMAGE: '*',\n TABLE_START: '\\u0010',\n TABLE_END: '\\u0011',\n TABLE_ROW: '\\u0012',\n TABLE_CELL: '\\u001c'\n} as const;\n\nexport function isTableMarker(ch: string): boolean {\n return (\n ch === MARKERS.TABLE_START ||\n ch === MARKERS.TABLE_END ||\n ch === MARKERS.TABLE_ROW ||\n ch === MARKERS.TABLE_CELL\n );\n}\n\nexport function isStructuralMarker(ch: string): boolean {\n return ch === MARKERS.PARAGRAPH || isTableMarker(ch);\n}\n\nexport function prevCodePointLen(text: string, index: number): number {\n if (index <= 0) return 0;\n const c = text.charCodeAt(index - 1);\n if (c >= 0xdc00 && c <= 0xdfff && index >= 2) {\n const p = text.charCodeAt(index - 2);\n if (p >= 0xd800 && p <= 0xdbff) return 2;\n }\n return 1;\n}\n\nexport function nextCodePointLen(text: string, index: number): number {\n if (index >= text.length) return 0;\n const c = text.charCodeAt(index);\n if (c >= 0xd800 && c <= 0xdbff && index + 1 < text.length) {\n const n = text.charCodeAt(index + 1);\n if (n >= 0xdc00 && n <= 0xdfff) return 2;\n }\n return 1;\n}\n","import { isTableMarker, MARKERS } from './markers';\nimport type { ParagraphProps } from './types';\n\nexport interface ParaRange {\n start: number;\n end: number;\n}\n\nexport interface TableCellBlock {\n marker: number;\n start: number;\n end: number;\n paragraphs: ParaRange[];\n}\n\nexport interface TableRowBlock {\n marker: number;\n start: number;\n end: number;\n cells: TableCellBlock[];\n}\n\nexport interface ParagraphBlock {\n kind: 'paragraph';\n start: number;\n end: number;\n}\n\nexport interface TableBlock {\n kind: 'table';\n start: number;\n end: number;\n rows: TableRowBlock[];\n}\n\nexport type Block = ParagraphBlock | TableBlock;\n\nexport function parseBlocks(spacers: string): Block[] {\n const blocks: Block[] = [];\n let i = 0;\n while (i < spacers.length) {\n if (spacers[i] === MARKERS.TABLE_START) {\n const table = parseTable(spacers, i);\n blocks.push(table);\n i = table.end;\n } else {\n let j = i;\n while (j < spacers.length && spacers[j] !== MARKERS.PARAGRAPH && spacers[j] !== MARKERS.TABLE_START) {\n j++;\n }\n if (j < spacers.length && spacers[j] === MARKERS.PARAGRAPH) {\n j++;\n }\n if (j === i) {\n i++;\n continue;\n }\n blocks.push({ kind: 'paragraph', start: i, end: j });\n i = j;\n }\n }\n return blocks;\n}\n\nfunction parseTable(spacers: string, start: number): TableBlock {\n let i = start + 1;\n const rows: TableRowBlock[] = [];\n while (i < spacers.length && spacers[i] !== MARKERS.TABLE_END) {\n if (spacers[i] !== MARKERS.TABLE_ROW) {\n i++;\n continue;\n }\n const rowMarker = i;\n i += 1;\n const cells: TableCellBlock[] = [];\n while (i < spacers.length && spacers[i] === MARKERS.TABLE_CELL) {\n const cellMarker = i;\n i += 1;\n const paragraphs: ParaRange[] = [];\n let paraStart = i;\n while (i < spacers.length && !isTableMarker(spacers[i])) {\n if (spacers[i] === MARKERS.PARAGRAPH) {\n paragraphs.push({ start: paraStart, end: i + 1 });\n paraStart = i + 1;\n }\n i++;\n }\n if (paraStart < i) {\n paragraphs.push({ start: paraStart, end: i });\n }\n if (paragraphs.length === 0) {\n paragraphs.push({ start: i, end: i });\n }\n cells.push({ marker: cellMarker, start: cellMarker, end: i, paragraphs });\n }\n rows.push({ marker: rowMarker, start: rowMarker, end: i, cells });\n }\n let end = i;\n if (i < spacers.length && spacers[i] === MARKERS.TABLE_END) {\n end = i + 1;\n }\n return { kind: 'table', start, end, rows };\n}\n\nexport function findTableAt(spacers: string, index: number): TableBlock | null {\n for (const block of parseBlocks(spacers)) {\n if (block.kind === 'table' && index >= block.start && index < block.end) {\n return block;\n }\n }\n return null;\n}\n\nexport function isEmptyParagraph(spacers: string, para: ParaRange): boolean {\n const contentEnd = spacers[para.end - 1] === MARKERS.PARAGRAPH ? para.end - 1 : para.end;\n return contentEnd <= para.start;\n}\n\n/** 列表标记 / 标题画在段落样式上,不进 spacer;有它们时占位符不能当空文档。 */\nexport function isVisuallyEmptyDoc(doc: {\n spacers: string;\n entities: { size: number };\n paragraphPropsAt: (index: number) => ParagraphProps;\n}): boolean {\n if (doc.entities.size > 0) return false;\n for (const ch of doc.spacers) {\n if (ch !== MARKERS.PARAGRAPH) return false;\n }\n for (const block of parseBlocks(doc.spacers)) {\n if (block.kind !== 'paragraph') return false;\n const props = doc.paragraphPropsAt(block.start);\n if ((props.list ?? 'none') !== 'none') return false;\n if ((props.heading ?? 0) > 0) return false;\n if ((props.indent ?? 0) > 0) return false;\n }\n return true;\n}\n\nexport function findParagraphAt(spacers: string, index: number): ParaRange | null {\n const clamped = Math.max(0, Math.min(index, spacers.length));\n for (const block of parseBlocks(spacers)) {\n if (block.kind === 'paragraph' && clamped >= block.start && clamped <= block.end) {\n if (clamped === block.end && clamped < spacers.length) continue;\n return { start: block.start, end: block.end };\n }\n if (block.kind === 'table') {\n for (const row of block.rows) {\n for (const cell of row.cells) {\n for (const para of cell.paragraphs) {\n if (clamped >= para.start && clamped <= para.end) {\n if (clamped === para.end && clamped < cell.end) continue;\n return para;\n }\n }\n }\n }\n }\n }\n if (spacers.length === 0) return { start: 0, end: 0 };\n return null;\n}\n\nexport function paragraphsIntersecting(spacers: string, start: number, end: number): ParaRange[] {\n const from = Math.min(start, end);\n const to = Math.max(start, end);\n if (from === to) {\n const para = findParagraphAt(spacers, from);\n return para ? [para] : [];\n }\n const out: ParaRange[] = [];\n for (const block of parseBlocks(spacers)) {\n if (block.kind === 'paragraph') {\n if (block.end > from && block.start < to) out.push(block);\n } else {\n for (const row of block.rows) {\n for (const cell of row.cells) {\n for (const para of cell.paragraphs) {\n if (para.end > from && para.start < to) out.push(para);\n }\n }\n }\n }\n }\n return uniqueRanges(out);\n}\n\nfunction uniqueRanges(ranges: ParaRange[]): ParaRange[] {\n const seen = new Set<string>();\n const out: ParaRange[] = [];\n for (const r of ranges) {\n const k = `${r.start}:${r.end}`;\n if (!seen.has(k)) {\n seen.add(k);\n out.push(r);\n }\n }\n return out;\n}\n\nexport function cellAt(spacers: string, index: number): { table: TableBlock; row: number; col: number; cell: TableCellBlock } | null {\n const table = findTableAt(spacers, index);\n if (!table) return null;\n for (let r = 0; r < table.rows.length; r++) {\n const row = table.rows[r];\n for (let c = 0; c < row.cells.length; c++) {\n const cell = row.cells[c];\n if (index >= cell.start && index < cell.end) {\n return { table, row: r, col: c, cell };\n }\n if (index === cell.end && c === row.cells.length - 1 && r === table.rows.length - 1) {\n return { table, row: r, col: c, cell };\n }\n }\n }\n return null;\n}\n\n/** 把下标吸附到最近的安全落点,避开表格结构标记 */\nexport function nearestSafeIndex(spacers: string, index: number): number {\n const i = Math.max(0, Math.min(index, spacers.length));\n const ch = spacers[i];\n if (ch === MARKERS.TABLE_CELL) return i + 1;\n if (ch === MARKERS.TABLE_ROW) return i + 2;\n if (ch === MARKERS.TABLE_START) return i + 3;\n if (ch === MARKERS.TABLE_END) return Math.max(0, i - 1);\n return i;\n}\n\nexport function cellContentRange(cell: TableCellBlock): { start: number; end: number } {\n return {\n start: cell.paragraphs[0]?.start ?? cell.start + 1,\n end: cell.end\n };\n}\n\nexport function isLastTableCell(hit: { table: TableBlock; row: number; col: number }): boolean {\n const lastRow = hit.table.rows.length - 1;\n const lastCol = hit.table.rows[lastRow].cells.length - 1;\n return hit.row === lastRow && hit.col === lastCol;\n}\n\nexport function nextCellIndex(spacers: string, index: number, dir: 1 | -1): number | null {\n const here = cellAt(spacers, index);\n if (!here) return null;\n const { table, row, col } = here;\n let r = row;\n let c = col + dir;\n if (c >= table.rows[r].cells.length) {\n r += 1;\n c = 0;\n } else if (c < 0) {\n r -= 1;\n if (r >= 0) c = table.rows[r].cells.length - 1;\n }\n if (r < 0 || r >= table.rows.length) return null;\n const target = table.rows[r].cells[c];\n return target.paragraphs[0]?.start ?? target.start + 1;\n}\n\nexport function expandRangeOverStructures(spacers: string, start: number, end: number): { start: number; end: number } {\n let from = Math.min(start, end);\n let to = Math.max(start, end);\n if (from === to) return { start: from, end: to };\n for (const block of parseBlocks(spacers)) {\n if (block.kind !== 'table') continue;\n const overlaps = from < block.end && to > block.start;\n if (!overlaps) continue;\n const slice = spacers.slice(Math.max(from, block.start), Math.min(to, block.end));\n const touchesEdge = slice.includes(MARKERS.TABLE_START) || slice.includes(MARKERS.TABLE_END) || from <= block.start || to >= block.end;\n if (touchesEdge) {\n from = Math.min(from, block.start);\n to = Math.max(to, block.end);\n }\n }\n return { start: from, end: to };\n}\n\nexport function emptyTableSpacers(rows: number, cols: number): string {\n let s = MARKERS.TABLE_START;\n for (let r = 0; r < rows; r++) {\n s += MARKERS.TABLE_ROW;\n for (let c = 0; c < cols; c++) {\n s += MARKERS.TABLE_CELL + MARKERS.PARAGRAPH;\n }\n }\n s += MARKERS.TABLE_END;\n return s;\n}\n","export type HeadingLevel = 0 | 1 | 2 | 3;\nexport type Align = 'left' | 'center' | 'right';\nexport type ListKind = 'none' | 'ul' | 'ol';\nexport type StyleType = 'text' | 'paragraph' | 'table' | 'cell' | 'image' | 'link';\n\nexport type UnderlineStyle = 'single' | 'double' | 'wavy' | 'dotted' | 'marker';\nexport type TextFill = 'solid' | 'rainbow' | 'sunset';\n\nexport interface TextProps {\n bold?: boolean;\n italic?: boolean;\n underline?: boolean;\n underlineStyle?: UnderlineStyle;\n strikethrough?: boolean;\n fontSize?: number;\n /**\n * CSS font-family 栈。须具名或宿主 CSS 变量(如 `var(--Body-Medium-Font, Manrope)`)。\n * 测宽会在挂载后改用 getComputedStyle 解析后的值。不要用 `system-ui`。\n */\n fontFamily?: string;\n /** 字重,默认 400。`bold: true` 时仍为 700。 */\n fontWeight?: number;\n color?: string;\n fill?: TextFill;\n}\n\nexport interface ParagraphProps {\n heading?: HeadingLevel;\n align?: Align;\n list?: ListKind;\n indent?: number;\n /** 非空时此段属于同一分组;末段末尾回车新段不再继承。空串表示无分组。 */\n groupId?: string;\n}\n\nexport interface TableProps {\n colWidths?: number[];\n}\n\nexport interface CellProps {\n background?: string;\n}\n\nexport interface ImageProps {\n entityId: string;\n}\n\nexport interface LinkProps {\n url: string;\n}\n\nexport type StyleProps = TextProps | ParagraphProps | TableProps | CellProps | ImageProps | LinkProps;\n\n/** 外链默认色 */\nexport const LINK_COLOR = '#2374d1';\n\nexport interface StyleSpan {\n start: number;\n end: number;\n type: StyleType;\n props: StyleProps;\n}\n\n/** 行内嵌入对象:挂在 `*` 占位符上的实体类型 */\nexport type EmbedKind = 'image' | 'video' | 'code' | 'formula' | 'slot' | 'ref' | 'host';\nexport type SlotKind = 'text' | 'image' | 'select';\nexport type MediaKind = EmbedKind;\n\nexport interface EmbedEntity {\n id: string;\n kind?: EmbedKind;\n width: number;\n height: number;\n src?: string;\n language?: string;\n code?: string;\n latex?: string;\n displayMode?: boolean;\n slotKind?: SlotKind;\n label?: string;\n slotValue?: string;\n slotOptions?: string[];\n float?: 'left' | 'right';\n fragmentId?: string;\n /**\n * 宿主渲染型嵌入对象(kind:'host')承载的业务数据。SDK 不解释其内容,只负责\n * 存取、随实体序列化、在数据变化时通知宿主渲染器重渲。宿主通常在此存业务对象\n * 的引用 id(引用式承载),完整数据由宿主自己的 store 解析。\n */\n data?: unknown;\n /** host 型嵌入对象的类型标识(如 'objectRef'),由宿主定义,SDK 原样透传给渲染器。 */\n hostType?: string;\n}\n\nexport interface Fragment {\n id: string;\n title?: string;\n slice: Slice;\n}\n\n/** @deprecated 使用 EmbedEntity;保留别名以免切片/布局大面积改名 */\nexport type ImageEntity = EmbedEntity;\n\n/** 视频默认宽高比 */\nexport const VIDEO_ASPECT = 1920 / 1080;\n\n/** 虚拟块种类:region 是一层皮,slot 是最内层文本槽。 */\nexport type VirtualBlockKind = 'region' | 'slot';\n\n/**\n * 虚拟块的皮和文字缺省。块皮(底、边、圆角、内边距)只能放这里;\n * 文字字段与 {@link TextProps} 对齐,作排版期 fallback,不是 applyStyle 轨道。\n */\nexport interface VirtualBlockChrome {\n background?: string;\n borderColor?: string;\n borderWidth?: number;\n radius?: number;\n paddingX?: number;\n paddingY?: number;\n color?: string;\n fontSize?: number;\n fontFamily?: string;\n fontWeight?: number;\n bold?: boolean;\n italic?: boolean;\n /** 仅 slot:empty 时用这个色画 placeholder */\n placeholderColor?: string;\n}\n\n/**\n * 盖在同一条 spacers 上的可嵌套区间。不占额外字符,不是实体、不是 fragment。\n * 坐标是模型半开区间 [start, end)。\n */\nexport interface VirtualBlock {\n id: string;\n parentId: string | null;\n kind: VirtualBlockKind;\n start: number;\n end: number;\n chrome: VirtualBlockChrome;\n placeholder?: string;\n empty?: boolean;\n}\n\nexport interface Slice {\n text: string;\n styles: StyleSpan[];\n entities: ImageEntity[];\n fragments?: Fragment[];\n virtualBlocks?: VirtualBlock[];\n}\n\nexport interface Selection {\n anchor: number;\n focus: number;\n}\n\nexport function selStart(sel: Selection): number {\n return Math.min(sel.anchor, sel.focus);\n}\n\nexport function selEnd(sel: Selection): number {\n return Math.max(sel.anchor, sel.focus);\n}\n\nexport function isCollapsed(sel: Selection): boolean {\n return sel.anchor === sel.focus;\n}\n\nexport const DEFAULT_TEXT: Required<Pick<TextProps, 'fontSize' | 'color'>> & TextProps = {\n fontSize: 16,\n color: '#1f2329',\n bold: false,\n italic: false,\n underline: false,\n strikethrough: false\n};\n\nexport const DEFAULT_PARAGRAPH: Required<ParagraphProps> = {\n heading: 0,\n align: 'left',\n list: 'none',\n indent: 0,\n groupId: ''\n};\n\n/** 列表最大嵌套层级 */\nexport const MAX_LIST_INDENT = 8;\n\nexport const HEADING_TEXT: Record<HeadingLevel, TextProps> = {\n 0: { fontSize: 16, bold: false },\n 1: { fontSize: 28, bold: true },\n 2: { fontSize: 22, bold: true },\n 3: { fontSize: 18, bold: true }\n};\n\nexport function hasTextProps(props: TextProps): boolean {\n return (\n props.bold !== undefined ||\n props.italic !== undefined ||\n props.underline !== undefined ||\n props.underlineStyle !== undefined ||\n props.strikethrough !== undefined ||\n props.fontSize !== undefined ||\n props.fontFamily !== undefined ||\n props.fontWeight !== undefined ||\n props.color !== undefined ||\n props.fill !== undefined\n );\n}\n\nexport function textPropsEqual(a: TextProps, b: TextProps): boolean {\n return (\n a.bold === b.bold &&\n a.italic === b.italic &&\n a.underline === b.underline &&\n a.underlineStyle === b.underlineStyle &&\n a.strikethrough === b.strikethrough &&\n a.fontSize === b.fontSize &&\n a.fontFamily === b.fontFamily &&\n a.fontWeight === b.fontWeight &&\n a.color === b.color &&\n a.fill === b.fill\n );\n}\n\nexport function underlineKind(style: TextProps): UnderlineStyle | 'none' {\n if (style.underline === false) return 'none';\n if (style.underlineStyle) return style.underlineStyle;\n if (style.underline) return 'single';\n return 'none';\n}\n\nexport function paraPropsEqual(a: ParagraphProps, b: ParagraphProps): boolean {\n return (\n a.heading === b.heading &&\n a.align === b.align &&\n a.list === b.list &&\n a.indent === b.indent &&\n (a.groupId ?? '') === (b.groupId ?? '')\n );\n}\n\nexport function cloneStyle(span: StyleSpan): StyleSpan {\n return { start: span.start, end: span.end, type: span.type, props: { ...span.props } };\n}\n\nexport function cloneEntity(entity: ImageEntity): ImageEntity {\n return { ...entity };\n}\n\nexport function cloneVirtualBlock(block: VirtualBlock): VirtualBlock {\n return { ...block, chrome: { ...block.chrome } };\n}\n\n/** 虚拟块 chrome 上与 TextProps 对齐的文字缺省。 */\nexport function chromeTextProps(chrome: VirtualBlockChrome): TextProps {\n const props: TextProps = {};\n if (chrome.bold !== undefined) props.bold = chrome.bold;\n if (chrome.italic !== undefined) props.italic = chrome.italic;\n if (chrome.fontSize !== undefined) props.fontSize = chrome.fontSize;\n if (chrome.fontFamily !== undefined) props.fontFamily = chrome.fontFamily;\n if (chrome.fontWeight !== undefined) props.fontWeight = chrome.fontWeight;\n if (chrome.color !== undefined) props.color = chrome.color;\n return props;\n}\n","/**\n * 虚拟块区间表的机械运算:挪坐标、裁切、包含判定。\n *\n * 合法性(不交叉、slot 是叶子)由 Operation 保证。这里只做和 style 同类的\n * 闭开区间算术,以及 Slice 裁切时的平移。\n */\nimport { cloneVirtualBlock, VirtualBlock } from './types';\n\nexport function shiftVirtualBlocksOnInsert(\n blocks: Iterable<VirtualBlock>,\n index: number,\n len: number\n): VirtualBlock[] {\n if (!len) return [...blocks].map(cloneVirtualBlock);\n return [...blocks].map((b) => {\n if (b.end <= index) return cloneVirtualBlock(b);\n if (b.start >= index) return cloneVirtualBlock({ ...b, start: b.start + len, end: b.end + len });\n return cloneVirtualBlock({ ...b, end: b.end + len });\n });\n}\n\nexport function shiftVirtualBlocksOnDelete(\n blocks: Iterable<VirtualBlock>,\n start: number,\n end: number\n): VirtualBlock[] {\n const len = end - start;\n if (len <= 0) return [...blocks].map(cloneVirtualBlock);\n const out: VirtualBlock[] = [];\n for (const b of blocks) {\n if (b.end <= start) {\n out.push(cloneVirtualBlock(b));\n } else if (b.start >= end) {\n out.push(cloneVirtualBlock({ ...b, start: b.start - len, end: b.end - len }));\n } else if (b.start < start && b.end > end) {\n out.push(cloneVirtualBlock({ ...b, end: b.end - len }));\n } else if (b.start < start) {\n if (start > b.start) out.push(cloneVirtualBlock({ ...b, end: start }));\n } else if (b.end > end) {\n out.push(cloneVirtualBlock({ ...b, start, end: b.end - len }));\n }\n }\n return out.filter((b) => b.end > b.start);\n}\n\n/** 半开区间是否相交(相邻不算)。 */\nexport function rangesOverlap(a: { start: number; end: number }, b: { start: number; end: number }): boolean {\n return a.start < b.end && b.start < a.end;\n}\n\n/** 是否交叉:相交但谁也不包含谁。 */\nexport function rangesCross(a: { start: number; end: number }, b: { start: number; end: number }): boolean {\n return rangesOverlap(a, b) && !rangeContains(a, b) && !rangeContains(b, a);\n}\n\n/** a 是否包含 b(相等也算包含)。 */\nexport function rangeContains(a: { start: number; end: number }, b: { start: number; end: number }): boolean {\n return a.start <= b.start && a.end >= b.end;\n}\n\nexport function depthOf(block: VirtualBlock, byId: Map<string, VirtualBlock>): number {\n let d = 0;\n let id = block.parentId;\n const seen = new Set<string>([block.id]);\n while (id && !seen.has(id)) {\n seen.add(id);\n const parent = byId.get(id);\n if (!parent) break;\n d += 1;\n id = parent.parentId;\n }\n return d;\n}\n\n/** 外层在前:覆盖更长的、同长则更浅的排前面。 */\nexport function sortOuterToInner(blocks: VirtualBlock[], byId?: Map<string, VirtualBlock>): VirtualBlock[] {\n const map = byId ?? new Map(blocks.map((b) => [b.id, b]));\n return [...blocks].sort((a, b) => {\n const la = a.end - a.start;\n const lb = b.end - b.start;\n if (la !== lb) return lb - la;\n return depthOf(a, map) - depthOf(b, map);\n });\n}\n\nexport function ancestorChain(block: VirtualBlock, byId: Map<string, VirtualBlock>): VirtualBlock[] {\n const chain: VirtualBlock[] = [];\n let cur: VirtualBlock | undefined = block;\n const seen = new Set<string>();\n while (cur && !seen.has(cur.id)) {\n seen.add(cur.id);\n chain.unshift(cloneVirtualBlock(cur));\n cur = cur.parentId ? byId.get(cur.parentId) : undefined;\n }\n return chain;\n}\n\n/**\n * 裁到半开区间 [from, to) 并平移到以 0 为原点。\n * 父块若没被裁进来,parentId 置 null。\n */\nexport function clipVirtualBlocks(\n blocks: Iterable<VirtualBlock>,\n from: number,\n to: number\n): VirtualBlock[] {\n const hits: VirtualBlock[] = [];\n for (const b of blocks) {\n const start = Math.max(b.start, from);\n const end = Math.min(b.end, to);\n if (end <= start) continue;\n hits.push(\n cloneVirtualBlock({\n ...b,\n start: start - from,\n end: end - from\n })\n );\n }\n const ids = new Set(hits.map((b) => b.id));\n for (const b of hits) {\n if (b.parentId && !ids.has(b.parentId)) b.parentId = null;\n }\n return hits;\n}\n\nexport function offsetVirtualBlocks(blocks: Iterable<VirtualBlock>, offset: number): VirtualBlock[] {\n if (!offset) return [...blocks].map(cloneVirtualBlock);\n return [...blocks].map((b) => cloneVirtualBlock({ ...b, start: b.start + offset, end: b.end + offset }));\n}\n","import { measureNaturalWidth, prepareWithSegments, setLocale } from '@chenglou/pretext';\nimport { DEFAULT_TEXT, TextProps } from '../model/types';\n\n/**\n * 默认测量/绘制字体。具名字体,避免 system-ui 在 canvas 与 DOM 上解析不一致。\n *\n * 宿主可通过 `textDefaults.fontFamily` / 文字 span 覆盖。\n * `.mini-editor` 的 `--mini-font-family` 必须与当前测量字体一致。\n */\nexport const FONT_FAMILY = '\"PingFang SC\", \"Hiragino Sans GB\", \"Microsoft YaHei\", sans-serif';\n\nexport const LINE_HEIGHT = 1.6;\nexport const PAGE_CONTENT_WIDTH = 680;\nexport const PAGE_PADDING_X = 72;\nexport const PAGE_PADDING_Y = 56;\nexport const LIST_MARKER_WIDTH = 28;\nexport const INDENT_STEP = 24;\nexport const CELL_PAD = 8;\n/** 列宽下限(约 18pt,这里用 px) */\nexport const MIN_COL_WIDTH = 36;\nexport const COL_BORDER_HIT = 4;\n\nconst widthCache = new Map<string, number>();\nlet localeReady = false;\n\nexport function ensureLocale() {\n if (localeReady) return;\n setLocale('zh-CN');\n localeReady = true;\n}\n\nexport function fontFamilyOf(props?: TextProps | null): string {\n const raw = props?.fontFamily?.trim();\n // canvas / pretext 不能解析 CSS 变量;测宽应使用 getComputedStyle 解析后的栈。\n if (!raw || /\\bvar\\s*\\(/i.test(raw)) return FONT_FAMILY;\n return raw;\n}\n\nexport function resolveFont(props: TextProps): { size: number; weight: string; style: string; family: string } {\n return {\n size: props.fontSize ?? DEFAULT_TEXT.fontSize,\n weight: props.bold ? '700' : String(props.fontWeight ?? 400),\n style: props.italic ? 'italic' : 'normal',\n family: fontFamilyOf(props)\n };\n}\n\n/** canvas / pretext 用的 font 字符串,需与绘制层 CSS 一致。 */\nexport function canvasFont(props: TextProps): string {\n const font = resolveFont(props);\n return `${font.style} ${font.weight} ${font.size}px ${font.family}`;\n}\n\n/**\n * 宽度测量走 pretext:canvas measureText + 分段缓存,不读 DOM、不触发布局回流。\n * 同一 font+text 只 prepare 一次。\n */\nexport function measureWidth(text: string, props: TextProps): number {\n if (!text) return 0;\n ensureLocale();\n const font = canvasFont(props);\n const key = `${font}\\0${text}`;\n const hit = widthCache.get(key);\n if (hit !== undefined) return hit;\n const prepared = prepareWithSegments(text, font, { whiteSpace: 'pre-wrap' });\n const w = measureNaturalWidth(prepared);\n widthCache.set(key, w);\n return w;\n}\n\nexport function lineHeightOf(props: TextProps): number {\n return Math.round((props.fontSize ?? DEFAULT_TEXT.fontSize) * LINE_HEIGHT);\n}\n\nexport function isCjk(ch: string): boolean {\n const c = ch.charCodeAt(0);\n return (\n (c >= 0x4e00 && c <= 0x9fff) ||\n (c >= 0x3400 && c <= 0x4dbf) ||\n (c >= 0x3000 && c <= 0x303f) ||\n (c >= 0xff00 && c <= 0xffef)\n );\n}\n\nexport function canBreakAfter(ch: string): boolean {\n if (!ch) return false;\n if (/\\s/.test(ch)) return true;\n return isCjk(ch);\n}\n","/** 与正文对齐,不再为轨或标题栏留空。 */\nexport const REF_PAD = 0;\nexport const REF_HEAD = 0;\n\nexport function refInnerWidth(boxW: number): number {\n return Math.max(40, boxW - REF_PAD);\n}\n","import { DocumentModel } from '../model/document';\nimport { DEFAULT_TEXT, HEADING_TEXT, LINK_COLOR, LinkProps, ParagraphProps, TextProps, VirtualBlock } from '../model/types';\n\nfunction chromeFallback(doc: DocumentModel, index: number): TextProps {\n const chain = doc.blocksAt(index);\n const t: TextProps = {};\n for (const b of chain) {\n const c = b.chrome;\n if (c.bold !== undefined) t.bold = c.bold;\n if (c.italic !== undefined) t.italic = c.italic;\n if (c.fontSize !== undefined) t.fontSize = c.fontSize;\n if (c.fontFamily !== undefined) t.fontFamily = c.fontFamily;\n if (c.fontWeight !== undefined) t.fontWeight = c.fontWeight;\n if (c.color !== undefined) t.color = c.color;\n }\n const inner = innermostEmptySlot(chain);\n if (inner?.chrome.placeholderColor) t.color = inner.chrome.placeholderColor;\n return t;\n}\n\nfunction innermostEmptySlot(chain: VirtualBlock[]): VirtualBlock | null {\n for (let i = chain.length - 1; i >= 0; i--) {\n if (chain[i].kind === 'slot' && chain[i].empty) return chain[i];\n }\n return null;\n}\n\nexport function resolvedTextStyle(doc: DocumentModel, index: number, para: ParagraphProps): TextProps {\n const heading = HEADING_TEXT[para.heading ?? 0];\n const span = doc.styles.find((s) => s.type === 'text' && s.start <= index && index < s.end);\n const link = doc.styles.find((s) => s.type === 'link' && s.start <= index && index < s.end);\n const t = span ? (span.props as TextProps) : {};\n const chrome = chromeFallback(doc, index);\n const href = link ? (link.props as LinkProps).url : '';\n return {\n bold: t.bold ?? chrome.bold ?? heading.bold ?? false,\n italic: t.italic ?? chrome.italic ?? false,\n underline: t.underline ?? (href ? true : false),\n underlineStyle: t.underlineStyle,\n strikethrough: t.strikethrough ?? false,\n fontSize:\n t.fontSize ??\n chrome.fontSize ??\n ((para.heading ?? 0) > 0 ? heading.fontSize : undefined) ??\n doc.textDefaults?.fontSize ??\n DEFAULT_TEXT.fontSize,\n fontFamily: t.fontFamily ?? chrome.fontFamily ?? doc.textDefaults?.fontFamily,\n fontWeight: t.fontWeight ?? chrome.fontWeight ?? doc.textDefaults?.fontWeight,\n color: t.color ?? chrome.color ?? (href ? LINK_COLOR : doc.textDefaults?.color ?? DEFAULT_TEXT.color),\n fill: t.fill\n };\n}\n","import { layoutNextLine, prepareWithSegments, type PreparedTextWithSegments } from '@chenglou/pretext';\nimport { DocumentModel } from '../model/document';\nimport { isTableMarker, MARKERS } from '../model/markers';\nimport { ImageEntity, ParagraphProps, TextProps, textPropsEqual } from '../model/types';\nimport { canvasFont, ensureLocale, measureWidth } from './measure';\nimport { resolvedTextStyle } from './style';\n\nexport type WrapItem =\n | { kind: 'text'; index: number; length: number; text: string; style: TextProps }\n | { kind: 'image'; index: number; length: 1; entity: ImageEntity };\n\n/** 与 host 插件 FALLBACK 一致:未回传测宽前不要按 0 排版,否则后随文字会叠进胶囊。 */\nconst HOST_FALLBACK_W = 120;\nconst HOST_FALLBACK_H = 24;\n\nexport function embedLayoutSize(entity: ImageEntity, maxWidth?: number): { width: number; height: number } {\n const host = entity.kind === 'host';\n let width = entity.width > 0 ? entity.width : host ? HOST_FALLBACK_W : 0;\n const height = entity.height > 0 ? entity.height : host ? HOST_FALLBACK_H : entity.height;\n if (maxWidth != null && maxWidth > 0 && width > maxWidth) width = maxWidth;\n return { width, height };\n}\n\n/** 测宽达到行宽则独占一行。芯片 host 按 kind 行内折,不走高度阈值;代码块/视频仍按高度独占。 */\nexport function embedOccupiesLine(entity: ImageEntity, maxWidth: number): boolean {\n if (entity.float) return false;\n const raw = entity.width > 0 ? entity.width : entity.kind === 'host' ? HOST_FALLBACK_W : 0;\n if (raw >= maxWidth - 0.5) return true;\n if (entity.kind === 'host') return false;\n const height = entity.height > 0 ? entity.height : entity.height;\n return height > 36;\n}\n\nexport type WrappedLine = { items: WrapItem[]; start: number; end: number };\n\nconst preparedCache = new Map<string, PreparedTextWithSegments>();\n\nfunction preparedFor(text: string, style: TextProps): PreparedTextWithSegments {\n ensureLocale();\n const font = canvasFont(style);\n const key = `${font}\\0${text}`;\n const hit = preparedCache.get(key);\n if (hit) return hit;\n const prepared = prepareWithSegments(text, font, { whiteSpace: 'pre-wrap' });\n preparedCache.set(key, prepared);\n return prepared;\n}\n\nexport type SourceRun =\n | { kind: 'text'; index: number; text: string; style: TextProps; prepared: PreparedTextWithSegments }\n | { kind: 'image'; index: number; entity: ImageEntity };\n\nfunction collectRuns(doc: DocumentModel, start: number, end: number, para: ParagraphProps): SourceRun[] {\n const runs: SourceRun[] = [];\n let i = start;\n while (i < end) {\n const ch = doc.spacers[i];\n if (ch === MARKERS.PARAGRAPH || isTableMarker(ch)) {\n i += 1;\n continue;\n }\n if (ch === MARKERS.IMAGE) {\n const entity = doc.imageAt(i);\n if (entity) {\n runs.push({ kind: 'image', index: i, entity });\n i += 1;\n continue;\n }\n }\n const style = resolvedTextStyle(doc, i, para);\n let j = i + 1;\n while (j < end) {\n const n = doc.spacers[j];\n if (n === MARKERS.PARAGRAPH || n === MARKERS.IMAGE || isTableMarker(n)) break;\n const ns = resolvedTextStyle(doc, j, para);\n if (!textPropsEqual(style, ns)) break;\n j += 1;\n }\n const text = doc.spacers.slice(i, j);\n runs.push({ kind: 'text', index: i, text, style, prepared: preparedFor(text, style) });\n i = j;\n }\n return runs;\n}\n\nfunction fitPrefix(text: string, style: TextProps, maxWidth: number): string {\n if (!text) return '';\n if (measureWidth(text, style) <= maxWidth) return text;\n let lo = 1;\n let hi = text.length;\n let best = 1;\n while (lo <= hi) {\n const mid = (lo + hi) >> 1;\n if (measureWidth(text.slice(0, mid), style) <= maxWidth) {\n best = mid;\n lo = mid + 1;\n } else {\n hi = mid - 1;\n }\n }\n return text.slice(0, best);\n}\n\n/**\n * 断行走 pretext 的 prepareWithSegments + layoutNextLine(pre-wrap)。\n * 嵌入对象(图/视频/代码/公式)保持原子盒,不交给 pretext。\n */\nexport function wrapParagraph(\n doc: DocumentModel,\n start: number,\n end: number,\n para: ParagraphProps,\n maxWidth: number\n): WrappedLine[] {\n const runs = collectRuns(doc, start, end, para);\n const lines: WrappedLine[] = [];\n let items: WrapItem[] = [];\n let lineW = 0;\n let lineStart = start;\n\n const flush = (lineEnd: number) => {\n lines.push({ items, start: lineStart, end: lineEnd });\n items = [];\n lineW = 0;\n lineStart = lineEnd;\n };\n\n for (const run of runs) {\n if (run.kind === 'image') {\n const isolated = embedOccupiesLine(run.entity, maxWidth);\n const w = embedLayoutSize(run.entity, maxWidth).width;\n if (isolated) {\n if (items.length > 0) flush(run.index);\n items.push({ kind: 'image', index: run.index, length: 1, entity: run.entity });\n flush(run.index + 1);\n continue;\n }\n if (items.length > 0 && lineW + w > maxWidth) flush(run.index);\n items.push({ kind: 'image', index: run.index, length: 1, entity: run.entity });\n lineW += w;\n continue;\n }\n\n let rest = run.text;\n let restIndex = run.index;\n let restPrepared = run.prepared;\n while (rest.length) {\n const remain = maxWidth - lineW;\n if (items.length > 0 && remain <= 0) {\n flush(restIndex);\n continue;\n }\n const widthForLine = items.length > 0 ? Math.max(1, remain) : Math.max(1, maxWidth);\n const line = layoutNextLine(restPrepared, { segmentIndex: 0, graphemeIndex: 0 }, widthForLine);\n let text = line?.text ? rest.slice(0, Math.min(line.text.length, rest.length)) : rest;\n text = fitPrefix(text, run.style, widthForLine);\n if (!text) {\n text = rest[0] ?? '';\n }\n if (items.length > 0 && measureWidth(text, run.style) > remain + 0.5 && remain < maxWidth) {\n flush(restIndex);\n continue;\n }\n const w = measureWidth(text, run.style);\n items.push({\n kind: 'text',\n index: restIndex,\n length: text.length,\n text,\n style: run.style\n });\n lineW += w;\n rest = rest.slice(text.length);\n restIndex += text.length;\n restPrepared = rest ? preparedFor(rest, run.style) : restPrepared;\n if (rest) flush(restIndex);\n }\n }\n\n if (items.length > 0 || lines.length === 0) {\n flush(end);\n }\n return lines;\n}\n\nexport type FlowObstacle = { x: number; y: number; w: number; h: number; side: 'left' | 'right' };\n\nexport function bandSlot(\n contentX: number,\n contentW: number,\n bandTop: number,\n bandH: number,\n obstacles: FlowObstacle[],\n gap = 14\n): { x: number; w: number } {\n let left = contentX;\n let right = contentX + contentW;\n for (const f of obstacles) {\n if (f.y + f.h <= bandTop + 0.5 || f.y >= bandTop + bandH - 0.5) continue;\n if (f.side === 'left') left = Math.max(left, f.x + f.w + gap);\n else right = Math.min(right, f.x - gap);\n }\n return { x: left, w: Math.max(48, right - left) };\n}\n\nexport type RunCursor = { runs: SourceRun[]; i: number; off: number };\n\nfunction cursorIndex(cur: RunCursor, fallback: number): number {\n const run = cur.runs[cur.i];\n if (!run) return fallback;\n return run.kind === 'text' ? run.index + cur.off : run.index;\n}\n\nexport function createWrapCursor(doc: DocumentModel, start: number, end: number, para: ParagraphProps, skipFloats = true): RunCursor {\n const runs = collectRuns(doc, start, end, para).filter((r) => !(skipFloats && r.kind === 'image' && r.entity.float));\n return { runs, i: 0, off: 0 };\n}\n\nexport function wrapCursorDone(cur: RunCursor): boolean {\n return cur.i >= cur.runs.length;\n}\n\nexport function wrapCursorIndex(cur: RunCursor, fallback: number): number {\n return cursorIndex(cur, fallback);\n}\n\nexport function wrapCursorPeek(cur: RunCursor): SourceRun | undefined {\n return cur.runs[cur.i];\n}\n\nexport function wrapCursorSkip(cur: RunCursor) {\n cur.i += 1;\n cur.off = 0;\n}\n\nexport function consumeWrapLine(cur: RunCursor, maxWidth: number): WrapItem[] {\n const items: WrapItem[] = [];\n let lineW = 0;\n while (!wrapCursorDone(cur)) {\n const run = cur.runs[cur.i];\n const remain = maxWidth - lineW;\n if (run.kind === 'image') {\n if (run.entity.float) break;\n const isolated = embedOccupiesLine(run.entity, maxWidth);\n const w = embedLayoutSize(run.entity, maxWidth).width;\n if (isolated) {\n if (items.length > 0) break;\n items.push({ kind: 'image', index: run.index, length: 1, entity: run.entity });\n cur.i += 1;\n break;\n }\n if (items.length > 0 && w > remain) break;\n items.push({ kind: 'image', index: run.index, length: 1, entity: run.entity });\n lineW += w;\n cur.i += 1;\n continue;\n }\n const rest = run.text.slice(cur.off);\n if (!rest) {\n cur.i += 1;\n cur.off = 0;\n continue;\n }\n if (items.length > 0 && remain <= 0) break;\n const widthForLine = items.length > 0 ? Math.max(1, remain) : Math.max(1, maxWidth);\n const prepared = preparedFor(rest, run.style);\n const line = layoutNextLine(prepared, { segmentIndex: 0, graphemeIndex: 0 }, widthForLine);\n let text = line?.text ? rest.slice(0, Math.min(line.text.length, rest.length)) : rest;\n text = fitPrefix(text, run.style, widthForLine);\n if (!text) text = rest[0] ?? '';\n if (items.length > 0 && measureWidth(text, run.style) > remain + 0.5 && remain < maxWidth) break;\n const w = measureWidth(text, run.style);\n items.push({ kind: 'text', index: run.index + cur.off, length: text.length, text, style: run.style });\n lineW += w;\n cur.off += text.length;\n if (cur.off >= run.text.length) {\n cur.i += 1;\n cur.off = 0;\n }\n if (cur.off > 0) break;\n }\n return items;\n}\n","import { parseBlocks, TableBlock } from '../model/blocks';\nimport { DocumentModel } from '../model/document';\nimport { MARKERS } from '../model/markers';\nimport {\n DEFAULT_PARAGRAPH,\n ParagraphProps,\n StyleSpan,\n Selection,\n selEnd,\n selStart\n} from '../model/types';\nimport { depthOf, sortOuterToInner } from '../model/virtualBlock';\nimport { CELL_PAD, COL_BORDER_HIT, INDENT_STEP, lineHeightOf, LIST_MARKER_WIDTH, measureWidth, PAGE_CONTENT_WIDTH, PAGE_PADDING_X, PAGE_PADDING_Y } from './measure';\nimport { refInnerWidth } from './refMetrics';\nimport { resolvedTextStyle } from './style';\nimport { CaretPos, CaretStop, CellLayout, DocLayout, GlyphBox, ImageBox, LineBox, ParagraphLayout, SelRect, TableLayout, VBlockFragment } from './types';\nimport { bandSlot, consumeWrapLine, createWrapCursor, embedLayoutSize, FlowObstacle, wrapCursorDone, wrapCursorIndex, wrapCursorPeek, wrapCursorSkip, wrapParagraph, WrapItem } from './wrap';\n\nexport { resolvedTextStyle } from './style';\n\nconst UL_MARKERS = ['•', '◦', '▪'];\n\nfunction listMarkerText(para: ParagraphProps, olIndex: number): string {\n if (para.list === 'ul') return UL_MARKERS[(para.indent ?? 0) % UL_MARKERS.length];\n if (para.list === 'ol') return `${olIndex}.`;\n return '';\n}\n\nfunction layoutParagraph(\n doc: DocumentModel,\n start: number,\n end: number,\n x: number,\n y: number,\n maxWidth: number,\n olIndex: number,\n obstacles: FlowObstacle[] = []\n): ParagraphLayout {\n const props: ParagraphProps = { ...DEFAULT_PARAGRAPH, ...doc.paragraphPropsAt(start) };\n const indent = (props.indent ?? 0) * INDENT_STEP;\n const markerText = listMarkerText(props, olIndex);\n const markerW = props.list && props.list !== 'none' ? LIST_MARKER_WIDTH : 0;\n const contentX = x + indent + markerW;\n const contentW = Math.max(80, maxWidth - indent - markerW);\n const align = props.align ?? 'left';\n const floats: ImageBox[] = [];\n const allObstacles = [...obstacles];\n const useFlow = allObstacles.length > 0 || paragraphHasFloat(doc, start, end);\n const lines: LineBox[] = [];\n let lineY = y;\n\n if (!useFlow) {\n const wrapped = wrapParagraph(doc, start, end, props, contentW);\n for (let i = 0; i < wrapped.length; i++) {\n const row = wrapped[i];\n const line = buildLine(\n doc,\n props,\n row.items,\n contentX,\n lineY,\n contentW,\n align,\n start,\n row.start,\n row.end,\n markerText && i === 0 ? markerText : '',\n x + indent\n );\n lines.push(line);\n lineY += line.h;\n }\n } else {\n const cur = createWrapCursor(doc, start, end, props, false);\n let i = 0;\n do {\n const peek = wrapCursorPeek(cur);\n if (peek?.kind === 'image' && peek.entity.float) {\n const side = peek.entity.float;\n const size = embedLayoutSize(peek.entity, maxWidth);\n const fx = side === 'left' ? x : x + maxWidth - size.width;\n const box: ImageBox = { index: peek.index, x: fx, y: lineY, w: size.width, h: size.height, entity: peek.entity };\n floats.push(box);\n allObstacles.push({ x: box.x, y: box.y, w: box.w, h: box.h, side });\n wrapCursorSkip(cur);\n continue;\n }\n const slot = bandSlot(contentX, contentW, lineY, 28, allObstacles);\n const lineStart = wrapCursorIndex(cur, start);\n const items = wrapCursorDone(cur) ? [] : consumeWrapLine(cur, slot.w);\n const lineEnd = wrapCursorDone(cur) ? end : wrapCursorIndex(cur, end);\n const line = buildLine(\n doc,\n props,\n items,\n slot.x,\n lineY,\n slot.w,\n align,\n start,\n lineStart,\n items.length ? lineEnd : end,\n markerText && i === 0 ? markerText : '',\n x + indent\n );\n lines.push(line);\n lineY += line.h;\n i += 1;\n } while (!wrapCursorDone(cur));\n }\n\n return {\n start,\n end,\n x,\n y,\n w: maxWidth,\n h: Math.max(0, lineY - y),\n props,\n lines,\n floats\n };\n}\n\nfunction paragraphHasFloat(doc: DocumentModel, start: number, end: number): boolean {\n for (let i = start; i < end; i++) {\n if (doc.spacers[i] === MARKERS.IMAGE && doc.imageAt(i)?.float) return true;\n }\n return false;\n}\n\nfunction nextOl(counter: Map<number, number>, props: ParagraphProps): number {\n if (props.list !== 'ol') {\n if (props.list === 'none') counter.clear();\n return 1;\n }\n const key = props.indent ?? 0;\n const n = (counter.get(key) ?? 0) + 1;\n counter.set(key, n);\n for (const k of [...counter.keys()]) {\n if (k > key) counter.delete(k);\n }\n return n;\n}\n\nfunction buildLine(\n doc: DocumentModel,\n para: ParagraphProps,\n items: WrapItem[],\n x: number,\n y: number,\n maxW: number,\n align: ParagraphProps['align'],\n paraStart: number,\n lineStart: number,\n lineEnd: number,\n markerText: string,\n markerX: number\n): LineBox {\n let contentW = 0;\n let contentH = 20;\n for (const item of items) {\n if (item.kind === 'image') {\n const size = embedLayoutSize(item.entity, maxW);\n contentW += size.width;\n contentH = Math.max(contentH, size.height);\n } else {\n contentW += measureWidth(item.text, item.style);\n contentH = Math.max(contentH, lineHeightOf(item.style));\n }\n }\n if (items.length === 0) {\n const emptyStyle = resolvedTextStyle(doc, lineStart, para);\n contentH = lineHeightOf(emptyStyle);\n }\n\n let dx = 0;\n if (align === 'center') dx = Math.max(0, (maxW - contentW) / 2);\n if (align === 'right') dx = Math.max(0, maxW - contentW);\n\n const glyphs: GlyphBox[] = [];\n const images: ImageBox[] = [];\n const caretStops: CaretStop[] = [{ index: lineStart, x: x + dx }];\n let cx = x + dx;\n\n for (const item of items) {\n if (item.kind === 'image') {\n const size = embedLayoutSize(item.entity, maxW);\n images.push({\n index: item.index,\n x: cx,\n y: y + Math.max(0, (contentH - size.height) / 2),\n w: size.width,\n h: size.height,\n entity: item.entity\n });\n cx += size.width;\n caretStops.push({ index: item.index + 1, x: cx });\n } else {\n let local = cx;\n for (let k = 0; k < item.text.length; k++) {\n const ch = item.text[k];\n const w = measureWidth(ch, item.style);\n glyphs.push({\n index: item.index + k,\n x: local,\n y,\n w,\n h: contentH,\n text: ch,\n style: item.style\n });\n local += w;\n caretStops.push({ index: item.index + k + 1, x: local });\n }\n cx = local;\n }\n }\n\n if (caretStops[caretStops.length - 1].index !== lineEnd) {\n caretStops.push({ index: lineEnd, x: cx });\n }\n\n const marker = markerText\n ? {\n x: markerX,\n y,\n w: LIST_MARKER_WIDTH,\n h: contentH,\n text: markerText,\n kind: para.list ?? 'none'\n }\n : undefined;\n\n return {\n paragraphStart: paraStart,\n start: lineStart,\n end: lineEnd,\n x,\n y,\n w: maxW,\n h: contentH,\n ascent: contentH,\n align: align ?? 'left',\n glyphs,\n images,\n marker,\n caretStops,\n vblocks: vblockFragments(doc, lineStart, lineEnd, y, contentH, glyphs, images)\n };\n}\n\nfunction vblockFragments(\n doc: DocumentModel,\n lineStart: number,\n lineEnd: number,\n y: number,\n lineH: number,\n glyphs: GlyphBox[],\n images: ImageBox[]\n): VBlockFragment[] {\n const hits = doc.virtualBlocksOverlapping(lineStart, lineEnd);\n if (!hits.length) return [];\n const sorted = sortOuterToInner(hits, doc.virtualBlocks);\n const out: VBlockFragment[] = [];\n for (const b of sorted) {\n const boxes: { x: number; y: number; w: number; h: number }[] = [];\n for (const g of glyphs) {\n if (g.index >= b.start && g.index < b.end) boxes.push(g);\n }\n for (const im of images) {\n if (im.index >= b.start && im.index < b.end) boxes.push(im);\n }\n if (!boxes.length) continue;\n const left = Math.min(...boxes.map((box) => box.x));\n const right = Math.max(...boxes.map((box) => box.x + box.w));\n const top = Math.min(...boxes.map((box) => box.y));\n const bottom = Math.max(...boxes.map((box) => box.y + box.h));\n const padX = b.chrome.paddingX ?? 0;\n const padY = b.chrome.paddingY ?? 0;\n out.push({\n id: b.id,\n kind: b.kind,\n depth: depthOf(b, doc.virtualBlocks),\n x: left - padX,\n y: Math.min(top, y) - padY,\n w: Math.max(0, right - left) + padX * 2,\n h: Math.max(lineH, bottom - top) + padY * 2,\n chrome: { ...b.chrome },\n empty: b.empty\n });\n }\n return out.sort((a, b) => a.depth - b.depth);\n}\n\nfunction layoutTable(doc: DocumentModel, table: TableBlock, x: number, y: number, maxWidth: number): TableLayout {\n const cols = Math.max(1, ...table.rows.map((r) => r.cells.length));\n const stored = doc.tablePropsAt(table.start).colWidths ?? [];\n const even = Math.floor(maxWidth / cols);\n const hasStored = stored.length >= cols && stored.slice(0, cols).every((w) => w > 0);\n const colWidths = hasStored\n ? stored.slice(0, cols)\n : Array.from({ length: cols }, (_, i) => (stored[i] && stored[i] > 0 ? stored[i] : even));\n if (!hasStored) {\n const sum = colWidths.reduce((a, b) => a + b, 0);\n if (sum !== maxWidth) colWidths[cols - 1] += maxWidth - sum;\n }\n\n const cells: CellLayout[] = [];\n let cy = y;\n for (let r = 0; r < table.rows.length; r++) {\n const row = table.rows[r];\n const rowCells: CellLayout[] = [];\n let maxH = 32;\n let cx = x;\n for (let c = 0; c < cols; c++) {\n const cell = row.cells[c];\n const w = colWidths[c];\n const innerW = Math.max(1, w - CELL_PAD * 2);\n const paras: ParagraphLayout[] = [];\n let py = cy + CELL_PAD;\n const ol = new Map<number, number>();\n if (cell) {\n for (const para of cell.paragraphs) {\n const pl = layoutParagraph(doc, para.start, para.end, cx + CELL_PAD, py, innerW, nextOl(ol, doc.paragraphPropsAt(para.start)));\n paras.push(pl);\n py += pl.h;\n }\n }\n const h = Math.max(32, py - cy + CELL_PAD);\n maxH = Math.max(maxH, h);\n rowCells.push({\n row: r,\n col: c,\n start: cell?.start ?? table.start,\n end: cell?.end ?? table.start,\n x: cx,\n y: cy,\n w,\n h,\n paragraphs: paras\n });\n cx += w;\n }\n for (const cell of rowCells) cell.h = maxH;\n cells.push(...rowCells);\n cy += maxH;\n }\n\n return {\n start: table.start,\n end: table.end,\n x,\n y,\n w: colWidths.reduce((a, b) => a + b, 0),\n h: cy - y,\n colWidths,\n cells\n };\n}\n\nfunction fragmentFingerprint(doc: DocumentModel, fragmentId?: string): string {\n if (!fragmentId) return '';\n const fragment = doc.fragments.get(fragmentId);\n if (!fragment) return fragmentId;\n return `${fragment.slice.text}:${fragment.slice.styles.length}:${fragment.slice.entities.length}`;\n}\n\nfunction hostFingerprint(entity: { kind?: string; hostType?: string; data?: unknown }): string {\n if (entity.kind !== 'host') return '';\n try {\n return `${entity.hostType ?? ''}:${JSON.stringify(entity.data ?? null)}`;\n } catch {\n return entity.hostType ?? '';\n }\n}\n\nfunction mediaFingerprint(doc: DocumentModel, start: number, end: number): string {\n const parts: string[] = [];\n for (let i = start; i < end; i++) {\n if (doc.spacers[i] !== MARKERS.IMAGE) continue;\n const e = doc.imageAt(i);\n if (e) {\n parts.push(\n `${e.id}:${e.kind ?? 'image'}:${hostFingerprint(e)}:${e.width}x${e.height}:${e.float ?? ''}:${e.code ?? ''}:${e.latex ?? ''}:${e.slotKind ?? ''}:${e.label ?? ''}:${e.slotValue ?? ''}:${e.src ?? ''}:${e.fragmentId ?? ''}:${fragmentFingerprint(doc, e.fragmentId)}:${(e.slotOptions ?? []).join('/')}`\n );\n }\n }\n return parts.join(',');\n}\n\n/**\n * 按块查样式区间的索引。\n *\n * 每排一次版就要给每个块算一次内容哈希,而哈希要知道「盖住这个块的样式区间」。\n * 直接在全表上筛是块数 × 区间数,长文档里这是排版的主要开销。\n *\n * 区间表本身按 `start` 有序(模型每次写完都会规范化),所以再存一列「前 i 个区间\n * 里最大的 end」—— 这一列必然单调,可以二分出第一个可能盖住本块的位置。它不要求\n * 区间互不相交,同一个下标上叠着文字、链接、图片好几层也照样对。\n */\nexport class StyleIndex {\n private spans: StyleSpan[];\n /** maxEnd[i] = spans[0..i] 里最大的 end,单调不减 */\n private maxEnd: number[];\n\n constructor(spans: StyleSpan[]) {\n this.spans = spans;\n this.maxEnd = [];\n let running = -Infinity;\n for (const s of spans) {\n running = Math.max(running, s.end);\n this.maxEnd.push(running);\n }\n }\n\n /** 第一个可能与 `start` 之后相交的区间下标。 */\n private lowerBound(start: number): number {\n let lo = 0;\n let hi = this.spans.length;\n while (lo < hi) {\n const mid = (lo + hi) >> 1;\n if (this.maxEnd[mid] > start) hi = mid;\n else lo = mid + 1;\n }\n return lo;\n }\n\n /**\n * 块内的样式区间,端点相对块起点、并裁到块边界内。\n *\n * 相对化是缓存能跨编辑复用的前提:在文档中间插一个字,后面每个块的绝对下标都会\n * 平移,但它们的排版结果一模一样。裁剪是同一个道理 —— 一段样式伸到块外多远,不\n * 影响这个块怎么排。\n */\n key(start: number, end: number, types?: Set<string>): string {\n const parts: string[] = [];\n for (let i = this.lowerBound(start); i < this.spans.length; i++) {\n const s = this.spans[i];\n if (s.start >= end) break;\n if (s.end <= start) continue;\n if (types && !types.has(s.type)) continue;\n parts.push(\n `${s.type}:${Math.max(s.start, start) - start}:${Math.min(s.end, end) - start}:${JSON.stringify(s.props)}`\n );\n }\n return parts.join('|');\n }\n}\n\nconst INLINE_STYLES = new Set(['text', 'link', 'image']);\n\nfunction hashParagraph(doc: DocumentModel, styles: StyleIndex, start: number, end: number, width: number, olIndex: number, floatKey = ''): string {\n const props = doc.paragraphPropsAt(start);\n return `p:${width}:${olIndex}:${floatKey}:${JSON.stringify(props)}:${doc.spacers.slice(start, end)}:${styles.key(start, end, INLINE_STYLES)}:${mediaFingerprint(doc, start, end)}:${vblockFingerprint(doc, start, end)}:td:${JSON.stringify({\n f: doc.textDefaults?.fontFamily,\n w: doc.textDefaults?.fontWeight,\n s: doc.textDefaults?.fontSize\n })}`;\n}\n\nfunction vblockFingerprint(doc: DocumentModel, start: number, end: number): string {\n return doc\n .virtualBlocksOverlapping(start, end)\n .map((b) => `${b.id}:${b.kind}:${b.parentId}:${b.start}:${b.end}:${b.empty ? 1 : 0}:${b.placeholder ?? ''}:${JSON.stringify(b.chrome)}`)\n .join(';');\n}\n\nfunction hashTable(doc: DocumentModel, styles: StyleIndex, table: TableBlock, width: number): string {\n return `t:${width}:${doc.spacers.slice(table.start, table.end)}:${styles.key(table.start, table.end)}:${mediaFingerprint(doc, table.start, table.end)}`;\n}\n\n/**\n * 把一份缓存的块布局搬到新位置:`dy` 是纵向位移,`di` 是下标位移。\n *\n * 下标必须跟着搬。布局里到处存着 spacer 下标(字形、图片、行的首尾、光标落点),\n * 命中测试和选区全靠它们 —— 只平移 y 会让复用的块指向错误的字符。\n *\n * 引用块的 `inner` 不动:它是片段自己坐标空间里的布局,和外层的下标无关。\n */\nfunction floatBoxes(paras: ParagraphLayout[]): ImageBox[] {\n return paras.flatMap((p) => p.floats ?? []);\n}\n\n/** 一个段落实际占的纵向范围:浮动图片可以探到段落之外。 */\nfunction paragraphBottom(p: ParagraphLayout): number {\n let bottom = p.y + p.h;\n for (const f of p.floats ?? []) bottom = Math.max(bottom, f.y + f.h);\n return bottom;\n}\n\nfunction moveParagraph(p: ParagraphLayout, dy: number, di: number): ParagraphLayout {\n if (!dy && !di) return p;\n return {\n ...p,\n y: p.y + dy,\n start: p.start + di,\n end: p.end + di,\n lines: p.lines.map((l) => ({\n ...l,\n y: l.y + dy,\n paragraphStart: l.paragraphStart + di,\n start: l.start + di,\n end: l.end + di,\n glyphs: l.glyphs.map((g) => ({ ...g, y: g.y + dy, index: g.index + di })),\n images: l.images.map((im) => ({ ...im, y: im.y + dy, index: im.index + di })),\n vblocks: l.vblocks?.map((v) => ({ ...v, y: v.y + dy })),\n marker: l.marker ? { ...l.marker, y: l.marker.y + dy } : undefined,\n caretStops: l.caretStops.map((c) => ({ ...c, index: c.index + di }))\n })),\n floats: p.floats?.map((f) => ({ ...f, y: f.y + dy, index: f.index + di }))\n };\n}\n\nfunction moveTable(t: TableLayout, dy: number, di: number): TableLayout {\n if (!dy && !di) return t;\n return {\n ...t,\n y: t.y + dy,\n start: t.start + di,\n end: t.end + di,\n cells: t.cells.map((c) => ({\n ...c,\n y: c.y + dy,\n start: c.start + di,\n end: c.end + di,\n paragraphs: c.paragraphs.map((p) => moveParagraph(p, dy, di))\n }))\n };\n}\n\n/**\n * 上一次排版复用了多少块、重排了多少块。\n *\n * 只为诊断和自检存在 —— 自检要能确认「确实复用了」,否则缓存整体失效也会静静\n * 通过。嵌套排版(引用块内部)累加进同一份计数,顶层调用时清零。\n */\nexport interface LayoutStats {\n reused: number;\n laidOut: number;\n}\n\nlet stats: LayoutStats = { reused: 0, laidOut: 0 };\n\nexport function lastLayoutStats(): LayoutStats {\n return { ...stats };\n}\n\nexport function layoutDocument(\n doc: DocumentModel,\n contentWidth = PAGE_CONTENT_WIDTH,\n prev?: DocLayout,\n insets: { x: number; y: number } = { x: PAGE_PADDING_X, y: PAGE_PADDING_Y },\n depth = 0\n): DocLayout {\n if (depth === 0) stats = { reused: 0, laidOut: 0 };\n const contentX = insets.x;\n const contentY = insets.y;\n const paragraphs: ParagraphLayout[] = [];\n const tables: TableLayout[] = [];\n let y = contentY;\n const topOl = new Map<number, number>();\n let activeFloats: FlowObstacle[] = [];\n\n // 脏区带:只有这个纵向区间里的像素变了,绘制层据此决定重画哪一段。\n // 判定规则很简单,也正因为简单才守得住:\n // 复用且没挪位置 → 像素一模一样,干净;\n // 复用但挪了位置 → 老位置和新位置都脏;\n // 重排的块 → 它自己那一段脏。\n // 一个块高度变了,它下面的块就会挪位置、跟着进脏区,所以「只标自己这一段」\n // 不会漏 —— 下面全都没挪,恰好说明这个块的高度没变。\n //\n // 挪位置的块连老位置一起标。理论上老位置会被下面的块顺带覆盖(块是竖直连续\n // 堆叠的),但那是个全局论证,一处不成立就花屏 —— 一个 Math.min 换掉这份心智\n // 负担,值得。\n //\n // 浮动图片是这套推理真正的例外:它能探出所在段落之外。所以段落占的像素高度按\n // max(段高, 浮动图底边) 算,而且循环之后还要拿上一份布局里的浮动图单独对一遍。\n let dirtyTop = Infinity;\n let dirtyBottom = -Infinity;\n const markDirty = (top: number, bottom: number) => {\n dirtyTop = Math.min(dirtyTop, top);\n dirtyBottom = Math.max(dirtyBottom, bottom);\n };\n // 没有上一份布局、或者宽度变了,一切都要重来\n if (!prev || prev.contentWidth !== contentWidth) markDirty(0, Infinity);\n\n const styleIndex = new StyleIndex(doc.styles);\n const prevByHash = new Map<string, ParagraphLayout | TableLayout>();\n if (prev) {\n for (const p of prev.paragraphs) {\n if (p.hash) prevByHash.set(p.hash, p);\n }\n for (const t of prev.tables) {\n if (t.hash) prevByHash.set(t.hash, t);\n }\n }\n\n for (const block of parseBlocks(doc.spacers)) {\n if (block.kind === 'paragraph') {\n const props = doc.paragraphPropsAt(block.start);\n const olIndex = nextOl(topOl, props);\n activeFloats = activeFloats.filter((f) => f.y + f.h > y + 0.5);\n const floatKey = activeFloats.map((f) => `${f.side}:${Math.round(f.w)}x${Math.round(Math.max(0, f.y + f.h - y))}`).join(',');\n const hash = hashParagraph(doc, styleIndex, block.start, block.end, contentWidth, olIndex, floatKey);\n const cached = prevByHash.get(hash);\n let p: ParagraphLayout;\n if (cached && 'lines' in cached && cached.hash === hash) {\n p = moveParagraph(cached, y - cached.y, block.start - cached.start);\n p.hash = hash;\n stats.reused++;\n if (Math.abs(cached.y - y) > 0.5) {\n markDirty(Math.min(cached.y, y), Math.max(paragraphBottom(cached), paragraphBottom(p)));\n }\n } else {\n p = layoutParagraph(doc, block.start, block.end, contentX, y, contentWidth, olIndex, activeFloats);\n p.hash = hash;\n stats.laidOut++;\n markDirty(y, paragraphBottom(p));\n }\n for (const f of p.floats ?? []) {\n if (f.entity.float) activeFloats.push({ x: f.x, y: f.y, w: f.w, h: f.h, side: f.entity.float });\n }\n paragraphs.push(p);\n y += p.h;\n } else {\n topOl.clear();\n const hash = hashTable(doc, styleIndex, block, contentWidth);\n const cached = prevByHash.get(hash);\n let t: TableLayout;\n if (cached && 'cells' in cached && cached.hash === hash) {\n t = moveTable(cached, y - cached.y, block.start - cached.start);\n t.hash = hash;\n stats.reused++;\n if (Math.abs(cached.y - y) > 0.5) {\n markDirty(Math.min(cached.y, y), Math.max(cached.y + cached.h, y + t.h));\n }\n } else {\n t = layoutTable(doc, block, contentX, y, contentWidth);\n t.hash = hash;\n stats.laidOut++;\n markDirty(y, y + t.h);\n }\n tables.push(t);\n y += t.h + 12;\n }\n }\n\n // 浮动图片探出段落之外,老位置推不出来 —— 直接比:位置或尺寸变了的,老位置也脏\n if (prev) {\n const now = new Map(floatBoxes(paragraphs).map((f) => [f.entity.id, f]));\n for (const old of floatBoxes(prev.paragraphs)) {\n const cur = now.get(old.entity.id);\n if (!cur || cur.x !== old.x || cur.y !== old.y || cur.w !== old.w || cur.h !== old.h) {\n markDirty(old.y, old.y + old.h);\n }\n }\n }\n\n const height = y + insets.y;\n // 文档高度变了说明尾部有内容进出,那一段也要重画(文档变短时得擦掉旧像素)\n if (prev && Math.abs(prev.height - height) > 0.5) {\n markDirty(Math.min(prev.height, height), Math.max(prev.height, height));\n }\n // 「全部重画」用 Infinity 表示,但不该漏进公开结构里,落地成实际画过的最大底边。\n // 注意不能拿文档高度去裁真实的脏区底边 —— 浮动图片可以探出文档底边之外。\n const dirty =\n dirtyTop < dirtyBottom\n ? {\n top: Math.max(0, dirtyTop),\n bottom: Number.isFinite(dirtyBottom) ? dirtyBottom : Math.max(height, prev?.height ?? 0)\n }\n : { top: 0, bottom: 0 };\n\n const lines: LineBox[] = [];\n const images: ImageBox[] = [];\n for (const p of paragraphs) {\n lines.push(...p.lines);\n for (const l of p.lines) {\n l.images = attachRefInners(doc, l.images, depth);\n images.push(...l.images);\n }\n if (p.floats) {\n p.floats = attachRefInners(doc, p.floats, depth);\n images.push(...p.floats);\n }\n }\n for (const t of tables) {\n for (const c of t.cells) {\n for (const p of c.paragraphs) {\n lines.push(...p.lines);\n for (const l of p.lines) {\n l.images = attachRefInners(doc, l.images, depth);\n images.push(...l.images);\n }\n }\n }\n }\n\n return {\n width: contentWidth + insets.x * 2,\n height,\n contentX,\n contentY,\n contentWidth,\n paragraphs,\n tables,\n lines,\n images,\n dirty\n };\n}\n\nfunction attachRefInners(doc: DocumentModel, boxes: ImageBox[], depth: number): ImageBox[] {\n if (depth > 0) return boxes;\n return boxes.map((box) => {\n if (box.entity.kind !== 'ref' || !box.entity.fragmentId) return box;\n const innerW = refInnerWidth(box.w);\n const model = doc.ensureFragmentModel(box.entity.fragmentId);\n return { ...box, inner: layoutDocument(model, innerW, undefined, { x: 0, y: 0 }, depth + 1) };\n });\n}\n\nexport function caretFromIndex(layout: DocLayout, index: number): CaretPos {\n let bestLine: LineBox | null = null;\n let bestX = layout.contentX;\n let bestIndex = index;\n let bestDist = Infinity;\n const exact: { line: LineBox; x: number }[] = [];\n for (const line of layout.lines) {\n for (const stop of line.caretStops) {\n if (stop.index === index) exact.push({ line, x: stop.x });\n const dist = Math.abs(stop.index - index);\n if (dist < bestDist || (dist === bestDist && stop.index <= index)) {\n bestDist = dist;\n bestLine = line;\n bestX = stop.x;\n bestIndex = stop.index;\n }\n }\n }\n // 默认同一下标取后一行(回车换行、普通折行)。仅当后一行是以该下标开头的嵌入对象\n // (文本槽折到下一行、光标在槽前)时,改用上一行行尾,避免光标画在槽行行首。\n if (exact.length >= 2) {\n const earlier = exact[0];\n const later = exact[exact.length - 1];\n const laterIsEmbedHead =\n later.line.caretStops[0]?.index === index &&\n later.line.images.some((img) => img.index === index);\n if (laterIsEmbedHead) {\n bestLine = earlier.line;\n bestX = earlier.x;\n bestIndex = index;\n }\n }\n if (!bestLine) return { x: layout.contentX, y: layout.contentY, h: 24, index };\n return { x: bestX, y: bestLine.y, h: bestLine.h, index: bestIndex };\n}\n\nexport function hitTestIndex(layout: DocLayout, localX: number, localY: number): number {\n for (const table of layout.tables) {\n if (localX < table.x || localX > table.x + table.w || localY < table.y || localY > table.y + table.h) {\n continue;\n }\n for (const cell of table.cells) {\n if (localX >= cell.x && localX < cell.x + cell.w && localY >= cell.y && localY < cell.y + cell.h) {\n const lines = cell.paragraphs.flatMap((p) => p.lines);\n if (lines.length) return closestCaretOnLines(lines, localX, localY);\n return cell.paragraphs[0]?.start ?? cell.start + 1;\n }\n }\n }\n return closestCaretOnLines(layout.lines, localX, localY);\n}\n\nfunction closestCaretOnLines(lines: LineBox[], localX: number, localY: number): number {\n if (lines.length === 0) return 0;\n let best = lines[0];\n let bestScore = Infinity;\n for (const line of lines) {\n const inY = localY >= line.y && localY < line.y + line.h;\n const inX = localX >= line.x && localX <= line.x + line.w;\n if (inY && inX) {\n best = line;\n break;\n }\n const dy = localY < line.y ? line.y - localY : localY >= line.y + line.h ? localY - (line.y + line.h) : 0;\n const dx = localX < line.x ? line.x - localX : localX > line.x + line.w ? localX - (line.x + line.w) : 0;\n const score = dy * 10000 + dx;\n if (score < bestScore) {\n bestScore = score;\n best = line;\n }\n }\n let stop = best.caretStops[0];\n let bestDist = Infinity;\n for (const s of best.caretStops) {\n const d = Math.abs(s.x - localX);\n if (d < bestDist) {\n bestDist = d;\n stop = s;\n }\n }\n return stop.index;\n}\n\nexport function selectionRects(layout: DocLayout, sel: Selection): SelRect[] {\n const from = selStart(sel);\n const to = selEnd(sel);\n if (from === to) return [];\n const cellRects = cellGridRects(layout, from, to);\n if (cellRects) return cellRects;\n const rects: SelRect[] = [];\n for (const line of layout.lines) {\n if (line.end <= from || line.start >= to) {\n const covers =\n line.caretStops.some((s) => s.index >= from && s.index < to) ||\n (from < line.end && to > line.start);\n if (!covers) continue;\n }\n const stops = line.caretStops;\n const left = stops.find((s) => s.index >= from) ?? stops[0];\n const rightCandidates = stops.filter((s) => s.index <= to);\n const right = rightCandidates[rightCandidates.length - 1] ?? stops[stops.length - 1];\n const x0 = Math.min(left.x, right.x);\n const x1 = Math.max(left.x, right.x);\n if (x1 > x0) {\n rects.push({ x: x0, y: line.y, w: x1 - x0, h: line.h });\n }\n }\n return punchEmbeds(rects, layout.images);\n}\n\nfunction punchEmbeds(rects: SelRect[], boxes: ImageBox[]): SelRect[] {\n let out = rects;\n for (const b of boxes) {\n const next: SelRect[] = [];\n for (const r of out) {\n const overlapY = r.y < b.y + b.h && r.y + r.h > b.y;\n const overlapX = r.x < b.x + b.w && r.x + r.w > b.x;\n if (!overlapY || !overlapX) {\n next.push(r);\n continue;\n }\n if (r.x < b.x - 1) next.push({ x: r.x, y: r.y, w: b.x - r.x - 2, h: r.h });\n if (r.x + r.w > b.x + b.w + 1) next.push({ x: b.x + b.w + 2, y: r.y, w: r.x + r.w - (b.x + b.w) - 2, h: r.h });\n }\n out = next.filter((r) => r.w > 2);\n }\n return out;\n}\n\nexport function imageBoxAt(layout: DocLayout, index: number): ImageBox | null {\n return layout.images.find((b) => b.index === index) ?? null;\n}\n\nfunction cellGridRects(layout: DocLayout, from: number, to: number): SelRect[] | null {\n let a: CellLayout | null = null;\n let b: CellLayout | null = null;\n for (const table of layout.tables) {\n for (const cell of table.cells) {\n if (from >= cell.start && from < cell.end) a = cell;\n if (to > cell.start && to <= cell.end) b = cell;\n if (from === cell.start) a = cell;\n if (to === cell.end) b = cell;\n }\n if (a && b && a !== b && table.cells.includes(a) && table.cells.includes(b)) {\n const r0 = Math.min(a.row, b.row);\n const r1 = Math.max(a.row, b.row);\n const c0 = Math.min(a.col, b.col);\n const c1 = Math.max(a.col, b.col);\n return table.cells\n .filter((c) => c.row >= r0 && c.row <= r1 && c.col >= c0 && c.col <= c1)\n .map((c) => ({ x: c.x, y: c.y, w: c.w, h: c.h }));\n }\n if (a && b && a === b && from <= a.start + 1 && to >= a.end) {\n return [{ x: a.x, y: a.y, w: a.w, h: a.h }];\n }\n a = null;\n b = null;\n }\n return null;\n}\n\nexport function hitColBorder(\n layout: DocLayout,\n x: number,\n y: number\n): { tableStart: number; col: number; widths: number[] } | null {\n for (const table of layout.tables) {\n if (y < table.y || y > table.y + table.h || x < table.x - COL_BORDER_HIT || x > table.x + table.w + COL_BORDER_HIT) {\n continue;\n }\n let cx = table.x;\n for (let i = 0; i < table.colWidths.length - 1; i++) {\n cx += table.colWidths[i];\n if (Math.abs(x - cx) <= COL_BORDER_HIT) {\n return { tableStart: table.start, col: i, widths: [...table.colWidths] };\n }\n }\n }\n return null;\n}\n","import { TextFill, TextProps, underlineKind } from '../model/types';\nimport { GlyphBox } from '../layout/types';\n\nexport function fillOf(style: TextProps): TextFill {\n return style.fill ?? 'solid';\n}\n\nexport function rainbowAt(index: number): string {\n const hue = (index * 37) % 360;\n return `hsl(${hue} 80% 46%)`;\n}\n\nexport function sunsetAt(t: number): string {\n const stops = ['#ff4d6d', '#ff8a4c', '#ffd166', '#06d6a0'];\n const x = Math.max(0, Math.min(0.999, t)) * (stops.length - 1);\n return stops[Math.floor(x)];\n}\n\nexport function cssFill(style: TextProps, runWidth: number): string {\n const fill = fillOf(style);\n if (fill === 'rainbow') {\n return `-webkit-background-clip:text;background-clip:text;color:transparent;background-image:linear-gradient(90deg,#ff4d6d,#ffd166,#06d6a0,#4cc9f0,#ff4d6d);background-size:${Math.max(120, runWidth)}px 100%;`;\n }\n if (fill === 'sunset') {\n return `-webkit-background-clip:text;background-clip:text;color:transparent;background-image:linear-gradient(90deg,#ff4d6d,#ff8a4c,#ffd166);`;\n }\n return '';\n}\n\nexport function canvasFill(style: TextProps, glyphIndex: number, runT = 0): string {\n const fill = fillOf(style);\n if (fill === 'rainbow') return rainbowAt(glyphIndex);\n if (fill === 'sunset') return sunsetAt(runT);\n return style.color ?? '#1f2329';\n}\n\nexport function paintCanvasUnderline(\n ctx: CanvasRenderingContext2D,\n x: number,\n y: number,\n w: number,\n size: number,\n kind: ReturnType<typeof underlineKind>,\n color: string\n) {\n if (kind === 'none' || w <= 0) return;\n ctx.save();\n ctx.strokeStyle = color;\n ctx.fillStyle = color;\n const t = Math.max(1, size / 16);\n if (kind === 'marker') {\n ctx.globalAlpha = 0.35;\n ctx.strokeStyle = '#ffd166';\n ctx.lineWidth = Math.max(6, size * 0.28);\n ctx.lineCap = 'round';\n ctx.beginPath();\n ctx.moveTo(x, y - 1);\n ctx.quadraticCurveTo(x + w / 2, y + 3, x + w, y - 2);\n ctx.stroke();\n ctx.restore();\n return;\n }\n ctx.lineWidth = t;\n ctx.lineCap = 'round';\n if (kind === 'double') {\n ctx.fillRect(x, y, w, t);\n ctx.fillRect(x, y + t + 2, w, t);\n } else if (kind === 'dotted') {\n ctx.setLineDash([t * 1.6, t * 1.8]);\n ctx.beginPath();\n ctx.moveTo(x, y + t / 2);\n ctx.lineTo(x + w, y + t / 2);\n ctx.stroke();\n } else if (kind === 'wavy') {\n ctx.beginPath();\n const amp = Math.max(1.4, size * 0.08);\n const step = Math.max(4, size * 0.28);\n ctx.moveTo(x, y);\n for (let px = x; px <= x + w; px += step) {\n const up = ((px - x) / step) % 2 < 1;\n ctx.quadraticCurveTo(px + step / 2, y + (up ? -amp : amp), Math.min(x + w, px + step), y);\n }\n ctx.stroke();\n } else {\n ctx.fillRect(x, y, w, t);\n }\n ctx.restore();\n}\n\nexport function paintCanvasStrike(ctx: CanvasRenderingContext2D, x: number, y: number, w: number, size: number, color: string) {\n ctx.fillStyle = color;\n ctx.fillRect(x, y, w, Math.max(1, size / 16));\n}\n\nexport function groupDecorationRuns(glyphs: GlyphBox[]): { x: number; y: number; w: number; size: number; kind: ReturnType<typeof underlineKind>; strike: boolean; color: string }[] {\n const out: { x: number; y: number; w: number; size: number; kind: ReturnType<typeof underlineKind>; strike: boolean; color: string }[] = [];\n let cur: (typeof out)[number] | null = null;\n for (const g of glyphs) {\n const kind = underlineKind(g.style);\n const strike = !!g.style.strikethrough;\n const size = g.style.fontSize ?? 16;\n const color = fillOf(g.style) === 'solid' ? g.style.color ?? '#1f2329' : rainbowAt(g.index);\n const baseline = g.y + g.h * 0.78;\n if (\n cur &&\n cur.kind === kind &&\n cur.strike === strike &&\n Math.abs(cur.y - baseline) < 1 &&\n Math.abs(cur.x + cur.w - g.x) < 0.6\n ) {\n cur.w += g.w;\n } else {\n if (cur) out.push(cur);\n cur = { x: g.x, y: baseline, w: g.w, size, kind, strike, color };\n }\n }\n if (cur) out.push(cur);\n return out;\n}\n","import { layoutDocument } from '../layout/engine';\nimport { canvasFont } from '../layout/measure';\nimport { REF_HEAD, REF_PAD, refInnerWidth } from '../layout/refMetrics';\nimport { DocLayout } from '../layout/types';\nimport { DocumentModel } from '../model/document';\nimport { underlineKind } from '../model/types';\nimport { cssFill, fillOf } from '../paint/decorations';\nimport { EmbedBox, EmbedPlugin } from './types';\n\nexport { REF_HEAD, REF_PAD, refInnerWidth } from '../layout/refMetrics';\nexport const REF_JUMP = 'mini-ref-jump';\nexport const REF_HIT = 'mini-ref-hit';\n\nexport interface RefJumpDetail {\n id: string;\n fragmentId: string;\n}\n\nexport interface RefHitDetail {\n id: string;\n fragmentId: string;\n localX: number;\n localY: number;\n}\n\nfunction innerUsedSize(layout: DocLayout): { width: number; height: number } {\n let right = layout.contentX;\n for (const line of layout.lines) {\n for (const g of line.glyphs) right = Math.max(right, g.x + g.w);\n for (const img of line.images) right = Math.max(right, img.x + img.w);\n for (const stop of line.caretStops) right = Math.max(right, stop.x);\n }\n for (const table of layout.tables) right = Math.max(right, table.x + table.w);\n return {\n width: Math.max(8, Math.ceil(right - layout.contentX)),\n height: Math.max(layout.height, 8)\n };\n}\n\nexport function measureRef(\n entity: { fragmentId?: string; width?: number },\n contentWidth: number,\n host?: DocumentModel\n): { width: number; height: number } {\n const maxW = Math.max(40, contentWidth);\n const innerW = refInnerWidth(maxW);\n const inner =\n entity.fragmentId && host\n ? layoutDocument(host.ensureFragmentModel(entity.fragmentId), innerW, undefined, { x: 0, y: 0 }, 1)\n : emptyInner(innerW);\n const used = innerUsedSize(inner);\n return { width: Math.min(maxW, used.width), height: used.height };\n}\n\nfunction emptyInner(width: number): DocLayout {\n return {\n width,\n height: 24,\n contentX: 0,\n contentY: 0,\n contentWidth: width,\n paragraphs: [],\n tables: [],\n lines: [],\n images: [],\n dirty: { top: 0, bottom: 0 }\n };\n}\n\nfunction countLabel(el: HTMLElement): string {\n const n = Number(el.dataset.refCount ?? 1);\n return n > 1 ? `引用 · ${n}` : '引用';\n}\n\nfunction paintInner(host: HTMLElement, layout: DocLayout | undefined) {\n host.replaceChildren();\n if (!layout) return;\n for (const line of layout.lines) {\n if (line.glyphs.length) host.appendChild(renderInnerLine(line));\n for (const img of line.images) {\n const hole = document.createElement('div');\n hole.className = 'mini-ref-hole';\n hole.style.cssText = `left:${img.x}px;top:${img.y}px;width:${img.w}px;height:${img.h}px;`;\n hole.textContent = img.entity.kind === 'image' ? '' : img.entity.kind ?? 'embed';\n if (img.entity.kind === 'image' && img.entity.src) {\n const pic = document.createElement('img');\n pic.src = img.entity.src;\n pic.alt = '';\n pic.style.cssText = 'width:100%;height:100%;object-fit:cover;border-radius:4px;';\n hole.replaceChildren(pic);\n }\n host.appendChild(hole);\n }\n }\n}\n\nfunction renderInnerLine(line: DocLayout['lines'][number]): HTMLElement {\n const wrap = document.createElement('div');\n wrap.className = 'mini-ref-line';\n let run: { text: string; style: (typeof line.glyphs)[0]['style']; x: number; y: number; h: number; w: number; start: number } | null = null;\n const flush = () => {\n if (!run) return;\n const span = document.createElement('span');\n span.className = `mini-run${fillOf(run.style) !== 'solid' ? ' is-fill' : ''}`;\n span.textContent = run.text;\n span.style.cssText = `left:${run.x}px;top:${run.y}px;height:${run.h}px;${innerCss(run.style, run.w)}`;\n wrap.appendChild(span);\n const deco = underlineKind(run.style);\n if (deco !== 'none' || run.style.strikethrough) {\n const bar = document.createElement('span');\n bar.className = `mini-deco mini-deco-${deco}${run.style.strikethrough ? ' is-strike' : ''}`;\n bar.style.cssText = `left:${run.x}px;top:${run.y}px;width:${run.w}px;height:${run.h}px;color:${run.style.color ?? '#1f2329'};`;\n wrap.appendChild(bar);\n }\n run = null;\n };\n for (const g of line.glyphs) {\n if (\n run &&\n run.style.bold === g.style.bold &&\n run.style.italic === g.style.italic &&\n run.style.underline === g.style.underline &&\n run.style.underlineStyle === g.style.underlineStyle &&\n run.style.strikethrough === g.style.strikethrough &&\n run.style.fontSize === g.style.fontSize &&\n run.style.color === g.style.color &&\n run.style.fill === g.style.fill &&\n run.start + run.text.length === g.index\n ) {\n run.text += g.text;\n run.w += g.w;\n } else {\n flush();\n run = { start: g.index, text: g.text, style: g.style, x: g.x, y: g.y, h: g.h, w: g.w };\n }\n }\n flush();\n return wrap;\n}\n\nfunction innerCss(style: DocLayout['lines'][number]['glyphs'][0]['style'], runW: number): string {\n const size = style.fontSize ?? 16;\n const weight = style.bold ? '700' : String(style.fontWeight ?? 400);\n const italic = style.italic ? 'italic' : 'normal';\n const color = style.color ?? '#1f2329';\n return `font-style:${italic};font-weight:${weight};font-size:${size}px;line-height:${size * 1.6}px;font-family:var(--mini-font-family);color:${color};text-decoration:none;${cssFill(style, runW)}`;\n}\n\nexport const refPlugin: EmbedPlugin = {\n kind: 'ref',\n keepAspectRatio: false,\n interactive: true,\n overlayOnCanvas: true,\n measure(entity, contentWidth, host) {\n return measureRef(entity, contentWidth, host);\n },\n create(box) {\n const root = document.createElement('div');\n root.className = 'mini-embed mini-ref mini-embed-interactive';\n const badge = document.createElement('span');\n badge.className = 'mini-ref-badge';\n badge.textContent = '引用';\n const body = document.createElement('div');\n body.className = 'mini-ref-body';\n root.append(badge, body);\n\n badge.addEventListener('click', (e) => {\n e.preventDefault();\n e.stopPropagation();\n const fragmentId = root.dataset.fragmentId;\n if (!fragmentId) return;\n root.dispatchEvent(\n new CustomEvent<RefJumpDetail>(REF_JUMP, {\n bubbles: true,\n detail: { id: root.dataset.entity || box.entity.id, fragmentId }\n })\n );\n });\n paintChip(root, box);\n return root;\n },\n update(el, box) {\n paintChip(el, box);\n },\n paintCanvasBackdrop(ctx, box) {\n ctx.save();\n ctx.fillStyle = '#fff8dc';\n ctx.beginPath();\n ctx.roundRect(box.x, box.y, box.w, box.h, 3);\n ctx.fill();\n const inner = box.inner;\n if (inner) {\n ctx.translate(box.x + REF_PAD, box.y + REF_HEAD);\n for (const line of inner.lines) {\n for (const g of line.glyphs) {\n ctx.save();\n ctx.font = canvasFont(g.style);\n ctx.fillStyle = g.style.color ?? '#1f2329';\n ctx.textBaseline = 'top';\n ctx.fillText(g.text, g.x, g.y);\n ctx.restore();\n }\n }\n }\n ctx.restore();\n }\n};\n\nfunction paintChip(el: HTMLElement, box: EmbedBox) {\n const fragmentId = box.entity.fragmentId ?? '';\n el.dataset.fragmentId = fragmentId;\n el.dataset.refCount = el.dataset.refCount ?? '1';\n const badge = el.querySelector('.mini-ref-badge');\n if (badge) badge.textContent = countLabel(el);\n const body = el.querySelector<HTMLElement>('.mini-ref-body');\n if (body) {\n body.style.height = `${Math.max(24, box.h)}px`;\n paintInner(body, box.inner);\n }\n}\n\nexport function decorateRefEl(el: HTMLElement, count: number, title: string, editing: boolean, selected = false) {\n el.dataset.refCount = String(count);\n el.dataset.refTitle = title;\n el.classList.toggle('is-editing', editing);\n el.classList.toggle('is-selected', selected);\n const badge = el.querySelector('.mini-ref-badge');\n if (badge) badge.textContent = count > 1 ? `引用 · ${count}` : '引用';\n}\n","import { measureWidth } from '../layout/measure';\nimport { EmbedEntity, SlotKind } from '../model/types';\nimport { EMBED_EXIT_EDIT, EmbedPlugin, emitEmbedChange } from './types';\n\nexport const DEFAULT_SELECT_OPTIONS = ['小美', '阿力'] as const;\nconst FILLED_IMAGE = { width: 72, height: 40 };\n\nconst ICONS: Record<SlotKind, string> = {\n text:\n '<svg viewBox=\"0 0 16 16\" width=\"16\" height=\"16\" aria-hidden=\"true\"><path d=\"M3 3.6h10M8 3.6v8.8M5.6 12.4h4.8\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.3\" stroke-linecap=\"round\"/></svg>',\n image:\n '<svg viewBox=\"0 0 16 16\" width=\"16\" height=\"16\" aria-hidden=\"true\"><rect x=\"2.2\" y=\"3.2\" width=\"11.6\" height=\"9.6\" rx=\"1.6\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.3\"/><path d=\"M3.4 11.2 6.1 8.2l2 1.7 2.4-3 2.1 4.3\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.3\" stroke-linejoin=\"round\"/><circle cx=\"6\" cy=\"6.1\" r=\".9\" fill=\"currentColor\"/><path d=\"M11.2 4.6v2.4M10 5.8h2.4\" stroke=\"currentColor\" stroke-width=\"1.2\" stroke-linecap=\"round\"/></svg>',\n select:\n '<svg viewBox=\"0 0 16 16\" width=\"16\" height=\"16\" aria-hidden=\"true\"><path d=\"M4 6.2 8 10l4-3.8\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>'\n};\n\nexport function defaultSlotLabel(kind: SlotKind): string {\n if (kind === 'image') return '上传图片';\n if (kind === 'select') return '请选择';\n return '输入文本';\n}\n\nexport function slotKindOf(entity: EmbedEntity): SlotKind {\n if (entity.slotKind === 'image' || entity.slotKind === 'select' || entity.slotKind === 'text') return entity.slotKind;\n return 'text';\n}\n\nexport function slotOptionsOf(entity: EmbedEntity): string[] {\n return entity.slotOptions?.length ? entity.slotOptions : [...DEFAULT_SELECT_OPTIONS];\n}\n\nexport function slotPlaceholder(entity: EmbedEntity): string {\n return entity.label || defaultSlotLabel(slotKindOf(entity));\n}\n\nexport function slotCaption(entity: EmbedEntity): string {\n return entity.slotValue?.trim() || slotPlaceholder(entity);\n}\n\nexport function slotFilled(entity: EmbedEntity): boolean {\n if (slotKindOf(entity) === 'image') return !!entity.src;\n return !!entity.slotValue?.trim();\n}\n\nexport function measureSlot(entity: EmbedEntity): { width: number; height: number } {\n if (slotKindOf(entity) === 'image' && entity.src) return { ...FILLED_IMAGE };\n const label = slotCaption(entity);\n const textW = typeof document === 'undefined' ? label.length * 13 : measureWidth(label, { fontSize: 13 });\n const extra = slotKindOf(entity) === 'select' ? 8 : 0;\n return { width: Math.ceil(28 + 16 + textW + 18 + extra), height: 28 };\n}\n\nfunction closeMenus(except?: HTMLElement) {\n for (const menu of document.querySelectorAll('.mini-slot-menu')) {\n if (menu === except) continue;\n menu.remove();\n }\n}\n\nfunction openSelectMenu(root: HTMLElement, entity: EmbedEntity) {\n closeMenus();\n const menu = document.createElement('div');\n menu.className = 'mini-slot-menu';\n const id = root.dataset.entity || entity.id;\n for (const name of slotOptionsOf(entity)) {\n const btn = document.createElement('button');\n btn.type = 'button';\n btn.textContent = name;\n if (name === entity.slotValue) btn.classList.add('is-on');\n btn.addEventListener('mousedown', (e) => e.stopPropagation());\n btn.addEventListener('click', (e) => {\n e.stopPropagation();\n emitEmbedChange(root, { id, patch: { slotValue: name } }, true);\n menu.remove();\n });\n menu.appendChild(btn);\n }\n const clear = document.createElement('button');\n clear.type = 'button';\n clear.textContent = '清除';\n clear.addEventListener('mousedown', (e) => e.stopPropagation());\n clear.addEventListener('click', (e) => {\n e.stopPropagation();\n emitEmbedChange(root, { id, patch: { slotValue: '' } }, true);\n menu.remove();\n });\n menu.appendChild(clear);\n root.appendChild(menu);\n const onDoc = (e: MouseEvent) => {\n if (root.contains(e.target as Node)) return;\n menu.remove();\n document.removeEventListener('mousedown', onDoc);\n };\n document.addEventListener('mousedown', onDoc);\n}\n\nconst slotEntities = new WeakMap<HTMLElement, EmbedEntity>();\n\nfunction paintChip(el: HTMLElement, entity: EmbedEntity) {\n if (el.classList.contains('is-editing')) return;\n const kind = slotKindOf(entity);\n const filled = slotFilled(entity);\n const imageFilled = kind === 'image' && filled;\n el.className = `mini-embed mini-slot mini-embed-interactive${filled ? ' is-filled' : ''}${imageFilled ? ' is-image-filled' : ''}`;\n el.dataset.slotKind = kind;\n const icon = el.querySelector<HTMLElement>('.mini-slot-icon');\n const text = el.querySelector<HTMLElement>('.mini-slot-text');\n const thumb = el.querySelector<HTMLImageElement>('.mini-slot-thumb');\n const input = el.querySelector<HTMLInputElement>('.mini-slot-input');\n if (icon) {\n icon.hidden = imageFilled;\n icon.innerHTML = ICONS[kind];\n }\n if (text) {\n text.hidden = imageFilled;\n text.textContent = slotCaption(entity);\n }\n if (thumb) {\n thumb.hidden = !imageFilled;\n if (imageFilled && entity.src) thumb.src = entity.src;\n else thumb.removeAttribute('src');\n }\n if (input) input.hidden = true;\n}\n\nexport const slotPlugin: EmbedPlugin = {\n kind: 'slot',\n keepAspectRatio: false,\n interactive: true,\n overlayOnCanvas: true,\n measure: measureSlot,\n create(box) {\n const root = document.createElement('span');\n const icon = document.createElement('span');\n icon.className = 'mini-slot-icon';\n const text = document.createElement('span');\n text.className = 'mini-slot-text';\n const thumb = document.createElement('img');\n thumb.className = 'mini-slot-thumb';\n thumb.alt = '';\n thumb.draggable = false;\n const input = document.createElement('input');\n input.type = 'text';\n input.className = 'mini-slot-input';\n input.hidden = true;\n const file = document.createElement('input');\n file.type = 'file';\n file.accept = 'image/*';\n file.className = 'mini-slot-file';\n root.append(icon, text, thumb, input, file);\n slotEntities.set(root, box.entity);\n\n let baseline = box.entity.slotValue ?? '';\n const current = () => slotEntities.get(root) ?? box.entity;\n const entityId = () => root.dataset.entity || current().id;\n\n const leaveEdit = () => {\n root.classList.remove('is-editing');\n input.hidden = true;\n icon.hidden = false;\n text.hidden = false;\n };\n\n const startTextEdit = () => {\n const entity = current();\n baseline = entity.slotValue ?? '';\n root.classList.add('is-editing');\n closeMenus();\n icon.hidden = true;\n text.hidden = true;\n thumb.hidden = true;\n input.hidden = false;\n input.value = baseline;\n input.placeholder = slotPlaceholder(entity);\n input.focus();\n input.select();\n };\n\n const commitText = () => {\n if (!root.classList.contains('is-editing')) return;\n const value = input.value;\n leaveEdit();\n emitEmbedChange(root, { id: entityId(), patch: { slotValue: value } }, true);\n };\n\n const cancelText = () => {\n if (!root.classList.contains('is-editing')) return;\n leaveEdit();\n emitEmbedChange(root, { id: entityId(), patch: { slotValue: baseline } }, true);\n };\n\n const activate = () => {\n const entity = current();\n const kind = slotKindOf(entity);\n if (kind === 'image') {\n file.click();\n return;\n }\n if (kind === 'select') {\n openSelectMenu(root, entity);\n return;\n }\n startTextEdit();\n };\n\n root.addEventListener('click', (e) => {\n if ((e.target as HTMLElement).closest('.mini-slot-menu, .mini-slot-file, .mini-slot-input')) return;\n activate();\n });\n root.addEventListener('mini-slot-activate', activate);\n input.addEventListener('mousedown', (e) => e.stopPropagation());\n input.addEventListener('click', (e) => e.stopPropagation());\n input.addEventListener('input', () => {\n emitEmbedChange(root, { id: entityId(), patch: { slotValue: input.value } });\n });\n input.addEventListener('blur', () => {\n window.setTimeout(() => {\n if (root.contains(document.activeElement)) return;\n commitText();\n }, 0);\n });\n input.addEventListener('keydown', (e) => {\n e.stopPropagation();\n if (e.key === 'Enter') {\n e.preventDefault();\n commitText();\n return;\n }\n if (e.key === 'Escape') {\n e.preventDefault();\n cancelText();\n return;\n }\n if (e.key === 'ArrowLeft' && input.selectionStart === 0 && input.selectionEnd === 0) {\n e.preventDefault();\n commitText();\n root.dispatchEvent(new CustomEvent(EMBED_EXIT_EDIT, { bubbles: true, detail: { id: entityId(), side: 'before' } }));\n return;\n }\n if (\n e.key === 'ArrowRight' &&\n input.selectionStart === input.value.length &&\n input.selectionEnd === input.value.length\n ) {\n e.preventDefault();\n commitText();\n root.dispatchEvent(new CustomEvent(EMBED_EXIT_EDIT, { bubbles: true, detail: { id: entityId(), side: 'after' } }));\n }\n });\n file.addEventListener('mousedown', (e) => e.stopPropagation());\n file.addEventListener('change', () => {\n const f = file.files?.[0];\n file.value = '';\n if (!f) return;\n emitEmbedChange(\n root,\n {\n id: entityId(),\n patch: { slotValue: '', src: URL.createObjectURL(f) }\n },\n true\n );\n });\n\n paintChip(root, box.entity);\n return root;\n },\n update(el, box) {\n slotEntities.set(el, box.entity);\n paintChip(el, box.entity);\n },\n paintCanvasBackdrop(ctx, box, imageOf) {\n const r = Math.min(12, box.h / 2);\n ctx.beginPath();\n ctx.roundRect(box.x, box.y, box.w, box.h, r);\n if (slotKindOf(box.entity) === 'image' && box.entity.src) {\n ctx.save();\n ctx.clip();\n try {\n ctx.drawImage(imageOf(box.entity.src), box.x, box.y, box.w, box.h);\n } catch {\n ctx.fillStyle = '#e9edf5';\n ctx.fill();\n }\n ctx.restore();\n return;\n }\n ctx.fillStyle = slotFilled(box.entity) ? '#e9edf5' : '#f2f4f7';\n ctx.fill();\n ctx.fillStyle = slotFilled(box.entity) ? '#1f2329' : '#98a2b3';\n ctx.font = '13px \"PingFang SC\", \"Hiragino Sans GB\", \"Microsoft YaHei\", sans-serif';\n ctx.textBaseline = 'middle';\n ctx.fillText(slotCaption(box.entity), box.x + 34, box.y + box.h / 2);\n }\n};\n","import { EmbedBox, EmbedPlugin } from './types';\n\nfunction applyVideo(el: HTMLVideoElement, box: EmbedBox) {\n if (box.entity.src && el.src !== box.entity.src) el.src = box.entity.src;\n}\n\nexport const videoPlugin: EmbedPlugin = {\n kind: 'video',\n keepAspectRatio: true,\n interactive: true,\n overlayOnCanvas: true,\n measure(entity) {\n return { width: entity.width, height: entity.height };\n },\n create(box) {\n const node = document.createElement('video');\n node.className = 'mini-embed mini-image mini-video mini-embed-interactive';\n node.controls = true;\n node.preload = 'metadata';\n node.playsInline = true;\n node.draggable = false;\n applyVideo(node, box);\n return node;\n },\n update(el, box) {\n applyVideo(el as HTMLVideoElement, box);\n },\n paintCanvasBackdrop(ctx, box) {\n ctx.fillStyle = '#111827';\n ctx.fillRect(box.x, box.y, box.w, box.h);\n }\n};\n","import { EmbedEntity } from '../model/types';\nimport { EmbedBox, EmbedChangeDetail, EMBED_CHANGE, EMBED_COMMIT, EMBED_MEASURE, EmbedMeasureDetail, EmbedPlugin } from './types';\n\n/**\n * 宿主渲染型嵌入对象。\n *\n * 与内置的自绘型嵌入对象(image/slot/ref 等由 SDK 自己建 DOM、自己画)不同,\n * host 型把节点内部 DOM 的渲染权交给宿主:SDK 只负责在文本流里占一个字符位、\n * 用 measure 得到的尺寸给它绝对定位、并管理它的挂载/更新/卸载生命周期;节点里\n * 具体画什么由宿主提供的 {@link HostEmbedRenderer} 决定。宿主据此把自己框架\n * (axii / React 等)的业务组件 render 进 SDK 交出的容器里。\n *\n * 数据是引用式的:实体 {@link EmbedEntity.data} 里通常只存业务对象的引用 id,\n * 完整数据与状态由宿主自己的 store 维护、自行 resolve。数据变化经宿主回调写回\n * 实体(复用 EMBED_CHANGE / EMBED_COMMIT 事件回路),尺寸变化经 requestResize\n * 通知 SDK 重排。\n */\n\n/** SDK 交给宿主渲染器的上下文,随实体/选中态变化。 */\nexport interface HostEmbedContext {\n /** 当前实体(含 hostType / data 等业务字段)。 */\n entity: EmbedEntity;\n /** 该嵌入对象当前是否被选中(外层光标选区覆盖它)。 */\n selected: boolean;\n /**\n * 写回实体数据。commit=false 为预览(不进撤销栈),commit=true 落定(进撤销栈)。\n * patch 可含 data / width / height 等实体字段。\n */\n emitChange(patch: Partial<EmbedEntity>, commit?: boolean): void;\n /** 宿主渲染后尺寸确定/变化时调用,通知 SDK 用新尺寸重排。 */\n requestResize(width: number, height: number): void;\n}\n\n/**\n * 选中 host 后按键激活。引擎不解释业务 UI(下拉等),只问宿主要不要吞掉这次按键。\n * 返回 true:已处理,不再插段;false / 未实现:按默认换行。\n */\nexport interface HostActivateRequest {\n key: 'Enter';\n shift: boolean;\n}\n\n/** 一次 mount 返回的句柄,供 SDK 在实体/选中态变化和卸载时调用。 */\nexport interface HostEmbedHandle {\n /** 实体或选中态变化时,SDK 调它同步宿主渲染。 */\n update(ctx: HostEmbedContext): void;\n /** 节点从文档移除时,SDK 调它清理宿主侧资源(卸载组件、解绑等)。 */\n destroy(): void;\n /**\n * 整颗选中时的激活(对齐公式 Enter 进编辑)。省略则选中回车仍插段。\n */\n activate?(req: HostActivateRequest): boolean;\n}\n\n/** 宿主渲染器:把业务组件挂进 SDK 交出的容器。由构造 Editor 时通过 options 注入。 */\nexport interface HostEmbedRenderer {\n /**\n * 把业务组件渲染进 container。container 是 SDK 建好的空节点,已做好占位与定位。\n * 返回句柄供后续 update / destroy。\n */\n mount(container: HTMLElement, ctx: HostEmbedContext): HostEmbedHandle;\n}\n\n/** 当前 Editor 注入的渲染器。单例:一个运行时只有一个宿主渲染器。 */\nlet renderer: HostEmbedRenderer | null = null;\n\nexport function setHostEmbedRenderer(r: HostEmbedRenderer | null) {\n renderer = r;\n}\n\n/** host 型实体的默认兜底尺寸(宿主尚未回传测量前)。 */\nconst FALLBACK_SIZE = { width: 120, height: 24 };\n\n/** 每个容器 el 对应的宿主句柄、最近一次 box 与自动测尺观察器,供 update/卸载使用。 */\ntype HostRec = { el: HTMLElement; handle: HostEmbedHandle; box: EmbedBox; ro?: ResizeObserver; lastSize?: string };\n\nconst handles = new WeakMap<HTMLElement, HostRec>();\n/** 按实体 id 索引,光标移动时不经过 querySelector / data-entity,避免对不上。 */\nconst handlesById = new Map<string, HostRec>();\n\n/**\n * 把尺寸回报为 EMBED_MEASURE:只触发重排,不进撤销栈。\n *\n * 无论来自 SDK 的自动观察还是宿主手动调 requestResize,都走这里。延到微任务里\n * 派发有两个原因:宿主常在 mount 首帧就报,而此刻容器可能还没挂进文档树(create\n * 返回后 registry 才 appendChild),同步事件冒泡不到编辑器;且重排里再改 DOM 会\n * 触发 ResizeObserver 递归,延迟能断开这个同步链。\n */\nfunction emitMeasure(el: HTMLElement, id: string, width: number, height: number) {\n const detail: EmbedMeasureDetail = { id, width, height };\n queueMicrotask(() =>\n el.dispatchEvent(new CustomEvent(EMBED_MEASURE, { bubbles: true, detail }))\n );\n}\n\n/**\n * SDK 自动观察 host 块尺寸。宿主只管把组件画进容器,尺寸变化 SDK 自动感知并重排,\n * 宿主零负担、无需自己装 ResizeObserver 或调 requestResize。\n *\n * 观察的是内层 measure 节点 `inner`,不是外层 `el`:外层 el 会被 placeEmbed 按\n * 回填尺寸强制设宽高(用于占位定位),量它只会量到回填值、无法反映内容真实需求,\n * 形成自我印证;内层 inner 不设宽高、由宿主内容自然撑开,量到的才是内容真实占位。\n */\nfunction observeSize(inner: HTMLElement, id: string, rec: { ro?: ResizeObserver; lastSize?: string }) {\n if (typeof ResizeObserver === 'undefined') return;\n const ro = new ResizeObserver(() => {\n const width = Math.round(inner.offsetWidth);\n const height = Math.round(inner.offsetHeight);\n if (!width || !height) return;\n // 交接帧可能量到「一列字」的窄高盒子;写回会锁死排版,直到下次输入再撑开。\n if (width < 48 && height > width * 3) return;\n const key = `${width}x${height}`;\n // 去重:避免尺寸未变时反复触发重排。\n if (key === rec.lastSize) return;\n rec.lastSize = key;\n emitMeasure(inner, id, width, height);\n });\n ro.observe(inner);\n rec.ro = ro;\n}\n\n/**\n * 光标选中变化时打标并通知宿主。排版层不会每次重排,所以不能只靠 plugin.update。\n * 按实体 id 找句柄,并把 selected 直接写进 ctx,不依赖 data-entity 对得上。\n */\nexport function decorateHostEl(el: HTMLElement, selected: boolean) {\n const rec = handles.get(el) ?? handlesById.get(el.dataset.entity ?? '');\n if (!rec) {\n el.classList.toggle('is-selected', selected);\n return;\n }\n syncRecSelected(rec, selected);\n}\n\nexport function syncHostSelected(selectedId: string | null) {\n for (const rec of handlesById.values()) {\n syncRecSelected(rec, rec.box.entity.id === selectedId);\n }\n}\n\nfunction syncRecSelected(rec: HostRec, selected: boolean) {\n const prev = rec.el.classList.contains('is-selected');\n rec.el.classList.toggle('is-selected', selected);\n if (prev === selected) return;\n rec.handle.update({ ...contextOf(rec.el, rec.box), selected });\n}\n\nfunction contextOf(el: HTMLElement, box: EmbedBox): HostEmbedContext {\n const id = box.entity.id;\n return {\n entity: box.entity,\n // 选中态由编辑器通过 DOM class 标记(与自绘型一致),这里读回给宿主。\n selected: el.classList.contains('is-selected'),\n emitChange(patch, commit = false) {\n const detail: EmbedChangeDetail = { id, patch };\n el.dispatchEvent(new CustomEvent(commit ? EMBED_COMMIT : EMBED_CHANGE, { bubbles: true, detail }));\n },\n // 手动挡:SDK 默认已自动观察容器尺寸,宿主一般不用调这个;只有想自己精确\n // 控制回报时机的场景才用。走的是和自动观察同一条通道。\n requestResize(width, height) {\n emitMeasure(el, id, width, height);\n }\n };\n}\n\n/** 把宿主组件挂进内层节点,记录句柄并开启自动测尺。create/补挂共用。 */\nfunction mountInto(el: HTMLElement, inner: HTMLElement, box: EmbedBox) {\n const handle = renderer!.mount(inner, contextOf(el, box));\n const rec: HostRec = {\n el,\n handle,\n box\n };\n handles.set(el, rec);\n handlesById.set(box.entity.id, rec);\n observeSize(inner, box.entity.id, rec);\n}\n\nexport const hostEmbedPlugin: EmbedPlugin = {\n kind: 'host',\n keepAspectRatio: false,\n interactive: true,\n overlayOnCanvas: true,\n measure(entity) {\n // 宿主渲染型尺寸由宿主 render 后经 requestResize 回写到实体;此处用实体上已\n // 记录的尺寸,尚无则回退兜底值(首帧后宿主回传即触发重排修正)。\n const width = entity.width > 0 ? entity.width : FALLBACK_SIZE.width;\n const height = entity.height > 0 ? entity.height : FALLBACK_SIZE.height;\n return { width, height };\n },\n create(box) {\n const el = document.createElement('span');\n el.className = 'mini-embed mini-host mini-embed-interactive';\n // 标记 kind,供 syncEmbedLayer 移除时找到本插件调用 destroy 清理副作用。\n el.dataset.kind = 'host';\n // 内层 measure 节点:不设宽高、由宿主内容自然撑开,既是宿主的挂载点,\n // 也是 SDK 自动测尺的观察对象(见 observeSize)。\n const inner = document.createElement('span');\n inner.className = 'mini-host-inner';\n el.appendChild(inner);\n if (!renderer) {\n // 未注入渲染器:留一个占位容器,避免报错;宿主接入后应始终提供 renderer。\n return el;\n }\n mountInto(el, inner, box);\n return el;\n },\n update(el, box) {\n const rec = handles.get(el);\n if (rec) {\n rec.box = box;\n rec.el = el;\n handlesById.set(box.entity.id, rec);\n rec.handle.update({\n ...contextOf(el, box),\n selected: el.classList.contains('is-selected')\n });\n } else if (renderer) {\n // 容器已存在但尚未 mount(例如 create 时 renderer 未就绪):补挂。\n const inner = el.querySelector<HTMLElement>('.mini-host-inner') ?? el;\n mountInto(el, inner, box);\n }\n },\n paintCanvasBackdrop() {\n // 宿主渲染型只走 DOM 图层(overlayOnCanvas=true),canvas 后端不额外画底。\n }\n};\n\n/** 选中 host 按 Enter:转给该实体的 {@link HostEmbedHandle.activate}。 */\nexport function activateHostEmbed(id: string, req: HostActivateRequest): boolean {\n return handlesById.get(id)?.handle.activate?.(req) === true;\n}\n\n/** host 块从文档移除时清理:停掉自动测尺、卸载宿主组件、释放记录。 */\nexport function destroyHostEmbed(el: HTMLElement) {\n const rec = handles.get(el);\n if (rec) {\n rec.ro?.disconnect();\n rec.handle.destroy();\n handles.delete(el);\n handlesById.delete(rec.box.entity.id);\n }\n}\n","import { EmbedKind } from '../model/types';\nimport { EmbedBox, EmbedPlugin, placeEmbed } from './types';\n\nconst plugins = new Map<EmbedKind, EmbedPlugin>();\n\nexport function registerEmbed(plugin: EmbedPlugin) {\n plugins.set(plugin.kind, plugin);\n}\n\nexport function embedPlugin(kind: EmbedKind | undefined): EmbedPlugin {\n const hit = plugins.get(kind ?? 'image') ?? plugins.get('image');\n if (!hit) {\n throw new Error(\n `嵌入插件未注册:${kind ?? 'image'}。` +\n '请先 registerEmbed(...) 或构造 Editor 时传 plugins —— ' +\n '注意在构造 Editor 之前调用 embedPlugin 的代码(如预先构建文档)需要自己先注册。'\n );\n }\n return hit;\n}\n\nexport function syncEmbedLayer(\n host: HTMLElement,\n cache: Map<string, HTMLElement>,\n boxes: EmbedBox[],\n canvas: boolean\n) {\n const seen = new Set<string>();\n for (const box of boxes) {\n const plugin = embedPlugin(box.entity.kind);\n if (canvas && !plugin.overlayOnCanvas) continue;\n seen.add(box.entity.id);\n let el = cache.get(box.entity.id);\n if (!el) {\n el = plugin.create(box);\n host.appendChild(el);\n cache.set(box.entity.id, el);\n }\n plugin.update(el, box);\n placeEmbed(el, box);\n }\n for (const [id, el] of cache) {\n if (!seen.has(id)) {\n // 移除前给插件一次清理副作用的机会(观察器、外部组件等)。\n plugins.get((el.dataset.kind ?? '') as EmbedKind)?.destroy?.(el);\n el.remove();\n cache.delete(id);\n }\n }\n}\n","import { codePlugin } from './code';\nimport { imagePlugin } from './image';\nimport { refPlugin } from './ref';\nimport { slotPlugin } from './slot';\nimport { EmbedPlugin } from './types';\nimport { videoPlugin } from './video';\nimport { hostEmbedPlugin } from './host';\n\n/**\n * 默认内置插件。不含公式 —— 公式依赖 KaTeX / MathLive,体积很大,\n * 需要时从 `medeo-rte/formula` 单独引入再传给 Editor。\n */\nexport const builtinEmbedPlugins: EmbedPlugin[] = [\n imagePlugin,\n videoPlugin,\n codePlugin,\n slotPlugin,\n refPlugin\n];\n\nexport { codePlugin, imagePlugin, refPlugin, slotPlugin, videoPlugin };\nexport { hostEmbedPlugin, setHostEmbedRenderer, destroyHostEmbed, activateHostEmbed, decorateHostEl, syncHostSelected } from './host';\nexport type { HostEmbedRenderer, HostEmbedContext, HostEmbedHandle, HostActivateRequest } from './host';\nexport { embedPlugin, registerEmbed, syncEmbedLayer } from './registry';\nexport { measureCode } from './code';\nexport { decorateRefEl, measureRef, REF_HEAD, REF_HIT, REF_JUMP, REF_PAD, refInnerWidth } from './ref';\nexport { defaultSlotLabel, measureSlot } from './slot';\nexport { EMBED_CHANGE, EMBED_COMMIT, EMBED_EXIT_EDIT, EMBED_MEASURE, type EmbedBox, type EmbedChangeDetail, type EmbedExitDetail, type EmbedMeasureDetail, type EmbedPlugin } from './types';\n","/**\n * Mutation —— 文档变更的原子单元,也是 OT 变换的对象。\n *\n * 设计要点:\n * - Mutation 是**纯数据**,可直接 JSON 序列化后走网络。行为(应用、变换、求逆、\n * 合并)不挂在它身上,而是按 `type` 到注册表里查,见 registry.ts。\n * - 索引一律是**闭区间**语义,`deleteSpacers` 的 `[startIndex, endIndex]` 含两端。\n * 与文档模型半开区间的转换在 apply/invert 边界上做。\n * - 上层的一次用户操作(比如「按退格」)通常展开成多条 mutation,\n * 用 `multi` 打包成一步。\n */\nimport { EmbedEntity, Fragment, StyleProps, StyleType, VirtualBlock } from '../model/types';\n\n/** 在 insertBeforeIndex 之前插入这串 spacer。 */\nexport interface InsertSpacersMutation {\n type: 'insertSpacers';\n insertBeforeIndex: number;\n spacers: string;\n}\n\n/** 删除闭区间 [startIndex, endIndex]。 */\nexport interface DeleteSpacersMutation {\n type: 'deleteSpacers';\n startIndex: number;\n endIndex: number;\n}\n\n/** 给闭区间 [startIndex, endIndex] 覆盖一段样式。props 为 null 表示清除该类型。 */\nexport interface ApplyStyleMutation {\n type: 'applyStyle';\n styleType: StyleType;\n startIndex: number;\n endIndex: number;\n props: StyleProps | null;\n}\n\nexport interface AddEntityMutation {\n type: 'addEntity';\n entity: EmbedEntity;\n}\n\nexport interface UpdateEntityMutation {\n type: 'updateEntity';\n entityId: string;\n props: Partial<EmbedEntity>;\n}\n\nexport interface DeleteEntityMutation {\n type: 'deleteEntity';\n entityId: string;\n}\n\n/**\n * 新建一个同步块(fragment)。\n *\n * fragment 和 entity 一样按 id 寻址,不占主文档坐标空间,因此不参与下标变换。\n * 提取同步块(promoteRange)时发这条,撤销即删除它。\n */\nexport interface AddFragmentMutation {\n type: 'addFragment';\n fragment: Fragment;\n}\n\n/** 删除一个同步块。逆操作把整份 Fragment 原样加回来。 */\nexport interface DeleteFragmentMutation {\n type: 'deleteFragment';\n fragmentId: string;\n}\n\n/** 写入一个虚拟块。同 id 存在则整体替换。区间随字符插删由 applier 机械挪动。 */\nexport interface AddVirtualBlockMutation {\n type: 'addVirtualBlock';\n block: VirtualBlock;\n}\n\n/** 删除一个虚拟块。 */\nexport interface DeleteVirtualBlockMutation {\n type: 'deleteVirtualBlock';\n blockId: string;\n}\n\n/** 用完整值覆盖一个虚拟块(含区间与 chrome)。 */\nexport interface UpdateVirtualBlockMutation {\n type: 'updateVirtualBlock';\n blockId: string;\n block: VirtualBlock;\n}\n\n/** 变换后被完全抵消的操作。应用时什么都不做。 */\nexport interface NullMutation {\n type: 'null';\n}\n\n/** 一组按序执行的 mutation,构成一个不可分割的步骤。 */\nexport interface MultiMutation {\n type: 'multi';\n commands: Mutation[];\n}\n\n/**\n * 把一条 mutation 定向到某个片段(同步块)的坐标空间里去执行。\n *\n * 片段的内容是独立的一条字符流,下标和主文档不共享。用这层包装之后,\n * 片段内部的编辑和主文档编辑就是同一种东西了:进同一个撤销栈、走同一套变换。\n * 不同片段的操作天然不冲突,变换时直接原样放行。\n */\nexport interface ScopedMutation {\n type: 'scoped';\n fragmentId: string;\n inner: Mutation;\n}\n\nexport type Mutation =\n | InsertSpacersMutation\n | DeleteSpacersMutation\n | ApplyStyleMutation\n | AddEntityMutation\n | UpdateEntityMutation\n | DeleteEntityMutation\n | AddFragmentMutation\n | DeleteFragmentMutation\n | AddVirtualBlockMutation\n | DeleteVirtualBlockMutation\n | UpdateVirtualBlockMutation\n | NullMutation\n | MultiMutation\n | ScopedMutation;\n\nexport type MutationType = Mutation['type'];\n\n// ---- 构造 ----------------------------------------------------------------\n\nexport function insertSpacers(insertBeforeIndex: number, spacers: string): Mutation {\n return spacers ? { type: 'insertSpacers', insertBeforeIndex, spacers } : NULL_MUTATION;\n}\n\n/** 入参是闭区间。 */\nexport function deleteSpacers(startIndex: number, endIndex: number): Mutation {\n return endIndex >= startIndex ? { type: 'deleteSpacers', startIndex, endIndex } : NULL_MUTATION;\n}\n\n/** 从半开区间 [start, end) 构造,便于和文档模型对接。 */\nexport function deleteSpacersHalfOpen(start: number, end: number): Mutation {\n return deleteSpacers(start, end - 1);\n}\n\nexport function applyStyle(\n styleType: StyleType,\n startIndex: number,\n endIndex: number,\n props: StyleProps | null\n): Mutation {\n return endIndex >= startIndex\n ? { type: 'applyStyle', styleType, startIndex, endIndex, props }\n : NULL_MUTATION;\n}\n\nexport function addEntity(entity: EmbedEntity): Mutation {\n return { type: 'addEntity', entity };\n}\n\nexport function updateEntity(entityId: string, props: Partial<EmbedEntity>): Mutation {\n return { type: 'updateEntity', entityId, props };\n}\n\nexport function deleteEntity(entityId: string): Mutation {\n return { type: 'deleteEntity', entityId };\n}\n\nexport function addFragment(fragment: Fragment): Mutation {\n return { type: 'addFragment', fragment };\n}\n\nexport function deleteFragment(fragmentId: string): Mutation {\n return { type: 'deleteFragment', fragmentId };\n}\n\nexport function addVirtualBlock(block: VirtualBlock): Mutation {\n return { type: 'addVirtualBlock', block };\n}\n\nexport function deleteVirtualBlock(blockId: string): Mutation {\n return { type: 'deleteVirtualBlock', blockId };\n}\n\nexport function updateVirtualBlock(blockId: string, block: VirtualBlock): Mutation {\n return { type: 'updateVirtualBlock', blockId, block: { ...block, id: blockId } };\n}\n\nexport const NULL_MUTATION: NullMutation = { type: 'null' };\n\n/**\n * 把 inner 定向到某个片段。\n *\n * inner 是组合时会摊成「一串各自定向的单条」,这样 scoped 始终只包一条实操,\n * 逐条求逆和逐条变换才对得上。\n */\nexport function scoped(fragmentId: string, inner: Mutation): Mutation {\n if (inner.type === 'null') return NULL_MUTATION;\n if (inner.type === 'multi') return multi(unwrap(inner).map((m) => scoped(fragmentId, m)));\n return { type: 'scoped', fragmentId, inner };\n}\n\n/** 打包成一步。会摊平嵌套的 multi、滤掉 null;空则返回 null mutation。 */\nexport function multi(commands: Mutation[]): Mutation {\n const flat: Mutation[] = [];\n for (const c of commands) {\n if (c.type === 'null') continue;\n if (c.type === 'multi') flat.push(...unwrap(c));\n else flat.push(c);\n }\n if (flat.length === 0) return NULL_MUTATION;\n if (flat.length === 1) return flat[0];\n return { type: 'multi', commands: flat };\n}\n\n/** 摊平成一维列表,null 被滤掉。 */\nexport function unwrap(mutation: Mutation): Mutation[] {\n if (mutation.type === 'null') return [];\n if (mutation.type !== 'multi') return [mutation];\n const out: Mutation[] = [];\n for (const c of mutation.commands) out.push(...unwrap(c));\n return out;\n}\n\n/** multi 的逆序摊平。求逆时用:撤销一组操作要从最后一条倒着来。 */\nexport function reverse(mutations: Mutation[]): Mutation[] {\n return [...mutations].reverse();\n}\n","/**\n * 把 mutation 作用到文档模型上。\n *\n * 这一层是**机械写入**:不校验、不合并、不推导。所有语义判断都该在上层做完,\n * mutation 到这里时携带的已经是解析好的完整值。\n *\n * 区间语义在这里换挡:mutation 用闭区间 [start, end],\n * 文档模型用半开区间 [start, end),所以下面凡是调模型的地方都 +1。\n */\nimport { cloneEntity, StyleSpan } from '../model/types';\nimport { DocumentModel } from '../model/document';\nimport { Mutation, MutationType, unwrap } from './types';\n\nexport type ApplierFor<T extends MutationType> = (\n doc: DocumentModel,\n mutation: Extract<Mutation, { type: T }>\n) => void;\n\n/** 每种 mutation 一个 applier。少一种编译不过。 */\nexport type Appliers = { [T in MutationType]: ApplierFor<T> };\n\nexport const appliers: Appliers = {\n null: () => {},\n\n multi: (doc, mutation) => {\n for (const c of unwrap(mutation)) applyMutation(doc, c);\n },\n\n insertSpacers: (doc, mutation) => {\n doc.applyInsertSpacers(mutation.insertBeforeIndex, mutation.spacers);\n },\n\n deleteSpacers: (doc, mutation) => {\n doc.applyDeleteSpacers(mutation.startIndex, mutation.endIndex + 1);\n },\n\n applyStyle: (doc, mutation) => {\n const start = mutation.startIndex;\n const end = mutation.endIndex + 1;\n const next: StyleSpan[] = mutation.props\n ? [{ start, end, type: mutation.styleType, props: mutation.props }]\n : [];\n doc.applyStyleSpans(mutation.styleType, start, end, next);\n },\n\n addEntity: (doc, mutation) => {\n doc.entities.set(mutation.entity.id, cloneEntity(mutation.entity));\n },\n\n updateEntity: (doc, mutation) => {\n const cur = doc.entities.get(mutation.entityId);\n if (cur) doc.entities.set(mutation.entityId, cloneEntity({ ...cur, ...mutation.props }));\n },\n\n deleteEntity: (doc, mutation) => {\n doc.entities.delete(mutation.entityId);\n },\n\n addFragment: (doc, mutation) => {\n doc.applyAddFragment(mutation.fragment);\n },\n\n deleteFragment: (doc, mutation) => {\n doc.applyDeleteFragment(mutation.fragmentId);\n },\n\n addVirtualBlock: (doc, mutation) => {\n doc.applyAddVirtualBlock(mutation.block);\n },\n\n deleteVirtualBlock: (doc, mutation) => {\n doc.applyDeleteVirtualBlock(mutation.blockId);\n },\n\n updateVirtualBlock: (doc, mutation) => {\n doc.applyUpdateVirtualBlock(mutation.blockId, mutation.block);\n },\n\n // 路由到片段自己的模型上执行,然后把派生出来的 Slice 刷新一遍供引用处渲染。\n scoped: (doc, mutation) => {\n applyMutation(doc.ensureFragmentModel(mutation.fragmentId), mutation.inner);\n doc.syncFragment(mutation.fragmentId);\n }\n};\n\nexport function applyMutation(doc: DocumentModel, mutation: Mutation): void {\n // 单次转型:TS 无法把 appliers[m.type] 和 m 的类型关联起来,但查表本身是安全的。\n (appliers[mutation.type] as ApplierFor<MutationType>)(doc, mutation);\n}\n\n/** 依次应用一串 mutation。 */\nexport function applyMutations(doc: DocumentModel, mutations: Mutation[]): void {\n for (const m of mutations) applyMutation(doc, m);\n}\n","import { cloneEntity, cloneStyle, cloneVirtualBlock, Fragment, Slice } from './types';\nimport { MARKERS } from './markers';\n\nexport function cloneFragment(fragment: Fragment): Fragment {\n return {\n id: fragment.id,\n title: fragment.title,\n slice: cloneSlice(fragment.slice)\n };\n}\n\nexport function cloneSlice(slice: Slice): Slice {\n return {\n text: slice.text,\n styles: slice.styles.map(cloneStyle),\n entities: slice.entities.map(cloneEntity),\n fragments: slice.fragments?.map(cloneFragment),\n virtualBlocks: slice.virtualBlocks?.map(cloneVirtualBlock)\n };\n}\n\nexport function previewTitle(slice: Slice, max = 18): string {\n const text = slice.text.replace(/\\n+/g, ' ').replace(/\\*/g, '').trim();\n if (!text) return '未命名同步块';\n return text.length > max ? `${text.slice(0, max)}…` : text;\n}\n\nexport function normalizeFragmentSlice(slice: Slice): Slice {\n let text = slice.text;\n const styles = slice.styles.map(cloneStyle);\n if (!text.endsWith(MARKERS.PARAGRAPH)) text += MARKERS.PARAGRAPH;\n return {\n text,\n styles,\n entities: slice.entities.map(cloneEntity),\n virtualBlocks: slice.virtualBlocks?.map(cloneVirtualBlock)\n };\n}\n\nexport function sliceHasContent(slice: Slice): boolean {\n return slice.text.replace(/\\n/g, '').replace(/\\s/g, '').length > 0 || slice.entities.length > 0;\n}\n","/**\n * 求逆:给一条 mutation 算出能把它撤销掉的 mutation。\n *\n * 有的逆是纯算术(插入的逆就是删掉同样长度),有的必须先读文档\n * (删除的逆要把被删的内容原样记下来),所以求逆一律要在**应用之前**做。\n * 组合操作更要逐条交错:算第 n 条的逆 → 应用第 n 条 → 再算第 n+1 条的逆,\n * 否则后面几条的逆会建立在错误的状态上。用 applyAndInvert 就不会踩到。\n */\nimport { cloneEntity, cloneVirtualBlock, StyleSpan, StyleType } from '../model/types';\nimport { cloneFragment } from '../model/fragment';\nimport { DocumentModel } from '../model/document';\nimport { applyMutation } from './apply';\nimport {\n addEntity,\n addFragment,\n addVirtualBlock,\n applyStyle,\n deleteEntity,\n deleteFragment,\n deleteSpacers,\n deleteVirtualBlock,\n insertSpacers,\n Mutation,\n MutationType,\n multi,\n NULL_MUTATION,\n scoped,\n unwrap,\n updateEntity,\n updateVirtualBlock\n} from './types';\n\nconst STYLE_TYPES: StyleType[] = ['text', 'paragraph', 'table', 'cell', 'image', 'link'];\n\n/** 记录半开区间 [start, end) 上的全部样式,生成能原样恢复它们的 mutation。 */\nfunction restoreStyles(doc: DocumentModel, start: number, end: number): Mutation[] {\n const out: Mutation[] = [];\n for (const type of STYLE_TYPES) {\n const spans = doc.styleSpansOver(type, start, end);\n // 先清空整段,再逐段填回去 —— 否则残留的旧区间会和恢复的混在一起\n out.push(applyStyle(type, start, end - 1, null));\n for (const s of spans) out.push(applyStyle(type, s.start, s.end - 1, s.props));\n }\n return out;\n}\n\nexport type InverterFor<T extends MutationType> = (\n doc: DocumentModel,\n mutation: Extract<Mutation, { type: T }>\n) => Mutation;\n\n/** 每种 mutation 一个 inverter。少一种编译不过。 */\nexport type Inverters = { [T in MutationType]: InverterFor<T> };\n\nexport const inverters: Inverters = {\n null: () => NULL_MUTATION,\n\n multi: () => {\n throw new Error('组合操作要用 applyAndInvert 逐条交错求逆,不能整体求逆');\n },\n\n insertSpacers: (_doc, mutation) =>\n deleteSpacers(\n mutation.insertBeforeIndex,\n mutation.insertBeforeIndex + mutation.spacers.length - 1\n ),\n\n // 只管字符与样式。落在这段里的实体由 Operation 层显式发 deleteEntity,\n // 它们的逆(addEntity)自然排在这条前面,不需要在这里兜底。\n deleteSpacers: (doc, mutation) => {\n const start = mutation.startIndex;\n const end = mutation.endIndex + 1;\n const restoredBlocks = doc.virtualBlocksOverlapping(start, end).map((b) => addVirtualBlock(cloneVirtualBlock(b)));\n return multi([\n insertSpacers(start, doc.spacers.slice(start, end)),\n ...restoreStyles(doc, start, end),\n ...restoredBlocks\n ]);\n },\n\n applyStyle: (doc, mutation) =>\n multi(\n restoreStyles(doc, mutation.startIndex, mutation.endIndex + 1).filter(\n (m) => m.type === 'applyStyle' && m.styleType === mutation.styleType\n )\n ),\n\n addEntity: (doc, mutation) =>\n doc.entities.has(mutation.entity.id)\n ? updateEntity(mutation.entity.id, cloneEntity(doc.entities.get(mutation.entity.id)!))\n : deleteEntity(mutation.entity.id),\n\n updateEntity: (doc, mutation) => {\n const cur = doc.entities.get(mutation.entityId);\n if (!cur) return NULL_MUTATION;\n const before: Record<string, unknown> = {};\n for (const key of Object.keys(mutation.props)) {\n before[key] = (cur as unknown as Record<string, unknown>)[key];\n }\n return updateEntity(mutation.entityId, before as Partial<typeof cur>);\n },\n\n deleteEntity: (doc, mutation) => {\n const cur = doc.entities.get(mutation.entityId);\n return cur ? addEntity(cloneEntity(cur)) : NULL_MUTATION;\n },\n\n // 覆盖已有 id 时,逆是把旧 fragment 加回来;否则逆是删掉它。\n addFragment: (doc, mutation) => {\n const cur = doc.fragments.get(mutation.fragment.id);\n return cur ? addFragment(cloneFragment(cur)) : deleteFragment(mutation.fragment.id);\n },\n\n deleteFragment: (doc, mutation) => {\n const cur = doc.fragments.get(mutation.fragmentId);\n return cur ? addFragment(cloneFragment(cur)) : NULL_MUTATION;\n },\n\n addVirtualBlock: (doc, mutation) => {\n const cur = doc.blockById(mutation.block.id);\n return cur ? addVirtualBlock(cur) : deleteVirtualBlock(mutation.block.id);\n },\n\n updateVirtualBlock: (doc, mutation) => {\n const cur = doc.blockById(mutation.blockId);\n return cur ? updateVirtualBlock(mutation.blockId, cur) : NULL_MUTATION;\n },\n\n deleteVirtualBlock: (doc, mutation) => {\n const cur = doc.blockById(mutation.blockId);\n return cur ? addVirtualBlock(cur) : NULL_MUTATION;\n },\n\n // 在片段自己的模型上求逆,再包回同一个片段\n scoped: (doc, mutation) =>\n scoped(\n mutation.fragmentId,\n invertMutation(doc.ensureFragmentModel(mutation.fragmentId), mutation.inner)\n )\n};\n\n/**\n * 算出 mutation 的逆。必须在 mutation 被应用**之前**调用。\n * 组合操作请改用 {@link applyAndInvert}。\n */\nexport function invertMutation(doc: DocumentModel, mutation: Mutation): Mutation {\n return (inverters[mutation.type] as InverterFor<MutationType>)(doc, mutation);\n}\n\n/**\n * 应用 mutation,同时返回它的逆。\n * 组合操作会逐条交错处理,逆按相反顺序排列。\n */\nexport function applyAndInvert(doc: DocumentModel, mutation: Mutation): Mutation {\n const forward = unwrap(mutation);\n const inverses: Mutation[] = [];\n for (const m of forward) {\n inverses.unshift(invertMutation(doc, m));\n applyMutation(doc, m);\n }\n return multi(inverses);\n}\n","/**\n * 闭区间与索引变换。\n *\n * 注意区间语义:这一层全部用**闭区间** `[min, max]`,`min > max` 即为空。\n * 文档模型对外的 `deleteRange(start, end)` 用的是半开区间 `[start, end)`,\n * 两者在 mutation 的边界上转换(见 mutations.ts 的 deleteSpacers)。\n * 不要把两种语义混着用,差一位的 bug 都出在这里。\n */\n\nexport interface Range {\n min: number;\n max: number;\n}\n\n/** 空区间用 null 表示。 */\nexport type MaybeRange = Range | null;\n\nexport function newRange(min: number, max: number): MaybeRange {\n return min <= max ? { min, max } : null;\n}\n\nexport function rangeContains(range: Range, value: number): boolean {\n return value >= range.min && value <= range.max;\n}\n\nexport function rangeEquals(a: MaybeRange, b: MaybeRange): boolean {\n if (!a || !b) return a === b;\n return a.min === b.min && a.max === b.max;\n}\n\n/** 区间长度(闭区间,含两端)。 */\nexport function rangeLength(range: Range): number {\n return range.max - range.min + 1;\n}\n\n/** 把「位于 shiftPosition 及其之后」的坐标平移 offset。 */\nexport function shiftIndex(index: number, shiftPosition: number, offset: number): number {\n return index >= shiftPosition ? index + offset : index;\n}\n\n/**\n * 同上,但落在 shiftPosition 上的坐标**不动**。\n * 选区的起点要用这个:在光标处插入字符,光标不该被推走。\n */\nexport function shiftIndexExclusive(index: number, shiftPosition: number, offset: number): number {\n return index === shiftPosition ? index : shiftIndex(index, shiftPosition, offset);\n}\n\nexport function shiftRange(range: MaybeRange, shiftPosition: number, offset: number): MaybeRange {\n if (!range) return null;\n return newRange(\n shiftIndex(range.min, shiftPosition, offset),\n shiftIndex(range.max, shiftPosition, offset)\n );\n}\n\nexport function shiftRangeExclusive(range: MaybeRange, shiftPosition: number, offset: number): MaybeRange {\n if (!range) return null;\n return newRange(\n shiftIndexExclusive(range.min, shiftPosition, offset),\n shiftIndex(range.max, shiftPosition, offset)\n );\n}\n\n/** position 之前被删掉的长度。 */\nexport function leadingLength(position: number, range: Range): number {\n const leadEnd = Math.min(position - 1, range.max);\n return Math.max(0, leadEnd - range.min + 1);\n}\n\nexport function transformCoordinateAgainstDeletedRange(position: number, deleted: Range): number {\n return position - leadingLength(position, deleted);\n}\n\n/**\n * 把一个区间放到「deleted 已被删除」的坐标系里。整段被删则返回空。\n *\n * 一般情况只需把坐标减去它前面被删掉的长度;但如果端点本身落在被删范围内,\n * 这种平移不足以把它收回来,还要再多缩一位。\n */\nexport function transformRangeAgainstDeletedRange(range: MaybeRange, deleted: Range): MaybeRange {\n if (!range) return null;\n const newStart = transformCoordinateAgainstDeletedRange(range.min, deleted);\n const endpointDeleted = rangeContains(deleted, range.max);\n const newEnd = transformCoordinateAgainstDeletedRange(range.max, deleted) - (endpointDeleted ? 1 : 0);\n return newRange(newStart, newEnd);\n}\n","/**\n * OT 变换。\n *\n * `transform(a, b, aWins)` 的含义:b 已经被应用了,把 a 改写成能在「b 之后」\n * 正确执行的形式。`aWins` 是并列时的优先级 —— 两个插入落在同一个下标时,\n * 赢的一方留在原地,输的一方被推到后面。两端必须对同一对操作给出相反的\n * `aWins`,否则会各自算出不同的结果,文档就分叉了。\n */\nimport {\n ApplyStyleMutation,\n DeleteSpacersMutation,\n InsertSpacersMutation,\n Mutation,\n MutationType,\n NULL_MUTATION,\n multi,\n scoped,\n unwrap\n} from './types';\nimport {\n MaybeRange,\n newRange,\n rangeEquals,\n shiftIndex,\n shiftRange,\n transformRangeAgainstDeletedRange\n} from './ranges';\nimport { shiftVirtualBlocksOnDelete, shiftVirtualBlocksOnInsert } from '../model/virtualBlock';\n\n// ---- insert 对各类操作 ----------------------------------------------------\n\nfunction insertAgainstInsert(\n cmd: InsertSpacersMutation,\n other: InsertSpacersMutation,\n aWins: boolean\n): Mutation {\n // 并列插入:赢家不动\n if (other.insertBeforeIndex === cmd.insertBeforeIndex && aWins) return cmd;\n return {\n ...cmd,\n insertBeforeIndex: shiftIndex(cmd.insertBeforeIndex, other.insertBeforeIndex, other.spacers.length)\n };\n}\n\nfunction insertAgainstDelete(cmd: InsertSpacersMutation, other: DeleteSpacersMutation): Mutation {\n // 插入点落在被删掉的那段里 —— 锚点没了,这次插入作废\n if (other.startIndex < cmd.insertBeforeIndex && other.endIndex >= cmd.insertBeforeIndex) {\n return NULL_MUTATION;\n }\n const length = other.endIndex - other.startIndex + 1;\n return {\n ...cmd,\n insertBeforeIndex: shiftIndex(cmd.insertBeforeIndex, other.startIndex + 1, -length)\n };\n}\n\n// ---- delete 对各类操作 ----------------------------------------------------\n\nfunction deleteAgainstInsert(cmd: DeleteSpacersMutation, other: InsertSpacersMutation): Mutation {\n const shifted = shiftRange(\n newRange(cmd.startIndex, cmd.endIndex),\n other.insertBeforeIndex,\n other.spacers.length\n );\n return copyWithRange(cmd, shifted);\n}\n\nfunction deleteAgainstDelete(cmd: DeleteSpacersMutation, other: DeleteSpacersMutation): Mutation {\n const removed = transformRangeAgainstDeletedRange(newRange(cmd.startIndex, cmd.endIndex), {\n min: other.startIndex,\n max: other.endIndex\n });\n return copyWithRange(cmd, removed);\n}\n\nfunction copyWithRange(cmd: DeleteSpacersMutation, range: MaybeRange): Mutation {\n if (!range) return NULL_MUTATION;\n if (rangeEquals(range, newRange(cmd.startIndex, cmd.endIndex))) return cmd;\n return { ...cmd, startIndex: range.min, endIndex: range.max };\n}\n\n// ---- applyStyle 对各类操作 ------------------------------------------------\n// 样式区间跟着内容走,规则与 delete 的区间变换一致。\n\nfunction styleAgainstInsert(cmd: ApplyStyleMutation, other: InsertSpacersMutation): Mutation {\n const shifted = shiftRange(\n newRange(cmd.startIndex, cmd.endIndex),\n other.insertBeforeIndex,\n other.spacers.length\n );\n return copyStyleWithRange(cmd, shifted);\n}\n\nfunction styleAgainstDelete(cmd: ApplyStyleMutation, other: DeleteSpacersMutation): Mutation {\n const removed = transformRangeAgainstDeletedRange(newRange(cmd.startIndex, cmd.endIndex), {\n min: other.startIndex,\n max: other.endIndex\n });\n return copyStyleWithRange(cmd, removed);\n}\n\nfunction copyStyleWithRange(cmd: ApplyStyleMutation, range: MaybeRange): Mutation {\n if (!range) return NULL_MUTATION;\n if (rangeEquals(range, newRange(cmd.startIndex, cmd.endIndex))) return cmd;\n return { ...cmd, startIndex: range.min, endIndex: range.max };\n}\n\n// ---- 分发 ----------------------------------------------------------------\n\nexport type TransformerFor<T extends MutationType> = (\n cmd: Extract<Mutation, { type: T }>,\n other: Mutation,\n aWins: boolean\n) => Mutation;\n\n/** 每种 mutation 一个 transformer。少一种编译不过。 */\nexport type Transformers = { [T in MutationType]: TransformerFor<T> };\n\nexport const transformers: Transformers = {\n null: (cmd) => cmd,\n\n multi: (cmd, other, aWins) => multi(unwrap(cmd).map((c) => transform(c, other, aWins))),\n\n insertSpacers: (cmd, other, aWins) => {\n if (other.type === 'insertSpacers') return insertAgainstInsert(cmd, other, aWins);\n if (other.type === 'deleteSpacers') return insertAgainstDelete(cmd, other);\n return cmd;\n },\n\n deleteSpacers: (cmd, other) => {\n if (other.type === 'insertSpacers') return deleteAgainstInsert(cmd, other);\n if (other.type === 'deleteSpacers') return deleteAgainstDelete(cmd, other);\n return cmd;\n },\n\n applyStyle: (cmd, other) => {\n if (other.type === 'insertSpacers') return styleAgainstInsert(cmd, other);\n if (other.type === 'deleteSpacers') return styleAgainstDelete(cmd, other);\n return cmd;\n },\n\n // 实体操作按 id 寻址,不受下标变化影响\n addEntity: (cmd) => cmd,\n updateEntity: (cmd) => cmd,\n deleteEntity: (cmd) => cmd,\n\n // fragment 同样按 id 寻址,不占主文档坐标空间,原样放行\n addFragment: (cmd) => cmd,\n deleteFragment: (cmd) => cmd,\n\n addVirtualBlock: (cmd, other, aWins) => {\n if (other.type === 'insertSpacers') {\n const [shifted] = shiftVirtualBlocksOnInsert(\n [cmd.block],\n other.insertBeforeIndex,\n other.spacers.length\n );\n return shifted ? { ...cmd, block: shifted } : NULL_MUTATION;\n }\n if (other.type === 'deleteSpacers') {\n const shifted = shiftVirtualBlocksOnDelete([cmd.block], other.startIndex, other.endIndex + 1);\n return shifted[0] ? { ...cmd, block: shifted[0] } : NULL_MUTATION;\n }\n if (other.type === 'addVirtualBlock' && other.block.id === cmd.block.id) {\n return aWins ? cmd : other;\n }\n if (other.type === 'deleteVirtualBlock' && other.blockId === cmd.block.id) {\n return cmd;\n }\n if (other.type === 'updateVirtualBlock' && other.blockId === cmd.block.id) {\n return aWins ? cmd : { type: 'addVirtualBlock', block: other.block };\n }\n return cmd;\n },\n\n updateVirtualBlock: (cmd, other, aWins) => {\n if (other.type === 'insertSpacers') {\n const [shifted] = shiftVirtualBlocksOnInsert(\n [cmd.block],\n other.insertBeforeIndex,\n other.spacers.length\n );\n return shifted ? { ...cmd, block: shifted } : NULL_MUTATION;\n }\n if (other.type === 'deleteSpacers') {\n const shifted = shiftVirtualBlocksOnDelete([cmd.block], other.startIndex, other.endIndex + 1);\n return shifted[0] ? { ...cmd, blockId: cmd.blockId, block: shifted[0] } : NULL_MUTATION;\n }\n if (other.type === 'deleteVirtualBlock' && other.blockId === cmd.blockId) {\n return NULL_MUTATION;\n }\n if (other.type === 'updateVirtualBlock' && other.blockId === cmd.blockId) {\n return aWins ? cmd : other;\n }\n if (other.type === 'addVirtualBlock' && other.block.id === cmd.blockId) {\n return aWins ? cmd : { ...cmd, block: other.block };\n }\n return cmd;\n },\n\n deleteVirtualBlock: (cmd, other) => {\n if (other.type === 'deleteVirtualBlock' && other.blockId === cmd.blockId) return NULL_MUTATION;\n return cmd;\n },\n\n // 每个片段是独立的坐标空间。同一片段就往里递归,不同片段(或主文档的操作)\n // 天然不冲突,原样放行 —— 这是 scoped 这个设计最省事的地方。\n scoped: (cmd, other, aWins) => {\n if (other.type !== 'scoped' || other.fragmentId !== cmd.fragmentId) return cmd;\n return scoped(cmd.fragmentId, transform(cmd.inner, other.inner, aWins));\n }\n};\n\n/** 把 cmd 变换到「other 已应用」之后的坐标系里。 */\nexport function transform(cmd: Mutation, other: Mutation, aWins: boolean): Mutation {\n if (cmd.type === 'null' || other.type === 'null') return cmd;\n\n // other 是组合:把 cmd 逐条穿过去。这一步取决于 other 的类型,\n // 所以留在入口,不能塞进按 cmd.type 分派的表里。\n if (other.type === 'multi') {\n let out: Mutation = cmd;\n for (const o of unwrap(other)) out = transform(out, o, aWins);\n return out;\n }\n\n return (transformers[cmd.type] as TransformerFor<MutationType>)(cmd, other, aWins);\n}\n\n/**\n * 把一串操作变换到另一串之后。\n *\n * 关键在内层那次反向变换:a 列表里的第 i 条被 b[j] 变换的同时,b[j] 自己也要\n * 被变换后的 a[i] 推一把,否则 a 的第 i+1 条再对上 b[j] 时,b[j] 还停在旧坐标系里,\n * 结果就错了。\n */\nexport function transformCommands(a: Mutation[], b: Mutation[], aWins: boolean): Mutation[] {\n const others = [...b];\n const out: Mutation[] = [];\n for (let i = 0; i < a.length; i++) {\n let cur = a[i];\n for (let j = 0; j < others.length; j++) {\n const before = cur;\n cur = transform(before, others[j], aWins);\n others[j] = transform(others[j], before, !aWins);\n }\n out.push(cur);\n }\n return out;\n}\n\n/** 双向变换:同时得到 a'(在 b 之后执行)和 b'(在 a 之后执行)。 */\nexport function transformBoth(\n a: Mutation[],\n b: Mutation[],\n aWins = true\n): { a: Mutation[]; b: Mutation[] } {\n const others = [...b];\n const out: Mutation[] = [];\n for (let i = 0; i < a.length; i++) {\n let cur = a[i];\n for (let j = 0; j < others.length; j++) {\n const before = cur;\n cur = transform(before, others[j], aWins);\n others[j] = transform(others[j], before, !aWins);\n }\n out.push(cur);\n }\n return { a: out, b: others };\n}\n","/**\n * 选区 rebase:别人的操作落地后,把本地光标/选区挪到正确的新位置。\n *\n * 插入点正好等于光标位置时,光标推不推走由 `shiftedByInserts` 决定:\n * 本地刚敲下的字要跟着走(光标落在新字之后),而协作者在你光标处插入时\n * 你的光标应该原地不动。默认按后者。\n */\nimport { Selection } from '../model/types';\nimport { Mutation, unwrap } from './types';\nimport { shiftIndex, shiftIndexExclusive, transformCoordinateAgainstDeletedRange } from './ranges';\n\nexport function transformIndex(\n index: number,\n mutations: Mutation[],\n shiftedByInserts = false\n): number {\n let cur = index;\n for (const m of mutations) {\n if (m.type === 'insertSpacers') {\n cur = shiftedByInserts\n ? shiftIndex(cur, m.insertBeforeIndex, m.spacers.length)\n : shiftIndexExclusive(cur, m.insertBeforeIndex, m.spacers.length);\n } else if (m.type === 'deleteSpacers') {\n cur = transformCoordinateAgainstDeletedRange(cur, { min: m.startIndex, max: m.endIndex });\n } else if (m.type === 'multi') {\n cur = transformIndex(cur, unwrap(m), shiftedByInserts);\n }\n }\n return cur;\n}\n\nexport function transformSelection(\n sel: Selection,\n mutations: Mutation[],\n shiftedByInserts = false\n): Selection {\n const flat = mutations.flatMap((m) => unwrap(m));\n return {\n anchor: transformIndex(sel.anchor, flat, shiftedByInserts),\n focus: transformIndex(sel.focus, flat, shiftedByInserts)\n };\n}\n","/**\n * EditResult —— 一次用户操作的完整记录。\n *\n * 同时存**正向**和**逆向**两串 mutation:逆向是在应用正向的当时算出来的,\n * 因为很多逆操作(比如删除的逆)必须读到删之前的文档才能算。等到要撤销时\n * 再算就晚了。\n */\nimport { Selection } from '../model/types';\nimport { Mutation, reverse, unwrap } from '../mutations';\n\n/**\n * 编辑种类。新增一种编辑必须先在这里登记 —— 因为撤销的合并规则是按 kind 查的,\n * 漏登记会让新编辑落到默认的「不合并」上,症状很隐蔽。\n */\nexport type EditKind =\n | 'insert.text'\n | 'insert.paragraph'\n | 'insert.paste'\n | 'delete.backward'\n | 'delete.forward'\n | 'delete.selection'\n | 'style.text'\n | 'style.paragraph'\n | 'style.link'\n | 'embed.insert'\n | 'embed.update'\n | 'embed.resize'\n | 'embed.delete'\n | 'table.insert'\n | 'table.structure'\n | 'table.colWidth'\n | 'table.clearCells'\n | 'ref.promote'\n | 'ref.insert'\n | 'ref.unlink'\n | 'vblock.insert'\n | 'vblock.update'\n | 'vblock.remove';\n\n/**\n * 允许与相邻同类编辑合并成一步撤销的种类。\n *\n * 只有「连着做同一件事」才该合并:连续打字撤销时应该整段消失,而不是一个字\n * 一个字地退。别的都不合并 —— 尤其不能只看时间窗口,那会把「打几个字」和紧随\n * 其后的「点加粗」并成一步,撤销时文字和加粗一起没了。\n */\nconst MERGEABLE_KINDS = new Set<EditKind>([\n 'insert.text',\n 'delete.backward',\n 'delete.forward'\n]);\n\n/** 某个种类的默认合并键。同键才合并,null 表示永不合并。 */\nexport function mergeKeyFor(kind: EditKind, scope: string | null): string | null {\n if (!MERGEABLE_KINDS.has(kind)) return null;\n // 带上 scope:主文档里打字和片段里打字不是同一串输入\n return scope ? `${kind}@${scope}` : kind;\n}\n\nexport interface EditMeta {\n kind: EditKind;\n /** 相同且非 null 才允许与相邻一步合并成同一步撤销;null 表示永不合并。 */\n mergeKey: string | null;\n /** 本地产生的还是远端同步过来的。只有本地的才能被撤销。 */\n local: boolean;\n /** 是否占一步撤销。某些操作(如纯元数据变更)不占。 */\n undoable: boolean;\n /**\n * 这次编辑发生在哪个片段的坐标空间里,null 表示主文档。\n * 选区字段属于这个空间,撤销时要照它决定把选区还给谁。\n */\n scope: string | null;\n}\n\nexport interface EditResult {\n /** 正向操作 */\n mutations: Mutation[];\n /** 逆向操作,已按相反顺序排好,可直接依次执行 */\n inverse: Mutation[];\n selectionBefore: Selection;\n selectionAfter: Selection;\n meta: EditMeta;\n}\n\nexport function editMeta(init: Partial<EditMeta> & { kind: EditKind }): EditMeta {\n const scope = init.scope ?? null;\n return {\n kind: init.kind,\n mergeKey: init.mergeKey !== undefined ? init.mergeKey : mergeKeyFor(init.kind, scope),\n local: init.local ?? true,\n undoable: init.undoable ?? true,\n scope\n };\n}\n\nexport function editResult(init: {\n mutations: Mutation | Mutation[];\n inverse: Mutation | Mutation[];\n selectionBefore: Selection;\n selectionAfter: Selection;\n meta: Partial<EditMeta> & { kind: EditKind };\n}): EditResult {\n const flatten = (m: Mutation | Mutation[]) =>\n Array.isArray(m) ? m.flatMap(unwrap) : unwrap(m);\n return {\n mutations: flatten(init.mutations),\n inverse: flatten(init.inverse),\n selectionBefore: { ...init.selectionBefore },\n selectionAfter: { ...init.selectionAfter },\n meta: editMeta(init.meta)\n };\n}\n\nexport function isEmptyEdit(e: EditResult): boolean {\n return e.mutations.length === 0;\n}\n\n/**\n * 合并相邻两步(连续输入合成一步撤销)。\n *\n * 正向按时间顺序拼接;逆向要**倒过来**拼 —— 撤销一组操作得从最后一条开始退。\n * 选区取首尾:撤销后回到第一步之前的位置。\n */\nexport function mergeEdits(first: EditResult, second: EditResult): EditResult {\n return {\n mutations: [...first.mutations, ...second.mutations],\n inverse: [...second.inverse, ...first.inverse],\n selectionBefore: { ...first.selectionBefore },\n selectionAfter: { ...second.selectionAfter },\n meta: {\n ...first.meta,\n local: first.meta.local && second.meta.local,\n undoable: first.meta.undoable || second.meta.undoable\n }\n };\n}\n\n/** 交换正逆两串,得到「撤销这一步」本身作为一步操作。 */\nexport function invertEdit(e: EditResult): EditResult {\n return {\n mutations: e.inverse,\n inverse: reverse(e.mutations),\n selectionBefore: { ...e.selectionAfter },\n selectionAfter: { ...e.selectionBefore },\n meta: { ...e.meta }\n };\n}\n","/**\n * Operation 的执行上下文。\n *\n * Operation 通过 `emit` 改文档,通过 `doc` 读文档。`emit` 是**立即生效**的 ——\n * 发一条就写一条,所以同一个 Operation 里后续的读能看到前面的效果。复杂操作\n * 因此可以「读—写—再读」,比如先插入换行、再读出新的段落边界、再给新段落发样式。\n *\n * 逆操作在写入**之前**算出来(很多逆必须读到变更前的文档),正逆两串一起收集。\n */\nimport { DocumentModel } from '../model/document';\nimport { Selection } from '../model/types';\nimport { Mutation, applyMutation, invertMutation, scoped, unwrap } from '../mutations';\n\nexport interface OperationContext {\n /** 读文档。写只能走 emit */\n readonly doc: DocumentModel;\n /** 当前选区 */\n selection(): Selection;\n /** 移动选区。不产生 mutation */\n select(next: Selection): void;\n /** 发一条 mutation:先求逆、立即写入、正逆两串都收集 */\n emit(mutation: Mutation): void;\n}\n\n/** Operation 就是一个拿 context 的函数。组合就是传同一个 ctx 下去。 */\nexport type Operation<R = void> = (ctx: OperationContext) => R;\n\nexport interface OperationRun {\n /** 正向操作,按执行顺序 */\n forward: Mutation[];\n /** 逆向操作,已按相反顺序排好 */\n inverse: Mutation[];\n selectionBefore: Selection;\n selectionAfter: Selection;\n}\n\nclass Collector implements OperationContext {\n readonly forward: Mutation[] = [];\n readonly inverse: Mutation[] = [];\n private sel: Selection;\n\n constructor(readonly doc: DocumentModel, selection: Selection) {\n this.sel = { ...selection };\n }\n\n selection(): Selection {\n return { ...this.sel };\n }\n\n select(next: Selection) {\n this.sel = { ...next };\n }\n\n emit(mutation: Mutation) {\n // unwrap 把 multi 摊平、把 null 滤掉,所以下面只面对单条实操\n for (const one of unwrap(mutation)) {\n this.inverse.unshift(invertMutation(this.doc, one));\n applyMutation(this.doc, one);\n this.forward.push(one);\n }\n }\n}\n\n/**\n * 把上下文切到某个片段(同步块)的坐标空间。\n *\n * 片段有自己的一条字符流,下标从 0 起,和主文档不共享。切过去之后,所有\n * Operation 都能原样复用 —— 它们读到的是片段模型,发出的 mutation 自动包上\n * `scoped`,落进的还是外层那一份操作串。选区共用外层的格子,因为调用方一开始\n * 就是拿片段选区起的事务。\n */\nexport function scopeContext(outer: OperationContext, fragmentId: string): OperationContext {\n return {\n doc: outer.doc.ensureFragmentModel(fragmentId),\n selection: () => outer.selection(),\n select: (next) => outer.select(next),\n emit: (mutation) => outer.emit(scoped(fragmentId, mutation))\n };\n}\n\n/** 跑一个 Operation,拿到它产生的操作串与选区变化。 */\nexport function runOperation<R>(\n doc: DocumentModel,\n selection: Selection,\n op: Operation<R>\n): { run: OperationRun; result: R } {\n const ctx = new Collector(doc, selection);\n const result = op(ctx);\n return {\n run: {\n forward: ctx.forward,\n inverse: ctx.inverse,\n selectionBefore: { ...selection },\n selectionAfter: ctx.selection()\n },\n result\n };\n}\n","/**\n * 解析助手:Operation 层「读模型 → 判断」的那一半。\n *\n * mutation 携带的必须是完整解析过的值,不能是补丁。谁负责把「用户想加粗」\n * 变成「这段的完整文字属性是 {bold:true, size:16, color:'#111'}」?就是这里。\n * 这些函数只读文档,不写文档。\n */\nimport { parseBlocks } from '../model/blocks';\nimport { DocumentModel } from '../model/document';\nimport { isTableMarker, MARKERS } from '../model/markers';\nimport { DEFAULT_PARAGRAPH, ParagraphProps, StyleSpan, StyleType, TextProps } from '../model/types';\n\n/** 落在 index 处的完整文字属性。没有区间时是空对象,代表「未着色」。 */\nexport function resolveTextProps(doc: DocumentModel, index: number): TextProps {\n return doc.textPropsAt(index);\n}\n\n/** 落在 index 所属段落上的完整段落属性,缺省项补齐。 */\nexport function resolveParagraphProps(doc: DocumentModel, index: number): ParagraphProps {\n return doc.paragraphPropsAt(index);\n}\n\n/** 半开区间 [start, end) 内是否只有结构标记(段分隔、表格骨架、图片占位)。 */\nexport function rangeIsOnlyMarkers(doc: DocumentModel, start: number, end: number): boolean {\n for (let i = start; i < end; i++) {\n const ch = doc.spacers[i];\n if (ch === MARKERS.IMAGE) continue;\n if (ch !== MARKERS.PARAGRAPH && !isTableMarker(ch)) return false;\n }\n return true;\n}\n\n/** 一段文本里「真正是内容」的片段,用来给新插入的字上色时跳过结构标记。 */\nexport function contentRuns(text: string, base: number): [number, number][] {\n const runs: [number, number][] = [];\n let runStart = -1;\n for (let i = 0; i < text.length; i++) {\n const ch = text[i];\n const content = ch !== MARKERS.PARAGRAPH && !isTableMarker(ch);\n if (content && runStart < 0) runStart = base + i;\n if (!content && runStart >= 0) {\n runs.push([runStart, base + i]);\n runStart = -1;\n }\n }\n if (runStart >= 0) runs.push([runStart, base + text.length]);\n return runs;\n}\n\n/**\n * 把半开区间 [from, to) 按「已有 text 区间的边界」切成若干小段。\n * 每段要么整段落在某个已有区间里(带上它,属性要在它基础上合并),\n * 要么是空档(属性从零起)。这是文字上色能算出完整值的前提。\n */\nexport function textSegments(\n doc: DocumentModel,\n from: number,\n to: number\n): { start: number; end: number; existing: StyleSpan | null }[] {\n const points = new Set<number>([from, to]);\n for (const s of doc.styles) {\n if (s.type !== 'text' || s.end <= from || s.start >= to) continue;\n if (s.start > from && s.start < to) points.add(s.start);\n if (s.end > from && s.end < to) points.add(s.end);\n }\n const sorted = [...points].sort((a, b) => a - b);\n const out: { start: number; end: number; existing: StyleSpan | null }[] = [];\n for (let k = 0; k < sorted.length - 1; k++) {\n const start = sorted[k];\n const end = sorted[k + 1];\n if (start >= end) continue;\n const existing =\n doc.styles.find((s) => s.type === 'text' && s.start <= start && s.end >= end) ?? null;\n out.push({ start, end, existing });\n }\n return out;\n}\n\n/** 某一类样式里,完整覆盖 [start, end) 的那条区间。 */\nexport function spanCovering(\n doc: DocumentModel,\n type: StyleType,\n start: number,\n end: number\n): StyleSpan | null {\n return doc.styles.find((s) => s.type === type && s.start <= start && s.end >= end) ?? null;\n}\n\n/**\n * 按当前字符流算出「段落区间应该长什么样」。\n *\n * 段分隔符一插一删,段落的边界就变了。这里从块结构重新推导出该有的一组\n * paragraph 区间,属性尽量沿用原来落在同一位置的那条 —— 这就是回车后新段\n * 能继承缩进和列表状态的原因。\n */\nexport function expectedParagraphSpans(doc: DocumentModel): StyleSpan[] {\n const out: StyleSpan[] = [];\n const inherit = (start: number, end: number): StyleSpan => {\n const existing =\n doc.styles.find((s) => s.type === 'paragraph' && s.start === start && s.end === end) ??\n doc.styles.find(\n (s) => s.type === 'paragraph' && s.start < end && s.end > start && s.start >= start\n );\n return {\n start,\n end,\n type: 'paragraph',\n props: { ...DEFAULT_PARAGRAPH, ...(existing?.props as ParagraphProps | undefined) }\n };\n };\n for (const block of parseBlocks(doc.spacers)) {\n if (block.kind === 'paragraph') {\n out.push(inherit(block.start, block.end));\n } else {\n for (const row of block.rows) {\n for (const cell of row.cells) {\n for (const para of cell.paragraphs) {\n if (para.end > para.start) out.push(inherit(para.start, para.end));\n }\n }\n }\n }\n }\n return out.sort((a, b) => a.start - b.start || a.end - b.end);\n}\n","/**\n * Operation 层的低级发射助手。\n *\n * 这些不是 mutation,也不是完整的 Operation,而是介于两者之间的常用动作:\n * 「删一段字符流并顺手清掉附着的实体」「把段落区间重新对齐到块结构」之类。\n * 它们只通过 ctx.emit 改文档,所以每一步都进日志、都能被撤销和变换。\n */\nimport { Slice, StyleSpan, StyleType, TextProps } from '../model/types';\nimport {\n applyStyle,\n deleteEntity,\n deleteSpacers,\n insertSpacers,\n multi,\n Mutation\n} from '../mutations';\nimport { MARKERS } from '../model/markers';\nimport { OperationContext } from './context';\nimport { expectedParagraphSpans, rangeIsOnlyMarkers, textSegments } from './resolve';\n\nconst EMPTY_SLICE: Slice = { text: '', styles: [], entities: [] };\n\n/** 在 index 处插入原始 spacer 串。不做任何段落推导。 */\nexport function emitInsert(ctx: OperationContext, index: number, text: string): number {\n const i = ctx.doc.clamp(index);\n if (!text) return i;\n ctx.emit(insertSpacers(i, text));\n return i + text.length;\n}\n\n/**\n * 删掉半开区间 [start, end),返回被删内容。\n *\n * 落在区间里的实体会显式发一条 deleteEntity —— 让实体的消失也是一条 mutation,\n * 而不是删字符的隐式副作用,否则撤销和协同都对不上账。\n */\nexport function emitDelete(ctx: OperationContext, start: number, end: number): Slice {\n const from = ctx.doc.clamp(Math.min(start, end));\n const to = ctx.doc.clamp(Math.max(start, end));\n if (to <= from) return EMPTY_SLICE;\n const slice = ctx.doc.takeSlice(from, to);\n for (const e of slice.entities) ctx.emit(deleteEntity(e.id));\n ctx.emit(deleteSpacers(from, to - 1));\n return slice;\n}\n\n/** 给半开区间 [start, end) 覆盖一条样式区间。props 必须已解析完整。 */\nexport function emitStyle(\n ctx: OperationContext,\n type: StyleType,\n start: number,\n end: number,\n props: StyleSpan['props'] | null\n) {\n if (end <= start) return;\n ctx.emit(applyStyle(type, start, end - 1, props));\n}\n\n/**\n * 文字上色。把区间按已有区间边界切段,每段各自算出**合并后的完整属性**再发。\n * 纯结构标记的空档不上色,免得给段分隔符染上颜色。\n */\nexport function emitTextStyle(ctx: OperationContext, start: number, end: number, patch: TextProps) {\n const from = ctx.doc.clamp(Math.min(start, end));\n const to = ctx.doc.clamp(Math.max(start, end));\n if (from >= to) return;\n const out: Mutation[] = [];\n for (const seg of textSegments(ctx.doc, from, to)) {\n if (seg.existing) {\n out.push(applyStyle('text', seg.start, seg.end - 1, { ...(seg.existing.props as TextProps), ...patch }));\n } else if (!rangeIsOnlyMarkers(ctx.doc, seg.start, seg.end)) {\n out.push(applyStyle('text', seg.start, seg.end - 1, { ...patch }));\n }\n }\n ctx.emit(multi(out));\n}\n\n/**\n * 把 paragraph 区间重新对齐到当前块结构,只发实际有出入的那一段。\n *\n * 从前这是模型在删字符时偷偷做的,逆操作里没有记录,所以撤销要靠整篇比对样式。\n * 现在它是显式的 applyStyle,逆自然就跟着有了。\n */\nexport function normalizeParagraphs(ctx: OperationContext) {\n const doc = ctx.doc;\n // 全选删除会把最后一个段分隔符一并清掉,文档变成空串。之后再打字第一次回车\n // 只会补上这个收口符,视觉上仍是一行;必须在这里把空文档收成一段 `\\n`。\n if (!doc.spacers.endsWith(MARKERS.PARAGRAPH)) {\n emitInsert(ctx, doc.spacers.length, MARKERS.PARAGRAPH);\n }\n const needed = expectedParagraphSpans(doc);\n const current = doc.styles\n .filter((s) => s.type === 'paragraph')\n .sort((a, b) => a.start - b.start || a.end - b.end);\n\n const key = (s: StyleSpan) => `${s.start}:${s.end}:${JSON.stringify(s.props)}`;\n const needKeys = new Set(needed.map(key));\n const curKeys = new Set(current.map(key));\n const differing = [\n ...current.filter((s) => !needKeys.has(key(s))),\n ...needed.filter((s) => !curKeys.has(key(s)))\n ];\n if (differing.length === 0) return;\n\n // 清除范围要囊括每一条与之相交的目标区间,否则会把某段从中间切断。\n let from = Math.min(...differing.map((s) => s.start));\n let to = Math.max(...differing.map((s) => s.end));\n for (let guard = 0; guard < 8; guard++) {\n let grew = false;\n for (const s of needed) {\n if (s.start < to && s.end > from) {\n if (s.start < from) {\n from = s.start;\n grew = true;\n }\n if (s.end > to) {\n to = s.end;\n grew = true;\n }\n }\n }\n if (!grew) break;\n }\n\n const out: Mutation[] = [applyStyle('paragraph', from, to - 1, null)];\n for (const s of needed) {\n if (s.end <= from || s.start >= to) continue;\n out.push(applyStyle('paragraph', s.start, s.end - 1, s.props));\n }\n ctx.emit(multi(out));\n}\n\n/** 文档尾部必须有一个段分隔符收口,插表格之后要补。 */\nexport function ensureParagraphAfter(ctx: OperationContext, index: number) {\n if (index < ctx.doc.spacers.length) return;\n emitInsert(ctx, index, MARKERS.PARAGRAPH);\n}\n","/**\n * 样式类 Operation。\n *\n * 这一组最能说明 Operation 层存在的意义:用户表达的是补丁(「加粗」),\n * mutation 要求的是完整值(「这段的文字属性是 …」)。中间那步解析在这里做。\n */\nimport { paragraphsIntersecting } from '../model/blocks';\nimport { DEFAULT_TEXT, LINK_COLOR, ParagraphProps, TextProps } from '../model/types';\nimport { Operation } from './context';\nimport { emitStyle, emitTextStyle, normalizeParagraphs } from './primitives';\nimport { resolveParagraphProps } from './resolve';\n\n/** 给半开区间 [start, end) 打文字样式补丁。 */\nexport function applyTextStyle(start: number, end: number, patch: TextProps): Operation {\n return (ctx) => {\n emitTextStyle(ctx, start, end, patch);\n };\n}\n\n/**\n * 给区间套链接。\n *\n * 与之相交的旧链接要整条清掉(而不是只清重叠部分),否则会留下半截尾巴 ——\n * 所以清除范围先向外扩到覆盖所有相交的链接区间。\n */\nexport function applyLink(start: number, end: number, url: string): Operation {\n return (ctx) => {\n const from = ctx.doc.clamp(Math.min(start, end));\n const to = ctx.doc.clamp(Math.max(start, end));\n if (from >= to || !url) return;\n\n let clearFrom = from;\n let clearTo = to;\n for (const s of ctx.doc.styles) {\n if (s.type !== 'link' || s.start >= to || s.end <= from) continue;\n clearFrom = Math.min(clearFrom, s.start);\n clearTo = Math.max(clearTo, s.end);\n }\n emitStyle(ctx, 'link', clearFrom, clearTo, null);\n emitStyle(ctx, 'link', from, to, { url });\n emitTextStyle(ctx, from, to, { color: LINK_COLOR, underline: true });\n };\n}\n\n/** 摘掉落在 index 处的链接,顺带把链接色和下划线还原成默认。 */\nexport function removeLink(index: number): Operation {\n return (ctx) => {\n const span = ctx.doc.linkSpanAt(index);\n if (!span) return;\n const { start, end } = span;\n emitStyle(ctx, 'link', start, end, null);\n emitTextStyle(ctx, start, end, { color: DEFAULT_TEXT.color, underline: false });\n };\n}\n\n/**\n * 给区间覆盖到的每个段落打段落样式补丁。\n *\n * 段落属性是整段一个值,所以逐段读出现值、合并补丁、整段覆盖回去。\n */\nexport function applyParagraphStyle(start: number, end: number, patch: ParagraphProps): Operation {\n return (ctx) => {\n for (const para of paragraphsIntersecting(ctx.doc.spacers, start, end)) {\n const next = { ...resolveParagraphProps(ctx.doc, para.start), ...patch };\n emitStyle(ctx, 'paragraph', para.start, para.end, next);\n }\n normalizeParagraphs(ctx);\n };\n}\n","import { HeadingLevel, ListKind, TextProps } from '../model/types';\n\n/** 常用 Markdown 输入的即时识别规则。 */\nexport type MarkdownHit =\n | { kind: 'heading'; level: HeadingLevel; consume: number }\n | { kind: 'list'; list: ListKind; consume: number }\n | { kind: 'code-block'; consume: number; language: string }\n | { kind: 'formula'; matchStart: number; matchEnd: number; latex: string; displayMode: boolean }\n | {\n kind: 'text';\n style: TextProps;\n matchStart: number;\n matchEnd: number;\n inner: string;\n };\n\nconst RULES: Array<{ type: string; reg: RegExp }> = [\n { type: 'CODE_BLOCK', reg: /^```(\\w*)\\s$/ },\n { type: 'FORMULA_BLOCK', reg: /\\$\\$([^$]+)\\$\\$\\s$/ },\n { type: 'FORMULA', reg: /\\$([^$\\n]+)\\$\\s$/ },\n { type: 'BOLD', reg: /\\*{2}.+\\*{2}\\s$/ },\n { type: 'STRIKETHROUGH', reg: /[~~]{2}.+[~~]{2}\\s$/ },\n { type: 'UNDER_LINE', reg: /[~~].+[~~]\\s$/ },\n { type: 'HEADING3', reg: /^#{3}\\s$/ },\n { type: 'HEADING2', reg: /^#{2}\\s$/ },\n { type: 'HEADING1', reg: /^#\\s$/ },\n { type: 'NUMBERED_LIST', reg: /^\\d+\\.\\s$/ },\n { type: 'BULLETED_LIST', reg: /^(-|\\*|\\+)\\s$/ },\n { type: 'ITALIC', reg: /\\*.+\\*\\s$/ }\n];\n\nfunction lastMatch(text: string, reg: RegExp): RegExpMatchArray | null {\n const m = text.match(reg);\n return m && m[0] ? m : null;\n}\n\nexport function matchMarkdown(paraText: string): MarkdownHit | null {\n for (const rule of RULES) {\n const m = lastMatch(paraText, rule.reg);\n if (!m) continue;\n const full = m[0];\n const matchStart = paraText.lastIndexOf(full);\n const matchEnd = matchStart + full.length;\n\n if (rule.type === 'CODE_BLOCK') {\n return { kind: 'code-block', consume: full.length, language: (m[1] || 'plain').toLowerCase() };\n }\n if (rule.type === 'FORMULA_BLOCK') {\n return { kind: 'formula', matchStart, matchEnd, latex: m[1] ?? '', displayMode: true };\n }\n if (rule.type === 'FORMULA') {\n return { kind: 'formula', matchStart, matchEnd, latex: m[1] ?? '', displayMode: false };\n }\n if (rule.type === 'HEADING1') return { kind: 'heading', level: 1, consume: full.length };\n if (rule.type === 'HEADING2') return { kind: 'heading', level: 2, consume: full.length };\n if (rule.type === 'HEADING3') return { kind: 'heading', level: 3, consume: full.length };\n if (rule.type === 'NUMBERED_LIST') return { kind: 'list', list: 'ol', consume: full.length };\n if (rule.type === 'BULLETED_LIST') return { kind: 'list', list: 'ul', consume: full.length };\n\n if (rule.type === 'BOLD') {\n return { kind: 'text', style: { bold: true }, matchStart, matchEnd, inner: full.slice(2, full.length - 3) };\n }\n if (rule.type === 'ITALIC') {\n return { kind: 'text', style: { italic: true }, matchStart, matchEnd, inner: full.slice(1, full.length - 2) };\n }\n if (rule.type === 'UNDER_LINE') {\n return { kind: 'text', style: { underline: true }, matchStart, matchEnd, inner: full.slice(1, full.length - 2) };\n }\n if (rule.type === 'STRIKETHROUGH') {\n return {\n kind: 'text',\n style: { strikethrough: true },\n matchStart,\n matchEnd,\n inner: full.slice(2, full.length - 3)\n };\n }\n }\n return null;\n}\n\nexport function shouldTryMarkdown(inserted: string): boolean {\n if (!inserted) return false;\n const ch = inserted[inserted.length - 1];\n return ch === ' ' || ch === '-' || ch === '*' || ch === '`' || ch === '$';\n}\n","/**\n * 文档模型 —— 状态本身,不含任何编辑语义。\n *\n * 这一层只做两件事:\n * 1. **读**。给上层提供「index 处的文字属性是什么」「这段字符流长什么样」之类的查询。\n * 2. **落地 mutation**。四个 `apply*` 方法是 mutation applier 唯一的着陆点,\n * 它们是机械动作:挪坐标、写字段,不做判断、不推导、不补救。\n *\n * 「打字要继承左边的样式」「删掉段分隔符后段落边界要重算」这类判断一律不在这里,\n * 而在 Operation 层(src/operations/)。模型不偷偷改自己,是撤销和协同能对上账的前提。\n *\n * fragment(同步块)的增删也走 mutation:addFragment / deleteFragment 落到\n * applyAddFragment / applyDeleteFragment 上,和 entity 一样按 id 寻址、不占坐标空间。\n */\nimport { findParagraphAt, findTableAt, parseBlocks } from './blocks';\nimport { isTableMarker, MARKERS } from './markers';\nimport { cloneFragment, normalizeFragmentSlice, previewTitle } from './fragment';\nimport {\n cloneEntity,\n cloneStyle,\n cloneVirtualBlock,\n DEFAULT_PARAGRAPH,\n Fragment,\n ImageEntity,\n ImageProps,\n ParagraphProps,\n Selection,\n Slice,\n StyleSpan,\n StyleType,\n TableProps,\n TextProps,\n textPropsEqual,\n VirtualBlock\n} from './types';\nimport {\n clipVirtualBlocks,\n shiftVirtualBlocksOnDelete,\n shiftVirtualBlocksOnInsert,\n sortOuterToInner\n} from './virtualBlock';\n\nlet entitySeq = 1;\nlet fragmentSeq = 1;\nlet virtualBlockSeq = 1;\n\nexport function nextEntityId(): string {\n return `emb_${entitySeq++}`;\n}\n\nexport function nextFragmentId(): string {\n return `frag_${fragmentSeq++}`;\n}\n\nexport function nextVirtualBlockId(): string {\n return `vb_${virtualBlockSeq++}`;\n}\n\nexport type DocSnapshot = {\n spacers: string;\n styles: StyleSpan[];\n entities: ImageEntity[];\n fragments: Fragment[];\n virtualBlocks: VirtualBlock[];\n};\n\nexport class DocumentModel {\n spacers = '\\n';\n styles: StyleSpan[] = [{ start: 0, end: 1, type: 'paragraph', props: { ...DEFAULT_PARAGRAPH } }];\n entities = new Map<string, ImageEntity>();\n fragments = new Map<string, Fragment>();\n virtualBlocks = new Map<string, VirtualBlock>();\n private fragmentModels = new Map<string, DocumentModel>();\n\n constructor(initial?: {\n spacers: string;\n styles: StyleSpan[];\n entities?: ImageEntity[];\n fragments?: Fragment[];\n virtualBlocks?: VirtualBlock[];\n }) {\n if (initial) {\n this.spacers = initial.spacers;\n this.styles = initial.styles.map(cloneStyle);\n this.entities = new Map((initial.entities ?? []).map((e) => [e.id, cloneEntity(e)]));\n this.fragments = new Map((initial.fragments ?? []).map((f) => [f.id, cloneFragment(f)]));\n this.virtualBlocks = new Map((initial.virtualBlocks ?? []).map((b) => [b.id, cloneVirtualBlock(b)]));\n }\n }\n\n /** 未写 text span 时的默认字号/颜色。嵌入式输入框可覆盖文档编辑器的 16px 默认。 */\n textDefaults: TextProps | null = null;\n\n get length(): number {\n return this.spacers.length;\n }\n\n clamp(index: number): number {\n return Math.max(0, Math.min(index, this.spacers.length));\n }\n\n // ---- mutation 落地点 ----------------------------------------------------\n // 只给 mutation applier 用。别的地方要改文档,请发 mutation。\n\n /** insertSpacers 的落地:插入字符,已有样式区间跟着挪。 */\n applyInsertSpacers(index: number, text: string) {\n if (!text) return;\n const i = this.clamp(index);\n this.spacers = this.spacers.slice(0, i) + text + this.spacers.slice(i);\n this.styles = shiftStylesOnInsert(this.styles, i, text.length);\n this.replaceVirtualBlocks(shiftVirtualBlocksOnInsert(this.virtualBlocks.values(), i, text.length));\n }\n\n /** deleteSpacers 的落地(半开区间):删字符,样式区间跟着裁剪与前挪。 */\n applyDeleteSpacers(start: number, end: number) {\n const from = this.clamp(Math.min(start, end));\n const to = this.clamp(Math.max(start, end));\n if (to <= from) return;\n this.spacers = this.spacers.slice(0, from) + this.spacers.slice(to);\n this.styles = shiftStylesOnDelete(this.styles, from, to);\n this.replaceVirtualBlocks(shiftVirtualBlocksOnDelete(this.virtualBlocks.values(), from, to));\n }\n\n /** addVirtualBlock 的落地:同 id 则整体替换。 */\n applyAddVirtualBlock(block: VirtualBlock) {\n this.virtualBlocks.set(block.id, cloneVirtualBlock(block));\n }\n\n applyDeleteVirtualBlock(blockId: string) {\n this.virtualBlocks.delete(blockId);\n }\n\n applyUpdateVirtualBlock(blockId: string, block: VirtualBlock) {\n if (!this.virtualBlocks.has(blockId)) return;\n this.virtualBlocks.set(blockId, cloneVirtualBlock({ ...block, id: blockId }));\n }\n\n /**\n * applyStyle 的落地(半开区间):把某类样式在这段里整体换成给定的一组区间。\n * 语义是**覆盖**不是合并补丁,所以传进来的 props 必须已经解析完整。\n */\n /** addFragment 的落地:把整份 fragment 写入。已打开过的派生模型作废重建。 */\n applyAddFragment(fragment: Fragment) {\n this.fragments.set(fragment.id, cloneFragment(fragment));\n this.fragmentModels.delete(fragment.id);\n }\n\n /** deleteFragment 的落地:移除 fragment 及其派生模型。 */\n applyDeleteFragment(fragmentId: string) {\n this.fragments.delete(fragmentId);\n this.fragmentModels.delete(fragmentId);\n }\n\n applyStyleSpans(type: StyleType, start: number, end: number, next: StyleSpan[]) {\n // 横跨区间边界的区间要在边界处裁开保留两头,不能整条抹掉。\n const kept: StyleSpan[] = [];\n for (const s of this.styles) {\n if (s.type !== type || s.end <= start || s.start >= end) {\n kept.push(s);\n continue;\n }\n if (s.start < start) kept.push(cloneStyle({ ...s, start: s.start, end: start }));\n if (s.end > end) kept.push(cloneStyle({ ...s, start: end, end: s.end }));\n }\n this.styles = kept.concat(next.map(cloneStyle));\n this.mergeStyles();\n }\n\n // ---- 快照 --------------------------------------------------------------\n\n snapshot(): DocSnapshot {\n for (const id of this.fragmentModels.keys()) this.syncFragment(id);\n return {\n spacers: this.spacers,\n styles: this.styles.map(cloneStyle),\n entities: [...this.entities.values()].map(cloneEntity),\n fragments: [...this.fragments.values()].map(cloneFragment),\n virtualBlocks: this.listVirtualBlocks()\n };\n }\n\n restore(snap: DocSnapshot) {\n this.spacers = snap.spacers;\n this.styles = snap.styles.map(cloneStyle);\n this.entities = new Map(snap.entities.map((e) => [e.id, cloneEntity(e)]));\n this.fragments = new Map((snap.fragments ?? []).map((f) => [f.id, cloneFragment(f)]));\n this.virtualBlocks = new Map((snap.virtualBlocks ?? []).map((b) => [b.id, cloneVirtualBlock(b)]));\n this.fragmentModels.clear();\n }\n\n // ---- 读 ----------------------------------------------------------------\n\n /** 取半开区间 [start, end) 的内容副本,含落在里面的实体与它们引用的同步块。 */\n takeSlice(start: number, end: number): Slice {\n const from = this.clamp(Math.min(start, end));\n const to = this.clamp(Math.max(start, end));\n const text = this.spacers.slice(from, to);\n const styles = this.styles\n .filter((s) => s.end > from && s.start < to)\n .map((s) => ({\n ...cloneStyle(s),\n start: Math.max(0, s.start - from),\n end: Math.min(s.end, to) - from\n }))\n .filter((s) => s.end > s.start);\n const entities: ImageEntity[] = [];\n const fragmentIds = new Set<string>();\n for (const s of this.styles) {\n if (s.type === 'image' && s.start >= from && s.end <= to) {\n const id = (s.props as { entityId: string }).entityId;\n const e = this.entities.get(id);\n if (e) {\n entities.push(cloneEntity(e));\n if (e.kind === 'ref' && e.fragmentId) fragmentIds.add(e.fragmentId);\n }\n }\n }\n const fragments = [...fragmentIds]\n .map((id) => this.fragments.get(id))\n .filter((f): f is Fragment => !!f)\n .map(cloneFragment);\n const virtualBlocks = clipVirtualBlocks(this.virtualBlocks.values(), from, to);\n return { text, styles, entities, fragments, virtualBlocks };\n }\n\n /**\n * 读出某类样式在半开区间 [start, end) 内的分布,边缘按区间裁剪。\n * 求 applyStyle 的逆操作时用来记录「原来长什么样」。\n */\n styleSpansOver(type: StyleType, start: number, end: number): StyleSpan[] {\n return this.styles\n .filter((s) => s.type === type && s.start < end && s.end > start)\n .map((s) => cloneStyle({ ...s, start: Math.max(s.start, start), end: Math.min(s.end, end) }))\n .filter((s) => s.end > s.start)\n .sort((a, b) => a.start - b.start);\n }\n\n imageAt(index: number): ImageEntity | null {\n const span = this.imageSpanAt(index);\n if (!span) return null;\n return this.entities.get((span.props as { entityId: string }).entityId) ?? null;\n }\n\n imageSpanAt(index: number): StyleSpan | null {\n return this.styles.find((s) => s.type === 'image' && s.start <= index && index < s.end) ?? null;\n }\n\n textPropsAt(index: number): TextProps {\n const i = this.clamp(index);\n const probe = i > 0 ? i - 1 : i;\n const span = this.styles.find((s) => s.type === 'text' && s.start <= probe && probe < s.end);\n return span ? { ...(span.props as TextProps) } : {};\n }\n\n paragraphPropsAt(index: number): ParagraphProps {\n const para = findParagraphAt(this.spacers, index);\n if (!para) return { ...DEFAULT_PARAGRAPH };\n const span =\n this.styles.find((s) => s.type === 'paragraph' && s.start === para.start && s.end === para.end) ??\n this.styles.find((s) => s.type === 'paragraph' && s.start < para.end && s.end > para.start);\n return { ...DEFAULT_PARAGRAPH, ...(span?.props as ParagraphProps | undefined) };\n }\n\n linkSpanAt(index: number): StyleSpan | null {\n const i = this.clamp(index);\n const probe = i > 0 ? i - 1 : i;\n return this.styles.find((s) => s.type === 'link' && s.start <= probe && probe < s.end) ?? null;\n }\n\n linkUrlAt(index: number): string | null {\n const span = this.linkSpanAt(index);\n return span ? (span.props as { url: string }).url : null;\n }\n\n tablePropsAt(index: number): TableProps {\n const table = findTableAt(this.spacers, index);\n if (!table) return {};\n const span = this.styles.find((s) => s.type === 'table' && s.start <= table.start && s.end >= table.end);\n return { ...(span?.props as TableProps | undefined) };\n }\n\n /** 半开区间 [start, end) 的可读文本,结构标记被剔除,图片算一个空格。 */\n plainText(start: number, end: number): string {\n const from = this.clamp(Math.min(start, end));\n const to = this.clamp(Math.max(start, end));\n let out = '';\n for (let i = from; i < to; i++) {\n const ch = this.spacers[i];\n if (ch === MARKERS.IMAGE) out += ' ';\n else if (!isTableMarker(ch)) out += ch;\n }\n return out;\n }\n\n // ---- 同步块 ------------------------------------------------------------\n\n /**\n * 构造一份新的 fragment(分配 id、规范化 slice),但**不写模型**。\n * 落地由 addFragment mutation 完成,这样提取同步块能进撤销栈、走协同。\n */\n buildFragment(slice: Slice, title?: string): Fragment {\n const normalized = normalizeFragmentSlice(slice);\n return { id: nextFragmentId(), title: title || previewTitle(normalized), slice: normalized };\n }\n\n ensureFragmentModel(id: string): DocumentModel {\n let model = this.fragmentModels.get(id);\n if (model) return model;\n const fragment = this.fragments.get(id);\n model = documentFromSlice(fragment?.slice ?? { text: MARKERS.PARAGRAPH, styles: [], entities: [] });\n this.fragmentModels.set(id, model);\n return model;\n }\n\n syncFragment(id: string) {\n const model = this.fragmentModels.get(id);\n const fragment = this.fragments.get(id);\n if (!model || !fragment) return;\n fragment.slice = sliceFromDocument(model);\n fragment.title = previewTitle(fragment.slice);\n }\n\n listFragments(): Fragment[] {\n for (const id of this.fragmentModels.keys()) this.syncFragment(id);\n return [...this.fragments.values()].map(cloneFragment);\n }\n\n refIndices(fragmentId: string): number[] {\n const hits: number[] = [];\n for (let i = 0; i < this.spacers.length; i++) {\n if (this.spacers[i] !== MARKERS.IMAGE) continue;\n if (this.imageAt(i)?.fragmentId === fragmentId) hits.push(i);\n }\n return hits;\n }\n\n refCount(fragmentId: string): number {\n return this.refIndices(fragmentId).length;\n }\n\n rangeHasRef(start: number, end: number): boolean {\n const from = this.clamp(Math.min(start, end));\n const to = this.clamp(Math.max(start, end));\n for (let i = from; i < to; i++) {\n if (this.spacers[i] === MARKERS.IMAGE && this.imageAt(i)?.kind === 'ref') return true;\n }\n return false;\n }\n\n // ---- 虚拟块 ------------------------------------------------------------\n\n listVirtualBlocks(): VirtualBlock[] {\n return sortOuterToInner([...this.virtualBlocks.values()], this.virtualBlocks);\n }\n\n blockById(id: string): VirtualBlock | null {\n const block = this.virtualBlocks.get(id);\n return block ? cloneVirtualBlock(block) : null;\n }\n\n /** 覆盖下标 i 的虚拟块,外层在前。 */\n blocksAt(index: number): VirtualBlock[] {\n const i = this.clamp(index);\n const hits = [...this.virtualBlocks.values()].filter((b) => b.start <= i && i < b.end);\n return sortOuterToInner(hits, this.virtualBlocks).map(cloneVirtualBlock);\n }\n\n virtualBlocksOverlapping(start: number, end: number): VirtualBlock[] {\n const from = this.clamp(Math.min(start, end));\n const to = this.clamp(Math.max(start, end));\n return [...this.virtualBlocks.values()]\n .filter((b) => b.start < to && b.end > from)\n .map(cloneVirtualBlock);\n }\n\n innermostSlotAt(index: number): VirtualBlock | null {\n const hits = this.blocksAt(index);\n for (let i = hits.length - 1; i >= 0; i--) {\n if (hits[i].kind === 'slot') return hits[i];\n }\n return null;\n }\n\n /** 含槽尾光标:`start <= i <= end` 的最内层 slot。 */\n slotAtCaret(index: number): VirtualBlock | null {\n const i = this.clamp(index);\n const inside = this.innermostSlotAt(i);\n if (inside) return inside;\n const ending = [...this.virtualBlocks.values()].filter((b) => b.kind === 'slot' && b.end === i);\n if (!ending.length) return null;\n const sorted = sortOuterToInner(ending, this.virtualBlocks);\n return cloneVirtualBlock(sorted[sorted.length - 1]);\n }\n\n private replaceVirtualBlocks(next: VirtualBlock[]) {\n this.virtualBlocks = new Map(next.map((b) => [b.id, cloneVirtualBlock(b)]));\n }\n\n // ---- 构造期整理 ---------------------------------------------------------\n\n /**\n * 把 paragraph 区间对齐到块结构。\n *\n * 只在**构造**文档时用(从切片建模型、从磁盘读文档)。编辑过程中的对齐是\n * Operation 层的 normalizeParagraphs,走 mutation,因为它必须能被撤销。\n */\n normalize() {\n const needed: StyleSpan[] = [];\n const ensure = (start: number, end: number): StyleSpan => {\n const existing =\n this.styles.find((s) => s.type === 'paragraph' && s.start === start && s.end === end) ??\n this.styles.find((s) => s.type === 'paragraph' && s.start < end && s.end > start && s.start >= start);\n return {\n start,\n end,\n type: 'paragraph',\n props: { ...DEFAULT_PARAGRAPH, ...(existing?.props as ParagraphProps | undefined) }\n };\n };\n for (const block of parseBlocks(this.spacers)) {\n if (block.kind === 'paragraph') {\n needed.push(ensure(block.start, block.end));\n } else {\n for (const row of block.rows) {\n for (const cell of row.cells) {\n for (const para of cell.paragraphs) {\n if (para.end > para.start) needed.push(ensure(para.start, para.end));\n }\n }\n }\n }\n }\n this.styles = this.styles.filter((s) => s.type !== 'paragraph').concat(needed);\n this.mergeStyles();\n }\n\n /** 排序 + 合并相邻且属性相同的文字区间。纯粹的规范化,不改变可见结果。 */\n private mergeStyles() {\n this.styles.sort((a, b) => a.start - b.start || a.end - b.end || a.type.localeCompare(b.type));\n const merged: StyleSpan[] = [];\n for (const s of this.styles) {\n if (s.end <= s.start) continue;\n const last = merged[merged.length - 1];\n // 段落/表格/图片区间不能跨块合并,否则回车后精确匹配失败会掉回正文。\n if (\n last &&\n last.type === 'text' &&\n s.type === 'text' &&\n last.end === s.start &&\n textPropsEqual(last.props as TextProps, s.props as TextProps)\n ) {\n last.end = s.end;\n } else {\n merged.push(s);\n }\n }\n this.styles = merged;\n }\n}\n\nexport function shiftStylesOnInsert(styles: StyleSpan[], index: number, len: number): StyleSpan[] {\n return styles.map((s) => {\n if (s.end <= index) return s;\n if (s.start >= index) return { ...s, start: s.start + len, end: s.end + len };\n return { ...s, end: s.end + len };\n });\n}\n\nexport function shiftStylesOnDelete(styles: StyleSpan[], start: number, end: number): StyleSpan[] {\n const len = end - start;\n const out: StyleSpan[] = [];\n for (const s of styles) {\n if (s.end <= start) {\n out.push(s);\n } else if (s.start >= end) {\n out.push({ ...s, start: s.start - len, end: s.end - len });\n } else if (s.start < start && s.end > end) {\n out.push({ ...s, start: s.start, end: s.end - len });\n } else if (s.start < start) {\n if (start > s.start) out.push({ ...s, start: s.start, end: start });\n } else if (s.end > end) {\n out.push({ ...s, start, end: s.end - len });\n }\n }\n return out.filter((s) => s.end > s.start);\n}\n\nexport function collapsedSel(index: number): Selection {\n return { anchor: index, focus: index };\n}\n\nexport function documentFromSlice(slice: Slice): DocumentModel {\n const normalized = normalizeFragmentSlice(slice);\n const doc = new DocumentModel();\n doc.spacers = normalized.text || MARKERS.PARAGRAPH;\n doc.styles = normalized.styles.map(cloneStyle);\n doc.entities = new Map(normalized.entities.map((e) => [e.id, cloneEntity(e)]));\n doc.virtualBlocks = new Map((normalized.virtualBlocks ?? []).map((b) => [b.id, cloneVirtualBlock(b)]));\n if (!doc.styles.some((s) => s.type === 'paragraph')) {\n doc.styles.push({ start: 0, end: doc.spacers.length, type: 'paragraph', props: { ...DEFAULT_PARAGRAPH } });\n }\n doc.normalize();\n return doc;\n}\n\nexport function sliceFromDocument(doc: DocumentModel): Slice {\n return {\n text: doc.spacers,\n styles: doc.styles.map(cloneStyle),\n entities: [...doc.entities.values()].map(cloneEntity),\n virtualBlocks: doc.listVirtualBlocks()\n };\n}\n\n/** 去掉指定 groupId 的段落,留下其余内容。 */\nexport function sliceWithoutParagraphGroup(doc: DocumentModel, groupId: string): Slice {\n const id = groupId.trim();\n const keep: { start: number; end: number }[] = [];\n for (const block of parseBlocks(doc.spacers)) {\n if (block.kind === 'table') {\n keep.push({ start: block.start, end: block.end });\n continue;\n }\n if ((doc.paragraphPropsAt(block.start).groupId ?? '') !== id) {\n keep.push({ start: block.start, end: block.end });\n }\n }\n if (!keep.length) {\n return { text: MARKERS.PARAGRAPH, styles: [], entities: [] };\n }\n let text = '';\n const styles: StyleSpan[] = [];\n const entities: ImageEntity[] = [];\n for (const range of keep) {\n const offset = text.length;\n text += doc.spacers.slice(range.start, range.end);\n for (const span of doc.styles) {\n if (span.end <= range.start || span.start >= range.end) continue;\n const start = Math.max(span.start, range.start) - range.start + offset;\n const end = Math.min(span.end, range.end) - range.start + offset;\n if (end <= start) continue;\n if (span.type === 'image') {\n const entityId = (span.props as ImageProps).entityId;\n const entity = entityId ? doc.entities.get(entityId) : undefined;\n if (!entity) continue;\n const next = cloneEntity({ ...entity, id: nextEntityId() });\n entities.push(next);\n styles.push({ start, end, type: 'image', props: { entityId: next.id } });\n continue;\n }\n styles.push({ start, end, type: span.type, props: { ...span.props } });\n }\n }\n if (!text.endsWith(MARKERS.PARAGRAPH)) text += MARKERS.PARAGRAPH;\n return { text, styles, entities };\n}\n","/**\n * 实体类 Operation:图片、公式、代码块、槽位、同步块引用。\n *\n * 实体本身存在 id → 实体的表里,字符流上只留一个 IMAGE 占位符,\n * 由一条 image 样式区间把占位符和实体 id 绑起来。插一个实体因此是三条 mutation。\n */\nimport { cloneEntity, ImageEntity } from '../model/types';\nimport { MARKERS } from '../model/markers';\nimport { addEntity, updateEntity } from '../mutations';\nimport { nextEntityId } from '../model/document';\nimport { Operation } from './context';\nimport { emitInsert, emitStyle } from './primitives';\n\nexport type NewEntity = Omit<ImageEntity, 'id' | 'kind'> & { id?: string; kind?: ImageEntity['kind'] };\n\n/** 在 index 处插入一个实体,返回占位符之后的位置。 */\nexport function insertImage(index: number, entity: NewEntity): Operation<number> {\n return (ctx) => {\n const i = ctx.doc.clamp(index);\n const full = cloneEntity({\n ...entity,\n id: entity.id ?? nextEntityId(),\n kind: entity.kind ?? 'image'\n } as ImageEntity);\n ctx.emit(addEntity(full));\n emitInsert(ctx, i, MARKERS.IMAGE);\n emitStyle(ctx, 'image', i, i + 1, { entityId: full.id });\n return i + 1;\n };\n}\n\nexport type ImagePatch = Partial<\n Pick<\n ImageEntity,\n | 'width'\n | 'height'\n | 'code'\n | 'language'\n | 'latex'\n | 'src'\n | 'displayMode'\n | 'slotKind'\n | 'label'\n | 'slotValue'\n | 'slotOptions'\n | 'data'\n | 'hostType'\n >\n>;\n\n/** 改实体属性。undefined 的字段代表「不动」,在这里就剔掉,别让它盖掉原值。 */\nexport function updateImage(id: string, patch: ImagePatch): Operation {\n return (ctx) => {\n if (!ctx.doc.entities.has(id)) return;\n const props: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(patch)) {\n if (v !== undefined) props[k] = v;\n }\n if (!Object.keys(props).length) return;\n ctx.emit(updateEntity(id, props as ImagePatch));\n };\n}\n","/**\n * 虚拟块 Operation:套皮、拆皮、清槽、填槽、插入后盖住新字。\n *\n * 嵌套合法性在这里判断,通过才发 mutation。插删字符对区间的机械挪动在\n * applier 里,但清槽会把覆盖整段删掉(块被表里摘掉),所以这里要按快照补回。\n */\nimport { chromeTextProps, hasTextProps, TextProps, VirtualBlock, VirtualBlockChrome, VirtualBlockKind } from '../model/types';\nimport { ancestorChain, rangeContains, rangesCross, sortOuterToInner } from '../model/virtualBlock';\nimport { nextVirtualBlockId } from '../model/document';\nimport { addVirtualBlock, deleteVirtualBlock, updateVirtualBlock } from '../mutations';\nimport { Operation } from './context';\nimport { emitDelete, emitInsert, emitTextStyle } from './primitives';\nimport { resolveTextProps } from './resolve';\n\nexport interface VirtualBlockSpec {\n id?: string;\n parentId?: string | null;\n kind: VirtualBlockKind;\n start: number;\n end: number;\n chrome?: VirtualBlockChrome;\n placeholder?: string;\n empty?: boolean;\n}\n\nfunction blockMap(doc: { virtualBlocks: Map<string, VirtualBlock> }) {\n return doc.virtualBlocks;\n}\n\nexport function validateInsert(doc: { virtualBlocks: Map<string, VirtualBlock> }, block: VirtualBlock): string | null {\n if (block.end <= block.start) return 'empty-range';\n if (block.parentId) {\n const parent = doc.virtualBlocks.get(block.parentId);\n if (!parent) return 'missing-parent';\n if (!rangeContains(parent, block)) return 'outside-parent';\n if (parent.kind === 'slot') return 'slot-parent';\n }\n for (const other of doc.virtualBlocks.values()) {\n if (other.id === block.id) continue;\n if (rangesCross(block, other)) return 'cross';\n }\n if (block.kind === 'slot') {\n for (const other of doc.virtualBlocks.values()) {\n if (other.id === block.id) continue;\n if (other.parentId === block.id) return 'slot-child';\n if (rangeContains(block, other) && other.id !== block.parentId) return 'slot-child';\n }\n }\n return null;\n}\n\nfunction inferParentId(\n doc: { virtualBlocks: Map<string, VirtualBlock> },\n start: number,\n end: number,\n selfId?: string\n): string | null {\n const range = { start, end };\n let best: VirtualBlock | null = null;\n for (const b of doc.virtualBlocks.values()) {\n if (selfId && b.id === selfId) continue;\n if (!rangeContains(b, range)) continue;\n if (!best || b.end - b.start < best.end - best.start) best = b;\n }\n return best?.id ?? null;\n}\n\n/**\n * 把 [start, end) 包成一层皮。不改字。\n * 完全落在新区间里的已有块会改挂到这一层下面。\n */\nexport function insertVirtualBlock(spec: VirtualBlockSpec): Operation<string | null> {\n return (ctx) => {\n const doc = ctx.doc;\n const start = doc.clamp(Math.min(spec.start, spec.end));\n const end = doc.clamp(Math.max(spec.start, spec.end));\n if (end <= start) return null;\n\n const id = spec.id && !doc.virtualBlocks.has(spec.id) ? spec.id : nextVirtualBlockId();\n const parentId = spec.parentId !== undefined ? spec.parentId : inferParentId(doc, start, end, id);\n const placeholder =\n spec.kind === 'slot' ? spec.placeholder ?? doc.spacers.slice(start, end) : spec.placeholder;\n const empty =\n spec.kind === 'slot' ? spec.empty ?? (placeholder != null && doc.spacers.slice(start, end) === placeholder) : spec.empty;\n const block: VirtualBlock = {\n id,\n parentId,\n kind: spec.kind,\n start,\n end,\n chrome: { ...(spec.chrome ?? {}) },\n placeholder,\n empty\n };\n const err = validateInsert(doc, block);\n if (err) return null;\n\n ctx.emit(addVirtualBlock(block));\n for (const child of [...doc.virtualBlocks.values()]) {\n if (child.id === id) continue;\n if (child.parentId === parentId && rangeContains(block, child) && child.id !== id) {\n ctx.emit(updateVirtualBlock(child.id, { ...child, parentId: id }));\n }\n }\n return id;\n };\n}\n\n/** 拆掉皮,字和胶囊留下。子块改挂到被拆掉那一层的父上。 */\nexport function removeVirtualBlock(id: string): Operation<boolean> {\n return (ctx) => {\n const block = ctx.doc.blockById(id);\n if (!block) return false;\n for (const child of ctx.doc.listVirtualBlocks()) {\n if (child.parentId === id) {\n ctx.emit(updateVirtualBlock(child.id, { ...child, parentId: block.parentId }));\n }\n }\n ctx.emit(deleteVirtualBlock(id));\n return true;\n };\n}\n\nexport function updateVirtualBlockChrome(id: string, chrome: VirtualBlockChrome): Operation<boolean> {\n return (ctx) => {\n const block = ctx.doc.blockById(id);\n if (!block) return false;\n ctx.emit(updateVirtualBlock(id, { ...block, chrome: { ...block.chrome, ...chrome } }));\n return true;\n };\n}\n\nfunction restoreChain(\n ctx: { doc: { blockById(id: string): VirtualBlock | null }; emit(m: import('../mutations').Mutation): void },\n snaps: VirtualBlock[],\n targetId: string,\n nextStart: number,\n nextEnd: number,\n empty: boolean\n) {\n for (const snap of snaps) {\n const isTarget = snap.id === targetId;\n const cur = ctx.doc.blockById(snap.id);\n let next: VirtualBlock;\n if (isTarget) {\n next = { ...snap, start: nextStart, end: nextEnd, empty };\n } else if (cur) {\n next = {\n ...cur,\n start: Math.min(cur.start, nextStart),\n end: Math.max(cur.end, nextEnd)\n };\n } else {\n next = { ...snap, start: nextStart, end: nextEnd };\n }\n if (cur) ctx.emit(updateVirtualBlock(snap.id, next));\n else ctx.emit(addVirtualBlock(next));\n }\n}\n\n/** 把槽内容换成 placeholder,empty=true。槽和父块都留下。 */\nexport function clearSlot(id: string): Operation<boolean> {\n return (ctx) => {\n const block = ctx.doc.blockById(id);\n if (!block || block.kind !== 'slot') return false;\n const placeholder = block.placeholder ?? '';\n if (!placeholder) return false;\n const from = block.start;\n const to = block.end;\n const snaps = ancestorChain(block, blockMap(ctx.doc));\n emitDelete(ctx, from, to);\n emitInsert(ctx, from, placeholder);\n restoreChain(ctx, snaps, id, from, from + placeholder.length, true);\n return true;\n };\n}\n\n/** 槽是行内区间:去掉尾部换行,中间的段分隔折成空格。 */\nexport function slotInlineText(text: string): string {\n return text.replace(/\\r\\n/g, '\\n').replace(/\\r/g, '\\n').replace(/\\n+$/, '').replace(/\\n+/g, ' ');\n}\n\n/**\n * empty 时覆盖 placeholder;已填则整段替换。一次事务。\n * 返回新光标(槽尾)。槽内不进段分隔符。\n */\nexport function fillSlot(id: string, text: string, inherit?: TextProps): Operation<number | null> {\n return (ctx) => {\n const block = ctx.doc.blockById(id);\n if (!block || block.kind !== 'slot') return null;\n const safe = slotInlineText(text);\n const from = block.start;\n const to = block.end;\n const snaps = ancestorChain(block, blockMap(ctx.doc));\n const left = inherit ?? {\n ...resolveTextProps(ctx.doc, from),\n ...chromeTextProps(block.chrome)\n };\n emitDelete(ctx, from, to);\n if (safe) emitInsert(ctx, from, safe);\n const end = from + safe.length;\n const empty = safe.length === 0 || safe === (block.placeholder ?? '');\n restoreChain(ctx, snaps, id, from, end, empty && !!block.placeholder);\n if (safe && left && hasTextProps(left)) emitTextStyle(ctx, from, end, left);\n return end;\n };\n}\n\n/** 按 id 找到槽/块,连祖先一起撑开盖住 [start, end)。 */\nexport function coverAncestorsOf(id: string, start: number, end: number): Operation<void> {\n return (ctx) => {\n const block = ctx.doc.blockById(id);\n if (!block) return;\n const ids = [id];\n let pid = block.parentId;\n const seen = new Set(ids);\n while (pid && !seen.has(pid)) {\n seen.add(pid);\n ids.push(pid);\n pid = ctx.doc.blockById(pid)?.parentId ?? null;\n }\n coverVirtualBlocks(ids, start, end)(ctx);\n };\n}\n\n/** 插入后把指定块(及仍在的祖先)撑开盖住 [start, end)。 */\nexport function coverVirtualBlocks(ids: string[], start: number, end: number): Operation<void> {\n return (ctx) => {\n const unique = [...new Set(ids)];\n const blocks = unique\n .map((id) => ctx.doc.blockById(id))\n .filter((b): b is VirtualBlock => !!b);\n for (const b of sortOuterToInner(blocks, blockMap(ctx.doc))) {\n const next: VirtualBlock = {\n ...b,\n start: Math.min(b.start, start),\n end: Math.max(b.end, end),\n empty: b.kind === 'slot' ? false : b.empty\n };\n if (next.start !== b.start || next.end !== b.end || next.empty !== b.empty) {\n ctx.emit(updateVirtualBlock(b.id, next));\n }\n }\n };\n}\n\nexport function remapIncomingVirtualBlocks(\n blocks: VirtualBlock[],\n offset: number,\n occupied: Set<string>\n): VirtualBlock[] {\n if (!blocks.length) return [];\n const idMap = new Map<string, string>();\n for (const b of blocks) {\n let id = b.id;\n if (!id || occupied.has(id) || idMap.has(id)) {\n id = nextVirtualBlockId();\n }\n idMap.set(b.id, id);\n occupied.add(id);\n }\n const remapped = blocks.map((b) => ({\n ...b,\n id: idMap.get(b.id)!,\n parentId: b.parentId ? (idMap.get(b.parentId) ?? null) : null,\n start: b.start + offset,\n end: b.end + offset,\n chrome: { ...b.chrome }\n }));\n return sortOuterToInner(remapped, new Map(remapped.map((b) => [b.id, b])));\n}\n","/**\n * 字符流类 Operation:打字、回车、退格、删除、Markdown 快捷输入。\n *\n * 这一组的共性是「插删字符会改变段落边界」,所以每个操作在动完字符流之后\n * 都要把段落区间重新对齐 —— 而且对齐动作本身也是 mutation,不是模型的暗箱。\n */\nimport { expandRangeOverStructures, findParagraphAt, findTableAt, isEmptyParagraph, parseBlocks } from '../model/blocks';\nimport { isTableMarker, MARKERS, nextCodePointLen, prevCodePointLen } from '../model/markers';\nimport { DEFAULT_PARAGRAPH, hasTextProps, ParagraphProps, Slice, TextProps } from '../model/types';\nimport { applyStyle, multi } from '../mutations';\nimport { matchMarkdown } from '../convert/markdown';\nimport { Operation, OperationContext } from './context';\nimport { emitDelete, emitInsert, emitTextStyle, normalizeParagraphs } from './primitives';\nimport { contentRuns, resolveParagraphProps, resolveTextProps } from './resolve';\nimport { applyParagraphStyle, applyTextStyle } from './style';\nimport { insertImage } from './entity';\nimport { coverAncestorsOf, fillSlot } from './virtualBlock';\n\nconst EMPTY_SLICE: Slice = { text: '', styles: [], entities: [] };\n\nfunction isLastParagraphWithGroupId(\n doc: { spacers: string; paragraphPropsAt: (i: number) => ParagraphProps },\n paraStart: number,\n groupId: string\n): boolean {\n if (!groupId) return false;\n let last = -1;\n for (const block of parseBlocks(doc.spacers)) {\n if (block.kind !== 'paragraph') continue;\n if ((doc.paragraphPropsAt(block.start).groupId ?? '') === groupId) last = block.start;\n }\n return last === paraStart;\n}\n\n/**\n * 插入的文本里带换行时,被劈开的那个段落要变成两段,且两段都继承原属性。\n * 光靠 normalizeParagraphs 推不出来 —— 它只能让后半段回落到默认属性。\n */\nfunction splitParagraphSpans(ctx: OperationContext, index: number, text: string) {\n if (!text.includes('\\n')) return;\n let cursor = index;\n for (const ch of text) {\n if (ch === '\\n') {\n const para = findParagraphAt(ctx.doc.spacers, cursor);\n if (para && para.start < cursor + 1 && para.end > cursor + 1) {\n const props = resolveParagraphProps(ctx.doc, para.start);\n ctx.emit(\n multi([\n applyStyle('paragraph', para.start, para.end - 1, null),\n applyStyle('paragraph', para.start, cursor, { ...props }),\n applyStyle('paragraph', cursor + 1, para.end - 1, { ...props })\n ])\n );\n }\n }\n cursor += ch.length;\n }\n}\n\n/** 在 index 处插入文本,继承左侧文字样式(或调用方指定的样式)。返回新光标位置。 */\nexport function insertText(index: number, text: string, inherit?: TextProps): Operation<number> {\n return (ctx) => {\n if (!text) return ctx.doc.clamp(index);\n const safe = text.replace(/\\r\\n/g, '\\n').replace(/\\r/g, '\\n');\n const i = ctx.doc.clamp(index);\n const slot = ctx.doc.slotAtCaret(i);\n if (slot?.empty) {\n const end = fillSlot(slot.id, safe, inherit)(ctx);\n return end ?? i;\n }\n const left = inherit ?? resolveTextProps(ctx.doc, i);\n\n emitInsert(ctx, i, safe);\n splitParagraphSpans(ctx, i, safe);\n if (left && hasTextProps(left)) {\n for (const [a, b] of contentRuns(safe, i)) emitTextStyle(ctx, a, b, left);\n }\n if (slot) coverAncestorsOf(slot.id, i, i + safe.length)(ctx);\n normalizeParagraphs(ctx);\n return i + safe.length;\n };\n}\n\n/** 回车。空列表项上先降缩进再退出列表;否则切段,两段各自继承合适的属性。 */\nexport function insertParagraph(index: number): Operation<number> {\n return (ctx) => {\n let i = ctx.doc.clamp(index);\n const slot = ctx.doc.slotAtCaret(i);\n // 槽不是多段容器:落在槽内时把回车挪到槽后,避免一个 slot 跨两段。\n if (slot && i > slot.start && i < slot.end) i = slot.end;\n const para = findParagraphAt(ctx.doc.spacers, i);\n const oldProps: ParagraphProps = para\n ? resolveParagraphProps(ctx.doc, para.start)\n : { ...DEFAULT_PARAGRAPH };\n const inList = (oldProps.list ?? 'none') !== 'none';\n\n if (para && inList && isEmptyParagraph(ctx.doc.spacers, para)) {\n const indent = oldProps.indent ?? 0;\n const patch: ParagraphProps = indent > 0 ? { indent: indent - 1 } : { list: 'none', indent: 0 };\n applyParagraphStyle(para.start, para.end, patch)(ctx);\n return i;\n }\n\n const paraEndContent =\n para && ctx.doc.spacers[para.end - 1] === MARKERS.PARAGRAPH ? para.end - 1 : para?.end ?? i;\n const atStart = !!para && i <= para.start;\n const atEnd = !!para && i >= paraEndContent;\n const groupId = String(oldProps.groupId ?? '');\n const exitGroup =\n !!para && !!groupId && atEnd && isLastParagraphWithGroupId(ctx.doc, para.start, groupId);\n\n emitInsert(ctx, i, MARKERS.PARAGRAPH);\n if (para) {\n const leftProps = { ...oldProps };\n const rightProps = { ...oldProps };\n const heading = oldProps.heading ?? 0;\n // 标题段在段尾回车时,新起的一段回落成正文;在段首回车则让上面那段是正文。\n if (heading && !inList && atEnd) rightProps.heading = 0;\n if (heading && !inList && atStart) leftProps.heading = 0;\n // 分组最后一段末尾回车:新段不再带 groupId。\n if (exitGroup) rightProps.groupId = '';\n ctx.emit(\n multi([\n applyStyle('paragraph', para.start, para.end, null),\n applyStyle('paragraph', para.start, i, leftProps),\n applyStyle('paragraph', i + 1, para.end, rightProps)\n ])\n );\n }\n normalizeParagraphs(ctx);\n return i + 1;\n };\n}\n\n/** 删掉一段区间,边界会向外扩到不切断表格等结构。 */\nexport function deleteRange(start: number, end: number): Operation<Slice> {\n return (ctx) => {\n const expanded = expandRangeOverStructures(\n ctx.doc.spacers,\n ctx.doc.clamp(start),\n ctx.doc.clamp(end)\n );\n if (expanded.start === expanded.end) return EMPTY_SLICE;\n const slice = emitDelete(ctx, expanded.start, expanded.end);\n normalizeParagraphs(ctx);\n return slice;\n };\n}\n\nexport type DeleteHit = { start: number; end: number; slice: Slice } | null;\n\n/** 退格。列表段首先去 bullet;删段分隔符时存活段继承上一段属性;表格骨架不动。 */\nexport function backspace(index: number): Operation<DeleteHit> {\n return (ctx) => {\n const doc = ctx.doc;\n const i = doc.clamp(index);\n const para = findParagraphAt(doc.spacers, i);\n const atStart = !!para && i === para.start;\n const props = para ? resolveParagraphProps(doc, para.start) : { ...DEFAULT_PARAGRAPH };\n\n if (atStart && (props.list ?? 'none') !== 'none') {\n applyParagraphStyle(para.start, para.end, { list: 'none', indent: 0 })(ctx);\n return { start: i, end: i, slice: EMPTY_SLICE };\n }\n if (i <= 0) return null;\n\n const prev = doc.spacers[i - 1];\n // 表格结构标记一律不删:TABLE_END 由编辑器侧改成选中整表。\n if (isTableMarker(prev)) return null;\n\n if (prev === MARKERS.PARAGRAPH) {\n const prevProps = resolveParagraphProps(doc, i - 1);\n const slice = emitDelete(ctx, i - 1, i);\n normalizeParagraphs(ctx);\n const merged = findParagraphAt(doc.spacers, i - 1);\n if (merged) applyParagraphStyle(merged.start, merged.end, prevProps)(ctx);\n return { start: i - 1, end: i, slice };\n }\n\n const len = prevCodePointLen(doc.spacers, i);\n const from = i - len;\n const span = doc.spacers[from] === MARKERS.IMAGE && doc.imageAt(from) ? 1 : len;\n const slice = emitDelete(ctx, from, from + span);\n normalizeParagraphs(ctx);\n return { start: from, end: from + span, slice };\n };\n}\n\n/** Delete 键。整表要整体删掉,其余按一个码点删。 */\nexport function deleteForward(index: number): Operation<DeleteHit> {\n return (ctx) => {\n const doc = ctx.doc;\n const i = doc.clamp(index);\n if (i >= doc.spacers.length) return null;\n const ch = doc.spacers[i];\n if (ch === MARKERS.TABLE_START) {\n const table = findTableAt(doc.spacers, i);\n if (table) {\n const slice = emitDelete(ctx, table.start, table.end);\n normalizeParagraphs(ctx);\n return { start: table.start, end: table.end, slice };\n }\n }\n if (isTableMarker(ch)) return null;\n const len = nextCodePointLen(doc.spacers, i);\n const slice = emitDelete(ctx, i, i + len);\n normalizeParagraphs(ctx);\n return { start: i, end: i + len, slice };\n };\n}\n\n/** 打完字后试着把 `# `、`- `、`**x**` 之类就地转成真正的样式或嵌入块。 */\nexport function applyMarkdownShortcut(caret: number): Operation<number> {\n return (ctx) => {\n const doc = ctx.doc;\n const i = doc.clamp(caret);\n const para = findParagraphAt(doc.spacers, i);\n if (!para) return i;\n const hit = matchMarkdown(doc.spacers.slice(para.start, i));\n if (!hit) return i;\n\n const restyleParagraph = (consume: number, patch: ParagraphProps) => {\n emitDelete(ctx, para.start, para.start + consume);\n normalizeParagraphs(ctx);\n const next = findParagraphAt(doc.spacers, para.start) ?? { start: para.start, end: para.start + 1 };\n applyParagraphStyle(next.start, next.end, patch)(ctx);\n return next.start;\n };\n\n if (hit.kind === 'heading') {\n return restyleParagraph(hit.consume, { heading: hit.level, list: 'none' });\n }\n if (hit.kind === 'list') {\n if (resolveParagraphProps(doc, para.start).list === hit.list) return i;\n return restyleParagraph(hit.consume, { list: hit.list, heading: 0 });\n }\n if (hit.kind === 'code-block') {\n emitDelete(ctx, para.start, para.start + hit.consume);\n normalizeParagraphs(ctx);\n return insertImage(para.start, {\n kind: 'code',\n width: 680,\n height: 80,\n language: hit.language || 'plain',\n code: ''\n })(ctx);\n }\n if (hit.kind === 'formula') {\n const from = para.start + hit.matchStart;\n emitDelete(ctx, from, para.start + hit.matchEnd);\n normalizeParagraphs(ctx);\n return insertImage(from, {\n kind: 'formula',\n width: 200,\n height: 48,\n latex: hit.latex,\n displayMode: hit.displayMode\n })(ctx);\n }\n\n const from = para.start + hit.matchStart;\n emitDelete(ctx, from, para.start + hit.matchEnd);\n normalizeParagraphs(ctx);\n emitInsert(ctx, from, `${hit.inner} `);\n if (hit.inner) applyTextStyle(from, from + hit.inner.length, hit.style)(ctx);\n normalizeParagraphs(ctx);\n return from + hit.inner.length + 1;\n };\n}","/**\n * 表格类 Operation。\n *\n * 表格在字符流里是一串结构标记,在样式里是一条覆盖整表的 table 区间(存列宽)。\n * 增删行列既要动字符流,也要同步列宽数组,两件事都得是显式 mutation。\n */\nimport { cellAt, emptyTableSpacers, findParagraphAt, findTableAt } from '../model/blocks';\nimport { MARKERS } from '../model/markers';\nimport { TableProps } from '../model/types';\nimport { Operation, OperationContext } from './context';\nimport { emitDelete, emitInsert, emitStyle, ensureParagraphAfter, normalizeParagraphs } from './primitives';\nimport { insertParagraph } from './text';\n\n/** 覆盖整表的那条 table 区间,找不到就返回 null。 */\nfunction tableSpan(ctx: OperationContext, start: number, end: number) {\n return ctx.doc.styles.find((s) => s.type === 'table' && s.start <= start && s.end >= end) ?? null;\n}\n\nfunction writeColWidths(ctx: OperationContext, tableStart: number, tableEnd: number, widths: number[]) {\n const span = tableSpan(ctx, tableStart, tableEnd);\n const props = { ...((span?.props as TableProps | undefined) ?? {}), colWidths: [...widths] };\n const from = span?.start ?? tableStart;\n const to = span?.end ?? tableEnd;\n emitStyle(ctx, 'table', from, to, props);\n}\n\n/** 插入空表。表格不能嵌在段落中间,所以必要时先把当前段切开。返回首格光标位置。 */\nexport function insertTable(index: number, rows = 2, cols = 2): Operation<number> {\n return (ctx) => {\n let i = ctx.doc.clamp(index);\n const para = findParagraphAt(ctx.doc.spacers, i);\n if (para && ctx.doc.spacers[para.end - 1] === '\\n' && i >= para.end - 1) {\n i = para.end;\n } else if (para && i > para.start && i < para.end) {\n i = insertParagraph(i)(ctx);\n }\n\n const table = emptyTableSpacers(rows, cols);\n emitInsert(ctx, i, table);\n emitStyle(ctx, 'table', i, i + table.length, {\n colWidths: Array.from({ length: cols }, () => 0)\n } satisfies TableProps);\n ensureParagraphAfter(ctx, i + table.length);\n normalizeParagraphs(ctx);\n return i + table.indexOf(MARKERS.TABLE_CELL) + 1;\n };\n}\n\n/** 在当前行下面插一行。 */\nexport function insertTableRow(index: number): Operation<boolean> {\n return (ctx) => {\n const hit = cellAt(ctx.doc.spacers, index);\n if (!hit) return false;\n const cols = Math.max(...hit.table.rows.map((r) => r.cells.length));\n let spacers = MARKERS.TABLE_ROW;\n for (let c = 0; c < cols; c++) spacers += MARKERS.TABLE_CELL + MARKERS.PARAGRAPH;\n emitInsert(ctx, hit.table.rows[hit.row].end, spacers);\n normalizeParagraphs(ctx);\n return true;\n };\n}\n\n/** 在当前列右边插一列。从下往上插,免得前面的插入把后面的坐标顶跑。 */\nexport function insertTableCol(index: number): Operation<boolean> {\n return (ctx) => {\n const hit = cellAt(ctx.doc.spacers, index);\n if (!hit) return false;\n const inserts: number[] = [];\n for (const row of [...hit.table.rows].reverse()) {\n inserts.push(row.cells[Math.min(hit.col, row.cells.length - 1)].end);\n }\n for (const at of inserts) emitInsert(ctx, at, MARKERS.TABLE_CELL + MARKERS.PARAGRAPH);\n\n const table = findTableAt(ctx.doc.spacers, index);\n if (table) {\n const span = tableSpan(ctx, table.start, table.end);\n const widths = [...(((span?.props as TableProps | undefined)?.colWidths) ?? [])];\n widths.splice(hit.col + 1, 0, 0);\n writeColWidths(ctx, table.start, table.end, widths);\n }\n normalizeParagraphs(ctx);\n return true;\n };\n}\n\n/** 删当前行。最后一行不给删。 */\nexport function deleteTableRow(index: number): Operation<boolean> {\n return (ctx) => {\n const hit = cellAt(ctx.doc.spacers, index);\n if (!hit || hit.table.rows.length <= 1) return false;\n const row = hit.table.rows[hit.row];\n emitDelete(ctx, row.start, row.end);\n normalizeParagraphs(ctx);\n return true;\n };\n}\n\n/** 删当前列。最后一列不给删。 */\nexport function deleteTableCol(index: number): Operation<boolean> {\n return (ctx) => {\n const hit = cellAt(ctx.doc.spacers, index);\n if (!hit) return false;\n if (Math.max(...hit.table.rows.map((r) => r.cells.length)) <= 1) return false;\n for (const row of [...hit.table.rows].reverse()) {\n const cell = row.cells[hit.col];\n if (cell) emitDelete(ctx, cell.start, cell.end);\n }\n const table = findTableAt(ctx.doc.spacers, hit.table.start);\n if (table) {\n const span = tableSpan(ctx, table.start, table.end);\n const widths = (span?.props as TableProps | undefined)?.colWidths;\n if (widths && widths.length > hit.col) {\n const next = [...widths];\n next.splice(hit.col, 1);\n writeColWidths(ctx, table.start, table.end, next);\n }\n }\n normalizeParagraphs(ctx);\n return true;\n };\n}\n\n/** 拖动列边界后落定列宽。 */\nexport function setTableColWidths(index: number, widths: number[]): Operation {\n return (ctx) => {\n const table = findTableAt(ctx.doc.spacers, index);\n if (!table) return;\n writeColWidths(ctx, table.start, table.end, widths);\n };\n}\n","import { MARKERS } from '../model/markers';\nimport { DEFAULT_PARAGRAPH, EmbedEntity, HeadingLevel, LINK_COLOR, ParagraphProps, Slice, StyleSpan, TextProps } from '../model/types';\n\n/**\n * 粘贴前的 Markdown 探测:先看标题/列表/链接,再看行内粗斜删除线。\n */\nexport function looksLikeMarkdown(text: string): boolean {\n const normalized = `\\n\\n${text.replace(/\\r\\n/g, '\\n').replace(/\\r/g, '\\n')}\\n\\n`;\n return (\n /^(#{1,6})[ \\t]+.+/m.test(normalized) ||\n /(?:^|\\n) {0,3}([*+-]|\\d+\\.)[ \\t]+/.test(normalized) ||\n /\\[((?:\\[[^\\]]*]|[^\\[\\]])*)][ \\t]*\\([ \\t]?<?\\S+/.test(normalized) ||\n /\\*\\*[^*]+\\*\\*/.test(text) ||\n /(?<!\\*)\\*[^*\\n]+\\*(?!\\*)/.test(text) ||\n /~~.+~~/.test(text) ||\n /__[^_]+__/.test(text) ||\n /```/.test(text) ||\n /\\$\\$[\\s\\S]+\\$\\$/.test(text) ||\n /\\$[^$\\n]+\\$/.test(text)\n );\n}\n\ntype InlineTok = { text: string; style: TextProps; url?: string };\n\nfunction parseInline(input: string): InlineTok[] {\n const out: InlineTok[] = [];\n const re =\n /(\\*\\*\\*(.+?)\\*\\*\\*|\\*\\*(.+?)\\*\\*|\\*(.+?)\\*|~~(.+?)~~|__(.+?)__|\\[([^\\]]+)\\]\\(([^)]+)\\))/g;\n let last = 0;\n let m: RegExpExecArray | null;\n while ((m = re.exec(input))) {\n if (m.index > last) out.push({ text: input.slice(last, m.index), style: {} });\n if (m[2] !== undefined) out.push({ text: m[2], style: { bold: true, italic: true } });\n else if (m[3] !== undefined) out.push({ text: m[3], style: { bold: true } });\n else if (m[4] !== undefined) out.push({ text: m[4], style: { italic: true } });\n else if (m[5] !== undefined) out.push({ text: m[5], style: { strikethrough: true } });\n else if (m[6] !== undefined) out.push({ text: m[6], style: { underline: true } });\n else if (m[7] !== undefined) {\n out.push({ text: m[7], style: { color: LINK_COLOR, underline: true }, url: m[8] });\n }\n last = m.index + m[0].length;\n }\n if (last < input.length) out.push({ text: input.slice(last), style: {} });\n return out.filter((t) => t.text.length > 0);\n}\n\nfunction blockProps(line: string): { rest: string; para: ParagraphProps } {\n const heading = line.match(/^(#{1,3})\\s+(.*)$/);\n if (heading) {\n return { rest: heading[2], para: { ...DEFAULT_PARAGRAPH, heading: heading[1].length as HeadingLevel } };\n }\n const ul = line.match(/^(\\s*)[-*+]\\s+(.*)$/);\n if (ul) {\n const indent = Math.min(8, Math.floor(ul[1].replace(/\\t/g, ' ').length / 2));\n return { rest: ul[2], para: { ...DEFAULT_PARAGRAPH, list: 'ul', indent } };\n }\n const ol = line.match(/^(\\s*)\\d+\\.\\s+(.*)$/);\n if (ol) {\n const indent = Math.min(8, Math.floor(ol[1].replace(/\\t/g, ' ').length / 2));\n return { rest: ol[2], para: { ...DEFAULT_PARAGRAPH, list: 'ol', indent } };\n }\n return { rest: line, para: { ...DEFAULT_PARAGRAPH } };\n}\n\n/** 支持的 Markdown 子集:标题/列表/粗斜下划删除线/链接/代码块/公式。 */\nexport function markdownToSlice(raw: string): Slice {\n const text = raw.replace(/\\r\\n/g, '\\n').replace(/\\r/g, '\\n');\n const lines = text.split('\\n');\n let spacers = '';\n const styles: StyleSpan[] = [];\n const entities: EmbedEntity[] = [];\n\n const emitPara = (line: string) => {\n const { rest, para } = blockProps(line);\n const start = spacers.length;\n const tokens = parseInline(rest);\n for (const tok of tokens) {\n const a = spacers.length;\n spacers += tok.text;\n const b = spacers.length;\n if (Object.keys(tok.style).length) {\n styles.push({ start: a, end: b, type: 'text', props: { ...tok.style } });\n }\n if (tok.url) styles.push({ start: a, end: b, type: 'link', props: { url: tok.url } });\n }\n spacers += MARKERS.PARAGRAPH;\n styles.push({ start, end: spacers.length, type: 'paragraph', props: { ...para } });\n };\n\n const emitEmbed = (entity: EmbedEntity) => {\n const start = spacers.length;\n spacers += MARKERS.IMAGE;\n styles.push({ start, end: start + 1, type: 'image', props: { entityId: entity.id } });\n entities.push(entity);\n spacers += MARKERS.PARAGRAPH;\n styles.push({ start, end: spacers.length, type: 'paragraph', props: { ...DEFAULT_PARAGRAPH } });\n };\n\n let i = 0;\n if (lines.length === 0) emitPara('');\n while (i < lines.length) {\n const line = lines[i];\n const fence = line.match(/^```(\\w*)\\s*$/);\n if (fence) {\n const buf: string[] = [];\n i += 1;\n while (i < lines.length && !/^```\\s*$/.test(lines[i])) {\n buf.push(lines[i]);\n i += 1;\n }\n if (i < lines.length) i += 1;\n emitEmbed({\n id: `md_${entities.length}`,\n kind: 'code',\n width: 680,\n height: 80,\n language: fence[1] || 'plain',\n code: buf.join('\\n')\n });\n continue;\n }\n const oneLineMath = line.match(/^\\$\\$(.+)\\$\\$\\s*$/);\n if (oneLineMath) {\n emitEmbed({\n id: `md_${entities.length}`,\n kind: 'formula',\n width: 200,\n height: 48,\n latex: oneLineMath[1],\n displayMode: true\n });\n i += 1;\n continue;\n }\n if (line.trim() === '$$') {\n const buf: string[] = [];\n i += 1;\n while (i < lines.length && lines[i].trim() !== '$$') {\n buf.push(lines[i]);\n i += 1;\n }\n if (i < lines.length) i += 1;\n emitEmbed({\n id: `md_${entities.length}`,\n kind: 'formula',\n width: 200,\n height: 48,\n latex: buf.join('\\n'),\n displayMode: true\n });\n continue;\n }\n emitPara(line);\n i += 1;\n }\n\n return { text: spacers, styles, entities };\n}\n","/**\n * 切片类 Operation:粘贴、Markdown 整段导入、同步块的提取与展开。\n *\n * 切片自带实体,插入时 id 可能和文档里已有的撞车,所以先做一轮改名再落地。\n */\nimport { findParagraphAt } from '../model/blocks';\nimport { cloneFragment, cloneSlice, sliceHasContent } from '../model/fragment';\nimport { cloneEntity, Fragment, ImageEntity, Slice, StyleType, TextProps } from '../model/types';\nimport { MARKERS } from '../model/markers';\nimport {\n collapsedSel,\n DocumentModel,\n documentFromSlice,\n nextEntityId,\n sliceFromDocument\n} from '../model/document';\nimport { addEntity, addFragment } from '../mutations';\nimport { looksLikeMarkdown, markdownToSlice } from '../convert/mdPaste';\nimport { Operation, runOperation } from './context';\nimport { emitDelete, emitInsert, emitStyle, normalizeParagraphs } from './primitives';\nimport { insertImage } from './entity';\nimport { insertParagraph, insertText } from './text';\nimport { coverAncestorsOf, fillSlot, insertVirtualBlock, remapIncomingVirtualBlocks, slotInlineText } from './virtualBlock';\nimport type { VirtualBlockSpec } from './virtualBlock';\n\n/**\n * 把切片里的同步块引用换成引用目标的实际内容。\n *\n * 跨文档粘贴不该带走一个指向源文档的悬空引用,所以复制粘贴前要先摊平。\n * 展开在一个临时文档上做,不碰真文档,因此不产生 mutation。\n */\nfunction materializeSlice(doc: DocumentModel, slice: Slice): Slice {\n if (!slice.entities.some((e) => e.kind === 'ref')) return cloneSlice(slice);\n const lookup = new Map(doc.fragments);\n for (const f of (slice.fragments ?? []) as Fragment[]) lookup.set(f.id, cloneFragment(f));\n\n const scratch = documentFromSlice(slice);\n // 从后往前换,免得前面的替换把后面引用的坐标顶跑。\n for (let i = scratch.spacers.length - 1; i >= 0; i--) {\n if (scratch.spacers[i] !== MARKERS.IMAGE) continue;\n const entity = scratch.imageAt(i);\n if (entity?.kind !== 'ref' || !entity.fragmentId) continue;\n const source = lookup.get(entity.fragmentId);\n runOperation(scratch, collapsedSel(i), (c) => {\n emitDelete(c, i, i + 1);\n normalizeParagraphs(c);\n if (source) insertSlice(i, cloneSlice(source.slice), false)(c);\n });\n }\n return sliceFromDocument(scratch);\n}\n\n/**\n * 把一个切片插到 index 处。\n *\n * asCopy 为真时先把切片里的同步块引用摊平成实际内容 —— 跨文档粘贴不该带走\n * 一个指向源文档的悬空引用。\n */\nexport function insertSlice(index: number, slice: Slice, asCopy = true): Operation<number> {\n return (ctx) => {\n const doc = ctx.doc;\n const incoming = asCopy ? materializeSlice(doc, slice) : cloneSlice(slice);\n const i = doc.clamp(index);\n const slot = doc.slotAtCaret(i);\n const nested =\n (incoming.virtualBlocks?.length ?? 0) > 0 || incoming.entities.length > 0;\n if (slot?.empty && !nested) {\n const text = slotInlineText(incoming.text);\n if (text) {\n const end = fillSlot(slot.id, text)(ctx);\n return end ?? i;\n }\n }\n\n const remap = new Map<string, string>();\n const entities = incoming.entities.map((e) => {\n if (!doc.entities.has(e.id)) return cloneEntity(e);\n const next = { ...cloneEntity(e), id: nextEntityId() };\n remap.set(e.id, next.id);\n return next;\n });\n\n emitInsert(ctx, i, incoming.text);\n for (const e of entities) ctx.emit(addEntity(e));\n for (const s of incoming.styles) {\n const props =\n s.type === 'image' && remap.size\n ? {\n ...(s.props as { entityId: string }),\n entityId:\n remap.get((s.props as { entityId: string }).entityId) ??\n (s.props as { entityId: string }).entityId\n }\n : { ...s.props };\n emitStyle(ctx, s.type as StyleType, s.start + i, s.end + i, props);\n }\n // 空槽插入模板:整段落在槽前(槽被机械推走),不要 cover 把树吞进槽里。\n if (slot && !slot.empty) {\n coverAncestorsOf(slot.id, i, i + incoming.text.length)(ctx);\n } else {\n const occupied = new Set(ctx.doc.virtualBlocks.keys());\n for (const block of remapIncomingVirtualBlocks(incoming.virtualBlocks ?? [], i, occupied)) {\n const spec: VirtualBlockSpec = {\n id: block.id,\n kind: block.kind,\n start: block.start,\n end: block.end,\n chrome: block.chrome,\n placeholder: block.placeholder,\n empty: block.empty\n };\n if (block.parentId) spec.parentId = block.parentId;\n insertVirtualBlock(spec)(ctx);\n }\n }\n normalizeParagraphs(ctx);\n return i + incoming.text.length;\n };\n}\n\n/** 把一段 Markdown 原文导入到 index 处。段落中间导入时先把段切开。 */\nexport function insertMarkdown(index: number, raw: string): Operation<number> {\n return (ctx) => {\n const doc = ctx.doc;\n const i = doc.clamp(index);\n const para = findParagraphAt(doc.spacers, i);\n const paraEnd =\n para && doc.spacers[para.end - 1] === MARKERS.PARAGRAPH ? para.end - 1 : para?.end ?? i;\n const at = para && i > para.start && i < paraEnd ? insertParagraph(i)(ctx) : i;\n\n const slice = markdownToSlice(raw);\n let text = slice.text;\n let styles = slice.styles;\n // 导入内容自带结尾段分隔符,而落点后面已经有一个了,去掉一个免得多出空行。\n if (text.endsWith(MARKERS.PARAGRAPH) && doc.spacers[at] === MARKERS.PARAGRAPH) {\n const cut = text.length - 1;\n text = text.slice(0, cut);\n styles = styles\n .map((s) => ({ ...s, start: Math.min(s.start, cut), end: Math.min(s.end, cut) }))\n .filter((s) => s.end > s.start);\n }\n insertSlice(at, { text, styles, entities: slice.entities })(ctx);\n return at + text.length;\n };\n}\n\n/** 粘贴纯文本。看起来像 Markdown 就走导入,否则当普通文字插入。 */\nexport function pasteText(index: number, raw: string, inherit?: TextProps): Operation<number> {\n return (ctx) =>\n looksLikeMarkdown(raw) ? insertMarkdown(index, raw)(ctx) : insertText(index, raw, inherit)(ctx);\n}\n\n/**\n * 把一段内容提取成同步块,原地换成一个引用。\n *\n * fragment 的新建走 addFragment mutation,和后续的删除、插入引用一起进操作串,\n * 因此整步可撤销、可协同。\n */\nexport function promoteRange(start: number, end: number): Operation<{ fragmentId: string; index: number } | null> {\n return (ctx) => {\n const doc = ctx.doc;\n const from = doc.clamp(Math.min(start, end));\n const to = doc.clamp(Math.max(start, end));\n if (from >= to || doc.rangeHasRef(from, to)) return null;\n const slice = doc.takeSlice(from, to);\n if (!sliceHasContent(slice)) return null;\n\n const fragment = doc.buildFragment(slice);\n ctx.emit(addFragment(fragment));\n emitDelete(ctx, from, to);\n normalizeParagraphs(ctx);\n const index = insertRef(from, fragment.id)(ctx);\n return { fragmentId: fragment.id, index };\n };\n}\n\n/** 在 index 处插一个指向同步块的引用,返回引用占位符自身的位置。 */\nexport function insertRef(index: number, fragmentId: string): Operation<number> {\n return (ctx) => {\n if (!ctx.doc.fragments.has(fragmentId)) return ctx.doc.clamp(index);\n const entity: Omit<ImageEntity, 'id'> = {\n kind: 'ref',\n fragmentId,\n width: 680,\n height: 80\n };\n return insertImage(index, entity)(ctx) - 1;\n };\n}\n\n/** 把引用就地展开成实际内容,引用本身消失。返回展开后的末尾位置。 */\nexport function unlinkRef(index: number): Operation<number | null> {\n return (ctx) => {\n const doc = ctx.doc;\n const i = doc.clamp(index);\n const entity = doc.imageAt(i);\n if (entity?.kind !== 'ref' || !entity.fragmentId) return null;\n const fragment = doc.fragments.get(entity.fragmentId);\n if (!fragment) return null;\n emitDelete(ctx, i, i + 1);\n normalizeParagraphs(ctx);\n return insertSlice(i, cloneSlice(fragment.slice), true)(ctx);\n };\n}\n","/**\n * 编辑事务 —— 一次用户操作的边界。\n *\n * 事务干的事:起一个 Operation 上下文、把里面产生的操作串收起来、包成一条\n * `EditResult` 交给撤销栈。它不碰 UI,也不决定要做什么编辑,所以宿主和自检\n * 能走同一条路径。\n *\n * 选区在事务期间归上下文管:Operation 用 `ctx.select` 落点,事务结束时一并交回。\n * 这样撤销栈拿到的「操作前/操作后选区」和操作串是同一份数据里配套的。\n */\nimport { DocumentModel } from '../model/document';\nimport { Selection } from '../model/types';\nimport { Operation, OperationContext, OperationRun, runOperation, scopeContext } from '../operations';\nimport { EditKind, EditMeta, EditResult, editResult } from './editResult';\n\nexport interface EditOutcome {\n /** 这次编辑的记录。没有产生任何变更时是 null,不该进撤销栈。 */\n edit: EditResult | null;\n /** 事务结束时的选区,属于 `meta.scope` 指定的坐标空间。 */\n selectionAfter: Selection;\n}\n\n/**\n * 在指定坐标空间里跑一段 Operation,不包装成编辑记录。\n *\n * `scope` 非空时上下文先切到该片段的坐标空间 —— Operation 原样复用,发出的\n * mutation 自动包上 `scoped`。拖拽预览这类不进撤销栈的改动直接用它。\n */\nexport function runScoped<R>(\n doc: DocumentModel,\n selection: Selection,\n scope: string | null,\n op: Operation<R>\n): { run: OperationRun; result: R } {\n return runOperation(doc, selection, (outer) => op(scope ? scopeContext(outer, scope) : outer));\n}\n\n/** 跑一次编辑事务,产出一条能进撤销栈的记录。 */\nexport function runEdit(\n doc: DocumentModel,\n selection: Selection,\n meta: Partial<EditMeta> & { kind: EditKind },\n run: (ctx: OperationContext) => void\n): EditOutcome {\n const { run: result } = runScoped(doc, selection, meta.scope ?? null, run);\n\n if (!result.forward.length) {\n return { edit: null, selectionAfter: result.selectionAfter };\n }\n return {\n edit: editResult({\n mutations: result.forward,\n inverse: result.inverse,\n selectionBefore: result.selectionBefore,\n selectionAfter: result.selectionAfter,\n meta\n }),\n selectionAfter: result.selectionAfter\n };\n}\n","/**\n * 撤销栈。\n *\n * 与「存整篇快照」的做法相比,这里存的是操作对,所以两件事成为可能:\n * 一是连续输入能在时间窗口内合并成一步;二是撤销时能把逆操作变换到\n * 「协作者的改动已经落地」之后的坐标系里,撤销自己的编辑不会误伤别人的。\n *\n * 栈顶是下标 0(最近一步),与遍历「比它更新的操作」的写法配合更自然。\n */\nimport { Selection } from '../model/types';\nimport { EditResult, invertEdit, isEmptyEdit, mergeEdits } from './editResult';\nimport { transformBoth, transformSelection } from '../mutations';\n\n/** 连续输入的合并窗口。超过这个间隔就另起一步。 */\nexport const UNDO_BATCH_MS = 2000;\n\nexport class UndoRedoStack {\n private undos: EditResult[] = [];\n private redos: EditResult[] = [];\n private lastPushAt = 0;\n private batchOpen = false;\n private now: () => number;\n\n constructor(now: () => number = () => Date.now()) {\n this.now = now;\n }\n\n get canUndo(): boolean {\n return this.undos.some((e) => e.meta.local && e.meta.undoable);\n }\n\n get canRedo(): boolean {\n return this.redos.length > 0;\n }\n\n clear() {\n this.undos = [];\n this.redos = [];\n this.batchOpen = false;\n }\n\n /** 选区被用户主动移动时调用,打断合并窗口。 */\n resetBatching() {\n this.batchOpen = false;\n }\n\n push(edit: EditResult) {\n if (isEmptyEdit(edit)) return;\n\n if (!edit.meta.local) {\n // 远端操作也要进栈:撤销本地操作时需要跨过它们做变换\n this.undos.unshift(edit);\n this.batchOpen = false;\n return;\n }\n\n // 合并要三个条件同时成立:在时间窗口内、批次没被打断、两步是同一串\n // 连续动作(mergeKey 相同且非 null)。少了最后一条,「打几个字」和紧随其后的\n // 「点加粗」会被并成一步,撤销时文字和加粗一起消失。\n const top = this.undos[0];\n const withinWindow = this.batchOpen && this.now() - this.lastPushAt < UNDO_BATCH_MS;\n const sameRun = !!edit.meta.mergeKey && top?.meta.mergeKey === edit.meta.mergeKey;\n if (withinWindow && sameRun && top?.meta.local && top.meta.undoable && edit.meta.undoable) {\n this.undos[0] = mergeEdits(top, edit);\n } else {\n this.undos.unshift(edit);\n this.batchOpen = true;\n }\n this.lastPushAt = this.now();\n this.redos = [];\n }\n\n /**\n * 取出下一步要撤销的操作,已变换到当前坐标系。\n *\n * 栈里可能夹着协作者的操作,所以不能直接弹栈顶:要找到最近一条本地可撤销的,\n * 把它的逆操作依次穿过它上面那些更新的操作,同时把那些操作也反向变换一遍\n * (它们的坐标系因为这次撤销也变了,留在栈里下次还要用)。\n */\n popForUndo(): EditResult | null {\n const index = this.undos.findIndex((e) => e.meta.local && e.meta.undoable);\n if (index < 0) return null;\n\n let target = this.undos[index];\n for (let i = index - 1; i >= 0; i--) {\n target = this.rebase(target, i);\n }\n this.undos.splice(index, 1);\n\n const undoStep = invertEdit(target);\n this.redos.unshift(target);\n this.batchOpen = false;\n return undoStep;\n }\n\n popForRedo(): EditResult | null {\n const target = this.redos.shift();\n if (!target) return null;\n this.undos.unshift(target);\n this.batchOpen = false;\n return target;\n }\n\n /**\n * 把 target 变换到「栈中第 i 条(更新的那条)已应用」之后,\n * 同时把第 i 条变换到「target 被撤销」之后。\n */\n private rebase(target: EditResult, i: number): EditResult {\n const intervening = this.undos[i];\n // 撤销时真正要跑的是逆操作,所以拿它去和中间操作对撞\n const pair = transformBoth(target.inverse, intervening.mutations, true);\n const forward = transformBoth(target.mutations, intervening.mutations, true);\n\n this.undos[i] = {\n ...intervening,\n mutations: pair.b,\n inverse: transformBoth(intervening.inverse, target.inverse, false).a\n };\n\n return {\n ...target,\n mutations: forward.a,\n inverse: pair.a,\n selectionBefore: transformSelection(target.selectionBefore, intervening.mutations),\n selectionAfter: transformSelection(target.selectionAfter, intervening.mutations)\n };\n }\n\n /** 远端操作落地后,把栈里所有本地操作变换到新坐标系。 */\n rebaseAgainstRemote(remote: EditResult) {\n for (let i = 0; i < this.undos.length; i++) {\n const e = this.undos[i];\n this.undos[i] = {\n ...e,\n mutations: transformBoth(e.mutations, remote.mutations, false).a,\n inverse: transformBoth(e.inverse, remote.mutations, false).a,\n selectionBefore: transformSelection(e.selectionBefore, remote.mutations),\n selectionAfter: transformSelection(e.selectionAfter, remote.mutations)\n };\n }\n for (let i = 0; i < this.redos.length; i++) {\n const e = this.redos[i];\n this.redos[i] = {\n ...e,\n mutations: transformBoth(e.mutations, remote.mutations, false).a,\n inverse: transformBoth(e.inverse, remote.mutations, false).a\n };\n }\n }\n\n /** 调试用:当前撤销栈里各步的操作条数。 */\n describe(): { undos: number[]; redos: number[] } {\n return {\n undos: this.undos.map((e) => e.mutations.length),\n redos: this.redos.map((e) => e.mutations.length)\n };\n }\n}\n\nexport type { EditResult, Selection };\n","export interface ImeHandler {\n onInsertText(text: string): void;\n onInsertParagraph(): void;\n onBackspace(): void;\n onDeleteForward(): void;\n onPaste(data: DataTransfer | null): void;\n onCompositionChange(active: boolean, text: string): void;\n}\n\nexport class ImeSurface {\n readonly el: HTMLDivElement;\n composing = false;\n private handler: ImeHandler;\n private keyConsumed = false;\n\n constructor(handler: ImeHandler) {\n this.handler = handler;\n this.el = document.createElement('div');\n this.el.className = 'mini-ime';\n this.el.contentEditable = 'true';\n this.el.spellcheck = false;\n this.el.setAttribute('role', 'textbox');\n this.el.setAttribute('aria-multiline', 'true');\n this.el.addEventListener('beforeinput', this.onBeforeInput);\n this.el.addEventListener('compositionstart', this.onCompStart);\n this.el.addEventListener('compositionupdate', this.onCompUpdate);\n this.el.addEventListener('compositionend', this.onCompEnd);\n this.el.addEventListener('paste', this.onPaste);\n this.el.addEventListener('keydown', this.onKeydownGuard);\n }\n\n focus() {\n if (document.activeElement !== this.el) this.el.focus({ preventScroll: true });\n }\n\n markKeyConsumed() {\n this.keyConsumed = true;\n }\n\n moveTo(x: number, y: number, h: number) {\n this.el.style.left = `${x}px`;\n this.el.style.top = `${y}px`;\n this.el.style.height = `${Math.max(18, h)}px`;\n }\n\n clear() {\n this.el.textContent = '';\n }\n\n destroy() {\n this.el.removeEventListener('beforeinput', this.onBeforeInput);\n this.el.removeEventListener('compositionstart', this.onCompStart);\n this.el.removeEventListener('compositionupdate', this.onCompUpdate);\n this.el.removeEventListener('compositionend', this.onCompEnd);\n this.el.removeEventListener('paste', this.onPaste);\n this.el.removeEventListener('keydown', this.onKeydownGuard);\n this.el.remove();\n }\n\n private onCompStart = () => {\n this.composing = true;\n this.el.classList.add('is-composing');\n this.handler.onCompositionChange(true, '');\n };\n\n private onCompUpdate = (e: CompositionEvent) => {\n this.handler.onCompositionChange(true, e.data ?? this.el.textContent ?? '');\n };\n\n private onCompEnd = (e: CompositionEvent) => {\n this.composing = false;\n this.el.classList.remove('is-composing');\n const text = e.data || this.el.textContent || '';\n this.clear();\n this.handler.onCompositionChange(false, '');\n if (text) this.handler.onInsertText(text);\n };\n\n private onBeforeInput = (e: InputEvent) => {\n if (this.keyConsumed) {\n this.keyConsumed = false;\n // 快捷键在 keydown 里已经改过模型,这里只吞「同一次按键」带出来的默认输入\n // (退格/删除/换段)。keydown 若已 preventDefault,有的浏览器根本不会再派\n // 这次 beforeinput,标志会一直挂到下一键;绝不能把随后的 insertText 也挡掉,\n // 否则删除后再打的第一个字符会消失,第二次才进得去。\n const echo =\n e.inputType.startsWith('delete') ||\n e.inputType === 'insertParagraph' ||\n e.inputType === 'insertLineBreak';\n if (echo) {\n e.preventDefault();\n return;\n }\n }\n if (e.inputType === 'insertCompositionText') return;\n // 组合态里的一切输入(含删除候选串的 delete*)都交给浏览器在这个\n // contentEditable 内部消化。组合串的增删经 compositionupdate 镜像到模型,\n // 删除永远只作用在候选串上,绝不落到文档正文。\n if (this.composing) return;\n e.preventDefault();\n switch (e.inputType) {\n case 'insertText':\n case 'insertReplacementText':\n if (e.data) this.handler.onInsertText(e.data);\n break;\n case 'insertParagraph':\n case 'insertLineBreak':\n this.handler.onInsertParagraph();\n break;\n case 'deleteContentBackward':\n this.handler.onBackspace();\n break;\n case 'deleteContentForward':\n this.handler.onDeleteForward();\n break;\n case 'insertFromPaste':\n break;\n default:\n break;\n }\n };\n\n private onPaste = (e: ClipboardEvent) => {\n e.preventDefault();\n this.handler.onPaste(e.clipboardData);\n };\n\n private onKeydownGuard = (e: KeyboardEvent) => {\n if (e.key === 'Tab') e.preventDefault();\n };\n}\n","/**\n * 快捷键表。\n *\n * 一张纯数据表:按键组合 → 命令。它不认识 DOM 事件,也不认识编辑器 —— 匹配用的\n * 是 {@link KeyStroke} 这个最小结构,由输入源从事件里摘出来。这样这张表可以被\n * 直接断言,也可以将来换成宿主配置的。\n */\nimport { ArrowKey, CommandTable } from './types';\n\n/** 一次按键,从平台事件里摘出来的最小信息。 */\nexport interface KeyStroke {\n /** `KeyboardEvent.key`,大小写原样 */\n key: string;\n /** Cmd(mac)或 Ctrl */\n mod: boolean;\n shift: boolean;\n}\n\nexport interface Shortcut {\n /** 匹配的键名,单字母键写小写 */\n key: string;\n /** 是否要求按下 Cmd/Ctrl。省略等同 false —— 必须**没**按 */\n mod?: boolean;\n /** true 要求按 Shift,false 要求没按,省略则不管 */\n shift?: boolean;\n /**\n * 这个键本身会引发一次文本输入(beforeInput)。吞掉按键之后还得把那次输入一并\n * 压掉,否则内容会被写两遍。只有真正产生输入的键要标。\n *\n * 注意:keydown 里会 preventDefault,部分浏览器因此不再派 beforeinput。\n * IME 层只能按 inputType 吞删除/换段回声,不能无差别丢掉下一次 insertText。\n */\n suppressesInput?: boolean;\n /** 返回 false 表示这次没处理,事件不该被吞 */\n run(c: CommandTable, stroke: KeyStroke): void | boolean;\n}\n\nconst arrow = (key: ArrowKey): Shortcut => ({\n key,\n run: (c, s) => c.moveCaret(key, s.shift)\n});\n\n/**\n * 顺序有意义:从上往下取第一条匹配的。带修饰键的排在前面,免得被无修饰键的\n * 条目截住。\n */\nexport const SHORTCUTS: Shortcut[] = [\n { key: 'z', mod: true, shift: false, run: (c) => c.undo() },\n { key: 'z', mod: true, shift: true, run: (c) => c.redo() },\n { key: 'y', mod: true, run: (c) => c.redo() },\n { key: 'b', mod: true, run: (c) => c.toggleBold() },\n { key: 'i', mod: true, run: (c) => c.toggleItalic() },\n { key: 'u', mod: true, run: (c) => c.toggleUnderline() },\n { key: 'k', mod: true, run: (c) => c.toggleLink() },\n { key: 'a', mod: true, run: (c) => c.selectAll() },\n\n { key: 'Escape', run: (c) => c.exitFragment() },\n { key: 'Enter', suppressesInput: true, run: (c, s) => c.insertParagraph({ shift: s.shift }) },\n { key: 'Backspace', suppressesInput: true, run: (c) => c.backspace() },\n { key: 'Delete', suppressesInput: true, run: (c) => c.deleteForward() },\n { key: 'Tab', run: (c, s) => c.indentOrNextCell(s.shift ? -1 : 1) },\n\n arrow('ArrowLeft'),\n arrow('ArrowRight'),\n arrow('ArrowUp'),\n arrow('ArrowDown')\n];\n\n/**\n * 嵌入式输入框用的快捷键表:保留撤销/选区/删除/方向键,关掉加粗链接。\n * Enter 不在这张底表里,请用 {@link inputShortcuts} 补上换行,否则\n * keydown 不 preventDefault,contenteditable 的 beforeinput 仍会插段。\n */\nconst swallow: Shortcut['run'] = () => undefined;\n\nexport const INPUT_SHORTCUTS: Shortcut[] = [\n { key: 'z', mod: true, shift: false, run: (c) => c.undo() },\n { key: 'z', mod: true, shift: true, run: (c) => c.redo() },\n { key: 'y', mod: true, run: (c) => c.redo() },\n { key: 'b', mod: true, run: swallow },\n { key: 'i', mod: true, run: swallow },\n { key: 'u', mod: true, run: swallow },\n { key: 'k', mod: true, run: swallow },\n { key: 'a', mod: true, run: (c) => c.selectAll() },\n { key: 'Backspace', suppressesInput: true, run: (c) => c.backspace() },\n { key: 'Delete', suppressesInput: true, run: (c) => c.deleteForward() },\n arrow('ArrowLeft'),\n arrow('ArrowRight'),\n arrow('ArrowUp'),\n arrow('ArrowDown')\n];\n\n/**\n * 输入框快捷键。\n * - `newline`:Enter / Shift+Enter 都换行;Cmd/Ctrl+Enter 不登记,留给宿主提交。\n * - `enter` / `shift-enter`:旧口径(引擎仍提供,嵌入式输入框不要用)。\n */\nexport function inputShortcuts(\n submit: 'newline' | 'enter' | 'shift-enter' = 'newline'\n): Shortcut[] {\n if (submit === 'newline') {\n return [\n ...INPUT_SHORTCUTS,\n { key: 'Enter', suppressesInput: true, run: (c, s) => c.insertParagraph({ shift: s.shift }) }\n ];\n }\n const submitUsesShift = submit === 'shift-enter';\n return [\n ...INPUT_SHORTCUTS,\n { key: 'Enter', shift: submitUsesShift, suppressesInput: true, run: swallow },\n {\n key: 'Enter',\n shift: !submitUsesShift,\n suppressesInput: true,\n run: (c, s) => c.insertParagraph({ shift: s.shift })\n }\n ];\n}\n\nfunction matches(sc: Shortcut, stroke: KeyStroke): boolean {\n // 单字母键统一按小写比,这样 Cmd+Shift+Z 和 Cmd+Z 走同一套判断\n const key = sc.key.length === 1 ? stroke.key.toLowerCase() : stroke.key;\n if (key !== sc.key) return false;\n if (stroke.mod !== (sc.mod ?? false)) return false;\n if (sc.shift !== undefined && stroke.shift !== sc.shift) return false;\n return true;\n}\n\nexport function findShortcut(stroke: KeyStroke, table: Shortcut[] = SHORTCUTS): Shortcut | null {\n return table.find((sc) => matches(sc, stroke)) ?? null;\n}\n","/**\n * 键盘输入源:DOM 事件 → 命令。\n *\n * 这里只做三件事:判断该不该管这个事件、查表、跑命令。它不碰模型也不碰选区 ——\n * 所以「哪个键干什么」改起来只动 `commands/shortcuts.ts`,不用进这个文件。\n */\nimport { CommandTable, findShortcut, KeyStroke, Shortcut, SHORTCUTS } from '../commands';\n\n/**\n * 组合输入期间仍然放行的键。Enter 不在其列:组合态的回车是“确认候选”,由 IME 消化,\n * 绝不触发换行(否则中文输入选词按回车会错误插入段落)。\n */\nconst IME_PASSTHROUGH = new Set(['Backspace', 'Delete', 'Escape']);\n\nexport interface KeyboardHost {\n commands: CommandTable;\n /** 这个事件归不归本编辑器管(焦点、输入框内、嵌入对象里等) */\n accepts(e: KeyboardEvent): boolean;\n /** 组合输入是否进行中 */\n composing(): boolean;\n /** 吞掉了一个会引发文本输入的键,通知宿主连带压掉那次输入 */\n suppressInput(e: KeyboardEvent): void;\n shortcuts?: Shortcut[];\n}\n\nexport function strokeOf(e: KeyboardEvent): KeyStroke {\n return { key: e.key, mod: e.metaKey || e.ctrlKey, shift: e.shiftKey };\n}\n\n/** 挂上 keydown 监听,返回解绑函数。 */\nexport function bindKeyboard(host: KeyboardHost): () => void {\n const table = host.shortcuts ?? SHORTCUTS;\n\n const onKeyDown = (e: KeyboardEvent) => {\n if (!host.accepts(e)) return;\n // 组合输入进行中(中文候选框开着)时,回车/空格等键属于 IME 的“确认候选”动作,\n // 应交给 IME 消化,编辑器不得据此换行或插入。原生 isComposing 由浏览器在整个\n // 组合过程(含确认候选的那次按键)置真,比自维护状态更可靠,能覆盖 compositionend\n // 与 keydown 的时序竞态。keyCode 229 是同一语义在旧实现下的回退标志。\n if (e.isComposing || e.keyCode === 229) return;\n if (host.composing() && !IME_PASSTHROUGH.has(e.key)) return;\n\n const stroke = strokeOf(e);\n const sc = findShortcut(stroke, table);\n if (!sc) return;\n if (sc.run(host.commands, stroke) === false) return;\n\n e.preventDefault();\n if (sc.suppressesInput) host.suppressInput(e);\n };\n\n document.addEventListener('keydown', onKeyDown);\n return () => document.removeEventListener('keydown', onKeyDown);\n}\n","import { ImageEntity, Slice, StyleSpan } from '../model/types';\n\n/** 自定义剪贴板 MIME:跨编辑器粘贴时保全样式与嵌入实体。 */\nexport const SLICE_MIME = 'text/x-mini-editor-slice';\n\nexport function serializeSlice(slice: Slice): string {\n return JSON.stringify(slice);\n}\n\nexport function parseSlice(raw: string): Slice | null {\n if (!raw) return null;\n try {\n const data = JSON.parse(raw) as Slice;\n if (!data || typeof data.text !== 'string' || !Array.isArray(data.styles)) return null;\n return {\n text: data.text,\n styles: (data.styles as StyleSpan[]).filter((s) => typeof s.start === 'number' && typeof s.end === 'number'),\n entities: Array.isArray(data.entities) ? (data.entities as ImageEntity[]) : [],\n virtualBlocks: Array.isArray(data.virtualBlocks) ? data.virtualBlocks : undefined\n };\n } catch {\n return null;\n }\n}\n\nexport function sliceFromClipboard(data: DataTransfer | null): Slice | null {\n if (!data) return null;\n return parseSlice(data.getData(SLICE_MIME));\n}\n","import { embedPlugin, syncEmbedLayer } from '../embed';\nimport { canvasFont, FONT_FAMILY } from '../layout/measure';\nimport { CaretPos, DocLayout, GlyphBox, SelRect } from '../layout/types';\nimport { canvasFill, groupDecorationRuns, paintCanvasStrike, paintCanvasUnderline } from './decorations';\nimport { PaintBackend } from './types';\n\nexport class CanvasPainter implements PaintBackend {\n private host: HTMLElement | null = null;\n private surface: HTMLElement | null = null;\n private canvas: HTMLCanvasElement | null = null;\n private chrome: HTMLCanvasElement | null = null;\n private ctx: CanvasRenderingContext2D | null = null;\n private chromeCtx: CanvasRenderingContext2D | null = null;\n private layout: DocLayout | null = null;\n private selRects: SelRect[] = [];\n private caret: CaretPos | null = null;\n private caretVisible = false;\n private caretTrails: CaretPos[] = [];\n private imageCache = new Map<string, HTMLImageElement>();\n private embeds: HTMLElement | null = null;\n private embedCache = new Map<string, HTMLElement>();\n private hasContent = false;\n\n mount(host: HTMLElement) {\n this.destroy();\n this.host = host;\n this.surface = document.createElement('div');\n this.surface.className = 'mini-surface mini-surface-canvas';\n this.canvas = document.createElement('canvas');\n this.canvas.className = 'mini-canvas';\n this.chrome = document.createElement('canvas');\n this.chrome.className = 'mini-canvas mini-canvas-chrome';\n this.embeds = document.createElement('div');\n this.embeds.className = 'mini-layer mini-embeds';\n this.ctx = this.canvas.getContext('2d');\n this.chromeCtx = this.chrome.getContext('2d');\n this.surface.append(this.canvas, this.embeds, this.chrome);\n host.appendChild(this.surface);\n }\n\n getSurface(): HTMLElement {\n if (!this.surface) throw new Error('painter not mounted');\n return this.surface;\n }\n\n paintDoc(layout: DocLayout) {\n const prev = this.layout;\n this.layout = layout;\n const resized = this.resize(layout);\n // 画布尺寸一变,内容整块作废,只能全画\n const band =\n resized || !this.hasContent\n ? { top: 0, bottom: Math.max(layout.height, prev?.height ?? 0) }\n : layout.dirty;\n this.redrawContent(band);\n if (this.embeds) syncEmbedLayer(this.embeds, this.embedCache, layout.images, true);\n this.redrawChrome();\n }\n\n paintSelection(rects: SelRect[]) {\n this.selRects = rects;\n this.redrawChrome();\n }\n\n paintCaret(caret: CaretPos | null, visible: boolean, trails: CaretPos[] = []) {\n this.caret = caret;\n this.caretVisible = visible;\n this.caretTrails = trails;\n this.redrawChrome();\n }\n\n destroy() {\n this.surface?.remove();\n this.host = null;\n this.surface = null;\n this.canvas = null;\n this.chrome = null;\n this.embeds = null;\n this.ctx = null;\n this.chromeCtx = null;\n this.layout = null;\n this.hasContent = false;\n this.imageCache.clear();\n for (const node of this.embedCache.values()) node.remove();\n this.embedCache.clear();\n }\n\n private resize(layout: DocLayout): boolean {\n if (!this.surface || !this.canvas || !this.chrome || !this.ctx || !this.chromeCtx) return false;\n this.surface.style.width = `${layout.width}px`;\n this.surface.style.height = `${layout.height}px`;\n const dpr = window.devicePixelRatio || 1;\n const w = Math.max(1, Math.round(layout.width * dpr));\n const h = Math.max(1, Math.round(layout.height * dpr));\n const resized = this.canvas.width !== w || this.canvas.height !== h;\n if (resized) {\n for (const node of [this.canvas, this.chrome]) {\n node.width = w;\n node.height = h;\n node.style.width = `${layout.width}px`;\n node.style.height = `${layout.height}px`;\n }\n }\n this.ctx.setTransform(dpr, 0, 0, dpr, 0, 0);\n this.chromeCtx.setTransform(dpr, 0, 0, dpr, 0, 0);\n return resized;\n }\n\n /** 只重画脏区带:clip 到那一条,擦白,再画与之相交的内容。 */\n private redrawContent(band: { top: number; bottom: number }) {\n const ctx = this.ctx;\n const layout = this.layout;\n if (!ctx || !layout || !this.canvas) return;\n\n const top = Math.max(0, band.top);\n const bottom = band.bottom;\n if (top >= bottom) {\n this.hasContent = true;\n return;\n }\n const hits = (y: number, h: number) => y < bottom && y + h > top;\n ctx.save();\n ctx.beginPath();\n ctx.rect(0, top, layout.width, bottom - top);\n ctx.clip();\n const editorRoot = this.host?.closest('.mini-editor') as HTMLElement | null;\n if (editorRoot?.getAttribute('data-surface') === 'transparent') {\n ctx.clearRect(0, top, layout.width, bottom - top);\n } else {\n ctx.fillStyle = '#ffffff';\n ctx.fillRect(0, top, layout.width, bottom - top);\n }\n\n ctx.strokeStyle = '#c9cdd4';\n ctx.lineWidth = 1;\n for (const table of layout.tables) {\n if (!hits(table.y, table.h)) continue;\n for (const cell of table.cells) {\n ctx.strokeRect(cell.x + 0.5, cell.y + 0.5, cell.w - 1, cell.h - 1);\n }\n }\n\n for (const line of layout.lines) {\n if (!hits(line.y, line.h)) continue;\n if (line.marker) {\n ctx.save();\n const family =\n (editorRoot ? getComputedStyle(editorRoot).fontFamily : '') || FONT_FAMILY;\n ctx.font = `400 16px ${family}`;\n ctx.fillStyle = '#667085';\n ctx.textAlign = 'right';\n ctx.textBaseline = 'top';\n const markerTop = line.marker.y + (line.marker.h - 16) / 2;\n ctx.fillText(line.marker.text, line.marker.x + line.marker.w - 8, markerTop);\n ctx.restore();\n }\n for (const vb of line.vblocks ?? []) this.paintVBlock(ctx, vb);\n for (const g of line.glyphs) this.paintGlyph(ctx, g);\n this.paintLineDeco(ctx, line.glyphs);\n for (const img of line.images) {\n embedPlugin(img.entity.kind).paintCanvasBackdrop(ctx, img, (src) => this.imageOf(src));\n }\n }\n for (const img of layout.images) {\n if (!img.entity.float || !hits(img.y, img.h)) continue;\n embedPlugin(img.entity.kind).paintCanvasBackdrop(ctx, img, (src) => this.imageOf(src));\n }\n ctx.restore();\n this.hasContent = true;\n }\n\n private redrawChrome() {\n const ctx = this.chromeCtx;\n const layout = this.layout;\n if (!ctx || !layout || !this.chrome) return;\n ctx.save();\n ctx.setTransform(1, 0, 0, 1, 0, 0);\n ctx.clearRect(0, 0, this.chrome.width, this.chrome.height);\n ctx.restore();\n\n for (const r of this.selRects) {\n if (r.outline) this.strokeVBlockOutline(ctx, r);\n else this.fillSelectionRect(ctx, r);\n }\n\n for (const [i, t] of this.caretTrails.entries()) {\n this.drawCaret(ctx, t, 0.22 - i * 0.06);\n }\n if (this.caret && this.caretVisible) this.drawCaret(ctx, this.caret, this.caret.opacity ?? 1);\n }\n\n private fillSelectionRect(\n ctx: CanvasRenderingContext2D,\n r: { x: number; y: number; w: number; h: number }\n ) {\n const editorRoot = this.host?.closest('.mini-editor') as HTMLElement | null;\n const cs = editorRoot ? getComputedStyle(editorRoot) : null;\n const color = cs?.getPropertyValue('--mini-sel-color').trim() ?? '';\n const radius = cs ? parseFloat(cs.getPropertyValue('--mini-sel-radius')) || 0 : 0;\n const rainbow = editorRoot?.getAttribute('data-caret') === 'rainbow' && !color;\n ctx.beginPath();\n ctx.roundRect(r.x, r.y, r.w, r.h, radius);\n if (rainbow) {\n const grad = ctx.createLinearGradient(r.x, r.y, r.x + r.w, r.y);\n grad.addColorStop(0, 'rgba(255, 77, 109, 0.16)');\n grad.addColorStop(1, 'rgba(43, 108, 255, 0.22)');\n ctx.fillStyle = grad;\n } else {\n ctx.fillStyle = color || 'rgba(43, 108, 255, 0.22)';\n }\n ctx.fill();\n }\n\n private paintVBlock(\n ctx: CanvasRenderingContext2D,\n vb: { x: number; y: number; w: number; h: number; chrome: { background?: string; borderColor?: string; borderWidth?: number; radius?: number }; kind: string }\n ) {\n const c = vb.chrome;\n const radius = c.radius ?? (vb.kind === 'slot' ? 4 : 6);\n if (c.background) {\n ctx.beginPath();\n ctx.roundRect(vb.x, vb.y, vb.w, vb.h, radius);\n ctx.fillStyle = c.background;\n ctx.fill();\n }\n if (c.borderWidth && c.borderColor) {\n ctx.beginPath();\n ctx.roundRect(vb.x + 0.5, vb.y + 0.5, Math.max(0, vb.w - 1), Math.max(0, vb.h - 1), radius);\n ctx.strokeStyle = c.borderColor;\n ctx.lineWidth = c.borderWidth;\n ctx.stroke();\n }\n }\n\n private strokeVBlockOutline(\n ctx: CanvasRenderingContext2D,\n r: { x: number; y: number; w: number; h: number; radius?: number }\n ) {\n const radius = r.radius ?? 6;\n ctx.beginPath();\n ctx.roundRect(r.x + 0.5, r.y + 0.5, Math.max(0, r.w - 1), Math.max(0, r.h - 1), radius);\n ctx.strokeStyle = '#2b6cff';\n ctx.lineWidth = 2;\n ctx.stroke();\n }\n\n private drawCaret(ctx: CanvasRenderingContext2D, caret: CaretPos, alpha: number) {\n const { x, y, h } = caret;\n const editorRoot = this.host?.closest('.mini-editor') as HTMLElement | null;\n const solid = editorRoot?.getAttribute('data-caret') !== 'rainbow';\n const caretW = editorRoot\n ? parseFloat(getComputedStyle(editorRoot).getPropertyValue('--mini-caret-width')) || 2\n : 2;\n const w = solid ? caretW : caret.bold ? 4.5 : 3;\n ctx.save();\n ctx.globalAlpha = Math.max(0, alpha);\n if (!solid && caret.italic) {\n ctx.translate(x, y + h);\n ctx.transform(1, 0, -0.25, 1, 0, 0);\n ctx.translate(-x, -(y + h));\n }\n const editorCs = editorRoot ? getComputedStyle(editorRoot) : null;\n if (solid) {\n ctx.fillStyle = editorCs?.getPropertyValue('--mini-caret-color').trim() || '#09090b';\n const glow = editorCs?.getPropertyValue('--mini-caret-glow').trim() ?? '';\n if (glow && glow !== 'none') {\n ctx.shadowColor = glow;\n ctx.shadowBlur = 6;\n }\n } else {\n const grad = ctx.createLinearGradient(x, y, x, y + h);\n grad.addColorStop(0, '#ff4d6d');\n grad.addColorStop(0.35, '#ffd166');\n grad.addColorStop(0.65, '#06d6a0');\n grad.addColorStop(1, '#4cc9f0');\n ctx.fillStyle = grad;\n }\n ctx.fillRect(x, y, w, h);\n ctx.restore();\n }\n\n private paintGlyph(ctx: CanvasRenderingContext2D, g: GlyphBox) {\n const size = g.style.fontSize ?? 16;\n ctx.font = canvasFont(g.style);\n ctx.fillStyle = canvasFill(g.style, g.index);\n ctx.textAlign = 'left';\n ctx.textBaseline = 'alphabetic';\n const metrics = ctx.measureText(g.text || '汉');\n const ascent = metrics.fontBoundingBoxAscent || size * 0.8;\n const descent = metrics.fontBoundingBoxDescent || size * 0.2;\n const fontH = ascent + descent;\n const boxTop = g.y + (g.h - fontH) / 2;\n const baseline = boxTop + ascent;\n ctx.fillText(g.text, g.x, baseline);\n }\n\n private paintLineDeco(ctx: CanvasRenderingContext2D, glyphs: GlyphBox[]) {\n for (const run of groupDecorationRuns(glyphs)) {\n const size = run.size;\n if (run.kind !== 'none') paintCanvasUnderline(ctx, run.x, run.y + Math.max(1, size * 0.06), run.w, size, run.kind, run.color);\n if (run.strike) paintCanvasStrike(ctx, run.x, run.y - size * 0.35, run.w, size, run.color);\n }\n }\n\n private imageOf(src: string): HTMLImageElement {\n let img = this.imageCache.get(src);\n if (img) return img;\n img = new Image();\n img.onload = () => {\n // 图片是异步到的,不知道它落在哪一段,整份重画\n if (this.layout) this.redrawContent({ top: 0, bottom: this.layout.height });\n };\n img.src = src;\n this.imageCache.set(src, img);\n return img;\n }\n}\n","import { underlineKind } from '../model/types';\nimport { syncEmbedLayer } from '../embed';\nimport { CaretPos, DocLayout, LineBox, SelRect, TableLayout, VBlockFragment } from '../layout/types';\nimport { cssFill, fillOf } from './decorations';\nimport { PaintBackend } from './types';\n\nfunction cssText(style: LineBox['glyphs'][0]['style'], runW: number): string {\n const size = style.fontSize ?? 16;\n const weight = style.bold ? '700' : String(style.fontWeight ?? 400);\n const italic = style.italic ? 'italic' : 'normal';\n const color = style.color ?? '#1f2329';\n const fill = cssFill(style, runW);\n return `font-style:${italic};font-weight:${weight};font-size:${size}px;font-family:var(--mini-font-family);color:${color};text-decoration:none;${fill}`;\n}\n\nexport class HtmlPainter implements PaintBackend {\n private host: HTMLElement | null = null;\n private surface: HTMLElement | null = null;\n private content: HTMLElement | null = null;\n private selection: HTMLElement | null = null;\n private caret: HTMLElement | null = null;\n private trails: HTMLElement[] = [];\n private embeds: HTMLElement | null = null;\n private embedCache = new Map<string, HTMLElement>();\n\n mount(host: HTMLElement) {\n this.destroy();\n this.host = host;\n this.surface = document.createElement('div');\n this.surface.className = 'mini-surface';\n this.selection = document.createElement('div');\n this.selection.className = 'mini-layer mini-selection';\n this.content = document.createElement('div');\n this.content.className = 'mini-layer mini-content';\n this.caret = document.createElement('div');\n this.caret.className = 'mini-caret';\n this.embeds = document.createElement('div');\n this.embeds.className = 'mini-layer mini-embeds';\n this.trails = [0, 1, 2].map(() => {\n const el = document.createElement('div');\n el.className = 'mini-caret mini-caret-trail';\n el.style.display = 'none';\n return el;\n });\n this.surface.append(this.selection, this.content, this.embeds, ...this.trails, this.caret);\n host.appendChild(this.surface);\n }\n\n getSurface(): HTMLElement {\n if (!this.surface) throw new Error('painter not mounted');\n return this.surface;\n }\n\n paintDoc(layout: DocLayout) {\n if (!this.surface || !this.content) return;\n this.surface.style.width = `${layout.width}px`;\n this.surface.style.height = `${layout.height}px`;\n // 只重建和脏区带相交的元素。元素都是绝对定位的,没动过的留在原地即可 ——\n // 连 DOM 顺序都不用管。\n const { top, bottom } = layout.dirty;\n // 空的、或者脏区带盖住了整页,就整块换掉:比逐个摘掉再补回来省事。\n // 脏区 {top:0,bottom:0} 表示「几何相对上一帧没变」,此处跳过子节点更新。\n // 调用方若整篇换了文档却仍传入空脏区,正文 DOM 会陈旧(见 Editor.setContent)。\n const full = !this.content.childElementCount || (top <= 0 && bottom >= layout.height);\n const hits = (y: number, h: number) => full || (y < bottom && y + h > top);\n\n if (full) {\n this.content.replaceChildren();\n } else {\n // 脏区带为空时 hits() 处处为假,下面几个循环自然什么都不做\n for (const child of [...this.content.children]) {\n const el = child as HTMLElement;\n if (hits(Number(el.dataset.y ?? 0), Number(el.dataset.h ?? 0))) el.remove();\n }\n }\n\n for (const table of layout.tables) {\n if (hits(table.y, table.h)) this.content.appendChild(renderTableChrome(table));\n }\n for (const line of layout.lines) {\n if (hits(line.y, line.h)) this.content.appendChild(renderLine(line));\n }\n // 嵌入对象是独立图层,自己按 id 做增删改,不受脏区带影响\n if (this.embeds) syncEmbedLayer(this.embeds, this.embedCache, layout.images, false);\n }\n\n paintSelection(rects: SelRect[]) {\n if (!this.selection) return;\n this.selection.replaceChildren();\n for (const r of rects) {\n const el = document.createElement('div');\n el.className = r.outline ? 'mini-vblock-outline' : 'mini-sel-rect';\n const radius = r.radius ?? 0;\n el.style.cssText = `left:${r.x}px;top:${r.y}px;width:${r.w}px;height:${r.h}px;${radius ? `border-radius:${radius}px;` : ''}`;\n this.selection.appendChild(el);\n }\n }\n\n paintCaret(caret: CaretPos | null, visible: boolean, trails: CaretPos[] = []) {\n if (!this.caret) return;\n placeCaret(this.caret, visible ? caret : null, 1);\n this.trails.forEach((el, i) => placeCaret(el, trails[i] ?? null, 0.28 - i * 0.08));\n }\n\n destroy() {\n this.surface?.remove();\n this.host = null;\n this.surface = null;\n this.content = null;\n this.selection = null;\n this.caret = null;\n this.trails = [];\n this.embeds = null;\n this.embedCache.clear();\n }\n}\n\nfunction placeCaret(el: HTMLElement, caret: CaretPos | null, fade: number) {\n if (!caret) {\n if (el.style.display !== 'none') el.style.display = 'none';\n return;\n }\n const width = caret.bold ? 4.5 : '';\n if (el.style.display !== 'block') el.style.display = 'block';\n el.style.left = `${caret.x}px`;\n el.style.top = `${caret.y}px`;\n el.style.height = `${caret.h}px`;\n el.style.width = width === '' ? '' : `${width}px`;\n if (caret.opacity != null) el.style.opacity = String(caret.opacity * fade);\n else if (el.style.opacity) el.style.opacity = '';\n el.style.transform = caret.italic ? 'skewX(-14deg)' : 'none';\n el.classList.toggle('is-italic', !!caret.italic);\n}\n\nfunction renderLine(line: LineBox): HTMLElement {\n const wrap = document.createElement('div');\n wrap.className = 'mini-line';\n wrap.dataset.start = String(line.start);\n wrap.dataset.end = String(line.end);\n wrap.dataset.y = String(line.y);\n wrap.dataset.h = String(line.h);\n\n for (const vb of line.vblocks ?? []) {\n wrap.appendChild(renderVBlock(vb));\n }\n\n if (line.marker) {\n const m = document.createElement('span');\n m.className = 'mini-list-marker';\n m.textContent = line.marker.text;\n m.style.cssText = `left:${line.marker.x}px;top:${line.marker.y}px;width:${line.marker.w}px;height:${line.marker.h}px;`;\n wrap.appendChild(m);\n }\n\n if (line.glyphs.length > 0) {\n let run: { start: number; text: string; style: LineBox['glyphs'][0]['style']; x: number; y: number; h: number; w: number } | null = null;\n const flush = () => {\n if (!run) return;\n const span = document.createElement('span');\n span.className = `mini-run${fillOf(run.style) !== 'solid' ? ' is-fill' : ''}`;\n span.textContent = run.text;\n span.style.cssText = `left:${run.x}px;top:${run.y}px;width:${run.w}px;height:${run.h}px;line-height:${run.h}px;${cssText(run.style, run.w)}`;\n wrap.appendChild(span);\n const deco = underlineKind(run.style);\n if (deco !== 'none' || run.style.strikethrough) {\n const bar = document.createElement('span');\n bar.className = `mini-deco mini-deco-${deco}${run.style.strikethrough ? ' is-strike' : ''}`;\n bar.style.cssText = `left:${run.x}px;top:${run.y}px;width:${run.w}px;height:${run.h}px;color:${run.style.color ?? '#1f2329'};`;\n wrap.appendChild(bar);\n }\n run = null;\n };\n for (const g of line.glyphs) {\n if (\n run &&\n run.style.bold === g.style.bold &&\n run.style.italic === g.style.italic &&\n run.style.underline === g.style.underline &&\n run.style.underlineStyle === g.style.underlineStyle &&\n run.style.strikethrough === g.style.strikethrough &&\n run.style.fontSize === g.style.fontSize &&\n run.style.color === g.style.color &&\n run.style.fill === g.style.fill &&\n run.start + run.text.length === g.index\n ) {\n run.text += g.text;\n run.w += g.w;\n } else {\n flush();\n run = { start: g.index, text: g.text, style: g.style, x: g.x, y: g.y, h: g.h, w: g.w };\n }\n }\n flush();\n }\n\n return wrap;\n}\n\nfunction renderVBlock(vb: VBlockFragment): HTMLElement {\n const el = document.createElement('span');\n el.className = 'mini-vblock';\n el.dataset.id = vb.id;\n const c = vb.chrome;\n const radius = c.radius ?? (vb.kind === 'slot' ? 4 : 6);\n const border = c.borderWidth\n ? `${c.borderWidth}px solid ${c.borderColor ?? 'transparent'}`\n : 'none';\n el.style.cssText = [\n `left:${vb.x}px`,\n `top:${vb.y}px`,\n `width:${vb.w}px`,\n `height:${vb.h}px`,\n `background:${c.background ?? 'transparent'}`,\n `border:${border}`,\n `border-radius:${radius}px`\n ].join(';');\n return el;\n}\n\nfunction renderTableChrome(table: TableLayout): HTMLElement {\n const box = document.createElement('div');\n box.className = 'mini-table';\n box.dataset.y = String(table.y);\n box.dataset.h = String(table.h);\n box.style.cssText = `left:${table.x}px;top:${table.y}px;width:${table.w}px;height:${table.h}px;`;\n for (const cell of table.cells) {\n const c = document.createElement('div');\n c.className = 'mini-cell';\n c.style.cssText = `left:${cell.x - table.x}px;top:${cell.y - table.y}px;width:${cell.w}px;height:${cell.h}px;`;\n box.appendChild(c);\n }\n return box;\n}\n","import { activateHostEmbed, builtinEmbedPlugins, decorateRefEl, defaultSlotLabel, EMBED_CHANGE, EMBED_COMMIT, EMBED_EXIT_EDIT, EMBED_MEASURE, EmbedChangeDetail, EmbedExitDetail, EmbedMeasureDetail, embedPlugin, hostEmbedPlugin, HostEmbedRenderer, measureRef, REF_HEAD, REF_JUMP, REF_PAD, refInnerWidth, registerEmbed, setHostEmbedRenderer, syncHostSelected } from './embed';\nimport { EmbedPlugin } from './embed/types';\nimport { RefJumpDetail } from './embed/ref';\nimport type { Shortcut } from './commands';\nimport { ArrowKey, CommandTable } from './commands';\nimport { EditKind, EditResult, runEdit, runScoped, UndoRedoStack } from './edits';\nimport { ImeSurface } from './input/ime';\nimport { bindKeyboard } from './input/keyboard';\nimport { caretFromIndex, hitColBorder, hitTestIndex, imageBoxAt, layoutDocument, resolvedTextStyle, selectionRects } from './layout/engine';\nimport { lineHeightOf, measureWidth, MIN_COL_WIDTH, PAGE_CONTENT_WIDTH, PAGE_PADDING_X, PAGE_PADDING_Y } from './layout/measure';\nimport { CaretPos, DocLayout, ImageBox } from './layout/types';\nimport { SLICE_MIME, serializeSlice, sliceFromClipboard } from './convert/clipboard';\nimport { collapsedSel, DocumentModel, documentFromSlice, nextEntityId, sliceWithoutParagraphGroup } from './model/document';\nimport { cellAt, cellContentRange, findTableAt, isLastTableCell, isVisuallyEmptyDoc, nearestSafeIndex, nextCellIndex, parseBlocks } from './model/blocks';\nimport { applyMutations } from './mutations';\nimport * as ops from './operations';\nimport type { ImagePatch, Operation, OperationContext, VirtualBlockSpec } from './operations';\nimport { shouldTryMarkdown } from './convert/markdown';\nimport { MARKERS, nextCodePointLen, prevCodePointLen } from './model/markers';\nimport { cloneEntity, EmbedEntity, isCollapsed, MAX_LIST_INDENT, ParagraphProps, selEnd, selStart, Selection, Slice, SlotKind, TextProps, underlineKind, VIDEO_ASPECT, VirtualBlock, VirtualBlockChrome } from './model/types';\nimport { CanvasPainter } from './paint/canvasPainter';\nimport { HtmlPainter } from './paint/htmlPainter';\nimport { PaintBackend } from './paint/types';\n\nexport interface EditorOptions {\n /** 初始文档。不传则新建一个空文档。 */\n doc?: DocumentModel;\n /** 初始绘制后端,默认 `html`。 */\n paint?: 'html' | 'canvas';\n /**\n * 嵌入对象插件集,默认 {@link builtinEmbedPlugins}(图片/视频/代码块/插槽/同步块)。\n * 公式需从 `medeo-rte/formula` 单独引入后追加。\n */\n plugins?: EmbedPlugin[];\n /**\n * 内容宽度策略,默认 `'fill'`。\n * - `'fill'`:撑满宿主容器,并随容器尺寸变化自动重排(编辑器适应容器)。\n * - `number`:固定像素内容宽,行为与容器尺寸无关(适合需要确定版心的场景)。\n */\n width?: 'fill' | number;\n /**\n * 内容版心内边距(像素),默认 `{ x: 72, y: 56 }`(纸张/文档形态的版心留白)。\n * 决定内容行相对绘制表面的起始偏移与四周留白。嵌入式输入框等紧凑形态可传\n * `{ x: 0, y: 0 }`,把留白完全交给宿主 CSS 控制。\n */\n padding?: { x: number; y: number };\n /**\n * 宿主渲染器。提供后即启用 host 型嵌入对象:节点内部 DOM 由宿主用自己的框架\n * 组件渲染,SDK 只管占位、定位与生命周期。用于把业务卡片(如引用对象、插槽)\n * 挂进编辑器而不由 SDK 自绘。见 {@link HostEmbedRenderer}。\n */\n hostEmbed?: HostEmbedRenderer;\n /**\n * 空文档占位文案。由 SDK 画在首行位置,组合输入一开始就关掉(中间态已镜像进模型,\n * 宿主若只看 `change` 会误判仍为空)。之后可用 {@link Editor.setPlaceholder} 改。\n */\n placeholder?: string;\n /**\n * 未写 text span 时的默认文字属性。嵌入式输入框可传 14px 对齐业务输入。\n * `fontFamily` 须具名栈(不要 `system-ui`),会同时用于 pretext 测宽与绘制。\n * 不传则仍是文档编辑器默认 16px / `#1f2329` / 中文无衬线栈。\n */\n textDefaults?: TextProps;\n /**\n * 快捷键表。默认 {@link SHORTCUTS}(文档编辑:Enter 插段、Cmd+B 加粗等)。\n * 嵌入式输入框请传 {@link inputShortcuts}(默认 newline:Enter 换行)。\n */\n shortcuts?: Shortcut[];\n /**\n * 创建完成后是否把焦点放到 IME。默认 `true`(独立编辑器 / demo)。\n * 嵌入式输入框(如页面上的 Command Box)应传 `false`,避免抢走页面焦点。\n */\n autofocus?: boolean;\n /**\n * 光标 / 选区 / 空态占位的外观。不传则与常规编辑器一致:实心光标、扁平选区、无残影。\n * 彩虹光标 / 残影需显式 `caret: 'rainbow'`。\n */\n chrome?: EditorChrome;\n}\n\n/** 编辑器装饰外观(光标、选区、空态占位)。与正文字号/字体测量分开,避免宿主 CSS 盖绘制层。 */\nexport interface EditorChrome {\n /** 默认 `solid`。演示能力用 `rainbow`。 */\n caret?: 'rainbow' | 'solid';\n /** `solid` 时光标颜色,默认 `#09090b`。 */\n caretColor?: string;\n /** `solid` 时光标宽度,默认 2。 */\n caretWidth?: number;\n /** 是否画光标残影。默认关闭;`rainbow` 时可打开。 */\n caretTrail?: boolean;\n /**\n * 选区高亮色。默认接近浏览器原生选区:`rgba(43, 108, 255, 0.22)`。\n * 扁平填充,不再用彩虹渐变。`caret: 'rainbow'` 且未指定本项时,demo 仍用渐变选区。\n */\n selectionColor?: string;\n /** 选区圆角,像素。默认 0(和 `::selection` 一样是矩形)。 */\n selectionRadius?: number;\n /** 中文输入中间态下划线颜色。默认 `#1f2329`。 */\n composeUnderlineColor?: string;\n /** 中文输入中间态下划线粗细,默认 2。 */\n composeUnderlineWidth?: number;\n /** 空态占位颜色。 */\n placeholderColor?: string;\n /** 空态占位透明度 0–1。现网 Chat 为 0.2。 */\n placeholderOpacity?: number;\n /**\n * 绘制表面底色。默认纸张白(`var(--page)`)。\n * 嵌入式输入框应传 `transparent`,露出宿主输入框底,不要再铺一层白/灰。\n */\n surfaceBackground?: 'paper' | 'transparent';\n}\n\n/** 插入嵌入对象的落点:文档下标,或起/止/当前光标。 */\nexport type EmbedInsertAt = number | 'start' | 'end' | 'cursor';\n\n/** 编辑器当前状态,供宿主同步工具栏、状态栏等 UI。 */\nexport interface EditorState {\n bold: boolean;\n italic: boolean;\n underline: boolean;\n strikethrough: boolean;\n fontSize: number;\n color: string;\n heading: 0 | 1 | 2 | 3;\n align: 'left' | 'center' | 'right';\n list: 'none' | 'ul' | 'ol';\n inTable: boolean;\n canUndo: boolean;\n canRedo: boolean;\n paintMode: 'html' | 'canvas';\n hasLink: boolean;\n canPromote: boolean;\n canInsertRef: boolean;\n canUnlink: boolean;\n /** 主文档选区 */\n selection: Selection;\n /** 主文档长度(spacer 数) */\n docLength: number;\n /** 是否正在同步块内部编辑 */\n inRefEdit: boolean;\n /** 同步块内部选区,仅 inRefEdit 为真时有意义 */\n refSelection: Selection;\n /** 虚拟块作用域栈,栈顶是当前选中/编辑的那一层 */\n vblockStack: { id: string; mode: 'selected' | 'editing' }[];\n}\n\n/**\n * - `change`:文档内容变化\n * - `selectionchange`:选区或光标移动\n * - `statechange`:{@link EditorState} 任一字段可能已变,用于同步工具栏\n * - `layoutchange`:重新排版完成,可从 {@link Editor.getLayout} 取新几何\n */\nexport type EditorEvent = 'change' | 'selectionchange' | 'statechange' | 'layoutchange';\n\nexport class Editor {\n /** 编辑器根节点,已挂载到构造时传入的容器下。 */\n readonly root: HTMLElement;\n /** 编辑命令集合,宿主自建工具栏时用。 */\n readonly commands: CommandTable;\n /** 构造时传入的宿主容器。'fill' 模式下从它测量可用宽度。 */\n private parent: HTMLElement;\n /** 内容宽度策略,见 {@link EditorOptions.width}。 */\n private widthMode: 'fill' | number = 'fill';\n /** 内容版心内边距,见 {@link EditorOptions.padding}。所有主文档排版据此定位。 */\n private padding: { x: number; y: number } = { x: PAGE_PADDING_X, y: PAGE_PADDING_Y };\n /** 当前内容宽度(单一真相来源),所有主文档排版都读它。 */\n private contentWidth: number = PAGE_CONTENT_WIDTH;\n /** 'fill' 模式下监听宿主尺寸变化以重排;其它模式为 null。 */\n private resizeObserver: ResizeObserver | null = null;\n private page: HTMLElement;\n private pageInner: HTMLElement;\n private handle: HTMLElement;\n private embedFrame: HTMLElement;\n private imeBar: HTMLElement;\n private placeholderEl: HTMLElement;\n private placeholderText = '';\n private shortcutTable: Shortcut[] | undefined;\n private textDefaults: TextProps | null = null;\n /** 挂载后由 getComputedStyle 解析出的字体栈,专供测宽(canvas 读不懂 var())。 */\n private resolvedMeasureFamily: string | null = null;\n private chrome: EditorChrome = {};\n private disabled = false;\n private paintMode: 'html' | 'canvas' = 'html';\n private listeners: { [K in EditorEvent]: Set<() => void> } = {\n change: new Set(),\n selectionchange: new Set(),\n statechange: new Set(),\n layoutchange: new Set()\n };\n private doc: DocumentModel;\n private sel: Selection = collapsedSel(0);\n private undoStack = new UndoRedoStack();\n private layout: DocLayout;\n private painter: PaintBackend;\n private ime: ImeSurface;\n private typingStyle: TextProps | null = null;\n private keepTypingOnNextClick = false;\n private caretRaf = 0;\n private caretTrails: CaretPos[] = [];\n private lastCaretKey = '';\n private composeText = '';\n /** 组合串镜像插入模型的起点;null 表示当前没有进行中的组合。 */\n private composeAnchor: number | null = null;\n /** 当前已镜像插入模型的组合串长度,用于下次幂等替换时删旧。 */\n private composeLen = 0;\n private refEdit: { entityId: string; fragmentId: string } | null = null;\n private fragSel: Selection = collapsedSel(0);\n private refDragging = false;\n private refDragAnchor = 0;\n private unbindKeyboard: (() => void) | null = null;\n private keysArmed = true;\n private dragging = false;\n private resizing: { id: string; startX: number; startW: number; startH: number } | null = null;\n private colResizing: { tableStart: number; col: number; startX: number; widths: number[] } | null = null;\n private embedEdit: { id: string; before: EmbedEntity } | null = null;\n private dragAnchor: number = 0;\n private vblockStack: { id: string; mode: 'selected' | 'editing' }[] = [];\n\n constructor(parent: HTMLElement, options: EditorOptions = {}) {\n for (const plugin of options.plugins ?? builtinEmbedPlugins) registerEmbed(plugin);\n // 提供了宿主渲染器才启用 host 型嵌入对象:注册插件并注入渲染器。\n if (options.hostEmbed) {\n registerEmbed(hostEmbedPlugin);\n setHostEmbedRenderer(options.hostEmbed);\n }\n\n this.parent = parent;\n this.widthMode = options.width ?? 'fill';\n this.padding = options.padding ?? { x: PAGE_PADDING_X, y: PAGE_PADDING_Y };\n this.shortcutTable = options.shortcuts;\n this.textDefaults = options.textDefaults ?? null;\n this.chrome = options.chrome ?? {};\n this.doc = options.doc ?? new DocumentModel();\n this.applyTextDefaults(this.doc);\n this.sel = collapsedSel(this.doc.length - 1);\n this.paintMode = options.paint ?? 'html';\n this.painter = this.createPainter();\n // 此刻尚未挂载到容器,'fill' 模式测不到宽度会回退默认值;挂载后 relayout() 修正。\n this.contentWidth = this.resolveContentWidth();\n this.layout = layoutDocument(this.doc, this.contentWidth, undefined, this.padding);\n\n this.root = document.createElement('div');\n this.root.className = 'mini-editor';\n this.root.dataset.paint = this.paintMode;\n this.applyChrome();\n this.commands = {\n toggleBold: () => this.toggleText('bold'),\n toggleItalic: () => this.toggleText('italic'),\n toggleUnderline: () => this.toggleText('underline'),\n toggleStrike: () => this.toggleText('strikethrough'),\n setFontSize: (size) => this.applyText({ fontSize: size }),\n setColor: (color) => this.applyText({ color }),\n setHeading: (level) => this.applyPara(level ? { heading: level, list: 'none' } : { heading: 0 }),\n setAlign: (align) => this.applyPara({ align }),\n toggleList: (kind) => this.toggleList(kind),\n indent: (delta) => this.changeIndent(delta),\n insertImage: (file) => this.insertMediaFile(file, 'image'),\n insertVideo: (file) => this.insertMediaFile(file, 'video'),\n insertCode: () => this.insertCodeBlock(),\n insertFormula: () => this.insertFormula(),\n insertSlot: (kind) => this.insertSlot(kind),\n insertHostEmbed: (hostType, data, size) => this.insertHostEmbed(hostType, data, size),\n insertTable: () => this.insertTable(),\n addRow: () => this.tableOp('row'),\n addCol: () => this.tableOp('col'),\n removeRow: () => this.tableOp('del-row'),\n removeCol: () => this.tableOp('del-col'),\n toggleLink: () => this.toggleLink(),\n promoteRef: () => this.promoteRef(),\n insertRef: () => this.insertExistingRef(),\n unlinkRef: () => this.unlinkSelectedRef(),\n undo: () => this.undo(),\n redo: () => this.redo(),\n insertParagraph: (opts) => this.insertParagraph(opts),\n backspace: () => this.backspace(),\n deleteForward: () => this.deleteForward(),\n selectAll: () => this.selectAll(),\n indentOrNextCell: (dir) => this.indentOrNextCell(dir),\n moveCaret: (key, extend) => this.moveCaret(key, extend),\n exitFragment: () => this.exitFragmentEdit()\n };\n\n this.page = document.createElement('div');\n this.page.className = 'mini-page-wrap';\n this.pageInner = document.createElement('div');\n this.pageInner.className = 'mini-page';\n this.painter.mount(this.pageInner);\n this.ime = new ImeSurface({\n onInsertText: (t) => this.insertText(t),\n onInsertParagraph: () => this.insertParagraph(),\n onBackspace: () => this.backspace(),\n onDeleteForward: () => this.deleteForward(),\n onPaste: (data) => this.pasteClipboard(data),\n onCompositionChange: (active, text) => this.handleComposition(active, text)\n });\n this.pageInner.appendChild(this.ime.el);\n\n this.handle = document.createElement('div');\n this.handle.className = 'mini-resize';\n this.embedFrame = document.createElement('div');\n this.embedFrame.className = 'mini-embed-frame';\n this.imeBar = document.createElement('div');\n this.imeBar.className = 'mini-ime-bar';\n this.placeholderText = options.placeholder ?? '';\n this.placeholderEl = document.createElement('div');\n this.placeholderEl.className = 'mini-placeholder';\n this.placeholderEl.hidden = true;\n this.placeholderEl.setAttribute('aria-hidden', 'true');\n this.pageInner.append(this.embedFrame, this.handle, this.imeBar, this.placeholderEl);\n\n this.page.appendChild(this.pageInner);\n this.root.append(this.page);\n parent.appendChild(this.root);\n\n this.bind();\n this.syncComputedFontForMeasure();\n this.relayout({ reuse: false });\n void document.fonts.ready.then(() => {\n if (!this.root.isConnected) return;\n this.syncComputedFontForMeasure();\n this.relayout({ reuse: false });\n });\n if (options.autofocus !== false) this.ime.focus();\n this.resetBlink();\n }\n\n setPaintMode(mode: 'html' | 'canvas') {\n if (mode === this.paintMode) return;\n this.unbindSurface();\n this.painter.destroy();\n this.paintMode = mode;\n this.painter = this.createPainter();\n this.painter.mount(this.pageInner);\n this.pageInner.append(this.ime.el, this.embedFrame, this.handle, this.imeBar);\n this.bindSurface();\n this.root.dataset.paint = mode;\n this.pageInner.classList.remove('is-flipping');\n void this.pageInner.offsetWidth;\n this.pageInner.classList.add('is-flipping');\n this.relayout();\n this.ime.focus();\n }\n\n // ---- 公共 API ----------------------------------------------------------\n\n /** 滚动容器。宿主要做小地图、滚动联动时用。 */\n get scroller(): HTMLElement {\n return this.page;\n }\n\n /**\n * 页面元素(内容画布所在的定位上下文)。\n * 宿主要往内容上叠东西(标尺、网格、水印、角标)时挂到这里。\n */\n get pageElement(): HTMLElement {\n return this.pageInner;\n }\n\n /** 当前绘制后端。 */\n get paint(): 'html' | 'canvas' {\n return this.paintMode;\n }\n\n /** 更新空态占位文案。传空字符串则不再显示。 */\n setPlaceholder(text: string) {\n this.placeholderText = text ?? '';\n this.syncPlaceholder();\n }\n\n /** 更新光标 / 选区等装饰外观,立即重绘 chrome。 */\n setChrome(patch: Partial<EditorChrome>) {\n this.chrome = { ...this.chrome, ...patch };\n this.applyChrome();\n this.paintChrome();\n }\n\n /**\n * 更新默认正文字号/颜色/字体。已写进 span 的同色文字会跟着改(给主题切换用),不进撤销。\n */\n setTextDefaults(patch: TextProps) {\n const prevColor = this.textDefaults?.color;\n this.textDefaults = { ...this.textDefaults, ...patch };\n this.applyTextDefaults(this.doc);\n const nextColor = this.textDefaults?.color;\n if (prevColor && nextColor && prevColor !== nextColor) {\n this.recolorMatchingText(prevColor, nextColor);\n }\n this.relayout({ reuse: false });\n }\n\n /** 把文档里等于 from 的文字色改成 to,不发 change、不进历史。 */\n private recolorMatchingText(from: string, to: string) {\n const match = (value?: string) => !!value && cssColorsEqual(value, from);\n for (const span of this.doc.styles) {\n if (span.type !== 'text') continue;\n const props = span.props as TextProps;\n if (match(props.color)) props.color = to;\n }\n if (this.typingStyle && match(this.typingStyle.color)) {\n this.typingStyle = { ...this.typingStyle, color: to };\n }\n }\n\n private applyTextDefaults(doc: DocumentModel) {\n if (!this.textDefaults && !this.resolvedMeasureFamily) {\n doc.textDefaults = null;\n return;\n }\n doc.textDefaults = {\n ...this.textDefaults,\n ...(this.resolvedMeasureFamily ? { fontFamily: this.resolvedMeasureFamily } : {}),\n };\n }\n\n private syncComputedFontForMeasure() {\n const computed = getComputedStyle(this.root).fontFamily?.trim();\n if (!computed) return;\n this.resolvedMeasureFamily = computed;\n this.applyTextDefaults(this.doc);\n }\n\n private createPainter(): PaintBackend {\n return this.paintMode === 'canvas' ? new CanvasPainter() : new HtmlPainter();\n }\n\n private caretIsSolid() {\n return this.chrome.caret !== 'rainbow';\n }\n\n private caretTrailEnabled() {\n return this.chrome.caretTrail === true;\n }\n\n private applyChrome() {\n this.root.dataset.caret = this.caretIsSolid() ? 'solid' : 'rainbow';\n this.root.dataset.surface =\n this.chrome.surfaceBackground === 'transparent' ? 'transparent' : 'paper';\n this.root.style.setProperty('--mini-caret-color', this.chrome.caretColor ?? '#09090b');\n this.root.style.setProperty(\n '--mini-caret-width',\n `${this.chrome.caretWidth ?? 2}px`\n );\n this.root.style.setProperty(\n '--mini-ime-underline-color',\n this.chrome.composeUnderlineColor ?? '#1f2329'\n );\n this.root.style.setProperty(\n '--mini-ime-underline-width',\n `${this.chrome.composeUnderlineWidth ?? 2}px`\n );\n const solid = this.caretIsSolid();\n const selColor = this.chrome.selectionColor;\n if (selColor) {\n this.root.style.setProperty('--mini-sel-color', selColor);\n } else if (solid) {\n this.root.style.setProperty('--mini-sel-color', 'rgba(43, 108, 255, 0.22)');\n } else {\n this.root.style.removeProperty('--mini-sel-color');\n }\n const selRadius =\n this.chrome.selectionRadius ?? (solid ? 0 : 6);\n this.root.style.setProperty('--mini-sel-radius', `${selRadius}px`);\n const cssFamily = this.textDefaults?.fontFamily?.trim();\n if (cssFamily) {\n this.root.style.setProperty('--mini-font-family', cssFamily);\n }\n const weight = this.textDefaults?.fontWeight;\n if (weight != null) {\n this.root.style.setProperty('--mini-font-weight', String(weight));\n }\n const contentW = this.layout?.contentWidth ?? this.contentWidth;\n this.root.style.setProperty('--mini-content-width', `${Math.max(0, contentW)}px`);\n }\n\n /** 当前排版结果(纯几何,只读)。宿主可据此画标尺、小地图、叠层。 */\n getLayout(): DocLayout {\n return this.layout;\n }\n\n /** 导出整篇内容,结果可 JSON 序列化。 */\n getContent(): Slice {\n return this.doc.takeSlice(0, this.doc.length);\n }\n\n /** 整篇替换内容,会清空撤销栈。 */\n setContent(slice: Slice) {\n this.doc = documentFromSlice(slice);\n this.applyTextDefaults(this.doc);\n this.refEdit = null;\n this.typingStyle = null;\n this.composeText = '';\n this.composeAnchor = null;\n this.composeLen = 0;\n this.ime.clear();\n this.undoStack.clear();\n this.vblockStack = [];\n this.sel = collapsedSel(Math.max(0, this.doc.length - 1));\n // 文档对象已经换掉,不能拿「刚冷排出来的新 layout」当增量 prev:\n // 那次冷排不会画到 DOM,紧接着的增量又会因哈希命中得到空脏区带,\n // painter 误以为画面已是最新,结果光标/选区跟着新几何走,正文还停在旧 DOM。\n this.relayout({ reuse: false });\n this.emit('change');\n }\n\n /** 直接拿文档模型。需要做批量操作或自定义命令时用。 */\n getDocument(): DocumentModel {\n return this.doc;\n }\n\n /**\n * 在当前选区(或 `at`)插入一份 Slice。模板混排(文案 + 槽 + 胶囊 + 虚拟块)走这条。\n */\n insertSlice(slice: Slice, at?: number) {\n if (at == null && this.selectedRegion()) return;\n this.runEdit('insert.paste', (ctx) => {\n const index = at ?? ctx.selection().focus;\n const nested = (slice.virtualBlocks?.length ?? 0) > 0 || slice.entities.length > 0;\n const slot = at == null ? this.slotToFill(ctx) : ctx.doc.slotAtCaret(index);\n if (!nested && slot && (slot.empty || (at == null && this.selectionCoversSlot(ctx, slot)))) {\n const text = ops.slotInlineText(slice.text);\n if (text) {\n const end = ops.fillSlot(slot.id, text)(ctx);\n if (end != null) ctx.select(collapsedSel(end));\n return;\n }\n }\n this.deleteSelectionIfNeeded(ctx);\n ctx.select(collapsedSel(ops.insertSlice(at ?? ctx.selection().focus, slice)(ctx)));\n });\n this.vblockStack = [];\n }\n\n /** 把指定范围(默认当前选区)包成一层虚拟块。 */\n insertVirtualBlock(spec: Omit<VirtualBlockSpec, 'start' | 'end'> & { start?: number; end?: number }): string | null {\n const start = spec.start ?? selStart(this.targetSel());\n const end = spec.end ?? selEnd(this.targetSel());\n if (end <= start) return null;\n let id: string | null = null;\n this.runEdit('vblock.insert', (ctx) => {\n id = ops.insertVirtualBlock({ ...spec, start, end })(ctx);\n const block = id ? ctx.doc.blockById(id) : null;\n if (block) ctx.select({ anchor: block.start, focus: block.end });\n });\n if (id) this.selectVblock(id, 'selected');\n return id;\n }\n\n updateVirtualBlock(id: string, chrome: VirtualBlockChrome) {\n this.runEdit('vblock.update', (ctx) => {\n ops.updateVirtualBlockChrome(id, chrome)(ctx);\n });\n }\n\n removeVirtualBlock(id: string) {\n this.runEdit('vblock.remove', (ctx) => {\n ops.removeVirtualBlock(id)(ctx);\n });\n this.vblockStack = this.vblockStack.filter((f) => f.id !== id);\n }\n\n /**\n * 在指定位置插入宿主渲染块。`at` 省略为当前光标(会先删掉非折叠选区)。\n * 插入后选中该占位符,便于缩放框/选中态;宿主若要把光标放到块后,自行折叠到 `focus`。\n */\n insertHostEmbed(\n hostType: string,\n data?: unknown,\n size?: { width: number; height: number },\n at: EmbedInsertAt = 'cursor'\n ) {\n this.insertEmbed(\n {\n id: nextEntityId(),\n kind: 'host',\n hostType,\n data,\n width: size?.width ?? 120,\n height: size?.height ?? 24\n },\n at\n );\n }\n\n /** 文档里所有嵌入对象(图片占位),按文档下标升序。 */\n listEmbeds(): { index: number; entity: EmbedEntity }[] {\n const out: { index: number; entity: EmbedEntity }[] = [];\n const { spacers } = this.doc;\n for (let i = 0; i < spacers.length; i++) {\n if (spacers[i] !== MARKERS.IMAGE) continue;\n const entity = this.doc.imageAt(i);\n if (entity) out.push({ index: i, entity });\n }\n return out;\n }\n\n /** 每个段落的分组 id,与块序一致;空串表示无分组。 */\n listParagraphGroupIds(): string[] {\n const ids: string[] = [];\n for (const block of parseBlocks(this.doc.spacers)) {\n if (block.kind !== 'paragraph') continue;\n ids.push(this.doc.paragraphPropsAt(block.start).groupId ?? '');\n }\n return ids;\n }\n\n /** 给前 `count` 个段落打上分组(省略则全部)。不进撤销栈。 */\n tagParagraphsWithGroup(groupId: string, count?: number) {\n const id = groupId.trim();\n if (!id) return;\n const paras = parseBlocks(this.doc.spacers).filter((block) => block.kind === 'paragraph');\n const n = count == null ? paras.length : Math.min(Math.max(0, count), paras.length);\n if (!n) return;\n this.applyNow((ctx) => {\n for (let i = 0; i < n; i++) {\n const para = paras[i]!;\n ops.applyParagraphStyle(para.start, para.end, { groupId: id })(ctx);\n }\n });\n this.relayout();\n }\n\n /** 去掉段落分组。传入 id 则只清该组,否则清全部。 */\n clearParagraphGroupIds(groupId?: string) {\n const id = groupId?.trim() ?? '';\n this.applyNow((ctx) => {\n for (const block of parseBlocks(this.doc.spacers)) {\n if (block.kind !== 'paragraph') continue;\n const current = this.doc.paragraphPropsAt(block.start).groupId ?? '';\n if (!current) continue;\n if (id && current !== id) continue;\n ops.applyParagraphStyle(block.start, block.end, { groupId: '' })(ctx);\n }\n });\n this.relayout();\n }\n\n /** 删除指定分组的段落,其余内容保留。会清空撤销栈。 */\n deleteParagraphsWithGroup(groupId: string) {\n const id = groupId.trim();\n if (!id) return;\n this.setContent(sliceWithoutParagraphGroup(this.doc, id));\n }\n\n /** 当前是否正好选中一颗嵌入对象(含 host)。 */\n selectedEmbed(): EmbedEntity | null {\n return this.selectedImage()?.entity ?? null;\n }\n\n /** 按谓词删除嵌入对象,从后往前以免下标错位。返回删除数量。 */\n deleteEmbeds(pred: (entity: EmbedEntity, index: number) => boolean): number {\n const hits = this.listEmbeds()\n .filter((x) => pred(x.entity, x.index))\n .map((x) => x.index)\n .sort((a, b) => b - a);\n if (!hits.length) return 0;\n const caret = hits[hits.length - 1]!;\n this.runEdit('embed.delete', (ctx) => {\n for (const i of hits) ops.deleteRange(i, i + 1)(ctx);\n ctx.select(collapsedSel(caret));\n });\n return hits.length;\n }\n\n /** 按谓词更新嵌入对象属性。`patchFor` 可按实体合并 data。返回更新数量。\n * `history: false` 不进撤销栈(生成中态这类 UI 过程)。 */\n updateEmbeds(\n pred: (entity: EmbedEntity, index: number) => boolean,\n patchFor: ImagePatch | ((entity: EmbedEntity, index: number) => ImagePatch),\n options?: { history?: boolean }\n ): number {\n const hits = this.listEmbeds().filter((x) => pred(x.entity, x.index));\n if (!hits.length) return 0;\n const patches = hits.map((h) => ({\n id: h.entity.id,\n patch: typeof patchFor === 'function' ? patchFor(h.entity, h.index) : patchFor,\n }));\n if (options?.history === false) {\n for (const item of patches) {\n this.applyNow(ops.updateImage(item.id, item.patch));\n }\n this.relayout();\n return hits.length;\n }\n this.runEdit('embed.update', (ctx) => {\n for (const item of patches) ops.updateImage(item.id, item.patch)(ctx);\n });\n return hits.length;\n }\n\n getSelection(): Selection {\n return { ...this.sel };\n }\n\n /** 屏幕坐标落到文档下标,供拖放落点。 */\n indexAtClientPoint(clientX: number, clientY: number): number {\n const { x, y } = this.localPoint({ clientX, clientY } as MouseEvent);\n return nearestSafeIndex(this.doc.spacers, hitTestIndex(this.layout, x, y));\n }\n\n setSelection(next: Selection) {\n this.sel = { ...next };\n this.afterCaretMove();\n }\n\n /** 当前状态快照,用于同步宿主 UI。 */\n getState(): EditorState {\n const text = this.currentTextStyle();\n const para = this.targetDoc().paragraphPropsAt(this.targetSel().focus);\n const embed = this.selectedImage();\n const canPromote =\n !this.refEdit &&\n !isCollapsed(this.sel) &&\n !(selEnd(this.sel) - selStart(this.sel) === 1 && embed?.entity.kind === 'ref');\n return {\n bold: !!text.bold,\n italic: !!text.italic,\n underline: underlineKind(text) !== 'none',\n strikethrough: !!text.strikethrough,\n fontSize: text.fontSize ?? 16,\n color: text.color ?? '#1f2329',\n heading: (para.heading ?? 0) as 0 | 1 | 2 | 3,\n align: para.align ?? 'left',\n list: para.list ?? 'none',\n inTable: !!cellAt(this.targetDoc().spacers, this.targetSel().focus),\n canUndo: this.undoStack.canUndo,\n canRedo: this.undoStack.canRedo,\n paintMode: this.paintMode,\n hasLink: !!this.targetDoc().linkUrlAt(this.targetSel().focus),\n canPromote,\n canInsertRef: !this.refEdit && this.doc.fragments.size > 0,\n canUnlink: !this.refEdit && embed?.entity.kind === 'ref',\n selection: { ...this.sel },\n docLength: this.doc.length,\n inRefEdit: !!this.refEdit,\n refSelection: { ...this.fragSel },\n vblockStack: this.vblockStack.map((f) => ({ ...f }))\n };\n }\n\n /** 订阅事件,返回取消订阅函数。 */\n on(event: EditorEvent, handler: () => void): () => void {\n this.listeners[event].add(handler);\n return () => this.listeners[event].delete(handler);\n }\n\n focus() {\n if (this.disabled) return;\n this.ime.focus();\n }\n\n /** 输入法组合是否进行中(含候选串已镜像进模型、尚未落定)。 */\n composing(): boolean {\n return this.ime.composing || this.composeAnchor !== null;\n }\n\n /** 禁用输入与快捷键。宿主 disabled 不能只靠 CSS pointer-events。 */\n setDisabled(disabled: boolean) {\n this.disabled = disabled;\n this.ime.el.contentEditable = disabled ? 'false' : 'true';\n }\n\n private emit(event: EditorEvent) {\n for (const handler of this.listeners[event]) handler();\n }\n\n // ------------------------------------------------------------------------\n\n private bindSurface() {\n this.painter.getSurface().addEventListener('mousedown', this.onMouseDown);\n }\n\n private unbindSurface() {\n this.painter.getSurface().removeEventListener('mousedown', this.onMouseDown);\n }\n\n private bind() {\n this.bindSurface();\n window.addEventListener('mousemove', this.onMouseMove);\n window.addEventListener('mouseup', this.onMouseUp);\n this.unbindKeyboard = bindKeyboard({\n commands: this.commands,\n accepts: (e) => this.acceptsKey(e),\n composing: () => this.composing(),\n suppressInput: (e) => {\n if (e.target === this.ime.el) this.ime.markKeyConsumed();\n },\n shortcuts: this.shortcutTable\n });\n document.addEventListener('mousedown', this.onDocMouseDown, true);\n this.root.addEventListener('mousedown', this.onRootMouseDown);\n this.parent.addEventListener('mousedown', this.onRootMouseDown);\n this.pageInner.addEventListener(EMBED_CHANGE, this.onEmbedChange);\n this.pageInner.addEventListener(EMBED_COMMIT, this.onEmbedCommit);\n this.pageInner.addEventListener(EMBED_MEASURE, this.onEmbedMeasure);\n this.pageInner.addEventListener(EMBED_EXIT_EDIT, this.onEmbedExitEdit);\n this.pageInner.addEventListener(REF_JUMP, this.onRefJump);\n this.pageInner.addEventListener('dblclick', this.onDoubleClick);\n this.root.addEventListener('focusin', this.onFocusChange);\n this.root.addEventListener('focusout', this.onFocusChange);\n this.handle.addEventListener('mousedown', this.onResizeStart);\n window.addEventListener('resize', this.onWindowResize);\n // 'fill' 模式:监听宿主容器尺寸变化重排。只观察 parent —— 它的宽度由外部布局决定,\n // 不受编辑器内部 surface 尺寸影响,不会形成重排循环。contentWidth 没变时 engine 增量复用。\n if (this.widthMode === 'fill' && typeof ResizeObserver !== 'undefined') {\n this.resizeObserver = new ResizeObserver(() => this.relayout());\n this.resizeObserver.observe(this.parent);\n }\n document.addEventListener('copy', this.onCopy);\n document.addEventListener('cut', this.onCut);\n }\n\n destroy() {\n this.unbindKeyboard?.();\n document.removeEventListener('mousedown', this.onDocMouseDown, true);\n this.root.removeEventListener('mousedown', this.onRootMouseDown);\n this.parent.removeEventListener('mousedown', this.onRootMouseDown);\n this.root.removeEventListener('focusin', this.onFocusChange);\n this.root.removeEventListener('focusout', this.onFocusChange);\n window.removeEventListener('mousemove', this.onMouseMove);\n window.removeEventListener('mouseup', this.onMouseUp);\n window.removeEventListener('resize', this.onWindowResize);\n this.resizeObserver?.disconnect();\n this.resizeObserver = null;\n document.removeEventListener('copy', this.onCopy);\n document.removeEventListener('cut', this.onCut);\n window.cancelAnimationFrame(this.caretRaf);\n this.unbindSurface();\n this.ime.destroy();\n this.painter.destroy();\n this.root.remove();\n }\n\n private onWindowResize = () => this.relayout();\n\n /**\n * 按当前 width 策略算出内容宽度。\n * - 固定像素:直接返回。\n * - 'fill':宿主容器可用宽减去左右版心内边距;容器尚未布局(宽度为 0)时回退默认值,\n * 避免首帧算出负数或零宽。\n */\n private resolveContentWidth(): number {\n if (typeof this.widthMode === 'number') return this.widthMode;\n const avail = this.parent.clientWidth - this.padding.x * 2;\n return avail > 0 ? avail : PAGE_CONTENT_WIDTH;\n }\n\n private commit(edit: EditResult) {\n this.undoStack.push(edit);\n this.typingStyle = null;\n this.keepTypingOnNextClick = false;\n this.relayout();\n // 一次编辑落定后通知外部:内容已变。预览态(applyNow)不走这里,所以\n // 组合中间态、拖拽缩放这类临时改动不会误报 change。\n this.emit('change');\n }\n\n private targetDoc(): DocumentModel {\n return this.refEdit ? this.doc.ensureFragmentModel(this.refEdit.fragmentId) : this.doc;\n }\n\n private targetSel(): Selection {\n return this.refEdit ? this.fragSel : this.sel;\n }\n\n private setTargetSel(next: Selection) {\n if (this.refEdit) this.fragSel = next;\n else this.sel = next;\n }\n\n private syncActiveFragment() {\n if (this.refEdit) this.doc.syncFragment(this.refEdit.fragmentId);\n }\n\n private activeRefBox(): ImageBox | null {\n if (!this.refEdit) return null;\n return this.layout.images.find((b) => b.entity.id === this.refEdit?.entityId) ?? null;\n }\n\n private refreshRefMetrics() {\n const width = this.layout?.contentWidth ?? PAGE_CONTENT_WIDTH;\n for (const entity of this.doc.entities.values()) {\n if (entity.kind !== 'ref') continue;\n const size = measureRef(entity, width, this.doc);\n entity.width = size.width;\n entity.height = size.height;\n }\n }\n\n /**\n * 一次用户操作的事务边界。事务本体在 Edit 层,这里只负责给它当前的选区和\n * 作用域,再把产出的记录送进撤销栈。\n *\n * 同步块内部编辑走的是同一条路,只是作用域换成片段 id —— 发出去的 mutation\n * 自动包上 `scoped`,进的还是同一个撤销栈。\n */\n private runEdit(kind: EditKind, run: (ctx: OperationContext) => void) {\n const scope = this.refEdit?.fragmentId ?? null;\n const { edit, selectionAfter } = runEdit(this.doc, this.targetSel(), { kind, scope }, run);\n this.setTargetSel(selectionAfter);\n if (!edit) {\n this.relayout();\n return;\n }\n this.commit(edit);\n }\n\n /** 立即落一次变更,不进撤销栈。拖拽预览这类「过程中」的改动用它。 */\n private applyNow<R>(op: Operation<R>): R {\n const scope = this.refEdit?.fragmentId ?? null;\n const { run, result } = runScoped(this.doc, this.targetSel(), scope, op);\n this.setTargetSel(run.selectionAfter);\n return result;\n }\n\n /**\n * 把已经预览生效的改动登记成一步可撤销的编辑。\n *\n * 拖拽缩放这类交互会先用 `applyNow` 实时改文档,松手时才落定。这里的做法是\n * 悄悄退回到起点、再用一次真正的编辑走到终点 —— 两步在同一帧内完成,用户看不\n * 出来,换来的是一条正常的、能重放能变换的操作记录,而不是一对手写的闭包。\n */\n private commitPreview(kind: EditKind, revert: Operation, settle: Operation) {\n this.applyNow(revert);\n this.runEdit(kind, (ctx) => settle(ctx));\n }\n\n private deleteSelectionIfNeeded(ctx: OperationContext) {\n const sel = ctx.selection();\n if (isCollapsed(sel)) return;\n const from = selStart(sel);\n const to = selEnd(sel);\n if (!this.refEdit && this.clearCellGrid(ctx, from, to)) {\n ctx.select(collapsedSel(nearestSafeIndex(this.doc.spacers, from)));\n return;\n }\n const selected = this.selectedVblock();\n if (!this.refEdit && this.stackTop()?.mode === 'selected' && selected?.kind === 'region') {\n return;\n }\n if (!this.refEdit && this.stackTop()?.mode === 'selected' && selected?.kind === 'slot') {\n ops.clearSlot(selected.id)(ctx);\n const next = ctx.doc.blockById(selected.id);\n ctx.select(next ? { anchor: next.start, focus: next.end } : collapsedSel(from));\n return;\n }\n const editing = this.editingSlotIn(ctx.doc);\n if (editing && from <= editing.start && to >= editing.end) {\n ops.clearSlot(editing.id)(ctx);\n const next = ctx.doc.blockById(editing.id);\n ctx.select(collapsedSel(next?.start ?? from));\n return;\n }\n ops.deleteRange(from, to)(ctx);\n ctx.select(collapsedSel(from));\n }\n\n private clearCellGrid(ctx: OperationContext, from: number, to: number): boolean {\n const a = cellAt(this.doc.spacers, from);\n const b = cellAt(this.doc.spacers, Math.max(from, to - 1));\n if (!a || !b || a.table.start !== b.table.start) return false;\n if (a.row === b.row && a.col === b.col && from > a.cell.start) return false;\n const r0 = Math.min(a.row, b.row);\n const r1 = Math.max(a.row, b.row);\n const c0 = Math.min(a.col, b.col);\n const c1 = Math.max(a.col, b.col);\n const cells = [];\n for (let r = r0; r <= r1; r++) {\n for (let c = c0; c <= c1; c++) {\n const cell = a.table.rows[r]?.cells[c];\n if (cell) cells.push(cell);\n }\n }\n if (!cells.length) return false;\n const minStart = Math.min(...cells.map((c) => c.start));\n const maxEnd = Math.max(...cells.map((c) => c.end));\n if (from > minStart + 1 || to < maxEnd) return false;\n for (const cell of [...cells].reverse()) {\n const range = cellContentRange(cell);\n if (range.end > range.start) ops.emitDelete(ctx, range.start, range.end);\n if (this.doc.spacers[range.start] !== MARKERS.PARAGRAPH) {\n ops.emitInsert(ctx, range.start, MARKERS.PARAGRAPH);\n }\n }\n ops.normalizeParagraphs(ctx);\n return true;\n }\n\n /**\n * 处理输入法组合态(拼音/候选的中间态)。\n *\n * 组合串镜像插入文档模型、参与真实排版 —— 每次变化都幂等地「删旧串 → 插新串」,\n * 光标后的内容因此靠正常重排让开,而不是被浮层盖住。整个组合过程用 applyNow\n * 落地、不进撤销栈;最终文字在 compositionend 后由 onInsertText 走一次正常插入\n * 落定成一步可撤销的编辑。组合区外观由白块 overlay 擦白,只留系统输入法的候选串。\n */\n private handleComposition(active: boolean, text: string) {\n if (active && this.composeAnchor === null) {\n // 组合开始:有选区先删掉,落点即组合串的锚点。\n if (!isCollapsed(this.targetSel())) {\n this.applyNow((ctx) => this.deleteSelectionIfNeeded(ctx));\n }\n this.composeAnchor = this.targetSel().focus;\n this.composeLen = 0;\n }\n\n if (active && this.composeAnchor !== null) {\n const anchor = this.composeAnchor;\n const inherit = this.typingStyle ?? this.targetDoc().textPropsAt(anchor);\n this.applyNow((ctx) => {\n const slot = this.editingSlotIn(ctx.doc) ?? ctx.doc.slotAtCaret(anchor);\n const covers =\n !!slot && this.composeLen > 0 && anchor <= slot.start && anchor + this.composeLen >= slot.end;\n if (slot && (slot.empty || covers)) {\n if (!text) {\n ops.clearSlot(slot.id)(ctx);\n const next = ctx.doc.blockById(slot.id);\n this.composeAnchor = next?.start ?? anchor;\n ctx.select(collapsedSel(this.composeAnchor));\n return;\n }\n const end = ops.fillSlot(slot.id, text, inherit)(ctx);\n const next = ctx.doc.blockById(slot.id);\n this.composeAnchor = next?.start ?? anchor;\n ctx.select(collapsedSel(end ?? anchor));\n return;\n }\n if (this.composeLen > 0) ops.deleteRange(anchor, anchor + this.composeLen)(ctx);\n const end = text ? ops.insertText(anchor, text, inherit)(ctx) : anchor;\n ctx.select(collapsedSel(end));\n });\n this.composeLen = text.length;\n } else if (!active && this.composeAnchor !== null) {\n // 组合结束:整槽预览用 clearSlot 留皮,最终文字由 onInsertText 走 fillSlot。\n const anchor = this.composeAnchor;\n const len = this.composeLen;\n this.applyNow((ctx) => {\n const slot = this.editingSlotIn(ctx.doc) ?? ctx.doc.slotAtCaret(anchor);\n const covers = !!slot && len > 0 && anchor <= slot.start && anchor + len >= slot.end;\n if (slot && (slot.empty || covers)) {\n ops.clearSlot(slot.id)(ctx);\n const next = ctx.doc.blockById(slot.id);\n ctx.select(collapsedSel(next?.start ?? slot.start));\n return;\n }\n if (len > 0) ops.deleteRange(anchor, anchor + len)(ctx);\n ctx.select(collapsedSel(anchor));\n });\n this.composeAnchor = null;\n this.composeLen = 0;\n }\n\n this.composeText = text;\n this.relayout();\n }\n\n insertText(text: string) {\n if (!text || this.disabled) return;\n const selected = this.selectedVblock();\n if (this.stackTop()?.mode === 'selected' && selected?.kind === 'region') return;\n this.runEdit('insert.text', (ctx) => {\n const selectedNow = ctx.doc.blockById(selected?.id ?? '');\n if (this.stackTop()?.mode === 'selected' && selectedNow?.kind === 'slot') {\n const end = ops.fillSlot(selectedNow.id, text)(ctx);\n if (end != null) ctx.select(collapsedSel(end));\n return;\n }\n const slot = this.editingSlotIn(ctx.doc);\n const sel = ctx.selection();\n const covers =\n !!slot && !isCollapsed(sel) && selStart(sel) <= slot.start && selEnd(sel) >= slot.end;\n if (slot && (slot.empty || covers)) {\n const end = ops.fillSlot(slot.id, text)(ctx);\n if (end != null) ctx.select(collapsedSel(end));\n return;\n }\n this.deleteSelectionIfNeeded(ctx);\n const inherit = this.typingStyle ?? ctx.doc.textPropsAt(ctx.selection().focus);\n const at = ctx.selection().focus;\n let next = ops.insertText(at, text, inherit)(ctx);\n if (!this.refEdit && shouldTryMarkdown(text)) next = ops.applyMarkdownShortcut(next)(ctx);\n ctx.select(collapsedSel(next));\n });\n if (this.stackTop()?.mode === 'selected' && selected?.kind === 'slot') {\n this.selectVblock(selected.id, 'editing');\n }\n }\n\n pasteText(text: string) {\n this.pasteClipboard(text ? fakePlainClipboard(text) : null);\n }\n\n pasteClipboard(data: DataTransfer | null) {\n if (this.selectedRegion()) return;\n const slice = sliceFromClipboard(data);\n const text = data?.getData('text/plain') ?? '';\n if (!slice && !text) return;\n this.runEdit('insert.paste', (ctx) => {\n const nested = (slice?.virtualBlocks?.length ?? 0) > 0 || (slice?.entities.length ?? 0) > 0;\n const payload = ops.slotInlineText(slice?.text ?? text);\n const slot = this.slotToFill(ctx);\n if (slot && payload && !nested) {\n const end = ops.fillSlot(slot.id, payload)(ctx);\n if (end != null) ctx.select(collapsedSel(end));\n return;\n }\n this.deleteSelectionIfNeeded(ctx);\n if (slice) {\n ctx.select(collapsedSel(ops.insertSlice(ctx.selection().focus, slice)(ctx)));\n return;\n }\n const inherit = this.typingStyle ?? ctx.doc.textPropsAt(ctx.selection().focus);\n const next = ops.pasteText(ctx.selection().focus, text, inherit)(ctx);\n ctx.select(collapsedSel(next));\n });\n if (this.stackTop()?.mode === 'selected' && this.selectedVblock()?.kind === 'slot') {\n const id = this.selectedVblock()?.id;\n if (id) this.selectVblock(id, 'editing');\n }\n }\n\n insertParagraph(opts?: { shift?: boolean }) {\n if (this.disabled) return;\n if (this.enterSelectedVblock()) return;\n if (this.selectedRegion()) return;\n const editing = this.editingSlot();\n const embed = this.selectedImage();\n if (embed?.entity.kind === 'formula' && this.beginFormulaEdit(embed.entity.id)) return;\n if (embed?.entity.kind === 'slot' && this.beginSlotActivate(embed.entity.id)) return;\n if (embed?.entity.kind === 'ref' && this.beginRefEdit(embed.entity.id)) return;\n // 与现网 NodeSelection+Enter 开下拉对齐:仅普通 Enter 激活 host;Shift+Enter 仍在块后换行。\n if (\n embed?.entity.kind === 'host' &&\n !opts?.shift &&\n activateHostEmbed(embed.entity.id, { key: 'Enter', shift: false })\n ) {\n return;\n }\n const explicit = this.typingStyle ? { ...this.typingStyle } : null;\n const pending = { ...this.currentTextStyle() };\n const host = this.targetDoc();\n const fromHeading = host.paragraphPropsAt(this.targetSel().focus).heading ?? 0;\n this.runEdit('insert.paragraph', (ctx) => {\n if (embed && !this.refEdit) {\n ctx.select(collapsedSel(ops.insertParagraph(embed.index + 1)(ctx)));\n return;\n }\n if (editing) {\n const block = ctx.doc.blockById(editing.id);\n const at = block?.end ?? ctx.selection().focus;\n ctx.select(collapsedSel(ops.insertParagraph(at)(ctx)));\n return;\n }\n this.deleteSelectionIfNeeded(ctx);\n ctx.select(collapsedSel(ops.insertParagraph(ctx.selection().focus)(ctx)));\n });\n if (editing) this.vblockStack = [];\n this.typingStyle = this.inheritedTypingStyle(explicit, pending, fromHeading);\n this.keepTypingOnNextClick = !!this.typingStyle;\n this.syncToolbar();\n }\n\n private inheritedTypingStyle(explicit: TextProps | null, pending: TextProps, fromHeading: number): TextProps | null {\n const toHeading = this.targetDoc().paragraphPropsAt(this.targetSel().focus).heading ?? 0;\n if (fromHeading && toHeading === 0) return explicit;\n return explicit ?? pending;\n }\n\n private beginFormulaEdit(id: string): boolean {\n const node = this.pageInner.querySelector(`[data-entity=\"${CSS.escape(id)}\"]`);\n if (!node) return false;\n node.dispatchEvent(new Event('mini-formula-edit'));\n return true;\n }\n\n private beginSlotActivate(id: string): boolean {\n const node = this.pageInner.querySelector(`[data-entity=\"${CSS.escape(id)}\"]`);\n if (!node) return false;\n node.dispatchEvent(new Event('mini-slot-activate'));\n return true;\n }\n\n backspace() {\n if (this.handleVblockBackspace('backward')) return;\n if (this.deleteSelectedEmbed('backspace')) return;\n if (this.exitRefEditAtStart()) return;\n const sel = this.targetSel();\n const doc = this.targetDoc();\n if (isCollapsed(sel)) {\n const i = sel.focus;\n if (!this.refEdit && i > 0 && this.doc.spacers[i - 1] === MARKERS.TABLE_END) {\n const table = findTableAt(this.doc.spacers, i - 1);\n if (table) {\n this.sel = { anchor: table.start, focus: table.end };\n this.paintChrome();\n this.syncToolbar();\n this.syncStatus();\n return;\n }\n }\n }\n this.runEdit('delete.backward', (ctx) => {\n if (!isCollapsed(ctx.selection())) {\n this.deleteSelectionIfNeeded(ctx);\n return;\n }\n const res = ops.backspace(ctx.selection().focus)(ctx);\n if (res) ctx.select(collapsedSel(res.start));\n });\n }\n\n deleteForward() {\n if (this.handleVblockBackspace('forward')) return;\n if (this.deleteSelectedEmbed('forward')) return;\n this.runEdit('delete.forward', (ctx) => {\n if (!isCollapsed(ctx.selection())) {\n this.deleteSelectionIfNeeded(ctx);\n return;\n }\n ops.deleteForward(ctx.selection().focus)(ctx);\n });\n }\n\n private applyText(patch: TextProps) {\n if (isCollapsed(this.targetSel())) {\n this.typingStyle = { ...this.currentTextStyle(), ...patch };\n this.keepTypingOnNextClick = true;\n this.syncToolbar();\n this.ime.focus();\n return;\n }\n this.runEdit('style.text', (ctx) => {\n const sel = ctx.selection();\n ops.applyTextStyle(selStart(sel), selEnd(sel), patch)(ctx);\n });\n }\n\n private toggleText(key: 'bold' | 'italic' | 'underline' | 'strikethrough') {\n const cur = this.currentTextStyle();\n if (key === 'underline') {\n const on = underlineKind(cur) !== 'none';\n this.applyText(on ? { underline: false, underlineStyle: undefined } : { underline: true, underlineStyle: 'single' });\n return;\n }\n this.applyText({ [key]: !cur[key] });\n }\n\n private applyPara(patch: ParagraphProps) {\n this.runEdit('style.paragraph', (ctx) => {\n const sel = ctx.selection();\n ops.applyParagraphStyle(selStart(sel), selEnd(sel), patch)(ctx);\n });\n }\n\n private toggleLink() {\n const existing = this.targetDoc().linkSpanAt(this.targetSel().focus);\n if (isCollapsed(this.targetSel()) && existing) {\n const next = window.prompt('编辑链接,留空则移除', (existing.props as { url: string }).url);\n if (next === null) return;\n this.runEdit('style.link', (ctx) => {\n if (!next.trim()) ops.removeLink(ctx.selection().focus)(ctx);\n else ops.applyLink(existing.start, existing.end, next.trim())(ctx);\n });\n return;\n }\n const sel = this.targetSel();\n const from = selStart(sel);\n const to = selEnd(sel);\n const initial = existing ? (existing.props as { url: string }).url : 'https://';\n const url = window.prompt('输入链接', initial);\n if (url === null) return;\n const href = url.trim();\n if (!href) {\n if (existing) {\n this.runEdit('style.link', (ctx) => ops.removeLink(ctx.selection().focus)(ctx));\n }\n return;\n }\n this.runEdit('style.link', (ctx) => {\n if (from === to) {\n const next = ops.insertText(from, href)(ctx);\n ops.applyLink(from, next, href)(ctx);\n ctx.select({ anchor: from, focus: next });\n } else {\n ops.applyLink(from, to, href)(ctx);\n }\n });\n }\n\n private toggleList(kind: 'ul' | 'ol') {\n const cur = this.targetDoc().paragraphPropsAt(this.targetSel().focus);\n this.applyPara({ list: cur.list === kind ? 'none' : kind, heading: 0 });\n }\n\n private changeIndent(delta: number) {\n const cur = this.targetDoc().paragraphPropsAt(this.targetSel().focus);\n const next = Math.max(0, Math.min(MAX_LIST_INDENT, (cur.indent ?? 0) + delta));\n if (next === (cur.indent ?? 0)) return;\n this.applyPara({ indent: next });\n }\n\n private insertEmbed(entity: EmbedEntity, at: EmbedInsertAt = 'cursor') {\n if (this.refEdit && entity.kind === 'ref') return;\n if (at === 'cursor' && this.selectedRegion()) return;\n const host = this.targetDoc();\n const sized = { ...entity, ...embedPlugin(entity.kind).measure(entity, this.innerContentWidth(), host) };\n this.runEdit('embed.insert', (ctx) => {\n if (at === 'cursor') {\n this.deleteSelectionIfNeeded(ctx);\n } else {\n ctx.select(collapsedSel(this.resolveInsertIndex(at, ctx.doc)));\n }\n const next = ops.insertImage(ctx.selection().focus, sized)(ctx);\n ctx.select({ anchor: next - 1, focus: next });\n });\n }\n\n private resolveInsertIndex(at: EmbedInsertAt, doc = this.doc): number {\n if (at === 'start') return 0;\n if (at === 'end') return Math.max(0, doc.length - 1);\n if (at === 'cursor') return this.targetSel().focus;\n return doc.clamp(at);\n }\n\n private innerContentWidth(): number {\n if (this.refEdit) {\n const box = this.activeRefBox();\n return Math.max(80, refInnerWidth(box?.w ?? 400));\n }\n return this.layout.contentWidth;\n }\n\n private insertCodeBlock() {\n this.insertEmbed({\n id: nextEntityId(),\n kind: 'code',\n width: this.layout.contentWidth,\n height: 80,\n language: 'plain',\n code: ''\n });\n }\n\n private insertFormula() {\n this.insertEmbed({\n id: nextEntityId(),\n kind: 'formula',\n width: 240,\n height: 56,\n latex: '',\n displayMode: true\n });\n }\n\n private insertSlot(slotKind: SlotKind) {\n const id = nextEntityId();\n this.insertEmbed({\n id,\n kind: 'slot',\n slotKind,\n label: defaultSlotLabel(slotKind),\n slotOptions: slotKind === 'select' ? ['小美', '阿力'] : undefined,\n width: 140,\n height: 28\n });\n queueMicrotask(() => this.beginSlotActivate(id));\n }\n\n private promoteRef() {\n if (this.refEdit) return;\n const from = selStart(this.sel);\n const to = selEnd(this.sel);\n if (from === to) return;\n if (to - from === 1 && this.doc.imageAt(from)?.kind === 'ref') return;\n this.runEdit('ref.promote', (ctx) => {\n const hit = ops.promoteRange(from, to)(ctx);\n if (!hit) return;\n ctx.select({ anchor: hit.index, focus: hit.index + 1 });\n });\n }\n\n private insertExistingRef() {\n if (this.refEdit) return;\n const fragments = this.doc.listFragments();\n if (!fragments.length) return;\n if (fragments.length === 1) {\n this.insertRefAtCaret(fragments[0].id);\n return;\n }\n const picked = window.prompt(\n fragments.map((f, i) => `${i + 1}. ${f.title ?? f.id}`).join('\\n') + '\\n\\n输入序号插入',\n '1'\n );\n const index = Number(picked) - 1;\n if (!Number.isInteger(index) || !fragments[index]) return;\n this.insertRefAtCaret(fragments[index].id);\n }\n\n private insertRefAtCaret(fragmentId: string) {\n if (this.selectedRegion()) return;\n this.runEdit('ref.insert', (ctx) => {\n this.deleteSelectionIfNeeded(ctx);\n const index = ops.insertRef(ctx.selection().focus, fragmentId)(ctx);\n ctx.select({ anchor: index, focus: index + 1 });\n });\n }\n\n private unlinkSelectedRef() {\n const embed = this.selectedImage();\n if (embed?.entity.kind !== 'ref') return;\n this.exitRefEdit();\n this.runEdit('ref.unlink', (ctx) => {\n const next = ops.unlinkRef(embed.index)(ctx);\n if (next !== null) ctx.select(collapsedSel(next));\n });\n }\n\n private selectedEmbedIndex(side: 'backspace' | 'forward'): number | null {\n if (this.refEdit) return null;\n const from = selStart(this.sel);\n const to = selEnd(this.sel);\n // 整块选中(蓝框 / 胶囊 selected)时,退格和 Delete 都删块。\n if (to - from === 1 && this.doc.spacers[from] === MARKERS.IMAGE) return from;\n if (from !== to) return null;\n // 折叠光标在块前:Delete 删块,Backspace 删光标前的字符。\n if (side === 'forward' && this.doc.spacers[from] === MARKERS.IMAGE) return from;\n // 折叠光标在块后:Backspace 删块。\n if (side === 'backspace' && from > 0 && this.doc.spacers[from - 1] === MARKERS.IMAGE) return from - 1;\n return null;\n }\n\n private deleteSelectedEmbed(side: 'backspace' | 'forward'): boolean {\n const index = this.selectedEmbedIndex(side);\n if (index === null) return false;\n this.runEdit('embed.delete', (ctx) => {\n ops.deleteRange(index, index + 1)(ctx);\n ctx.select(collapsedSel(index));\n });\n return true;\n }\n\n private exitRefEditAtStart(): boolean {\n if (!this.refEdit || !isCollapsed(this.fragSel) || this.fragSel.focus !== 0) return false;\n this.exitRefEdit();\n return true;\n }\n\n private refInnerLayout(box: ImageBox): DocLayout | null {\n if (box.inner) return box.inner;\n if (box.entity.kind !== 'ref' || !box.entity.fragmentId) return null;\n const innerW = refInnerWidth(box.w);\n return layoutDocument(this.doc.ensureFragmentModel(box.entity.fragmentId), innerW, undefined, { x: 0, y: 0 }, 1);\n }\n\n private hitRefIndex(box: ImageBox, x: number, y: number): number {\n const inner = this.refInnerLayout(box);\n if (!inner) return 0;\n return hitTestIndex(inner, x - box.x - REF_PAD, y - box.y - REF_HEAD);\n }\n\n private beginRefEdit(id: string, at?: number): boolean {\n const entity = this.doc.entities.get(id);\n if (entity?.kind !== 'ref' || !entity.fragmentId) return false;\n const model = this.doc.ensureFragmentModel(entity.fragmentId);\n this.refEdit = { entityId: id, fragmentId: entity.fragmentId };\n const fallback = Math.max(0, model.length - (model.spacers.endsWith('\\n') ? 1 : 0));\n this.fragSel = collapsedSel(at === undefined ? fallback : Math.max(0, Math.min(at, model.length)));\n this.relayout();\n this.ime.focus();\n return true;\n }\n\n private exitRefEdit(side?: 'before' | 'after') {\n if (!this.refEdit) return;\n const box = this.activeRefBox();\n const index = box?.index ?? selStart(this.sel);\n this.refEdit = null;\n if (side === 'before') this.sel = collapsedSel(index);\n else if (side === 'after') this.sel = collapsedSel(index + 1);\n else this.sel = { anchor: index, focus: index + 1 };\n this.relayout();\n this.ime.focus();\n }\n\n private onRefJump = (e: Event) => {\n const { fragmentId, id } = (e as CustomEvent<RefJumpDetail>).detail;\n const indices = this.doc.refIndices(fragmentId);\n if (indices.length < 2) return;\n const box = this.layout.images.find((b) => b.entity.id === id);\n const here = box?.index ?? -1;\n const pos = Math.max(0, indices.indexOf(here));\n const next = indices[(pos + 1) % indices.length];\n this.exitRefEdit();\n this.sel = { anchor: next, focus: next + 1 };\n this.afterCaretMove();\n };\n\n private onDoubleClick = (e: MouseEvent) => {\n const { x, y } = this.localPoint(e);\n const box = this.hitImage(x, y);\n if (box?.entity.kind !== 'ref') return;\n e.preventDefault();\n this.beginRefEdit(box.entity.id, this.hitRefIndex(box, x, y));\n };\n\n private applyEmbedPatch(id: string, patch: Partial<EmbedEntity>) {\n this.applyNow(ops.updateImage(id, patch));\n const entity = this.doc.entities.get(id);\n if (!entity) return;\n const size = embedPlugin(entity.kind).measure(entity, this.layout.contentWidth);\n this.applyNow(ops.updateImage(id, size));\n this.layout = layoutDocument(this.doc, this.contentWidth, this.layout, this.padding);\n this.painter.paintDoc(this.layout);\n this.paintChrome();\n }\n\n private onEmbedMeasure = (e: Event) => {\n const { id, width, height } = (e as CustomEvent<EmbedMeasureDetail>).detail;\n const entity = this.doc.entities.get(id);\n if (!entity) return;\n // 尺寸没变就不重排;变了只更新布局,不进撤销栈、不开编辑事务。\n if (entity.width === width && entity.height === height) return;\n this.applyEmbedPatch(id, { width, height });\n };\n\n private onEmbedChange = (e: Event) => {\n const { id, patch } = (e as CustomEvent<EmbedChangeDetail>).detail;\n const entity = this.doc.entities.get(id);\n if (!entity) return;\n if (!this.embedEdit || this.embedEdit.id !== id) this.embedEdit = { id, before: cloneEntity(entity) };\n this.applyEmbedPatch(id, patch);\n };\n\n private onEmbedCommit = (e: Event) => {\n const { id, patch } = (e as CustomEvent<EmbedChangeDetail>).detail;\n const before = this.embedEdit?.id === id ? this.embedEdit.before : this.doc.entities.get(id);\n this.applyEmbedPatch(id, patch);\n const after = this.doc.entities.get(id);\n this.embedEdit = null;\n if (!before || !after) return;\n if (\n before.code === after.code &&\n before.latex === after.latex &&\n before.language === after.language &&\n before.width === after.width &&\n before.height === after.height &&\n before.slotValue === after.slotValue &&\n before.src === after.src &&\n before.label === after.label &&\n before.hostType === after.hostType &&\n before.data === after.data\n ) {\n return;\n }\n const prev = cloneEntity(before);\n const next = cloneEntity(after);\n this.commitPreview('embed.update', ops.updateImage(id, prev), ops.updateImage(id, next));\n };\n\n private onEmbedExitEdit = (e: Event) => {\n const { id, side } = (e as CustomEvent<EmbedExitDetail>).detail;\n const box = this.layout.images.find((b) => b.entity.id === id);\n if (!box) return;\n this.sel = collapsedSel(side === 'before' ? box.index : box.index + 1);\n this.afterCaretMove();\n this.ime.focus();\n };\n\n private insertMediaFile(file: File, kind: 'image' | 'video') {\n if (this.selectedRegion()) return;\n const src = URL.createObjectURL(file);\n const commit = (nw: number, nh: number) => {\n if (this.selectedRegion()) return;\n const max = 360;\n const w0 = nw > 0 ? nw : 360;\n const h0 = nh > 0 ? nh : Math.round(w0 / VIDEO_ASPECT);\n const scale = w0 > max ? max / w0 : 1;\n const entity = {\n id: nextEntityId(),\n src,\n width: Math.max(24, Math.round(w0 * scale)),\n height: Math.max(24, Math.round(h0 * scale)),\n kind\n };\n this.runEdit('embed.insert', (ctx) => {\n this.deleteSelectionIfNeeded(ctx);\n const next = ops.insertImage(ctx.selection().focus, entity)(ctx);\n ctx.select({ anchor: next - 1, focus: next });\n });\n };\n if (kind === 'video') {\n const video = document.createElement('video');\n video.preload = 'metadata';\n video.onloadedmetadata = () => commit(video.videoWidth, video.videoHeight);\n video.onerror = () => commit(360, Math.round(360 / VIDEO_ASPECT));\n video.src = src;\n return;\n }\n const img = new Image();\n img.onload = () => commit(img.width, img.height);\n img.onerror = () => commit(360, 360);\n img.src = src;\n }\n\n private insertTable() {\n if (this.selectedRegion()) return;\n this.runEdit('table.insert', (ctx) => {\n this.deleteSelectionIfNeeded(ctx);\n ctx.select(collapsedSel(ops.insertTable(ctx.selection().focus, 2, 2)(ctx)));\n });\n }\n\n private tableOp(op: 'row' | 'col' | 'del-row' | 'del-col') {\n this.runEdit('table.structure', (ctx) => {\n const focus = ctx.selection().focus;\n if (op === 'row') ops.insertTableRow(focus)(ctx);\n if (op === 'col') ops.insertTableCol(focus)(ctx);\n if (op === 'del-row') ops.deleteTableRow(focus)(ctx);\n if (op === 'del-col') ops.deleteTableCol(focus)(ctx);\n });\n }\n\n undo() {\n this.applyHistoryStep(this.undoStack.popForUndo());\n }\n\n redo() {\n this.applyHistoryStep(this.undoStack.popForRedo());\n }\n\n /**\n * 执行撤销栈交回来的一步。\n *\n * 栈给的是一条常规 EditResult:`mutations` 直接应用,选区取 `selectionAfter`。\n * 选区属于哪个坐标空间由 `meta.scope` 说了算 —— 片段里的编辑,撤销时该动的是\n * 片段选区。\n */\n private applyHistoryStep(step: EditResult | null) {\n if (!step) return;\n applyMutations(this.doc, step.mutations);\n if (step.meta.scope) this.fragSel = { ...step.selectionAfter };\n else this.sel = { ...step.selectionAfter };\n this.typingStyle = null;\n this.relayout();\n // 撤销/重做同样改变了文档内容,外部缓存需要随之刷新。\n this.emit('change');\n }\n\n private relayout(opts?: { reuse?: boolean }) {\n // 每次重排前按当前容器宽度更新内容宽度('fill' 模式下会随容器变化)。\n // contentWidth 未变时 engine 内部走增量复用,不会有额外重排开销。\n this.contentWidth = this.resolveContentWidth();\n this.syncActiveFragment();\n this.refreshRefMetrics();\n const prev = opts?.reuse === false ? undefined : this.layout;\n this.layout = layoutDocument(this.doc, this.contentWidth, prev, this.padding);\n this.root.style.setProperty('--mini-content-width', `${Math.max(0, this.layout.contentWidth)}px`);\n this.painter.paintDoc(this.layout);\n this.paintChrome();\n this.syncToolbar();\n this.syncStatus();\n this.scrollCaret();\n // 失焦后不要抢回 IME,否则点到页内其它控件还会看到光标。\n if (document.activeElement === this.ime.el) this.ime.focus();\n this.emit('layoutchange');\n }\n\n private paintChrome() {\n const embed = this.selectedImage();\n if (this.refEdit) {\n const box = this.activeRefBox();\n const origin = box ? { x: box.x + REF_PAD, y: box.y + REF_HEAD } : { x: 0, y: 0 };\n const rects = box?.inner\n ? selectionRects(box.inner, this.fragSel).map((r) => ({ ...r, x: r.x + origin.x, y: r.y + origin.y }))\n : [];\n this.painter.paintSelection(rects);\n } else {\n this.painter.paintSelection(embed ? [] : this.selectionPaintRects());\n }\n this.paintCaretLayer();\n this.updateEmbedChrome(embed);\n this.decorateRefNodes();\n this.decorateHostNodes();\n this.syncPlaceholder();\n }\n\n /**\n * 占位只在「看不见任何正文」时出现。组合一开始(哪怕候选串还是空的)就必须关掉:\n * 中间态走 applyNow,不发 change,宿主叠层会一直以为是空的。\n */\n private syncPlaceholder() {\n const composing = this.ime.composing || this.composeAnchor !== null;\n const show = !!this.placeholderText && !composing && isVisuallyEmptyDoc(this.doc);\n this.placeholderEl.hidden = !show;\n if (!show) return;\n this.placeholderEl.textContent = this.placeholderText;\n const line = this.layout.lines[0];\n const para = this.doc.paragraphPropsAt(0);\n const style = resolvedTextStyle(this.doc, 0, para);\n const size = style.fontSize ?? 16;\n const color = this.chrome.placeholderColor ?? '';\n const opacity =\n this.chrome.placeholderOpacity !== undefined ? String(this.chrome.placeholderOpacity) : '';\n this.placeholderEl.style.cssText = [\n `left:${this.layout.contentX}px`,\n `top:${line?.y ?? this.layout.contentY}px`,\n `max-width:${Math.max(0, this.layout.contentWidth)}px`,\n `font-size:${size}px`,\n `line-height:${line?.h ?? lineHeightOf(style)}px`,\n color ? `color:${color}` : '',\n opacity ? `opacity:${opacity}` : '',\n ]\n .filter(Boolean)\n .join(';');\n }\n\n private decorateHostNodes() {\n syncHostSelected(this.selectedImage()?.entity.id ?? null);\n }\n\n private decorateRefNodes() {\n const selectedId = this.selectedImage()?.entity.id;\n for (const node of this.pageInner.querySelectorAll<HTMLElement>('.mini-ref')) {\n const id = node.dataset.entity;\n const entity = id ? this.doc.entities.get(id) : undefined;\n if (!entity?.fragmentId) continue;\n const fragment = this.doc.fragments.get(entity.fragmentId);\n decorateRefEl(\n node,\n this.doc.refCount(entity.fragmentId),\n fragment?.title ?? '同步块',\n this.refEdit?.entityId === entity.id,\n selectedId === entity.id || this.refEdit?.entityId === entity.id\n );\n }\n }\n\n private paintCaretLayer() {\n const style = this.currentTextStyle();\n const mapped = this.refCaretPos();\n const demoCaret = this.chrome.caret === 'rainbow';\n const caret = {\n ...(mapped ?? caretFromIndex(this.layout, this.sel.focus)),\n italic: demoCaret && !!style.italic,\n bold: demoCaret && !!style.bold\n };\n if (demoCaret) {\n caret.opacity = 0.22 + 0.78 * (0.5 + 0.5 * Math.cos(performance.now() / 180));\n } else if (this.paintMode === 'canvas') {\n // 按墙钟闪,不要跟 rAF 帧数绑:CommandBox canvas 有 host 时帧率会掉,64 帧一圈会变得很慢。\n const period = 1060;\n caret.opacity = performance.now() % period < period / 2 ? 1 : 0;\n }\n const key = `${Math.round(caret.x)}:${Math.round(caret.y)}:${Math.round(caret.h)}`;\n if (this.caretTrailEnabled() && key !== this.lastCaretKey) {\n if (this.lastCaretKey) this.caretTrails.unshift({ ...caret, opacity: 0.35 });\n this.caretTrails = this.caretTrails.slice(0, 3);\n this.lastCaretKey = key;\n }\n if (!this.caretTrailEnabled()) this.caretTrails = [];\n const showCaret =\n this.isFocused() &&\n !this.isEmbedChromeFocused() &&\n (this.refEdit ? isCollapsed(this.fragSel) : isCollapsed(this.sel));\n this.painter.paintCaret(\n showCaret ? caret : null,\n showCaret,\n this.caretTrailEnabled() ? this.caretTrails : []\n );\n const imeH = lineHeightOf(style);\n // 系统输入法靶子锚在组合起点,作为候选框的定位点;它本身透明、只占 1px,\n // 不再撑白块盖字(组合串的可见呈现完全交给模型正文)。\n const anchorPos = this.ime.composing ? this.composeCaret() : caret;\n const imeY = anchorPos.y + Math.max(0, (anchorPos.h - imeH) / 2);\n this.ime.moveTo(anchorPos.x, imeY, imeH);\n // 自绘的组合区下划线:从组合起点铺到组合串末尾。组合串在模型里,宽度与正文\n // 同度量,天然对齐。\n const composeW = this.ime.composing && this.composeText ? Math.max(12, measureWidth(this.composeText, style)) : 0;\n this.imeBar.style.display = composeW ? 'block' : 'none';\n if (composeW) {\n const underlineH = this.chrome.composeUnderlineWidth ?? 2;\n this.imeBar.style.left = `${anchorPos.x}px`;\n this.imeBar.style.top = `${anchorPos.y + anchorPos.h - underlineH}px`;\n this.imeBar.style.width = `${composeW}px`;\n }\n }\n\n /** 组合串起点(锚点)的屏幕坐标;主文档与片段内编辑都算对。 */\n private composeCaret(): CaretPos {\n const anchor = this.composeAnchor ?? this.targetSel().focus;\n if (this.refEdit) {\n const box = this.activeRefBox();\n if (box?.inner) {\n const c = caretFromIndex(box.inner, anchor);\n return { ...c, x: c.x + box.x + REF_PAD, y: c.y + box.y + REF_HEAD };\n }\n }\n return caretFromIndex(this.layout, anchor);\n }\n\n private refCaretPos(): CaretPos | null {\n if (!this.refEdit) return null;\n const box = this.activeRefBox();\n if (!box?.inner) return null;\n const caret = caretFromIndex(box.inner, this.fragSel.focus);\n return { ...caret, x: caret.x + box.x + REF_PAD, y: caret.y + box.y + REF_HEAD };\n }\n\n private currentTextStyle(): TextProps {\n const doc = this.targetDoc();\n const sel = this.targetSel();\n if (this.typingStyle) return { ...this.currentParaTextDefaults(), ...this.typingStyle };\n const para = doc.paragraphPropsAt(sel.focus);\n const idx = isCollapsed(sel) ? Math.max(0, sel.focus - 1) : selStart(sel);\n return resolvedTextStyle(doc, idx, para);\n }\n\n private currentParaTextDefaults(): TextProps {\n const doc = this.targetDoc();\n const sel = this.targetSel();\n return resolvedTextStyle(doc, sel.focus, doc.paragraphPropsAt(sel.focus));\n }\n\n private syncToolbar() {\n this.emit('statechange');\n }\n\n private syncStatus() {\n this.emit('selectionchange');\n }\n\n private resetBlink() {\n window.cancelAnimationFrame(this.caretRaf);\n this.caretRaf = 0;\n this.paintCaretLayer();\n // HTML 实心光标靠 CSS 闪;每帧写 opacity/display 会把动画掐掉,看起来像闪得很慢。\n if (this.caretIsSolid() && this.paintMode !== 'canvas') return;\n const tick = () => {\n this.paintCaretLayer();\n this.caretRaf = window.requestAnimationFrame(tick);\n };\n this.caretRaf = window.requestAnimationFrame(tick);\n }\n\n private scrollCaret() {\n const caret = this.refCaretPos() ?? caretFromIndex(this.layout, this.sel.focus);\n const wrap = this.page;\n const top = caret.y - 40;\n const bottom = caret.y + caret.h + 40;\n if (top < wrap.scrollTop) wrap.scrollTop = Math.max(0, top);\n if (bottom > wrap.scrollTop + wrap.clientHeight) wrap.scrollTop = bottom - wrap.clientHeight;\n }\n\n private localPoint(e: MouseEvent): { x: number; y: number } {\n const rect = this.painter.getSurface().getBoundingClientRect();\n return { x: e.clientX - rect.left, y: e.clientY - rect.top };\n }\n\n private onDocMouseDown = (e: MouseEvent) => {\n const t = e.target as Node;\n // parent 是宿主挂载点:空文档时表面比外层 min-height 矮,点到宿主空白\n // 仍应算编辑器内,否则会先 blur,再点也聚焦不住。\n this.keysArmed = this.root.contains(t) || this.parent.contains(t);\n if (!this.keysArmed) {\n this.ime.el.blur();\n this.paintCaretLayer();\n }\n };\n\n private onRootMouseDown = (e: MouseEvent) => {\n if (this.disabled) return;\n const el = e.target as HTMLElement;\n if (el.closest('.mini-embed-interactive') || el.closest('.mini-resize')) return;\n // 点的是非可聚焦层(空表面、占位、页边空白)。不 preventDefault 的话,\n // 浏览器会在 mousedown 默认动作里把刚 focus 的 IME 再 blur 掉。\n e.preventDefault();\n this.ime.focus();\n };\n\n private onFocusChange = () => {\n queueMicrotask(() => this.paintCaretLayer());\n };\n\n private onMouseDown = (e: MouseEvent) => {\n if (e.button !== 0) return;\n if ((e.target as HTMLElement).closest('.mini-resize')) return;\n const { x, y } = this.localPoint(e);\n const refBox = this.hitImage(x, y);\n if (!this.refEdit && refBox?.entity.kind === 'ref') {\n e.preventDefault();\n this.setSel({ anchor: refBox.index, focus: refBox.index + 1 });\n this.ime.focus();\n this.resetBlink();\n this.paintChrome();\n this.syncToolbar();\n this.syncStatus();\n return;\n }\n if (this.refEdit) {\n if (refBox?.entity.kind === 'ref' && refBox.entity.fragmentId === this.refEdit.fragmentId) {\n e.preventDefault();\n this.refEdit = { entityId: refBox.entity.id, fragmentId: refBox.entity.fragmentId };\n this.sel = { anchor: refBox.index, focus: refBox.index + 1 };\n const index = this.hitRefIndex(refBox, x, y);\n this.fragSel = e.shiftKey ? { ...this.fragSel, focus: index } : collapsedSel(index);\n this.refDragging = true;\n this.refDragAnchor = e.shiftKey ? this.fragSel.anchor : index;\n this.ime.focus();\n this.resetBlink();\n this.paintChrome();\n this.syncToolbar();\n this.syncStatus();\n return;\n }\n this.exitRefEdit();\n }\n const interactive = (e.target as HTMLElement).closest('.mini-embed-interactive') as HTMLElement | null;\n if (interactive) {\n // 点在 embed 内部的真实交互控件(输入框、下拉、视频、公式域等)上:把焦点\n // 交给该控件本身,编辑器完全不介入——不 preventDefault、不选中整块、不抢焦点。\n // 否则浏览器的默认聚焦被阻止,控件拿不到焦点,键盘输入会落回编辑器(表现为\n // “一输入就替换整块”)。\n const field = (e.target as HTMLElement).closest('textarea, input, select, video, math-field, [contenteditable=\"true\"]');\n if (field) {\n this.keepTypingOnNextClick = false;\n return;\n }\n // 点在 embed 的非交互区域(外框/背景):选中整块。\n e.preventDefault();\n this.keepTypingOnNextClick = false;\n const index = Number(interactive.dataset.index);\n if (Number.isFinite(index)) {\n this.dragging = false;\n this.setSel({ anchor: index, focus: index + 1 });\n this.resetBlink();\n this.paintChrome();\n this.syncToolbar();\n this.syncStatus();\n }\n this.ime.focus();\n return;\n }\n e.preventDefault();\n this.ime.focus();\n if (this.keepTypingOnNextClick && !e.shiftKey && !e.metaKey && !e.ctrlKey) {\n this.keepTypingOnNextClick = false;\n this.resetBlink();\n this.paintChrome();\n this.syncToolbar();\n return;\n }\n const border = hitColBorder(this.layout, x, y);\n if (border) {\n this.colResizing = { tableStart: border.tableStart, col: border.col, startX: e.clientX, widths: border.widths };\n return;\n }\n const index = nearestSafeIndex(this.doc.spacers, hitTestIndex(this.layout, x, y));\n if ((e.metaKey || e.ctrlKey) && !e.shiftKey) {\n const url = this.doc.linkUrlAt(index);\n if (url && openSafeUrl(url)) return;\n }\n const img = this.hitImage(x, y);\n if (img) {\n this.vblockStack = [];\n this.setSel({ anchor: img.index, focus: img.index + 1 });\n } else if (e.shiftKey) {\n this.setSel(this.expandSel(this.sel.anchor, this.snapIndexForDrag(this.sel.anchor, index)));\n } else if (this.hitVblockClick(index)) {\n // stack/selection already updated\n } else {\n this.vblockStack = [];\n this.setSel(collapsedSel(index));\n }\n this.dragAnchor = this.sel.anchor;\n this.dragging = true;\n this.resetBlink();\n this.paintChrome();\n this.syncToolbar();\n this.syncStatus();\n };\n\n private onMouseMove = (e: MouseEvent) => {\n const { x, y } = this.localPoint(e);\n if (this.refDragging && this.refEdit) {\n const box = this.activeRefBox();\n if (box) {\n const index = this.hitRefIndex(box, x, y);\n this.fragSel = { anchor: this.refDragAnchor, focus: index };\n this.paintChrome();\n this.syncStatus();\n }\n return;\n }\n if (this.colResizing) {\n this.applyColResize(e.clientX);\n return;\n }\n if (this.resizing) {\n const dx = e.clientX - this.resizing.startX;\n const w = Math.max(40, this.resizing.startW + dx);\n const entity = this.doc.entities.get(this.resizing.id);\n const plugin = embedPlugin(entity?.kind);\n if (plugin.keepAspectRatio) {\n const ratio = this.resizing.startH / this.resizing.startW;\n this.applyNow(ops.updateImage(this.resizing.id, { width: Math.round(w), height: Math.round(w * ratio) }));\n } else {\n this.applyNow(ops.updateImage(this.resizing.id, { width: Math.round(w) }));\n if (entity) {\n const size = plugin.measure({ ...entity, width: Math.round(w) }, this.layout.contentWidth);\n this.applyNow(ops.updateImage(this.resizing.id, size));\n }\n }\n this.layout = layoutDocument(this.doc, this.contentWidth, this.layout, this.padding);\n this.painter.paintDoc(this.layout);\n this.paintChrome();\n return;\n }\n if (!this.dragging) {\n this.painter.getSurface().classList.toggle('is-col-resize', !!hitColBorder(this.layout, x, y));\n return;\n }\n const focus = nearestSafeIndex(this.doc.spacers, hitTestIndex(this.layout, x, y));\n this.sel = this.expandSel(this.dragAnchor, this.snapIndexForDrag(this.dragAnchor, focus));\n this.paintChrome();\n this.syncStatus();\n };\n\n private onMouseUp = () => {\n if (this.colResizing) {\n const { tableStart, widths } = this.colResizing;\n const next = this.doc.tablePropsAt(tableStart).colWidths ?? widths;\n this.colResizing = null;\n if (next.some((w, i) => w !== widths[i])) {\n this.commitPreview(\n 'table.colWidth',\n ops.setTableColWidths(tableStart, widths),\n ops.setTableColWidths(tableStart, next)\n );\n }\n }\n if (this.resizing) {\n const id = this.resizing.id;\n const entity = this.doc.entities.get(id);\n const startW = this.resizing.startW;\n const startH = this.resizing.startH;\n this.resizing = null;\n if (entity && (entity.width !== startW || entity.height !== startH)) {\n const w = entity.width;\n const h = entity.height;\n this.commitPreview(\n 'embed.resize',\n ops.updateImage(id, { width: startW, height: startH }),\n ops.updateImage(id, { width: w, height: h })\n );\n }\n }\n this.dragging = false;\n this.refDragging = false;\n };\n\n private onResizeStart = (e: MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n const img = this.selectedImage();\n if (!img || img.entity.kind === 'slot' || img.entity.kind === 'ref') return;\n this.resizing = { id: img.entity.id, startX: e.clientX, startW: img.entity.width, startH: img.entity.height };\n };\n\n private hitImage(x: number, y: number) {\n const hits = this.layout.images.filter((b) => x >= b.x && x <= b.x + b.w && y >= b.y && y <= b.y + b.h);\n return hits.find((b) => b.entity.kind === 'ref') ?? hits[hits.length - 1] ?? null;\n }\n\n private selectedImage() {\n if (selEnd(this.sel) - selStart(this.sel) !== 1) return null;\n const i = selStart(this.sel);\n if (this.doc.spacers[i] !== MARKERS.IMAGE) return null;\n return imageBoxAt(this.layout, i);\n }\n\n private updateEmbedChrome(img = this.selectedImage()) {\n if (!img) {\n this.embedFrame.style.display = 'none';\n this.handle.style.display = 'none';\n return;\n }\n const isSlot = img.entity.kind === 'slot';\n const isRef = img.entity.kind === 'ref';\n const isHost = img.entity.kind === 'host';\n this.embedFrame.classList.toggle('is-slot', isSlot);\n this.embedFrame.classList.toggle('is-ref', isRef);\n this.embedFrame.classList.toggle('is-image', isSlot && img.entity.slotKind === 'image');\n // host 选中态由宿主组件自己画(如 InlineButton data-selected),不叠 SDK 蓝框。\n this.embedFrame.style.display =\n this.refEdit || isHost ? 'none' : 'block';\n this.embedFrame.style.left = `${img.x}px`;\n this.embedFrame.style.top = `${img.y}px`;\n this.embedFrame.style.width = `${img.w}px`;\n this.embedFrame.style.height = `${img.h}px`;\n // 尺寸由宿主渲染回报决定的 host 块,和插槽/引用一样不提供拖拽缩放手柄。\n this.handle.style.display = isSlot || isRef || isHost ? 'none' : 'block';\n this.handle.style.left = `${img.x + img.w - 5}px`;\n this.handle.style.top = `${img.y + img.h - 5}px`;\n }\n\n private writeClipboard(data: DataTransfer | null) {\n if (!data) return;\n const doc = this.targetDoc();\n const from = selStart(this.targetSel());\n const to = selEnd(this.targetSel());\n const slice = doc.takeSlice(from, to);\n data.setData(SLICE_MIME, serializeSlice(slice));\n data.setData('text/plain', doc.plainText(from, to));\n data.setData('text/html', sliceToHtml(slice));\n }\n\n private onCopy = (e: ClipboardEvent) => {\n if (!this.isFocused() || this.isEmbedChromeFocused()) return;\n if (isCollapsed(this.sel)) return;\n e.preventDefault();\n this.writeClipboard(e.clipboardData);\n };\n\n private onCut = (e: ClipboardEvent) => {\n if (!this.isFocused() || this.isEmbedChromeFocused()) return;\n if (isCollapsed(this.sel)) return;\n if (this.selectedRegion()) {\n e.preventDefault();\n return;\n }\n e.preventDefault();\n this.writeClipboard(e.clipboardData);\n this.backspace();\n };\n\n private isFocused(): boolean {\n return this.root.contains(document.activeElement);\n }\n\n /** 焦点在公式/槽等嵌入控件内时不画外层光标。 */\n private isEmbedChromeFocused(): boolean {\n const el = document.activeElement;\n if (!el || el === this.ime.el) return false;\n return !!el.closest('.mini-embed-interactive');\n }\n\n /**\n * 这次按键归不归本编辑器管。\n *\n * 「哪个键干什么」在 commands/shortcuts.ts 里,门面只回答这一个问题 —— 焦点在\n * 别的输入框、编辑器没装备快捷键、焦点在嵌入对象的字段里,都不接。\n */\n private acceptsKey(e: KeyboardEvent): boolean {\n if (this.disabled) return false;\n const target = e.target as HTMLElement;\n if (target.closest('input, textarea, select, math-field')) return false;\n if (!this.keysArmed && !this.root.contains(target)) return false;\n return !this.isEmbedChromeFocused();\n }\n\n private selectAll() {\n const editing = this.editingSlot();\n if (editing) {\n this.sel = { anchor: editing.start, focus: editing.end };\n this.paintChrome();\n this.syncStatus();\n return;\n }\n const full = { anchor: 0, focus: this.targetDoc().length };\n if (this.refEdit) this.fragSel = full;\n else this.sel = full;\n this.paintChrome();\n this.syncStatus();\n }\n\n /** Escape:先弹出虚拟块一层,再退出同步块内部编辑。 */\n private exitFragmentEdit(): boolean {\n if (this.vblockStack.length) {\n this.popVblock();\n return true;\n }\n if (!this.refEdit) return false;\n this.exitRefEdit();\n return true;\n }\n\n /** Tab:在列表里改嵌套层级,否则在表格里跳到下一格。 */\n private indentOrNextCell(dir: 1 | -1) {\n const inList = this.doc.paragraphPropsAt(this.sel.focus).list !== 'none';\n if (!inList && this.moveTableCell(dir)) return;\n this.changeIndent(dir);\n }\n\n private moveTableCell(dir: 1 | -1): boolean {\n const here = cellAt(this.doc.spacers, this.sel.focus);\n if (!here) return false;\n if (dir > 0 && isLastTableCell(here)) {\n this.runEdit('table.structure', (ctx) => {\n ops.insertTableRow(ctx.selection().focus)(ctx);\n });\n }\n const next = nextCellIndex(this.doc.spacers, this.sel.focus, dir);\n if (next === null) return false;\n const hit = cellAt(this.doc.spacers, next);\n if (!hit) {\n this.sel = collapsedSel(next);\n } else {\n const range = cellContentRange(hit.cell);\n this.sel = { anchor: range.start, focus: range.end };\n }\n this.relayout();\n return true;\n }\n\n private expandSel(anchor: number, focus: number): Selection {\n const a = cellAt(this.doc.spacers, anchor);\n const b = cellAt(this.doc.spacers, focus);\n if (a && b && a.table.start === b.table.start && (a.row !== b.row || a.col !== b.col)) {\n const r0 = Math.min(a.row, b.row);\n const r1 = Math.max(a.row, b.row);\n const c0 = Math.min(a.col, b.col);\n const c1 = Math.max(a.col, b.col);\n let start = Infinity;\n let end = -Infinity;\n for (let r = r0; r <= r1; r++) {\n for (let c = c0; c <= c1; c++) {\n const cell = a.table.rows[r]?.cells[c];\n if (!cell) continue;\n start = Math.min(start, cell.start);\n end = Math.max(end, cell.end);\n }\n }\n if (start < end) return { anchor: start, focus: end };\n }\n return { anchor, focus };\n }\n\n private applyColResize(clientX: number) {\n if (!this.colResizing) return;\n const { tableStart, col, startX, widths } = this.colResizing;\n const next = [...widths];\n const sum = widths[col] + widths[col + 1];\n const w1 = Math.max(MIN_COL_WIDTH, Math.min(sum - MIN_COL_WIDTH, widths[col] + (clientX - startX)));\n next[col] = Math.round(w1);\n next[col + 1] = Math.round(sum - w1);\n this.applyNow(ops.setTableColWidths(tableStart, next));\n this.layout = layoutDocument(this.doc, this.contentWidth, this.layout, this.padding);\n this.painter.paintDoc(this.layout);\n this.paintChrome();\n }\n\n private moveCaret(key: ArrowKey, extend: boolean) {\n if (this.refEdit) {\n this.moveFragmentCaret(key, extend);\n return;\n }\n if (!extend && (key === 'ArrowLeft' || key === 'ArrowRight')) {\n const vnext = this.moveAcrossVblock(key === 'ArrowRight' ? 1 : -1);\n if (vnext) {\n this.sel = vnext;\n this.afterCaretMove();\n return;\n }\n const next = this.moveAcrossEmbed(key === 'ArrowRight' ? 1 : -1);\n if (next) {\n this.sel = next;\n this.afterCaretMove();\n return;\n }\n }\n let index = this.sel.focus;\n if (key === 'ArrowLeft') index = this.stepIndex(index, -1);\n if (key === 'ArrowRight') index = this.stepIndex(index, 1);\n if (key === 'ArrowUp') index = this.verticalMove(index, -1);\n if (key === 'ArrowDown') index = this.verticalMove(index, 1);\n if (!extend && this.doc.spacers[index] === MARKERS.IMAGE) {\n this.sel = { anchor: index, focus: index + 1 };\n } else if (extend) {\n this.sel = { ...this.sel, focus: this.snapIndexForDrag(this.sel.anchor, index) };\n } else {\n this.sel = collapsedSel(index);\n }\n const editing = this.editingSlot();\n if (editing) {\n const a = Math.min(editing.end, Math.max(editing.start, this.sel.anchor));\n const f = Math.min(editing.end, Math.max(editing.start, this.sel.focus));\n this.sel = { anchor: a, focus: f };\n } else if (!extend && (key === 'ArrowUp' || key === 'ArrowDown')) {\n const slot = this.doc.innermostSlotAt(this.sel.focus) ?? this.doc.slotAtCaret(this.sel.focus);\n if (slot) {\n this.selectVblock(slot.id, 'editing');\n this.afterCaretMove();\n return;\n }\n }\n this.afterCaretMove();\n }\n\n private moveFragmentCaret(key: ArrowKey, extend: boolean) {\n const doc = this.targetDoc();\n const box = this.activeRefBox();\n let index = this.fragSel.focus;\n if (!extend && isCollapsed(this.fragSel) && (key === 'ArrowLeft' || key === 'ArrowRight')) {\n if (key === 'ArrowLeft' && index <= 0) {\n this.exitRefEdit('before');\n return;\n }\n if (key === 'ArrowRight' && index >= Math.max(0, doc.length - (doc.spacers.endsWith('\\n') ? 1 : 0))) {\n this.exitRefEdit('after');\n return;\n }\n }\n if (key === 'ArrowLeft') index = Math.max(0, index - prevCodePointLen(doc.spacers, index));\n if (key === 'ArrowRight') index = Math.min(doc.length, index + nextCodePointLen(doc.spacers, index) || 1);\n if ((key === 'ArrowUp' || key === 'ArrowDown') && box?.inner) {\n const caret = caretFromIndex(box.inner, index);\n const y = caret.y + (key === 'ArrowDown' ? caret.h + 1 : -1);\n index = hitTestIndex(box.inner, caret.x, y);\n }\n this.fragSel = extend ? { ...this.fragSel, focus: index } : collapsedSel(index);\n this.afterCaretMove();\n }\n\n private stackTop(): { id: string; mode: 'selected' | 'editing' } | null {\n return this.vblockStack[this.vblockStack.length - 1] ?? null;\n }\n\n private selectedVblock(): VirtualBlock | null {\n const top = this.stackTop();\n if (!top || top.mode !== 'selected') return null;\n return this.doc.blockById(top.id);\n }\n\n private selectedRegion(): VirtualBlock | null {\n const block = this.selectedVblock();\n return block?.kind === 'region' ? block : null;\n }\n\n private editingSlot(): VirtualBlock | null {\n const top = this.stackTop();\n if (!top || top.mode !== 'editing') return null;\n const block = this.doc.blockById(top.id);\n return block?.kind === 'slot' ? block : null;\n }\n\n private editingSlotIn(doc: DocumentModel): VirtualBlock | null {\n const top = this.stackTop();\n if (!top || top.mode !== 'editing') return null;\n const block = doc.blockById(top.id);\n return block?.kind === 'slot' ? block : null;\n }\n\n private selectionCoversSlot(ctx: OperationContext, slot: VirtualBlock): boolean {\n const sel = ctx.selection();\n return !isCollapsed(sel) && selStart(sel) <= slot.start && selEnd(sel) >= slot.end;\n }\n\n /** 选中槽、整槽选区、或空槽编辑:下一次写入应 fillSlot,不要先 clear 再插。 */\n private slotToFill(ctx: OperationContext): VirtualBlock | null {\n if (this.selectedRegion()) return null;\n const selected = ctx.doc.blockById(this.selectedVblock()?.id ?? '');\n if (this.stackTop()?.mode === 'selected' && selected?.kind === 'slot') return selected;\n const slot = this.editingSlotIn(ctx.doc);\n if (!slot) return null;\n if (slot.empty || this.selectionCoversSlot(ctx, slot)) return slot;\n return null;\n }\n\n private selectVblock(id: string, mode: 'selected' | 'editing') {\n const block = this.doc.blockById(id);\n if (!block) return;\n const chain: { id: string; mode: 'selected' | 'editing' }[] = [];\n const ids: string[] = [];\n let cur: VirtualBlock | null = block;\n const seen = new Set<string>();\n while (cur && !seen.has(cur.id)) {\n seen.add(cur.id);\n ids.unshift(cur.id);\n cur = cur.parentId ? this.doc.blockById(cur.parentId) : null;\n }\n for (let i = 0; i < ids.length; i++) {\n const last = i === ids.length - 1;\n chain.push({ id: ids[i], mode: last ? mode : 'selected' });\n }\n this.vblockStack = chain;\n if (mode === 'editing') {\n const i = Math.min(Math.max(this.sel.focus, block.start), block.end);\n this.setSel(collapsedSel(i));\n } else {\n this.setSel({ anchor: block.start, focus: block.end });\n }\n this.paintChrome();\n this.syncToolbar();\n this.syncStatus();\n }\n\n private popVblock() {\n const top = this.stackTop();\n if (!top) return;\n if (top.mode === 'editing') {\n this.selectVblock(top.id, 'selected');\n return;\n }\n this.vblockStack = this.vblockStack.slice(0, -1);\n const parent = this.stackTop();\n if (parent) {\n const block = this.doc.blockById(parent.id);\n if (block) this.setSel({ anchor: block.start, focus: block.end });\n } else {\n const block = this.doc.blockById(top.id);\n this.setSel(collapsedSel(block?.start ?? this.sel.anchor));\n }\n this.afterCaretMove();\n }\n\n private enterSelectedVblock(): boolean {\n const top = this.stackTop();\n const block = top ? this.doc.blockById(top.id) : null;\n if (!top || top.mode !== 'selected' || !block) return false;\n const children = this.doc\n .listVirtualBlocks()\n .filter((b) => b.parentId === block.id)\n .sort((a, b) => a.start - b.start);\n if (block.kind === 'slot') {\n this.selectVblock(block.id, 'editing');\n return true;\n }\n if (children[0]) {\n this.selectVblock(children[0].id, 'selected');\n return true;\n }\n return true;\n }\n\n private handleVblockBackspace(dir: 'backward' | 'forward'): boolean {\n const selected = this.selectedVblock();\n const top = this.stackTop();\n if (top?.mode === 'selected' && selected) {\n if (selected.kind === 'slot') {\n this.runEdit('delete.backward', (ctx) => {\n ops.clearSlot(selected.id)(ctx);\n const next = ctx.doc.blockById(selected.id);\n if (next) ctx.select({ anchor: next.start, focus: next.end });\n });\n return true;\n }\n return true;\n }\n const editing = this.editingSlot();\n if (!editing) return false;\n if (editing.empty) {\n this.selectVblock(editing.id, 'selected');\n return true;\n }\n const sel = this.targetSel();\n if (!isCollapsed(sel)) return false;\n const i = sel.focus;\n if (dir === 'backward' && i <= editing.start) {\n this.selectVblock(editing.id, 'selected');\n return true;\n }\n if (dir === 'forward' && i >= editing.end) {\n this.selectVblock(editing.id, 'selected');\n return true;\n }\n const from = dir === 'backward' ? i - prevCodePointLen(this.doc.spacers, i) : i;\n const to = dir === 'backward' ? i : i + nextCodePointLen(this.doc.spacers, i);\n if (from >= editing.start && to <= editing.end && editing.end - editing.start - (to - from) <= 0) {\n this.runEdit('delete.backward', (ctx) => {\n ops.clearSlot(editing.id)(ctx);\n const next = ctx.doc.blockById(editing.id);\n ctx.select(collapsedSel(next?.start ?? editing.start));\n });\n return true;\n }\n return false;\n }\n\n private moveAcrossVblock(dir: 1 | -1): Selection | null {\n const top = this.stackTop();\n const editing = this.editingSlot();\n if (editing) {\n const i = this.sel.focus;\n if (dir < 0 && isCollapsed(this.sel) && i <= editing.start) {\n this.selectVblock(editing.id, 'selected');\n return this.sel;\n }\n if (dir > 0 && isCollapsed(this.sel) && i >= editing.end) {\n this.selectVblock(editing.id, 'selected');\n return this.sel;\n }\n return null;\n }\n if (top?.mode === 'selected') {\n const block = this.doc.blockById(top.id);\n if (!block) return null;\n const children = this.doc\n .listVirtualBlocks()\n .filter((b) => b.parentId === block.id)\n .sort((a, b) => a.start - b.start);\n const inward = children.length > 0;\n if (inward) {\n const child = dir > 0 ? children[0] : children[children.length - 1];\n this.selectVblock(child.id, 'selected');\n return this.sel;\n }\n this.vblockStack = this.vblockStack.slice(0, -1);\n const parent = this.stackTop();\n if (parent) {\n const pb = this.doc.blockById(parent.id);\n if (pb) {\n this.setSel({ anchor: pb.start, focus: pb.end });\n return this.sel;\n }\n }\n return collapsedSel(dir > 0 ? block.end : block.start);\n }\n if (!isCollapsed(this.sel)) return null;\n const i = this.sel.focus;\n const hit =\n dir > 0\n ? this.outermostStartingAt(i)\n : this.outermostEndingAt(i);\n if (!hit) return null;\n this.selectVblock(hit.id, 'selected');\n return this.sel;\n }\n\n private outermostStartingAt(index: number): VirtualBlock | null {\n const hits = this.doc.listVirtualBlocks().filter((b) => b.start === index);\n return hits[0] ?? null;\n }\n\n private outermostEndingAt(index: number): VirtualBlock | null {\n const hits = this.doc.listVirtualBlocks().filter((b) => b.end === index);\n return hits[0] ?? null;\n }\n\n private hitVblockClick(index: number): boolean {\n const slot = this.doc.innermostSlotAt(index);\n if (slot) {\n this.selectVblock(slot.id, 'editing');\n this.setSel(collapsedSel(Math.min(Math.max(index, slot.start), slot.end)));\n this.paintChrome();\n this.syncToolbar();\n this.syncStatus();\n return true;\n }\n const chain = this.doc.blocksAt(index);\n const inner = chain[chain.length - 1];\n if (inner) {\n this.selectVblock(inner.id, 'selected');\n return true;\n }\n return false;\n }\n\n private snapIndexForDrag(anchor: number, focus: number): number {\n const editing = this.editingSlot();\n if (editing) return Math.min(editing.end, Math.max(editing.start, focus));\n const from = Math.min(anchor, focus);\n const to = Math.max(anchor, focus);\n if (to === from) return focus;\n const intersecting = this.doc.listVirtualBlocks().filter((b) => b.start < to && b.end > from);\n if (!intersecting.length) return focus;\n const ids = new Set(intersecting.map((b) => b.id));\n let common: VirtualBlock | null = null;\n for (const b of intersecting) {\n let p = b.parentId ? this.doc.blockById(b.parentId) : null;\n while (p && !ids.has(p.id)) p = p.parentId ? this.doc.blockById(p.parentId) : null;\n if (p && ids.has(p.id)) {\n if (!common || p.end - p.start > common.end - common.start) common = p;\n }\n }\n if (common) return focus >= anchor ? common.end : common.start;\n let snapped = focus;\n for (const b of intersecting) {\n if (!b.parentId || !ids.has(b.parentId)) {\n if (focus >= anchor) snapped = Math.max(snapped, b.end);\n else snapped = Math.min(snapped, b.start);\n }\n }\n return snapped;\n }\n\n private selectionPaintRects() {\n const top = this.stackTop();\n if (top?.mode === 'selected') {\n const outlines: { x: number; y: number; w: number; h: number; outline: true; radius: number }[] = [];\n for (const line of this.layout.lines) {\n for (const vb of line.vblocks ?? []) {\n if (vb.id !== top.id) continue;\n outlines.push({\n x: vb.x,\n y: vb.y,\n w: vb.w,\n h: vb.h,\n outline: true,\n radius: vb.chrome.radius ?? (vb.kind === 'slot' ? 4 : 6)\n });\n }\n }\n return outlines;\n }\n if (this.editingSlot()) return selectionRects(this.layout, this.sel);\n return selectionRects(this.layout, this.snapSelIfNeeded(this.sel));\n }\n\n private snapSelIfNeeded(sel: Selection): Selection {\n if (this.stackTop() || isCollapsed(sel)) return sel;\n const from = selStart(sel);\n const to = selEnd(sel);\n const intersecting = this.doc.listVirtualBlocks().filter((b) => b.start < to && b.end > from && (from > b.start || to < b.end));\n if (!intersecting.length) return sel;\n let start = from;\n let end = to;\n for (const b of intersecting) {\n start = Math.min(start, b.start);\n end = Math.max(end, b.end);\n }\n if (sel.anchor <= sel.focus) return { anchor: start, focus: end };\n return { anchor: end, focus: start };\n }\n\n /** 对照常见 Docs 行为:先选中嵌入块,再按同一方向才跳过。 */\n private moveAcrossEmbed(dir: 1 | -1): Selection | null {\n const embed = this.selectedImage();\n if (embed) {\n return collapsedSel(dir < 0 ? embed.index : embed.index + 1);\n }\n if (!isCollapsed(this.sel)) return null;\n const i = this.sel.focus;\n if (dir > 0 && this.doc.spacers[i] === MARKERS.IMAGE) {\n return { anchor: i, focus: i + 1 };\n }\n if (dir < 0 && i > 0 && this.doc.spacers[i - 1] === MARKERS.IMAGE) {\n return { anchor: i, focus: i - 1 };\n }\n return null;\n }\n\n private setSel(next: Selection) {\n const moved = next.anchor !== this.sel.anchor || next.focus !== this.sel.focus;\n this.sel = next;\n if (moved) this.typingStyle = null;\n }\n\n private afterCaretMove() {\n this.typingStyle = null;\n this.keepTypingOnNextClick = false;\n // 用户主动挪了光标,下一次输入不该并进上一批:撤销时应该分开退。\n this.undoStack.resetBatching();\n this.resetBlink();\n this.paintChrome();\n this.syncToolbar();\n this.syncStatus();\n this.scrollCaret();\n }\n\n private stepIndex(index: number, dir: 1 | -1): number {\n let i = index;\n for (let n = 0; n < 8; n++) {\n if (dir < 0) {\n if (i <= 0) return 0;\n i -= prevCodePointLen(this.doc.spacers, i);\n } else {\n if (i >= this.doc.length) return this.doc.length;\n i += nextCodePointLen(this.doc.spacers, i);\n }\n const ch = this.doc.spacers[dir < 0 ? i : i - 1];\n if (!ch || ch === MARKERS.PARAGRAPH || ch === MARKERS.IMAGE || !isStructural(ch)) return i;\n if (dir < 0 && i === 0) return 0;\n }\n return i;\n }\n\n private verticalMove(index: number, dir: 1 | -1): number {\n const caret = caretFromIndex(this.layout, index);\n const lines = this.layout.lines;\n const idx = lines.findIndex((l) => index >= l.start && index <= l.end);\n const cur = idx >= 0 ? idx : 0;\n const next = Math.max(0, Math.min(lines.length - 1, cur + dir));\n return hitTestIndex(this.layout, caret.x, lines[next].y + 1);\n }\n}\n\n/** canvas 能解析的颜色才可比;var() 非法时不相等,避免误伤。 */\nfunction cssColorsEqual(a: string, b: string): boolean {\n if (a === b) return true;\n const ctx = typeof document === 'undefined' ? null : document.createElement('canvas').getContext('2d');\n if (!ctx) return false;\n ctx.fillStyle = '#000000';\n ctx.fillStyle = a;\n const left = ctx.fillStyle;\n ctx.fillStyle = '#000000';\n ctx.fillStyle = b;\n const right = ctx.fillStyle;\n if (left === '#000000' && a.trim() !== '#000000' && a.trim() !== '#000' && a.trim().toLowerCase() !== 'black' && a.trim() !== 'rgb(0, 0, 0)') {\n return false;\n }\n return left === right;\n}\n\nfunction isStructural(ch: string): boolean {\n return ch === MARKERS.PARAGRAPH || ch === MARKERS.TABLE_START || ch === MARKERS.TABLE_END || ch === MARKERS.TABLE_ROW || ch === MARKERS.TABLE_CELL;\n}\n\nfunction fakePlainClipboard(text: string): DataTransfer {\n const data = new DataTransfer();\n data.setData('text/plain', text);\n return data;\n}\n\nfunction sliceToHtml(slice: Slice): string {\n const esc = (s: string) => s.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');\n return `<p>${esc(slice.text.replace(/[\\n\\u0010\\u0011\\u0012\\u001c\\u0007]/g, ' '))}</p>`;\n}\n\nfunction openSafeUrl(url: string): boolean {\n let href = url.trim();\n if (/^www\\./i.test(href)) href = `https://${href}`;\n try {\n const parsed = new URL(href);\n if (parsed.protocol !== 'http:' && parsed.protocol !== 'https:') return false;\n window.open(parsed.href, '_blank', 'noopener,noreferrer');\n return true;\n } catch {\n return false;\n }\n}\n\n"],"names":["CODE_LANGUAGES","BAR_H","LINE_H","PAD","measureCode","entity","contentWidth","lines","codePlugin","box","root","bar","sel","lang","opt","input","emitEmbedChange","el","ctx","imagePlugin","node","img","imageOf","src","MARKERS","isTableMarker","ch","prevCodePointLen","text","index","c","p","nextCodePointLen","parseBlocks","spacers","blocks","i","table","parseTable","j","start","rows","rowMarker","cells","cellMarker","paragraphs","paraStart","end","findTableAt","block","isEmptyParagraph","para","isVisuallyEmptyDoc","doc","props","findParagraphAt","clamped","row","cell","paragraphsIntersecting","from","to","out","uniqueRanges","ranges","seen","r","k","cellAt","nearestSafeIndex","cellContentRange","_a","isLastTableCell","hit","lastRow","lastCol","nextCellIndex","dir","here","col","target","expandRangeOverStructures","slice","emptyTableSpacers","cols","s","LINK_COLOR","VIDEO_ASPECT","selStart","selEnd","isCollapsed","DEFAULT_TEXT","DEFAULT_PARAGRAPH","MAX_LIST_INDENT","HEADING_TEXT","hasTextProps","textPropsEqual","a","b","underlineKind","style","cloneStyle","span","cloneEntity","cloneVirtualBlock","chromeTextProps","chrome","shiftVirtualBlocksOnInsert","len","shiftVirtualBlocksOnDelete","rangesOverlap","rangesCross","rangeContains","depthOf","byId","d","id","parent","sortOuterToInner","map","la","lb","ancestorChain","chain","cur","clipVirtualBlocks","hits","ids","FONT_FAMILY","LINE_HEIGHT","PAGE_CONTENT_WIDTH","PAGE_PADDING_X","PAGE_PADDING_Y","LIST_MARKER_WIDTH","INDENT_STEP","CELL_PAD","MIN_COL_WIDTH","COL_BORDER_HIT","widthCache","localeReady","ensureLocale","setLocale","fontFamilyOf","raw","resolveFont","canvasFont","font","measureWidth","key","prepared","prepareWithSegments","w","measureNaturalWidth","lineHeightOf","REF_PAD","REF_HEAD","refInnerWidth","boxW","chromeFallback","t","inner","innermostEmptySlot","resolvedTextStyle","heading","link","href","_b","_c","_d","HOST_FALLBACK_W","HOST_FALLBACK_H","embedLayoutSize","maxWidth","host","width","height","embedOccupiesLine","preparedCache","preparedFor","collectRuns","runs","n","ns","fitPrefix","lo","hi","best","mid","wrapParagraph","items","lineW","lineStart","flush","lineEnd","run","isolated","rest","restIndex","restPrepared","remain","widthForLine","line","layoutNextLine","bandSlot","contentX","contentW","bandTop","bandH","obstacles","gap","left","right","f","cursorIndex","fallback","createWrapCursor","skipFloats","wrapCursorDone","wrapCursorIndex","wrapCursorPeek","wrapCursorSkip","consumeWrapLine","UL_MARKERS","listMarkerText","olIndex","layoutParagraph","x","y","indent","markerText","markerW","align","floats","allObstacles","useFlow","paragraphHasFloat","lineY","peek","side","size","fx","slot","buildLine","wrapped","nextOl","counter","maxW","markerX","contentH","item","emptyStyle","dx","glyphs","images","caretStops","cx","local","marker","vblockFragments","lineH","sorted","boxes","g","im","top","bottom","padX","padY","layoutTable","stored","even","hasStored","colWidths","_","sum","cy","rowCells","maxH","innerW","paras","py","ol","pl","h","fragmentFingerprint","fragmentId","fragment","hostFingerprint","mediaFingerprint","parts","e","StyleIndex","spans","__publicField","running","types","INLINE_STYLES","hashParagraph","styles","floatKey","vblockFingerprint","hashTable","floatBoxes","paragraphBottom","moveParagraph","dy","di","l","v","moveTable","stats","layoutDocument","prev","insets","depth","contentY","tables","topOl","activeFloats","dirtyTop","dirtyBottom","markDirty","styleIndex","prevByHash","hash","cached","now","old","dirty","attachRefInners","model","caretFromIndex","layout","bestLine","bestX","bestIndex","bestDist","exact","stop","dist","earlier","later","hitTestIndex","localX","localY","closestCaretOnLines","bestScore","inY","inX","score","selectionRects","cellRects","cellGridRects","rects","stops","rightCandidates","x0","x1","punchEmbeds","next","overlapY","overlapX","imageBoxAt","r0","r1","c0","c1","hitColBorder","fillOf","rainbowAt","sunsetAt","cssFill","runWidth","fill","canvasFill","glyphIndex","runT","paintCanvasUnderline","kind","color","amp","step","px","up","paintCanvasStrike","groupDecorationRuns","strike","baseline","REF_JUMP","innerUsedSize","measureRef","emptyInner","used","countLabel","paintInner","renderInnerLine","hole","pic","wrap","innerCss","deco","runW","weight","italic","refPlugin","badge","body","paintChip","decorateRefEl","count","title","editing","selected","DEFAULT_SELECT_OPTIONS","FILLED_IMAGE","ICONS","defaultSlotLabel","slotKindOf","slotOptionsOf","slotPlaceholder","slotCaption","slotFilled","measureSlot","label","textW","extra","closeMenus","except","menu","openSelectMenu","name","btn","clear","onDoc","slotEntities","filled","imageFilled","icon","thumb","slotPlugin","file","current","entityId","leaveEdit","startTextEdit","commitText","value","cancelText","activate","EMBED_EXIT_EDIT","applyVideo","videoPlugin","renderer","setHostEmbedRenderer","FALLBACK_SIZE","handles","handlesById","emitMeasure","detail","EMBED_MEASURE","observeSize","rec","ro","syncHostSelected","selectedId","syncRecSelected","contextOf","patch","commit","EMBED_COMMIT","EMBED_CHANGE","mountInto","handle","hostEmbedPlugin","activateHostEmbed","req","destroyHostEmbed","plugins","registerEmbed","plugin","embedPlugin","syncEmbedLayer","cache","canvas","placeEmbed","builtinEmbedPlugins","insertSpacers","insertBeforeIndex","NULL_MUTATION","deleteSpacers","startIndex","endIndex","applyStyle","styleType","addEntity","updateEntity","deleteEntity","addFragment","deleteFragment","addVirtualBlock","deleteVirtualBlock","blockId","updateVirtualBlock","scoped","multi","unwrap","m","commands","flat","mutation","reverse","mutations","appliers","applyMutation","applyMutations","cloneFragment","cloneSlice","previewTitle","max","normalizeFragmentSlice","sliceHasContent","STYLE_TYPES","restoreStyles","type","inverters","_doc","restoredBlocks","before","invertMutation","newRange","min","range","rangeEquals","shiftIndex","shiftPosition","offset","shiftIndexExclusive","shiftRange","leadingLength","position","leadEnd","transformCoordinateAgainstDeletedRange","deleted","transformRangeAgainstDeletedRange","newStart","endpointDeleted","newEnd","insertAgainstInsert","cmd","other","aWins","insertAgainstDelete","length","deleteAgainstInsert","shifted","copyWithRange","deleteAgainstDelete","removed","styleAgainstInsert","copyStyleWithRange","styleAgainstDelete","transformers","transform","o","transformBoth","others","transformIndex","shiftedByInserts","transformSelection","MERGEABLE_KINDS","mergeKeyFor","scope","editMeta","init","editResult","flatten","isEmptyEdit","mergeEdits","first","second","invertEdit","Collector","selection","one","scopeContext","outer","runOperation","op","result","resolveTextProps","resolveParagraphProps","rangeIsOnlyMarkers","contentRuns","base","runStart","content","textSegments","points","existing","spanCovering","expectedParagraphSpans","inherit","EMPTY_SLICE","emitInsert","emitDelete","emitStyle","emitTextStyle","seg","normalizeParagraphs","needed","needKeys","curKeys","differing","guard","grew","ensureParagraphAfter","applyTextStyle","applyLink","url","clearFrom","clearTo","removeLink","applyParagraphStyle","RULES","lastMatch","reg","matchMarkdown","paraText","rule","full","matchStart","matchEnd","shouldTryMarkdown","inserted","entitySeq","fragmentSeq","virtualBlockSeq","nextEntityId","nextFragmentId","nextVirtualBlockId","DocumentModel","initial","shiftStylesOnInsert","shiftStylesOnDelete","kept","snap","entities","fragmentIds","fragments","virtualBlocks","probe","normalized","documentFromSlice","sliceFromDocument","inside","ending","ensure","merged","last","collapsedSel","sliceWithoutParagraphGroup","groupId","keep","insertImage","updateImage","blockMap","validateInsert","inferParentId","selfId","insertVirtualBlock","spec","parentId","placeholder","empty","child","removeVirtualBlock","updateVirtualBlockChrome","restoreChain","snaps","targetId","nextStart","nextEnd","isTarget","clearSlot","slotInlineText","fillSlot","safe","coverAncestorsOf","pid","coverVirtualBlocks","remapIncomingVirtualBlocks","occupied","idMap","remapped","isLastParagraphWithGroupId","splitParagraphSpans","cursor","insertText","insertParagraph","oldProps","inList","paraEndContent","atStart","atEnd","exitGroup","leftProps","rightProps","deleteRange","expanded","backspace","prevProps","deleteForward","applyMarkdownShortcut","caret","restyleParagraph","consume","tableSpan","writeColWidths","tableStart","tableEnd","widths","insertTable","insertTableRow","insertTableCol","inserts","at","deleteTableRow","deleteTableCol","setTableColWidths","looksLikeMarkdown","parseInline","re","blockProps","ul","markdownToSlice","emitPara","tokens","tok","emitEmbed","fence","buf","oneLineMath","materializeSlice","lookup","scratch","source","insertSlice","asCopy","incoming","nested","remap","insertMarkdown","paraEnd","cut","pasteText","promoteRange","insertRef","unlinkRef","runScoped","runEdit","meta","UNDO_BATCH_MS","UndoRedoStack","edit","withinWindow","sameRun","undoStep","intervening","pair","forward","remote","ImeSurface","handler","arrow","SHORTCUTS","swallow","INPUT_SHORTCUTS","inputShortcuts","submit","submitUsesShift","matches","sc","stroke","findShortcut","IME_PASSTHROUGH","strokeOf","bindKeyboard","onKeyDown","SLICE_MIME","serializeSlice","parseSlice","data","sliceFromClipboard","CanvasPainter","band","visible","trails","dpr","resized","editorRoot","family","markerTop","vb","cs","radius","rainbow","grad","alpha","solid","caretW","editorCs","glow","metrics","ascent","descent","fontH","cssText","HtmlPainter","renderTableChrome","renderLine","placeCaret","fade","renderVBlock","border","Editor","options","indices","pos","after","ops.updateImage","refBox","interactive","openSafeUrl","ratio","focus","ops.setTableColWidths","startW","startH","level","delta","hostType","opts","extend","active","mode","prevColor","nextColor","match","cssColorsEqual","computed","selColor","selRadius","cssFamily","ops.slotInlineText","ops.fillSlot","ops.insertSlice","ops.insertVirtualBlock","ops.updateVirtualBlockChrome","ops.removeVirtualBlock","ops.applyParagraphStyle","pred","ops.deleteRange","patchFor","patches","clientX","clientY","embed","canPromote","event","disabled","avail","selectionAfter","revert","settle","ops.clearSlot","minStart","maxEnd","ops.emitDelete","ops.emitInsert","ops.normalizeParagraphs","anchor","covers","ops.insertText","selectedNow","ops.applyMarkdownShortcut","fakePlainClipboard","payload","ops.pasteText","explicit","pending","fromHeading","ops.insertParagraph","toHeading","res","ops.backspace","ops.deleteForward","ops.applyTextStyle","on","ops.applyLink","ops.removeLink","sized","ops.insertImage","slotKind","ops.promoteRange","picked","ops.insertRef","ops.unlinkRef","nw","nh","w0","h0","scale","video","ops.insertTable","ops.insertTableRow","ops.insertTableCol","ops.deleteTableRow","ops.deleteTableCol","origin","composing","show","opacity","mapped","demoCaret","showCaret","imeH","anchorPos","imeY","composeW","underlineH","idx","tick","rect","isSlot","isRef","isHost","sliceToHtml","startX","w1","vnext","children","pb","intersecting","common","snapped","outlines","moved","isStructural","parsed"],"mappings":"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"}