@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,339 +0,0 @@
1
- /**
2
- * Format Change Detection Module
3
- *
4
- * Detects formatting changes (bold, italic, font size, etc.) between
5
- * documents after LCS comparison. Runs on atoms marked as Equal to
6
- * identify text that matches but has different formatting.
7
- *
8
- * Pipeline position:
9
- * LCS() → FlattenToAtomList() → detectMovesInAtomList() → detectFormatChangesInAtomList() → CoalesceRecurse()
10
- *
11
- * @see design.md Decision 10: Format Change Detection as Post-LCS Phase
12
- */
13
- import { CorrelationStatus, DEFAULT_FORMAT_DETECTION_SETTINGS, RUN_PROPERTY_FRIENDLY_NAMES, } from './core-types.js';
14
- import { getLeafText, childElements } from './primitives/index.js';
15
- import { parseXml } from './primitives/xml.js';
16
- // =============================================================================
17
- // Run Property Extraction
18
- // =============================================================================
19
- /**
20
- * Extract run properties (w:rPr) from an atom's ancestor elements.
21
- *
22
- * Finds the w:r (run) element in ancestors and extracts its w:rPr child.
23
- *
24
- * @param atom - The atom to extract properties from
25
- * @returns The w:rPr element, or null if not found
26
- *
27
- * @example
28
- * // For an atom inside <w:r><w:rPr><w:b/></w:rPr><w:t>text</w:t></w:r>
29
- * // Returns the <w:rPr><w:b/></w:rPr> element
30
- */
31
- export function getRunPropertiesFromAtom(atom) {
32
- // Find the w:r ancestor element
33
- const runElement = atom.ancestorElements?.find((a) => a.tagName === 'w:r');
34
- if (!runElement) {
35
- return null;
36
- }
37
- // Get the rPr child element
38
- for (const child of childElements(runElement)) {
39
- if (child.tagName === 'w:rPr')
40
- return child;
41
- }
42
- return null;
43
- }
44
- function extractNormalizedProperties(rPr) {
45
- if (!rPr) {
46
- return { children: [] };
47
- }
48
- const normalizedChildren = childElements(rPr)
49
- // Remove revision tracking elements
50
- .filter((e) => e.tagName !== 'w:rPrChange')
51
- // Sort by tag name for deterministic comparison
52
- .sort((a, b) => a.tagName.localeCompare(b.tagName))
53
- // Normalize each child
54
- .map((e) => {
55
- const attrs = [];
56
- for (let i = 0; i < e.attributes.length; i++) {
57
- const attr = e.attributes[i];
58
- attrs.push([attr.name, attr.value]);
59
- }
60
- attrs.sort(([a], [b]) => a.localeCompare(b));
61
- const text = getLeafText(e);
62
- const prop = { tagName: e.tagName, attrs };
63
- if (text !== undefined)
64
- prop.text = text;
65
- return prop;
66
- });
67
- return { children: normalizedChildren };
68
- }
69
- // =============================================================================
70
- // Run Property Comparison
71
- // =============================================================================
72
- /**
73
- * Serialize normalized properties to a string for comparison.
74
- */
75
- function serializeNormalizedProperties(rPr) {
76
- const parts = [];
77
- for (const child of rPr.children) {
78
- const attrs = child.attrs
79
- .map(([k, v]) => `${k}="${v}"`)
80
- .join(' ');
81
- const textPart = child.text ? `|${child.text}` : '';
82
- parts.push(`<${child.tagName} ${attrs}${textPart}/>`);
83
- }
84
- return parts.join('');
85
- }
86
- /**
87
- * Check if two run properties are equal after normalization.
88
- */
89
- export function areRunPropertiesEqual(rPr1, rPr2) {
90
- const norm1 = extractNormalizedProperties(rPr1);
91
- const norm2 = extractNormalizedProperties(rPr2);
92
- return serializeNormalizedProperties(norm1) === serializeNormalizedProperties(norm2);
93
- }
94
- // Keep legacy overload for callers that pass WmlElement (= Element)
95
- export { areRunPropertiesEqual as areNormalizedRunPropertiesEqual };
96
- // =============================================================================
97
- // Changed Property Detection
98
- // =============================================================================
99
- /**
100
- * Get the set of property tag names from a normalized rPr.
101
- */
102
- function getPropertyTagNames(rPr) {
103
- return new Set(rPr.children.map((c) => c.tagName));
104
- }
105
- /**
106
- * Find a property element by tag name in a normalized rPr.
107
- */
108
- function findPropertyByTag(rPr, tagName) {
109
- return rPr.children.find((c) => c.tagName === tagName);
110
- }
111
- /**
112
- * Check if two property elements have the same value.
113
- */
114
- function arePropertiesValueEqual(prop1, prop2) {
115
- if (!prop1 && !prop2)
116
- return true;
117
- if (!prop1 || !prop2)
118
- return false;
119
- const str1 = serializeNormalizedProperties({ children: [prop1] });
120
- const str2 = serializeNormalizedProperties({ children: [prop2] });
121
- return str1 === str2;
122
- }
123
- /**
124
- * Get the list of property names that changed between two run properties.
125
- *
126
- * Returns friendly names (e.g., "bold", "italic") when available,
127
- * otherwise returns the OOXML tag name.
128
- *
129
- * @param oldRPr - Old run properties element (or null)
130
- * @param newRPr - New run properties element (or null)
131
- * @returns Array of changed property names
132
- */
133
- export function getChangedPropertyNames(oldRPr, newRPr) {
134
- const changed = [];
135
- const normalizedOld = extractNormalizedProperties(oldRPr);
136
- const normalizedNew = extractNormalizedProperties(newRPr);
137
- const oldTags = getPropertyTagNames(normalizedOld);
138
- const newTags = getPropertyTagNames(normalizedNew);
139
- // All unique tags from both
140
- const allTags = new Set([...oldTags, ...newTags]);
141
- for (const tag of allTags) {
142
- const oldProp = findPropertyByTag(normalizedOld, tag);
143
- const newProp = findPropertyByTag(normalizedNew, tag);
144
- if (!arePropertiesValueEqual(oldProp, newProp)) {
145
- // Use friendly name if available
146
- const friendlyName = RUN_PROPERTY_FRIENDLY_NAMES[tag] ?? tag;
147
- changed.push(friendlyName);
148
- }
149
- }
150
- return changed.sort();
151
- }
152
- /**
153
- * Categorize changed properties into added, removed, and modified.
154
- *
155
- * @param oldRPr - Old run properties element (or null)
156
- * @param newRPr - New run properties element (or null)
157
- * @returns Object with added, removed, and changed arrays
158
- */
159
- export function categorizePropertyChanges(oldRPr, newRPr) {
160
- const added = [];
161
- const removed = [];
162
- const changed = [];
163
- const normalizedOld = extractNormalizedProperties(oldRPr);
164
- const normalizedNew = extractNormalizedProperties(newRPr);
165
- const oldTags = getPropertyTagNames(normalizedOld);
166
- const newTags = getPropertyTagNames(normalizedNew);
167
- // Check for added properties (in new but not old)
168
- for (const tag of newTags) {
169
- if (!oldTags.has(tag)) {
170
- const friendlyName = RUN_PROPERTY_FRIENDLY_NAMES[tag] ?? tag;
171
- added.push(friendlyName);
172
- }
173
- }
174
- // Check for removed properties (in old but not new)
175
- for (const tag of oldTags) {
176
- if (!newTags.has(tag)) {
177
- const friendlyName = RUN_PROPERTY_FRIENDLY_NAMES[tag] ?? tag;
178
- removed.push(friendlyName);
179
- }
180
- }
181
- // Check for changed properties (in both but different value)
182
- for (const tag of oldTags) {
183
- if (newTags.has(tag)) {
184
- const oldProp = findPropertyByTag(normalizedOld, tag);
185
- const newProp = findPropertyByTag(normalizedNew, tag);
186
- if (!arePropertiesValueEqual(oldProp, newProp)) {
187
- const friendlyName = RUN_PROPERTY_FRIENDLY_NAMES[tag] ?? tag;
188
- changed.push(friendlyName);
189
- }
190
- }
191
- }
192
- return {
193
- added: added.sort(),
194
- removed: removed.sort(),
195
- changed: changed.sort(),
196
- };
197
- }
198
- // =============================================================================
199
- // Main Algorithm
200
- // =============================================================================
201
- /**
202
- * Detect format changes in a flat list of atoms.
203
- *
204
- * Runs after LCS and move detection to identify Equal atoms where the text
205
- * matches but formatting differs. Updates atoms in place with format change status.
206
- *
207
- * @param atoms - The atom list to process (modified in place)
208
- * @param settings - Format detection settings (optional, uses defaults)
209
- */
210
- export function detectFormatChangesInAtomList(atoms, settings = DEFAULT_FORMAT_DETECTION_SETTINGS) {
211
- if (!settings.detectFormatChanges) {
212
- return;
213
- }
214
- for (const atom of atoms) {
215
- // Only check Equal atoms that have a "before" reference
216
- if (atom.correlationStatus !== CorrelationStatus.Equal) {
217
- continue;
218
- }
219
- if (!atom.comparisonUnitAtomBefore) {
220
- continue;
221
- }
222
- // Extract rPr from both documents
223
- const oldRPr = getRunPropertiesFromAtom(atom.comparisonUnitAtomBefore);
224
- const newRPr = getRunPropertiesFromAtom(atom);
225
- // Compare run properties
226
- if (!areRunPropertiesEqual(oldRPr, newRPr)) {
227
- atom.correlationStatus = CorrelationStatus.FormatChanged;
228
- atom.formatChange = {
229
- oldRunProperties: oldRPr,
230
- newRunProperties: newRPr,
231
- changedProperties: getChangedPropertyNames(oldRPr, newRPr),
232
- };
233
- }
234
- }
235
- }
236
- /**
237
- * Merge format change markup into a run's existing rPr element.
238
- *
239
- * Adds the w:rPrChange element as the last child of w:rPr.
240
- *
241
- * @param runElement - The w:r element to modify
242
- * @param rPrChange - The w:rPrChange element to insert
243
- */
244
- export function mergeFormatChangeIntoRun(runElement, rPrChange) {
245
- if (runElement.tagName !== 'w:r') {
246
- return;
247
- }
248
- // Find existing rPr
249
- let rPr = null;
250
- for (const child of childElements(runElement)) {
251
- if (child.tagName === 'w:rPr') {
252
- rPr = child;
253
- break;
254
- }
255
- }
256
- if (!rPr) {
257
- // Create rPr as first child
258
- const doc = runElement.ownerDocument;
259
- rPr = doc.createElementNS('http://schemas.openxmlformats.org/wordprocessingml/2006/main', 'w:rPr');
260
- runElement.insertBefore(rPr, runElement.firstChild);
261
- }
262
- // Add rPrChange as last child of rPr
263
- rPr.appendChild(rPrChange);
264
- }
265
- // =============================================================================
266
- // Paragraph Property Change Support (Future Enhancement)
267
- // =============================================================================
268
- /**
269
- * Extract paragraph properties (w:pPr) from an element.
270
- *
271
- * @param paragraphElement - The w:p element
272
- * @returns The w:pPr element, or null if not found
273
- */
274
- export function getParagraphProperties(paragraphElement) {
275
- if (paragraphElement.tagName !== 'w:p') {
276
- return null;
277
- }
278
- for (const child of childElements(paragraphElement)) {
279
- if (child.tagName === 'w:pPr')
280
- return child;
281
- }
282
- return null;
283
- }
284
- /**
285
- * Paragraph property friendly names.
286
- */
287
- export const PARAGRAPH_PROPERTY_FRIENDLY_NAMES = {
288
- 'w:jc': 'alignment',
289
- 'w:ind': 'indentation',
290
- 'w:spacing': 'spacing',
291
- 'w:pStyle': 'style',
292
- 'w:numPr': 'numbering',
293
- 'w:pBdr': 'borders',
294
- 'w:shd': 'shading',
295
- 'w:tabs': 'tabs',
296
- 'w:keepNext': 'keepWithNext',
297
- 'w:keepLines': 'keepLinesTogether',
298
- 'w:pageBreakBefore': 'pageBreakBefore',
299
- 'w:widowControl': 'widowControl',
300
- 'w:outlineLvl': 'outlineLevel',
301
- };
302
- // =============================================================================
303
- // Legacy API — kept for backward compatibility during migration
304
- // =============================================================================
305
- /**
306
- * @deprecated Use areRunPropertiesEqual directly with Element params
307
- */
308
- export function normalizeRunProperties(rPr) {
309
- return extractNormalizedProperties(rPr);
310
- }
311
- /**
312
- * @deprecated Use getParagraphProperties directly
313
- */
314
- export function normalizeParagraphProperties(pPr) {
315
- return extractNormalizedProperties(pPr);
316
- }
317
- /**
318
- * @deprecated Removed — use generateFormatChangeMarkup with DOM approach
319
- */
320
- export function generateFormatChangeMarkup(formatChange, options) {
321
- const doc = parseXml('<root/>');
322
- const dateStr = options.dateTime.toISOString();
323
- const W_NS = 'http://schemas.openxmlformats.org/wordprocessingml/2006/main';
324
- const rPrChange = doc.createElementNS(W_NS, 'w:rPrChange');
325
- rPrChange.setAttribute('w:id', options.id.toString());
326
- rPrChange.setAttribute('w:author', options.author);
327
- rPrChange.setAttribute('w:date', dateStr);
328
- const rPr = doc.createElementNS(W_NS, 'w:rPr');
329
- rPrChange.appendChild(rPr);
330
- if (formatChange.oldRunProperties) {
331
- for (const child of childElements(formatChange.oldRunProperties)) {
332
- if (child.tagName === 'w:rPrChange')
333
- continue;
334
- rPr.appendChild(child.cloneNode(true));
335
- }
336
- }
337
- return rPrChange;
338
- }
339
- //# sourceMappingURL=format-detection.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"format-detection.js","sourceRoot":"","sources":["../src/format-detection.ts"],"names":[],"mappings":"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"}
@@ -1,211 +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 { AtomBlock, ComparisonUnitAtom, CorrelationStatus, MoveDetectionSettings } from './core-types.js';
13
- /**
14
- * Extract text content from an atom.
15
- *
16
- * @param atom - The atom to extract text from
17
- * @returns The text content, or empty string for non-text atoms
18
- */
19
- export declare function getAtomText(atom: ComparisonUnitAtom): string;
20
- /**
21
- * Extract text from a sequence of atoms.
22
- *
23
- * @param atoms - The atoms to extract text from
24
- * @returns Combined text content
25
- */
26
- export declare function getAtomsText(atoms: ComparisonUnitAtom[]): string;
27
- /**
28
- * Count words in text.
29
- *
30
- * @param text - The text to count words in
31
- * @returns Number of words
32
- */
33
- export declare function countWords(text: string): number;
34
- /**
35
- * Calculate Jaccard similarity between two texts based on word sets.
36
- *
37
- * Jaccard index = |intersection| / |union|
38
- *
39
- * Benefits:
40
- * - Order-independent: "fox quick brown" matches "brown quick fox"
41
- * - Handles insertions/deletions well: adding one word to a 10-word block only slightly reduces similarity
42
- * - O(n) complexity where n = total words
43
- *
44
- * @param text1 - First text
45
- * @param text2 - Second text
46
- * @param caseInsensitive - Whether to ignore case (default: true)
47
- * @returns Similarity score between 0 and 1
48
- *
49
- * @example
50
- * jaccardWordSimilarity("The quick brown fox", "The quick brown dog")
51
- * // Returns 0.6 (3 common words / 5 total unique words)
52
- */
53
- export declare function jaccardWordSimilarity(text1: string, text2: string, caseInsensitive?: boolean): number;
54
- /**
55
- * Group consecutive atoms by correlation status.
56
- *
57
- * Creates blocks of atoms with the same status (Deleted or Inserted).
58
- *
59
- * @param atoms - The atoms to group
60
- * @returns Array of atom blocks
61
- */
62
- export declare function groupIntoBlocks(atoms: ComparisonUnitAtom[]): AtomBlock[];
63
- /**
64
- * Result of finding the best match for a deleted block.
65
- */
66
- interface MatchResult {
67
- /** The matching inserted block */
68
- block: AtomBlock;
69
- /** Similarity score between 0 and 1 */
70
- similarity: number;
71
- /** Index in the insertedBlocks array */
72
- index: number;
73
- }
74
- /**
75
- * Find the best matching inserted block for a deleted block.
76
- *
77
- * @param deleted - The deleted block to match
78
- * @param insertedBlocks - Available inserted blocks
79
- * @param settings - Move detection settings
80
- * @returns The best match, or undefined if no match meets threshold
81
- */
82
- export declare function findBestMatch(deleted: AtomBlock, insertedBlocks: AtomBlock[], settings: MoveDetectionSettings): MatchResult | undefined;
83
- /**
84
- * Mark atoms as part of a move operation.
85
- *
86
- * @param atoms - Atoms to mark
87
- * @param status - New correlation status (MovedSource or MovedDestination)
88
- * @param moveGroupId - ID linking source and destination
89
- * @param moveName - Name for move tracking (e.g., "move1")
90
- */
91
- export declare function markAsMove(atoms: ComparisonUnitAtom[], status: CorrelationStatus.MovedSource | CorrelationStatus.MovedDestination, moveGroupId: number, moveName: string): void;
92
- /**
93
- * Detect moves in a flat list of atoms.
94
- *
95
- * Runs after LCS comparison to identify deleted blocks that were actually
96
- * moved to a new location. Updates atoms in place with move status.
97
- *
98
- * @param atoms - The atom list to process (modified in place)
99
- * @param settings - Move detection settings (optional, uses defaults)
100
- *
101
- * @see WmlComparer.cs DetectMovesInAtomList() line 3811
102
- *
103
- * @example
104
- * const atoms = atomizeTree(document, [], part);
105
- * runLCSComparison(atoms);
106
- * detectMovesInAtomList(atoms); // Updates atoms in place
107
- */
108
- export declare function detectMovesInAtomList(atoms: ComparisonUnitAtom[], settings?: MoveDetectionSettings): void;
109
- /**
110
- * Options for generating move markup.
111
- */
112
- export interface MoveMarkupOptions {
113
- /** Author name for revision tracking */
114
- author: string;
115
- /** Timestamp for revisions */
116
- dateTime: Date;
117
- /** Starting ID for range markers */
118
- startId: number;
119
- }
120
- /**
121
- * Generated move markup for a block.
122
- */
123
- export interface MoveMarkup {
124
- /** Range start element */
125
- rangeStart: Element;
126
- /** Move content wrapper element */
127
- moveWrapper: Element;
128
- /** Range end element */
129
- rangeEnd: Element;
130
- /** Next available ID after these elements */
131
- nextId: number;
132
- }
133
- /**
134
- * Generate move source markup (w:moveFrom with range markers).
135
- *
136
- * @param moveName - Name linking source and destination (e.g., "move1")
137
- * @param content - Child elements to wrap
138
- * @param options - Markup generation options
139
- * @returns Move markup elements
140
- *
141
- * @example
142
- * Output structure:
143
- * <w:moveFromRangeStart w:id="1" w:name="move1" w:author="..." w:date="..."/>
144
- * <w:moveFrom w:id="2" w:author="..." w:date="...">
145
- * <!-- content -->
146
- * </w:moveFrom>
147
- * <w:moveFromRangeEnd w:id="1"/>
148
- */
149
- export declare function generateMoveSourceMarkup(moveName: string, content: Element[], options: MoveMarkupOptions): MoveMarkup;
150
- /**
151
- * Generate move destination markup (w:moveTo with range markers).
152
- *
153
- * @param moveName - Name linking source and destination (e.g., "move1")
154
- * @param content - Child elements to wrap
155
- * @param options - Markup generation options
156
- * @returns Move markup elements
157
- *
158
- * @example
159
- * Output structure:
160
- * <w:moveToRangeStart w:id="3" w:name="move1" w:author="..." w:date="..."/>
161
- * <w:moveTo w:id="4" w:author="..." w:date="...">
162
- * <!-- content -->
163
- * </w:moveTo>
164
- * <w:moveToRangeEnd w:id="3"/>
165
- */
166
- export declare function generateMoveDestinationMarkup(moveName: string, content: Element[], options: MoveMarkupOptions): MoveMarkup;
167
- /**
168
- * State for tracking revision IDs during markup generation.
169
- */
170
- export interface RevisionIdState {
171
- /** Next available ID */
172
- nextId: number;
173
- /** Move name to range start ID mapping */
174
- moveRangeIds: Map<string, {
175
- sourceRangeId: number;
176
- destRangeId: number;
177
- }>;
178
- }
179
- /**
180
- * Create initial revision ID state.
181
- *
182
- * @param startId - Starting ID (default: 1)
183
- * @returns Initial state
184
- */
185
- export declare function createRevisionIdState(startId?: number): RevisionIdState;
186
- /**
187
- * Allocate IDs for a move operation.
188
- *
189
- * Ensures source and destination use consistent IDs for proper linking.
190
- *
191
- * @param state - Revision ID state (modified in place)
192
- * @param moveName - Move name (e.g., "move1")
193
- * @returns IDs for source and destination markup
194
- */
195
- export declare function allocateMoveIds(state: RevisionIdState, moveName: string): {
196
- sourceRangeId: number;
197
- sourceMoveId: number;
198
- destRangeId: number;
199
- destMoveId: number;
200
- };
201
- /**
202
- * Fix up revision IDs after all moves have been processed.
203
- *
204
- * Ensures proper ID pairing between source and destination elements.
205
- * This is a post-processing step after markup generation.
206
- *
207
- * @param state - The revision ID state
208
- */
209
- export declare function fixUpRevisionIds(_state: RevisionIdState): void;
210
- export {};
211
- //# sourceMappingURL=move-detection.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"move-detection.d.ts","sourceRoot":"","sources":["../src/move-detection.ts"],"names":[],"mappings":"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"}