@usejunior/docx-core 0.10.0 → 0.11.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 (232) hide show
  1. package/LICENSE +202 -21
  2. package/NOTICE +2 -0
  3. package/README.md +2 -2
  4. package/dist/.tsbuildinfo +1 -1
  5. package/dist/atomizer.d.ts +13 -7
  6. package/dist/atomizer.d.ts.map +1 -1
  7. package/dist/atomizer.js +59 -24
  8. package/dist/atomizer.js.map +1 -1
  9. package/dist/baselines/atomizer/auxiliaryIdCollision.d.ts +99 -0
  10. package/dist/baselines/atomizer/auxiliaryIdCollision.d.ts.map +1 -0
  11. package/dist/baselines/atomizer/auxiliaryIdCollision.js +415 -0
  12. package/dist/baselines/atomizer/auxiliaryIdCollision.js.map +1 -0
  13. package/dist/baselines/atomizer/documentReconstructor.d.ts.map +1 -1
  14. package/dist/baselines/atomizer/documentReconstructor.js +120 -27
  15. package/dist/baselines/atomizer/documentReconstructor.js.map +1 -1
  16. package/dist/baselines/atomizer/inPlaceModifier-wrappers.d.ts +9 -0
  17. package/dist/baselines/atomizer/inPlaceModifier-wrappers.d.ts.map +1 -1
  18. package/dist/baselines/atomizer/inPlaceModifier-wrappers.js +52 -4
  19. package/dist/baselines/atomizer/inPlaceModifier-wrappers.js.map +1 -1
  20. package/dist/baselines/atomizer/pipeline.d.ts +12 -53
  21. package/dist/baselines/atomizer/pipeline.d.ts.map +1 -1
  22. package/dist/baselines/atomizer/pipeline.js +126 -231
  23. package/dist/baselines/atomizer/pipeline.js.map +1 -1
  24. package/dist/baselines/atomizer/trackChangesAcceptorAst.d.ts.map +1 -1
  25. package/dist/baselines/atomizer/trackChangesAcceptorAst.js +153 -23
  26. package/dist/baselines/atomizer/trackChangesAcceptorAst.js.map +1 -1
  27. package/dist/baselines/wmlcomparer/DotnetCli.d.ts.map +1 -1
  28. package/dist/baselines/wmlcomparer/DotnetCli.js +7 -0
  29. package/dist/baselines/wmlcomparer/DotnetCli.js.map +1 -1
  30. package/dist/cli/compare-two.d.ts.map +1 -1
  31. package/dist/cli/compare-two.js +3 -1
  32. package/dist/cli/compare-two.js.map +1 -1
  33. package/dist/cli/conformance-adapter.d.ts +3 -0
  34. package/dist/cli/conformance-adapter.d.ts.map +1 -0
  35. package/dist/cli/conformance-adapter.js +93 -0
  36. package/dist/cli/conformance-adapter.js.map +1 -0
  37. package/dist/cli/index.d.ts.map +1 -1
  38. package/dist/cli/index.js +5 -1
  39. package/dist/cli/index.js.map +1 -1
  40. package/dist/compare-types.d.ts +46 -0
  41. package/dist/compare-types.d.ts.map +1 -1
  42. package/dist/generation/compile.d.ts +21 -0
  43. package/dist/generation/compile.d.ts.map +1 -0
  44. package/dist/generation/compile.js +46 -0
  45. package/dist/generation/compile.js.map +1 -0
  46. package/dist/generation/context.d.ts +42 -0
  47. package/dist/generation/context.d.ts.map +1 -0
  48. package/dist/generation/context.js +65 -0
  49. package/dist/generation/context.js.map +1 -0
  50. package/dist/generation/emit/comments-part.d.ts +36 -0
  51. package/dist/generation/emit/comments-part.d.ts.map +1 -0
  52. package/dist/generation/emit/comments-part.js +116 -0
  53. package/dist/generation/emit/comments-part.js.map +1 -0
  54. package/dist/generation/emit/document-part.d.ts +24 -0
  55. package/dist/generation/emit/document-part.d.ts.map +1 -0
  56. package/dist/generation/emit/document-part.js +60 -0
  57. package/dist/generation/emit/document-part.js.map +1 -0
  58. package/dist/generation/emit/emit-context.d.ts +26 -0
  59. package/dist/generation/emit/emit-context.d.ts.map +1 -0
  60. package/dist/generation/emit/emit-context.js +19 -0
  61. package/dist/generation/emit/emit-context.js.map +1 -0
  62. package/dist/generation/emit/header-footer-part.d.ts +23 -0
  63. package/dist/generation/emit/header-footer-part.d.ts.map +1 -0
  64. package/dist/generation/emit/header-footer-part.js +57 -0
  65. package/dist/generation/emit/header-footer-part.js.map +1 -0
  66. package/dist/generation/emit/numbering-part.d.ts +29 -0
  67. package/dist/generation/emit/numbering-part.d.ts.map +1 -0
  68. package/dist/generation/emit/numbering-part.js +100 -0
  69. package/dist/generation/emit/numbering-part.js.map +1 -0
  70. package/dist/generation/emit/package-parts.d.ts +24 -0
  71. package/dist/generation/emit/package-parts.d.ts.map +1 -0
  72. package/dist/generation/emit/package-parts.js +121 -0
  73. package/dist/generation/emit/package-parts.js.map +1 -0
  74. package/dist/generation/emit/paragraph.d.ts +24 -0
  75. package/dist/generation/emit/paragraph.d.ts.map +1 -0
  76. package/dist/generation/emit/paragraph.js +63 -0
  77. package/dist/generation/emit/paragraph.js.map +1 -0
  78. package/dist/generation/emit/properties.d.ts +34 -0
  79. package/dist/generation/emit/properties.d.ts.map +1 -0
  80. package/dist/generation/emit/properties.js +138 -0
  81. package/dist/generation/emit/properties.js.map +1 -0
  82. package/dist/generation/emit/run.d.ts +15 -0
  83. package/dist/generation/emit/run.d.ts.map +1 -0
  84. package/dist/generation/emit/run.js +71 -0
  85. package/dist/generation/emit/run.js.map +1 -0
  86. package/dist/generation/emit/section.d.ts +29 -0
  87. package/dist/generation/emit/section.d.ts.map +1 -0
  88. package/dist/generation/emit/section.js +117 -0
  89. package/dist/generation/emit/section.js.map +1 -0
  90. package/dist/generation/emit/settings-part.d.ts +13 -0
  91. package/dist/generation/emit/settings-part.d.ts.map +1 -0
  92. package/dist/generation/emit/settings-part.js +24 -0
  93. package/dist/generation/emit/settings-part.js.map +1 -0
  94. package/dist/generation/emit/styles-part.d.ts +16 -0
  95. package/dist/generation/emit/styles-part.d.ts.map +1 -0
  96. package/dist/generation/emit/styles-part.js +80 -0
  97. package/dist/generation/emit/styles-part.js.map +1 -0
  98. package/dist/generation/emit/table.d.ts +26 -0
  99. package/dist/generation/emit/table.d.ts.map +1 -0
  100. package/dist/generation/emit/table.js +196 -0
  101. package/dist/generation/emit/table.js.map +1 -0
  102. package/dist/generation/errors.d.ts +22 -0
  103. package/dist/generation/errors.d.ts.map +1 -0
  104. package/dist/generation/errors.js +29 -0
  105. package/dist/generation/errors.js.map +1 -0
  106. package/dist/generation/index.d.ts +13 -0
  107. package/dist/generation/index.d.ts.map +1 -0
  108. package/dist/generation/index.js +12 -0
  109. package/dist/generation/index.js.map +1 -0
  110. package/dist/generation/ordering.d.ts +46 -0
  111. package/dist/generation/ordering.d.ts.map +1 -0
  112. package/dist/generation/ordering.js +119 -0
  113. package/dist/generation/ordering.js.map +1 -0
  114. package/dist/generation/recipes.d.ts +47 -0
  115. package/dist/generation/recipes.d.ts.map +1 -0
  116. package/dist/generation/recipes.js +84 -0
  117. package/dist/generation/recipes.js.map +1 -0
  118. package/dist/generation/structural-checks.d.ts +24 -0
  119. package/dist/generation/structural-checks.d.ts.map +1 -0
  120. package/dist/generation/structural-checks.js +318 -0
  121. package/dist/generation/structural-checks.js.map +1 -0
  122. package/dist/generation/types.d.ts +217 -0
  123. package/dist/generation/types.d.ts.map +1 -0
  124. package/dist/generation/types.js +16 -0
  125. package/dist/generation/types.js.map +1 -0
  126. package/dist/generation/validate-spec.d.ts +27 -0
  127. package/dist/generation/validate-spec.d.ts.map +1 -0
  128. package/dist/generation/validate-spec.js +307 -0
  129. package/dist/generation/validate-spec.js.map +1 -0
  130. package/dist/index.d.ts +3 -0
  131. package/dist/index.d.ts.map +1 -1
  132. package/dist/index.js +8 -0
  133. package/dist/index.js.map +1 -1
  134. package/dist/integration/generation-probes.d.ts +15 -0
  135. package/dist/integration/generation-probes.d.ts.map +1 -0
  136. package/dist/integration/generation-probes.js +84 -0
  137. package/dist/integration/generation-probes.js.map +1 -0
  138. package/dist/integration/libreoffice-oracle.d.ts +8 -0
  139. package/dist/integration/libreoffice-oracle.d.ts.map +1 -1
  140. package/dist/integration/libreoffice-oracle.js +14 -6
  141. package/dist/integration/libreoffice-oracle.js.map +1 -1
  142. package/dist/integration/synthetic-docx-fixture.d.ts +72 -0
  143. package/dist/integration/synthetic-docx-fixture.d.ts.map +1 -1
  144. package/dist/integration/synthetic-docx-fixture.js +131 -4
  145. package/dist/integration/synthetic-docx-fixture.js.map +1 -1
  146. package/dist/primitives/accept_changes.d.ts +2 -1
  147. package/dist/primitives/accept_changes.d.ts.map +1 -1
  148. package/dist/primitives/accept_changes.js +153 -12
  149. package/dist/primitives/accept_changes.js.map +1 -1
  150. package/dist/primitives/document.d.ts +38 -0
  151. package/dist/primitives/document.d.ts.map +1 -1
  152. package/dist/primitives/document.js +75 -9
  153. package/dist/primitives/document.js.map +1 -1
  154. package/dist/primitives/document_view-comments.d.ts.map +1 -1
  155. package/dist/primitives/document_view-comments.js +4 -3
  156. package/dist/primitives/document_view-comments.js.map +1 -1
  157. package/dist/primitives/document_view-types.d.ts +15 -0
  158. package/dist/primitives/document_view-types.d.ts.map +1 -1
  159. package/dist/primitives/document_view.d.ts.map +1 -1
  160. package/dist/primitives/document_view.js +21 -13
  161. package/dist/primitives/document_view.js.map +1 -1
  162. package/dist/primitives/formatting_tags.d.ts +1 -0
  163. package/dist/primitives/formatting_tags.d.ts.map +1 -1
  164. package/dist/primitives/formatting_tags.js +16 -10
  165. package/dist/primitives/formatting_tags.js.map +1 -1
  166. package/dist/primitives/index.d.ts +4 -0
  167. package/dist/primitives/index.d.ts.map +1 -1
  168. package/dist/primitives/index.js +4 -0
  169. package/dist/primitives/index.js.map +1 -1
  170. package/dist/primitives/layout.d.ts.map +1 -1
  171. package/dist/primitives/layout.js +13 -0
  172. package/dist/primitives/layout.js.map +1 -1
  173. package/dist/primitives/minimal_save.d.ts +38 -0
  174. package/dist/primitives/minimal_save.d.ts.map +1 -0
  175. package/dist/primitives/minimal_save.js +323 -0
  176. package/dist/primitives/minimal_save.js.map +1 -0
  177. package/dist/primitives/namespaces.d.ts +41 -0
  178. package/dist/primitives/namespaces.d.ts.map +1 -1
  179. package/dist/primitives/namespaces.js +43 -0
  180. package/dist/primitives/namespaces.js.map +1 -1
  181. package/dist/primitives/reject_changes.d.ts +4 -2
  182. package/dist/primitives/reject_changes.d.ts.map +1 -1
  183. package/dist/primitives/reject_changes.js +177 -24
  184. package/dist/primitives/reject_changes.js.map +1 -1
  185. package/dist/primitives/revision-parts.d.ts +7 -0
  186. package/dist/primitives/revision-parts.d.ts.map +1 -0
  187. package/dist/primitives/revision-parts.js +27 -0
  188. package/dist/primitives/revision-parts.js.map +1 -0
  189. package/dist/primitives/revision-vocabulary.d.ts +7 -0
  190. package/dist/primitives/revision-vocabulary.d.ts.map +1 -0
  191. package/dist/primitives/revision-vocabulary.js +39 -0
  192. package/dist/primitives/revision-vocabulary.js.map +1 -0
  193. package/dist/primitives/schema-corpus-capture.d.ts +19 -0
  194. package/dist/primitives/schema-corpus-capture.d.ts.map +1 -0
  195. package/dist/primitives/schema-corpus-capture.js +29 -0
  196. package/dist/primitives/schema-corpus-capture.js.map +1 -0
  197. package/dist/primitives/sectPrAudit.d.ts +19 -0
  198. package/dist/primitives/sectPrAudit.d.ts.map +1 -0
  199. package/dist/primitives/sectPrAudit.js +165 -0
  200. package/dist/primitives/sectPrAudit.js.map +1 -0
  201. package/dist/primitives/semantic_tags.d.ts.map +1 -1
  202. package/dist/primitives/semantic_tags.js +2 -1
  203. package/dist/primitives/semantic_tags.js.map +1 -1
  204. package/dist/primitives/serialize_html.d.ts +1 -0
  205. package/dist/primitives/serialize_html.d.ts.map +1 -1
  206. package/dist/primitives/serialize_html.js +4 -2
  207. package/dist/primitives/serialize_html.js.map +1 -1
  208. package/dist/primitives/styles.d.ts +15 -0
  209. package/dist/primitives/styles.d.ts.map +1 -1
  210. package/dist/primitives/styles.js +11 -0
  211. package/dist/primitives/styles.js.map +1 -1
  212. package/dist/primitives/track-changes-emitter.d.ts +9 -0
  213. package/dist/primitives/track-changes-emitter.d.ts.map +1 -1
  214. package/dist/primitives/track-changes-emitter.js +54 -4
  215. package/dist/primitives/track-changes-emitter.js.map +1 -1
  216. package/dist/primitives/validate_ai_revisions.d.ts +35 -0
  217. package/dist/primitives/validate_ai_revisions.d.ts.map +1 -0
  218. package/dist/primitives/validate_ai_revisions.js +323 -0
  219. package/dist/primitives/validate_ai_revisions.js.map +1 -0
  220. package/dist/primitives/xml.d.ts +5 -0
  221. package/dist/primitives/xml.d.ts.map +1 -1
  222. package/dist/primitives/xml.js +5 -0
  223. package/dist/primitives/xml.js.map +1 -1
  224. package/dist/primitives/zip.d.ts +1 -0
  225. package/dist/primitives/zip.d.ts.map +1 -1
  226. package/dist/primitives/zip.js +21 -3
  227. package/dist/primitives/zip.js.map +1 -1
  228. package/dist/shared/field-structure.d.ts +14 -0
  229. package/dist/shared/field-structure.d.ts.map +1 -0
  230. package/dist/shared/field-structure.js +166 -0
  231. package/dist/shared/field-structure.js.map +1 -0
  232. package/package.json +7 -4
@@ -6,8 +6,10 @@
6
6
  * - Unwrapping w:del elements and converting w:delText → w:t (deletions restored)
7
7
  * - Unwrapping w:moveFrom (keep at original position), removing w:moveTo and content
8
8
  * - Restoring original properties from *PrChange records
9
- * - Preserving cross-paragraph bookmark boundaries when removing inserted paragraphs
10
- * - Stripping paragraph-level revision markers and rsidDel attributes
9
+ * - Preserving cross-paragraph bookmark boundaries when resolving inserted paragraph marks
10
+ * - Stripping paragraph-level revision markers, merging a paragraph whose
11
+ * mark was a tracked insertion into the following paragraph
12
+ * - Stripping rsidDel attributes
11
13
  *
12
14
  * Operates on the W3C DOM (`@xmldom/xmldom`).
13
15
  */
@@ -86,6 +88,144 @@ const PR_CHANGE_LOCALS = [
86
88
  'rPrChange', 'pPrChange', 'sectPrChange',
87
89
  'tblPrChange', 'trPrChange', 'tcPrChange',
88
90
  ];
91
+ // Marker-ish elements that may sit between two paragraphs at block level
92
+ // without ending the search for a merge target: the full EG_RangeMarkupElements
93
+ // schema group (wml.xsd), plus permStart/permEnd range markers and proofErr
94
+ // proofing anchors.
95
+ const RANGE_MARKUP_BLOCK_SIBLING_LOCALS = new Set([
96
+ 'bookmarkStart', 'bookmarkEnd',
97
+ 'commentRangeStart', 'commentRangeEnd',
98
+ 'moveFromRangeStart', 'moveFromRangeEnd',
99
+ 'moveToRangeStart', 'moveToRangeEnd',
100
+ 'customXmlInsRangeStart', 'customXmlInsRangeEnd',
101
+ 'customXmlDelRangeStart', 'customXmlDelRangeEnd',
102
+ 'customXmlMoveFromRangeStart', 'customXmlMoveFromRangeEnd',
103
+ 'customXmlMoveToRangeStart', 'customXmlMoveToRangeEnd',
104
+ 'permStart', 'permEnd',
105
+ 'proofErr',
106
+ ]);
107
+ /**
108
+ * Find the next sibling paragraph a paragraph-mark revision can merge into,
109
+ * skipping block-level range/annotation markers. Returns null when the next
110
+ * block is not a paragraph (table, sdt, sectPr, end of parent).
111
+ */
112
+ function findFollowingSiblingParagraph(p) {
113
+ let sibling = p.nextSibling;
114
+ while (sibling) {
115
+ if (sibling.nodeType === 1) {
116
+ if (isW(sibling, 'p'))
117
+ return sibling;
118
+ const el = sibling;
119
+ if (el.namespaceURI === W_NS && RANGE_MARKUP_BLOCK_SIBLING_LOCALS.has(el.localName ?? '')) {
120
+ sibling = sibling.nextSibling;
121
+ continue;
122
+ }
123
+ return null;
124
+ }
125
+ sibling = sibling.nextSibling;
126
+ }
127
+ return null;
128
+ }
129
+ /** True iff the paragraph still holds content beyond w:pPr and bare annotation markers. */
130
+ function paragraphHasContent(p) {
131
+ for (let i = 0; i < p.childNodes.length; i++) {
132
+ const child = p.childNodes[i];
133
+ if (child.nodeType !== 1)
134
+ continue;
135
+ if (isW(child, 'pPr'))
136
+ continue;
137
+ const el = child;
138
+ if (el.namespaceURI === W_NS && RANGE_MARKUP_BLOCK_SIBLING_LOCALS.has(el.localName ?? ''))
139
+ continue;
140
+ return true;
141
+ }
142
+ return false;
143
+ }
144
+ /**
145
+ * True iff removing an emptied mark-revised paragraph keeps its parent
146
+ * structurally valid for Word: the parent must retain at least one block
147
+ * element, must not end on a w:tbl (a trailing table needs a following
148
+ * paragraph), and two tables must not become adjacent (Word merges
149
+ * back-to-back tables). w:sectPr is ignored — a trailing body sectPr is not a
150
+ * block element.
151
+ */
152
+ function canSafelyRemoveEmptyParagraph(p) {
153
+ const blockSibling = (start, dir) => {
154
+ let sibling = start;
155
+ while (sibling) {
156
+ if (sibling.nodeType === 1) {
157
+ const el = sibling;
158
+ if ((el.namespaceURI === W_NS && RANGE_MARKUP_BLOCK_SIBLING_LOCALS.has(el.localName ?? '')) ||
159
+ isW(el, 'sectPr')) {
160
+ sibling = sibling[dir];
161
+ continue;
162
+ }
163
+ return el;
164
+ }
165
+ sibling = sibling[dir];
166
+ }
167
+ return null;
168
+ };
169
+ const prev = blockSibling(p.previousSibling, 'previousSibling');
170
+ const next = blockSibling(p.nextSibling, 'nextSibling');
171
+ if (!prev && !next)
172
+ return false;
173
+ if (prev && isW(prev, 'tbl') && !next)
174
+ return false;
175
+ if (prev && next && isW(prev, 'tbl') && isW(next, 'tbl'))
176
+ return false;
177
+ return true;
178
+ }
179
+ /**
180
+ * Resolve a paragraph whose paragraph MARK revision was applied (inserted mark
181
+ * rejected): the inserted paragraph break disappears, so the paragraph's
182
+ * surviving content merges into the FOLLOWING paragraph. The surviving
183
+ * (following) paragraph keeps its own w:pPr — formatting follows the surviving
184
+ * paragraph mark — and the merged-away paragraph's w:pPr is dropped.
185
+ *
186
+ * The revision targets only the mark, never the paragraph's contents, so the
187
+ * contents must not be dropped wholesale (they disappear only via their own
188
+ * run-level w:ins wrappers). When no following sibling paragraph exists (last
189
+ * block, or the next block is a table), there is no break to remove into:
190
+ * content-bearing paragraphs are kept, and emptied ones are removed only where
191
+ * removal keeps the parent structurally valid (canSafelyRemoveEmptyParagraph).
192
+ *
193
+ * @conformance ECMA-376 edition 5, Part 1 § 17.13.5.20
194
+ * @see https://github.com/UseJunior/safe-docx/issues/431
195
+ */
196
+ function resolveParagraphMarkRevision(p) {
197
+ const parent = p.parentNode;
198
+ if (!parent)
199
+ return;
200
+ const target = findFollowingSiblingParagraph(p);
201
+ if (!target) {
202
+ if (!paragraphHasContent(p) && canSafelyRemoveEmptyParagraph(p)) {
203
+ parent.removeChild(p);
204
+ }
205
+ return;
206
+ }
207
+ // Insertion point: before the target's first non-pPr child (the merged
208
+ // content precedes the target's own content in document order).
209
+ let ref = null;
210
+ for (let i = 0; i < target.childNodes.length; i++) {
211
+ const c = target.childNodes[i];
212
+ if (c.nodeType === 1 && isW(c, 'pPr'))
213
+ continue;
214
+ ref = c;
215
+ break;
216
+ }
217
+ const toMove = [];
218
+ for (let i = 0; i < p.childNodes.length; i++) {
219
+ const c = p.childNodes[i];
220
+ if (c.nodeType === 1 && isW(c, 'pPr'))
221
+ continue;
222
+ toMove.push(c);
223
+ }
224
+ for (const c of toMove) {
225
+ target.insertBefore(c, ref);
226
+ }
227
+ parent.removeChild(p);
228
+ }
89
229
  /**
90
230
  * Relocate orphaned bookmarks from a paragraph being removed to an
91
231
  * adjacent kept paragraph. This preserves cross-paragraph bookmark boundaries.
@@ -116,15 +256,22 @@ function relocateBookmarks(p, paragraphsToRemove) {
116
256
  }
117
257
  if (!target)
118
258
  return;
119
- // Move bookmarkStart/bookmarkEnd elements that are direct children of the paragraph
259
+ // Move bookmarkStart/bookmarkEnd elements that are direct children of the
260
+ // paragraph — but only when the paragraph will NOT merge into a following
261
+ // paragraph. The Phase-G merge carries direct children in document order;
262
+ // pre-relocating them here would reorder bookmark boundaries relative to the
263
+ // surviving untracked content. Without a merge target the paragraph may be
264
+ // removed outright, so the markers must be rescued.
120
265
  const toMove = [];
121
- for (let i = 0; i < p.childNodes.length; i++) {
122
- const child = p.childNodes[i];
123
- if (child.nodeType !== 1)
124
- continue;
125
- const el = child;
126
- if (isW(el, 'bookmarkStart') || isW(el, 'bookmarkEnd')) {
127
- toMove.push(el);
266
+ if (!findFollowingSiblingParagraph(p)) {
267
+ for (let i = 0; i < p.childNodes.length; i++) {
268
+ const child = p.childNodes[i];
269
+ if (child.nodeType !== 1)
270
+ continue;
271
+ const el = child;
272
+ if (isW(el, 'bookmarkStart') || isW(el, 'bookmarkEnd')) {
273
+ toMove.push(el);
274
+ }
128
275
  }
129
276
  }
130
277
  // Also check sibling bookmarks (sibling-style: <bookmarkStart/><p/><bookmarkEnd/>)
@@ -174,24 +321,30 @@ export function rejectChanges(doc) {
174
321
  if (!root) {
175
322
  return { insertionsRemoved: 0, deletionsRestored: 0, movesReverted: 0, propertyChangesReverted: 0 };
176
323
  }
177
- // Phase A — Identify paragraphs to remove (entirely inserted paragraphs)
178
- const paragraphsToRemove = new Set();
324
+ // Phase A — Identify paragraphs whose MARK is a tracked insertion
325
+ const markInsertedParagraphs = new Set();
179
326
  const allParagraphs = collectByLocalName(root, 'p');
180
327
  for (const p of allParagraphs) {
181
- // Remove a paragraph iff its paragraph MARK is a tracked insertion
182
- // (w:p > w:pPr > w:rPr > w:ins) the paragraph break itself was inserted.
183
- // We deliberately do NOT drop a paragraph based on content ("all runs inside
328
+ // A paragraph-mark insertion (w:p > w:pPr > w:rPr > w:ins) means the
329
+ // paragraph BREAK was inserted rejecting it merges the paragraph into the
330
+ // following one (resolveParagraphMarkRevision); the contents disappear only
331
+ // via their own run-level w:ins wrappers.
332
+ // We deliberately do NOT touch a paragraph based on content ("all runs inside
184
333
  // w:ins/w:moveTo"): a run-level insertion under an untracked mark means text was
185
334
  // inserted into a pre-existing paragraph, which Word/LibreOffice keep (empty) on
186
335
  // reject. safe-docx's inserted paragraphs always carry the mark now, so the
187
336
  // mark-based rule suffices and is Word-faithful. (Mirrors rejectAllChanges.)
188
337
  if (paragraphHasParaMarker(p, 'ins')) {
189
- paragraphsToRemove.add(p);
338
+ markInsertedParagraphs.add(p);
190
339
  }
191
340
  }
192
- // Phase B — Preserve cross-paragraph bookmark boundaries
193
- for (const p of paragraphsToRemove) {
194
- relocateBookmarks(p, paragraphsToRemove);
341
+ // Phase B — Preserve cross-paragraph bookmark boundaries. Direct-child
342
+ // bookmarks of a paragraph that will merge ride the Phase-G merge in
343
+ // document order; relocateBookmarks rescues the rest (direct children of a
344
+ // paragraph with no merge target, which may be removed outright, plus
345
+ // adjacent sibling-style markers).
346
+ for (const p of markInsertedParagraphs) {
347
+ relocateBookmarks(p, markInsertedParagraphs);
195
348
  }
196
349
  // Phase C — Remove insertions and move destinations
197
350
  const insertionsRemoved = removeAllByLocalName(root, 'ins');
@@ -287,11 +440,11 @@ export function rejectChanges(doc) {
287
440
  }
288
441
  }
289
442
  }
290
- // Remove paragraphs collected in Phase A
291
- for (const p of paragraphsToRemove) {
292
- if (p.parentNode) {
293
- p.parentNode.removeChild(p);
294
- }
443
+ // Resolve paragraphs collected in Phase A: merge each into its following
444
+ // paragraph (document order, so consecutive mark-inserted paragraphs cascade
445
+ // forward into the first surviving one).
446
+ for (const p of markInsertedParagraphs) {
447
+ resolveParagraphMarkRevision(p);
295
448
  }
296
449
  // Strip w:rsidDel attributes on remaining elements
297
450
  const allElements = root.getElementsByTagNameNS(W_NS, '*');
@@ -1 +1 @@
1
- {"version":3,"file":"reject_changes.js","sourceRoot":"","sources":["../../src/primitives/reject_changes.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"reject_changes.js","sourceRoot":"","sources":["../../src/primitives/reject_changes.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import { DocxZip } from './zip.js';
2
+ export declare const REVISION_STORY_PART_PATHS: readonly ["word/footnotes.xml", "word/endnotes.xml", "word/comments.xml", "word/glossary/document.xml"];
3
+ export declare const REVISION_SIDE_PART_PATHS: readonly ["word/comments.xml", "word/commentsExtended.xml", "word/people.xml", "word/footnotes.xml", "word/endnotes.xml"];
4
+ export declare const NUMBERED_HEADER_FOOTER_RE: RegExp;
5
+ export declare function isRevisionHeaderFooterPart(path: string): boolean;
6
+ export declare function enumerateRevisionStoryPartPaths(zip: DocxZip): string[];
7
+ //# sourceMappingURL=revision-parts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"revision-parts.d.ts","sourceRoot":"","sources":["../../src/primitives/revision-parts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AAEnC,eAAO,MAAM,yBAAyB,yGAK5B,CAAC;AAEX,eAAO,MAAM,wBAAwB,2HAM3B,CAAC;AAEX,eAAO,MAAM,yBAAyB,QAAsC,CAAC;AAE7E,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEhE;AAED,wBAAgB,+BAA+B,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,EAAE,CAQtE"}
@@ -0,0 +1,27 @@
1
+ export const REVISION_STORY_PART_PATHS = [
2
+ 'word/footnotes.xml',
3
+ 'word/endnotes.xml',
4
+ 'word/comments.xml',
5
+ 'word/glossary/document.xml',
6
+ ];
7
+ export const REVISION_SIDE_PART_PATHS = [
8
+ 'word/comments.xml',
9
+ 'word/commentsExtended.xml',
10
+ 'word/people.xml',
11
+ 'word/footnotes.xml',
12
+ 'word/endnotes.xml',
13
+ ];
14
+ export const NUMBERED_HEADER_FOOTER_RE = /^word\/(?:header|footer)\d*\.xml$/;
15
+ export function isRevisionHeaderFooterPart(path) {
16
+ return NUMBERED_HEADER_FOOTER_RE.test(path);
17
+ }
18
+ export function enumerateRevisionStoryPartPaths(zip) {
19
+ const paths = new Set(REVISION_STORY_PART_PATHS);
20
+ for (const entry of zip.listFiles()) {
21
+ if (isRevisionHeaderFooterPart(entry)) {
22
+ paths.add(entry);
23
+ }
24
+ }
25
+ return [...paths].sort();
26
+ }
27
+ //# sourceMappingURL=revision-parts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"revision-parts.js","sourceRoot":"","sources":["../../src/primitives/revision-parts.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,yBAAyB,GAAG;IACvC,oBAAoB;IACpB,mBAAmB;IACnB,mBAAmB;IACnB,4BAA4B;CACpB,CAAC;AAEX,MAAM,CAAC,MAAM,wBAAwB,GAAG;IACtC,mBAAmB;IACnB,2BAA2B;IAC3B,iBAAiB;IACjB,oBAAoB;IACpB,mBAAmB;CACX,CAAC;AAEX,MAAM,CAAC,MAAM,yBAAyB,GAAG,mCAAmC,CAAC;AAE7E,MAAM,UAAU,0BAA0B,CAAC,IAAY;IACrD,OAAO,yBAAyB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC9C,CAAC;AAED,MAAM,UAAU,+BAA+B,CAAC,GAAY;IAC1D,MAAM,KAAK,GAAG,IAAI,GAAG,CAAS,yBAAyB,CAAC,CAAC;IACzD,KAAK,MAAM,KAAK,IAAI,GAAG,CAAC,SAAS,EAAE,EAAE,CAAC;QACpC,IAAI,0BAA0B,CAAC,KAAK,CAAC,EAAE,CAAC;YACtC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACnB,CAAC;IACH,CAAC;IACD,OAAO,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC;AAC3B,CAAC"}
@@ -0,0 +1,7 @@
1
+ export declare const TRACKED_CHANGE_ELEMENT_NAMES: readonly ["ins", "del", "moveFrom", "moveTo", "pPrChange", "rPrChange", "sectPrChange", "tblPrChange", "tblPrExChange", "trPrChange", "tcPrChange", "tblGridChange", "numberingChange", "cellIns", "cellDel", "cellMerge"];
2
+ export type TrackedChangeElementName = typeof TRACKED_CHANGE_ELEMENT_NAMES[number];
3
+ export declare const TRACKED_CHANGE_ELEMENT_NAME_SET: Set<string>;
4
+ export declare const REVISION_RANGE_ELEMENT_NAMES: readonly ["moveFromRangeStart", "moveFromRangeEnd", "moveToRangeStart", "moveToRangeEnd", "customXmlInsRangeStart", "customXmlInsRangeEnd", "customXmlDelRangeStart", "customXmlDelRangeEnd", "customXmlMoveFromRangeStart", "customXmlMoveFromRangeEnd", "customXmlMoveToRangeStart", "customXmlMoveToRangeEnd"];
5
+ export declare const REVISION_ID_ELEMENT_NAMES: readonly ["ins", "del", "moveFrom", "moveTo", "pPrChange", "rPrChange", "sectPrChange", "tblPrChange", "tblPrExChange", "trPrChange", "tcPrChange", "tblGridChange", "numberingChange", "cellIns", "cellDel", "cellMerge", "moveFromRangeStart", "moveFromRangeEnd", "moveToRangeStart", "moveToRangeEnd", "customXmlInsRangeStart", "customXmlInsRangeEnd", "customXmlDelRangeStart", "customXmlDelRangeEnd", "customXmlMoveFromRangeStart", "customXmlMoveFromRangeEnd", "customXmlMoveToRangeStart", "customXmlMoveToRangeEnd"];
6
+ export declare const REVISION_ID_ELEMENT_NAME_SET: Set<string>;
7
+ //# sourceMappingURL=revision-vocabulary.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"revision-vocabulary.d.ts","sourceRoot":"","sources":["../../src/primitives/revision-vocabulary.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,4BAA4B,4NAiB/B,CAAC;AAEX,MAAM,MAAM,wBAAwB,GAAG,OAAO,4BAA4B,CAAC,MAAM,CAAC,CAAC;AAEnF,eAAO,MAAM,+BAA+B,aAAgD,CAAC;AAE7F,eAAO,MAAM,4BAA4B,mTAa/B,CAAC;AAEX,eAAO,MAAM,yBAAyB,ogBAG5B,CAAC;AAEX,eAAO,MAAM,4BAA4B,aAA6C,CAAC"}
@@ -0,0 +1,39 @@
1
+ export const TRACKED_CHANGE_ELEMENT_NAMES = [
2
+ 'ins',
3
+ 'del',
4
+ 'moveFrom',
5
+ 'moveTo',
6
+ 'pPrChange',
7
+ 'rPrChange',
8
+ 'sectPrChange',
9
+ 'tblPrChange',
10
+ 'tblPrExChange',
11
+ 'trPrChange',
12
+ 'tcPrChange',
13
+ 'tblGridChange',
14
+ 'numberingChange',
15
+ 'cellIns',
16
+ 'cellDel',
17
+ 'cellMerge',
18
+ ];
19
+ export const TRACKED_CHANGE_ELEMENT_NAME_SET = new Set(TRACKED_CHANGE_ELEMENT_NAMES);
20
+ export const REVISION_RANGE_ELEMENT_NAMES = [
21
+ 'moveFromRangeStart',
22
+ 'moveFromRangeEnd',
23
+ 'moveToRangeStart',
24
+ 'moveToRangeEnd',
25
+ 'customXmlInsRangeStart',
26
+ 'customXmlInsRangeEnd',
27
+ 'customXmlDelRangeStart',
28
+ 'customXmlDelRangeEnd',
29
+ 'customXmlMoveFromRangeStart',
30
+ 'customXmlMoveFromRangeEnd',
31
+ 'customXmlMoveToRangeStart',
32
+ 'customXmlMoveToRangeEnd',
33
+ ];
34
+ export const REVISION_ID_ELEMENT_NAMES = [
35
+ ...TRACKED_CHANGE_ELEMENT_NAMES,
36
+ ...REVISION_RANGE_ELEMENT_NAMES,
37
+ ];
38
+ export const REVISION_ID_ELEMENT_NAME_SET = new Set(REVISION_ID_ELEMENT_NAMES);
39
+ //# sourceMappingURL=revision-vocabulary.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"revision-vocabulary.js","sourceRoot":"","sources":["../../src/primitives/revision-vocabulary.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,4BAA4B,GAAG;IAC1C,KAAK;IACL,KAAK;IACL,UAAU;IACV,QAAQ;IACR,WAAW;IACX,WAAW;IACX,cAAc;IACd,aAAa;IACb,eAAe;IACf,YAAY;IACZ,YAAY;IACZ,eAAe;IACf,iBAAiB;IACjB,SAAS;IACT,SAAS;IACT,WAAW;CACH,CAAC;AAIX,MAAM,CAAC,MAAM,+BAA+B,GAAG,IAAI,GAAG,CAAS,4BAA4B,CAAC,CAAC;AAE7F,MAAM,CAAC,MAAM,4BAA4B,GAAG;IAC1C,oBAAoB;IACpB,kBAAkB;IAClB,kBAAkB;IAClB,gBAAgB;IAChB,wBAAwB;IACxB,sBAAsB;IACtB,wBAAwB;IACxB,sBAAsB;IACtB,6BAA6B;IAC7B,2BAA2B;IAC3B,2BAA2B;IAC3B,yBAAyB;CACjB,CAAC;AAEX,MAAM,CAAC,MAAM,yBAAyB,GAAG;IACvC,GAAG,4BAA4B;IAC/B,GAAG,4BAA4B;CACvB,CAAC;AAEX,MAAM,CAAC,MAAM,4BAA4B,GAAG,IAAI,GAAG,CAAS,yBAAyB,CAAC,CAAC"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Opt-in capture of every `word/document.xml` the engine emits, so an
3
+ * external OOXML schema validator can check the whole corpus after a test
4
+ * run. No-op (zero I/O) unless `SDX_SCHEMA_CORPUS_DIR` is set.
5
+ *
6
+ * Files are named by content hash, so repeated emissions of the same XML
7
+ * deduplicate and the corpus stays bounded across a full test run. The
8
+ * consumer is `scripts/check_emitted_document_schema.mjs`, which validates
9
+ * the captured corpus against the vendored Transitional WML schema.
10
+ *
11
+ * Capture sites are the three emission choke points: comparison pipelines
12
+ * (`DocxArchive.setDocumentXml`), primitives saves (`DocxDocument.toBuffer`),
13
+ * and generation (`generateDocx`). Capture failures propagate: when the
14
+ * corpus is requested, a partially written corpus must not validate cleanly.
15
+ *
16
+ * @see https://github.com/UseJunior/safe-docx/issues/214
17
+ */
18
+ export declare function maybeCaptureEmittedDocumentXml(xml: string): void;
19
+ //# sourceMappingURL=schema-corpus-capture.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema-corpus-capture.d.ts","sourceRoot":"","sources":["../../src/primitives/schema-corpus-capture.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,8BAA8B,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAMhE"}
@@ -0,0 +1,29 @@
1
+ import { createHash } from 'node:crypto';
2
+ import { mkdirSync, writeFileSync } from 'node:fs';
3
+ import { join } from 'node:path';
4
+ /**
5
+ * Opt-in capture of every `word/document.xml` the engine emits, so an
6
+ * external OOXML schema validator can check the whole corpus after a test
7
+ * run. No-op (zero I/O) unless `SDX_SCHEMA_CORPUS_DIR` is set.
8
+ *
9
+ * Files are named by content hash, so repeated emissions of the same XML
10
+ * deduplicate and the corpus stays bounded across a full test run. The
11
+ * consumer is `scripts/check_emitted_document_schema.mjs`, which validates
12
+ * the captured corpus against the vendored Transitional WML schema.
13
+ *
14
+ * Capture sites are the three emission choke points: comparison pipelines
15
+ * (`DocxArchive.setDocumentXml`), primitives saves (`DocxDocument.toBuffer`),
16
+ * and generation (`generateDocx`). Capture failures propagate: when the
17
+ * corpus is requested, a partially written corpus must not validate cleanly.
18
+ *
19
+ * @see https://github.com/UseJunior/safe-docx/issues/214
20
+ */
21
+ export function maybeCaptureEmittedDocumentXml(xml) {
22
+ const dir = process.env.SDX_SCHEMA_CORPUS_DIR;
23
+ if (!dir)
24
+ return;
25
+ const digest = createHash('sha256').update(xml).digest('hex').slice(0, 16);
26
+ mkdirSync(dir, { recursive: true });
27
+ writeFileSync(join(dir, `document-${digest}.xml`), xml);
28
+ }
29
+ //# sourceMappingURL=schema-corpus-capture.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema-corpus-capture.js","sourceRoot":"","sources":["../../src/primitives/schema-corpus-capture.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,8BAA8B,CAAC,GAAW;IACxD,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC;IAC9C,IAAI,CAAC,GAAG;QAAE,OAAO;IACjB,MAAM,MAAM,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAC3E,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACpC,aAAa,CAAC,IAAI,CAAC,GAAG,EAAE,YAAY,MAAM,MAAM,CAAC,EAAE,GAAG,CAAC,CAAC;AAC1D,CAAC"}
@@ -0,0 +1,19 @@
1
+ export type SectPrIssueType = 'missing_body' | 'multiple_body_level_sectpr' | 'body_level_sectpr_not_last' | 'sectpr_invalid_parent' | 'sectpr_in_ppr_without_paragraph_parent' | 'sectpr_reference_missing_rid' | 'sectpr_reference_dangling_rid';
2
+ export interface SectPrAuditIssue {
3
+ type: SectPrIssueType;
4
+ path: string;
5
+ message: string;
6
+ rid?: string;
7
+ }
8
+ export interface SectPrAuditSummary {
9
+ ok: boolean;
10
+ issues: SectPrAuditIssue[];
11
+ stats: {
12
+ bodyLevelSectPrCount: number;
13
+ paragraphLevelSectPrCount: number;
14
+ totalSectPrCount: number;
15
+ referenceCount: number;
16
+ };
17
+ }
18
+ export declare function auditSectPr(documentXml: string, documentRelsXml?: string | null): SectPrAuditSummary;
19
+ //# sourceMappingURL=sectPrAudit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sectPrAudit.d.ts","sourceRoot":"","sources":["../../src/primitives/sectPrAudit.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,eAAe,GACvB,cAAc,GACd,4BAA4B,GAC5B,4BAA4B,GAC5B,uBAAuB,GACvB,wCAAwC,GACxC,8BAA8B,GAC9B,+BAA+B,CAAC;AAEpC,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,eAAe,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,EAAE,gBAAgB,EAAE,CAAC;IAC3B,KAAK,EAAE;QACL,oBAAoB,EAAE,MAAM,CAAC;QAC7B,yBAAyB,EAAE,MAAM,CAAC;QAClC,gBAAgB,EAAE,MAAM,CAAC;QACzB,cAAc,EAAE,MAAM,CAAC;KACxB,CAAC;CACH;AA8DD,wBAAgB,WAAW,CAAC,WAAW,EAAE,MAAM,EAAE,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,kBAAkB,CAoHpG"}
@@ -0,0 +1,165 @@
1
+ import { parseXml } from './xml.js';
2
+ import { childElements } from './dom-helpers.js';
3
+ import { OOXML } from './namespaces.js';
4
+ function elementSiblingIndex(node) {
5
+ const parent = node.parentNode;
6
+ if (!parent)
7
+ return 1;
8
+ let idx = 0;
9
+ for (const sibling of childElements(parent)) {
10
+ if (sibling.tagName === node.tagName) {
11
+ idx++;
12
+ }
13
+ if (sibling === node) {
14
+ return idx;
15
+ }
16
+ }
17
+ return idx || 1;
18
+ }
19
+ function nodePath(node) {
20
+ const parts = [];
21
+ let current = node;
22
+ while (current) {
23
+ parts.push(`${current.tagName}[${elementSiblingIndex(current)}]`);
24
+ const parentNode = current.parentNode;
25
+ if (!parentNode || parentNode.nodeType !== 1) {
26
+ break;
27
+ }
28
+ current = parentNode;
29
+ }
30
+ return parts.reverse().join('/');
31
+ }
32
+ function collectRelationshipIds(documentRelsXml) {
33
+ if (!documentRelsXml) {
34
+ return new Set();
35
+ }
36
+ try {
37
+ const relDoc = parseXml(documentRelsXml);
38
+ const ids = new Set();
39
+ const relationships = relDoc.getElementsByTagName('Relationship');
40
+ for (let i = 0; i < relationships.length; i++) {
41
+ const rel = relationships.item(i);
42
+ const id = rel?.getAttribute('Id');
43
+ if (id) {
44
+ ids.add(id);
45
+ }
46
+ }
47
+ return ids;
48
+ }
49
+ catch {
50
+ return new Set();
51
+ }
52
+ }
53
+ function getRid(ref) {
54
+ return (ref.getAttribute('r:id') ??
55
+ ref.getAttributeNS(OOXML.R_NS, 'id') ??
56
+ ref.getAttribute('id') ??
57
+ undefined);
58
+ }
59
+ export function auditSectPr(documentXml, documentRelsXml) {
60
+ const issues = [];
61
+ const relIds = collectRelationshipIds(documentRelsXml);
62
+ const doc = parseXml(documentXml);
63
+ const body = doc.getElementsByTagName('w:body').item(0);
64
+ if (!body) {
65
+ return {
66
+ ok: false,
67
+ issues: [
68
+ {
69
+ type: 'missing_body',
70
+ path: 'w:document',
71
+ message: 'Missing w:body element',
72
+ },
73
+ ],
74
+ stats: {
75
+ bodyLevelSectPrCount: 0,
76
+ paragraphLevelSectPrCount: 0,
77
+ totalSectPrCount: 0,
78
+ referenceCount: 0,
79
+ },
80
+ };
81
+ }
82
+ const bodyChildren = childElements(body);
83
+ const bodyLevelSectPrNodes = bodyChildren.filter((child) => child.tagName === 'w:sectPr');
84
+ if (bodyLevelSectPrNodes.length > 1) {
85
+ for (const sectPr of bodyLevelSectPrNodes) {
86
+ issues.push({
87
+ type: 'multiple_body_level_sectpr',
88
+ path: nodePath(sectPr),
89
+ message: 'Multiple body-level w:sectPr elements found; expected at most one final w:sectPr',
90
+ });
91
+ }
92
+ }
93
+ if (bodyLevelSectPrNodes.length > 0) {
94
+ const lastChild = bodyChildren[bodyChildren.length - 1];
95
+ for (const sectPr of bodyLevelSectPrNodes) {
96
+ if (sectPr !== lastChild) {
97
+ issues.push({
98
+ type: 'body_level_sectpr_not_last',
99
+ path: nodePath(sectPr),
100
+ message: 'Body-level w:sectPr is not the final direct child of w:body',
101
+ });
102
+ }
103
+ }
104
+ }
105
+ const sectPrNodes = Array.from(doc.getElementsByTagName('w:sectPr'));
106
+ let paragraphLevelSectPrCount = 0;
107
+ let referenceCount = 0;
108
+ for (const sectPr of sectPrNodes) {
109
+ const parent = sectPr.parentNode;
110
+ const parentTag = parent && parent.nodeType === 1 ? parent.tagName : '';
111
+ if (parentTag === 'w:pPr') {
112
+ paragraphLevelSectPrCount++;
113
+ const grand = parent.parentNode;
114
+ const grandTag = grand && grand.nodeType === 1 ? grand.tagName : '';
115
+ if (grandTag !== 'w:p') {
116
+ issues.push({
117
+ type: 'sectpr_in_ppr_without_paragraph_parent',
118
+ path: nodePath(sectPr),
119
+ message: 'w:sectPr in w:pPr does not have w:p as parent',
120
+ });
121
+ }
122
+ }
123
+ else if (parentTag !== 'w:body') {
124
+ issues.push({
125
+ type: 'sectpr_invalid_parent',
126
+ path: nodePath(sectPr),
127
+ message: `w:sectPr has invalid parent '${parentTag || '(none)'}'`,
128
+ });
129
+ }
130
+ for (const child of childElements(sectPr)) {
131
+ if (child.tagName !== 'w:headerReference' && child.tagName !== 'w:footerReference') {
132
+ continue;
133
+ }
134
+ referenceCount++;
135
+ const rid = getRid(child);
136
+ if (!rid) {
137
+ issues.push({
138
+ type: 'sectpr_reference_missing_rid',
139
+ path: nodePath(child),
140
+ message: `${child.tagName} is missing r:id`,
141
+ });
142
+ continue;
143
+ }
144
+ if (relIds.size > 0 && !relIds.has(rid)) {
145
+ issues.push({
146
+ type: 'sectpr_reference_dangling_rid',
147
+ path: nodePath(child),
148
+ message: `${child.tagName} references missing relationship id '${rid}'`,
149
+ rid,
150
+ });
151
+ }
152
+ }
153
+ }
154
+ return {
155
+ ok: issues.length === 0,
156
+ issues,
157
+ stats: {
158
+ bodyLevelSectPrCount: bodyLevelSectPrNodes.length,
159
+ paragraphLevelSectPrCount,
160
+ totalSectPrCount: sectPrNodes.length,
161
+ referenceCount,
162
+ },
163
+ };
164
+ }
165
+ //# sourceMappingURL=sectPrAudit.js.map