docxmlater 10.3.4 → 10.3.5
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.
- package/README.md +1 -0
- package/dist/core/DocumentParser.js +1 -1
- package/dist/core/DocumentParser.js.map +1 -1
- package/dist/elements/Section.d.ts.map +1 -1
- package/dist/elements/Section.js +18 -3
- package/dist/elements/Section.js.map +1 -1
- package/dist/elements/Table.d.ts +4 -0
- package/dist/elements/Table.d.ts.map +1 -1
- package/dist/elements/Table.js +30 -4
- package/dist/elements/Table.js.map +1 -1
- package/dist/elements/TableCell.d.ts.map +1 -1
- package/dist/elements/TableCell.js +14 -0
- package/dist/elements/TableCell.js.map +1 -1
- package/dist/tracking/DocumentTrackingContext.d.ts.map +1 -1
- package/dist/tracking/DocumentTrackingContext.js +60 -24
- package/dist/tracking/DocumentTrackingContext.js.map +1 -1
- package/package.json +1 -1
- package/src/core/DocumentParser.ts +1 -1
- package/src/elements/Section.ts +19 -3
- package/src/elements/Table.ts +55 -4
- package/src/elements/TableCell.ts +15 -2
- package/src/tracking/DocumentTrackingContext.ts +76 -24
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DocumentTrackingContext.js","sourceRoot":"","sources":["../../src/tracking/DocumentTrackingContext.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * DocumentTrackingContext - Implementation of automatic change tracking\n *\n * Manages pending changes and creates Revision objects when flushed.\n * Supports consolidation of similar changes within a time window.\n *\n * @module DocumentTrackingContext\n */\n\nimport { Revision, RevisionType } from '../elements/Revision';\nimport { RevisionManager } from '../elements/RevisionManager';\nimport { Run, type RunFormatting } from '../elements/Run';\nimport { Paragraph } from '../elements/Paragraph';\nimport { Table } from '../elements/Table';\nimport { TableRow } from '../elements/TableRow';\nimport { TableCell } from '../elements/TableCell';\nimport { Section } from '../elements/Section';\nimport type { TrackingContext, PendingChange, TrackableElement } from './TrackingContext';\nimport { formatDateForXml } from '../utils/dateFormatting';\n\n/**\n * Enable options for tracking context\n */\nexport interface TrackingEnableOptions {\n /** Author name for new revisions (default: 'DocHub') */\n author?: string;\n /** Whether to track formatting changes (default: true) */\n trackFormatting?: boolean;\n}\n\n/**\n * Implementation of TrackingContext for Document\n */\nexport class DocumentTrackingContext implements TrackingContext {\n private enabled = false;\n private trackFormatting = true;\n private author = 'DocHub';\n private revisionManager: RevisionManager;\n\n /** Counter for assigning stable element IDs */\n private elementIdCounter = 0;\n /** Stable element identity map (WeakMap so elements can be GC'd) */\n private elementIdMap = new WeakMap<object, number>();\n\n /** Pending changes waiting to be flushed */\n private pendingChanges = new Map<string, PendingChange>();\n\n /** Properties considered \"formatting\" (vs structural) */\n private static readonly FORMATTING_PROPERTIES = new Set([\n 'bold',\n 'italic',\n 'underline',\n 'strike',\n 'dstrike',\n 'subscript',\n 'superscript',\n 'font',\n 'size',\n 'color',\n 'highlight',\n 'smallCaps',\n 'allCaps',\n 'characterSpacing',\n 'scaling',\n 'position',\n 'emphasis',\n 'shadow',\n 'emboss',\n 'imprint',\n 'outline',\n 'vanish',\n ]);\n\n /**\n * Creates a new DocumentTrackingContext\n * @param revisionManager - RevisionManager to register revisions with\n */\n constructor(revisionManager: RevisionManager) {\n this.revisionManager = revisionManager;\n }\n\n /**\n * Enable change tracking\n * @param options - Enable options\n */\n enable(options?: TrackingEnableOptions): void {\n this.enabled = true;\n if (options?.author) {\n this.author = options.author;\n }\n if (options?.trackFormatting !== undefined) {\n this.trackFormatting = options.trackFormatting;\n }\n }\n\n /**\n * Disable change tracking and flush pending changes\n */\n disable(): void {\n this.flushPendingChanges();\n this.enabled = false;\n }\n\n /**\n * Set the author for new revisions\n * Flushes any pending changes before switching to prevent mixed authorship\n * @param author - Author name\n */\n setAuthor(author: string): void {\n // Flush pending changes before switching authors to prevent mixed authorship\n if (this.enabled && this.pendingChanges.size > 0) {\n this.flushPendingChanges();\n }\n this.author = author;\n }\n\n // ═══════════════════════════════════════════════════════════════════════════\n // TrackingContext Interface Implementation\n // ═══════════════════════════════════════════════════════════════════════════\n\n isEnabled(): boolean {\n return this.enabled;\n }\n\n getAuthor(): string {\n return this.author;\n }\n\n getRevisionManager(): RevisionManager {\n return this.revisionManager;\n }\n\n isTrackFormattingEnabled(): boolean {\n return this.trackFormatting;\n }\n\n trackRunPropertyChange(run: Run, property: string, oldValue: unknown, newValue: unknown): void {\n if (!this.enabled) return;\n if (this.valuesEqual(oldValue, newValue)) return;\n\n // Skip formatting changes if not tracking them\n if (!this.trackFormatting && DocumentTrackingContext.FORMATTING_PROPERTIES.has(property)) {\n return;\n }\n\n // Create consolidation key with element identity\n const key = `runProp:${property}:${this.stringifyValue(newValue)}@${this.getElementId(run)}`;\n\n this.addPendingChange(key, {\n type: 'runPropertiesChange',\n property,\n previousValue: oldValue,\n newValue,\n element: run,\n timestamp: Date.now(),\n });\n }\n\n trackParagraphPropertyChange(\n paragraph: TrackableElement,\n property: string,\n oldValue: unknown,\n newValue: unknown\n ): void {\n if (!this.enabled) return;\n if (this.valuesEqual(oldValue, newValue)) return;\n\n const key = `paraProp:${property}:${this.stringifyValue(newValue)}@${this.getElementId(paragraph)}`;\n\n this.addPendingChange(key, {\n type: 'paragraphPropertiesChange',\n property,\n previousValue: oldValue,\n newValue,\n element: paragraph,\n timestamp: Date.now(),\n });\n }\n\n trackHyperlinkChange(\n hyperlink: TrackableElement,\n changeType: string,\n oldValue: unknown,\n newValue: unknown\n ): void {\n if (!this.enabled) return;\n if (this.valuesEqual(oldValue, newValue)) return;\n\n // Hyperlink changes use dedicated type for proper categorization\n const key = `hyperlink:${changeType}:${this.stringifyValue(newValue)}@${this.getElementId(hyperlink)}`;\n\n this.addPendingChange(key, {\n type: 'hyperlinkChange',\n property: changeType,\n previousValue: oldValue,\n newValue,\n element: hyperlink,\n timestamp: Date.now(),\n });\n }\n\n trackTableChange(\n element: TrackableElement,\n property: string,\n oldValue: unknown,\n newValue: unknown\n ): void {\n if (!this.enabled) return;\n if (this.valuesEqual(oldValue, newValue)) return;\n\n // Determine revision type based on element type using instanceof (minification-safe)\n let type: RevisionType = 'tablePropertiesChange';\n let elementType = 'Table';\n\n if (element instanceof TableRow) {\n type = 'tableRowPropertiesChange';\n elementType = 'TableRow';\n } else if (element instanceof TableCell) {\n type = 'tableCellPropertiesChange';\n elementType = 'TableCell';\n }\n\n const key = `table:${elementType}:${property}:${this.stringifyValue(newValue)}@${this.getElementId(element)}`;\n\n this.addPendingChange(key, {\n type,\n property,\n previousValue: oldValue,\n newValue,\n element,\n timestamp: Date.now(),\n });\n }\n\n trackSectionChange(\n section: TrackableElement,\n property: string,\n oldValue: unknown,\n newValue: unknown\n ): void {\n if (!this.enabled) return;\n if (this.valuesEqual(oldValue, newValue)) return;\n\n const key = `section:${property}:${this.stringifyValue(newValue)}@${this.getElementId(section)}`;\n\n this.addPendingChange(key, {\n type: 'sectionPropertiesChange',\n property,\n previousValue: oldValue,\n newValue,\n element: section,\n timestamp: Date.now(),\n });\n }\n\n trackInsertion(element: TrackableElement, text: string): void {\n if (!this.enabled) return;\n if (!text) return;\n\n const key = `insert:${Date.now()}:${text.substring(0, 20)}`;\n\n this.addPendingChange(key, {\n type: 'insert',\n property: 'text',\n previousValue: undefined,\n newValue: text,\n element,\n timestamp: Date.now(),\n });\n }\n\n trackDeletion(element: TrackableElement, text: string): void {\n if (!this.enabled) return;\n if (!text) return;\n\n const key = `delete:${Date.now()}:${text.substring(0, 20)}`;\n\n this.addPendingChange(key, {\n type: 'delete',\n property: 'text',\n previousValue: text,\n newValue: undefined,\n element,\n timestamp: Date.now(),\n });\n }\n\n flushPendingChanges(): Revision[] {\n const revisions: Revision[] = [];\n\n // Group pending changes by element for consolidation\n const paragraphChanges = new Map<Paragraph, PendingChange[]>();\n const tableChanges = new Map<Table, PendingChange[]>();\n const rowChanges = new Map<TableRow, PendingChange[]>();\n const cellChanges = new Map<TableCell, PendingChange[]>();\n const sectionChanges = new Map<Section, PendingChange[]>();\n const runChanges = new Map<Run, PendingChange[]>();\n\n for (const [, pending] of this.pendingChanges) {\n const revision = this.createRevision(pending);\n this.revisionManager.register(revision);\n revisions.push(revision);\n\n // Collect changes by element type for *PrChange application\n if (pending.type === 'paragraphPropertiesChange' && pending.element instanceof Paragraph) {\n const changes = paragraphChanges.get(pending.element) || [];\n changes.push(pending);\n paragraphChanges.set(pending.element, changes);\n } else if (pending.type === 'tablePropertiesChange' && pending.element instanceof Table) {\n const changes = tableChanges.get(pending.element) || [];\n changes.push(pending);\n tableChanges.set(pending.element, changes);\n } else if (\n pending.type === 'tableRowPropertiesChange' &&\n pending.element instanceof TableRow\n ) {\n const changes = rowChanges.get(pending.element) || [];\n changes.push(pending);\n rowChanges.set(pending.element, changes);\n } else if (\n pending.type === 'tableCellPropertiesChange' &&\n pending.element instanceof TableCell\n ) {\n const changes = cellChanges.get(pending.element) || [];\n changes.push(pending);\n cellChanges.set(pending.element, changes);\n } else if (pending.type === 'sectionPropertiesChange' && pending.element instanceof Section) {\n const changes = sectionChanges.get(pending.element) || [];\n changes.push(pending);\n sectionChanges.set(pending.element, changes);\n } else if (pending.type === 'runPropertiesChange' && pending.element instanceof Run) {\n const changes = runChanges.get(pending.element) || [];\n changes.push(pending);\n runChanges.set(pending.element, changes);\n }\n }\n\n // Apply pPrChange to each paragraph that has property changes\n for (const [paragraph, changes] of paragraphChanges) {\n this.applyParagraphPrChange(paragraph, changes);\n }\n\n // Apply tblPrChange to each Table\n // Per ECMA-376 §17.13.5.36, tblPrChange must contain FULL previous tblPr,\n // not just the delta of changed properties.\n for (const [table, changes] of tableChanges) {\n // Build full snapshot: start from current formatting, roll back changed properties\n const currentFormatting = table.getFormatting();\n const fullPrevProps: Record<string, unknown> = {};\n\n for (const [key, value] of Object.entries(currentFormatting)) {\n if (value !== undefined) {\n fullPrevProps[key] = value;\n }\n }\n\n // Roll back changed properties to their previous values\n let latestTimestamp = 0;\n for (const change of changes) {\n if (change.previousValue !== undefined) {\n fullPrevProps[change.property] = change.previousValue;\n } else {\n delete fullPrevProps[change.property];\n }\n if (change.timestamp > latestTimestamp) {\n latestTimestamp = change.timestamp;\n }\n }\n\n const date = formatDateForXml(new Date(latestTimestamp));\n\n const existing = table.getTblPrChange();\n if (existing) {\n // Merge: existing previous state takes precedence (it's the ORIGINAL baseline)\n const merged = { ...fullPrevProps, ...(existing.previousProperties || {}) };\n table.setTblPrChange({ ...existing, previousProperties: merged });\n } else {\n table.setTblPrChange({\n author: this.author,\n date,\n id: String(this.revisionManager.consumeNextId()),\n previousProperties: fullPrevProps,\n });\n }\n }\n\n // Apply trPrChange to each TableRow\n for (const [row, changes] of rowChanges) {\n this.applyElementPrChange(changes, (prevProps, getNextId, date) => {\n const existing = row.getTrPrChange();\n if (existing) {\n const merged = { ...(existing.previousProperties || {}), ...prevProps };\n row.setTrPrChange({ ...existing, previousProperties: merged });\n } else {\n row.setTrPrChange({\n author: this.author,\n date,\n id: String(getNextId()),\n previousProperties: prevProps,\n });\n }\n });\n }\n\n // Apply tcPrChange to each TableCell\n for (const [cell, changes] of cellChanges) {\n this.applyElementPrChange(changes, (prevProps, getNextId, date) => {\n const existing = cell.getTcPrChange();\n if (existing) {\n const merged = { ...(existing.previousProperties || {}), ...prevProps };\n cell.setTcPrChange({ ...existing, previousProperties: merged });\n } else {\n cell.setTcPrChange({\n author: this.author,\n date,\n id: String(getNextId()),\n previousProperties: prevProps,\n });\n }\n });\n }\n\n // Apply sectPrChange to each Section\n for (const [section, changes] of sectionChanges) {\n this.applyElementPrChange(changes, (prevProps, getNextId, date) => {\n const existing = section.getSectPrChange();\n if (existing) {\n const merged = { ...(existing.previousProperties || {}), ...prevProps };\n section.setSectPrChange({ ...existing, previousProperties: merged });\n } else {\n section.setSectPrChange({\n author: this.author,\n date,\n id: String(getNextId()),\n previousProperties: prevProps,\n });\n }\n });\n }\n\n // Apply rPrChange to each Run that has property changes\n for (const [run, changes] of runChanges) {\n this.applyRunPrChange(run, changes);\n }\n\n this.pendingChanges.clear();\n return revisions;\n }\n\n // ═══════════════════════════════════════════════════════════════════════════\n // Private Methods\n // ═══════════════════════════════════════════════════════════════════════════\n\n /**\n * Apply pPrChange to a paragraph (extracted from flushPendingChanges for readability)\n */\n private applyParagraphPrChange(paragraph: Paragraph, changes: PendingChange[]): void {\n const newPreviousProperties: Record<string, unknown> = {};\n let latestTimestamp = 0;\n\n for (const change of changes) {\n // Record previous value even if undefined (property wasn't set before)\n newPreviousProperties[change.property] = change.previousValue;\n if (change.timestamp > latestTimestamp) {\n latestTimestamp = change.timestamp;\n }\n }\n\n const existingChange = paragraph.formatting.pPrChange;\n\n if (existingChange) {\n const mergedPreviousProperties: Record<string, unknown> = {\n ...(existingChange.previousProperties || {}),\n };\n for (const [prop, value] of Object.entries(newPreviousProperties)) {\n mergedPreviousProperties[prop] = value;\n }\n paragraph.formatting.pPrChange = {\n author: existingChange.author,\n date: existingChange.date,\n id: existingChange.id,\n previousProperties: mergedPreviousProperties,\n };\n } else {\n const revisionId = this.revisionManager.consumeNextId();\n paragraph.formatting.pPrChange = {\n author: this.author,\n date: formatDateForXml(new Date(latestTimestamp)),\n id: String(revisionId),\n previousProperties: newPreviousProperties,\n };\n }\n }\n\n /**\n * Apply rPrChange to a run (mirrors applyParagraphPrChange for runs)\n */\n private applyRunPrChange(run: Run, changes: PendingChange[]): void {\n const newPreviousProperties: Partial<RunFormatting> = {};\n let latestTimestamp = 0;\n\n for (const change of changes) {\n (newPreviousProperties as Record<string, unknown>)[change.property] = change.previousValue;\n if (change.timestamp > latestTimestamp) {\n latestTimestamp = change.timestamp;\n }\n }\n\n const existingChange = run.getPropertyChangeRevision();\n\n if (existingChange) {\n // Merge with existing rPrChange — preserve original author/date,\n // add new previous properties\n const mergedPreviousProperties: Partial<RunFormatting> = {\n ...(existingChange.previousProperties || {}),\n ...newPreviousProperties,\n };\n run.setPropertyChangeRevision({\n ...existingChange,\n previousProperties: mergedPreviousProperties,\n });\n } else {\n const revisionId = this.revisionManager.consumeNextId();\n run.setPropertyChangeRevision({\n id: revisionId,\n author: this.author,\n date: new Date(latestTimestamp),\n previousProperties: newPreviousProperties,\n });\n }\n }\n\n /**\n * Generic helper to apply *PrChange to table/row/cell/section elements\n */\n private applyElementPrChange(\n changes: PendingChange[],\n applier: (prevProps: Record<string, unknown>, getNextId: () => number, date: string) => void\n ): void {\n const prevProps: Record<string, unknown> = {};\n let latestTimestamp = 0;\n\n for (const change of changes) {\n // Record previous value even if undefined (property wasn't set before)\n prevProps[change.property] = change.previousValue;\n if (change.timestamp > latestTimestamp) {\n latestTimestamp = change.timestamp;\n }\n }\n\n const date = formatDateForXml(new Date(latestTimestamp));\n applier(prevProps, () => this.revisionManager.consumeNextId(), date);\n }\n\n /**\n * Add a pending change, consolidating with existing if same key\n */\n private addPendingChange(key: string, change: PendingChange): void {\n const existing = this.pendingChanges.get(key);\n if (existing) {\n existing.count = (existing.count || 1) + 1;\n // Keep the first previousValue for consolidated changes\n } else {\n this.pendingChanges.set(key, { ...change, count: 1 });\n }\n }\n\n /**\n * Create a Revision from a pending change\n */\n private createRevision(pending: PendingChange): Revision {\n const previousProps: Record<string, any> = {};\n const newProps: Record<string, any> = {};\n\n if (pending.previousValue !== undefined) {\n previousProps[pending.property] = pending.previousValue;\n }\n if (pending.newValue !== undefined) {\n newProps[pending.property] = pending.newValue;\n }\n\n // Get or create a Run for the revision content\n const run = this.getRunFromElement(pending.element);\n\n return new Revision({\n author: this.author,\n type: pending.type,\n content: run,\n previousProperties: Object.keys(previousProps).length > 0 ? previousProps : undefined,\n newProperties: Object.keys(newProps).length > 0 ? newProps : undefined,\n date: new Date(pending.timestamp),\n });\n }\n\n /**\n * Get or create a Run from an element for revision content\n */\n private getRunFromElement(element: TrackableElement): Run {\n if (element instanceof Run) {\n return element;\n }\n\n // Use instanceof for type-safe element identification (minification-safe)\n if (element instanceof Table) return new Run('Table');\n if (element instanceof TableRow) return new Run('TableRow');\n if (element instanceof TableCell) return new Run('TableCell');\n if (element instanceof Section) return new Run('Section');\n if (element instanceof Paragraph) return new Run('Paragraph');\n\n // Fallback for other elements (e.g., Hyperlink)\n const hasGetText =\n 'getText' in element && typeof (element as { getText?: () => string }).getText === 'function';\n const text = hasGetText\n ? (element as { getText: () => string }).getText()\n : element?.constructor?.name || 'Unknown element';\n return new Run(typeof text === 'string' ? text : String(text));\n }\n\n /**\n * Get a stable unique ID for an element (used in consolidation keys)\n */\n private getElementId(element: TrackableElement): number {\n let id = this.elementIdMap.get(element as object);\n if (id === undefined) {\n id = this.elementIdCounter++;\n this.elementIdMap.set(element as object, id);\n }\n return id;\n }\n\n /**\n * Deep equality check for tracking values (handles objects, primitives, null/undefined)\n */\n private valuesEqual(a: unknown, b: unknown): boolean {\n if (a === b) return true;\n if (a == null || b == null) return false;\n if (typeof a !== 'object' || typeof b !== 'object') return false;\n return JSON.stringify(a) === JSON.stringify(b);\n }\n\n /**\n * Stringify a value for use in consolidation key\n */\n private stringifyValue(value: unknown): string {\n if (value === undefined) return 'undefined';\n if (value === null) return 'null';\n if (typeof value === 'object') {\n return JSON.stringify(value);\n }\n return String(value);\n }\n\n /**\n * Create an insertion revision (factory to avoid circular dependency in Run)\n */\n createInsertion(content: Run, date?: Date): Revision {\n return Revision.createInsertion(this.author, content, date);\n }\n\n /**\n * Create a deletion revision (factory to avoid circular dependency in Run)\n */\n createDeletion(content: Run, date?: Date): Revision {\n return Revision.createDeletion(this.author, content, date);\n }\n\n /**\n * Get count of pending changes\n */\n getPendingCount(): number {\n return this.pendingChanges.size;\n }\n\n /**\n * Check if there are pending changes\n */\n hasPendingChanges(): boolean {\n return this.pendingChanges.size > 0;\n }\n\n /**\n * Clear all pending changes without creating revisions\n */\n clearPendingChanges(): void {\n this.pendingChanges.clear();\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"DocumentTrackingContext.js","sourceRoot":"","sources":["../../src/tracking/DocumentTrackingContext.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * DocumentTrackingContext - Implementation of automatic change tracking\n *\n * Manages pending changes and creates Revision objects when flushed.\n * Supports consolidation of similar changes within a time window.\n *\n * @module DocumentTrackingContext\n */\n\nimport { Revision, RevisionType } from '../elements/Revision';\nimport { RevisionManager } from '../elements/RevisionManager';\nimport { Run, type RunFormatting } from '../elements/Run';\nimport { Paragraph } from '../elements/Paragraph';\nimport { Table } from '../elements/Table';\nimport { TableRow } from '../elements/TableRow';\nimport { TableCell } from '../elements/TableCell';\nimport { Section } from '../elements/Section';\nimport type { TrackingContext, PendingChange, TrackableElement } from './TrackingContext';\nimport { formatDateForXml } from '../utils/dateFormatting';\n\n/**\n * Enable options for tracking context\n */\nexport interface TrackingEnableOptions {\n /** Author name for new revisions (default: 'DocHub') */\n author?: string;\n /** Whether to track formatting changes (default: true) */\n trackFormatting?: boolean;\n}\n\n/**\n * Implementation of TrackingContext for Document\n */\nexport class DocumentTrackingContext implements TrackingContext {\n private enabled = false;\n private trackFormatting = true;\n private author = 'DocHub';\n private revisionManager: RevisionManager;\n\n /** Counter for assigning stable element IDs */\n private elementIdCounter = 0;\n /** Stable element identity map (WeakMap so elements can be GC'd) */\n private elementIdMap = new WeakMap<object, number>();\n\n /** Pending changes waiting to be flushed */\n private pendingChanges = new Map<string, PendingChange>();\n\n /** Properties considered \"formatting\" (vs structural) */\n private static readonly FORMATTING_PROPERTIES = new Set([\n 'bold',\n 'italic',\n 'underline',\n 'strike',\n 'dstrike',\n 'subscript',\n 'superscript',\n 'font',\n 'size',\n 'color',\n 'highlight',\n 'smallCaps',\n 'allCaps',\n 'characterSpacing',\n 'scaling',\n 'position',\n 'emphasis',\n 'shadow',\n 'emboss',\n 'imprint',\n 'outline',\n 'vanish',\n ]);\n\n /**\n * Creates a new DocumentTrackingContext\n * @param revisionManager - RevisionManager to register revisions with\n */\n constructor(revisionManager: RevisionManager) {\n this.revisionManager = revisionManager;\n }\n\n /**\n * Enable change tracking\n * @param options - Enable options\n */\n enable(options?: TrackingEnableOptions): void {\n this.enabled = true;\n if (options?.author) {\n this.author = options.author;\n }\n if (options?.trackFormatting !== undefined) {\n this.trackFormatting = options.trackFormatting;\n }\n }\n\n /**\n * Disable change tracking and flush pending changes\n */\n disable(): void {\n this.flushPendingChanges();\n this.enabled = false;\n }\n\n /**\n * Set the author for new revisions\n * Flushes any pending changes before switching to prevent mixed authorship\n * @param author - Author name\n */\n setAuthor(author: string): void {\n // Flush pending changes before switching authors to prevent mixed authorship\n if (this.enabled && this.pendingChanges.size > 0) {\n this.flushPendingChanges();\n }\n this.author = author;\n }\n\n // ═══════════════════════════════════════════════════════════════════════════\n // TrackingContext Interface Implementation\n // ═══════════════════════════════════════════════════════════════════════════\n\n isEnabled(): boolean {\n return this.enabled;\n }\n\n getAuthor(): string {\n return this.author;\n }\n\n getRevisionManager(): RevisionManager {\n return this.revisionManager;\n }\n\n isTrackFormattingEnabled(): boolean {\n return this.trackFormatting;\n }\n\n trackRunPropertyChange(run: Run, property: string, oldValue: unknown, newValue: unknown): void {\n if (!this.enabled) return;\n if (this.valuesEqual(oldValue, newValue)) return;\n\n // Skip formatting changes if not tracking them\n if (!this.trackFormatting && DocumentTrackingContext.FORMATTING_PROPERTIES.has(property)) {\n return;\n }\n\n // Create consolidation key with element identity\n const key = `runProp:${property}:${this.stringifyValue(newValue)}@${this.getElementId(run)}`;\n\n this.addPendingChange(key, {\n type: 'runPropertiesChange',\n property,\n previousValue: oldValue,\n newValue,\n element: run,\n timestamp: Date.now(),\n });\n }\n\n trackParagraphPropertyChange(\n paragraph: TrackableElement,\n property: string,\n oldValue: unknown,\n newValue: unknown\n ): void {\n if (!this.enabled) return;\n if (this.valuesEqual(oldValue, newValue)) return;\n\n const key = `paraProp:${property}:${this.stringifyValue(newValue)}@${this.getElementId(paragraph)}`;\n\n this.addPendingChange(key, {\n type: 'paragraphPropertiesChange',\n property,\n previousValue: oldValue,\n newValue,\n element: paragraph,\n timestamp: Date.now(),\n });\n }\n\n trackHyperlinkChange(\n hyperlink: TrackableElement,\n changeType: string,\n oldValue: unknown,\n newValue: unknown\n ): void {\n if (!this.enabled) return;\n if (this.valuesEqual(oldValue, newValue)) return;\n\n // Hyperlink changes use dedicated type for proper categorization\n const key = `hyperlink:${changeType}:${this.stringifyValue(newValue)}@${this.getElementId(hyperlink)}`;\n\n this.addPendingChange(key, {\n type: 'hyperlinkChange',\n property: changeType,\n previousValue: oldValue,\n newValue,\n element: hyperlink,\n timestamp: Date.now(),\n });\n }\n\n trackTableChange(\n element: TrackableElement,\n property: string,\n oldValue: unknown,\n newValue: unknown\n ): void {\n if (!this.enabled) return;\n if (this.valuesEqual(oldValue, newValue)) return;\n\n // Determine revision type based on element type using instanceof (minification-safe)\n let type: RevisionType = 'tablePropertiesChange';\n let elementType = 'Table';\n\n if (element instanceof TableRow) {\n type = 'tableRowPropertiesChange';\n elementType = 'TableRow';\n } else if (element instanceof TableCell) {\n type = 'tableCellPropertiesChange';\n elementType = 'TableCell';\n }\n\n const key = `table:${elementType}:${property}:${this.stringifyValue(newValue)}@${this.getElementId(element)}`;\n\n this.addPendingChange(key, {\n type,\n property,\n previousValue: oldValue,\n newValue,\n element,\n timestamp: Date.now(),\n });\n }\n\n trackSectionChange(\n section: TrackableElement,\n property: string,\n oldValue: unknown,\n newValue: unknown\n ): void {\n if (!this.enabled) return;\n if (this.valuesEqual(oldValue, newValue)) return;\n\n const key = `section:${property}:${this.stringifyValue(newValue)}@${this.getElementId(section)}`;\n\n this.addPendingChange(key, {\n type: 'sectionPropertiesChange',\n property,\n previousValue: oldValue,\n newValue,\n element: section,\n timestamp: Date.now(),\n });\n }\n\n trackInsertion(element: TrackableElement, text: string): void {\n if (!this.enabled) return;\n if (!text) return;\n\n const key = `insert:${Date.now()}:${text.substring(0, 20)}`;\n\n this.addPendingChange(key, {\n type: 'insert',\n property: 'text',\n previousValue: undefined,\n newValue: text,\n element,\n timestamp: Date.now(),\n });\n }\n\n trackDeletion(element: TrackableElement, text: string): void {\n if (!this.enabled) return;\n if (!text) return;\n\n const key = `delete:${Date.now()}:${text.substring(0, 20)}`;\n\n this.addPendingChange(key, {\n type: 'delete',\n property: 'text',\n previousValue: text,\n newValue: undefined,\n element,\n timestamp: Date.now(),\n });\n }\n\n flushPendingChanges(): Revision[] {\n const revisions: Revision[] = [];\n\n // Group pending changes by element for consolidation\n const paragraphChanges = new Map<Paragraph, PendingChange[]>();\n const tableChanges = new Map<Table, PendingChange[]>();\n const rowChanges = new Map<TableRow, PendingChange[]>();\n const cellChanges = new Map<TableCell, PendingChange[]>();\n const sectionChanges = new Map<Section, PendingChange[]>();\n const runChanges = new Map<Run, PendingChange[]>();\n\n for (const [, pending] of this.pendingChanges) {\n const revision = this.createRevision(pending);\n this.revisionManager.register(revision);\n revisions.push(revision);\n\n // Collect changes by element type for *PrChange application\n if (pending.type === 'paragraphPropertiesChange' && pending.element instanceof Paragraph) {\n const changes = paragraphChanges.get(pending.element) || [];\n changes.push(pending);\n paragraphChanges.set(pending.element, changes);\n } else if (pending.type === 'tablePropertiesChange' && pending.element instanceof Table) {\n const changes = tableChanges.get(pending.element) || [];\n changes.push(pending);\n tableChanges.set(pending.element, changes);\n } else if (\n pending.type === 'tableRowPropertiesChange' &&\n pending.element instanceof TableRow\n ) {\n const changes = rowChanges.get(pending.element) || [];\n changes.push(pending);\n rowChanges.set(pending.element, changes);\n } else if (\n pending.type === 'tableCellPropertiesChange' &&\n pending.element instanceof TableCell\n ) {\n const changes = cellChanges.get(pending.element) || [];\n changes.push(pending);\n cellChanges.set(pending.element, changes);\n } else if (pending.type === 'sectionPropertiesChange' && pending.element instanceof Section) {\n const changes = sectionChanges.get(pending.element) || [];\n changes.push(pending);\n sectionChanges.set(pending.element, changes);\n } else if (pending.type === 'runPropertiesChange' && pending.element instanceof Run) {\n const changes = runChanges.get(pending.element) || [];\n changes.push(pending);\n runChanges.set(pending.element, changes);\n }\n }\n\n // Apply pPrChange to each paragraph that has property changes\n for (const [paragraph, changes] of paragraphChanges) {\n this.applyParagraphPrChange(paragraph, changes);\n }\n\n // Apply tblPrChange to each Table\n // Per ECMA-376 §17.13.5.36, tblPrChange must contain FULL previous tblPr,\n // not just the delta of changed properties.\n for (const [table, changes] of tableChanges) {\n // Build full snapshot: start from current formatting, roll back changed properties\n const currentFormatting = table.getFormatting();\n const fullPrevProps: Record<string, unknown> = {};\n\n for (const [key, value] of Object.entries(currentFormatting)) {\n if (value !== undefined) {\n fullPrevProps[key] = value;\n }\n }\n\n // Roll back changed properties to their previous values\n let latestTimestamp = 0;\n for (const change of changes) {\n if (change.previousValue !== undefined) {\n fullPrevProps[change.property] = change.previousValue;\n } else {\n delete fullPrevProps[change.property];\n }\n if (change.timestamp > latestTimestamp) {\n latestTimestamp = change.timestamp;\n }\n }\n\n const date = formatDateForXml(new Date(latestTimestamp));\n\n const existing = table.getTblPrChange();\n if (existing) {\n // Merge: existing previous state takes precedence (it's the ORIGINAL baseline)\n const merged = { ...fullPrevProps, ...(existing.previousProperties || {}) };\n table.setTblPrChange({ ...existing, previousProperties: merged });\n } else {\n table.setTblPrChange({\n author: this.author,\n date,\n id: String(this.revisionManager.consumeNextId()),\n previousProperties: fullPrevProps,\n });\n }\n }\n\n // Apply trPrChange to each TableRow\n for (const [row, changes] of rowChanges) {\n this.applyElementPrChange(changes, (prevProps, getNextId, date) => {\n const existing = row.getTrPrChange();\n if (existing) {\n const merged = { ...(existing.previousProperties || {}), ...prevProps };\n row.setTrPrChange({ ...existing, previousProperties: merged });\n } else {\n row.setTrPrChange({\n author: this.author,\n date,\n id: String(getNextId()),\n previousProperties: prevProps,\n });\n }\n });\n }\n\n // Apply tcPrChange to each TableCell\n // Per ECMA-376 §17.13.5.37, tcPrChange must contain FULL previous tcPr,\n // not just the delta of changed properties.\n for (const [cell, changes] of cellChanges) {\n // Build full snapshot: start from current formatting, roll back changed properties\n const currentFormatting = cell.getFormatting();\n const fullPrevProps: Record<string, unknown> = {};\n\n for (const [key, value] of Object.entries(currentFormatting)) {\n if (value !== undefined) {\n fullPrevProps[key] = value;\n }\n }\n\n // Roll back changed properties to their previous values\n let latestTimestamp = 0;\n for (const change of changes) {\n if (change.previousValue !== undefined) {\n fullPrevProps[change.property] = change.previousValue;\n } else {\n delete fullPrevProps[change.property];\n }\n if (change.timestamp > latestTimestamp) {\n latestTimestamp = change.timestamp;\n }\n }\n\n const date = formatDateForXml(new Date(latestTimestamp));\n\n const existing = cell.getTcPrChange();\n if (existing) {\n // Merge: existing previous state takes precedence (it's the ORIGINAL baseline)\n const merged = { ...fullPrevProps, ...(existing.previousProperties || {}) };\n cell.setTcPrChange({ ...existing, previousProperties: merged });\n } else {\n cell.setTcPrChange({\n author: this.author,\n date,\n id: String(this.revisionManager.consumeNextId()),\n previousProperties: fullPrevProps,\n });\n }\n }\n\n // Apply sectPrChange to each Section\n // Per ECMA-376 §17.13.5.32, sectPrChange must contain FULL previous sectPr,\n // not just the delta of changed properties.\n for (const [section, changes] of sectionChanges) {\n // Build full snapshot: start from current properties, roll back changed properties\n const currentProps = section.getProperties();\n const fullPrevProps: Record<string, unknown> = {};\n\n for (const [key, value] of Object.entries(currentProps)) {\n if (value !== undefined) {\n fullPrevProps[key] = value;\n }\n }\n\n // Roll back changed properties to their previous values\n let latestTimestamp = 0;\n for (const change of changes) {\n if (change.previousValue !== undefined) {\n fullPrevProps[change.property] = change.previousValue;\n } else {\n delete fullPrevProps[change.property];\n }\n if (change.timestamp > latestTimestamp) {\n latestTimestamp = change.timestamp;\n }\n }\n\n const date = formatDateForXml(new Date(latestTimestamp));\n\n const existing = section.getSectPrChange();\n if (existing) {\n // Merge: existing previous state takes precedence (it's the ORIGINAL baseline)\n const merged = { ...fullPrevProps, ...(existing.previousProperties || {}) };\n section.setSectPrChange({ ...existing, previousProperties: merged });\n } else {\n section.setSectPrChange({\n author: this.author,\n date,\n id: String(this.revisionManager.consumeNextId()),\n previousProperties: fullPrevProps,\n });\n }\n }\n\n // Apply rPrChange to each Run that has property changes\n for (const [run, changes] of runChanges) {\n this.applyRunPrChange(run, changes);\n }\n\n this.pendingChanges.clear();\n return revisions;\n }\n\n // ═══════════════════════════════════════════════════════════════════════════\n // Private Methods\n // ═══════════════════════════════════════════════════════════════════════════\n\n /**\n * Apply pPrChange to a paragraph (extracted from flushPendingChanges for readability)\n */\n private applyParagraphPrChange(paragraph: Paragraph, changes: PendingChange[]): void {\n const newPreviousProperties: Record<string, unknown> = {};\n let latestTimestamp = 0;\n\n for (const change of changes) {\n // Record previous value even if undefined (property wasn't set before)\n newPreviousProperties[change.property] = change.previousValue;\n if (change.timestamp > latestTimestamp) {\n latestTimestamp = change.timestamp;\n }\n }\n\n const existingChange = paragraph.formatting.pPrChange;\n\n if (existingChange) {\n const mergedPreviousProperties: Record<string, unknown> = {\n ...(existingChange.previousProperties || {}),\n };\n for (const [prop, value] of Object.entries(newPreviousProperties)) {\n mergedPreviousProperties[prop] = value;\n }\n paragraph.formatting.pPrChange = {\n author: existingChange.author,\n date: existingChange.date,\n id: existingChange.id,\n previousProperties: mergedPreviousProperties,\n };\n } else {\n const revisionId = this.revisionManager.consumeNextId();\n paragraph.formatting.pPrChange = {\n author: this.author,\n date: formatDateForXml(new Date(latestTimestamp)),\n id: String(revisionId),\n previousProperties: newPreviousProperties,\n };\n }\n }\n\n /**\n * Apply rPrChange to a run (mirrors applyParagraphPrChange for runs)\n */\n private applyRunPrChange(run: Run, changes: PendingChange[]): void {\n const newPreviousProperties: Partial<RunFormatting> = {};\n let latestTimestamp = 0;\n\n for (const change of changes) {\n (newPreviousProperties as Record<string, unknown>)[change.property] = change.previousValue;\n if (change.timestamp > latestTimestamp) {\n latestTimestamp = change.timestamp;\n }\n }\n\n const existingChange = run.getPropertyChangeRevision();\n\n if (existingChange) {\n // Merge with existing rPrChange — preserve original author/date,\n // add new previous properties\n const mergedPreviousProperties: Partial<RunFormatting> = {\n ...(existingChange.previousProperties || {}),\n ...newPreviousProperties,\n };\n run.setPropertyChangeRevision({\n ...existingChange,\n previousProperties: mergedPreviousProperties,\n });\n } else {\n const revisionId = this.revisionManager.consumeNextId();\n run.setPropertyChangeRevision({\n id: revisionId,\n author: this.author,\n date: new Date(latestTimestamp),\n previousProperties: newPreviousProperties,\n });\n }\n }\n\n /**\n * Generic helper to apply *PrChange to table/row/cell/section elements\n */\n private applyElementPrChange(\n changes: PendingChange[],\n applier: (prevProps: Record<string, unknown>, getNextId: () => number, date: string) => void\n ): void {\n const prevProps: Record<string, unknown> = {};\n let latestTimestamp = 0;\n\n for (const change of changes) {\n // Record previous value even if undefined (property wasn't set before)\n prevProps[change.property] = change.previousValue;\n if (change.timestamp > latestTimestamp) {\n latestTimestamp = change.timestamp;\n }\n }\n\n const date = formatDateForXml(new Date(latestTimestamp));\n applier(prevProps, () => this.revisionManager.consumeNextId(), date);\n }\n\n /**\n * Add a pending change, consolidating with existing if same key\n */\n private addPendingChange(key: string, change: PendingChange): void {\n const existing = this.pendingChanges.get(key);\n if (existing) {\n existing.count = (existing.count || 1) + 1;\n // Keep the first previousValue for consolidated changes\n } else {\n this.pendingChanges.set(key, { ...change, count: 1 });\n }\n }\n\n /**\n * Create a Revision from a pending change\n */\n private createRevision(pending: PendingChange): Revision {\n const previousProps: Record<string, any> = {};\n const newProps: Record<string, any> = {};\n\n if (pending.previousValue !== undefined) {\n previousProps[pending.property] = pending.previousValue;\n }\n if (pending.newValue !== undefined) {\n newProps[pending.property] = pending.newValue;\n }\n\n // Get or create a Run for the revision content\n const run = this.getRunFromElement(pending.element);\n\n return new Revision({\n author: this.author,\n type: pending.type,\n content: run,\n previousProperties: Object.keys(previousProps).length > 0 ? previousProps : undefined,\n newProperties: Object.keys(newProps).length > 0 ? newProps : undefined,\n date: new Date(pending.timestamp),\n });\n }\n\n /**\n * Get or create a Run from an element for revision content\n */\n private getRunFromElement(element: TrackableElement): Run {\n if (element instanceof Run) {\n return element;\n }\n\n // Use instanceof for type-safe element identification (minification-safe)\n if (element instanceof Table) return new Run('Table');\n if (element instanceof TableRow) return new Run('TableRow');\n if (element instanceof TableCell) return new Run('TableCell');\n if (element instanceof Section) return new Run('Section');\n if (element instanceof Paragraph) return new Run('Paragraph');\n\n // Fallback for other elements (e.g., Hyperlink)\n const hasGetText =\n 'getText' in element && typeof (element as { getText?: () => string }).getText === 'function';\n const text = hasGetText\n ? (element as { getText: () => string }).getText()\n : element?.constructor?.name || 'Unknown element';\n return new Run(typeof text === 'string' ? text : String(text));\n }\n\n /**\n * Get a stable unique ID for an element (used in consolidation keys)\n */\n private getElementId(element: TrackableElement): number {\n let id = this.elementIdMap.get(element as object);\n if (id === undefined) {\n id = this.elementIdCounter++;\n this.elementIdMap.set(element as object, id);\n }\n return id;\n }\n\n /**\n * Deep equality check for tracking values (handles objects, primitives, null/undefined)\n */\n private valuesEqual(a: unknown, b: unknown): boolean {\n if (a === b) return true;\n if (a == null || b == null) return false;\n if (typeof a !== 'object' || typeof b !== 'object') return false;\n return JSON.stringify(a) === JSON.stringify(b);\n }\n\n /**\n * Stringify a value for use in consolidation key\n */\n private stringifyValue(value: unknown): string {\n if (value === undefined) return 'undefined';\n if (value === null) return 'null';\n if (typeof value === 'object') {\n return JSON.stringify(value);\n }\n return String(value);\n }\n\n /**\n * Create an insertion revision (factory to avoid circular dependency in Run)\n */\n createInsertion(content: Run, date?: Date): Revision {\n return Revision.createInsertion(this.author, content, date);\n }\n\n /**\n * Create a deletion revision (factory to avoid circular dependency in Run)\n */\n createDeletion(content: Run, date?: Date): Revision {\n return Revision.createDeletion(this.author, content, date);\n }\n\n /**\n * Get count of pending changes\n */\n getPendingCount(): number {\n return this.pendingChanges.size;\n }\n\n /**\n * Check if there are pending changes\n */\n hasPendingChanges(): boolean {\n return this.pendingChanges.size > 0;\n }\n\n /**\n * Clear all pending changes without creating revisions\n */\n clearPendingChanges(): void {\n this.pendingChanges.clear();\n }\n}\n"]}
|
package/package.json
CHANGED
|
@@ -2643,7 +2643,7 @@ export class DocumentParser {
|
|
|
2643
2643
|
const tabs = Array.isArray(tabArray) ? tabArray : [tabArray];
|
|
2644
2644
|
previousProperties.tabs = tabs.map((tab: any) => ({
|
|
2645
2645
|
val: tab['@_w:val'],
|
|
2646
|
-
|
|
2646
|
+
position: tab['@_w:pos'] !== undefined ? parseInt(tab['@_w:pos'], 10) : undefined,
|
|
2647
2647
|
leader: tab['@_w:leader'],
|
|
2648
2648
|
}));
|
|
2649
2649
|
}
|
package/src/elements/Section.ts
CHANGED
|
@@ -616,7 +616,9 @@ export class Section {
|
|
|
616
616
|
* @param orientation Page orientation
|
|
617
617
|
*/
|
|
618
618
|
setOrientation(orientation: PageOrientation): this {
|
|
619
|
-
const
|
|
619
|
+
const prevOrientation = this.properties.pageSize?.orientation;
|
|
620
|
+
// Capture full pageSize BEFORE mutation for tracking
|
|
621
|
+
const prevPageSize = this.properties.pageSize ? { ...this.properties.pageSize } : undefined;
|
|
620
622
|
if (!this.properties.pageSize) {
|
|
621
623
|
this.properties.pageSize = {
|
|
622
624
|
width: PAGE_SIZES.LETTER.width,
|
|
@@ -635,8 +637,11 @@ export class Section {
|
|
|
635
637
|
this.properties.pageSize.height = temp;
|
|
636
638
|
}
|
|
637
639
|
|
|
638
|
-
if (this.trackingContext?.isEnabled() &&
|
|
639
|
-
|
|
640
|
+
if (this.trackingContext?.isEnabled() && prevOrientation !== orientation) {
|
|
641
|
+
// Track the full pageSize change (not just orientation) since width/height are swapped
|
|
642
|
+
this.trackingContext.trackSectionChange(this, 'pageSize', prevPageSize, {
|
|
643
|
+
...this.properties.pageSize,
|
|
644
|
+
});
|
|
640
645
|
}
|
|
641
646
|
return this;
|
|
642
647
|
}
|
|
@@ -1403,6 +1408,17 @@ export class Section {
|
|
|
1403
1408
|
})
|
|
1404
1409
|
);
|
|
1405
1410
|
}
|
|
1411
|
+
if (prev.docGrid) {
|
|
1412
|
+
const dgAttrs: Record<string, string> = {};
|
|
1413
|
+
if (prev.docGrid.type) dgAttrs['w:type'] = prev.docGrid.type;
|
|
1414
|
+
if (prev.docGrid.linePitch !== undefined)
|
|
1415
|
+
dgAttrs['w:linePitch'] = prev.docGrid.linePitch.toString();
|
|
1416
|
+
if (prev.docGrid.charSpace !== undefined)
|
|
1417
|
+
dgAttrs['w:charSpace'] = prev.docGrid.charSpace.toString();
|
|
1418
|
+
if (Object.keys(dgAttrs).length > 0) {
|
|
1419
|
+
prevChildren.push(XMLBuilder.wSelf('docGrid', dgAttrs));
|
|
1420
|
+
}
|
|
1421
|
+
}
|
|
1406
1422
|
}
|
|
1407
1423
|
const prevSectPr = XMLBuilder.w('sectPr', undefined, prevChildren);
|
|
1408
1424
|
children.push(XMLBuilder.w('sectPrChange', changeAttrs, [prevSectPr]));
|
package/src/elements/Table.ts
CHANGED
|
@@ -9,6 +9,8 @@ import { Run } from './Run';
|
|
|
9
9
|
import { Revision } from './Revision';
|
|
10
10
|
import { XMLBuilder, XMLElement } from '../xml/XMLBuilder';
|
|
11
11
|
import { deepClone } from '../utils/deepClone';
|
|
12
|
+
import { TableGridChange } from './TableGridChange';
|
|
13
|
+
import { formatDateForXml } from '../utils/dateFormatting';
|
|
12
14
|
import {
|
|
13
15
|
TableAlignment as CommonTableAlignment,
|
|
14
16
|
BorderStyle,
|
|
@@ -143,6 +145,23 @@ export interface TableCellMargins {
|
|
|
143
145
|
right?: number;
|
|
144
146
|
}
|
|
145
147
|
|
|
148
|
+
/**
|
|
149
|
+
* Builds tblLook attributes including extended attributes (firstRow, lastRow, etc.)
|
|
150
|
+
* Per ECMA-376 Part 1 §17.4.57, Word expects both w:val and the extended boolean attributes.
|
|
151
|
+
*/
|
|
152
|
+
function buildTblLookAttributes(hex: string): Record<string, string> {
|
|
153
|
+
const value = parseInt(hex, 16) || 0;
|
|
154
|
+
return {
|
|
155
|
+
'w:val': hex,
|
|
156
|
+
'w:firstRow': (value & 0x0020) !== 0 ? '1' : '0',
|
|
157
|
+
'w:lastRow': (value & 0x0040) !== 0 ? '1' : '0',
|
|
158
|
+
'w:firstColumn': (value & 0x0080) !== 0 ? '1' : '0',
|
|
159
|
+
'w:lastColumn': (value & 0x0100) !== 0 ? '1' : '0',
|
|
160
|
+
'w:noHBand': (value & 0x0200) !== 0 ? '1' : '0',
|
|
161
|
+
'w:noVBand': (value & 0x0400) !== 0 ? '1' : '0',
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
|
|
146
165
|
/**
|
|
147
166
|
* Table formatting options
|
|
148
167
|
*/
|
|
@@ -213,6 +232,8 @@ export class Table {
|
|
|
213
232
|
private trackingContext?: import('../tracking/TrackingContext').TrackingContext;
|
|
214
233
|
/** Table property change tracking (w:tblPrChange) */
|
|
215
234
|
private tblPrChange?: TblPrChange;
|
|
235
|
+
/** Table grid change tracking (w:tblGridChange) per ECMA-376 §17.13.5.35 */
|
|
236
|
+
private tblGridChange?: TableGridChange;
|
|
216
237
|
|
|
217
238
|
/**
|
|
218
239
|
* Creates a new Table
|
|
@@ -269,6 +290,20 @@ export class Table {
|
|
|
269
290
|
this.tblPrChange = undefined;
|
|
270
291
|
}
|
|
271
292
|
|
|
293
|
+
/**
|
|
294
|
+
* Gets the table grid change tracking info
|
|
295
|
+
*/
|
|
296
|
+
getTblGridChange(): TableGridChange | undefined {
|
|
297
|
+
return this.tblGridChange;
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
/**
|
|
301
|
+
* Sets the table grid change tracking info
|
|
302
|
+
*/
|
|
303
|
+
setTblGridChange(change: TableGridChange | undefined): void {
|
|
304
|
+
this.tblGridChange = change;
|
|
305
|
+
}
|
|
306
|
+
|
|
272
307
|
/**
|
|
273
308
|
* Adds a row to the table
|
|
274
309
|
*
|
|
@@ -1058,8 +1093,18 @@ export class Table {
|
|
|
1058
1093
|
setTableGrid(widths: number[]): this {
|
|
1059
1094
|
const prev = this.formatting.tableGrid;
|
|
1060
1095
|
this.formatting.tableGrid = widths;
|
|
1061
|
-
if (this.trackingContext?.isEnabled()) {
|
|
1062
|
-
|
|
1096
|
+
if (this.trackingContext?.isEnabled() && prev) {
|
|
1097
|
+
// Create tblGridChange (not tblPrChange) per ECMA-376 §17.13.5.35
|
|
1098
|
+
// Only create if there was a previous grid to record
|
|
1099
|
+
if (!this.tblGridChange) {
|
|
1100
|
+
const revisionManager = this.trackingContext.getRevisionManager();
|
|
1101
|
+
this.tblGridChange = TableGridChange.create(
|
|
1102
|
+
revisionManager.consumeNextId(),
|
|
1103
|
+
prev.map((w) => ({ width: w })),
|
|
1104
|
+
this.trackingContext.getAuthor(),
|
|
1105
|
+
new Date()
|
|
1106
|
+
);
|
|
1107
|
+
}
|
|
1063
1108
|
}
|
|
1064
1109
|
return this;
|
|
1065
1110
|
}
|
|
@@ -1587,7 +1632,9 @@ export class Table {
|
|
|
1587
1632
|
|
|
1588
1633
|
// 15. tblLook
|
|
1589
1634
|
if (this.formatting.tblLook) {
|
|
1590
|
-
tblPrChildren.push(
|
|
1635
|
+
tblPrChildren.push(
|
|
1636
|
+
XMLBuilder.wSelf('tblLook', buildTblLookAttributes(this.formatting.tblLook))
|
|
1637
|
+
);
|
|
1591
1638
|
}
|
|
1592
1639
|
|
|
1593
1640
|
// Add table caption (accessibility)
|
|
@@ -1683,7 +1730,7 @@ export class Table {
|
|
|
1683
1730
|
}
|
|
1684
1731
|
}
|
|
1685
1732
|
if (prev.tblLook) {
|
|
1686
|
-
prevTblPrChildren.push(XMLBuilder.wSelf('tblLook',
|
|
1733
|
+
prevTblPrChildren.push(XMLBuilder.wSelf('tblLook', buildTblLookAttributes(prev.tblLook)));
|
|
1687
1734
|
}
|
|
1688
1735
|
if (prev.tblStyleRowBandSize !== undefined) {
|
|
1689
1736
|
prevTblPrChildren.push(
|
|
@@ -1739,6 +1786,10 @@ export class Table {
|
|
|
1739
1786
|
tblGridChildren.push(XMLBuilder.wSelf('gridCol', { 'w:w': 2880 }));
|
|
1740
1787
|
}
|
|
1741
1788
|
}
|
|
1789
|
+
// Add tblGridChange if present (per ECMA-376 §17.13.5.35, must be last child of tblGrid)
|
|
1790
|
+
if (this.tblGridChange) {
|
|
1791
|
+
tblGridChildren.push(this.tblGridChange.toXML());
|
|
1792
|
+
}
|
|
1742
1793
|
tableChildren.push(XMLBuilder.w('tblGrid', undefined, tblGridChildren));
|
|
1743
1794
|
|
|
1744
1795
|
// Add rows
|
|
@@ -1466,8 +1466,8 @@ export class TableCell {
|
|
|
1466
1466
|
const prevTcPrChildren: XMLElement[] = [];
|
|
1467
1467
|
const prev = this.tcPrChange.previousProperties;
|
|
1468
1468
|
if (prev) {
|
|
1469
|
-
// Ordered per CT_TcPr: tcW →
|
|
1470
|
-
// textDirection → tcFitText → vAlign → hideMark → cnfStyle
|
|
1469
|
+
// Ordered per CT_TcPr: tcW → gridSpan → hMerge → vMerge → tcBorders → shd →
|
|
1470
|
+
// noWrap → tcMar → textDirection → tcFitText → vAlign → hideMark → cnfStyle
|
|
1471
1471
|
if (prev.width !== undefined) {
|
|
1472
1472
|
prevTcPrChildren.push(
|
|
1473
1473
|
XMLBuilder.wSelf('tcW', {
|
|
@@ -1476,6 +1476,19 @@ export class TableCell {
|
|
|
1476
1476
|
})
|
|
1477
1477
|
);
|
|
1478
1478
|
}
|
|
1479
|
+
if (prev.columnSpan && prev.columnSpan > 1) {
|
|
1480
|
+
prevTcPrChildren.push(XMLBuilder.wSelf('gridSpan', { 'w:val': prev.columnSpan }));
|
|
1481
|
+
}
|
|
1482
|
+
if (prev.hMerge) {
|
|
1483
|
+
prevTcPrChildren.push(XMLBuilder.wSelf('hMerge', { 'w:val': prev.hMerge }));
|
|
1484
|
+
}
|
|
1485
|
+
if (prev.vMerge) {
|
|
1486
|
+
if (prev.vMerge === 'restart') {
|
|
1487
|
+
prevTcPrChildren.push(XMLBuilder.wSelf('vMerge', { 'w:val': 'restart' }));
|
|
1488
|
+
} else {
|
|
1489
|
+
prevTcPrChildren.push(XMLBuilder.wSelf('vMerge'));
|
|
1490
|
+
}
|
|
1491
|
+
}
|
|
1479
1492
|
if (prev.borders) {
|
|
1480
1493
|
const borderElements: XMLElement[] = [];
|
|
1481
1494
|
if (prev.borders.top)
|
|
@@ -403,39 +403,91 @@ export class DocumentTrackingContext implements TrackingContext {
|
|
|
403
403
|
}
|
|
404
404
|
|
|
405
405
|
// Apply tcPrChange to each TableCell
|
|
406
|
+
// Per ECMA-376 §17.13.5.37, tcPrChange must contain FULL previous tcPr,
|
|
407
|
+
// not just the delta of changed properties.
|
|
406
408
|
for (const [cell, changes] of cellChanges) {
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
409
|
+
// Build full snapshot: start from current formatting, roll back changed properties
|
|
410
|
+
const currentFormatting = cell.getFormatting();
|
|
411
|
+
const fullPrevProps: Record<string, unknown> = {};
|
|
412
|
+
|
|
413
|
+
for (const [key, value] of Object.entries(currentFormatting)) {
|
|
414
|
+
if (value !== undefined) {
|
|
415
|
+
fullPrevProps[key] = value;
|
|
416
|
+
}
|
|
417
|
+
}
|
|
418
|
+
|
|
419
|
+
// Roll back changed properties to their previous values
|
|
420
|
+
let latestTimestamp = 0;
|
|
421
|
+
for (const change of changes) {
|
|
422
|
+
if (change.previousValue !== undefined) {
|
|
423
|
+
fullPrevProps[change.property] = change.previousValue;
|
|
412
424
|
} else {
|
|
413
|
-
|
|
414
|
-
author: this.author,
|
|
415
|
-
date,
|
|
416
|
-
id: String(getNextId()),
|
|
417
|
-
previousProperties: prevProps,
|
|
418
|
-
});
|
|
425
|
+
delete fullPrevProps[change.property];
|
|
419
426
|
}
|
|
420
|
-
|
|
427
|
+
if (change.timestamp > latestTimestamp) {
|
|
428
|
+
latestTimestamp = change.timestamp;
|
|
429
|
+
}
|
|
430
|
+
}
|
|
431
|
+
|
|
432
|
+
const date = formatDateForXml(new Date(latestTimestamp));
|
|
433
|
+
|
|
434
|
+
const existing = cell.getTcPrChange();
|
|
435
|
+
if (existing) {
|
|
436
|
+
// Merge: existing previous state takes precedence (it's the ORIGINAL baseline)
|
|
437
|
+
const merged = { ...fullPrevProps, ...(existing.previousProperties || {}) };
|
|
438
|
+
cell.setTcPrChange({ ...existing, previousProperties: merged });
|
|
439
|
+
} else {
|
|
440
|
+
cell.setTcPrChange({
|
|
441
|
+
author: this.author,
|
|
442
|
+
date,
|
|
443
|
+
id: String(this.revisionManager.consumeNextId()),
|
|
444
|
+
previousProperties: fullPrevProps,
|
|
445
|
+
});
|
|
446
|
+
}
|
|
421
447
|
}
|
|
422
448
|
|
|
423
449
|
// Apply sectPrChange to each Section
|
|
450
|
+
// Per ECMA-376 §17.13.5.32, sectPrChange must contain FULL previous sectPr,
|
|
451
|
+
// not just the delta of changed properties.
|
|
424
452
|
for (const [section, changes] of sectionChanges) {
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
453
|
+
// Build full snapshot: start from current properties, roll back changed properties
|
|
454
|
+
const currentProps = section.getProperties();
|
|
455
|
+
const fullPrevProps: Record<string, unknown> = {};
|
|
456
|
+
|
|
457
|
+
for (const [key, value] of Object.entries(currentProps)) {
|
|
458
|
+
if (value !== undefined) {
|
|
459
|
+
fullPrevProps[key] = value;
|
|
460
|
+
}
|
|
461
|
+
}
|
|
462
|
+
|
|
463
|
+
// Roll back changed properties to their previous values
|
|
464
|
+
let latestTimestamp = 0;
|
|
465
|
+
for (const change of changes) {
|
|
466
|
+
if (change.previousValue !== undefined) {
|
|
467
|
+
fullPrevProps[change.property] = change.previousValue;
|
|
430
468
|
} else {
|
|
431
|
-
|
|
432
|
-
author: this.author,
|
|
433
|
-
date,
|
|
434
|
-
id: String(getNextId()),
|
|
435
|
-
previousProperties: prevProps,
|
|
436
|
-
});
|
|
469
|
+
delete fullPrevProps[change.property];
|
|
437
470
|
}
|
|
438
|
-
|
|
471
|
+
if (change.timestamp > latestTimestamp) {
|
|
472
|
+
latestTimestamp = change.timestamp;
|
|
473
|
+
}
|
|
474
|
+
}
|
|
475
|
+
|
|
476
|
+
const date = formatDateForXml(new Date(latestTimestamp));
|
|
477
|
+
|
|
478
|
+
const existing = section.getSectPrChange();
|
|
479
|
+
if (existing) {
|
|
480
|
+
// Merge: existing previous state takes precedence (it's the ORIGINAL baseline)
|
|
481
|
+
const merged = { ...fullPrevProps, ...(existing.previousProperties || {}) };
|
|
482
|
+
section.setSectPrChange({ ...existing, previousProperties: merged });
|
|
483
|
+
} else {
|
|
484
|
+
section.setSectPrChange({
|
|
485
|
+
author: this.author,
|
|
486
|
+
date,
|
|
487
|
+
id: String(this.revisionManager.consumeNextId()),
|
|
488
|
+
previousProperties: fullPrevProps,
|
|
489
|
+
});
|
|
490
|
+
}
|
|
439
491
|
}
|
|
440
492
|
|
|
441
493
|
// Apply rPrChange to each Run that has property changes
|