@usejunior/docx-core 0.14.0 → 0.16.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (154) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/generation/index.d.ts +0 -1
  3. package/dist/generation/index.d.ts.map +1 -1
  4. package/dist/generation/index.js +0 -1
  5. package/dist/generation/index.js.map +1 -1
  6. package/dist/index.d.ts +7 -25
  7. package/dist/index.d.ts.map +1 -1
  8. package/dist/index.js +7 -47
  9. package/dist/index.js.map +1 -1
  10. package/dist/primitives/accept_ai_edits.d.ts +87 -0
  11. package/dist/primitives/accept_ai_edits.d.ts.map +1 -0
  12. package/dist/primitives/accept_ai_edits.js +253 -0
  13. package/dist/primitives/accept_ai_edits.js.map +1 -0
  14. package/dist/primitives/accept_changes.d.ts +13 -1
  15. package/dist/primitives/accept_changes.d.ts.map +1 -1
  16. package/dist/primitives/accept_changes.js +44 -29
  17. package/dist/primitives/accept_changes.js.map +1 -1
  18. package/dist/primitives/document.d.ts +51 -0
  19. package/dist/primitives/document.d.ts.map +1 -1
  20. package/dist/primitives/document.js +144 -1
  21. package/dist/primitives/document.js.map +1 -1
  22. package/dist/primitives/index.d.ts +1 -0
  23. package/dist/primitives/index.d.ts.map +1 -1
  24. package/dist/primitives/index.js +1 -0
  25. package/dist/primitives/index.js.map +1 -1
  26. package/dist/primitives/reject_changes.d.ts +4 -1
  27. package/dist/primitives/reject_changes.d.ts.map +1 -1
  28. package/dist/primitives/reject_changes.js +54 -30
  29. package/dist/primitives/reject_changes.js.map +1 -1
  30. package/dist/primitives/relationships.d.ts +33 -0
  31. package/dist/primitives/relationships.d.ts.map +1 -1
  32. package/dist/primitives/relationships.js +84 -1
  33. package/dist/primitives/relationships.js.map +1 -1
  34. package/package.json +8 -9
  35. package/dist/atomizer.d.ts +0 -273
  36. package/dist/atomizer.d.ts.map +0 -1
  37. package/dist/atomizer.js +0 -1002
  38. package/dist/atomizer.js.map +0 -1
  39. package/dist/baselines/atomizer/atomLcs.d.ts +0 -82
  40. package/dist/baselines/atomizer/atomLcs.d.ts.map +0 -1
  41. package/dist/baselines/atomizer/atomLcs.js +0 -376
  42. package/dist/baselines/atomizer/atomLcs.js.map +0 -1
  43. package/dist/baselines/atomizer/auxiliaryIdCollision.d.ts +0 -99
  44. package/dist/baselines/atomizer/auxiliaryIdCollision.d.ts.map +0 -1
  45. package/dist/baselines/atomizer/auxiliaryIdCollision.js +0 -415
  46. package/dist/baselines/atomizer/auxiliaryIdCollision.js.map +0 -1
  47. package/dist/baselines/atomizer/consumerCompatibility.d.ts +0 -2
  48. package/dist/baselines/atomizer/consumerCompatibility.d.ts.map +0 -1
  49. package/dist/baselines/atomizer/consumerCompatibility.js +0 -188
  50. package/dist/baselines/atomizer/consumerCompatibility.js.map +0 -1
  51. package/dist/baselines/atomizer/debug.d.ts +0 -41
  52. package/dist/baselines/atomizer/debug.d.ts.map +0 -1
  53. package/dist/baselines/atomizer/debug.js +0 -85
  54. package/dist/baselines/atomizer/debug.js.map +0 -1
  55. package/dist/baselines/atomizer/documentReconstructor.d.ts +0 -75
  56. package/dist/baselines/atomizer/documentReconstructor.d.ts.map +0 -1
  57. package/dist/baselines/atomizer/documentReconstructor.js +0 -1449
  58. package/dist/baselines/atomizer/documentReconstructor.js.map +0 -1
  59. package/dist/baselines/atomizer/formattingFidelity.d.ts +0 -99
  60. package/dist/baselines/atomizer/formattingFidelity.d.ts.map +0 -1
  61. package/dist/baselines/atomizer/formattingFidelity.js +0 -449
  62. package/dist/baselines/atomizer/formattingFidelity.js.map +0 -1
  63. package/dist/baselines/atomizer/hierarchicalLcs.d.ts +0 -121
  64. package/dist/baselines/atomizer/hierarchicalLcs.d.ts.map +0 -1
  65. package/dist/baselines/atomizer/hierarchicalLcs.js +0 -753
  66. package/dist/baselines/atomizer/hierarchicalLcs.js.map +0 -1
  67. package/dist/baselines/atomizer/inPlaceModifier-bookmarks.d.ts +0 -37
  68. package/dist/baselines/atomizer/inPlaceModifier-bookmarks.d.ts.map +0 -1
  69. package/dist/baselines/atomizer/inPlaceModifier-bookmarks.js +0 -189
  70. package/dist/baselines/atomizer/inPlaceModifier-bookmarks.js.map +0 -1
  71. package/dist/baselines/atomizer/inPlaceModifier-containers.d.ts +0 -74
  72. package/dist/baselines/atomizer/inPlaceModifier-containers.d.ts.map +0 -1
  73. package/dist/baselines/atomizer/inPlaceModifier-containers.js +0 -171
  74. package/dist/baselines/atomizer/inPlaceModifier-containers.js.map +0 -1
  75. package/dist/baselines/atomizer/inPlaceModifier-deletion.d.ts +0 -88
  76. package/dist/baselines/atomizer/inPlaceModifier-deletion.d.ts.map +0 -1
  77. package/dist/baselines/atomizer/inPlaceModifier-deletion.js +0 -326
  78. package/dist/baselines/atomizer/inPlaceModifier-deletion.js.map +0 -1
  79. package/dist/baselines/atomizer/inPlaceModifier-postprocess.d.ts +0 -85
  80. package/dist/baselines/atomizer/inPlaceModifier-postprocess.d.ts.map +0 -1
  81. package/dist/baselines/atomizer/inPlaceModifier-postprocess.js +0 -402
  82. package/dist/baselines/atomizer/inPlaceModifier-postprocess.js.map +0 -1
  83. package/dist/baselines/atomizer/inPlaceModifier-presplit.d.ts +0 -39
  84. package/dist/baselines/atomizer/inPlaceModifier-presplit.d.ts.map +0 -1
  85. package/dist/baselines/atomizer/inPlaceModifier-presplit.js +0 -265
  86. package/dist/baselines/atomizer/inPlaceModifier-presplit.js.map +0 -1
  87. package/dist/baselines/atomizer/inPlaceModifier-shared.d.ts +0 -62
  88. package/dist/baselines/atomizer/inPlaceModifier-shared.d.ts.map +0 -1
  89. package/dist/baselines/atomizer/inPlaceModifier-shared.js +0 -139
  90. package/dist/baselines/atomizer/inPlaceModifier-shared.js.map +0 -1
  91. package/dist/baselines/atomizer/inPlaceModifier-wrappers.d.ts +0 -198
  92. package/dist/baselines/atomizer/inPlaceModifier-wrappers.d.ts.map +0 -1
  93. package/dist/baselines/atomizer/inPlaceModifier-wrappers.js +0 -475
  94. package/dist/baselines/atomizer/inPlaceModifier-wrappers.js.map +0 -1
  95. package/dist/baselines/atomizer/inPlaceModifier.d.ts +0 -27
  96. package/dist/baselines/atomizer/inPlaceModifier.d.ts.map +0 -1
  97. package/dist/baselines/atomizer/inPlaceModifier.js +0 -648
  98. package/dist/baselines/atomizer/inPlaceModifier.js.map +0 -1
  99. package/dist/baselines/atomizer/numberingIntegration.d.ts +0 -59
  100. package/dist/baselines/atomizer/numberingIntegration.d.ts.map +0 -1
  101. package/dist/baselines/atomizer/numberingIntegration.js +0 -209
  102. package/dist/baselines/atomizer/numberingIntegration.js.map +0 -1
  103. package/dist/baselines/atomizer/pipeline.d.ts +0 -103
  104. package/dist/baselines/atomizer/pipeline.d.ts.map +0 -1
  105. package/dist/baselines/atomizer/pipeline.js +0 -1160
  106. package/dist/baselines/atomizer/pipeline.js.map +0 -1
  107. package/dist/baselines/atomizer/premergeRuns.d.ts +0 -26
  108. package/dist/baselines/atomizer/premergeRuns.d.ts.map +0 -1
  109. package/dist/baselines/atomizer/premergeRuns.js +0 -153
  110. package/dist/baselines/atomizer/premergeRuns.js.map +0 -1
  111. package/dist/baselines/atomizer/trackChangesAcceptor.d.ts +0 -63
  112. package/dist/baselines/atomizer/trackChangesAcceptor.d.ts.map +0 -1
  113. package/dist/baselines/atomizer/trackChangesAcceptor.js +0 -254
  114. package/dist/baselines/atomizer/trackChangesAcceptor.js.map +0 -1
  115. package/dist/baselines/atomizer/trackChangesAcceptorAst.d.ts +0 -64
  116. package/dist/baselines/atomizer/trackChangesAcceptorAst.d.ts.map +0 -1
  117. package/dist/baselines/atomizer/trackChangesAcceptorAst.js +0 -642
  118. package/dist/baselines/atomizer/trackChangesAcceptorAst.js.map +0 -1
  119. package/dist/baselines/atomizer/xmlToWmlElement.d.ts +0 -65
  120. package/dist/baselines/atomizer/xmlToWmlElement.d.ts.map +0 -1
  121. package/dist/baselines/atomizer/xmlToWmlElement.js +0 -96
  122. package/dist/baselines/atomizer/xmlToWmlElement.js.map +0 -1
  123. package/dist/baselines/wmlcomparer/DocxodusWasm.d.ts +0 -51
  124. package/dist/baselines/wmlcomparer/DocxodusWasm.d.ts.map +0 -1
  125. package/dist/baselines/wmlcomparer/DocxodusWasm.js +0 -83
  126. package/dist/baselines/wmlcomparer/DocxodusWasm.js.map +0 -1
  127. package/dist/baselines/wmlcomparer/DotnetCli.d.ts +0 -40
  128. package/dist/baselines/wmlcomparer/DotnetCli.d.ts.map +0 -1
  129. package/dist/baselines/wmlcomparer/DotnetCli.js +0 -142
  130. package/dist/baselines/wmlcomparer/DotnetCli.js.map +0 -1
  131. package/dist/cli/compare-two.d.ts +0 -28
  132. package/dist/cli/compare-two.d.ts.map +0 -1
  133. package/dist/cli/compare-two.js +0 -112
  134. package/dist/cli/compare-two.js.map +0 -1
  135. package/dist/cli/index.d.ts +0 -3
  136. package/dist/cli/index.d.ts.map +0 -1
  137. package/dist/cli/index.js +0 -25
  138. package/dist/cli/index.js.map +0 -1
  139. package/dist/compare-types.d.ts +0 -197
  140. package/dist/compare-types.d.ts.map +0 -1
  141. package/dist/compare-types.js +0 -2
  142. package/dist/compare-types.js.map +0 -1
  143. package/dist/format-detection.d.ts +0 -120
  144. package/dist/format-detection.d.ts.map +0 -1
  145. package/dist/format-detection.js +0 -339
  146. package/dist/format-detection.js.map +0 -1
  147. package/dist/generation/recipes.d.ts +0 -144
  148. package/dist/generation/recipes.d.ts.map +0 -1
  149. package/dist/generation/recipes.js +0 -358
  150. package/dist/generation/recipes.js.map +0 -1
  151. package/dist/move-detection.d.ts +0 -211
  152. package/dist/move-detection.d.ts.map +0 -1
  153. package/dist/move-detection.js +0 -390
  154. package/dist/move-detection.js.map +0 -1
@@ -1,390 +0,0 @@
1
- /**
2
- * Move Detection Module
3
- *
4
- * Detects relocated content after LCS comparison by matching deleted blocks
5
- * with inserted blocks using Jaccard word similarity.
6
- *
7
- * Pipeline position:
8
- * LCS() → MarkRowsAsDeletedOrInserted() → FlattenToAtomList() → detectMovesInAtomList() → CoalesceRecurse()
9
- *
10
- * @see WmlComparer.cs DetectMovesInAtomList() line 3811
11
- */
12
- import { CorrelationStatus, DEFAULT_MOVE_DETECTION_SETTINGS, } from './core-types.js';
13
- import { getLeafText } from './primitives/index.js';
14
- import { parseXml } from './primitives/xml.js';
15
- // =============================================================================
16
- // Text Extraction
17
- // =============================================================================
18
- /**
19
- * Extract text content from an atom.
20
- *
21
- * @param atom - The atom to extract text from
22
- * @returns The text content, or empty string for non-text atoms
23
- */
24
- export function getAtomText(atom) {
25
- const element = atom.contentElement;
26
- // Handle text elements
27
- if (element.tagName === 'w:t' || element.tagName === 'w:delText') {
28
- return getLeafText(element) ?? '';
29
- }
30
- // Handle break elements
31
- if (element.tagName === 'w:br' || element.tagName === 'w:cr') {
32
- return '\n';
33
- }
34
- // Handle tab
35
- if (element.tagName === 'w:tab') {
36
- return '\t';
37
- }
38
- return '';
39
- }
40
- /**
41
- * Extract text from a sequence of atoms.
42
- *
43
- * @param atoms - The atoms to extract text from
44
- * @returns Combined text content
45
- */
46
- export function getAtomsText(atoms) {
47
- return atoms.map(getAtomText).join('');
48
- }
49
- /**
50
- * Count words in text.
51
- *
52
- * @param text - The text to count words in
53
- * @returns Number of words
54
- */
55
- export function countWords(text) {
56
- const words = text.split(/\s+/).filter(Boolean);
57
- return words.length;
58
- }
59
- // =============================================================================
60
- // Jaccard Similarity
61
- // =============================================================================
62
- /**
63
- * Calculate Jaccard similarity between two texts based on word sets.
64
- *
65
- * Jaccard index = |intersection| / |union|
66
- *
67
- * Benefits:
68
- * - Order-independent: "fox quick brown" matches "brown quick fox"
69
- * - Handles insertions/deletions well: adding one word to a 10-word block only slightly reduces similarity
70
- * - O(n) complexity where n = total words
71
- *
72
- * @param text1 - First text
73
- * @param text2 - Second text
74
- * @param caseInsensitive - Whether to ignore case (default: true)
75
- * @returns Similarity score between 0 and 1
76
- *
77
- * @example
78
- * jaccardWordSimilarity("The quick brown fox", "The quick brown dog")
79
- * // Returns 0.6 (3 common words / 5 total unique words)
80
- */
81
- export function jaccardWordSimilarity(text1, text2, caseInsensitive = true) {
82
- const normalize = caseInsensitive
83
- ? (s) => s.toLowerCase()
84
- : (s) => s;
85
- const words1 = new Set(normalize(text1)
86
- .split(/\s+/)
87
- .filter(Boolean));
88
- const words2 = new Set(normalize(text2)
89
- .split(/\s+/)
90
- .filter(Boolean));
91
- if (words1.size === 0 && words2.size === 0) {
92
- return 1; // Both empty = identical
93
- }
94
- if (words1.size === 0 || words2.size === 0) {
95
- return 0; // One empty = completely different
96
- }
97
- // Calculate intersection
98
- let intersectionSize = 0;
99
- for (const word of words1) {
100
- if (words2.has(word)) {
101
- intersectionSize++;
102
- }
103
- }
104
- // Calculate union (|A| + |B| - |A ∩ B|)
105
- const unionSize = words1.size + words2.size - intersectionSize;
106
- return intersectionSize / unionSize;
107
- }
108
- // =============================================================================
109
- // Block Grouping
110
- // =============================================================================
111
- /**
112
- * Group consecutive atoms by correlation status.
113
- *
114
- * Creates blocks of atoms with the same status (Deleted or Inserted).
115
- *
116
- * @param atoms - The atoms to group
117
- * @returns Array of atom blocks
118
- */
119
- export function groupIntoBlocks(atoms) {
120
- const blocks = [];
121
- let currentBlock = null;
122
- for (const atom of atoms) {
123
- const status = atom.correlationStatus;
124
- // Only group Deleted and Inserted atoms for move detection
125
- if (status !== CorrelationStatus.Deleted && status !== CorrelationStatus.Inserted) {
126
- // End current block
127
- if (currentBlock) {
128
- blocks.push(currentBlock);
129
- currentBlock = null;
130
- }
131
- continue;
132
- }
133
- // Start new block or continue existing
134
- if (!currentBlock || currentBlock.status !== status) {
135
- if (currentBlock) {
136
- blocks.push(currentBlock);
137
- }
138
- currentBlock = {
139
- status,
140
- atoms: [atom],
141
- text: getAtomText(atom),
142
- wordCount: 0, // Calculated at end
143
- };
144
- }
145
- else {
146
- currentBlock.atoms.push(atom);
147
- currentBlock.text += getAtomText(atom);
148
- }
149
- }
150
- // Don't forget the last block
151
- if (currentBlock) {
152
- blocks.push(currentBlock);
153
- }
154
- // Calculate word counts
155
- for (const block of blocks) {
156
- block.wordCount = countWords(block.text);
157
- }
158
- return blocks;
159
- }
160
- /**
161
- * Find the best matching inserted block for a deleted block.
162
- *
163
- * @param deleted - The deleted block to match
164
- * @param insertedBlocks - Available inserted blocks
165
- * @param settings - Move detection settings
166
- * @returns The best match, or undefined if no match meets threshold
167
- */
168
- export function findBestMatch(deleted, insertedBlocks, settings) {
169
- let bestMatch;
170
- for (let i = 0; i < insertedBlocks.length; i++) {
171
- const inserted = insertedBlocks[i];
172
- if (!inserted)
173
- continue;
174
- // Skip already matched blocks (marked as MovedDestination)
175
- if (inserted.atoms.length > 0 &&
176
- inserted.atoms[0]?.correlationStatus === CorrelationStatus.MovedDestination) {
177
- continue;
178
- }
179
- const similarity = jaccardWordSimilarity(deleted.text, inserted.text, settings.caseInsensitiveMove);
180
- if (similarity >= settings.moveSimilarityThreshold) {
181
- if (!bestMatch || similarity > bestMatch.similarity) {
182
- bestMatch = { block: inserted, similarity, index: i };
183
- }
184
- }
185
- }
186
- return bestMatch;
187
- }
188
- // =============================================================================
189
- // Move Marking
190
- // =============================================================================
191
- /**
192
- * Mark atoms as part of a move operation.
193
- *
194
- * @param atoms - Atoms to mark
195
- * @param status - New correlation status (MovedSource or MovedDestination)
196
- * @param moveGroupId - ID linking source and destination
197
- * @param moveName - Name for move tracking (e.g., "move1")
198
- */
199
- export function markAsMove(atoms, status, moveGroupId, moveName) {
200
- for (const atom of atoms) {
201
- atom.correlationStatus = status;
202
- atom.moveGroupId = moveGroupId;
203
- atom.moveName = moveName;
204
- }
205
- }
206
- // =============================================================================
207
- // Main Algorithm
208
- // =============================================================================
209
- /**
210
- * Detect moves in a flat list of atoms.
211
- *
212
- * Runs after LCS comparison to identify deleted blocks that were actually
213
- * moved to a new location. Updates atoms in place with move status.
214
- *
215
- * @param atoms - The atom list to process (modified in place)
216
- * @param settings - Move detection settings (optional, uses defaults)
217
- *
218
- * @see WmlComparer.cs DetectMovesInAtomList() line 3811
219
- *
220
- * @example
221
- * const atoms = atomizeTree(document, [], part);
222
- * runLCSComparison(atoms);
223
- * detectMovesInAtomList(atoms); // Updates atoms in place
224
- */
225
- export function detectMovesInAtomList(atoms, settings = DEFAULT_MOVE_DETECTION_SETTINGS) {
226
- if (!settings.detectMoves) {
227
- return;
228
- }
229
- // 1. Group consecutive atoms by status
230
- const blocks = groupIntoBlocks(atoms);
231
- // 2. Filter by minimum word count
232
- const deletedBlocks = blocks.filter((b) => b.status === CorrelationStatus.Deleted &&
233
- b.wordCount >= settings.moveMinimumWordCount);
234
- const insertedBlocks = blocks.filter((b) => b.status === CorrelationStatus.Inserted &&
235
- b.wordCount >= settings.moveMinimumWordCount);
236
- // 3. Find best matches using Jaccard similarity
237
- let moveGroupId = 1;
238
- for (const deleted of deletedBlocks) {
239
- const bestMatch = findBestMatch(deleted, insertedBlocks, settings);
240
- if (bestMatch) {
241
- // 4. Convert to moves
242
- const moveName = `move${moveGroupId}`;
243
- markAsMove(deleted.atoms, CorrelationStatus.MovedSource, moveGroupId, moveName);
244
- markAsMove(bestMatch.block.atoms, CorrelationStatus.MovedDestination, moveGroupId, moveName);
245
- moveGroupId++;
246
- }
247
- }
248
- }
249
- /**
250
- * Format a date as ISO string for w:date attribute.
251
- */
252
- function formatDateTime(date) {
253
- return date.toISOString();
254
- }
255
- /**
256
- * Generate move source markup (w:moveFrom with range markers).
257
- *
258
- * @param moveName - Name linking source and destination (e.g., "move1")
259
- * @param content - Child elements to wrap
260
- * @param options - Markup generation options
261
- * @returns Move markup elements
262
- *
263
- * @example
264
- * Output structure:
265
- * <w:moveFromRangeStart w:id="1" w:name="move1" w:author="..." w:date="..."/>
266
- * <w:moveFrom w:id="2" w:author="..." w:date="...">
267
- * <!-- content -->
268
- * </w:moveFrom>
269
- * <w:moveFromRangeEnd w:id="1"/>
270
- */
271
- export function generateMoveSourceMarkup(moveName, content, options) {
272
- const doc = parseXml('<root xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main"/>');
273
- const W_NS = 'http://schemas.openxmlformats.org/wordprocessingml/2006/main';
274
- const dateStr = formatDateTime(options.dateTime);
275
- const rangeId = options.startId.toString();
276
- const moveId = (options.startId + 1).toString();
277
- const rangeStart = doc.createElementNS(W_NS, 'w:moveFromRangeStart');
278
- rangeStart.setAttribute('w:id', rangeId);
279
- rangeStart.setAttribute('w:name', moveName);
280
- rangeStart.setAttribute('w:author', options.author);
281
- rangeStart.setAttribute('w:date', dateStr);
282
- const moveWrapper = doc.createElementNS(W_NS, 'w:moveFrom');
283
- moveWrapper.setAttribute('w:id', moveId);
284
- moveWrapper.setAttribute('w:author', options.author);
285
- moveWrapper.setAttribute('w:date', dateStr);
286
- for (const child of content)
287
- moveWrapper.appendChild(child);
288
- const rangeEnd = doc.createElementNS(W_NS, 'w:moveFromRangeEnd');
289
- rangeEnd.setAttribute('w:id', rangeId);
290
- return {
291
- rangeStart,
292
- moveWrapper,
293
- rangeEnd,
294
- nextId: options.startId + 2,
295
- };
296
- }
297
- /**
298
- * Generate move destination markup (w:moveTo with range markers).
299
- *
300
- * @param moveName - Name linking source and destination (e.g., "move1")
301
- * @param content - Child elements to wrap
302
- * @param options - Markup generation options
303
- * @returns Move markup elements
304
- *
305
- * @example
306
- * Output structure:
307
- * <w:moveToRangeStart w:id="3" w:name="move1" w:author="..." w:date="..."/>
308
- * <w:moveTo w:id="4" w:author="..." w:date="...">
309
- * <!-- content -->
310
- * </w:moveTo>
311
- * <w:moveToRangeEnd w:id="3"/>
312
- */
313
- export function generateMoveDestinationMarkup(moveName, content, options) {
314
- const doc = parseXml('<root xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main"/>');
315
- const W_NS = 'http://schemas.openxmlformats.org/wordprocessingml/2006/main';
316
- const dateStr = formatDateTime(options.dateTime);
317
- const rangeId = options.startId.toString();
318
- const moveId = (options.startId + 1).toString();
319
- const rangeStart = doc.createElementNS(W_NS, 'w:moveToRangeStart');
320
- rangeStart.setAttribute('w:id', rangeId);
321
- rangeStart.setAttribute('w:name', moveName);
322
- rangeStart.setAttribute('w:author', options.author);
323
- rangeStart.setAttribute('w:date', dateStr);
324
- const moveWrapper = doc.createElementNS(W_NS, 'w:moveTo');
325
- moveWrapper.setAttribute('w:id', moveId);
326
- moveWrapper.setAttribute('w:author', options.author);
327
- moveWrapper.setAttribute('w:date', dateStr);
328
- for (const child of content)
329
- moveWrapper.appendChild(child);
330
- const rangeEnd = doc.createElementNS(W_NS, 'w:moveToRangeEnd');
331
- rangeEnd.setAttribute('w:id', rangeId);
332
- return {
333
- rangeStart,
334
- moveWrapper,
335
- rangeEnd,
336
- nextId: options.startId + 2,
337
- };
338
- }
339
- /**
340
- * Create initial revision ID state.
341
- *
342
- * @param startId - Starting ID (default: 1)
343
- * @returns Initial state
344
- */
345
- export function createRevisionIdState(startId = 1) {
346
- return {
347
- nextId: startId,
348
- moveRangeIds: new Map(),
349
- };
350
- }
351
- /**
352
- * Allocate IDs for a move operation.
353
- *
354
- * Ensures source and destination use consistent IDs for proper linking.
355
- *
356
- * @param state - Revision ID state (modified in place)
357
- * @param moveName - Move name (e.g., "move1")
358
- * @returns IDs for source and destination markup
359
- */
360
- export function allocateMoveIds(state, moveName) {
361
- let ids = state.moveRangeIds.get(moveName);
362
- if (!ids) {
363
- // Allocate new IDs: source range, source move, dest range, dest move
364
- ids = {
365
- sourceRangeId: state.nextId,
366
- destRangeId: state.nextId + 2,
367
- };
368
- state.moveRangeIds.set(moveName, ids);
369
- state.nextId += 4;
370
- }
371
- return {
372
- sourceRangeId: ids.sourceRangeId,
373
- sourceMoveId: ids.sourceRangeId + 1,
374
- destRangeId: ids.destRangeId,
375
- destMoveId: ids.destRangeId + 1,
376
- };
377
- }
378
- /**
379
- * Fix up revision IDs after all moves have been processed.
380
- *
381
- * Ensures proper ID pairing between source and destination elements.
382
- * This is a post-processing step after markup generation.
383
- *
384
- * @param state - The revision ID state
385
- */
386
- export function fixUpRevisionIds(_state) {
387
- // No-op for now - IDs are allocated consistently during generation
388
- // This function exists for future use if ID renumbering is needed
389
- }
390
- //# sourceMappingURL=move-detection.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"move-detection.js","sourceRoot":"","sources":["../src/move-detection.ts"],"names":[],"mappings":"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"}