@coco-vexel/coco-office-editor 0.0.0-stage → 1.0.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 (57) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +510 -2
  3. package/THIRD_PARTY_NOTICES.md +212 -0
  4. package/dist/index.cjs +26401 -0
  5. package/dist/index.cjs.map +1 -0
  6. package/dist/index.d.cts +12 -0
  7. package/dist/index.d.ts +12 -0
  8. package/dist/index.js +26192 -0
  9. package/dist/index.js.map +1 -0
  10. package/dist/model-DB6aN6uJ.d.cts +321 -0
  11. package/dist/model-DB6aN6uJ.d.ts +321 -0
  12. package/dist/native-B6B649CC.d.ts +1111 -0
  13. package/dist/native-Ct9nN06K.d.cts +1111 -0
  14. package/dist/ppt-native.cjs +5334 -0
  15. package/dist/ppt-native.cjs.map +1 -0
  16. package/dist/ppt-native.d.cts +2 -0
  17. package/dist/ppt-native.d.ts +2 -0
  18. package/dist/ppt-native.js +5332 -0
  19. package/dist/ppt-native.js.map +1 -0
  20. package/dist/ppt.cjs +5426 -0
  21. package/dist/ppt.cjs.map +1 -0
  22. package/dist/ppt.d.cts +306 -0
  23. package/dist/ppt.d.ts +306 -0
  24. package/dist/ppt.js +5410 -0
  25. package/dist/ppt.js.map +1 -0
  26. package/dist/spreadsheet.cjs +4276 -0
  27. package/dist/spreadsheet.cjs.map +1 -0
  28. package/dist/spreadsheet.d.cts +676 -0
  29. package/dist/spreadsheet.d.ts +676 -0
  30. package/dist/spreadsheet.js +4213 -0
  31. package/dist/spreadsheet.js.map +1 -0
  32. package/dist/word-editing.cjs +812 -0
  33. package/dist/word-editing.cjs.map +1 -0
  34. package/dist/word-editing.d.cts +149 -0
  35. package/dist/word-editing.d.ts +149 -0
  36. package/dist/word-editing.js +803 -0
  37. package/dist/word-editing.js.map +1 -0
  38. package/dist/word-native.cjs +13400 -0
  39. package/dist/word-native.cjs.map +1 -0
  40. package/dist/word-native.d.cts +4 -0
  41. package/dist/word-native.d.ts +4 -0
  42. package/dist/word-native.js +13293 -0
  43. package/dist/word-native.js.map +1 -0
  44. package/dist/word-prosemirror.cjs +489 -0
  45. package/dist/word-prosemirror.cjs.map +1 -0
  46. package/dist/word-prosemirror.d.cts +21 -0
  47. package/dist/word-prosemirror.d.ts +21 -0
  48. package/dist/word-prosemirror.js +483 -0
  49. package/dist/word-prosemirror.js.map +1 -0
  50. package/dist/word.cjs +16764 -0
  51. package/dist/word.cjs.map +1 -0
  52. package/dist/word.d.cts +84 -0
  53. package/dist/word.d.ts +84 -0
  54. package/dist/word.js +16632 -0
  55. package/dist/word.js.map +1 -0
  56. package/package.json +106 -3
  57. package/src/styles/editor.css +1507 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/word/prosemirror.ts","../src/word/editing.ts"],"names":["PluginKey","Plugin"],"mappings":"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","file":"word-editing.js","sourcesContent":["import { Schema, type Node as ProseMirrorNode } from 'prosemirror-model';\nimport { baseKeymap } from 'prosemirror-commands';\nimport { keymap } from 'prosemirror-keymap';\nimport { EditorState, Plugin, PluginKey } from 'prosemirror-state';\nimport { Decoration, DecorationSet } from 'prosemirror-view';\nimport type {\n EditorBlockView,\n EditorDocumentView,\n EditorParagraphFormat,\n EditorParagraphView,\n EditorRunFormat,\n EditorTableCellView,\n EditorTableView,\n} from './model.js';\n\nexport interface WordProjection {\n doc: ProseMirrorNode;\n decorations: DecorationSet;\n paragraphContentPos: Map<string, number>;\n}\n\nexport interface CreateWordEditorStateOptions {\n plugins?: Plugin[];\n}\n\nexport const wordEditorSchema = new Schema({\n nodes: {\n doc: { content: 'block+' },\n paragraph: {\n group: 'block',\n content: 'inline*',\n attrs: {\n paraId: { default: '' },\n story: { default: 'body' },\n styleId: { default: null },\n format: { default: null },\n },\n parseDOM: [{ tag: 'p' }],\n toDOM: (node) => ['p', paragraphDomAttrs(node.attrs), 0],\n },\n table: {\n group: 'block',\n content: 'table_row+',\n attrs: {\n tableId: { default: '' },\n columnWidths: { default: null },\n },\n tableRole: 'table',\n toDOM: (node) => [\n 'div',\n { class: 'coco-word-table-scroll' },\n ['table', tableDomAttrs(node.attrs), ['tbody', 0]],\n ],\n },\n table_row: {\n content: 'table_cell+',\n tableRole: 'row',\n toDOM: () => ['tr', 0],\n },\n table_cell: {\n content: 'block+',\n attrs: {\n colspan: { default: 1 },\n rowspan: { default: 1 },\n width: { default: null },\n shading: { default: null },\n verticalAlignment: { default: null },\n },\n tableRole: 'cell',\n toDOM: (node) => ['td', tableCellDomAttrs(node.attrs), 0],\n },\n image: {\n inline: true,\n group: 'inline',\n atom: true,\n attrs: {\n src: {},\n alt: { default: '' },\n width: { default: null },\n height: { default: null },\n drawingId: { default: null },\n },\n toDOM: (node) => ['img', imageDomAttrs(node.attrs)],\n },\n text: { group: 'inline' },\n },\n marks: {\n strong: {\n parseDOM: [{ tag: 'strong' }, { tag: 'b' }],\n toDOM: () => ['strong', 0],\n },\n em: {\n parseDOM: [{ tag: 'em' }, { tag: 'i' }],\n toDOM: () => ['em', 0],\n },\n underline: {\n parseDOM: [{ tag: 'u' }],\n toDOM: () => ['u', 0],\n },\n textStyle: {\n attrs: {\n color: { default: null },\n fontSize: { default: null },\n },\n parseDOM: [{ tag: 'span' }],\n toDOM: (mark) => ['span', textStyleDomAttrs(mark.attrs), 0],\n },\n },\n});\n\nexport const wordDecorationsKey = new PluginKey<DecorationSet>('coco-word-decorations');\nexport const wordStructureNormalizationKey = new PluginKey('coco-word-structure-normalization');\n\nexport function createWordEditorState(\n view: EditorDocumentView,\n options: CreateWordEditorStateOptions = {},\n): EditorState {\n const projection = projectWordViewToProseMirror(view);\n return EditorState.create({\n schema: wordEditorSchema,\n doc: projection.doc,\n plugins: [\n createWordDecorationsPlugin(projection.decorations),\n keymap(baseKeymap),\n createWordStructureNormalizationPlugin(),\n ...(options.plugins ?? []),\n ],\n });\n}\n\nexport function projectWordViewToProseMirror(view: EditorDocumentView): WordProjection {\n const paragraphContentPos = new Map<string, number>();\n const blocks = view.blocks.map((block) => blockToNode(block));\n const doc = wordEditorSchema.nodes.doc.create(null, blocks);\n\n doc.descendants((node, pos) => {\n if (node.type === wordEditorSchema.nodes.paragraph && typeof node.attrs.paraId === 'string') {\n paragraphContentPos.set(node.attrs.paraId, pos + 1);\n }\n });\n\n const decorations: Decoration[] = [];\n for (const paragraph of view.paragraphs) {\n const base = paragraphContentPos.get(paragraph.paraId)!;\n for (const span of paragraph.spans) {\n if (span.to <= span.from) {\n if (span.kind === 'comment') {\n decorations.push(createCommentWidget(base + span.from, span));\n }\n continue;\n }\n const className =\n span.kind === 'comment'\n ? 'coco-word-comment'\n : span.revisionKind === 'delete'\n ? 'coco-word-revision-delete'\n : 'coco-word-revision-insert';\n decorations.push(\n Decoration.inline(\n base + span.from,\n base + span.to,\n {\n class: className,\n ...(span.kind === 'comment' ? commentDomAttrs(span) : {}),\n },\n {\n id: span.id,\n kind: span.kind,\n paraId: paragraph.paraId,\n },\n ),\n );\n }\n }\n\n return {\n doc,\n decorations: DecorationSet.create(doc, decorations),\n paragraphContentPos,\n };\n}\n\nfunction createCommentWidget(pos: number, span: { id: string; commentId: number; body: string }) {\n return Decoration.widget(\n pos,\n () => {\n const marker = document.createElement('span');\n marker.className = 'coco-word-comment-widget';\n marker.dataset.commentId = String(span.commentId);\n marker.title = commentTitle(span);\n marker.textContent = '!';\n return marker;\n },\n {\n id: span.id,\n kind: 'comment',\n side: 1,\n },\n );\n}\n\nfunction commentDomAttrs(span: { commentId: number; body: string }): Record<string, string> {\n return {\n 'data-comment-id': String(span.commentId),\n title: commentTitle(span),\n };\n}\n\nfunction commentTitle(span: { commentId: number; body: string }): string {\n const body = span.body.trim();\n return body.length > 0 ? `Comment ${span.commentId}: ${body}` : `Comment ${span.commentId}`;\n}\n\nfunction blockToNode(block: EditorBlockView): ProseMirrorNode {\n return block.type === 'table' ? tableToNode(block) : paragraphToNode(block);\n}\n\nfunction paragraphToNode(paragraph: EditorParagraphView): ProseMirrorNode {\n return wordEditorSchema.nodes.paragraph.create(\n {\n paraId: paragraph.paraId,\n story: paragraph.story,\n styleId: paragraph.styleId ?? null,\n format: paragraph.format ?? null,\n },\n paragraph.segments.length > 0 ? paragraph.segments.flatMap((segment) => {\n if (segment.kind === 'placeholder') {\n return [wordEditorSchema.text('\\uFFFC')];\n }\n if (segment.kind === 'drawing') {\n return [wordEditorSchema.text(segment.text && segment.text.length > 0 ? segment.text : '\\uFFFC')];\n }\n if (segment.kind === 'field') {\n return [wordEditorSchema.text(segment.cachedText ?? '\\uFFFC', marksForRunFormat(segment.format))];\n }\n if (segment.kind === 'image') {\n return [\n wordEditorSchema.nodes.image.create({\n src: segment.src,\n alt: segment.drawingId,\n width: segment.width ?? null,\n height: segment.height ?? null,\n drawingId: segment.drawingId,\n }),\n ];\n }\n if (segment.text.length === 0) return [];\n const format = segment.kind === 'text' ? segment.format : undefined;\n return [wordEditorSchema.text(segment.text, marksForRunFormat(format))];\n }) : paragraph.text.length > 0 ? wordEditorSchema.text(paragraph.text) : undefined,\n );\n}\n\nfunction tableToNode(table: EditorTableView): ProseMirrorNode {\n return wordEditorSchema.nodes.table.create(\n { tableId: table.tableId, columnWidths: table.columnWidths },\n table.rows.map((row) =>\n wordEditorSchema.nodes.table_row.create(\n null,\n row.cells\n .filter((cell) => cell.vMerge !== 'continue')\n .map((cell) => tableCellToNode(cell)),\n ),\n ),\n );\n}\n\nfunction tableCellToNode(cell: EditorTableCellView): ProseMirrorNode {\n const paragraphs =\n cell.paragraphs.length > 0\n ? cell.paragraphs.map((paragraph) => paragraphToNode(paragraph))\n : [wordEditorSchema.nodes.paragraph.create(null)];\n return wordEditorSchema.nodes.table_cell.create(\n {\n colspan: Math.max(1, cell.gridSpan),\n rowspan: Math.max(1, cell.rowSpan ?? 1),\n width: cell.width ?? null,\n shading: cell.shading ?? null,\n verticalAlignment: cell.verticalAlignment ?? null,\n },\n paragraphs,\n );\n}\n\nfunction marksForRunFormat(format: EditorRunFormat | undefined) {\n if (!format) return undefined;\n const marks = [];\n if (format.bold) marks.push(wordEditorSchema.marks.strong.create());\n if (format.italic) marks.push(wordEditorSchema.marks.em.create());\n if (format.underline) marks.push(wordEditorSchema.marks.underline.create());\n if (format.color || format.fontSize) {\n marks.push(\n wordEditorSchema.marks.textStyle.create({\n color: format.color ?? null,\n fontSize: format.fontSize ?? null,\n }),\n );\n }\n return marks.length > 0 ? marks : undefined;\n}\n\nfunction paragraphDomAttrs(attrs: {\n paraId?: unknown;\n story?: unknown;\n styleId?: unknown;\n format?: unknown;\n}): Record<string, string> {\n const domAttrs: Record<string, string> = {};\n if (typeof attrs.paraId === 'string' && attrs.paraId.length > 0) {\n domAttrs['data-para-id'] = attrs.paraId;\n }\n if (typeof attrs.story === 'string' && attrs.story.length > 0) {\n domAttrs['data-story'] = attrs.story;\n }\n if (typeof attrs.styleId === 'string' && attrs.styleId.length > 0) {\n domAttrs['data-style-id'] = attrs.styleId;\n }\n\n const format = isParagraphFormat(attrs.format) ? attrs.format : null;\n if (format?.outlineLevel !== undefined) {\n domAttrs['data-outline-level'] = String(format.outlineLevel);\n }\n\n const style = paragraphStyle(format);\n if (style.length > 0) domAttrs.style = style;\n return domAttrs;\n}\n\nfunction tableDomAttrs(attrs: { tableId?: unknown; columnWidths?: unknown }): Record<string, string> {\n const domAttrs: Record<string, string> = {};\n if (typeof attrs.tableId === 'string' && attrs.tableId.length > 0) {\n domAttrs['data-table-id'] = attrs.tableId;\n }\n return domAttrs;\n}\n\nfunction tableCellDomAttrs(attrs: {\n colspan?: unknown;\n rowspan?: unknown;\n width?: unknown;\n shading?: unknown;\n verticalAlignment?: unknown;\n}): Record<string, string> {\n const domAttrs: Record<string, string> = {};\n if (typeof attrs.colspan === 'number' && attrs.colspan > 1) {\n domAttrs.colspan = String(attrs.colspan);\n }\n if (typeof attrs.rowspan === 'number' && attrs.rowspan > 1) {\n domAttrs.rowspan = String(attrs.rowspan);\n }\n const style: string[] = [];\n if (typeof attrs.width === 'number' && attrs.width > 0) {\n style.push(`width: ${twipsToPt(attrs.width)}`);\n }\n if (isShading(attrs.shading)) {\n const fill = colorToCss(attrs.shading.fill);\n if (fill) style.push(`background-color: ${fill}`);\n }\n if (typeof attrs.verticalAlignment === 'string') {\n style.push(`vertical-align: ${attrs.verticalAlignment === 'center' ? 'middle' : attrs.verticalAlignment}`);\n }\n if (style.length > 0) domAttrs.style = style.join('; ');\n return domAttrs;\n}\n\nfunction imageDomAttrs(attrs: {\n src?: unknown;\n alt?: unknown;\n width?: unknown;\n height?: unknown;\n drawingId?: unknown;\n}): Record<string, string> {\n const domAttrs: Record<string, string> = {\n src: typeof attrs.src === 'string' ? attrs.src : '',\n alt: typeof attrs.alt === 'string' ? attrs.alt : '',\n };\n if (typeof attrs.drawingId === 'string') domAttrs['data-drawing-id'] = attrs.drawingId;\n const style: string[] = [];\n if (typeof attrs.width === 'number' && attrs.width > 0) {\n style.push(`width: ${attrs.width}px`);\n }\n if (typeof attrs.height === 'number' && attrs.height > 0) {\n style.push(`height: ${attrs.height}px`);\n }\n if (style.length > 0) domAttrs.style = style.join('; ');\n return domAttrs;\n}\n\nfunction isShading(value: unknown): value is { fill?: string } {\n return value !== null && typeof value === 'object';\n}\n\nfunction textStyleDomAttrs(attrs: { color?: unknown; fontSize?: unknown }): Record<string, string> {\n const style: string[] = [];\n const color = typeof attrs.color === 'string' ? colorToCss(attrs.color) : null;\n if (color) style.push(`color: ${color}`);\n if (typeof attrs.fontSize === 'number') style.push(`font-size: ${attrs.fontSize}pt`);\n return style.length > 0 ? { style: style.join('; ') } : {};\n}\n\nfunction isParagraphFormat(value: unknown): value is EditorParagraphFormat {\n return value !== null && typeof value === 'object';\n}\n\nfunction paragraphStyle(format: EditorParagraphFormat | null): string {\n if (!format) return '';\n const declarations: string[] = [];\n\n if (format.alignment) declarations.push(`text-align: ${alignmentToCss(format.alignment)}`);\n if (format.indent?.left !== undefined) declarations.push(`margin-left: ${twipsToPt(format.indent.left)}`);\n if (format.indent?.right !== undefined) declarations.push(`margin-right: ${twipsToPt(format.indent.right)}`);\n if (format.indent?.firstLine !== undefined) {\n declarations.push(`text-indent: ${twipsToPt(format.indent.firstLine)}`);\n }\n if (format.spacing?.before !== undefined) {\n declarations.push(`margin-top: ${twipsToPt(format.spacing.before)}`);\n }\n if (format.spacing?.after !== undefined) {\n declarations.push(`margin-bottom: ${twipsToPt(format.spacing.after)}`);\n }\n const lineHeight = lineHeightToCss(format.spacing?.line, format.spacing?.lineRule);\n if (lineHeight) declarations.push(`line-height: ${lineHeight}`);\n if (format.fontSize !== undefined) declarations.push(`font-size: ${format.fontSize}pt`);\n if (format.bold !== undefined) declarations.push(`font-weight: ${format.bold ? '700' : '400'}`);\n const borderBottom = borderToCss(format.borderBottom);\n if (borderBottom) {\n declarations.push(`border-bottom: ${borderBottom}`);\n declarations.push(`padding-bottom: ${format.borderBottom?.space ?? 4}pt`);\n }\n\n return declarations.join('; ');\n}\n\nfunction alignmentToCss(alignment: NonNullable<EditorParagraphFormat['alignment']>): string {\n if (alignment === 'both' || alignment === 'distribute') return 'justify';\n return alignment;\n}\n\nfunction borderToCss(border: EditorParagraphFormat['borderBottom']): string | null {\n if (!border || border.val === 'none' || border.val === 'nil') return null;\n const color = colorToCss(border.color) ?? '#000000';\n const widthPt = border.size !== undefined ? Math.max(0.75, border.size / 8) : 0.75;\n const style = border.val === 'double' ? 'double' : 'solid';\n return `${widthPt}pt ${style} ${color}`;\n}\n\nfunction lineHeightToCss(\n line: number | undefined,\n lineRule: 'auto' | 'exact' | 'atLeast' | undefined,\n): string | null {\n if (line === undefined) return null;\n if (lineRule === 'exact' || lineRule === 'atLeast') return twipsToPt(line);\n return String(line / 240);\n}\n\nfunction twipsToPt(twips: number): string {\n return `${twips / 20}pt`;\n}\n\nfunction colorToCss(color: string | undefined): string | null {\n if (!color || color === 'auto') return null;\n return /^[0-9a-f]{6}$/i.test(color) ? `#${color}` : null;\n}\n\nfunction createWordDecorationsPlugin(decorations: DecorationSet): Plugin {\n return new Plugin({\n key: wordDecorationsKey,\n state: {\n init: () => decorations,\n apply: (tr, set) => set.map(tr.mapping, tr.doc),\n },\n props: {\n decorations(state) {\n return wordDecorationsKey.getState(state);\n },\n },\n });\n}\n\nfunction createWordStructureNormalizationPlugin(): Plugin {\n return new Plugin({\n key: wordStructureNormalizationKey,\n appendTransaction(transactions, _oldState, newState) {\n if (!transactions.some((tr) => tr.docChanged)) return null;\n if (transactions.some((tr) => tr.getMeta(wordStructureNormalizationKey))) return null;\n\n const seen = new Set<string>();\n let tr = newState.tr;\n let changed = false;\n newState.doc.descendants((node, pos) => {\n if (node.type !== wordEditorSchema.nodes.paragraph) return true;\n const paraId = typeof node.attrs.paraId === 'string' ? node.attrs.paraId : '';\n if (paraId && !seen.has(paraId)) {\n seen.add(paraId);\n return true;\n }\n\n const nextParaId = nextUniqueParaId(seen);\n seen.add(nextParaId);\n tr = tr.setNodeMarkup(pos, undefined, { ...node.attrs, paraId: nextParaId });\n changed = true;\n return true;\n });\n\n return changed ? tr.setMeta(wordStructureNormalizationKey, { normalized: true }) : null;\n },\n });\n}\n\nfunction nextUniqueParaId(seen: Set<string>): string {\n let paraId = '';\n do {\n paraId = Math.floor(Math.random() * 0xffffffff)\n .toString(16)\n .toUpperCase()\n .padStart(8, '0');\n } while (!paraId || seen.has(paraId));\n return paraId;\n}\n","import type { MarkType, Node as ProseMirrorNode } from 'prosemirror-model';\nimport { Plugin, PluginKey, type EditorState, type Transaction } from 'prosemirror-state';\nimport type { EditorView } from 'prosemirror-view';\nimport type { EditorParagraphFormat } from './model.js';\nimport { wordEditorSchema, wordStructureNormalizationKey } from './prosemirror.js';\n\nexport type WordEditMark = 'strong' | 'textStyle';\nexport type WordBlockEditOperation = 'insert' | 'delete' | 'replace' | 'split' | 'merge' | 'move';\nexport type WordAnnotationEditOperation = 'insert' | 'delete' | 'update';\nexport type WordContentEditOperation = 'insert' | 'delete' | 'replace';\nexport type WordRevisionEditOperation = 'insert' | 'delete' | 'accept' | 'reject';\nexport type WordTableEditOperation =\n | 'insertTable'\n | 'deleteTable'\n | 'insertRow'\n | 'deleteRow'\n | 'insertColumn'\n | 'deleteColumn'\n | 'mergeCells'\n | 'splitCell'\n | 'updateCell'\n | 'updateTable';\nexport type WordTextEditOperation = 'insert' | 'delete' | 'replace';\nexport type WordParagraphAlignment = NonNullable<EditorParagraphFormat['alignment']>;\n\nexport type WordChangeStatus = 'captured' | 'planned' | 'exportable';\n\nexport interface WordChangeTarget {\n story: string;\n paraId?: string;\n tableId?: string;\n rowIndex?: number;\n columnIndex?: number;\n cellId?: string;\n annotationId?: string;\n revisionId?: string;\n}\n\nexport interface WordEditorRange {\n from: number;\n to: number;\n}\n\nexport interface WordParagraphRange extends WordEditorRange {\n paraId: string;\n story: string;\n}\n\nexport interface WordParagraphBlockSnapshot {\n kind: 'paragraph';\n paraId: string;\n story: string;\n styleId: string | null;\n text: string;\n content: WordContent[];\n}\n\nexport interface WordTableBlockSnapshot {\n kind: 'table';\n tableId: string;\n text: string;\n}\n\nexport type WordBlockSnapshot = WordParagraphBlockSnapshot | WordTableBlockSnapshot;\n\nexport interface WordImageContent {\n kind: 'image';\n drawingId: string | null;\n alt: string;\n src: string;\n width: number | null;\n height: number | null;\n}\n\nexport interface WordTextContent {\n kind: 'text';\n text: string;\n}\n\nexport type WordContent = WordImageContent | WordTextContent;\n\nexport interface WordSelectedParagraph {\n paraId: string;\n from: number;\n to: number;\n text: string;\n styleId: string | null;\n story: string;\n}\n\nexport interface WordSelectionInfo {\n from: number;\n to: number;\n empty: boolean;\n selectedText: string;\n paragraphs: WordSelectedParagraph[];\n tableCell: {\n depth: number;\n colspan: number;\n rowspan: number;\n } | null;\n}\n\nexport interface WordEditChangeBase {\n from: number;\n to: number;\n paragraphs: WordSelectedParagraph[];\n target: WordChangeTarget;\n status: WordChangeStatus;\n value: unknown;\n}\n\nexport interface WordTextEditChangeDraft extends WordEditChangeBase {\n kind: 'text';\n textOp: WordTextEditOperation;\n text: string;\n deletedText: string;\n}\n\nexport interface WordContentEditChangeDraft extends WordEditChangeBase {\n kind: 'content';\n contentOp: WordContentEditOperation;\n content: WordContent[];\n deletedContent: WordContent[];\n}\n\nexport interface WordMarkEditChangeDraft extends WordEditChangeBase {\n kind: 'mark';\n mark: WordEditMark;\n}\n\nexport interface WordParagraphEditChangeDraft extends WordEditChangeBase {\n kind: 'paragraph';\n attr: 'alignment';\n}\n\nexport interface WordBlockEditChangeDraft extends WordEditChangeBase {\n kind: 'block';\n blockOp: WordBlockEditOperation;\n blocks?: WordBlockSnapshot[];\n deletedBlocks?: WordBlockSnapshot[];\n}\n\nexport interface WordTableEditChangeDraft extends WordEditChangeBase {\n kind: 'table';\n tableOp: WordTableEditOperation;\n tableId?: string;\n}\n\nexport interface WordAnnotationEditChangeDraft extends WordEditChangeBase {\n kind: 'annotation';\n annotationOp: WordAnnotationEditOperation;\n annotationId: string;\n}\n\nexport interface WordRevisionEditChangeDraft extends WordEditChangeBase {\n kind: 'revision';\n revisionOp: WordRevisionEditOperation;\n revisionId?: string;\n}\n\nexport type WordEditChangeDraft =\n | WordTextEditChangeDraft\n | WordContentEditChangeDraft\n | WordMarkEditChangeDraft\n | WordParagraphEditChangeDraft\n | WordBlockEditChangeDraft\n | WordTableEditChangeDraft\n | WordAnnotationEditChangeDraft\n | WordRevisionEditChangeDraft;\n\nexport type WordEditChange = WordEditChangeDraft & {\n id: string;\n createdAt: number;\n};\n\nexport interface WordChangeSet {\n changes: WordEditChange[];\n}\n\nexport interface WordEditingPluginOptions {\n onChangeSet?: (changeSet: WordChangeSet) => void;\n}\n\ninterface WordEditingTransactionMeta {\n changes?: WordEditChange[];\n}\n\nexport const wordEditingPluginKey = new PluginKey<WordChangeSet>('coco-word-editing');\n\nlet changeSequence = 0;\n\nexport function createWordEditingPlugin(options: WordEditingPluginOptions = {}): Plugin<WordChangeSet> {\n return new Plugin<WordChangeSet>({\n key: wordEditingPluginKey,\n appendTransaction(transactions, oldState, newState) {\n if (!transactions.some((tr) => tr.docChanged)) return null;\n if (transactions.every((tr) => tr.getMeta(wordStructureNormalizationKey))) return null;\n const blockChanges = blockChangesFromDocumentDiff(oldState.doc, newState.doc);\n const changes =\n blockChanges.length > 0 ? blockChanges : contentChangesFromDocumentDiff(oldState.doc, newState.doc);\n return changes.length > 0 ? withChanges(newState.tr, changes) : null;\n },\n state: {\n init: () => ({ changes: [] }),\n apply(tr, previous) {\n const meta = tr.getMeta(wordEditingPluginKey) as WordEditingTransactionMeta | undefined;\n if (!meta?.changes?.length) return previous;\n const next = { changes: [...previous.changes, ...meta.changes] };\n options.onChangeSet?.(next);\n return next;\n },\n },\n });\n}\n\nexport function getWordChangeSet(state: EditorState): WordChangeSet {\n return wordEditingPluginKey.getState(state) ?? { changes: [] };\n}\n\nexport function getWordSelectionInfo(state: EditorState): WordSelectionInfo {\n const { from, to, empty } = state.selection;\n const $from = state.selection.$from;\n const cellDepth = findParentDepth($from, 'table_cell');\n const tableCell =\n cellDepth === null\n ? null\n : {\n depth: cellDepth,\n colspan: Number($from.node(cellDepth).attrs.colspan ?? 1),\n rowspan: Number($from.node(cellDepth).attrs.rowspan ?? 1),\n };\n\n return {\n from,\n to,\n empty,\n selectedText: state.doc.textBetween(from, to, '\\n'),\n paragraphs: selectedParagraphs(state, from, to),\n tableCell,\n };\n}\n\nexport function toggleBold(\n state: EditorState,\n dispatch?: (tr: Transaction) => void,\n view?: EditorView,\n): boolean {\n const markType = wordEditorSchema.marks.strong;\n return applySelectionMark(state, dispatch, view, markType, {}, 'strong');\n}\n\nexport function setFontSize(sizePt: number) {\n return (state: EditorState, dispatch?: (tr: Transaction) => void, view?: EditorView): boolean => {\n if (!Number.isFinite(sizePt) || sizePt <= 0) return false;\n return applySelectionMark(state, dispatch, view, wordEditorSchema.marks.textStyle, { fontSize: sizePt }, 'textStyle');\n };\n}\n\nexport function setColor(color: string) {\n return (state: EditorState, dispatch?: (tr: Transaction) => void, view?: EditorView): boolean => {\n const normalized = normalizeHexColor(color);\n if (!normalized) return false;\n return applySelectionMark(state, dispatch, view, wordEditorSchema.marks.textStyle, { color: normalized }, 'textStyle');\n };\n}\n\nexport function setParagraphAlign(alignment: WordParagraphAlignment) {\n return (state: EditorState, dispatch?: (tr: Transaction) => void): boolean => {\n const paragraphs = selectedParagraphs(state, state.selection.from, state.selection.to);\n if (paragraphs.length === 0) return false;\n if (!dispatch) return true;\n\n let tr = state.tr;\n state.doc.nodesBetween(state.selection.from, state.selection.to, (node, pos) => {\n if (node.type !== wordEditorSchema.nodes.paragraph) return true;\n const format = mergeParagraphFormat(node.attrs.format, { alignment });\n tr = tr.setNodeMarkup(pos, undefined, { ...node.attrs, format });\n return false;\n });\n\n tr = withChange(tr, {\n kind: 'paragraph',\n from: state.selection.from,\n to: state.selection.to,\n paragraphs,\n target: changeTargetForParagraphs(paragraphs),\n status: 'captured',\n attr: 'alignment',\n value: alignment,\n });\n dispatch(tr.scrollIntoView());\n return true;\n };\n}\n\nfunction applySelectionMark(\n state: EditorState,\n dispatch: ((tr: Transaction) => void) | undefined,\n view: EditorView | undefined,\n markType: MarkType,\n attrs: Record<string, unknown>,\n mark: WordEditMark,\n): boolean {\n const { from, to, empty } = state.selection;\n if (empty) return false;\n const paragraphs = selectedParagraphs(state, from, to);\n if (paragraphs.length === 0) return false;\n const shouldRemove = mark === 'strong' && rangeHasMark(state.doc, from, to, markType);\n if (!dispatch) return true;\n\n let tr = state.tr;\n if (shouldRemove) {\n tr = tr.removeMark(from, to, markType);\n } else {\n tr = tr.addMark(from, to, markType.create(attrs));\n }\n tr = withChange(tr, {\n kind: 'mark',\n from,\n to,\n paragraphs,\n target: changeTargetForParagraphs(paragraphs),\n status: 'captured',\n mark,\n value: mark === 'strong' ? !shouldRemove : attrs,\n });\n dispatch(tr.scrollIntoView());\n view?.focus();\n return true;\n}\n\nfunction selectedParagraphs(state: EditorState, from: number, to: number): WordSelectedParagraph[] {\n const paragraphs: WordSelectedParagraph[] = [];\n const scanTo = Math.max(to, from + 1);\n state.doc.nodesBetween(from, scanTo, (node, pos) => {\n if (node.type !== wordEditorSchema.nodes.paragraph) return true;\n const contentStart = pos + 1;\n const contentEnd = contentStart + node.content.size;\n paragraphs.push({\n paraId: typeof node.attrs.paraId === 'string' ? node.attrs.paraId : '',\n from: Math.max(from, contentStart) - contentStart,\n to: Math.min(to, contentEnd) - contentStart,\n text: node.textContent,\n styleId: typeof node.attrs.styleId === 'string' ? node.attrs.styleId : null,\n story: typeof node.attrs.story === 'string' ? node.attrs.story : 'body',\n });\n return false;\n });\n return paragraphs;\n}\n\nfunction changeTargetForParagraphs(paragraphs: WordSelectedParagraph[]): WordChangeTarget {\n const paragraph = paragraphs[0];\n return {\n story: paragraph?.story ?? 'body',\n ...(paragraph?.paraId ? { paraId: paragraph.paraId } : {}),\n };\n}\n\nfunction rangeHasMark(doc: ProseMirrorNode, from: number, to: number, markType: MarkType): boolean {\n let found = false;\n doc.nodesBetween(from, to, (node) => {\n if (found || !node.isText) return !found;\n found = markType.isInSet(node.marks) !== undefined;\n return !found;\n });\n return found;\n}\n\nfunction withChange(\n tr: Transaction,\n change: WordEditChangeDraft,\n): Transaction {\n return withChanges(tr, [change]);\n}\n\nfunction withChanges(\n tr: Transaction,\n changesToAdd: WordEditChangeDraft[],\n): Transaction {\n const meta = (tr.getMeta(wordEditingPluginKey) as WordEditingTransactionMeta | undefined) ?? {};\n const changes = meta.changes ?? [];\n return tr.setMeta(wordEditingPluginKey, {\n ...meta,\n changes: [\n ...changes,\n ...changesToAdd.map((change) => ({\n ...change,\n id: `word-edit:${++changeSequence}`,\n createdAt: Date.now(),\n })),\n ],\n });\n}\n\ninterface ParagraphContentUnit {\n key: string;\n content: WordContent;\n}\n\ninterface ParagraphSnapshot {\n paraId: string;\n pos: number;\n text: string;\n content: ParagraphContentUnit[];\n styleId: string | null;\n story: string;\n}\n\ninterface TopLevelBlockSnapshot {\n key: string;\n pos: number;\n size: number;\n block: WordBlockSnapshot;\n}\n\nfunction blockChangesFromDocumentDiff(oldDoc: ProseMirrorNode, newDoc: ProseMirrorNode): WordEditChangeDraft[] {\n const oldBlocks = topLevelBlockSnapshots(oldDoc);\n const newBlocks = topLevelBlockSnapshots(newDoc);\n const split = splitBlockChange(oldBlocks, newBlocks);\n if (split) return [split];\n const merge = mergeBlockChange(oldBlocks, newBlocks);\n if (merge) return [merge];\n const insertOrDelete = insertOrDeleteBlockChange(oldBlocks, newBlocks);\n return insertOrDelete ? [insertOrDelete] : [];\n}\n\nfunction splitBlockChange(\n oldBlocks: TopLevelBlockSnapshot[],\n newBlocks: TopLevelBlockSnapshot[],\n): WordEditChangeDraft | null {\n if (newBlocks.length !== oldBlocks.length + 1) return null;\n for (let index = 0; index < oldBlocks.length; index += 1) {\n if (!blockSequencesEqual(oldBlocks.slice(0, index), newBlocks.slice(0, index))) continue;\n if (!blockSequencesEqual(oldBlocks.slice(index + 1), newBlocks.slice(index + 2))) continue;\n const before = oldBlocks[index]!;\n const first = newBlocks[index]!;\n const second = newBlocks[index + 1]!;\n if (\n before.block.kind !== 'paragraph' ||\n first.block.kind !== 'paragraph' ||\n second.block.kind !== 'paragraph' ||\n first.block.text + second.block.text !== before.block.text\n ) {\n continue;\n }\n\n return {\n kind: 'block',\n blockOp: 'split',\n from: before.pos,\n to: before.pos + before.size,\n paragraphs: blockParagraphs([first, second]),\n target: targetForBlock(before.block),\n status: 'captured',\n blocks: [first.block, second.block],\n deletedBlocks: [before.block],\n value: {\n before: before.block,\n after: [first.block, second.block],\n },\n };\n }\n return null;\n}\n\nfunction mergeBlockChange(\n oldBlocks: TopLevelBlockSnapshot[],\n newBlocks: TopLevelBlockSnapshot[],\n): WordEditChangeDraft | null {\n if (oldBlocks.length !== newBlocks.length + 1) return null;\n for (let index = 0; index < newBlocks.length; index += 1) {\n if (!blockSequencesEqual(oldBlocks.slice(0, index), newBlocks.slice(0, index))) continue;\n if (!blockSequencesEqual(oldBlocks.slice(index + 2), newBlocks.slice(index + 1))) continue;\n const first = oldBlocks[index]!;\n const second = oldBlocks[index + 1]!;\n const after = newBlocks[index]!;\n if (\n first.block.kind !== 'paragraph' ||\n second.block.kind !== 'paragraph' ||\n after.block.kind !== 'paragraph' ||\n first.block.text + second.block.text !== after.block.text\n ) {\n continue;\n }\n\n return {\n kind: 'block',\n blockOp: 'merge',\n from: first.pos,\n to: second.pos + second.size,\n paragraphs: blockParagraphs([after]),\n target: targetForBlock(after.block),\n status: 'captured',\n blocks: [after.block],\n deletedBlocks: [first.block, second.block],\n value: {\n before: [first.block, second.block],\n after: after.block,\n },\n };\n }\n return null;\n}\n\nfunction insertOrDeleteBlockChange(\n oldBlocks: TopLevelBlockSnapshot[],\n newBlocks: TopLevelBlockSnapshot[],\n): WordEditChangeDraft | null {\n let prefix = 0;\n const maxPrefix = Math.min(oldBlocks.length, newBlocks.length);\n while (prefix < maxPrefix && blockEquals(oldBlocks[prefix]!, newBlocks[prefix]!)) prefix += 1;\n\n let suffix = 0;\n const maxSuffix = Math.min(oldBlocks.length - prefix, newBlocks.length - prefix);\n while (\n suffix < maxSuffix &&\n blockEquals(oldBlocks[oldBlocks.length - 1 - suffix]!, newBlocks[newBlocks.length - 1 - suffix]!)\n ) {\n suffix += 1;\n }\n\n const deleted = oldBlocks.slice(prefix, oldBlocks.length - suffix);\n const inserted = newBlocks.slice(prefix, newBlocks.length - suffix);\n if (deleted.length === 0 && inserted.length === 0) return null;\n const first = inserted[0] ?? deleted[0];\n const last = inserted[inserted.length - 1] ?? deleted[deleted.length - 1] ?? first;\n const operation =\n inserted.length > 0 && deleted.length > 0 ? 'replace' : inserted.length > 0 ? 'insert' : 'delete';\n\n return {\n kind: 'block',\n blockOp: operation,\n from: first?.pos ?? 0,\n to: last ? last.pos + last.size : first?.pos ?? 0,\n paragraphs: blockParagraphs(inserted.length > 0 ? inserted : deleted),\n target: first ? targetForBlock(first.block) : { story: 'body' },\n status: 'captured',\n blocks: inserted.map((item) => item.block),\n deletedBlocks: deleted.map((item) => item.block),\n value: {\n before: deleted.map((item) => item.block),\n after: inserted.map((item) => item.block),\n },\n };\n}\n\nfunction contentChangesFromDocumentDiff(\n oldDoc: ProseMirrorNode,\n newDoc: ProseMirrorNode,\n): WordEditChangeDraft[] {\n const oldParagraphs = paragraphSnapshots(oldDoc);\n const newParagraphs = paragraphSnapshots(newDoc);\n const oldByParaId = new Map(oldParagraphs.map((paragraph) => [paragraph.paraId, paragraph]));\n const changes: WordEditChangeDraft[] = [];\n\n for (const next of newParagraphs) {\n if (!next.paraId) continue;\n const previous = oldByParaId.get(next.paraId);\n if (!previous || paragraphContentEquals(previous.content, next.content)) continue;\n const diff = contentDiff(previous.content, next.content);\n if (!diff) continue;\n const from = next.pos + 1 + diff.from;\n const to = next.pos + 1 + diff.toAfter;\n const paragraph = {\n paraId: next.paraId,\n from: diff.from,\n to: diff.toAfter,\n text: next.text,\n styleId: next.styleId,\n story: next.story,\n };\n\n if (contentListIsTextOnly(diff.insertedContent) && contentListIsTextOnly(diff.deletedContent)) {\n changes.push({\n kind: 'text',\n from,\n to,\n paragraphs: [paragraph],\n target: changeTargetForParagraphs([paragraph]),\n status: 'captured',\n textOp: diff.operation,\n text: contentText(diff.insertedContent),\n deletedText: contentText(diff.deletedContent),\n value: {\n operation: diff.operation,\n before: previous.text,\n after: next.text,\n },\n });\n continue;\n }\n\n changes.push({\n kind: 'content',\n from,\n to,\n paragraphs: [paragraph],\n target: changeTargetForParagraphs([paragraph]),\n status: 'captured',\n contentOp: diff.operation,\n content: mergeTextContent(diff.insertedContent),\n deletedContent: mergeTextContent(diff.deletedContent),\n value: {\n operation: diff.operation,\n before: mergeTextContent(previous.content.map((unit) => unit.content)),\n after: mergeTextContent(next.content.map((unit) => unit.content)),\n },\n });\n }\n\n return changes;\n}\n\nfunction paragraphSnapshots(doc: ProseMirrorNode): ParagraphSnapshot[] {\n const paragraphs: ParagraphSnapshot[] = [];\n doc.descendants((node, pos) => {\n if (node.type !== wordEditorSchema.nodes.paragraph) return true;\n paragraphs.push({\n paraId: typeof node.attrs.paraId === 'string' ? node.attrs.paraId : '',\n pos,\n text: node.textContent,\n content: paragraphContentUnits(node),\n styleId: typeof node.attrs.styleId === 'string' ? node.attrs.styleId : null,\n story: typeof node.attrs.story === 'string' ? node.attrs.story : 'body',\n });\n return false;\n });\n return paragraphs;\n}\n\nfunction topLevelBlockSnapshots(doc: ProseMirrorNode): TopLevelBlockSnapshot[] {\n const blocks: TopLevelBlockSnapshot[] = [];\n doc.forEach((node, offset, index) => {\n if (node.type === wordEditorSchema.nodes.paragraph) {\n const paraId = typeof node.attrs.paraId === 'string' ? node.attrs.paraId : '';\n const story = typeof node.attrs.story === 'string' ? node.attrs.story : 'body';\n const block: WordParagraphBlockSnapshot = {\n kind: 'paragraph',\n paraId,\n story,\n styleId: typeof node.attrs.styleId === 'string' ? node.attrs.styleId : null,\n text: node.textContent,\n content: mergeTextContent(paragraphContentUnits(node).map((unit) => unit.content)),\n };\n blocks.push({\n key: `paragraph:${paraId || index}`,\n pos: offset,\n size: node.nodeSize,\n block,\n });\n return;\n }\n\n if (node.type === wordEditorSchema.nodes.table) {\n const tableId = typeof node.attrs.tableId === 'string' ? node.attrs.tableId : '';\n const block: WordTableBlockSnapshot = {\n kind: 'table',\n tableId,\n text: node.textContent,\n };\n blocks.push({\n key: `table:${tableId || index}`,\n pos: offset,\n size: node.nodeSize,\n block,\n });\n }\n });\n return blocks;\n}\n\nfunction blockSequencesEqual(left: TopLevelBlockSnapshot[], right: TopLevelBlockSnapshot[]): boolean {\n return left.length === right.length && left.every((block, index) => blockEquals(block, right[index]!));\n}\n\nfunction blockEquals(left: TopLevelBlockSnapshot, right: TopLevelBlockSnapshot): boolean {\n return left.key === right.key;\n}\n\nfunction blockParagraphs(blocks: TopLevelBlockSnapshot[]): WordSelectedParagraph[] {\n return blocks.flatMap((snapshot) => {\n if (snapshot.block.kind !== 'paragraph') return [];\n return [\n {\n paraId: snapshot.block.paraId,\n from: 0,\n to: snapshot.block.text.length,\n text: snapshot.block.text,\n styleId: snapshot.block.styleId,\n story: snapshot.block.story,\n },\n ];\n });\n}\n\nfunction targetForBlock(block: WordBlockSnapshot): WordChangeTarget {\n if (block.kind === 'table') {\n return {\n story: 'body',\n ...(block.tableId ? { tableId: block.tableId } : {}),\n };\n }\n\n return {\n story: block.story,\n ...(block.paraId ? { paraId: block.paraId } : {}),\n };\n}\n\nfunction paragraphContentUnits(paragraph: ProseMirrorNode): ParagraphContentUnit[] {\n const units: ParagraphContentUnit[] = [];\n paragraph.forEach((child) => {\n if (child.isText) {\n for (const char of child.text ?? '') {\n units.push({ key: `text:${char}`, content: { kind: 'text', text: char } });\n }\n return;\n }\n\n if (child.type === wordEditorSchema.nodes.image) {\n const image = imageContent(child);\n units.push({ key: `image:${image.drawingId ?? image.src}`, content: image });\n return;\n }\n\n units.push({\n key: `${child.type.name}:${JSON.stringify(child.attrs)}`,\n content: { kind: 'text', text: child.textContent },\n });\n });\n return units;\n}\n\nfunction imageContent(node: ProseMirrorNode): WordImageContent {\n return {\n kind: 'image',\n drawingId: typeof node.attrs.drawingId === 'string' ? node.attrs.drawingId : null,\n alt: typeof node.attrs.alt === 'string' ? node.attrs.alt : '',\n src: typeof node.attrs.src === 'string' ? node.attrs.src : '',\n width: typeof node.attrs.width === 'number' ? node.attrs.width : null,\n height: typeof node.attrs.height === 'number' ? node.attrs.height : null,\n };\n}\n\nfunction contentDiff(\n before: ParagraphContentUnit[],\n after: ParagraphContentUnit[],\n): {\n operation: WordContentEditOperation;\n from: number;\n toBefore: number;\n toAfter: number;\n insertedContent: WordContent[];\n deletedContent: WordContent[];\n} | null {\n if (paragraphContentEquals(before, after)) return null;\n\n let prefix = 0;\n const maxPrefix = Math.min(before.length, after.length);\n while (prefix < maxPrefix && before[prefix]?.key === after[prefix]?.key) prefix += 1;\n\n let suffix = 0;\n const maxSuffix = Math.min(before.length - prefix, after.length - prefix);\n while (\n suffix < maxSuffix &&\n before[before.length - 1 - suffix]?.key === after[after.length - 1 - suffix]?.key\n ) {\n suffix += 1;\n }\n\n const toBefore = before.length - suffix;\n const toAfter = after.length - suffix;\n const insertedContent = after.slice(prefix, toAfter).map((unit) => unit.content);\n const deletedContent = before.slice(prefix, toBefore).map((unit) => unit.content);\n const operation =\n insertedContent.length > 0 && deletedContent.length > 0\n ? 'replace'\n : insertedContent.length > 0\n ? 'insert'\n : 'delete';\n\n return {\n operation,\n from: prefix,\n toBefore,\n toAfter,\n insertedContent,\n deletedContent,\n };\n}\n\nfunction paragraphContentEquals(left: ParagraphContentUnit[], right: ParagraphContentUnit[]): boolean {\n return left.length === right.length && left.every((unit, index) => unit.key === right[index]?.key);\n}\n\nfunction contentListIsTextOnly(content: WordContent[]): boolean {\n return content.every((item) => item.kind === 'text');\n}\n\nfunction contentText(content: WordContent[]): string {\n return content.map((item) => (item.kind === 'text' ? item.text : '')).join('');\n}\n\nfunction mergeTextContent(content: WordContent[]): WordContent[] {\n const merged: WordContent[] = [];\n for (const item of content) {\n const previous = merged[merged.length - 1];\n if (item.kind === 'text' && previous?.kind === 'text') {\n previous.text += item.text;\n } else {\n merged.push({ ...item });\n }\n }\n return merged;\n}\n\nfunction mergeParagraphFormat(value: unknown, patch: Partial<EditorParagraphFormat>): EditorParagraphFormat {\n const base = value !== null && typeof value === 'object' ? (value as EditorParagraphFormat) : {};\n return { ...base, ...patch };\n}\n\nfunction normalizeHexColor(color: string): string | null {\n const trimmed = color.trim().replace(/^#/, '');\n return /^[0-9a-f]{6}$/i.test(trimmed) ? trimmed.toUpperCase() : null;\n}\n\nfunction findParentDepth($pos: EditorState['selection']['$from'], nodeName: string): number | null {\n for (let depth = $pos.depth; depth > 0; depth -= 1) {\n if ($pos.node(depth).type.name === nodeName) return depth;\n }\n return null;\n}\n"]}