docxmlater 10.0.4 → 10.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/core/Document.d.ts +22 -0
- package/dist/core/Document.d.ts.map +1 -1
- package/dist/core/Document.js +170 -26
- package/dist/core/Document.js.map +1 -1
- package/dist/core/DocumentParser.d.ts.map +1 -1
- package/dist/core/DocumentParser.js +64 -1
- package/dist/core/DocumentParser.js.map +1 -1
- package/dist/elements/Hyperlink.d.ts +6 -0
- package/dist/elements/Hyperlink.d.ts.map +1 -1
- package/dist/elements/Hyperlink.js +23 -0
- package/dist/elements/Hyperlink.js.map +1 -1
- package/dist/elements/StructuredDocumentTag.d.ts +23 -1
- package/dist/elements/StructuredDocumentTag.d.ts.map +1 -1
- package/dist/elements/StructuredDocumentTag.js +97 -0
- package/dist/elements/StructuredDocumentTag.js.map +1 -1
- package/dist/elements/TableCell.d.ts +5 -0
- package/dist/elements/TableCell.d.ts.map +1 -1
- package/dist/elements/TableCell.js +13 -0
- package/dist/elements/TableCell.js.map +1 -1
- package/dist/elements/TableRow.d.ts +3 -0
- package/dist/elements/TableRow.d.ts.map +1 -1
- package/dist/elements/TableRow.js +10 -0
- package/dist/elements/TableRow.js.map +1 -1
- package/dist/formatting/AbstractNumbering.d.ts +4 -0
- package/dist/formatting/AbstractNumbering.d.ts.map +1 -1
- package/dist/formatting/AbstractNumbering.js +15 -0
- package/dist/formatting/AbstractNumbering.js.map +1 -1
- package/dist/formatting/NumberingInstance.d.ts +6 -0
- package/dist/formatting/NumberingInstance.d.ts.map +1 -1
- package/dist/formatting/NumberingInstance.js +55 -1
- package/dist/formatting/NumberingInstance.js.map +1 -1
- package/dist/formatting/NumberingLevel.d.ts +4 -1
- package/dist/formatting/NumberingLevel.d.ts.map +1 -1
- package/dist/formatting/NumberingLevel.js +17 -0
- package/dist/formatting/NumberingLevel.js.map +1 -1
- package/dist/formatting/Style.d.ts +6 -0
- package/dist/formatting/Style.d.ts.map +1 -1
- package/dist/formatting/Style.js +20 -0
- package/dist/formatting/Style.js.map +1 -1
- package/dist/formatting/StylesManager.d.ts +23 -0
- package/dist/formatting/StylesManager.d.ts.map +1 -1
- package/dist/formatting/StylesManager.js +65 -0
- package/dist/formatting/StylesManager.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/tracking/DocumentTrackingContext.d.ts.map +1 -1
- package/dist/tracking/DocumentTrackingContext.js +30 -7
- package/dist/tracking/DocumentTrackingContext.js.map +1 -1
- package/package.json +1 -1
- package/src/core/Document.ts +287 -31
- package/src/core/DocumentParser.ts +76 -1
- package/src/elements/Hyperlink.ts +47 -0
- package/src/elements/StructuredDocumentTag.ts +230 -1
- package/src/elements/TableCell.ts +36 -1
- package/src/elements/TableRow.ts +24 -1
- package/src/formatting/AbstractNumbering.ts +31 -0
- package/src/formatting/NumberingInstance.ts +88 -1
- package/src/formatting/NumberingLevel.ts +37 -3
- package/src/formatting/Style.ts +46 -0
- package/src/formatting/StylesManager.ts +125 -0
- package/src/index.ts +2 -2
- package/src/tracking/DocumentTrackingContext.ts +38 -7
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DocumentTrackingContext.js","sourceRoot":"","sources":["../../src/tracking/DocumentTrackingContext.ts"],"names":[],"mappings":"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","sourcesContent":["/**\r\n * DocumentTrackingContext - Implementation of automatic change tracking\r\n *\r\n * Manages pending changes and creates Revision objects when flushed.\r\n * Supports consolidation of similar changes within a time window.\r\n *\r\n * @module DocumentTrackingContext\r\n */\r\n\r\nimport { Revision, RevisionType } from '../elements/Revision';\r\nimport { RevisionManager } from '../elements/RevisionManager';\r\nimport { Run, type RunFormatting } from '../elements/Run';\r\nimport { Paragraph } from '../elements/Paragraph';\r\nimport { Table } from '../elements/Table';\r\nimport { TableRow } from '../elements/TableRow';\r\nimport { TableCell } from '../elements/TableCell';\r\nimport { Section } from '../elements/Section';\r\nimport type { TrackingContext, PendingChange, TrackableElement } from './TrackingContext';\r\nimport { formatDateForXml } from '../utils/dateFormatting';\r\n\r\n/**\r\n * Enable options for tracking context\r\n */\r\nexport interface TrackingEnableOptions {\r\n /** Author name for new revisions (default: 'DocHub') */\r\n author?: string;\r\n /** Whether to track formatting changes (default: true) */\r\n trackFormatting?: boolean;\r\n}\r\n\r\n/**\r\n * Implementation of TrackingContext for Document\r\n */\r\nexport class DocumentTrackingContext implements TrackingContext {\r\n private enabled = false;\r\n private trackFormatting = true;\r\n private author = 'DocHub';\r\n private revisionManager: RevisionManager;\r\n\r\n /** Counter for assigning stable element IDs */\r\n private elementIdCounter = 0;\r\n /** Stable element identity map (WeakMap so elements can be GC'd) */\r\n private elementIdMap = new WeakMap<object, number>();\r\n\r\n /** Pending changes waiting to be flushed */\r\n private pendingChanges = new Map<string, PendingChange>();\r\n\r\n /** Properties considered \"formatting\" (vs structural) */\r\n private static readonly FORMATTING_PROPERTIES = new Set([\r\n 'bold',\r\n 'italic',\r\n 'underline',\r\n 'strike',\r\n 'dstrike',\r\n 'subscript',\r\n 'superscript',\r\n 'font',\r\n 'size',\r\n 'color',\r\n 'highlight',\r\n 'smallCaps',\r\n 'allCaps',\r\n 'characterSpacing',\r\n 'scaling',\r\n 'position',\r\n 'emphasis',\r\n 'shadow',\r\n 'emboss',\r\n 'imprint',\r\n 'outline',\r\n 'vanish',\r\n ]);\r\n\r\n /**\r\n * Creates a new DocumentTrackingContext\r\n * @param revisionManager - RevisionManager to register revisions with\r\n */\r\n constructor(revisionManager: RevisionManager) {\r\n this.revisionManager = revisionManager;\r\n }\r\n\r\n /**\r\n * Enable change tracking\r\n * @param options - Enable options\r\n */\r\n enable(options?: TrackingEnableOptions): void {\r\n this.enabled = true;\r\n if (options?.author) {\r\n this.author = options.author;\r\n }\r\n if (options?.trackFormatting !== undefined) {\r\n this.trackFormatting = options.trackFormatting;\r\n }\r\n }\r\n\r\n /**\r\n * Disable change tracking and flush pending changes\r\n */\r\n disable(): void {\r\n this.flushPendingChanges();\r\n this.enabled = false;\r\n }\r\n\r\n /**\r\n * Set the author for new revisions\r\n * Flushes any pending changes before switching to prevent mixed authorship\r\n * @param author - Author name\r\n */\r\n setAuthor(author: string): void {\r\n // Flush pending changes before switching authors to prevent mixed authorship\r\n if (this.enabled && this.pendingChanges.size > 0) {\r\n this.flushPendingChanges();\r\n }\r\n this.author = author;\r\n }\r\n\r\n // ═══════════════════════════════════════════════════════════════════════════\r\n // TrackingContext Interface Implementation\r\n // ═══════════════════════════════════════════════════════════════════════════\r\n\r\n isEnabled(): boolean {\r\n return this.enabled;\r\n }\r\n\r\n getAuthor(): string {\r\n return this.author;\r\n }\r\n\r\n getRevisionManager(): RevisionManager {\r\n return this.revisionManager;\r\n }\r\n\r\n isTrackFormattingEnabled(): boolean {\r\n return this.trackFormatting;\r\n }\r\n\r\n trackRunPropertyChange(\r\n run: Run,\r\n property: string,\r\n oldValue: unknown,\r\n newValue: unknown\r\n ): void {\r\n if (!this.enabled) return;\r\n if (this.valuesEqual(oldValue, newValue)) return;\r\n\r\n // Skip formatting changes if not tracking them\r\n if (\r\n !this.trackFormatting &&\r\n DocumentTrackingContext.FORMATTING_PROPERTIES.has(property)\r\n ) {\r\n return;\r\n }\r\n\r\n // Create consolidation key with element identity\r\n const key = `runProp:${property}:${this.stringifyValue(newValue)}@${this.getElementId(run)}`;\r\n\r\n this.addPendingChange(key, {\r\n type: 'runPropertiesChange',\r\n property,\r\n previousValue: oldValue,\r\n newValue,\r\n element: run,\r\n timestamp: Date.now(),\r\n });\r\n }\r\n\r\n trackParagraphPropertyChange(\r\n paragraph: TrackableElement,\r\n property: string,\r\n oldValue: unknown,\r\n newValue: unknown\r\n ): void {\r\n if (!this.enabled) return;\r\n if (this.valuesEqual(oldValue, newValue)) return;\r\n\r\n const key = `paraProp:${property}:${this.stringifyValue(newValue)}@${this.getElementId(paragraph)}`;\r\n\r\n this.addPendingChange(key, {\r\n type: 'paragraphPropertiesChange',\r\n property,\r\n previousValue: oldValue,\r\n newValue,\r\n element: paragraph,\r\n timestamp: Date.now(),\r\n });\r\n }\r\n\r\n trackHyperlinkChange(\r\n hyperlink: TrackableElement,\r\n changeType: string,\r\n oldValue: unknown,\r\n newValue: unknown\r\n ): void {\r\n if (!this.enabled) return;\r\n if (this.valuesEqual(oldValue, newValue)) return;\r\n\r\n // Hyperlink changes use dedicated type for proper categorization\r\n const key = `hyperlink:${changeType}:${this.stringifyValue(newValue)}@${this.getElementId(hyperlink)}`;\r\n\r\n this.addPendingChange(key, {\r\n type: 'hyperlinkChange',\r\n property: changeType,\r\n previousValue: oldValue,\r\n newValue,\r\n element: hyperlink,\r\n timestamp: Date.now(),\r\n });\r\n }\r\n\r\n trackTableChange(\r\n element: TrackableElement,\r\n property: string,\r\n oldValue: unknown,\r\n newValue: unknown\r\n ): void {\r\n if (!this.enabled) return;\r\n if (this.valuesEqual(oldValue, newValue)) return;\r\n\r\n // Determine revision type based on element type using instanceof (minification-safe)\r\n let type: RevisionType = 'tablePropertiesChange';\r\n let elementType = 'Table';\r\n\r\n if (element instanceof TableRow) {\r\n type = 'tableRowPropertiesChange';\r\n elementType = 'TableRow';\r\n } else if (element instanceof TableCell) {\r\n type = 'tableCellPropertiesChange';\r\n elementType = 'TableCell';\r\n }\r\n\r\n const key = `table:${elementType}:${property}:${this.stringifyValue(newValue)}@${this.getElementId(element)}`;\r\n\r\n this.addPendingChange(key, {\r\n type,\r\n property,\r\n previousValue: oldValue,\r\n newValue,\r\n element,\r\n timestamp: Date.now(),\r\n });\r\n }\r\n\r\n trackSectionChange(\r\n section: TrackableElement,\r\n property: string,\r\n oldValue: unknown,\r\n newValue: unknown\r\n ): void {\r\n if (!this.enabled) return;\r\n if (this.valuesEqual(oldValue, newValue)) return;\r\n\r\n const key = `section:${property}:${this.stringifyValue(newValue)}@${this.getElementId(section)}`;\r\n\r\n this.addPendingChange(key, {\r\n type: 'sectionPropertiesChange',\r\n property,\r\n previousValue: oldValue,\r\n newValue,\r\n element: section,\r\n timestamp: Date.now(),\r\n });\r\n }\r\n\r\n trackInsertion(element: TrackableElement, text: string): void {\r\n if (!this.enabled) return;\r\n if (!text) return;\r\n\r\n const key = `insert:${Date.now()}:${text.substring(0, 20)}`;\r\n\r\n this.addPendingChange(key, {\r\n type: 'insert',\r\n property: 'text',\r\n previousValue: undefined,\r\n newValue: text,\r\n element,\r\n timestamp: Date.now(),\r\n });\r\n }\r\n\r\n trackDeletion(element: TrackableElement, text: string): void {\r\n if (!this.enabled) return;\r\n if (!text) return;\r\n\r\n const key = `delete:${Date.now()}:${text.substring(0, 20)}`;\r\n\r\n this.addPendingChange(key, {\r\n type: 'delete',\r\n property: 'text',\r\n previousValue: text,\r\n newValue: undefined,\r\n element,\r\n timestamp: Date.now(),\r\n });\r\n }\r\n\r\n flushPendingChanges(): Revision[] {\r\n const revisions: Revision[] = [];\r\n\r\n // Group pending changes by element for consolidation\r\n const paragraphChanges = new Map<Paragraph, PendingChange[]>();\r\n const tableChanges = new Map<Table, PendingChange[]>();\r\n const rowChanges = new Map<TableRow, PendingChange[]>();\r\n const cellChanges = new Map<TableCell, PendingChange[]>();\r\n const sectionChanges = new Map<Section, PendingChange[]>();\r\n const runChanges = new Map<Run, PendingChange[]>();\r\n\r\n for (const [, pending] of this.pendingChanges) {\r\n const revision = this.createRevision(pending);\r\n this.revisionManager.register(revision);\r\n revisions.push(revision);\r\n\r\n // Collect changes by element type for *PrChange application\r\n if (pending.type === 'paragraphPropertiesChange' && pending.element instanceof Paragraph) {\r\n const changes = paragraphChanges.get(pending.element) || [];\r\n changes.push(pending);\r\n paragraphChanges.set(pending.element, changes);\r\n } else if (pending.type === 'tablePropertiesChange' && pending.element instanceof Table) {\r\n const changes = tableChanges.get(pending.element) || [];\r\n changes.push(pending);\r\n tableChanges.set(pending.element, changes);\r\n } else if (pending.type === 'tableRowPropertiesChange' && pending.element instanceof TableRow) {\r\n const changes = rowChanges.get(pending.element) || [];\r\n changes.push(pending);\r\n rowChanges.set(pending.element, changes);\r\n } else if (pending.type === 'tableCellPropertiesChange' && pending.element instanceof TableCell) {\r\n const changes = cellChanges.get(pending.element) || [];\r\n changes.push(pending);\r\n cellChanges.set(pending.element, changes);\r\n } else if (pending.type === 'sectionPropertiesChange' && pending.element instanceof Section) {\r\n const changes = sectionChanges.get(pending.element) || [];\r\n changes.push(pending);\r\n sectionChanges.set(pending.element, changes);\r\n } else if (pending.type === 'runPropertiesChange' && pending.element instanceof Run) {\r\n const changes = runChanges.get(pending.element) || [];\r\n changes.push(pending);\r\n runChanges.set(pending.element, changes);\r\n }\r\n }\r\n\r\n // Apply pPrChange to each paragraph that has property changes\r\n for (const [paragraph, changes] of paragraphChanges) {\r\n this.applyParagraphPrChange(paragraph, changes);\r\n }\r\n\r\n // Apply tblPrChange to each Table\r\n for (const [table, changes] of tableChanges) {\r\n this.applyElementPrChange(changes, (prevProps, getNextId, date) => {\r\n const existing = table.getTblPrChange();\r\n if (existing) {\r\n const merged = { ...(existing.previousProperties || {}), ...prevProps };\r\n table.setTblPrChange({ ...existing, previousProperties: merged });\r\n } else {\r\n table.setTblPrChange({ author: this.author, date, id: String(getNextId()), previousProperties: prevProps });\r\n }\r\n });\r\n }\r\n\r\n // Apply trPrChange to each TableRow\r\n for (const [row, changes] of rowChanges) {\r\n this.applyElementPrChange(changes, (prevProps, getNextId, date) => {\r\n const existing = row.getTrPrChange();\r\n if (existing) {\r\n const merged = { ...(existing.previousProperties || {}), ...prevProps };\r\n row.setTrPrChange({ ...existing, previousProperties: merged });\r\n } else {\r\n row.setTrPrChange({ author: this.author, date, id: String(getNextId()), previousProperties: prevProps });\r\n }\r\n });\r\n }\r\n\r\n // Apply tcPrChange to each TableCell\r\n for (const [cell, changes] of cellChanges) {\r\n this.applyElementPrChange(changes, (prevProps, getNextId, date) => {\r\n const existing = cell.getTcPrChange();\r\n if (existing) {\r\n const merged = { ...(existing.previousProperties || {}), ...prevProps };\r\n cell.setTcPrChange({ ...existing, previousProperties: merged });\r\n } else {\r\n cell.setTcPrChange({ author: this.author, date, id: String(getNextId()), previousProperties: prevProps });\r\n }\r\n });\r\n }\r\n\r\n // Apply sectPrChange to each Section\r\n for (const [section, changes] of sectionChanges) {\r\n this.applyElementPrChange(changes, (prevProps, getNextId, date) => {\r\n const existing = section.getSectPrChange();\r\n if (existing) {\r\n const merged = { ...(existing.previousProperties || {}), ...prevProps };\r\n section.setSectPrChange({ ...existing, previousProperties: merged });\r\n } else {\r\n section.setSectPrChange({ author: this.author, date, id: String(getNextId()), previousProperties: prevProps });\r\n }\r\n });\r\n }\r\n\r\n // Apply rPrChange to each Run that has property changes\r\n for (const [run, changes] of runChanges) {\r\n this.applyRunPrChange(run, changes);\r\n }\r\n\r\n this.pendingChanges.clear();\r\n return revisions;\r\n }\r\n\r\n // ═══════════════════════════════════════════════════════════════════════════\r\n // Private Methods\r\n // ═══════════════════════════════════════════════════════════════════════════\r\n\r\n /**\r\n * Apply pPrChange to a paragraph (extracted from flushPendingChanges for readability)\r\n */\r\n private applyParagraphPrChange(paragraph: Paragraph, changes: PendingChange[]): void {\r\n const newPreviousProperties: Record<string, unknown> = {};\r\n let latestTimestamp = 0;\r\n\r\n for (const change of changes) {\r\n // Record previous value even if undefined (property wasn't set before)\r\n newPreviousProperties[change.property] = change.previousValue;\r\n if (change.timestamp > latestTimestamp) {\r\n latestTimestamp = change.timestamp;\r\n }\r\n }\r\n\r\n const existingChange = paragraph.formatting.pPrChange;\r\n\r\n if (existingChange) {\r\n const mergedPreviousProperties: Record<string, unknown> = {\r\n ...(existingChange.previousProperties || {}),\r\n };\r\n for (const [prop, value] of Object.entries(newPreviousProperties)) {\r\n mergedPreviousProperties[prop] = value;\r\n }\r\n paragraph.formatting.pPrChange = {\r\n author: existingChange.author,\r\n date: existingChange.date,\r\n id: existingChange.id,\r\n previousProperties: mergedPreviousProperties,\r\n };\r\n } else {\r\n const revisionId = this.revisionManager.consumeNextId();\r\n paragraph.formatting.pPrChange = {\r\n author: this.author,\r\n date: formatDateForXml(new Date(latestTimestamp)),\r\n id: String(revisionId),\r\n previousProperties: newPreviousProperties,\r\n };\r\n }\r\n }\r\n\r\n /**\r\n * Apply rPrChange to a run (mirrors applyParagraphPrChange for runs)\r\n */\r\n private applyRunPrChange(run: Run, changes: PendingChange[]): void {\r\n const newPreviousProperties: Partial<RunFormatting> = {};\r\n let latestTimestamp = 0;\r\n\r\n for (const change of changes) {\r\n (newPreviousProperties as Record<string, unknown>)[change.property] = change.previousValue;\r\n if (change.timestamp > latestTimestamp) {\r\n latestTimestamp = change.timestamp;\r\n }\r\n }\r\n\r\n const existingChange = run.getPropertyChangeRevision();\r\n\r\n if (existingChange) {\r\n // Merge with existing rPrChange — preserve original author/date,\r\n // add new previous properties\r\n const mergedPreviousProperties: Partial<RunFormatting> = {\r\n ...(existingChange.previousProperties || {}),\r\n ...newPreviousProperties,\r\n };\r\n run.setPropertyChangeRevision({\r\n ...existingChange,\r\n previousProperties: mergedPreviousProperties,\r\n });\r\n } else {\r\n const revisionId = this.revisionManager.consumeNextId();\r\n run.setPropertyChangeRevision({\r\n id: revisionId,\r\n author: this.author,\r\n date: new Date(latestTimestamp),\r\n previousProperties: newPreviousProperties,\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Generic helper to apply *PrChange to table/row/cell/section elements\r\n */\r\n private applyElementPrChange(\r\n changes: PendingChange[],\r\n applier: (prevProps: Record<string, unknown>, getNextId: () => number, date: string) => void\r\n ): void {\r\n const prevProps: Record<string, unknown> = {};\r\n let latestTimestamp = 0;\r\n\r\n for (const change of changes) {\r\n // Record previous value even if undefined (property wasn't set before)\r\n prevProps[change.property] = change.previousValue;\r\n if (change.timestamp > latestTimestamp) {\r\n latestTimestamp = change.timestamp;\r\n }\r\n }\r\n\r\n const date = formatDateForXml(new Date(latestTimestamp));\r\n applier(prevProps, () => this.revisionManager.consumeNextId(), date);\r\n }\r\n\r\n /**\r\n * Add a pending change, consolidating with existing if same key\r\n */\r\n private addPendingChange(key: string, change: PendingChange): void {\r\n const existing = this.pendingChanges.get(key);\r\n if (existing) {\r\n existing.count = (existing.count || 1) + 1;\r\n // Keep the first previousValue for consolidated changes\r\n } else {\r\n this.pendingChanges.set(key, { ...change, count: 1 });\r\n }\r\n }\r\n\r\n /**\r\n * Create a Revision from a pending change\r\n */\r\n private createRevision(pending: PendingChange): Revision {\r\n const previousProps: Record<string, any> = {};\r\n const newProps: Record<string, any> = {};\r\n\r\n if (pending.previousValue !== undefined) {\r\n previousProps[pending.property] = pending.previousValue;\r\n }\r\n if (pending.newValue !== undefined) {\r\n newProps[pending.property] = pending.newValue;\r\n }\r\n\r\n // Get or create a Run for the revision content\r\n const run = this.getRunFromElement(pending.element);\r\n\r\n return new Revision({\r\n author: this.author,\r\n type: pending.type,\r\n content: run,\r\n previousProperties:\r\n Object.keys(previousProps).length > 0 ? previousProps : undefined,\r\n newProperties: Object.keys(newProps).length > 0 ? newProps : undefined,\r\n date: new Date(pending.timestamp),\r\n });\r\n }\r\n\r\n /**\r\n * Get or create a Run from an element for revision content\r\n */\r\n private getRunFromElement(element: TrackableElement): Run {\r\n if (element instanceof Run) {\r\n return element;\r\n }\r\n\r\n // Use instanceof for type-safe element identification (minification-safe)\r\n if (element instanceof Table) return new Run('Table');\r\n if (element instanceof TableRow) return new Run('TableRow');\r\n if (element instanceof TableCell) return new Run('TableCell');\r\n if (element instanceof Section) return new Run('Section');\r\n if (element instanceof Paragraph) return new Run('Paragraph');\r\n\r\n // Fallback for other elements (e.g., Hyperlink)\r\n const hasGetText = 'getText' in element && typeof (element as { getText?: () => string }).getText === 'function';\r\n const text = hasGetText\r\n ? (element as { getText: () => string }).getText()\r\n : element?.constructor?.name || 'Unknown element';\r\n return new Run(typeof text === 'string' ? text : String(text));\r\n }\r\n\r\n /**\r\n * Get a stable unique ID for an element (used in consolidation keys)\r\n */\r\n private getElementId(element: TrackableElement): number {\r\n let id = this.elementIdMap.get(element as object);\r\n if (id === undefined) {\r\n id = this.elementIdCounter++;\r\n this.elementIdMap.set(element as object, id);\r\n }\r\n return id;\r\n }\r\n\r\n /**\r\n * Deep equality check for tracking values (handles objects, primitives, null/undefined)\r\n */\r\n private valuesEqual(a: unknown, b: unknown): boolean {\r\n if (a === b) return true;\r\n if (a == null || b == null) return false;\r\n if (typeof a !== 'object' || typeof b !== 'object') return false;\r\n return JSON.stringify(a) === JSON.stringify(b);\r\n }\r\n\r\n /**\r\n * Stringify a value for use in consolidation key\r\n */\r\n private stringifyValue(value: unknown): string {\r\n if (value === undefined) return 'undefined';\r\n if (value === null) return 'null';\r\n if (typeof value === 'object') {\r\n return JSON.stringify(value);\r\n }\r\n return String(value);\r\n }\r\n\r\n /**\r\n * Create an insertion revision (factory to avoid circular dependency in Run)\r\n */\r\n createInsertion(content: Run, date?: Date): Revision {\r\n return Revision.createInsertion(this.author, content, date);\r\n }\r\n\r\n /**\r\n * Create a deletion revision (factory to avoid circular dependency in Run)\r\n */\r\n createDeletion(content: Run, date?: Date): Revision {\r\n return Revision.createDeletion(this.author, content, date);\r\n }\r\n\r\n /**\r\n * Get count of pending changes\r\n */\r\n getPendingCount(): number {\r\n return this.pendingChanges.size;\r\n }\r\n\r\n /**\r\n * Check if there are pending changes\r\n */\r\n hasPendingChanges(): boolean {\r\n return this.pendingChanges.size > 0;\r\n }\r\n\r\n /**\r\n * Clear all pending changes without creating revisions\r\n */\r\n clearPendingChanges(): void {\r\n this.pendingChanges.clear();\r\n }\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"DocumentTrackingContext.js","sourceRoot":"","sources":["../../src/tracking/DocumentTrackingContext.ts"],"names":[],"mappings":"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","sourcesContent":["/**\r\n * DocumentTrackingContext - Implementation of automatic change tracking\r\n *\r\n * Manages pending changes and creates Revision objects when flushed.\r\n * Supports consolidation of similar changes within a time window.\r\n *\r\n * @module DocumentTrackingContext\r\n */\r\n\r\nimport { Revision, RevisionType } from '../elements/Revision';\r\nimport { RevisionManager } from '../elements/RevisionManager';\r\nimport { Run, type RunFormatting } from '../elements/Run';\r\nimport { Paragraph } from '../elements/Paragraph';\r\nimport { Table } from '../elements/Table';\r\nimport { TableRow } from '../elements/TableRow';\r\nimport { TableCell } from '../elements/TableCell';\r\nimport { Section } from '../elements/Section';\r\nimport type { TrackingContext, PendingChange, TrackableElement } from './TrackingContext';\r\nimport { formatDateForXml } from '../utils/dateFormatting';\r\n\r\n/**\r\n * Enable options for tracking context\r\n */\r\nexport interface TrackingEnableOptions {\r\n /** Author name for new revisions (default: 'DocHub') */\r\n author?: string;\r\n /** Whether to track formatting changes (default: true) */\r\n trackFormatting?: boolean;\r\n}\r\n\r\n/**\r\n * Implementation of TrackingContext for Document\r\n */\r\nexport class DocumentTrackingContext implements TrackingContext {\r\n private enabled = false;\r\n private trackFormatting = true;\r\n private author = 'DocHub';\r\n private revisionManager: RevisionManager;\r\n\r\n /** Counter for assigning stable element IDs */\r\n private elementIdCounter = 0;\r\n /** Stable element identity map (WeakMap so elements can be GC'd) */\r\n private elementIdMap = new WeakMap<object, number>();\r\n\r\n /** Pending changes waiting to be flushed */\r\n private pendingChanges = new Map<string, PendingChange>();\r\n\r\n /** Properties considered \"formatting\" (vs structural) */\r\n private static readonly FORMATTING_PROPERTIES = new Set([\r\n 'bold',\r\n 'italic',\r\n 'underline',\r\n 'strike',\r\n 'dstrike',\r\n 'subscript',\r\n 'superscript',\r\n 'font',\r\n 'size',\r\n 'color',\r\n 'highlight',\r\n 'smallCaps',\r\n 'allCaps',\r\n 'characterSpacing',\r\n 'scaling',\r\n 'position',\r\n 'emphasis',\r\n 'shadow',\r\n 'emboss',\r\n 'imprint',\r\n 'outline',\r\n 'vanish',\r\n ]);\r\n\r\n /**\r\n * Creates a new DocumentTrackingContext\r\n * @param revisionManager - RevisionManager to register revisions with\r\n */\r\n constructor(revisionManager: RevisionManager) {\r\n this.revisionManager = revisionManager;\r\n }\r\n\r\n /**\r\n * Enable change tracking\r\n * @param options - Enable options\r\n */\r\n enable(options?: TrackingEnableOptions): void {\r\n this.enabled = true;\r\n if (options?.author) {\r\n this.author = options.author;\r\n }\r\n if (options?.trackFormatting !== undefined) {\r\n this.trackFormatting = options.trackFormatting;\r\n }\r\n }\r\n\r\n /**\r\n * Disable change tracking and flush pending changes\r\n */\r\n disable(): void {\r\n this.flushPendingChanges();\r\n this.enabled = false;\r\n }\r\n\r\n /**\r\n * Set the author for new revisions\r\n * Flushes any pending changes before switching to prevent mixed authorship\r\n * @param author - Author name\r\n */\r\n setAuthor(author: string): void {\r\n // Flush pending changes before switching authors to prevent mixed authorship\r\n if (this.enabled && this.pendingChanges.size > 0) {\r\n this.flushPendingChanges();\r\n }\r\n this.author = author;\r\n }\r\n\r\n // ═══════════════════════════════════════════════════════════════════════════\r\n // TrackingContext Interface Implementation\r\n // ═══════════════════════════════════════════════════════════════════════════\r\n\r\n isEnabled(): boolean {\r\n return this.enabled;\r\n }\r\n\r\n getAuthor(): string {\r\n return this.author;\r\n }\r\n\r\n getRevisionManager(): RevisionManager {\r\n return this.revisionManager;\r\n }\r\n\r\n isTrackFormattingEnabled(): boolean {\r\n return this.trackFormatting;\r\n }\r\n\r\n trackRunPropertyChange(\r\n run: Run,\r\n property: string,\r\n oldValue: unknown,\r\n newValue: unknown\r\n ): void {\r\n if (!this.enabled) return;\r\n if (this.valuesEqual(oldValue, newValue)) return;\r\n\r\n // Skip formatting changes if not tracking them\r\n if (\r\n !this.trackFormatting &&\r\n DocumentTrackingContext.FORMATTING_PROPERTIES.has(property)\r\n ) {\r\n return;\r\n }\r\n\r\n // Create consolidation key with element identity\r\n const key = `runProp:${property}:${this.stringifyValue(newValue)}@${this.getElementId(run)}`;\r\n\r\n this.addPendingChange(key, {\r\n type: 'runPropertiesChange',\r\n property,\r\n previousValue: oldValue,\r\n newValue,\r\n element: run,\r\n timestamp: Date.now(),\r\n });\r\n }\r\n\r\n trackParagraphPropertyChange(\r\n paragraph: TrackableElement,\r\n property: string,\r\n oldValue: unknown,\r\n newValue: unknown\r\n ): void {\r\n if (!this.enabled) return;\r\n if (this.valuesEqual(oldValue, newValue)) return;\r\n\r\n const key = `paraProp:${property}:${this.stringifyValue(newValue)}@${this.getElementId(paragraph)}`;\r\n\r\n this.addPendingChange(key, {\r\n type: 'paragraphPropertiesChange',\r\n property,\r\n previousValue: oldValue,\r\n newValue,\r\n element: paragraph,\r\n timestamp: Date.now(),\r\n });\r\n }\r\n\r\n trackHyperlinkChange(\r\n hyperlink: TrackableElement,\r\n changeType: string,\r\n oldValue: unknown,\r\n newValue: unknown\r\n ): void {\r\n if (!this.enabled) return;\r\n if (this.valuesEqual(oldValue, newValue)) return;\r\n\r\n // Hyperlink changes use dedicated type for proper categorization\r\n const key = `hyperlink:${changeType}:${this.stringifyValue(newValue)}@${this.getElementId(hyperlink)}`;\r\n\r\n this.addPendingChange(key, {\r\n type: 'hyperlinkChange',\r\n property: changeType,\r\n previousValue: oldValue,\r\n newValue,\r\n element: hyperlink,\r\n timestamp: Date.now(),\r\n });\r\n }\r\n\r\n trackTableChange(\r\n element: TrackableElement,\r\n property: string,\r\n oldValue: unknown,\r\n newValue: unknown\r\n ): void {\r\n if (!this.enabled) return;\r\n if (this.valuesEqual(oldValue, newValue)) return;\r\n\r\n // Determine revision type based on element type using instanceof (minification-safe)\r\n let type: RevisionType = 'tablePropertiesChange';\r\n let elementType = 'Table';\r\n\r\n if (element instanceof TableRow) {\r\n type = 'tableRowPropertiesChange';\r\n elementType = 'TableRow';\r\n } else if (element instanceof TableCell) {\r\n type = 'tableCellPropertiesChange';\r\n elementType = 'TableCell';\r\n }\r\n\r\n const key = `table:${elementType}:${property}:${this.stringifyValue(newValue)}@${this.getElementId(element)}`;\r\n\r\n this.addPendingChange(key, {\r\n type,\r\n property,\r\n previousValue: oldValue,\r\n newValue,\r\n element,\r\n timestamp: Date.now(),\r\n });\r\n }\r\n\r\n trackSectionChange(\r\n section: TrackableElement,\r\n property: string,\r\n oldValue: unknown,\r\n newValue: unknown\r\n ): void {\r\n if (!this.enabled) return;\r\n if (this.valuesEqual(oldValue, newValue)) return;\r\n\r\n const key = `section:${property}:${this.stringifyValue(newValue)}@${this.getElementId(section)}`;\r\n\r\n this.addPendingChange(key, {\r\n type: 'sectionPropertiesChange',\r\n property,\r\n previousValue: oldValue,\r\n newValue,\r\n element: section,\r\n timestamp: Date.now(),\r\n });\r\n }\r\n\r\n trackInsertion(element: TrackableElement, text: string): void {\r\n if (!this.enabled) return;\r\n if (!text) return;\r\n\r\n const key = `insert:${Date.now()}:${text.substring(0, 20)}`;\r\n\r\n this.addPendingChange(key, {\r\n type: 'insert',\r\n property: 'text',\r\n previousValue: undefined,\r\n newValue: text,\r\n element,\r\n timestamp: Date.now(),\r\n });\r\n }\r\n\r\n trackDeletion(element: TrackableElement, text: string): void {\r\n if (!this.enabled) return;\r\n if (!text) return;\r\n\r\n const key = `delete:${Date.now()}:${text.substring(0, 20)}`;\r\n\r\n this.addPendingChange(key, {\r\n type: 'delete',\r\n property: 'text',\r\n previousValue: text,\r\n newValue: undefined,\r\n element,\r\n timestamp: Date.now(),\r\n });\r\n }\r\n\r\n flushPendingChanges(): Revision[] {\r\n const revisions: Revision[] = [];\r\n\r\n // Group pending changes by element for consolidation\r\n const paragraphChanges = new Map<Paragraph, PendingChange[]>();\r\n const tableChanges = new Map<Table, PendingChange[]>();\r\n const rowChanges = new Map<TableRow, PendingChange[]>();\r\n const cellChanges = new Map<TableCell, PendingChange[]>();\r\n const sectionChanges = new Map<Section, PendingChange[]>();\r\n const runChanges = new Map<Run, PendingChange[]>();\r\n\r\n for (const [, pending] of this.pendingChanges) {\r\n const revision = this.createRevision(pending);\r\n this.revisionManager.register(revision);\r\n revisions.push(revision);\r\n\r\n // Collect changes by element type for *PrChange application\r\n if (pending.type === 'paragraphPropertiesChange' && pending.element instanceof Paragraph) {\r\n const changes = paragraphChanges.get(pending.element) || [];\r\n changes.push(pending);\r\n paragraphChanges.set(pending.element, changes);\r\n } else if (pending.type === 'tablePropertiesChange' && pending.element instanceof Table) {\r\n const changes = tableChanges.get(pending.element) || [];\r\n changes.push(pending);\r\n tableChanges.set(pending.element, changes);\r\n } else if (pending.type === 'tableRowPropertiesChange' && pending.element instanceof TableRow) {\r\n const changes = rowChanges.get(pending.element) || [];\r\n changes.push(pending);\r\n rowChanges.set(pending.element, changes);\r\n } else if (pending.type === 'tableCellPropertiesChange' && pending.element instanceof TableCell) {\r\n const changes = cellChanges.get(pending.element) || [];\r\n changes.push(pending);\r\n cellChanges.set(pending.element, changes);\r\n } else if (pending.type === 'sectionPropertiesChange' && pending.element instanceof Section) {\r\n const changes = sectionChanges.get(pending.element) || [];\r\n changes.push(pending);\r\n sectionChanges.set(pending.element, changes);\r\n } else if (pending.type === 'runPropertiesChange' && pending.element instanceof Run) {\r\n const changes = runChanges.get(pending.element) || [];\r\n changes.push(pending);\r\n runChanges.set(pending.element, changes);\r\n }\r\n }\r\n\r\n // Apply pPrChange to each paragraph that has property changes\r\n for (const [paragraph, changes] of paragraphChanges) {\r\n this.applyParagraphPrChange(paragraph, changes);\r\n }\r\n\r\n // Apply tblPrChange to each Table\r\n // Per ECMA-376 §17.13.5.36, tblPrChange must contain FULL previous tblPr,\r\n // not just the delta of changed properties.\r\n for (const [table, changes] of tableChanges) {\r\n // Build full snapshot: start from current formatting, roll back changed properties\r\n const currentFormatting = table.getFormatting();\r\n const fullPrevProps: Record<string, unknown> = {};\r\n\r\n for (const [key, value] of Object.entries(currentFormatting)) {\r\n if (value !== undefined) {\r\n fullPrevProps[key] = value;\r\n }\r\n }\r\n\r\n // Roll back changed properties to their previous values\r\n let latestTimestamp = 0;\r\n for (const change of changes) {\r\n if (change.previousValue !== undefined) {\r\n fullPrevProps[change.property] = change.previousValue;\r\n } else {\r\n delete fullPrevProps[change.property];\r\n }\r\n if (change.timestamp > latestTimestamp) {\r\n latestTimestamp = change.timestamp;\r\n }\r\n }\r\n\r\n const date = formatDateForXml(new Date(latestTimestamp));\r\n\r\n const existing = table.getTblPrChange();\r\n if (existing) {\r\n // Merge: existing previous state takes precedence (it's the ORIGINAL baseline)\r\n const merged = { ...fullPrevProps, ...(existing.previousProperties || {}) };\r\n table.setTblPrChange({ ...existing, previousProperties: merged });\r\n } else {\r\n table.setTblPrChange({\r\n author: this.author,\r\n date,\r\n id: String(this.revisionManager.consumeNextId()),\r\n previousProperties: fullPrevProps,\r\n });\r\n }\r\n }\r\n\r\n // Apply trPrChange to each TableRow\r\n for (const [row, changes] of rowChanges) {\r\n this.applyElementPrChange(changes, (prevProps, getNextId, date) => {\r\n const existing = row.getTrPrChange();\r\n if (existing) {\r\n const merged = { ...(existing.previousProperties || {}), ...prevProps };\r\n row.setTrPrChange({ ...existing, previousProperties: merged });\r\n } else {\r\n row.setTrPrChange({ author: this.author, date, id: String(getNextId()), previousProperties: prevProps });\r\n }\r\n });\r\n }\r\n\r\n // Apply tcPrChange to each TableCell\r\n for (const [cell, changes] of cellChanges) {\r\n this.applyElementPrChange(changes, (prevProps, getNextId, date) => {\r\n const existing = cell.getTcPrChange();\r\n if (existing) {\r\n const merged = { ...(existing.previousProperties || {}), ...prevProps };\r\n cell.setTcPrChange({ ...existing, previousProperties: merged });\r\n } else {\r\n cell.setTcPrChange({ author: this.author, date, id: String(getNextId()), previousProperties: prevProps });\r\n }\r\n });\r\n }\r\n\r\n // Apply sectPrChange to each Section\r\n for (const [section, changes] of sectionChanges) {\r\n this.applyElementPrChange(changes, (prevProps, getNextId, date) => {\r\n const existing = section.getSectPrChange();\r\n if (existing) {\r\n const merged = { ...(existing.previousProperties || {}), ...prevProps };\r\n section.setSectPrChange({ ...existing, previousProperties: merged });\r\n } else {\r\n section.setSectPrChange({ author: this.author, date, id: String(getNextId()), previousProperties: prevProps });\r\n }\r\n });\r\n }\r\n\r\n // Apply rPrChange to each Run that has property changes\r\n for (const [run, changes] of runChanges) {\r\n this.applyRunPrChange(run, changes);\r\n }\r\n\r\n this.pendingChanges.clear();\r\n return revisions;\r\n }\r\n\r\n // ═══════════════════════════════════════════════════════════════════════════\r\n // Private Methods\r\n // ═══════════════════════════════════════════════════════════════════════════\r\n\r\n /**\r\n * Apply pPrChange to a paragraph (extracted from flushPendingChanges for readability)\r\n */\r\n private applyParagraphPrChange(paragraph: Paragraph, changes: PendingChange[]): void {\r\n const newPreviousProperties: Record<string, unknown> = {};\r\n let latestTimestamp = 0;\r\n\r\n for (const change of changes) {\r\n // Record previous value even if undefined (property wasn't set before)\r\n newPreviousProperties[change.property] = change.previousValue;\r\n if (change.timestamp > latestTimestamp) {\r\n latestTimestamp = change.timestamp;\r\n }\r\n }\r\n\r\n const existingChange = paragraph.formatting.pPrChange;\r\n\r\n if (existingChange) {\r\n const mergedPreviousProperties: Record<string, unknown> = {\r\n ...(existingChange.previousProperties || {}),\r\n };\r\n for (const [prop, value] of Object.entries(newPreviousProperties)) {\r\n mergedPreviousProperties[prop] = value;\r\n }\r\n paragraph.formatting.pPrChange = {\r\n author: existingChange.author,\r\n date: existingChange.date,\r\n id: existingChange.id,\r\n previousProperties: mergedPreviousProperties,\r\n };\r\n } else {\r\n const revisionId = this.revisionManager.consumeNextId();\r\n paragraph.formatting.pPrChange = {\r\n author: this.author,\r\n date: formatDateForXml(new Date(latestTimestamp)),\r\n id: String(revisionId),\r\n previousProperties: newPreviousProperties,\r\n };\r\n }\r\n }\r\n\r\n /**\r\n * Apply rPrChange to a run (mirrors applyParagraphPrChange for runs)\r\n */\r\n private applyRunPrChange(run: Run, changes: PendingChange[]): void {\r\n const newPreviousProperties: Partial<RunFormatting> = {};\r\n let latestTimestamp = 0;\r\n\r\n for (const change of changes) {\r\n (newPreviousProperties as Record<string, unknown>)[change.property] = change.previousValue;\r\n if (change.timestamp > latestTimestamp) {\r\n latestTimestamp = change.timestamp;\r\n }\r\n }\r\n\r\n const existingChange = run.getPropertyChangeRevision();\r\n\r\n if (existingChange) {\r\n // Merge with existing rPrChange — preserve original author/date,\r\n // add new previous properties\r\n const mergedPreviousProperties: Partial<RunFormatting> = {\r\n ...(existingChange.previousProperties || {}),\r\n ...newPreviousProperties,\r\n };\r\n run.setPropertyChangeRevision({\r\n ...existingChange,\r\n previousProperties: mergedPreviousProperties,\r\n });\r\n } else {\r\n const revisionId = this.revisionManager.consumeNextId();\r\n run.setPropertyChangeRevision({\r\n id: revisionId,\r\n author: this.author,\r\n date: new Date(latestTimestamp),\r\n previousProperties: newPreviousProperties,\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Generic helper to apply *PrChange to table/row/cell/section elements\r\n */\r\n private applyElementPrChange(\r\n changes: PendingChange[],\r\n applier: (prevProps: Record<string, unknown>, getNextId: () => number, date: string) => void\r\n ): void {\r\n const prevProps: Record<string, unknown> = {};\r\n let latestTimestamp = 0;\r\n\r\n for (const change of changes) {\r\n // Record previous value even if undefined (property wasn't set before)\r\n prevProps[change.property] = change.previousValue;\r\n if (change.timestamp > latestTimestamp) {\r\n latestTimestamp = change.timestamp;\r\n }\r\n }\r\n\r\n const date = formatDateForXml(new Date(latestTimestamp));\r\n applier(prevProps, () => this.revisionManager.consumeNextId(), date);\r\n }\r\n\r\n /**\r\n * Add a pending change, consolidating with existing if same key\r\n */\r\n private addPendingChange(key: string, change: PendingChange): void {\r\n const existing = this.pendingChanges.get(key);\r\n if (existing) {\r\n existing.count = (existing.count || 1) + 1;\r\n // Keep the first previousValue for consolidated changes\r\n } else {\r\n this.pendingChanges.set(key, { ...change, count: 1 });\r\n }\r\n }\r\n\r\n /**\r\n * Create a Revision from a pending change\r\n */\r\n private createRevision(pending: PendingChange): Revision {\r\n const previousProps: Record<string, any> = {};\r\n const newProps: Record<string, any> = {};\r\n\r\n if (pending.previousValue !== undefined) {\r\n previousProps[pending.property] = pending.previousValue;\r\n }\r\n if (pending.newValue !== undefined) {\r\n newProps[pending.property] = pending.newValue;\r\n }\r\n\r\n // Get or create a Run for the revision content\r\n const run = this.getRunFromElement(pending.element);\r\n\r\n return new Revision({\r\n author: this.author,\r\n type: pending.type,\r\n content: run,\r\n previousProperties:\r\n Object.keys(previousProps).length > 0 ? previousProps : undefined,\r\n newProperties: Object.keys(newProps).length > 0 ? newProps : undefined,\r\n date: new Date(pending.timestamp),\r\n });\r\n }\r\n\r\n /**\r\n * Get or create a Run from an element for revision content\r\n */\r\n private getRunFromElement(element: TrackableElement): Run {\r\n if (element instanceof Run) {\r\n return element;\r\n }\r\n\r\n // Use instanceof for type-safe element identification (minification-safe)\r\n if (element instanceof Table) return new Run('Table');\r\n if (element instanceof TableRow) return new Run('TableRow');\r\n if (element instanceof TableCell) return new Run('TableCell');\r\n if (element instanceof Section) return new Run('Section');\r\n if (element instanceof Paragraph) return new Run('Paragraph');\r\n\r\n // Fallback for other elements (e.g., Hyperlink)\r\n const hasGetText = 'getText' in element && typeof (element as { getText?: () => string }).getText === 'function';\r\n const text = hasGetText\r\n ? (element as { getText: () => string }).getText()\r\n : element?.constructor?.name || 'Unknown element';\r\n return new Run(typeof text === 'string' ? text : String(text));\r\n }\r\n\r\n /**\r\n * Get a stable unique ID for an element (used in consolidation keys)\r\n */\r\n private getElementId(element: TrackableElement): number {\r\n let id = this.elementIdMap.get(element as object);\r\n if (id === undefined) {\r\n id = this.elementIdCounter++;\r\n this.elementIdMap.set(element as object, id);\r\n }\r\n return id;\r\n }\r\n\r\n /**\r\n * Deep equality check for tracking values (handles objects, primitives, null/undefined)\r\n */\r\n private valuesEqual(a: unknown, b: unknown): boolean {\r\n if (a === b) return true;\r\n if (a == null || b == null) return false;\r\n if (typeof a !== 'object' || typeof b !== 'object') return false;\r\n return JSON.stringify(a) === JSON.stringify(b);\r\n }\r\n\r\n /**\r\n * Stringify a value for use in consolidation key\r\n */\r\n private stringifyValue(value: unknown): string {\r\n if (value === undefined) return 'undefined';\r\n if (value === null) return 'null';\r\n if (typeof value === 'object') {\r\n return JSON.stringify(value);\r\n }\r\n return String(value);\r\n }\r\n\r\n /**\r\n * Create an insertion revision (factory to avoid circular dependency in Run)\r\n */\r\n createInsertion(content: Run, date?: Date): Revision {\r\n return Revision.createInsertion(this.author, content, date);\r\n }\r\n\r\n /**\r\n * Create a deletion revision (factory to avoid circular dependency in Run)\r\n */\r\n createDeletion(content: Run, date?: Date): Revision {\r\n return Revision.createDeletion(this.author, content, date);\r\n }\r\n\r\n /**\r\n * Get count of pending changes\r\n */\r\n getPendingCount(): number {\r\n return this.pendingChanges.size;\r\n }\r\n\r\n /**\r\n * Check if there are pending changes\r\n */\r\n hasPendingChanges(): boolean {\r\n return this.pendingChanges.size > 0;\r\n }\r\n\r\n /**\r\n * Clear all pending changes without creating revisions\r\n */\r\n clearPendingChanges(): void {\r\n this.pendingChanges.clear();\r\n }\r\n}\r\n"]}
|
package/package.json
CHANGED
package/src/core/Document.ts
CHANGED
|
@@ -368,6 +368,8 @@ export class Document {
|
|
|
368
368
|
// Track whether settings have been programmatically modified since load
|
|
369
369
|
// When true, mergeSettingsWithOriginal() will apply in-memory state to the preserved XML
|
|
370
370
|
private _settingsModified = false;
|
|
371
|
+
/** Tracks which individual boolean settings were modified via setters (not just parsed) */
|
|
372
|
+
private _modifiedBooleanSettings = new Set<string>();
|
|
371
373
|
|
|
372
374
|
// webSettings.xml round-trip preservation
|
|
373
375
|
private _originalWebSettingsXml?: string;
|
|
@@ -410,6 +412,20 @@ export class Document {
|
|
|
410
412
|
private _mirrorMargins?: boolean;
|
|
411
413
|
/** Auto hyphenation setting (w:autoHyphenation) per ECMA-376 Part 1 §17.15.1.10 */
|
|
412
414
|
private _autoHyphenation?: boolean;
|
|
415
|
+
/** Hide spelling errors (w:hideSpellingErrors) per ECMA-376 Part 1 §17.15.1.43 */
|
|
416
|
+
private _hideSpellingErrors?: boolean;
|
|
417
|
+
/** Hide grammatical errors (w:hideGrammaticalErrors) per ECMA-376 Part 1 §17.15.1.42 */
|
|
418
|
+
private _hideGrammaticalErrors?: boolean;
|
|
419
|
+
/** Default tab stop (w:defaultTabStop) per ECMA-376 Part 1 §17.15.1.25 */
|
|
420
|
+
private _defaultTabStop?: number;
|
|
421
|
+
/** Update fields on open (w:updateFields) per ECMA-376 Part 1 §17.15.1.85 */
|
|
422
|
+
private _updateFields?: boolean;
|
|
423
|
+
/** Embed TrueType fonts (w:embedTrueTypeFonts) per ECMA-376 Part 1 §17.15.1.24 */
|
|
424
|
+
private _embedTrueTypeFonts?: boolean;
|
|
425
|
+
/** Save subset of fonts (w:saveSubsetFonts) per ECMA-376 Part 1 §17.15.1.78 */
|
|
426
|
+
private _saveSubsetFonts?: boolean;
|
|
427
|
+
/** Do not track moves (w:doNotTrackMoves) per ECMA-376 Part 1 §17.15.1.35 */
|
|
428
|
+
private _doNotTrackMoves?: boolean;
|
|
413
429
|
/** Decimal symbol for locale (w:decimalSymbol) per ECMA-376 Part 1 §17.15.1.23 */
|
|
414
430
|
private _decimalSymbol?: string;
|
|
415
431
|
/** List separator for locale (w:listSeparator) per ECMA-376 Part 1 §17.15.1.55 */
|
|
@@ -846,6 +862,42 @@ export class Document {
|
|
|
846
862
|
this._autoHyphenation = true;
|
|
847
863
|
}
|
|
848
864
|
|
|
865
|
+
// Parse w:hideSpellingErrors per ECMA-376 Part 1 §17.15.1.43
|
|
866
|
+
if (/<w:hideSpellingErrors\b[^>]*\/?>/.test(settingsXml)) {
|
|
867
|
+
this._hideSpellingErrors = true;
|
|
868
|
+
}
|
|
869
|
+
|
|
870
|
+
// Parse w:hideGrammaticalErrors per ECMA-376 Part 1 §17.15.1.42
|
|
871
|
+
if (/<w:hideGrammaticalErrors\b[^>]*\/?>/.test(settingsXml)) {
|
|
872
|
+
this._hideGrammaticalErrors = true;
|
|
873
|
+
}
|
|
874
|
+
|
|
875
|
+
// Parse w:defaultTabStop per ECMA-376 Part 1 §17.15.1.25
|
|
876
|
+
const defaultTabStopMatch = /<w:defaultTabStop\s+w:val\s*=\s*"(\d+)"\s*\/?>/.exec(settingsXml);
|
|
877
|
+
if (defaultTabStopMatch?.[1]) {
|
|
878
|
+
this._defaultTabStop = parseInt(defaultTabStopMatch[1], 10);
|
|
879
|
+
}
|
|
880
|
+
|
|
881
|
+
// Parse w:updateFields per ECMA-376 Part 1 §17.15.1.85
|
|
882
|
+
if (/<w:updateFields\b[^>]*\/?>/.test(settingsXml)) {
|
|
883
|
+
this._updateFields = true;
|
|
884
|
+
}
|
|
885
|
+
|
|
886
|
+
// Parse w:embedTrueTypeFonts per ECMA-376 Part 1 §17.15.1.24
|
|
887
|
+
if (/<w:embedTrueTypeFonts\b[^>]*\/?>/.test(settingsXml)) {
|
|
888
|
+
this._embedTrueTypeFonts = true;
|
|
889
|
+
}
|
|
890
|
+
|
|
891
|
+
// Parse w:saveSubsetFonts per ECMA-376 Part 1 §17.15.1.78
|
|
892
|
+
if (/<w:saveSubsetFonts\b[^>]*\/?>/.test(settingsXml)) {
|
|
893
|
+
this._saveSubsetFonts = true;
|
|
894
|
+
}
|
|
895
|
+
|
|
896
|
+
// Parse w:doNotTrackMoves per ECMA-376 Part 1 §17.15.1.35
|
|
897
|
+
if (/<w:doNotTrackMoves\b[^>]*\/?>/.test(settingsXml)) {
|
|
898
|
+
this._doNotTrackMoves = true;
|
|
899
|
+
}
|
|
900
|
+
|
|
849
901
|
// Parse w:decimalSymbol per ECMA-376 Part 1 §17.15.1.23
|
|
850
902
|
const decimalMatch = /<w:decimalSymbol\s+w:val\s*=\s*"([^"]*)"\s*\/?>/.exec(settingsXml);
|
|
851
903
|
if (decimalMatch?.[1]) {
|
|
@@ -3240,8 +3292,8 @@ export class Document {
|
|
|
3240
3292
|
*/
|
|
3241
3293
|
private mergeSettingsWithOriginal(): string {
|
|
3242
3294
|
if (!this._originalSettingsXml) {
|
|
3243
|
-
// New document — generate from scratch
|
|
3244
|
-
|
|
3295
|
+
// New document — generate base from scratch, then apply any modified settings
|
|
3296
|
+
let xml = this.generator.generateSettings({
|
|
3245
3297
|
trackChangesEnabled: this.trackChangesEnabled,
|
|
3246
3298
|
trackFormatting: this.trackFormatting,
|
|
3247
3299
|
revisionView: this.revisionViewSettings,
|
|
@@ -3249,6 +3301,12 @@ export class Document {
|
|
|
3249
3301
|
rsids: this.getRsids(),
|
|
3250
3302
|
documentProtection: this.documentProtection,
|
|
3251
3303
|
});
|
|
3304
|
+
// Apply settings merges to the generated XML for new documents
|
|
3305
|
+
if (this._settingsModified) {
|
|
3306
|
+
xml = this.mergeTrackChangesIntoSettings(xml);
|
|
3307
|
+
xml = this.mergeBooleanSettingsIntoSettings(xml);
|
|
3308
|
+
}
|
|
3309
|
+
return xml;
|
|
3252
3310
|
}
|
|
3253
3311
|
|
|
3254
3312
|
// If nothing was modified, return original as-is for perfect round-trip
|
|
@@ -3280,6 +3338,8 @@ export class Document {
|
|
|
3280
3338
|
// Remove existing track changes elements (will re-insert if needed)
|
|
3281
3339
|
xml = xml.replace(/<w:trackRevisions\b[^>]*\/>/g, '');
|
|
3282
3340
|
xml = xml.replace(/<w:trackRevisions\b[^>]*>[\s\S]*?<\/w:trackRevisions>/g, '');
|
|
3341
|
+
xml = xml.replace(/<w:doNotTrackMoves\b[^>]*\/>/g, '');
|
|
3342
|
+
xml = xml.replace(/<w:doNotTrackMoves\b[^>]*>[\s\S]*?<\/w:doNotTrackMoves>/g, '');
|
|
3283
3343
|
xml = xml.replace(/<w:doNotTrackFormatting\b[^>]*\/>/g, '');
|
|
3284
3344
|
xml = xml.replace(/<w:doNotTrackFormatting\b[^>]*>[\s\S]*?<\/w:doNotTrackFormatting>/g, '');
|
|
3285
3345
|
xml = xml.replace(/<w:trackFormatting\b[^>]*\/>/g, '');
|
|
@@ -3302,6 +3362,11 @@ export class Document {
|
|
|
3302
3362
|
trackBlock += '\n <w:trackRevisions/>';
|
|
3303
3363
|
}
|
|
3304
3364
|
|
|
3365
|
+
// w:doNotTrackMoves (#33) — only if explicitly set
|
|
3366
|
+
if (this._doNotTrackMoves) {
|
|
3367
|
+
trackBlock += '\n <w:doNotTrackMoves/>';
|
|
3368
|
+
}
|
|
3369
|
+
|
|
3305
3370
|
// w:doNotTrackFormatting (#34) — only if explicitly disabled
|
|
3306
3371
|
if (!this.trackFormatting) {
|
|
3307
3372
|
trackBlock += '\n <w:doNotTrackFormatting/>';
|
|
@@ -3410,48 +3475,116 @@ export class Document {
|
|
|
3410
3475
|
}
|
|
3411
3476
|
|
|
3412
3477
|
/**
|
|
3413
|
-
* Merges boolean settings
|
|
3414
|
-
*
|
|
3478
|
+
* Merges boolean settings into the settings.xml preserving CT_Settings schema order.
|
|
3479
|
+
*
|
|
3480
|
+
* CT_Settings element order (relevant managed elements):
|
|
3481
|
+
* #11 embedTrueTypeFonts, #13 saveSubsetFonts, #15 mirrorMargins,
|
|
3482
|
+
* #20 hideSpellingErrors, #21 hideGrammaticalErrors,
|
|
3483
|
+
* #39 defaultTabStop, #40 autoHyphenation,
|
|
3484
|
+
* #48 evenAndOddHeaders, #61 characterSpacingControl,
|
|
3485
|
+
* #77 updateFields
|
|
3486
|
+
*
|
|
3487
|
+
* Strategy: Remove all managed elements, then re-insert a correctly ordered block
|
|
3488
|
+
* before the defaultTabStop anchor. This avoids ordering issues from incremental insertion.
|
|
3489
|
+
*
|
|
3490
|
+
* Only removes elements when explicitly set to false (not when undefined/unset).
|
|
3415
3491
|
* @private
|
|
3416
3492
|
*/
|
|
3417
3493
|
private mergeBooleanSettingsIntoSettings(xml: string): string {
|
|
3418
|
-
//
|
|
3419
|
-
|
|
3420
|
-
|
|
3421
|
-
|
|
3422
|
-
|
|
3423
|
-
|
|
3424
|
-
|
|
3425
|
-
|
|
3426
|
-
|
|
3427
|
-
|
|
3428
|
-
|
|
3429
|
-
|
|
3430
|
-
|
|
3494
|
+
// =========================================================================
|
|
3495
|
+
// BEFORE defaultTabStop (#39) — remove-and-rebuild approach
|
|
3496
|
+
// Only removes elements that were EXPLICITLY set by the user.
|
|
3497
|
+
// Unset (undefined) elements are left in their original position.
|
|
3498
|
+
//
|
|
3499
|
+
// CT_Settings order: #11 embedTrueTypeFonts, #13 saveSubsetFonts,
|
|
3500
|
+
// #15 mirrorMargins, #20 hideSpellingErrors, #21 hideGrammaticalErrors
|
|
3501
|
+
// =========================================================================
|
|
3502
|
+
|
|
3503
|
+
// Collect explicitly-set elements to add (in schema order)
|
|
3504
|
+
const preElements: string[] = [];
|
|
3505
|
+
const mod = this._modifiedBooleanSettings;
|
|
3506
|
+
|
|
3507
|
+
// Only remove and process elements that were explicitly set via setters
|
|
3508
|
+
if (mod.has('embedTrueTypeFonts')) {
|
|
3509
|
+
xml = xml.replace(/<w:embedTrueTypeFonts\b[^>]*\/?>\s*/g, '');
|
|
3510
|
+
if (this._embedTrueTypeFonts) preElements.push('<w:embedTrueTypeFonts/>');
|
|
3511
|
+
}
|
|
3512
|
+
if (mod.has('saveSubsetFonts')) {
|
|
3513
|
+
xml = xml.replace(/<w:saveSubsetFonts\b[^>]*\/?>\s*/g, '');
|
|
3514
|
+
if (this._saveSubsetFonts) preElements.push('<w:saveSubsetFonts/>');
|
|
3515
|
+
}
|
|
3516
|
+
if (mod.has('mirrorMargins')) {
|
|
3517
|
+
xml = xml.replace(/<w:mirrorMargins\b[^>]*\/?>\s*/g, '');
|
|
3518
|
+
if (this._mirrorMargins) preElements.push('<w:mirrorMargins/>');
|
|
3519
|
+
}
|
|
3520
|
+
if (mod.has('hideSpellingErrors')) {
|
|
3521
|
+
xml = xml.replace(/<w:hideSpellingErrors\b[^>]*\/?>\s*/g, '');
|
|
3522
|
+
if (this._hideSpellingErrors) preElements.push('<w:hideSpellingErrors/>');
|
|
3523
|
+
}
|
|
3524
|
+
if (mod.has('hideGrammaticalErrors')) {
|
|
3525
|
+
xml = xml.replace(/<w:hideGrammaticalErrors\b[^>]*\/?>\s*/g, '');
|
|
3526
|
+
if (this._hideGrammaticalErrors) preElements.push('<w:hideGrammaticalErrors/>');
|
|
3431
3527
|
}
|
|
3432
3528
|
|
|
3433
|
-
//
|
|
3434
|
-
|
|
3435
|
-
|
|
3529
|
+
// Insert the block before defaultTabStop (schema order preserved since array is ordered)
|
|
3530
|
+
if (preElements.length > 0) {
|
|
3531
|
+
const preBlock = preElements.map(e => '\n ' + e).join('');
|
|
3436
3532
|
if (/<w:defaultTabStop\b/.test(xml)) {
|
|
3437
|
-
xml = xml.replace(/<w:defaultTabStop\b/, '
|
|
3533
|
+
xml = xml.replace(/<w:defaultTabStop\b/, preBlock + '\n <w:defaultTabStop');
|
|
3438
3534
|
} else {
|
|
3439
|
-
xml = xml.replace(/<\/w:settings>/, '
|
|
3535
|
+
xml = xml.replace(/<\/w:settings>/, preBlock + '\n</w:settings>');
|
|
3440
3536
|
}
|
|
3441
|
-
} else if (!this._mirrorMargins && hasMM) {
|
|
3442
|
-
xml = xml.replace(/<w:mirrorMargins\b[^>]*\/?>\s*/g, '');
|
|
3443
3537
|
}
|
|
3444
3538
|
|
|
3445
|
-
//
|
|
3446
|
-
|
|
3447
|
-
|
|
3448
|
-
|
|
3449
|
-
|
|
3539
|
+
// =========================================================================
|
|
3540
|
+
// defaultTabStop (#39) — value attribute, not just boolean
|
|
3541
|
+
// =========================================================================
|
|
3542
|
+
if (mod.has('defaultTabStop') && this._defaultTabStop !== undefined) {
|
|
3543
|
+
const hasDTS = /<w:defaultTabStop\b[^>]*\/?>/.test(xml);
|
|
3544
|
+
if (hasDTS) {
|
|
3545
|
+
xml = xml.replace(/<w:defaultTabStop\b[^>]*\/?>/, `<w:defaultTabStop w:val="${this._defaultTabStop}"/>`);
|
|
3450
3546
|
} else {
|
|
3451
|
-
xml = xml.replace(/<\/w:settings>/,
|
|
3547
|
+
xml = xml.replace(/<\/w:settings>/, ` <w:defaultTabStop w:val="${this._defaultTabStop}"/>\n</w:settings>`);
|
|
3452
3548
|
}
|
|
3453
|
-
}
|
|
3549
|
+
}
|
|
3550
|
+
|
|
3551
|
+
// =========================================================================
|
|
3552
|
+
// AFTER defaultTabStop (#39) — only process explicitly set elements
|
|
3553
|
+
// #40 autoHyphenation, #48 evenAndOddHeaders
|
|
3554
|
+
// =========================================================================
|
|
3555
|
+
|
|
3556
|
+
const postElements: string[] = [];
|
|
3557
|
+
|
|
3558
|
+
if (mod.has('autoHyphenation')) {
|
|
3454
3559
|
xml = xml.replace(/<w:autoHyphenation\b[^>]*\/?>\s*/g, '');
|
|
3560
|
+
if (this._autoHyphenation) postElements.push('<w:autoHyphenation/>');
|
|
3561
|
+
}
|
|
3562
|
+
if (mod.has('evenAndOddHeaders')) {
|
|
3563
|
+
xml = xml.replace(/<w:evenAndOddHeaders\b[^>]*\/?>\s*/g, '');
|
|
3564
|
+
if (this._evenAndOddHeaders) postElements.push('<w:evenAndOddHeaders/>');
|
|
3565
|
+
}
|
|
3566
|
+
|
|
3567
|
+
if (postElements.length > 0) {
|
|
3568
|
+
const postBlock = postElements.map(e => '\n ' + e).join('');
|
|
3569
|
+
if (/<w:characterSpacingControl\b/.test(xml)) {
|
|
3570
|
+
xml = xml.replace(/<w:characterSpacingControl\b/, postBlock + '\n <w:characterSpacingControl');
|
|
3571
|
+
} else {
|
|
3572
|
+
xml = xml.replace(/<\/w:settings>/, postBlock + '\n</w:settings>');
|
|
3573
|
+
}
|
|
3574
|
+
}
|
|
3575
|
+
|
|
3576
|
+
// =========================================================================
|
|
3577
|
+
// #77: updateFields (near end of CT_Settings) — only if explicitly set via setter
|
|
3578
|
+
// =========================================================================
|
|
3579
|
+
if (mod.has('updateFields')) {
|
|
3580
|
+
xml = xml.replace(/<w:updateFields\b[^>]*\/?>\s*/g, '');
|
|
3581
|
+
if (this._updateFields) {
|
|
3582
|
+
if (/<w:compat\b/.test(xml)) {
|
|
3583
|
+
xml = xml.replace(/<w:compat\b/, '<w:updateFields w:val="true"/>\n <w:compat');
|
|
3584
|
+
} else {
|
|
3585
|
+
xml = xml.replace(/<\/w:settings>/, ' <w:updateFields w:val="true"/>\n</w:settings>');
|
|
3586
|
+
}
|
|
3587
|
+
}
|
|
3455
3588
|
}
|
|
3456
3589
|
|
|
3457
3590
|
return xml;
|
|
@@ -10826,6 +10959,7 @@ export class Document {
|
|
|
10826
10959
|
setEvenAndOddHeaders(enabled: boolean): void {
|
|
10827
10960
|
this._evenAndOddHeaders = enabled;
|
|
10828
10961
|
this._settingsModified = true;
|
|
10962
|
+
this._modifiedBooleanSettings.add('evenAndOddHeaders');
|
|
10829
10963
|
}
|
|
10830
10964
|
|
|
10831
10965
|
/**
|
|
@@ -10841,6 +10975,7 @@ export class Document {
|
|
|
10841
10975
|
setMirrorMargins(enabled: boolean): void {
|
|
10842
10976
|
this._mirrorMargins = enabled;
|
|
10843
10977
|
this._settingsModified = true;
|
|
10978
|
+
this._modifiedBooleanSettings.add('mirrorMargins');
|
|
10844
10979
|
}
|
|
10845
10980
|
|
|
10846
10981
|
/**
|
|
@@ -10856,6 +10991,119 @@ export class Document {
|
|
|
10856
10991
|
setAutoHyphenation(enabled: boolean): void {
|
|
10857
10992
|
this._autoHyphenation = enabled;
|
|
10858
10993
|
this._settingsModified = true;
|
|
10994
|
+
this._modifiedBooleanSettings.add('autoHyphenation');
|
|
10995
|
+
}
|
|
10996
|
+
|
|
10997
|
+
/**
|
|
10998
|
+
* Gets whether spelling errors are hidden (w:hideSpellingErrors)
|
|
10999
|
+
*/
|
|
11000
|
+
getHideSpellingErrors(): boolean {
|
|
11001
|
+
return this._hideSpellingErrors ?? false;
|
|
11002
|
+
}
|
|
11003
|
+
|
|
11004
|
+
/**
|
|
11005
|
+
* Sets whether to hide spelling errors (w:hideSpellingErrors)
|
|
11006
|
+
*/
|
|
11007
|
+
setHideSpellingErrors(enabled: boolean): void {
|
|
11008
|
+
this._hideSpellingErrors = enabled;
|
|
11009
|
+
this._settingsModified = true;
|
|
11010
|
+
this._modifiedBooleanSettings.add('hideSpellingErrors');
|
|
11011
|
+
}
|
|
11012
|
+
|
|
11013
|
+
/**
|
|
11014
|
+
* Gets whether grammatical errors are hidden (w:hideGrammaticalErrors)
|
|
11015
|
+
*/
|
|
11016
|
+
getHideGrammaticalErrors(): boolean {
|
|
11017
|
+
return this._hideGrammaticalErrors ?? false;
|
|
11018
|
+
}
|
|
11019
|
+
|
|
11020
|
+
/**
|
|
11021
|
+
* Sets whether to hide grammatical errors (w:hideGrammaticalErrors)
|
|
11022
|
+
*/
|
|
11023
|
+
setHideGrammaticalErrors(enabled: boolean): void {
|
|
11024
|
+
this._hideGrammaticalErrors = enabled;
|
|
11025
|
+
this._settingsModified = true;
|
|
11026
|
+
this._modifiedBooleanSettings.add('hideGrammaticalErrors');
|
|
11027
|
+
}
|
|
11028
|
+
|
|
11029
|
+
/**
|
|
11030
|
+
* Gets the default tab stop value in twips (w:defaultTabStop)
|
|
11031
|
+
*/
|
|
11032
|
+
getDefaultTabStop(): number | undefined {
|
|
11033
|
+
return this._defaultTabStop;
|
|
11034
|
+
}
|
|
11035
|
+
|
|
11036
|
+
/**
|
|
11037
|
+
* Sets the default tab stop value in twips (w:defaultTabStop)
|
|
11038
|
+
*/
|
|
11039
|
+
setDefaultTabStop(twips: number): void {
|
|
11040
|
+
this._defaultTabStop = twips;
|
|
11041
|
+
this._settingsModified = true;
|
|
11042
|
+
this._modifiedBooleanSettings.add('defaultTabStop');
|
|
11043
|
+
}
|
|
11044
|
+
|
|
11045
|
+
/**
|
|
11046
|
+
* Gets whether fields are updated on document open (w:updateFields)
|
|
11047
|
+
*/
|
|
11048
|
+
getUpdateFields(): boolean {
|
|
11049
|
+
return this._updateFields ?? false;
|
|
11050
|
+
}
|
|
11051
|
+
|
|
11052
|
+
/**
|
|
11053
|
+
* Sets whether fields should be updated on document open (w:updateFields)
|
|
11054
|
+
*/
|
|
11055
|
+
setUpdateFields(enabled: boolean): void {
|
|
11056
|
+
this._updateFields = enabled;
|
|
11057
|
+
this._settingsModified = true;
|
|
11058
|
+
this._modifiedBooleanSettings.add('updateFields');
|
|
11059
|
+
}
|
|
11060
|
+
|
|
11061
|
+
/**
|
|
11062
|
+
* Gets whether TrueType fonts are embedded (w:embedTrueTypeFonts)
|
|
11063
|
+
*/
|
|
11064
|
+
getEmbedTrueTypeFonts(): boolean {
|
|
11065
|
+
return this._embedTrueTypeFonts ?? false;
|
|
11066
|
+
}
|
|
11067
|
+
|
|
11068
|
+
/**
|
|
11069
|
+
* Sets whether to embed TrueType fonts (w:embedTrueTypeFonts)
|
|
11070
|
+
*/
|
|
11071
|
+
setEmbedTrueTypeFonts(enabled: boolean): void {
|
|
11072
|
+
this._embedTrueTypeFonts = enabled;
|
|
11073
|
+
this._settingsModified = true;
|
|
11074
|
+
this._modifiedBooleanSettings.add('embedTrueTypeFonts');
|
|
11075
|
+
}
|
|
11076
|
+
|
|
11077
|
+
/**
|
|
11078
|
+
* Gets whether only font subsets are saved (w:saveSubsetFonts)
|
|
11079
|
+
*/
|
|
11080
|
+
getSaveSubsetFonts(): boolean {
|
|
11081
|
+
return this._saveSubsetFonts ?? false;
|
|
11082
|
+
}
|
|
11083
|
+
|
|
11084
|
+
/**
|
|
11085
|
+
* Sets whether to save only font subsets (w:saveSubsetFonts)
|
|
11086
|
+
*/
|
|
11087
|
+
setSaveSubsetFonts(enabled: boolean): void {
|
|
11088
|
+
this._saveSubsetFonts = enabled;
|
|
11089
|
+
this._settingsModified = true;
|
|
11090
|
+
this._modifiedBooleanSettings.add('saveSubsetFonts');
|
|
11091
|
+
}
|
|
11092
|
+
|
|
11093
|
+
/**
|
|
11094
|
+
* Gets whether move tracking is disabled (w:doNotTrackMoves)
|
|
11095
|
+
*/
|
|
11096
|
+
getDoNotTrackMoves(): boolean {
|
|
11097
|
+
return this._doNotTrackMoves ?? false;
|
|
11098
|
+
}
|
|
11099
|
+
|
|
11100
|
+
/**
|
|
11101
|
+
* Sets whether to disable move tracking (w:doNotTrackMoves)
|
|
11102
|
+
*/
|
|
11103
|
+
setDoNotTrackMoves(enabled: boolean): void {
|
|
11104
|
+
this._doNotTrackMoves = enabled;
|
|
11105
|
+
this._settingsModified = true;
|
|
11106
|
+
this._modifiedBooleanSettings.add('doNotTrackMoves');
|
|
10859
11107
|
}
|
|
10860
11108
|
|
|
10861
11109
|
/**
|
|
@@ -12174,6 +12422,14 @@ export class Document {
|
|
|
12174
12422
|
this._evenAndOddHeaders = undefined;
|
|
12175
12423
|
this._mirrorMargins = undefined;
|
|
12176
12424
|
this._autoHyphenation = undefined;
|
|
12425
|
+
this._hideSpellingErrors = undefined;
|
|
12426
|
+
this._hideGrammaticalErrors = undefined;
|
|
12427
|
+
this._defaultTabStop = undefined;
|
|
12428
|
+
this._updateFields = undefined;
|
|
12429
|
+
this._embedTrueTypeFonts = undefined;
|
|
12430
|
+
this._saveSubsetFonts = undefined;
|
|
12431
|
+
this._doNotTrackMoves = undefined;
|
|
12432
|
+
this._modifiedBooleanSettings.clear();
|
|
12177
12433
|
this._decimalSymbol = undefined;
|
|
12178
12434
|
this._listSeparator = undefined;
|
|
12179
12435
|
this._flattenIncludePictureFields = false;
|