@usejunior/docx-core 0.0.1 → 0.1.1

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 (252) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +86 -28
  3. package/dist/.tsbuildinfo +1 -0
  4. package/dist/atomizer.d.ts +218 -0
  5. package/dist/atomizer.d.ts.map +1 -0
  6. package/dist/atomizer.js +856 -0
  7. package/dist/atomizer.js.map +1 -0
  8. package/dist/baselines/atomizer/atomLcs.d.ts +96 -0
  9. package/dist/baselines/atomizer/atomLcs.d.ts.map +1 -0
  10. package/dist/baselines/atomizer/atomLcs.js +347 -0
  11. package/dist/baselines/atomizer/atomLcs.js.map +1 -0
  12. package/dist/baselines/atomizer/debug.d.ts +41 -0
  13. package/dist/baselines/atomizer/debug.d.ts.map +1 -0
  14. package/dist/baselines/atomizer/debug.js +85 -0
  15. package/dist/baselines/atomizer/debug.js.map +1 -0
  16. package/dist/baselines/atomizer/documentReconstructor.d.ts +64 -0
  17. package/dist/baselines/atomizer/documentReconstructor.d.ts.map +1 -0
  18. package/dist/baselines/atomizer/documentReconstructor.js +939 -0
  19. package/dist/baselines/atomizer/documentReconstructor.js.map +1 -0
  20. package/dist/baselines/atomizer/hierarchicalLcs.d.ts +111 -0
  21. package/dist/baselines/atomizer/hierarchicalLcs.d.ts.map +1 -0
  22. package/dist/baselines/atomizer/hierarchicalLcs.js +469 -0
  23. package/dist/baselines/atomizer/hierarchicalLcs.js.map +1 -0
  24. package/dist/baselines/atomizer/inPlaceModifier.d.ts +183 -0
  25. package/dist/baselines/atomizer/inPlaceModifier.d.ts.map +1 -0
  26. package/dist/baselines/atomizer/inPlaceModifier.js +1600 -0
  27. package/dist/baselines/atomizer/inPlaceModifier.js.map +1 -0
  28. package/dist/baselines/atomizer/numberingIntegration.d.ts +59 -0
  29. package/dist/baselines/atomizer/numberingIntegration.d.ts.map +1 -0
  30. package/dist/baselines/atomizer/numberingIntegration.js +209 -0
  31. package/dist/baselines/atomizer/numberingIntegration.js.map +1 -0
  32. package/dist/baselines/atomizer/pipeline.d.ts +65 -0
  33. package/dist/baselines/atomizer/pipeline.d.ts.map +1 -0
  34. package/dist/baselines/atomizer/pipeline.js +510 -0
  35. package/dist/baselines/atomizer/pipeline.js.map +1 -0
  36. package/dist/baselines/atomizer/premergeRuns.d.ts +26 -0
  37. package/dist/baselines/atomizer/premergeRuns.d.ts.map +1 -0
  38. package/dist/baselines/atomizer/premergeRuns.js +150 -0
  39. package/dist/baselines/atomizer/premergeRuns.js.map +1 -0
  40. package/dist/baselines/atomizer/trackChangesAcceptor.d.ts +63 -0
  41. package/dist/baselines/atomizer/trackChangesAcceptor.d.ts.map +1 -0
  42. package/dist/baselines/atomizer/trackChangesAcceptor.js +254 -0
  43. package/dist/baselines/atomizer/trackChangesAcceptor.js.map +1 -0
  44. package/dist/baselines/atomizer/trackChangesAcceptorAst.d.ts +64 -0
  45. package/dist/baselines/atomizer/trackChangesAcceptorAst.d.ts.map +1 -0
  46. package/dist/baselines/atomizer/trackChangesAcceptorAst.js +586 -0
  47. package/dist/baselines/atomizer/trackChangesAcceptorAst.js.map +1 -0
  48. package/dist/baselines/atomizer/xmlToWmlElement.d.ts +65 -0
  49. package/dist/baselines/atomizer/xmlToWmlElement.d.ts.map +1 -0
  50. package/dist/baselines/atomizer/xmlToWmlElement.js +95 -0
  51. package/dist/baselines/atomizer/xmlToWmlElement.js.map +1 -0
  52. package/dist/baselines/diffmatch/documentBuilder.d.ts +44 -0
  53. package/dist/baselines/diffmatch/documentBuilder.d.ts.map +1 -0
  54. package/dist/baselines/diffmatch/documentBuilder.js +227 -0
  55. package/dist/baselines/diffmatch/documentBuilder.js.map +1 -0
  56. package/dist/baselines/diffmatch/paragraphAlignment.d.ts +75 -0
  57. package/dist/baselines/diffmatch/paragraphAlignment.d.ts.map +1 -0
  58. package/dist/baselines/diffmatch/paragraphAlignment.js +206 -0
  59. package/dist/baselines/diffmatch/paragraphAlignment.js.map +1 -0
  60. package/dist/baselines/diffmatch/pipeline.d.ts +33 -0
  61. package/dist/baselines/diffmatch/pipeline.d.ts.map +1 -0
  62. package/dist/baselines/diffmatch/pipeline.js +84 -0
  63. package/dist/baselines/diffmatch/pipeline.js.map +1 -0
  64. package/dist/baselines/diffmatch/runDiff.d.ts +53 -0
  65. package/dist/baselines/diffmatch/runDiff.d.ts.map +1 -0
  66. package/dist/baselines/diffmatch/runDiff.js +253 -0
  67. package/dist/baselines/diffmatch/runDiff.js.map +1 -0
  68. package/dist/baselines/diffmatch/trackChangesRenderer.d.ts +64 -0
  69. package/dist/baselines/diffmatch/trackChangesRenderer.d.ts.map +1 -0
  70. package/dist/baselines/diffmatch/trackChangesRenderer.js +178 -0
  71. package/dist/baselines/diffmatch/trackChangesRenderer.js.map +1 -0
  72. package/dist/baselines/diffmatch/xmlParser.d.ts +45 -0
  73. package/dist/baselines/diffmatch/xmlParser.d.ts.map +1 -0
  74. package/dist/baselines/diffmatch/xmlParser.js +344 -0
  75. package/dist/baselines/diffmatch/xmlParser.js.map +1 -0
  76. package/dist/baselines/wmlcomparer/DocxodusWasm.d.ts +51 -0
  77. package/dist/baselines/wmlcomparer/DocxodusWasm.d.ts.map +1 -0
  78. package/dist/baselines/wmlcomparer/DocxodusWasm.js +83 -0
  79. package/dist/baselines/wmlcomparer/DocxodusWasm.js.map +1 -0
  80. package/dist/baselines/wmlcomparer/DotnetCli.d.ts +40 -0
  81. package/dist/baselines/wmlcomparer/DotnetCli.d.ts.map +1 -0
  82. package/dist/baselines/wmlcomparer/DotnetCli.js +135 -0
  83. package/dist/baselines/wmlcomparer/DotnetCli.js.map +1 -0
  84. package/dist/benchmark/metrics.d.ts +72 -0
  85. package/dist/benchmark/metrics.d.ts.map +1 -0
  86. package/dist/benchmark/metrics.js +45 -0
  87. package/dist/benchmark/metrics.js.map +1 -0
  88. package/dist/benchmark/reporter.d.ts +23 -0
  89. package/dist/benchmark/reporter.d.ts.map +1 -0
  90. package/dist/benchmark/reporter.js +147 -0
  91. package/dist/benchmark/reporter.js.map +1 -0
  92. package/dist/benchmark/runner.d.ts +30 -0
  93. package/dist/benchmark/runner.d.ts.map +1 -0
  94. package/dist/benchmark/runner.js +233 -0
  95. package/dist/benchmark/runner.js.map +1 -0
  96. package/dist/cli/compare-two.d.ts +28 -0
  97. package/dist/cli/compare-two.d.ts.map +1 -0
  98. package/dist/cli/compare-two.js +110 -0
  99. package/dist/cli/compare-two.js.map +1 -0
  100. package/dist/cli/index.d.ts +3 -0
  101. package/dist/cli/index.d.ts.map +1 -0
  102. package/dist/cli/index.js +21 -0
  103. package/dist/cli/index.js.map +1 -0
  104. package/dist/core-types.d.ts +296 -0
  105. package/dist/core-types.d.ts.map +1 -0
  106. package/dist/core-types.js +122 -0
  107. package/dist/core-types.js.map +1 -0
  108. package/dist/footnotes.d.ts +144 -0
  109. package/dist/footnotes.d.ts.map +1 -0
  110. package/dist/footnotes.js +291 -0
  111. package/dist/footnotes.js.map +1 -0
  112. package/dist/format-detection.d.ts +120 -0
  113. package/dist/format-detection.d.ts.map +1 -0
  114. package/dist/format-detection.js +338 -0
  115. package/dist/format-detection.js.map +1 -0
  116. package/dist/index.d.ts +177 -0
  117. package/dist/index.d.ts.map +1 -0
  118. package/dist/index.js +55 -0
  119. package/dist/index.js.map +1 -0
  120. package/dist/integration/output-artifacts.d.ts +6 -0
  121. package/dist/integration/output-artifacts.d.ts.map +1 -0
  122. package/dist/integration/output-artifacts.js +30 -0
  123. package/dist/integration/output-artifacts.js.map +1 -0
  124. package/dist/move-detection.d.ts +211 -0
  125. package/dist/move-detection.d.ts.map +1 -0
  126. package/dist/move-detection.js +391 -0
  127. package/dist/move-detection.js.map +1 -0
  128. package/dist/numbering.d.ts +136 -0
  129. package/dist/numbering.d.ts.map +1 -0
  130. package/dist/numbering.js +446 -0
  131. package/dist/numbering.js.map +1 -0
  132. package/dist/primitives/accept_changes.d.ts +30 -0
  133. package/dist/primitives/accept_changes.d.ts.map +1 -0
  134. package/dist/primitives/accept_changes.js +241 -0
  135. package/dist/primitives/accept_changes.js.map +1 -0
  136. package/dist/primitives/bookmarks.d.ts +12 -0
  137. package/dist/primitives/bookmarks.d.ts.map +1 -0
  138. package/dist/primitives/bookmarks.js +248 -0
  139. package/dist/primitives/bookmarks.js.map +1 -0
  140. package/dist/primitives/comments.d.ts +88 -0
  141. package/dist/primitives/comments.d.ts.map +1 -0
  142. package/dist/primitives/comments.js +703 -0
  143. package/dist/primitives/comments.js.map +1 -0
  144. package/dist/primitives/document.d.ts +168 -0
  145. package/dist/primitives/document.d.ts.map +1 -0
  146. package/dist/primitives/document.js +532 -0
  147. package/dist/primitives/document.js.map +1 -0
  148. package/dist/primitives/document_view.d.ts +93 -0
  149. package/dist/primitives/document_view.d.ts.map +1 -0
  150. package/dist/primitives/document_view.js +722 -0
  151. package/dist/primitives/document_view.js.map +1 -0
  152. package/dist/primitives/dom-helpers.d.ts +94 -0
  153. package/dist/primitives/dom-helpers.d.ts.map +1 -0
  154. package/dist/primitives/dom-helpers.js +219 -0
  155. package/dist/primitives/dom-helpers.js.map +1 -0
  156. package/dist/primitives/errors.d.ts +7 -0
  157. package/dist/primitives/errors.d.ts.map +1 -0
  158. package/dist/primitives/errors.js +10 -0
  159. package/dist/primitives/errors.js.map +1 -0
  160. package/dist/primitives/extract_revisions.d.ts +50 -0
  161. package/dist/primitives/extract_revisions.d.ts.map +1 -0
  162. package/dist/primitives/extract_revisions.js +340 -0
  163. package/dist/primitives/extract_revisions.js.map +1 -0
  164. package/dist/primitives/footnotes.d.ts +37 -0
  165. package/dist/primitives/footnotes.d.ts.map +1 -0
  166. package/dist/primitives/footnotes.js +552 -0
  167. package/dist/primitives/footnotes.js.map +1 -0
  168. package/dist/primitives/formatting_tags.d.ts +30 -0
  169. package/dist/primitives/formatting_tags.d.ts.map +1 -0
  170. package/dist/primitives/formatting_tags.js +217 -0
  171. package/dist/primitives/formatting_tags.js.map +1 -0
  172. package/dist/primitives/index.d.ts +26 -0
  173. package/dist/primitives/index.d.ts.map +1 -0
  174. package/dist/primitives/index.js +26 -0
  175. package/dist/primitives/index.js.map +1 -0
  176. package/dist/primitives/layout.d.ts +53 -0
  177. package/dist/primitives/layout.d.ts.map +1 -0
  178. package/dist/primitives/layout.js +178 -0
  179. package/dist/primitives/layout.js.map +1 -0
  180. package/dist/primitives/list_labels.d.ts +19 -0
  181. package/dist/primitives/list_labels.d.ts.map +1 -0
  182. package/dist/primitives/list_labels.js +57 -0
  183. package/dist/primitives/list_labels.js.map +1 -0
  184. package/dist/primitives/matching.d.ts +17 -0
  185. package/dist/primitives/matching.d.ts.map +1 -0
  186. package/dist/primitives/matching.js +144 -0
  187. package/dist/primitives/matching.js.map +1 -0
  188. package/dist/primitives/merge_runs.d.ts +23 -0
  189. package/dist/primitives/merge_runs.d.ts.map +1 -0
  190. package/dist/primitives/merge_runs.js +195 -0
  191. package/dist/primitives/merge_runs.js.map +1 -0
  192. package/dist/primitives/namespaces.d.ts +90 -0
  193. package/dist/primitives/namespaces.d.ts.map +1 -0
  194. package/dist/primitives/namespaces.js +107 -0
  195. package/dist/primitives/namespaces.js.map +1 -0
  196. package/dist/primitives/numbering.d.ts +27 -0
  197. package/dist/primitives/numbering.d.ts.map +1 -0
  198. package/dist/primitives/numbering.js +182 -0
  199. package/dist/primitives/numbering.js.map +1 -0
  200. package/dist/primitives/prevent_double_elevation.d.ts +18 -0
  201. package/dist/primitives/prevent_double_elevation.d.ts.map +1 -0
  202. package/dist/primitives/prevent_double_elevation.js +190 -0
  203. package/dist/primitives/prevent_double_elevation.js.map +1 -0
  204. package/dist/primitives/reject_changes.d.ts +27 -0
  205. package/dist/primitives/reject_changes.d.ts.map +1 -0
  206. package/dist/primitives/reject_changes.js +371 -0
  207. package/dist/primitives/reject_changes.js.map +1 -0
  208. package/dist/primitives/relationships.d.ts +7 -0
  209. package/dist/primitives/relationships.d.ts.map +1 -0
  210. package/dist/primitives/relationships.js +24 -0
  211. package/dist/primitives/relationships.js.map +1 -0
  212. package/dist/primitives/semantic_tags.d.ts +32 -0
  213. package/dist/primitives/semantic_tags.d.ts.map +1 -0
  214. package/dist/primitives/semantic_tags.js +139 -0
  215. package/dist/primitives/semantic_tags.js.map +1 -0
  216. package/dist/primitives/simplify_redlines.d.ts +19 -0
  217. package/dist/primitives/simplify_redlines.d.ts.map +1 -0
  218. package/dist/primitives/simplify_redlines.js +94 -0
  219. package/dist/primitives/simplify_redlines.js.map +1 -0
  220. package/dist/primitives/styles.d.ts +36 -0
  221. package/dist/primitives/styles.d.ts.map +1 -0
  222. package/dist/primitives/styles.js +190 -0
  223. package/dist/primitives/styles.js.map +1 -0
  224. package/dist/primitives/text.d.ts +27 -0
  225. package/dist/primitives/text.d.ts.map +1 -0
  226. package/dist/primitives/text.js +416 -0
  227. package/dist/primitives/text.js.map +1 -0
  228. package/dist/primitives/validate_document.d.ts +24 -0
  229. package/dist/primitives/validate_document.d.ts.map +1 -0
  230. package/dist/primitives/validate_document.js +147 -0
  231. package/dist/primitives/validate_document.js.map +1 -0
  232. package/dist/primitives/xml.d.ts +5 -0
  233. package/dist/primitives/xml.d.ts.map +1 -0
  234. package/dist/primitives/xml.js +19 -0
  235. package/dist/primitives/xml.js.map +1 -0
  236. package/dist/primitives/zip.d.ts +25 -0
  237. package/dist/primitives/zip.d.ts.map +1 -0
  238. package/dist/primitives/zip.js +78 -0
  239. package/dist/primitives/zip.js.map +1 -0
  240. package/dist/shared/docx/DocxArchive.d.ts +94 -0
  241. package/dist/shared/docx/DocxArchive.d.ts.map +1 -0
  242. package/dist/shared/docx/DocxArchive.js +169 -0
  243. package/dist/shared/docx/DocxArchive.js.map +1 -0
  244. package/dist/shared/ooxml/namespaces.d.ts +149 -0
  245. package/dist/shared/ooxml/namespaces.d.ts.map +1 -0
  246. package/dist/shared/ooxml/namespaces.js +224 -0
  247. package/dist/shared/ooxml/namespaces.js.map +1 -0
  248. package/dist/shared/ooxml/types.d.ts +136 -0
  249. package/dist/shared/ooxml/types.d.ts.map +1 -0
  250. package/dist/shared/ooxml/types.js +7 -0
  251. package/dist/shared/ooxml/types.js.map +1 -0
  252. package/package.json +63 -6
@@ -0,0 +1,150 @@
1
+ /**
2
+ * Pre-Compare Run Pre-Merge
3
+ *
4
+ * Optional normalization step to merge adjacent <w:r> siblings with identical
5
+ * formatting before atomization.
6
+ *
7
+ * Motivation:
8
+ * - Some documents are heavily fragmented into multiple runs even when the
9
+ * formatting is identical. This can cause overly-granular diffs.
10
+ * - For `reconstructionMode: 'inplace'`, we intentionally disable atom-level
11
+ * cross-run text merging to keep atoms anchored to real runs. Pre-merging runs
12
+ * is a safer way to reduce fragmentation without creating atoms that span
13
+ * multiple runs.
14
+ *
15
+ * This step is intentionally conservative:
16
+ * - Only merges immediately-adjacent <w:r> siblings under the same parent.
17
+ * - Requires identical run attributes and identical <w:rPr> formatting subtree.
18
+ * - Only merges runs that contain a small, "safe" subset of child elements.
19
+ */
20
+ import { createHash } from 'crypto';
21
+ import { getLeafText, childElements } from '../../primitives/index.js';
22
+ const SAFE_RUN_CHILD_TAGS = new Set([
23
+ 'w:rPr',
24
+ 'w:t',
25
+ 'w:tab',
26
+ 'w:br',
27
+ 'w:cr',
28
+ // Deleted text can appear if input already has revisions.
29
+ 'w:delText',
30
+ ]);
31
+ function sha1(content) {
32
+ return createHash('sha1').update(content, 'utf8').digest('hex');
33
+ }
34
+ function hashElementDeep(element) {
35
+ const parts = [element.tagName];
36
+ for (let i = 0; i < element.attributes.length; i++) {
37
+ const attr = element.attributes[i];
38
+ parts.push(`${attr.name}=${attr.value}`);
39
+ }
40
+ // Sort for determinism
41
+ parts.sort();
42
+ // Re-add tagName at front after sort
43
+ const tagName = parts.shift();
44
+ const leafText = getLeafText(element);
45
+ if (leafText !== undefined) {
46
+ parts.push(leafText);
47
+ }
48
+ for (const child of childElements(element)) {
49
+ parts.push(hashElementDeep(child));
50
+ }
51
+ return sha1([tagName, ...parts].join('|'));
52
+ }
53
+ function attrsEqual(a, b) {
54
+ if (a.attributes.length !== b.attributes.length)
55
+ return false;
56
+ for (let i = 0; i < a.attributes.length; i++) {
57
+ const aAttr = a.attributes[i];
58
+ const bVal = b.getAttribute(aAttr.name);
59
+ if (bVal !== aAttr.value)
60
+ return false;
61
+ }
62
+ return true;
63
+ }
64
+ function findChild(parent, tagName) {
65
+ for (const child of childElements(parent)) {
66
+ if (child.tagName === tagName)
67
+ return child;
68
+ }
69
+ return undefined;
70
+ }
71
+ function runPropertiesEqual(aRun, bRun) {
72
+ const aRPr = findChild(aRun, 'w:rPr');
73
+ const bRPr = findChild(bRun, 'w:rPr');
74
+ if (!aRPr && !bRPr)
75
+ return true;
76
+ if (!aRPr || !bRPr)
77
+ return false;
78
+ return hashElementDeep(aRPr) === hashElementDeep(bRPr);
79
+ }
80
+ function runIsSafeToMerge(run) {
81
+ if (run.tagName !== 'w:r')
82
+ return false;
83
+ if (getLeafText(run) !== undefined)
84
+ return false;
85
+ for (const child of childElements(run)) {
86
+ if (!SAFE_RUN_CHILD_TAGS.has(child.tagName))
87
+ return false;
88
+ // Be conservative: disallow nested elements under non-rPr children.
89
+ if (child.tagName !== 'w:rPr' && childElements(child).length > 0)
90
+ return false;
91
+ }
92
+ return true;
93
+ }
94
+ function mergeRunInto(target, source) {
95
+ for (const child of childElements(source)) {
96
+ if (child.tagName === 'w:rPr')
97
+ continue;
98
+ target.appendChild(child);
99
+ }
100
+ }
101
+ function canMergeRuns(a, b) {
102
+ if (!runIsSafeToMerge(a) || !runIsSafeToMerge(b))
103
+ return false;
104
+ if (!attrsEqual(a, b))
105
+ return false;
106
+ if (!runPropertiesEqual(a, b))
107
+ return false;
108
+ return true;
109
+ }
110
+ function mergeAdjacentRunsInChildren(parent) {
111
+ const children = childElements(parent);
112
+ if (children.length < 2)
113
+ return 0;
114
+ let merges = 0;
115
+ // Re-scan after each merge since DOM is live
116
+ let keepGoing = true;
117
+ while (keepGoing) {
118
+ keepGoing = false;
119
+ const kids = childElements(parent);
120
+ for (let i = 0; i < kids.length - 1; i++) {
121
+ const a = kids[i];
122
+ const b = kids[i + 1];
123
+ if (a.tagName === 'w:r' && b.tagName === 'w:r' && canMergeRuns(a, b)) {
124
+ mergeRunInto(a, b);
125
+ parent.removeChild(b);
126
+ merges++;
127
+ keepGoing = true;
128
+ break; // restart scan
129
+ }
130
+ }
131
+ }
132
+ return merges;
133
+ }
134
+ /**
135
+ * Merge adjacent runs throughout a DOM Element subtree.
136
+ *
137
+ * @returns The number of merges performed.
138
+ */
139
+ export function premergeAdjacentRuns(root) {
140
+ let merges = 0;
141
+ function traverse(node) {
142
+ merges += mergeAdjacentRunsInChildren(node);
143
+ for (const child of childElements(node)) {
144
+ traverse(child);
145
+ }
146
+ }
147
+ traverse(root);
148
+ return merges;
149
+ }
150
+ //# sourceMappingURL=premergeRuns.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"premergeRuns.js","sourceRoot":"","sources":["../../../src/baselines/atomizer/premergeRuns.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,63 @@
1
+ /**
2
+ * Track Changes Acceptor/Rejector
3
+ *
4
+ * Utilities to accept or reject all track changes in a document.
5
+ * Used for round-trip testing to verify comparison correctness.
6
+ */
7
+ /**
8
+ * Accept all track changes in document XML.
9
+ *
10
+ * - Removes w:del elements entirely (deleted content disappears)
11
+ * - Unwraps w:ins elements (inserted content becomes normal)
12
+ * - Handles w:moveFrom (remove) and w:moveTo (unwrap)
13
+ * - Converts w:delText back to w:t where needed
14
+ *
15
+ * @param documentXml - The document.xml content with track changes
16
+ * @returns Document XML with all changes accepted
17
+ */
18
+ export declare function acceptAllChanges(documentXml: string): string;
19
+ /**
20
+ * Reject all track changes in document XML.
21
+ *
22
+ * - Removes w:ins elements entirely (inserted content disappears)
23
+ * - Unwraps w:del elements and converts w:delText to w:t
24
+ * - Handles w:moveFrom (unwrap) and w:moveTo (remove)
25
+ *
26
+ * @param documentXml - The document.xml content with track changes
27
+ * @returns Document XML with all changes rejected
28
+ */
29
+ export declare function rejectAllChanges(documentXml: string): string;
30
+ /**
31
+ * Extract plain text content from document XML.
32
+ *
33
+ * @param documentXml - The document.xml content
34
+ * @returns Plain text content
35
+ */
36
+ export declare function extractTextContent(documentXml: string): string;
37
+ /**
38
+ * Extract text in document order, respecting paragraph breaks.
39
+ */
40
+ export declare function extractTextWithParagraphs(documentXml: string): string;
41
+ /**
42
+ * Normalize text for comparison (handles whitespace differences).
43
+ *
44
+ * Performs the following normalization:
45
+ * - Convert CRLF and CR to LF
46
+ * - Convert tabs to spaces
47
+ * - Collapse multiple spaces to single space
48
+ * - Strip trailing spaces from each line
49
+ * - Collapse multiple newlines to single newline
50
+ * - Trim leading/trailing whitespace
51
+ */
52
+ export declare function normalizeText(text: string): string;
53
+ /**
54
+ * Compare two texts and return detailed differences.
55
+ */
56
+ export declare function compareTexts(expected: string, actual: string): {
57
+ identical: boolean;
58
+ normalizedIdentical: boolean;
59
+ expectedLength: number;
60
+ actualLength: number;
61
+ differences: string[];
62
+ };
63
+ //# sourceMappingURL=trackChangesAcceptor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trackChangesAcceptor.d.ts","sourceRoot":"","sources":["../../../src/baselines/atomizer/trackChangesAcceptor.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;;;;;;;;;GAUG;AACH,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAiC5D;AAED;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAiC5D;AAgFD;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAiB9D;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAqCrE;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAUlD;AAED;;GAEG;AACH,wBAAgB,YAAY,CAC1B,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,GACb;IACD,SAAS,EAAE,OAAO,CAAC;IACnB,mBAAmB,EAAE,OAAO,CAAC;IAC7B,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB,CAmCA"}
@@ -0,0 +1,254 @@
1
+ /**
2
+ * Track Changes Acceptor/Rejector
3
+ *
4
+ * Utilities to accept or reject all track changes in a document.
5
+ * Used for round-trip testing to verify comparison correctness.
6
+ */
7
+ /**
8
+ * Accept all track changes in document XML.
9
+ *
10
+ * - Removes w:del elements entirely (deleted content disappears)
11
+ * - Unwraps w:ins elements (inserted content becomes normal)
12
+ * - Handles w:moveFrom (remove) and w:moveTo (unwrap)
13
+ * - Converts w:delText back to w:t where needed
14
+ *
15
+ * @param documentXml - The document.xml content with track changes
16
+ * @returns Document XML with all changes accepted
17
+ */
18
+ export function acceptAllChanges(documentXml) {
19
+ let result = documentXml;
20
+ // Remove w:del elements entirely (including their content)
21
+ // This regex handles nested content
22
+ result = removeElements(result, 'w:del');
23
+ // Remove w:moveFrom elements entirely
24
+ result = removeElements(result, 'w:moveFrom');
25
+ // Remove move range markers
26
+ result = result.replace(/<w:moveFromRangeStart[^>]*\/>/g, '');
27
+ result = result.replace(/<w:moveFromRangeEnd[^>]*\/>/g, '');
28
+ result = result.replace(/<w:moveToRangeStart[^>]*\/>/g, '');
29
+ result = result.replace(/<w:moveToRangeEnd[^>]*\/>/g, '');
30
+ // Unwrap w:ins elements (keep content, remove wrapper)
31
+ result = unwrapElements(result, 'w:ins');
32
+ // Unwrap w:moveTo elements
33
+ result = unwrapElements(result, 'w:moveTo');
34
+ // Remove rPrChange elements (format change tracking)
35
+ result = removeElements(result, 'w:rPrChange');
36
+ // Remove pPrChange elements (paragraph property change tracking)
37
+ result = removeElements(result, 'w:pPrChange');
38
+ // Remove paragraphs that became empty after removing deleted content
39
+ // These are paragraphs that have no w:t elements (no text content)
40
+ result = removeEmptyParagraphs(result);
41
+ return result;
42
+ }
43
+ /**
44
+ * Reject all track changes in document XML.
45
+ *
46
+ * - Removes w:ins elements entirely (inserted content disappears)
47
+ * - Unwraps w:del elements and converts w:delText to w:t
48
+ * - Handles w:moveFrom (unwrap) and w:moveTo (remove)
49
+ *
50
+ * @param documentXml - The document.xml content with track changes
51
+ * @returns Document XML with all changes rejected
52
+ */
53
+ export function rejectAllChanges(documentXml) {
54
+ let result = documentXml;
55
+ // Remove w:ins elements entirely (including their content)
56
+ result = removeElements(result, 'w:ins');
57
+ // Remove w:moveTo elements entirely
58
+ result = removeElements(result, 'w:moveTo');
59
+ // Remove move range markers
60
+ result = result.replace(/<w:moveFromRangeStart[^>]*\/>/g, '');
61
+ result = result.replace(/<w:moveFromRangeEnd[^>]*\/>/g, '');
62
+ result = result.replace(/<w:moveToRangeStart[^>]*\/>/g, '');
63
+ result = result.replace(/<w:moveToRangeEnd[^>]*\/>/g, '');
64
+ // Unwrap w:del elements (keep content, remove wrapper)
65
+ result = unwrapElements(result, 'w:del');
66
+ // Unwrap w:moveFrom elements
67
+ result = unwrapElements(result, 'w:moveFrom');
68
+ // Convert w:delText to w:t
69
+ result = result.replace(/<w:delText([^>]*)>/g, '<w:t$1>');
70
+ result = result.replace(/<\/w:delText>/g, '</w:t>');
71
+ // Remove rPrChange elements but keep the current properties
72
+ result = removeElements(result, 'w:rPrChange');
73
+ // For pPrChange, we need to restore original properties
74
+ // This is complex - for now just remove the change tracking
75
+ result = removeElements(result, 'w:pPrChange');
76
+ return result;
77
+ }
78
+ /**
79
+ * Remove elements and their content from XML.
80
+ * Uses regex for reliable matching.
81
+ * Uses word boundary matching to avoid matching tags with similar prefixes.
82
+ */
83
+ function removeElements(xml, tagName) {
84
+ // Handle self-closing tags
85
+ // Match <tagName followed by optional attributes, then />
86
+ // Uses word boundary: tagName must be followed by \s, /, or >
87
+ const selfClosingRegex = new RegExp(`<${tagName}(\\s[^>]*)?\\/\\s*>`, 'g');
88
+ let result = xml.replace(selfClosingRegex, '');
89
+ // Handle elements with content - use recursive approach for nesting
90
+ // Match the opening tag (with word boundary), then non-greedy content, then closing tag
91
+ // This may need multiple passes for nested elements
92
+ const regex = new RegExp(`<${tagName}(\\s[^>]*)?>[\\s\\S]*?</${tagName}>`, 'g');
93
+ let prevLength = 0;
94
+ while (result.length !== prevLength) {
95
+ prevLength = result.length;
96
+ result = result.replace(regex, '');
97
+ }
98
+ return result;
99
+ }
100
+ /**
101
+ * Unwrap elements - remove the wrapper but keep the content.
102
+ * Uses word boundary matching to avoid matching tags with similar prefixes
103
+ * (e.g., w:del should not match w:delText)
104
+ */
105
+ function unwrapElements(xml, tagName) {
106
+ let result = xml;
107
+ // Remove opening tags with attributes
108
+ // Match <tagName followed by whitespace, /, or > to avoid matching longer tag names
109
+ // e.g., <w:del should not match <w:delText
110
+ const openTagRegex = new RegExp(`<${tagName}(\\s[^>]*)?>`, 'g');
111
+ result = result.replace(openTagRegex, '');
112
+ // Remove closing tags (exact match)
113
+ const closeTagRegex = new RegExp(`</${tagName}>`, 'g');
114
+ result = result.replace(closeTagRegex, '');
115
+ return result;
116
+ }
117
+ /**
118
+ * Remove paragraphs that have no text content.
119
+ * A paragraph is considered empty if it has no w:t elements.
120
+ * This is used after accepting changes to clean up paragraphs
121
+ * that only contained deleted content.
122
+ */
123
+ function removeEmptyParagraphs(xml) {
124
+ // Match each paragraph and check if it has any w:t elements
125
+ const pRegex = /<w:p(\s[^>]*)?>[\s\S]*?<\/w:p>/g;
126
+ return xml.replace(pRegex, (match) => {
127
+ // Check if the paragraph has any w:t elements (text content)
128
+ const hasText = /<w:t[^>]*>/.test(match);
129
+ // Check if it has any tabs or breaks (these are content too)
130
+ const hasTab = /<w:tab\/>/.test(match);
131
+ const hasBreak = /<w:br[^>]*\/>/.test(match);
132
+ // Check for symbols (special characters)
133
+ const hasSymbol = /<w:sym\s/.test(match);
134
+ // Check for drawings (images, shapes)
135
+ const hasDrawing = /<w:drawing>/.test(match);
136
+ // Keep the paragraph if it has any content
137
+ if (hasText || hasTab || hasBreak || hasSymbol || hasDrawing) {
138
+ return match;
139
+ }
140
+ // Remove empty paragraphs
141
+ return '';
142
+ });
143
+ }
144
+ /**
145
+ * Extract plain text content from document XML.
146
+ *
147
+ * @param documentXml - The document.xml content
148
+ * @returns Plain text content
149
+ */
150
+ export function extractTextContent(documentXml) {
151
+ const texts = [];
152
+ // Extract text from w:t elements
153
+ const tRegex = /<w:t[^>]*>([^<]*)<\/w:t>/g;
154
+ let match;
155
+ while ((match = tRegex.exec(documentXml)) !== null) {
156
+ texts.push(match[1] ?? '');
157
+ }
158
+ // Also extract from w:delText (for rejected changes)
159
+ const delTextRegex = /<w:delText[^>]*>([^<]*)<\/w:delText>/g;
160
+ while ((match = delTextRegex.exec(documentXml)) !== null) {
161
+ texts.push(match[1] ?? '');
162
+ }
163
+ return texts.join('');
164
+ }
165
+ /**
166
+ * Extract text in document order, respecting paragraph breaks.
167
+ */
168
+ export function extractTextWithParagraphs(documentXml) {
169
+ const paragraphs = [];
170
+ // Match each paragraph
171
+ const pRegex = /<w:p[^>]*>([\s\S]*?)<\/w:p>/g;
172
+ let pMatch;
173
+ while ((pMatch = pRegex.exec(documentXml)) !== null) {
174
+ const pContent = pMatch[1] ?? '';
175
+ const texts = [];
176
+ // Extract text from w:t elements within this paragraph
177
+ const tRegex = /<w:t[^>]*>([^<]*)<\/w:t>/g;
178
+ let tMatch;
179
+ while ((tMatch = tRegex.exec(pContent)) !== null) {
180
+ texts.push(tMatch[1] ?? '');
181
+ }
182
+ // Also check w:delText
183
+ const delTextRegex = /<w:delText[^>]*>([^<]*)<\/w:delText>/g;
184
+ while ((tMatch = delTextRegex.exec(pContent)) !== null) {
185
+ texts.push(tMatch[1] ?? '');
186
+ }
187
+ // Handle tabs and breaks
188
+ const tabCount = (pContent.match(/<w:tab\/>/g) || []).length;
189
+ const brCount = (pContent.match(/<w:br\/>/g) || []).length;
190
+ let paraText = texts.join('');
191
+ // Add tabs and breaks (simplified - in actual order would need more parsing)
192
+ paraText += '\t'.repeat(tabCount);
193
+ paraText += '\n'.repeat(brCount);
194
+ paragraphs.push(paraText);
195
+ }
196
+ return paragraphs.join('\n');
197
+ }
198
+ /**
199
+ * Normalize text for comparison (handles whitespace differences).
200
+ *
201
+ * Performs the following normalization:
202
+ * - Convert CRLF and CR to LF
203
+ * - Convert tabs to spaces
204
+ * - Collapse multiple spaces to single space
205
+ * - Strip trailing spaces from each line
206
+ * - Collapse multiple newlines to single newline
207
+ * - Trim leading/trailing whitespace
208
+ */
209
+ export function normalizeText(text) {
210
+ return text
211
+ .replace(/\r\n/g, '\n')
212
+ .replace(/\r/g, '\n')
213
+ .replace(/\t/g, ' ')
214
+ .replace(/ +/g, ' ')
215
+ .replace(/ \n/g, '\n') // Strip trailing spaces from lines
216
+ .replace(/\n /g, '\n') // Strip leading spaces from lines
217
+ .replace(/\n+/g, '\n')
218
+ .trim();
219
+ }
220
+ /**
221
+ * Compare two texts and return detailed differences.
222
+ */
223
+ export function compareTexts(expected, actual) {
224
+ const normalizedExpected = normalizeText(expected);
225
+ const normalizedActual = normalizeText(actual);
226
+ const differences = [];
227
+ if (expected !== actual) {
228
+ // Find first difference
229
+ let firstDiff = 0;
230
+ while (firstDiff < expected.length && firstDiff < actual.length) {
231
+ if (expected[firstDiff] !== actual[firstDiff]) {
232
+ break;
233
+ }
234
+ firstDiff++;
235
+ }
236
+ if (firstDiff < expected.length || firstDiff < actual.length) {
237
+ const context = 50;
238
+ const start = Math.max(0, firstDiff - context);
239
+ const expectedSnippet = expected.slice(start, firstDiff + context);
240
+ const actualSnippet = actual.slice(start, firstDiff + context);
241
+ differences.push(`First difference at position ${firstDiff}:`);
242
+ differences.push(` Expected: "...${expectedSnippet}..."`);
243
+ differences.push(` Actual: "...${actualSnippet}..."`);
244
+ }
245
+ }
246
+ return {
247
+ identical: expected === actual,
248
+ normalizedIdentical: normalizedExpected === normalizedActual,
249
+ expectedLength: expected.length,
250
+ actualLength: actual.length,
251
+ differences,
252
+ };
253
+ }
254
+ //# sourceMappingURL=trackChangesAcceptor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trackChangesAcceptor.js","sourceRoot":"","sources":["../../../src/baselines/atomizer/trackChangesAcceptor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,64 @@
1
+ /**
2
+ * Track Changes Acceptor/Rejector (AST-based)
3
+ *
4
+ * AST-based utilities to accept or reject all track changes in a document.
5
+ * Replaces the regex-based implementation for better reliability with nested structures.
6
+ */
7
+ /**
8
+ * Accept all track changes in document XML (AST-based).
9
+ *
10
+ * - Removes w:del elements entirely (deleted content disappears)
11
+ * - Unwraps w:ins elements (inserted content becomes normal)
12
+ * - Handles w:moveFrom (remove) and w:moveTo (unwrap)
13
+ * - Removes format change tracking elements
14
+ *
15
+ * @param documentXml - The document.xml content with track changes
16
+ * @returns Document XML with all changes accepted
17
+ */
18
+ export declare function acceptAllChanges(documentXml: string): string;
19
+ /**
20
+ * Reject all track changes in document XML (AST-based).
21
+ *
22
+ * - Removes w:ins elements entirely (inserted content disappears)
23
+ * - Unwraps w:del elements and converts w:delText to w:t
24
+ * - Handles w:moveFrom (unwrap) and w:moveTo (remove)
25
+ * - Removes format change tracking elements
26
+ *
27
+ * @param documentXml - The document.xml content with track changes
28
+ * @returns Document XML with all changes rejected
29
+ */
30
+ export declare function rejectAllChanges(documentXml: string): string;
31
+ /**
32
+ * Extract plain text content from document XML (AST-based).
33
+ *
34
+ * @param documentXml - The document.xml content
35
+ * @returns Plain text content
36
+ */
37
+ export declare function extractTextContent(documentXml: string): string;
38
+ /**
39
+ * Extract text in document order, respecting paragraph breaks (AST-based).
40
+ */
41
+ export declare function extractTextWithParagraphs(documentXml: string): string;
42
+ /**
43
+ * Normalize text for comparison (handles whitespace differences).
44
+ *
45
+ * Performs the following normalization:
46
+ * - Convert CRLF and CR to LF
47
+ * - Convert tabs to spaces
48
+ * - Collapse multiple spaces to single space
49
+ * - Strip trailing spaces from each line
50
+ * - Collapse multiple newlines to single newline
51
+ * - Trim leading/trailing whitespace
52
+ */
53
+ export declare function normalizeText(text: string): string;
54
+ /**
55
+ * Compare two texts and return detailed differences.
56
+ */
57
+ export declare function compareTexts(expected: string, actual: string): {
58
+ identical: boolean;
59
+ normalizedIdentical: boolean;
60
+ expectedLength: number;
61
+ actualLength: number;
62
+ differences: string[];
63
+ };
64
+ //# sourceMappingURL=trackChangesAcceptorAst.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trackChangesAcceptorAst.d.ts","sourceRoot":"","sources":["../../../src/baselines/atomizer/trackChangesAcceptorAst.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAwUH;;;;;;;;;;GAUG;AACH,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CA0I5D;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAmG5D;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAqB9D;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CA4BrE;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAUlD;AAED;;GAEG;AACH,wBAAgB,YAAY,CAC1B,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,GACb;IACD,SAAS,EAAE,OAAO,CAAC;IACnB,mBAAmB,EAAE,OAAO,CAAC;IAC7B,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB,CAmCA"}