@usejunior/docx-core 0.15.0 → 0.17.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 (221) hide show
  1. package/README.md +18 -83
  2. package/dist/.tsbuildinfo +1 -1
  3. package/dist/cli/conformance-adapter.d.ts +14 -0
  4. package/dist/cli/conformance-adapter.d.ts.map +1 -1
  5. package/dist/cli/conformance-adapter.js +104 -12
  6. package/dist/cli/conformance-adapter.js.map +1 -1
  7. package/dist/footnotes.d.ts +7 -5
  8. package/dist/footnotes.d.ts.map +1 -1
  9. package/dist/footnotes.js +7 -5
  10. package/dist/footnotes.js.map +1 -1
  11. package/dist/generated/ecma-376-vocabulary.d.ts +93 -0
  12. package/dist/generated/ecma-376-vocabulary.d.ts.map +1 -0
  13. package/dist/generated/ecma-376-vocabulary.js +87 -0
  14. package/dist/generated/ecma-376-vocabulary.js.map +1 -0
  15. package/dist/generation/compile.js +2 -2
  16. package/dist/generation/compile.js.map +1 -1
  17. package/dist/generation/emit/comments-part.d.ts +2 -0
  18. package/dist/generation/emit/comments-part.d.ts.map +1 -1
  19. package/dist/generation/emit/comments-part.js +2 -0
  20. package/dist/generation/emit/comments-part.js.map +1 -1
  21. package/dist/generation/emit/paragraph.d.ts +3 -0
  22. package/dist/generation/emit/paragraph.d.ts.map +1 -1
  23. package/dist/generation/emit/paragraph.js +3 -0
  24. package/dist/generation/emit/paragraph.js.map +1 -1
  25. package/dist/generation/emit/run.d.ts.map +1 -1
  26. package/dist/generation/emit/run.js +6 -1
  27. package/dist/generation/emit/run.js.map +1 -1
  28. package/dist/generation/emit/settings-part.d.ts +12 -3
  29. package/dist/generation/emit/settings-part.d.ts.map +1 -1
  30. package/dist/generation/emit/settings-part.js +23 -5
  31. package/dist/generation/emit/settings-part.js.map +1 -1
  32. package/dist/generation/ordering.d.ts +3 -1
  33. package/dist/generation/ordering.d.ts.map +1 -1
  34. package/dist/generation/ordering.js +3 -1
  35. package/dist/generation/ordering.js.map +1 -1
  36. package/dist/generation/schema-enum-domains.d.ts +27 -0
  37. package/dist/generation/schema-enum-domains.d.ts.map +1 -0
  38. package/dist/generation/schema-enum-domains.js +69 -0
  39. package/dist/generation/schema-enum-domains.js.map +1 -0
  40. package/dist/generation/structural-checks.js +7 -1
  41. package/dist/generation/structural-checks.js.map +1 -1
  42. package/dist/generation/validate-spec.d.ts.map +1 -1
  43. package/dist/generation/validate-spec.js +149 -31
  44. package/dist/generation/validate-spec.js.map +1 -1
  45. package/dist/index.d.ts +7 -24
  46. package/dist/index.d.ts.map +1 -1
  47. package/dist/index.js +7 -46
  48. package/dist/index.js.map +1 -1
  49. package/dist/primitives/accept_ai_edits.d.ts +87 -0
  50. package/dist/primitives/accept_ai_edits.d.ts.map +1 -0
  51. package/dist/primitives/accept_ai_edits.js +253 -0
  52. package/dist/primitives/accept_ai_edits.js.map +1 -0
  53. package/dist/primitives/accept_changes.d.ts +36 -3
  54. package/dist/primitives/accept_changes.d.ts.map +1 -1
  55. package/dist/primitives/accept_changes.js +67 -31
  56. package/dist/primitives/accept_changes.js.map +1 -1
  57. package/dist/primitives/bookmarks.d.ts +44 -0
  58. package/dist/primitives/bookmarks.d.ts.map +1 -1
  59. package/dist/primitives/bookmarks.js +149 -11
  60. package/dist/primitives/bookmarks.js.map +1 -1
  61. package/dist/primitives/document.d.ts +53 -1
  62. package/dist/primitives/document.d.ts.map +1 -1
  63. package/dist/primitives/document.js +146 -2
  64. package/dist/primitives/document.js.map +1 -1
  65. package/dist/primitives/dom-helpers.d.ts.map +1 -1
  66. package/dist/primitives/dom-helpers.js +7 -2
  67. package/dist/primitives/dom-helpers.js.map +1 -1
  68. package/dist/primitives/index.d.ts +2 -1
  69. package/dist/primitives/index.d.ts.map +1 -1
  70. package/dist/primitives/index.js +2 -1
  71. package/dist/primitives/index.js.map +1 -1
  72. package/dist/primitives/layout.d.ts.map +1 -1
  73. package/dist/primitives/layout.js +41 -1
  74. package/dist/primitives/layout.js.map +1 -1
  75. package/dist/primitives/namespaces.d.ts +2 -0
  76. package/dist/primitives/namespaces.d.ts.map +1 -1
  77. package/dist/primitives/namespaces.js +2 -0
  78. package/dist/primitives/namespaces.js.map +1 -1
  79. package/dist/primitives/reject_changes.d.ts +21 -2
  80. package/dist/primitives/reject_changes.d.ts.map +1 -1
  81. package/dist/primitives/reject_changes.js +71 -31
  82. package/dist/primitives/reject_changes.js.map +1 -1
  83. package/dist/primitives/relationships.d.ts +33 -0
  84. package/dist/primitives/relationships.d.ts.map +1 -1
  85. package/dist/primitives/relationships.js +84 -1
  86. package/dist/primitives/relationships.js.map +1 -1
  87. package/dist/primitives/sectPrAudit.d.ts +11 -2
  88. package/dist/primitives/sectPrAudit.d.ts.map +1 -1
  89. package/dist/primitives/sectPrAudit.js +148 -23
  90. package/dist/primitives/sectPrAudit.js.map +1 -1
  91. package/dist/primitives/track-changes-emitter.d.ts +4 -0
  92. package/dist/primitives/track-changes-emitter.d.ts.map +1 -1
  93. package/dist/primitives/track-changes-emitter.js +5 -2
  94. package/dist/primitives/track-changes-emitter.js.map +1 -1
  95. package/dist/primitives/validate_ai_revisions.d.ts.map +1 -1
  96. package/dist/primitives/validate_ai_revisions.js +13 -5
  97. package/dist/primitives/validate_ai_revisions.js.map +1 -1
  98. package/dist/primitives/zip.d.ts.map +1 -1
  99. package/dist/primitives/zip.js +6 -2
  100. package/dist/primitives/zip.js.map +1 -1
  101. package/dist/shared/field-structure.d.ts +6 -0
  102. package/dist/shared/field-structure.d.ts.map +1 -1
  103. package/dist/shared/field-structure.js +6 -0
  104. package/dist/shared/field-structure.js.map +1 -1
  105. package/package.json +4 -8
  106. package/dist/atomizer.d.ts +0 -273
  107. package/dist/atomizer.d.ts.map +0 -1
  108. package/dist/atomizer.js +0 -1002
  109. package/dist/atomizer.js.map +0 -1
  110. package/dist/baselines/atomizer/atomLcs.d.ts +0 -82
  111. package/dist/baselines/atomizer/atomLcs.d.ts.map +0 -1
  112. package/dist/baselines/atomizer/atomLcs.js +0 -376
  113. package/dist/baselines/atomizer/atomLcs.js.map +0 -1
  114. package/dist/baselines/atomizer/auxiliaryIdCollision.d.ts +0 -99
  115. package/dist/baselines/atomizer/auxiliaryIdCollision.d.ts.map +0 -1
  116. package/dist/baselines/atomizer/auxiliaryIdCollision.js +0 -415
  117. package/dist/baselines/atomizer/auxiliaryIdCollision.js.map +0 -1
  118. package/dist/baselines/atomizer/consumerCompatibility.d.ts +0 -2
  119. package/dist/baselines/atomizer/consumerCompatibility.d.ts.map +0 -1
  120. package/dist/baselines/atomizer/consumerCompatibility.js +0 -188
  121. package/dist/baselines/atomizer/consumerCompatibility.js.map +0 -1
  122. package/dist/baselines/atomizer/debug.d.ts +0 -41
  123. package/dist/baselines/atomizer/debug.d.ts.map +0 -1
  124. package/dist/baselines/atomizer/debug.js +0 -85
  125. package/dist/baselines/atomizer/debug.js.map +0 -1
  126. package/dist/baselines/atomizer/documentReconstructor.d.ts +0 -75
  127. package/dist/baselines/atomizer/documentReconstructor.d.ts.map +0 -1
  128. package/dist/baselines/atomizer/documentReconstructor.js +0 -1449
  129. package/dist/baselines/atomizer/documentReconstructor.js.map +0 -1
  130. package/dist/baselines/atomizer/formattingFidelity.d.ts +0 -99
  131. package/dist/baselines/atomizer/formattingFidelity.d.ts.map +0 -1
  132. package/dist/baselines/atomizer/formattingFidelity.js +0 -449
  133. package/dist/baselines/atomizer/formattingFidelity.js.map +0 -1
  134. package/dist/baselines/atomizer/hierarchicalLcs.d.ts +0 -121
  135. package/dist/baselines/atomizer/hierarchicalLcs.d.ts.map +0 -1
  136. package/dist/baselines/atomizer/hierarchicalLcs.js +0 -753
  137. package/dist/baselines/atomizer/hierarchicalLcs.js.map +0 -1
  138. package/dist/baselines/atomizer/inPlaceModifier-bookmarks.d.ts +0 -37
  139. package/dist/baselines/atomizer/inPlaceModifier-bookmarks.d.ts.map +0 -1
  140. package/dist/baselines/atomizer/inPlaceModifier-bookmarks.js +0 -189
  141. package/dist/baselines/atomizer/inPlaceModifier-bookmarks.js.map +0 -1
  142. package/dist/baselines/atomizer/inPlaceModifier-containers.d.ts +0 -74
  143. package/dist/baselines/atomizer/inPlaceModifier-containers.d.ts.map +0 -1
  144. package/dist/baselines/atomizer/inPlaceModifier-containers.js +0 -171
  145. package/dist/baselines/atomizer/inPlaceModifier-containers.js.map +0 -1
  146. package/dist/baselines/atomizer/inPlaceModifier-deletion.d.ts +0 -88
  147. package/dist/baselines/atomizer/inPlaceModifier-deletion.d.ts.map +0 -1
  148. package/dist/baselines/atomizer/inPlaceModifier-deletion.js +0 -326
  149. package/dist/baselines/atomizer/inPlaceModifier-deletion.js.map +0 -1
  150. package/dist/baselines/atomizer/inPlaceModifier-postprocess.d.ts +0 -85
  151. package/dist/baselines/atomizer/inPlaceModifier-postprocess.d.ts.map +0 -1
  152. package/dist/baselines/atomizer/inPlaceModifier-postprocess.js +0 -402
  153. package/dist/baselines/atomizer/inPlaceModifier-postprocess.js.map +0 -1
  154. package/dist/baselines/atomizer/inPlaceModifier-presplit.d.ts +0 -39
  155. package/dist/baselines/atomizer/inPlaceModifier-presplit.d.ts.map +0 -1
  156. package/dist/baselines/atomizer/inPlaceModifier-presplit.js +0 -265
  157. package/dist/baselines/atomizer/inPlaceModifier-presplit.js.map +0 -1
  158. package/dist/baselines/atomizer/inPlaceModifier-shared.d.ts +0 -62
  159. package/dist/baselines/atomizer/inPlaceModifier-shared.d.ts.map +0 -1
  160. package/dist/baselines/atomizer/inPlaceModifier-shared.js +0 -139
  161. package/dist/baselines/atomizer/inPlaceModifier-shared.js.map +0 -1
  162. package/dist/baselines/atomizer/inPlaceModifier-wrappers.d.ts +0 -198
  163. package/dist/baselines/atomizer/inPlaceModifier-wrappers.d.ts.map +0 -1
  164. package/dist/baselines/atomizer/inPlaceModifier-wrappers.js +0 -475
  165. package/dist/baselines/atomizer/inPlaceModifier-wrappers.js.map +0 -1
  166. package/dist/baselines/atomizer/inPlaceModifier.d.ts +0 -27
  167. package/dist/baselines/atomizer/inPlaceModifier.d.ts.map +0 -1
  168. package/dist/baselines/atomizer/inPlaceModifier.js +0 -648
  169. package/dist/baselines/atomizer/inPlaceModifier.js.map +0 -1
  170. package/dist/baselines/atomizer/numberingIntegration.d.ts +0 -59
  171. package/dist/baselines/atomizer/numberingIntegration.d.ts.map +0 -1
  172. package/dist/baselines/atomizer/numberingIntegration.js +0 -209
  173. package/dist/baselines/atomizer/numberingIntegration.js.map +0 -1
  174. package/dist/baselines/atomizer/pipeline.d.ts +0 -103
  175. package/dist/baselines/atomizer/pipeline.d.ts.map +0 -1
  176. package/dist/baselines/atomizer/pipeline.js +0 -1160
  177. package/dist/baselines/atomizer/pipeline.js.map +0 -1
  178. package/dist/baselines/atomizer/premergeRuns.d.ts +0 -26
  179. package/dist/baselines/atomizer/premergeRuns.d.ts.map +0 -1
  180. package/dist/baselines/atomizer/premergeRuns.js +0 -153
  181. package/dist/baselines/atomizer/premergeRuns.js.map +0 -1
  182. package/dist/baselines/atomizer/trackChangesAcceptor.d.ts +0 -63
  183. package/dist/baselines/atomizer/trackChangesAcceptor.d.ts.map +0 -1
  184. package/dist/baselines/atomizer/trackChangesAcceptor.js +0 -254
  185. package/dist/baselines/atomizer/trackChangesAcceptor.js.map +0 -1
  186. package/dist/baselines/atomizer/trackChangesAcceptorAst.d.ts +0 -64
  187. package/dist/baselines/atomizer/trackChangesAcceptorAst.d.ts.map +0 -1
  188. package/dist/baselines/atomizer/trackChangesAcceptorAst.js +0 -642
  189. package/dist/baselines/atomizer/trackChangesAcceptorAst.js.map +0 -1
  190. package/dist/baselines/atomizer/xmlToWmlElement.d.ts +0 -65
  191. package/dist/baselines/atomizer/xmlToWmlElement.d.ts.map +0 -1
  192. package/dist/baselines/atomizer/xmlToWmlElement.js +0 -96
  193. package/dist/baselines/atomizer/xmlToWmlElement.js.map +0 -1
  194. package/dist/baselines/wmlcomparer/DocxodusWasm.d.ts +0 -51
  195. package/dist/baselines/wmlcomparer/DocxodusWasm.d.ts.map +0 -1
  196. package/dist/baselines/wmlcomparer/DocxodusWasm.js +0 -83
  197. package/dist/baselines/wmlcomparer/DocxodusWasm.js.map +0 -1
  198. package/dist/baselines/wmlcomparer/DotnetCli.d.ts +0 -40
  199. package/dist/baselines/wmlcomparer/DotnetCli.d.ts.map +0 -1
  200. package/dist/baselines/wmlcomparer/DotnetCli.js +0 -142
  201. package/dist/baselines/wmlcomparer/DotnetCli.js.map +0 -1
  202. package/dist/cli/compare-two.d.ts +0 -28
  203. package/dist/cli/compare-two.d.ts.map +0 -1
  204. package/dist/cli/compare-two.js +0 -112
  205. package/dist/cli/compare-two.js.map +0 -1
  206. package/dist/cli/index.d.ts +0 -3
  207. package/dist/cli/index.d.ts.map +0 -1
  208. package/dist/cli/index.js +0 -25
  209. package/dist/cli/index.js.map +0 -1
  210. package/dist/compare-types.d.ts +0 -197
  211. package/dist/compare-types.d.ts.map +0 -1
  212. package/dist/compare-types.js +0 -2
  213. package/dist/compare-types.js.map +0 -1
  214. package/dist/format-detection.d.ts +0 -120
  215. package/dist/format-detection.d.ts.map +0 -1
  216. package/dist/format-detection.js +0 -339
  217. package/dist/format-detection.js.map +0 -1
  218. package/dist/move-detection.d.ts +0 -211
  219. package/dist/move-detection.d.ts.map +0 -1
  220. package/dist/move-detection.js +0 -390
  221. 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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"}