@coco-vexel/coco-office-editor 0.0.0-stage → 1.0.1

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":["Schema","PluginKey","Plugin"],"mappings":"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","file":"word-editing.cjs","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"]}
@@ -0,0 +1,149 @@
1
+ import { Plugin, EditorState, Transaction, PluginKey } from 'prosemirror-state';
2
+ import { EditorView } from 'prosemirror-view';
3
+ import { p as EditorParagraphFormat } from './model-DB6aN6uJ.cjs';
4
+ import '@coco-vexel/coco-office/word-view';
5
+
6
+ type WordEditMark = 'strong' | 'textStyle';
7
+ type WordBlockEditOperation = 'insert' | 'delete' | 'replace' | 'split' | 'merge' | 'move';
8
+ type WordAnnotationEditOperation = 'insert' | 'delete' | 'update';
9
+ type WordContentEditOperation = 'insert' | 'delete' | 'replace';
10
+ type WordRevisionEditOperation = 'insert' | 'delete' | 'accept' | 'reject';
11
+ type WordTableEditOperation = 'insertTable' | 'deleteTable' | 'insertRow' | 'deleteRow' | 'insertColumn' | 'deleteColumn' | 'mergeCells' | 'splitCell' | 'updateCell' | 'updateTable';
12
+ type WordTextEditOperation = 'insert' | 'delete' | 'replace';
13
+ type WordParagraphAlignment = NonNullable<EditorParagraphFormat['alignment']>;
14
+ type WordChangeStatus = 'captured' | 'planned' | 'exportable';
15
+ interface WordChangeTarget {
16
+ story: string;
17
+ paraId?: string;
18
+ tableId?: string;
19
+ rowIndex?: number;
20
+ columnIndex?: number;
21
+ cellId?: string;
22
+ annotationId?: string;
23
+ revisionId?: string;
24
+ }
25
+ interface WordEditorRange {
26
+ from: number;
27
+ to: number;
28
+ }
29
+ interface WordParagraphRange extends WordEditorRange {
30
+ paraId: string;
31
+ story: string;
32
+ }
33
+ interface WordParagraphBlockSnapshot {
34
+ kind: 'paragraph';
35
+ paraId: string;
36
+ story: string;
37
+ styleId: string | null;
38
+ text: string;
39
+ content: WordContent[];
40
+ }
41
+ interface WordTableBlockSnapshot {
42
+ kind: 'table';
43
+ tableId: string;
44
+ text: string;
45
+ }
46
+ type WordBlockSnapshot = WordParagraphBlockSnapshot | WordTableBlockSnapshot;
47
+ interface WordImageContent {
48
+ kind: 'image';
49
+ drawingId: string | null;
50
+ alt: string;
51
+ src: string;
52
+ width: number | null;
53
+ height: number | null;
54
+ }
55
+ interface WordTextContent {
56
+ kind: 'text';
57
+ text: string;
58
+ }
59
+ type WordContent = WordImageContent | WordTextContent;
60
+ interface WordSelectedParagraph {
61
+ paraId: string;
62
+ from: number;
63
+ to: number;
64
+ text: string;
65
+ styleId: string | null;
66
+ story: string;
67
+ }
68
+ interface WordSelectionInfo {
69
+ from: number;
70
+ to: number;
71
+ empty: boolean;
72
+ selectedText: string;
73
+ paragraphs: WordSelectedParagraph[];
74
+ tableCell: {
75
+ depth: number;
76
+ colspan: number;
77
+ rowspan: number;
78
+ } | null;
79
+ }
80
+ interface WordEditChangeBase {
81
+ from: number;
82
+ to: number;
83
+ paragraphs: WordSelectedParagraph[];
84
+ target: WordChangeTarget;
85
+ status: WordChangeStatus;
86
+ value: unknown;
87
+ }
88
+ interface WordTextEditChangeDraft extends WordEditChangeBase {
89
+ kind: 'text';
90
+ textOp: WordTextEditOperation;
91
+ text: string;
92
+ deletedText: string;
93
+ }
94
+ interface WordContentEditChangeDraft extends WordEditChangeBase {
95
+ kind: 'content';
96
+ contentOp: WordContentEditOperation;
97
+ content: WordContent[];
98
+ deletedContent: WordContent[];
99
+ }
100
+ interface WordMarkEditChangeDraft extends WordEditChangeBase {
101
+ kind: 'mark';
102
+ mark: WordEditMark;
103
+ }
104
+ interface WordParagraphEditChangeDraft extends WordEditChangeBase {
105
+ kind: 'paragraph';
106
+ attr: 'alignment';
107
+ }
108
+ interface WordBlockEditChangeDraft extends WordEditChangeBase {
109
+ kind: 'block';
110
+ blockOp: WordBlockEditOperation;
111
+ blocks?: WordBlockSnapshot[];
112
+ deletedBlocks?: WordBlockSnapshot[];
113
+ }
114
+ interface WordTableEditChangeDraft extends WordEditChangeBase {
115
+ kind: 'table';
116
+ tableOp: WordTableEditOperation;
117
+ tableId?: string;
118
+ }
119
+ interface WordAnnotationEditChangeDraft extends WordEditChangeBase {
120
+ kind: 'annotation';
121
+ annotationOp: WordAnnotationEditOperation;
122
+ annotationId: string;
123
+ }
124
+ interface WordRevisionEditChangeDraft extends WordEditChangeBase {
125
+ kind: 'revision';
126
+ revisionOp: WordRevisionEditOperation;
127
+ revisionId?: string;
128
+ }
129
+ type WordEditChangeDraft = WordTextEditChangeDraft | WordContentEditChangeDraft | WordMarkEditChangeDraft | WordParagraphEditChangeDraft | WordBlockEditChangeDraft | WordTableEditChangeDraft | WordAnnotationEditChangeDraft | WordRevisionEditChangeDraft;
130
+ type WordEditChange = WordEditChangeDraft & {
131
+ id: string;
132
+ createdAt: number;
133
+ };
134
+ interface WordChangeSet {
135
+ changes: WordEditChange[];
136
+ }
137
+ interface WordEditingPluginOptions {
138
+ onChangeSet?: (changeSet: WordChangeSet) => void;
139
+ }
140
+ declare const wordEditingPluginKey: PluginKey<WordChangeSet>;
141
+ declare function createWordEditingPlugin(options?: WordEditingPluginOptions): Plugin<WordChangeSet>;
142
+ declare function getWordChangeSet(state: EditorState): WordChangeSet;
143
+ declare function getWordSelectionInfo(state: EditorState): WordSelectionInfo;
144
+ declare function toggleBold(state: EditorState, dispatch?: (tr: Transaction) => void, view?: EditorView): boolean;
145
+ declare function setFontSize(sizePt: number): (state: EditorState, dispatch?: (tr: Transaction) => void, view?: EditorView) => boolean;
146
+ declare function setColor(color: string): (state: EditorState, dispatch?: (tr: Transaction) => void, view?: EditorView) => boolean;
147
+ declare function setParagraphAlign(alignment: WordParagraphAlignment): (state: EditorState, dispatch?: (tr: Transaction) => void) => boolean;
148
+
149
+ export { type WordAnnotationEditChangeDraft, type WordAnnotationEditOperation, type WordBlockEditChangeDraft, type WordBlockEditOperation, type WordBlockSnapshot, type WordChangeSet, type WordChangeStatus, type WordChangeTarget, type WordContent, type WordContentEditChangeDraft, type WordContentEditOperation, type WordEditChange, type WordEditChangeBase, type WordEditChangeDraft, type WordEditMark, type WordEditingPluginOptions, type WordEditorRange, type WordImageContent, type WordMarkEditChangeDraft, type WordParagraphAlignment, type WordParagraphBlockSnapshot, type WordParagraphEditChangeDraft, type WordParagraphRange, type WordRevisionEditChangeDraft, type WordRevisionEditOperation, type WordSelectedParagraph, type WordSelectionInfo, type WordTableBlockSnapshot, type WordTableEditChangeDraft, type WordTableEditOperation, type WordTextContent, type WordTextEditChangeDraft, type WordTextEditOperation, createWordEditingPlugin, getWordChangeSet, getWordSelectionInfo, setColor, setFontSize, setParagraphAlign, toggleBold, wordEditingPluginKey };
@@ -0,0 +1,149 @@
1
+ import { Plugin, EditorState, Transaction, PluginKey } from 'prosemirror-state';
2
+ import { EditorView } from 'prosemirror-view';
3
+ import { p as EditorParagraphFormat } from './model-DB6aN6uJ.js';
4
+ import '@coco-vexel/coco-office/word-view';
5
+
6
+ type WordEditMark = 'strong' | 'textStyle';
7
+ type WordBlockEditOperation = 'insert' | 'delete' | 'replace' | 'split' | 'merge' | 'move';
8
+ type WordAnnotationEditOperation = 'insert' | 'delete' | 'update';
9
+ type WordContentEditOperation = 'insert' | 'delete' | 'replace';
10
+ type WordRevisionEditOperation = 'insert' | 'delete' | 'accept' | 'reject';
11
+ type WordTableEditOperation = 'insertTable' | 'deleteTable' | 'insertRow' | 'deleteRow' | 'insertColumn' | 'deleteColumn' | 'mergeCells' | 'splitCell' | 'updateCell' | 'updateTable';
12
+ type WordTextEditOperation = 'insert' | 'delete' | 'replace';
13
+ type WordParagraphAlignment = NonNullable<EditorParagraphFormat['alignment']>;
14
+ type WordChangeStatus = 'captured' | 'planned' | 'exportable';
15
+ interface WordChangeTarget {
16
+ story: string;
17
+ paraId?: string;
18
+ tableId?: string;
19
+ rowIndex?: number;
20
+ columnIndex?: number;
21
+ cellId?: string;
22
+ annotationId?: string;
23
+ revisionId?: string;
24
+ }
25
+ interface WordEditorRange {
26
+ from: number;
27
+ to: number;
28
+ }
29
+ interface WordParagraphRange extends WordEditorRange {
30
+ paraId: string;
31
+ story: string;
32
+ }
33
+ interface WordParagraphBlockSnapshot {
34
+ kind: 'paragraph';
35
+ paraId: string;
36
+ story: string;
37
+ styleId: string | null;
38
+ text: string;
39
+ content: WordContent[];
40
+ }
41
+ interface WordTableBlockSnapshot {
42
+ kind: 'table';
43
+ tableId: string;
44
+ text: string;
45
+ }
46
+ type WordBlockSnapshot = WordParagraphBlockSnapshot | WordTableBlockSnapshot;
47
+ interface WordImageContent {
48
+ kind: 'image';
49
+ drawingId: string | null;
50
+ alt: string;
51
+ src: string;
52
+ width: number | null;
53
+ height: number | null;
54
+ }
55
+ interface WordTextContent {
56
+ kind: 'text';
57
+ text: string;
58
+ }
59
+ type WordContent = WordImageContent | WordTextContent;
60
+ interface WordSelectedParagraph {
61
+ paraId: string;
62
+ from: number;
63
+ to: number;
64
+ text: string;
65
+ styleId: string | null;
66
+ story: string;
67
+ }
68
+ interface WordSelectionInfo {
69
+ from: number;
70
+ to: number;
71
+ empty: boolean;
72
+ selectedText: string;
73
+ paragraphs: WordSelectedParagraph[];
74
+ tableCell: {
75
+ depth: number;
76
+ colspan: number;
77
+ rowspan: number;
78
+ } | null;
79
+ }
80
+ interface WordEditChangeBase {
81
+ from: number;
82
+ to: number;
83
+ paragraphs: WordSelectedParagraph[];
84
+ target: WordChangeTarget;
85
+ status: WordChangeStatus;
86
+ value: unknown;
87
+ }
88
+ interface WordTextEditChangeDraft extends WordEditChangeBase {
89
+ kind: 'text';
90
+ textOp: WordTextEditOperation;
91
+ text: string;
92
+ deletedText: string;
93
+ }
94
+ interface WordContentEditChangeDraft extends WordEditChangeBase {
95
+ kind: 'content';
96
+ contentOp: WordContentEditOperation;
97
+ content: WordContent[];
98
+ deletedContent: WordContent[];
99
+ }
100
+ interface WordMarkEditChangeDraft extends WordEditChangeBase {
101
+ kind: 'mark';
102
+ mark: WordEditMark;
103
+ }
104
+ interface WordParagraphEditChangeDraft extends WordEditChangeBase {
105
+ kind: 'paragraph';
106
+ attr: 'alignment';
107
+ }
108
+ interface WordBlockEditChangeDraft extends WordEditChangeBase {
109
+ kind: 'block';
110
+ blockOp: WordBlockEditOperation;
111
+ blocks?: WordBlockSnapshot[];
112
+ deletedBlocks?: WordBlockSnapshot[];
113
+ }
114
+ interface WordTableEditChangeDraft extends WordEditChangeBase {
115
+ kind: 'table';
116
+ tableOp: WordTableEditOperation;
117
+ tableId?: string;
118
+ }
119
+ interface WordAnnotationEditChangeDraft extends WordEditChangeBase {
120
+ kind: 'annotation';
121
+ annotationOp: WordAnnotationEditOperation;
122
+ annotationId: string;
123
+ }
124
+ interface WordRevisionEditChangeDraft extends WordEditChangeBase {
125
+ kind: 'revision';
126
+ revisionOp: WordRevisionEditOperation;
127
+ revisionId?: string;
128
+ }
129
+ type WordEditChangeDraft = WordTextEditChangeDraft | WordContentEditChangeDraft | WordMarkEditChangeDraft | WordParagraphEditChangeDraft | WordBlockEditChangeDraft | WordTableEditChangeDraft | WordAnnotationEditChangeDraft | WordRevisionEditChangeDraft;
130
+ type WordEditChange = WordEditChangeDraft & {
131
+ id: string;
132
+ createdAt: number;
133
+ };
134
+ interface WordChangeSet {
135
+ changes: WordEditChange[];
136
+ }
137
+ interface WordEditingPluginOptions {
138
+ onChangeSet?: (changeSet: WordChangeSet) => void;
139
+ }
140
+ declare const wordEditingPluginKey: PluginKey<WordChangeSet>;
141
+ declare function createWordEditingPlugin(options?: WordEditingPluginOptions): Plugin<WordChangeSet>;
142
+ declare function getWordChangeSet(state: EditorState): WordChangeSet;
143
+ declare function getWordSelectionInfo(state: EditorState): WordSelectionInfo;
144
+ declare function toggleBold(state: EditorState, dispatch?: (tr: Transaction) => void, view?: EditorView): boolean;
145
+ declare function setFontSize(sizePt: number): (state: EditorState, dispatch?: (tr: Transaction) => void, view?: EditorView) => boolean;
146
+ declare function setColor(color: string): (state: EditorState, dispatch?: (tr: Transaction) => void, view?: EditorView) => boolean;
147
+ declare function setParagraphAlign(alignment: WordParagraphAlignment): (state: EditorState, dispatch?: (tr: Transaction) => void) => boolean;
148
+
149
+ export { type WordAnnotationEditChangeDraft, type WordAnnotationEditOperation, type WordBlockEditChangeDraft, type WordBlockEditOperation, type WordBlockSnapshot, type WordChangeSet, type WordChangeStatus, type WordChangeTarget, type WordContent, type WordContentEditChangeDraft, type WordContentEditOperation, type WordEditChange, type WordEditChangeBase, type WordEditChangeDraft, type WordEditMark, type WordEditingPluginOptions, type WordEditorRange, type WordImageContent, type WordMarkEditChangeDraft, type WordParagraphAlignment, type WordParagraphBlockSnapshot, type WordParagraphEditChangeDraft, type WordParagraphRange, type WordRevisionEditChangeDraft, type WordRevisionEditOperation, type WordSelectedParagraph, type WordSelectionInfo, type WordTableBlockSnapshot, type WordTableEditChangeDraft, type WordTableEditOperation, type WordTextContent, type WordTextEditChangeDraft, type WordTextEditOperation, createWordEditingPlugin, getWordChangeSet, getWordSelectionInfo, setColor, setFontSize, setParagraphAlign, toggleBold, wordEditingPluginKey };