@usejunior/docx-core 0.9.1 → 0.10.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 (181) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/atomizer.d.ts +15 -1
  3. package/dist/atomizer.d.ts.map +1 -1
  4. package/dist/atomizer.js +37 -1
  5. package/dist/atomizer.js.map +1 -1
  6. package/dist/baselines/atomizer/documentReconstructor.d.ts.map +1 -1
  7. package/dist/baselines/atomizer/documentReconstructor.js +218 -90
  8. package/dist/baselines/atomizer/documentReconstructor.js.map +1 -1
  9. package/dist/baselines/atomizer/formattingFidelity.d.ts +99 -0
  10. package/dist/baselines/atomizer/formattingFidelity.d.ts.map +1 -0
  11. package/dist/baselines/atomizer/formattingFidelity.js +449 -0
  12. package/dist/baselines/atomizer/formattingFidelity.js.map +1 -0
  13. package/dist/baselines/atomizer/inPlaceModifier-bookmarks.d.ts +37 -0
  14. package/dist/baselines/atomizer/inPlaceModifier-bookmarks.d.ts.map +1 -0
  15. package/dist/baselines/atomizer/inPlaceModifier-bookmarks.js +189 -0
  16. package/dist/baselines/atomizer/inPlaceModifier-bookmarks.js.map +1 -0
  17. package/dist/baselines/atomizer/inPlaceModifier-containers.d.ts +74 -0
  18. package/dist/baselines/atomizer/inPlaceModifier-containers.d.ts.map +1 -0
  19. package/dist/baselines/atomizer/inPlaceModifier-containers.js +171 -0
  20. package/dist/baselines/atomizer/inPlaceModifier-containers.js.map +1 -0
  21. package/dist/baselines/atomizer/inPlaceModifier-deletion.d.ts +88 -0
  22. package/dist/baselines/atomizer/inPlaceModifier-deletion.d.ts.map +1 -0
  23. package/dist/baselines/atomizer/inPlaceModifier-deletion.js +326 -0
  24. package/dist/baselines/atomizer/inPlaceModifier-deletion.js.map +1 -0
  25. package/dist/baselines/atomizer/inPlaceModifier-postprocess.d.ts +85 -0
  26. package/dist/baselines/atomizer/inPlaceModifier-postprocess.d.ts.map +1 -0
  27. package/dist/baselines/atomizer/inPlaceModifier-postprocess.js +402 -0
  28. package/dist/baselines/atomizer/inPlaceModifier-postprocess.js.map +1 -0
  29. package/dist/baselines/atomizer/inPlaceModifier-presplit.d.ts +39 -0
  30. package/dist/baselines/atomizer/inPlaceModifier-presplit.d.ts.map +1 -0
  31. package/dist/baselines/atomizer/inPlaceModifier-presplit.js +265 -0
  32. package/dist/baselines/atomizer/inPlaceModifier-presplit.js.map +1 -0
  33. package/dist/baselines/atomizer/inPlaceModifier-shared.d.ts +62 -0
  34. package/dist/baselines/atomizer/inPlaceModifier-shared.d.ts.map +1 -0
  35. package/dist/baselines/atomizer/inPlaceModifier-shared.js +139 -0
  36. package/dist/baselines/atomizer/inPlaceModifier-shared.js.map +1 -0
  37. package/dist/baselines/atomizer/inPlaceModifier-wrappers.d.ts +189 -0
  38. package/dist/baselines/atomizer/inPlaceModifier-wrappers.d.ts.map +1 -0
  39. package/dist/baselines/atomizer/inPlaceModifier-wrappers.js +427 -0
  40. package/dist/baselines/atomizer/inPlaceModifier-wrappers.js.map +1 -0
  41. package/dist/baselines/atomizer/inPlaceModifier.d.ts +6 -290
  42. package/dist/baselines/atomizer/inPlaceModifier.d.ts.map +1 -1
  43. package/dist/baselines/atomizer/inPlaceModifier.js +23 -1828
  44. package/dist/baselines/atomizer/inPlaceModifier.js.map +1 -1
  45. package/dist/baselines/atomizer/pipeline.d.ts +76 -1
  46. package/dist/baselines/atomizer/pipeline.d.ts.map +1 -1
  47. package/dist/baselines/atomizer/pipeline.js +204 -27
  48. package/dist/baselines/atomizer/pipeline.js.map +1 -1
  49. package/dist/baselines/atomizer/trackChangesAcceptorAst.d.ts.map +1 -1
  50. package/dist/baselines/atomizer/trackChangesAcceptorAst.js +56 -160
  51. package/dist/baselines/atomizer/trackChangesAcceptorAst.js.map +1 -1
  52. package/dist/compare-types.d.ts +151 -0
  53. package/dist/compare-types.d.ts.map +1 -0
  54. package/dist/compare-types.js +2 -0
  55. package/dist/compare-types.js.map +1 -0
  56. package/dist/core-types.d.ts +5 -1
  57. package/dist/core-types.d.ts.map +1 -1
  58. package/dist/core-types.js +5 -1
  59. package/dist/core-types.js.map +1 -1
  60. package/dist/footnotes.d.ts +8 -3
  61. package/dist/footnotes.d.ts.map +1 -1
  62. package/dist/footnotes.js +8 -3
  63. package/dist/footnotes.js.map +1 -1
  64. package/dist/index.d.ts +6 -150
  65. package/dist/index.d.ts.map +1 -1
  66. package/dist/index.js +6 -0
  67. package/dist/index.js.map +1 -1
  68. package/dist/integration/libreoffice-oracle.d.ts +41 -0
  69. package/dist/integration/libreoffice-oracle.d.ts.map +1 -0
  70. package/dist/integration/libreoffice-oracle.js +282 -0
  71. package/dist/integration/libreoffice-oracle.js.map +1 -0
  72. package/dist/primitives/accept_changes.d.ts +2 -2
  73. package/dist/primitives/accept_changes.d.ts.map +1 -1
  74. package/dist/primitives/accept_changes.js +24 -79
  75. package/dist/primitives/accept_changes.js.map +1 -1
  76. package/dist/primitives/comments.d.ts +12 -3
  77. package/dist/primitives/comments.d.ts.map +1 -1
  78. package/dist/primitives/comments.js +374 -97
  79. package/dist/primitives/comments.js.map +1 -1
  80. package/dist/primitives/content_fingerprint.d.ts +29 -0
  81. package/dist/primitives/content_fingerprint.d.ts.map +1 -0
  82. package/dist/primitives/content_fingerprint.js +63 -0
  83. package/dist/primitives/content_fingerprint.js.map +1 -0
  84. package/dist/primitives/document.d.ts +56 -15
  85. package/dist/primitives/document.d.ts.map +1 -1
  86. package/dist/primitives/document.js +303 -32
  87. package/dist/primitives/document.js.map +1 -1
  88. package/dist/primitives/document_view-comments.d.ts +18 -0
  89. package/dist/primitives/document_view-comments.d.ts.map +1 -0
  90. package/dist/primitives/document_view-comments.js +159 -0
  91. package/dist/primitives/document_view-comments.js.map +1 -0
  92. package/dist/primitives/document_view-headings.d.ts +45 -0
  93. package/dist/primitives/document_view-headings.d.ts.map +1 -0
  94. package/dist/primitives/document_view-headings.js +247 -0
  95. package/dist/primitives/document_view-headings.js.map +1 -0
  96. package/dist/primitives/document_view-styles.d.ts +11 -0
  97. package/dist/primitives/document_view-styles.d.ts.map +1 -0
  98. package/dist/primitives/document_view-styles.js +104 -0
  99. package/dist/primitives/document_view-styles.js.map +1 -0
  100. package/dist/primitives/document_view-toon.d.ts +37 -0
  101. package/dist/primitives/document_view-toon.d.ts.map +1 -0
  102. package/dist/primitives/document_view-toon.js +199 -0
  103. package/dist/primitives/document_view-toon.js.map +1 -0
  104. package/dist/primitives/document_view-types.d.ts +137 -0
  105. package/dist/primitives/document_view-types.d.ts.map +1 -0
  106. package/dist/primitives/document_view-types.js +2 -0
  107. package/dist/primitives/document_view-types.js.map +1 -0
  108. package/dist/primitives/document_view.d.ts +8 -106
  109. package/dist/primitives/document_view.d.ts.map +1 -1
  110. package/dist/primitives/document_view.js +134 -301
  111. package/dist/primitives/document_view.js.map +1 -1
  112. package/dist/primitives/dom-helpers.d.ts +9 -0
  113. package/dist/primitives/dom-helpers.d.ts.map +1 -1
  114. package/dist/primitives/dom-helpers.js +10 -1
  115. package/dist/primitives/dom-helpers.js.map +1 -1
  116. package/dist/primitives/footnotes.d.ts +4 -3
  117. package/dist/primitives/footnotes.d.ts.map +1 -1
  118. package/dist/primitives/footnotes.js +232 -44
  119. package/dist/primitives/footnotes.js.map +1 -1
  120. package/dist/primitives/formatting_tags.d.ts +6 -0
  121. package/dist/primitives/formatting_tags.d.ts.map +1 -1
  122. package/dist/primitives/formatting_tags.js +6 -1
  123. package/dist/primitives/formatting_tags.js.map +1 -1
  124. package/dist/primitives/index.d.ts +6 -0
  125. package/dist/primitives/index.d.ts.map +1 -1
  126. package/dist/primitives/index.js +5 -0
  127. package/dist/primitives/index.js.map +1 -1
  128. package/dist/primitives/layout.d.ts +4 -3
  129. package/dist/primitives/layout.d.ts.map +1 -1
  130. package/dist/primitives/layout.js +32 -3
  131. package/dist/primitives/layout.js.map +1 -1
  132. package/dist/primitives/merge_runs.d.ts +21 -3
  133. package/dist/primitives/merge_runs.d.ts.map +1 -1
  134. package/dist/primitives/merge_runs.js +32 -10
  135. package/dist/primitives/merge_runs.js.map +1 -1
  136. package/dist/primitives/namespaces.d.ts +6 -0
  137. package/dist/primitives/namespaces.d.ts.map +1 -1
  138. package/dist/primitives/namespaces.js +9 -0
  139. package/dist/primitives/namespaces.js.map +1 -1
  140. package/dist/primitives/reject_changes.d.ts +2 -2
  141. package/dist/primitives/reject_changes.d.ts.map +1 -1
  142. package/dist/primitives/reject_changes.js +24 -81
  143. package/dist/primitives/reject_changes.js.map +1 -1
  144. package/dist/primitives/semantic_tags.d.ts +7 -0
  145. package/dist/primitives/semantic_tags.d.ts.map +1 -1
  146. package/dist/primitives/semantic_tags.js +21 -3
  147. package/dist/primitives/semantic_tags.js.map +1 -1
  148. package/dist/primitives/serialize_html.d.ts +36 -0
  149. package/dist/primitives/serialize_html.d.ts.map +1 -0
  150. package/dist/primitives/serialize_html.js +393 -0
  151. package/dist/primitives/serialize_html.js.map +1 -0
  152. package/dist/primitives/serialize_markdown.d.ts +16 -0
  153. package/dist/primitives/serialize_markdown.d.ts.map +1 -0
  154. package/dist/primitives/serialize_markdown.js +300 -0
  155. package/dist/primitives/serialize_markdown.js.map +1 -0
  156. package/dist/primitives/serialize_plaintext.d.ts +15 -0
  157. package/dist/primitives/serialize_plaintext.d.ts.map +1 -0
  158. package/dist/primitives/serialize_plaintext.js +154 -0
  159. package/dist/primitives/serialize_plaintext.js.map +1 -0
  160. package/dist/primitives/styles.js +22 -22
  161. package/dist/primitives/styles.js.map +1 -1
  162. package/dist/primitives/tables.d.ts.map +1 -1
  163. package/dist/primitives/tables.js +13 -3
  164. package/dist/primitives/tables.js.map +1 -1
  165. package/dist/primitives/text.d.ts +2 -1
  166. package/dist/primitives/text.d.ts.map +1 -1
  167. package/dist/primitives/text.js +116 -12
  168. package/dist/primitives/text.js.map +1 -1
  169. package/dist/primitives/track-changes-emitter.d.ts +139 -0
  170. package/dist/primitives/track-changes-emitter.d.ts.map +1 -0
  171. package/dist/primitives/track-changes-emitter.js +241 -0
  172. package/dist/primitives/track-changes-emitter.js.map +1 -0
  173. package/dist/primitives/xml-helpers.d.ts +29 -0
  174. package/dist/primitives/xml-helpers.d.ts.map +1 -0
  175. package/dist/primitives/xml-helpers.js +35 -0
  176. package/dist/primitives/xml-helpers.js.map +1 -0
  177. package/dist/shared/ooxml/namespaces.d.ts +4 -1
  178. package/dist/shared/ooxml/namespaces.d.ts.map +1 -1
  179. package/dist/shared/ooxml/namespaces.js +4 -1
  180. package/dist/shared/ooxml/namespaces.js.map +1 -1
  181. package/package.json +7 -6
@@ -0,0 +1,326 @@
1
+ /**
2
+ * In-Place AST Modifier
3
+ *
4
+ * Modifies the revised document's AST in-place to add track changes markup.
5
+ * This replaces the reconstruction-based approach with direct tree manipulation.
6
+ */
7
+ import { childElements, findChildByTagName, insertAfterElement } from '../../primitives/index.js';
8
+ import { allocateRevisionId, convertToDelText, createEl, findAncestorByTag, getMoveRangeIds, } from './inPlaceModifier-shared.js';
9
+ import { cloneUnemittedSourceBookmarkMarkers, insertMarkersBeforeWrapper, } from './inPlaceModifier-bookmarks.js';
10
+ import { getAtomRuns, isCollapsedFieldAtom, wrapAsDeleted } from './inPlaceModifier-wrappers.js';
11
+ export function getInsertableAtomContentElements(atom, filterRun) {
12
+ if (atom.collapsedFieldAtoms && atom.collapsedFieldAtoms.length > 0) {
13
+ if (filterRun) {
14
+ return atom.collapsedFieldAtoms
15
+ .filter((fieldAtom) => {
16
+ const run = fieldAtom.sourceRunElement ?? findAncestorByTag(fieldAtom, 'w:r');
17
+ return run === filterRun;
18
+ })
19
+ .map((fieldAtom) => fieldAtom.contentElement);
20
+ }
21
+ return atom.collapsedFieldAtoms.map((fieldAtom) => fieldAtom.contentElement);
22
+ }
23
+ return [atom.contentElement];
24
+ }
25
+ /**
26
+ * Clone a source run and replace its non-rPr children with atom content.
27
+ *
28
+ * This keeps run-level formatting while allowing atom-level fragment insertion.
29
+ *
30
+ * @param filterRun - When provided, only include content elements belonging
31
+ * to this source run (for multi-run collapsed field replay).
32
+ */
33
+ export function cloneRunWithAtomContent(sourceRun, atom, filterRun) {
34
+ const clonedRun = sourceRun.cloneNode(true);
35
+ const retainedChildren = [];
36
+ for (const child of childElements(clonedRun)) {
37
+ if (child.tagName === 'w:rPr') {
38
+ retainedChildren.push(child);
39
+ }
40
+ }
41
+ // Remove all current children from clonedRun
42
+ while (clonedRun.firstChild)
43
+ clonedRun.removeChild(clonedRun.firstChild);
44
+ // Re-append retained rPr children
45
+ for (const child of retainedChildren) {
46
+ clonedRun.appendChild(child);
47
+ }
48
+ for (const contentElement of getInsertableAtomContentElements(atom, filterRun)) {
49
+ const fragment = contentElement.cloneNode(true);
50
+ clonedRun.appendChild(fragment);
51
+ }
52
+ return clonedRun;
53
+ }
54
+ /**
55
+ * Clone a deleted run from the original document and insert it into the revised document.
56
+ *
57
+ * For a single-content atom this wraps one cloned run in `<w:del>` and returns
58
+ * the `<w:del>` element. For a collapsed-field atom (issue #217), control
59
+ * routes to `insertFragmentedDeletedField` which emits multiple sibling
60
+ * elements — `w:fldChar` runs at sibling level (unwrapped) and individual
61
+ * `<w:del>` wrappers around each payload run — and returns the LAST inserted
62
+ * sibling (which may be a `<w:r>` carrying the end fldChar, not a `<w:del>`).
63
+ * Callers use the return value purely as the next insertion anchor.
64
+ *
65
+ * @param deletedAtom - Atom with the deleted content
66
+ * @param insertAfterRun - The run to insert after (null to insert at beginning of paragraph)
67
+ * @param targetParagraph - The paragraph to insert into
68
+ * @param author - Author name
69
+ * @param dateStr - Formatted date
70
+ * @param state - Revision ID state
71
+ * @returns The last inserted sibling element (a `<w:del>` for non-collapsed-field
72
+ * atoms; possibly a `<w:r>` for fragmented collapsed-field atoms), or null
73
+ * if insertion failed.
74
+ */
75
+ export function insertDeletedRun(deletedAtom, insertAfterRun, targetParagraph, author, dateStr, state, context) {
76
+ // Get the source run element from the deleted atom
77
+ const sourceRun = deletedAtom.sourceRunElement;
78
+ if (!sourceRun) {
79
+ return null;
80
+ }
81
+ const runs = getAtomRuns(deletedAtom);
82
+ // ECMA-376 Part 4 fragmentation (issue #217): for a collapsed-field atom,
83
+ // emit w:fldChar runs at sibling level (unwrapped) and wrap only the
84
+ // payload runs (w:instrText, w:t, etc.) in <w:del>. w:fldChar inside
85
+ // <w:del> is non-conformant and Word treats it as fatal. Iterates the
86
+ // constituent collapsedFieldAtoms (not the deduped source runs) so a
87
+ // mixed-run field — where multiple field elements share one source `<w:r>` —
88
+ // is correctly split into one cloned run per field element.
89
+ if (isCollapsedFieldAtom(deletedAtom)) {
90
+ return insertFragmentedDeletedField(deletedAtom, sourceRun, insertAfterRun, targetParagraph, author, dateStr, state, context);
91
+ }
92
+ // Avoid an unused variable when the collapsed-field branch above is not taken.
93
+ void runs;
94
+ // Single-run path: wrap the cloned run in one <w:del>.
95
+ const id = allocateRevisionId(state);
96
+ const del = createEl('w:del', {
97
+ 'w:id': String(id),
98
+ 'w:author': author,
99
+ 'w:date': dateStr,
100
+ });
101
+ const clonedRun = cloneRunWithAtomContent(sourceRun, deletedAtom);
102
+ convertToDelText(clonedRun);
103
+ del.appendChild(clonedRun);
104
+ // Insert at correct position
105
+ if (insertAfterRun) {
106
+ insertAfterElement(insertAfterRun, del);
107
+ }
108
+ else {
109
+ // Insert at the beginning of the paragraph (after pPr if present)
110
+ const pPr = findChildByTagName(targetParagraph, 'w:pPr');
111
+ if (pPr) {
112
+ insertAfterElement(pPr, del);
113
+ }
114
+ else {
115
+ targetParagraph.insertBefore(del, targetParagraph.firstChild);
116
+ }
117
+ }
118
+ const sourceMarkers = cloneUnemittedSourceBookmarkMarkers(sourceRun, targetParagraph, state, context);
119
+ if (sourceMarkers.length > 0)
120
+ insertMarkersBeforeWrapper(del, sourceMarkers);
121
+ return del;
122
+ }
123
+ /**
124
+ * Emit a fragmented deletion of a collapsed-field atom: walks the constituent
125
+ * source runs in document order, cloning each into the target paragraph as
126
+ * either a sibling-level unwrapped run (for `w:fldChar`) or a `<w:del>`-wrapped
127
+ * run (for payload runs whose text is renamed to `w:delText` / `w:delInstrText`).
128
+ *
129
+ * Returns the last sibling element inserted, which the caller uses as the
130
+ * next insertion anchor (preserving the contract of `insertDeletedRun`).
131
+ *
132
+ * @conformance ECMA-376 edition 5, Part 4 § 17.16.5
133
+ *
134
+ * Rule: `w:delInstrText` MUST appear inside `<w:del>`;
135
+ * by extension and by issue #217's deep-research conclusion, `w:fldChar` runs
136
+ * stay at sibling level.
137
+ */
138
+ export function insertFragmentedDeletedField(deletedAtom, sourceRun, insertAfterRun, targetParagraph, author, dateStr, state, context) {
139
+ const fieldAtoms = deletedAtom.collapsedFieldAtoms;
140
+ if (!fieldAtoms || fieldAtoms.length === 0)
141
+ return null;
142
+ let anchor = insertAfterRun;
143
+ let firstInserted = null;
144
+ let lastInserted = null;
145
+ const pPr = findChildByTagName(targetParagraph, 'w:pPr');
146
+ const place = (el) => {
147
+ if (anchor) {
148
+ insertAfterElement(anchor, el);
149
+ }
150
+ else if (pPr) {
151
+ insertAfterElement(pPr, el);
152
+ }
153
+ else {
154
+ targetParagraph.insertBefore(el, targetParagraph.firstChild);
155
+ }
156
+ if (firstInserted === null)
157
+ firstInserted = el;
158
+ lastInserted = el;
159
+ anchor = el;
160
+ };
161
+ for (const fieldAtom of fieldAtoms) {
162
+ // Each constituent field atom produces its own cloned run carrying exactly
163
+ // one content element (fldChar / instrText / t). This is critical for
164
+ // mixed-run fields where multiple field elements share a single `<w:r>` in
165
+ // the source — we MUST emit them as separate runs so we can fragment
166
+ // fldChars out of the `<w:del>` wrapper.
167
+ const baseRun = fieldAtom.sourceRunElement ?? findAncestorByTag(fieldAtom, 'w:r') ?? sourceRun;
168
+ if (!baseRun)
169
+ continue;
170
+ const clonedRun = cloneRunWithAtomContent(baseRun, fieldAtom);
171
+ const contentTag = fieldAtom.contentElement.tagName;
172
+ if (contentTag === 'w:fldChar') {
173
+ // Sibling level — unwrapped.
174
+ place(clonedRun);
175
+ continue;
176
+ }
177
+ // Payload — wrap in <w:del> and rename w:t→w:delText / w:instrText→w:delInstrText.
178
+ convertToDelText(clonedRun);
179
+ const id = allocateRevisionId(state);
180
+ const del = createEl('w:del', {
181
+ 'w:id': String(id),
182
+ 'w:author': author,
183
+ 'w:date': dateStr,
184
+ });
185
+ del.appendChild(clonedRun);
186
+ place(del);
187
+ }
188
+ if (firstInserted) {
189
+ const sourceMarkers = cloneUnemittedSourceBookmarkMarkers(sourceRun, targetParagraph, state, context);
190
+ if (sourceMarkers.length > 0)
191
+ insertMarkersBeforeWrapper(firstInserted, sourceMarkers);
192
+ }
193
+ return lastInserted;
194
+ }
195
+ /**
196
+ * Clone a moved-from run from the original document and insert it into the revised document.
197
+ *
198
+ * MovedSource atoms have their sourceRunElement in the ORIGINAL tree, but we need to
199
+ * insert the content into the REVISED tree. This function clones the run, wraps it with
200
+ * <w:moveFrom> and range markers, and inserts at the correct position.
201
+ *
202
+ * @param atom - Atom with the moved-from content
203
+ * @param moveName - Name for linking source and destination
204
+ * @param insertAfterRun - The run to insert after (null to insert at beginning of paragraph)
205
+ * @param targetParagraph - The paragraph to insert into
206
+ * @param author - Author name
207
+ * @param dateStr - Formatted date
208
+ * @param state - Revision ID state
209
+ * @returns The inserted moveFrom element, or null if insertion failed
210
+ */
211
+ export function insertMoveFromRun(atom, moveName, insertAfterRun, targetParagraph, author, dateStr, state, context) {
212
+ // Get the source run element from the atom (in original tree)
213
+ const sourceRun = atom.sourceRunElement;
214
+ if (!sourceRun) {
215
+ return null;
216
+ }
217
+ // For collapsed field atoms, replay one cloned run per original source run.
218
+ const runs = getAtomRuns(atom);
219
+ const clonedRuns = [];
220
+ if (runs.length > 1) {
221
+ for (const run of runs) {
222
+ const clonedRun = cloneRunWithAtomContent(run, atom, run);
223
+ convertToDelText(clonedRun);
224
+ clonedRuns.push(clonedRun);
225
+ }
226
+ }
227
+ else {
228
+ const clonedRun = cloneRunWithAtomContent(sourceRun, atom);
229
+ convertToDelText(clonedRun);
230
+ clonedRuns.push(clonedRun);
231
+ }
232
+ // Get or allocate move range IDs
233
+ const ids = getMoveRangeIds(state, moveName);
234
+ const moveId = allocateRevisionId(state);
235
+ // Create range start marker
236
+ const rangeStart = createEl('w:moveFromRangeStart', {
237
+ 'w:id': String(ids.sourceRangeId),
238
+ 'w:name': moveName,
239
+ 'w:author': author,
240
+ 'w:date': dateStr,
241
+ });
242
+ // Create moveFrom wrapper
243
+ const moveFrom = createEl('w:moveFrom', {
244
+ 'w:id': String(moveId),
245
+ 'w:author': author,
246
+ 'w:date': dateStr,
247
+ });
248
+ // Create range end marker
249
+ const rangeEnd = createEl('w:moveFromRangeEnd', {
250
+ 'w:id': String(ids.sourceRangeId),
251
+ });
252
+ // Add cloned run(s) as children of moveFrom
253
+ for (const clonedRun of clonedRuns) {
254
+ moveFrom.appendChild(clonedRun);
255
+ }
256
+ // Insert at correct position: rangeStart -> moveFrom(run) -> rangeEnd
257
+ if (insertAfterRun) {
258
+ insertAfterElement(insertAfterRun, rangeStart);
259
+ insertAfterElement(rangeStart, moveFrom);
260
+ insertAfterElement(moveFrom, rangeEnd);
261
+ }
262
+ else {
263
+ // Insert at the beginning of the paragraph (after pPr if present)
264
+ const pPr = findChildByTagName(targetParagraph, 'w:pPr');
265
+ if (pPr) {
266
+ insertAfterElement(pPr, rangeStart);
267
+ insertAfterElement(rangeStart, moveFrom);
268
+ insertAfterElement(moveFrom, rangeEnd);
269
+ }
270
+ else {
271
+ targetParagraph.insertBefore(rangeEnd, targetParagraph.firstChild);
272
+ targetParagraph.insertBefore(moveFrom, rangeEnd);
273
+ targetParagraph.insertBefore(rangeStart, moveFrom);
274
+ }
275
+ }
276
+ const sourceMarkers = cloneUnemittedSourceBookmarkMarkers(sourceRun, targetParagraph, state, context);
277
+ if (sourceMarkers.length > 0)
278
+ insertMarkersBeforeWrapper(moveFrom, sourceMarkers);
279
+ return moveFrom;
280
+ }
281
+ /**
282
+ * Clone a deleted paragraph from the original document and insert it.
283
+ *
284
+ * @param deletedAtom - Atom representing the deleted paragraph
285
+ * @param insertAfterParagraph - Paragraph to insert after (null to insert at body start)
286
+ * @param targetBody - The body element to insert into
287
+ * @param author - Author name
288
+ * @param dateStr - Formatted date
289
+ * @param state - Revision ID state
290
+ * @returns The inserted paragraph, or null if insertion failed
291
+ */
292
+ export function insertDeletedParagraph(deletedAtom, insertAfterParagraph, targetContainer, author, dateStr, state) {
293
+ // Get the source paragraph from the deleted atom
294
+ const sourceParagraph = deletedAtom.sourceParagraphElement;
295
+ if (!sourceParagraph) {
296
+ return null;
297
+ }
298
+ // Clone the paragraph
299
+ const clonedParagraph = sourceParagraph.cloneNode(true);
300
+ // Wrap runs with w:del (wrapAsDeleted handles w:t -> w:delText conversion internally)
301
+ const runs = Array.from(clonedParagraph.getElementsByTagName('w:r'));
302
+ for (const run of runs) {
303
+ wrapAsDeleted(run, author, dateStr, state);
304
+ }
305
+ // Insert at correct position, preserving w:tcPr as first child when target is a table cell
306
+ if (insertAfterParagraph) {
307
+ insertAfterElement(insertAfterParagraph, clonedParagraph);
308
+ }
309
+ else {
310
+ const tcPr = targetContainer.tagName === 'w:tc'
311
+ ? findChildByTagName(targetContainer, 'w:tcPr')
312
+ : null;
313
+ if (tcPr) {
314
+ insertAfterElement(tcPr, clonedParagraph);
315
+ }
316
+ else {
317
+ targetContainer.insertBefore(clonedParagraph, targetContainer.firstChild);
318
+ }
319
+ }
320
+ return clonedParagraph;
321
+ }
322
+ // Field-character tag names that should not be split.
323
+ export const FIELD_CHAR_TAG_NAMES = new Set([
324
+ 'w:fldChar', 'w:instrText', 'w:delInstrText',
325
+ ]);
326
+ //# sourceMappingURL=inPlaceModifier-deletion.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inPlaceModifier-deletion.js","sourceRoot":"","sources":["../../../src/baselines/atomizer/inPlaceModifier-deletion.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,85 @@
1
+ /**
2
+ * In-Place AST Modifier
3
+ *
4
+ * Modifies the revised document's AST in-place to add track changes markup.
5
+ * This replaces the reconstruction-based approach with direct tree manipulation.
6
+ */
7
+ import { CorrelationStatus, type ComparisonUnitAtom } from '../../core-types.js';
8
+ export declare const DELETION_LIKE_STATUSES: ReadonlySet<CorrelationStatus>;
9
+ export declare const INSERTION_LIKE_STATUSES: ReadonlySet<CorrelationStatus>;
10
+ /**
11
+ * Reorder merged atoms so that within each contiguous block of non-equal atoms,
12
+ * all deletion-like atoms come before all insertion-like atoms.
13
+ *
14
+ * This produces grouped tracked changes ("<del>old words</del><ins>new words</ins>")
15
+ * instead of alternating word-by-word pairs ("<del>old1</del><ins>new1</ins><del>old2</del>...").
16
+ */
17
+ export declare function groupDeletionsBeforeInsertions(atoms: ComparisonUnitAtom[]): ComparisonUnitAtom[];
18
+ export declare function mergeAdjacentTrackChangeSiblings(root: Element): void;
19
+ /**
20
+ * Build a normalized content signature for a run's non-rPr children.
21
+ * On the del side, maps w:delText → w:t and w:delInstrText → w:instrText
22
+ * so that content from del wrappers can be compared to ins wrappers.
23
+ */
24
+ export declare function normalizeRunContentSignature(run: Element, isDelSide: boolean): string;
25
+ /**
26
+ * Check if an adjacent w:del + w:ins pair is a no-op (identical text and formatting).
27
+ * Both wrappers must contain the same number of runs with matching rPr and content.
28
+ */
29
+ export declare function isNoOpPair(del: Element, ins: Element): boolean;
30
+ /**
31
+ * Suppress no-op del/ins pairs — adjacent w:del + w:ins wrappers where the
32
+ * content and formatting are identical. These arise from field-adjacent atoms
33
+ * that are false-positive changes.
34
+ *
35
+ * When a no-op is detected, both wrappers are unwrapped, leaving the ins-side
36
+ * runs as plain (non-tracked) children. The del-side runs are removed.
37
+ */
38
+ export declare function suppressNoOpChangePairs(root: Element): void;
39
+ /**
40
+ * Narrow whitespace predicate for bridging: returns true only if a w:r element's
41
+ * visible children are exclusively w:t elements with whitespace-only text content.
42
+ * Excludes w:tab, w:br, w:cr which have layout significance.
43
+ */
44
+ export declare function isInlineWhitespaceOnlyRun(run: Element): boolean;
45
+ /**
46
+ * Merge track-change wrappers (w:del or w:ins) that are separated by a
47
+ * whitespace-only run. This groups "word-by-word" tracked changes into
48
+ * contiguous blocks for cleaner presentation.
49
+ *
50
+ * For w:del: clones the whitespace run, converts w:t→w:delText, and absorbs
51
+ * both the whitespace and the second wrapper's children into the first wrapper.
52
+ *
53
+ * For w:ins: moves the whitespace run into the first wrapper, then absorbs
54
+ * the second wrapper's children.
55
+ *
56
+ * Both projections (Accept All, Reject All) remain correct because each
57
+ * wrapper independently contains the whitespace it needs.
58
+ */
59
+ export declare function mergeWhitespaceBridgedTrackChanges(root: Element): void;
60
+ /**
61
+ * Convert w:t → w:delText and w:instrText → w:delInstrText within a run,
62
+ * preserving xml:space attributes. Used for cloning whitespace runs into
63
+ * w:del wrappers during pair-chain coalescing.
64
+ */
65
+ export declare function convertRunTextToDelText(run: Element): void;
66
+ /**
67
+ * Coalesce alternating del/ins pair chains separated by whitespace-only runs
68
+ * into single grouped del + ins wrappers.
69
+ *
70
+ * Pattern: [w:del, w:ins, ws-segment..., w:del, w:ins, ws-segment..., w:del, w:ins]
71
+ *
72
+ * For each whitespace segment between consecutive [del, ins] pairs:
73
+ * 1. Clone each ws-run → convert to delText → append to first del
74
+ * 2. Clone each ws-run → keep as w:t → append to first ins
75
+ * 3. Move nextDel's children into first del
76
+ * 4. Move nextIns's children into first ins
77
+ * 5. Remove original ws-runs, empty nextDel, empty nextIns from parent
78
+ *
79
+ * Safety invariants:
80
+ * - Only bridges when both del AND ins absorb the whitespace (both projections correct)
81
+ * - Incomplete tail [del, ins, ws, del] (no trailing ins) → stop chain, don't bridge
82
+ * - All wrappers in chain must share same w:author and w:date
83
+ */
84
+ export declare function coalesceDelInsPairChains(root: Element): void;
85
+ //# sourceMappingURL=inPlaceModifier-postprocess.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inPlaceModifier-postprocess.d.ts","sourceRoot":"","sources":["../../../src/baselines/atomizer/inPlaceModifier-postprocess.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,iBAAiB,EAAE,KAAK,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAMjF,eAAO,MAAM,sBAAsB,EAAE,WAAW,CAAC,iBAAiB,CAGhE,CAAC;AAEH,eAAO,MAAM,uBAAuB,EAAE,WAAW,CAAC,iBAAiB,CAGjE,CAAC;AAEH;;;;;;GAMG;AACH,wBAAgB,8BAA8B,CAAC,KAAK,EAAE,kBAAkB,EAAE,GAAG,kBAAkB,EAAE,CAmChG;AAGD,wBAAgB,gCAAgC,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,CAkCpE;AAMD;;;;GAIG;AACH,wBAAgB,4BAA4B,CAAC,GAAG,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,GAAG,MAAM,CAkBrF;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,GAAG,OAAO,CAuB9D;AAED;;;;;;;GAOG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,CA6B3D;AAMD;;;;GAIG;AACH,wBAAgB,yBAAyB,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAuB/D;AAGD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,kCAAkC,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,CAyCtE;AAMD;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,OAAO,GAAG,IAAI,CAkB1D;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,CA2G5D"}