@usejunior/docx-core 0.9.1 → 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 (335) 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 +28 -8
  6. package/dist/atomizer.d.ts.map +1 -1
  7. package/dist/atomizer.js +96 -25
  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 +333 -112
  15. package/dist/baselines/atomizer/documentReconstructor.js.map +1 -1
  16. package/dist/baselines/atomizer/formattingFidelity.d.ts +99 -0
  17. package/dist/baselines/atomizer/formattingFidelity.d.ts.map +1 -0
  18. package/dist/baselines/atomizer/formattingFidelity.js +449 -0
  19. package/dist/baselines/atomizer/formattingFidelity.js.map +1 -0
  20. package/dist/baselines/atomizer/inPlaceModifier-bookmarks.d.ts +37 -0
  21. package/dist/baselines/atomizer/inPlaceModifier-bookmarks.d.ts.map +1 -0
  22. package/dist/baselines/atomizer/inPlaceModifier-bookmarks.js +189 -0
  23. package/dist/baselines/atomizer/inPlaceModifier-bookmarks.js.map +1 -0
  24. package/dist/baselines/atomizer/inPlaceModifier-containers.d.ts +74 -0
  25. package/dist/baselines/atomizer/inPlaceModifier-containers.d.ts.map +1 -0
  26. package/dist/baselines/atomizer/inPlaceModifier-containers.js +171 -0
  27. package/dist/baselines/atomizer/inPlaceModifier-containers.js.map +1 -0
  28. package/dist/baselines/atomizer/inPlaceModifier-deletion.d.ts +88 -0
  29. package/dist/baselines/atomizer/inPlaceModifier-deletion.d.ts.map +1 -0
  30. package/dist/baselines/atomizer/inPlaceModifier-deletion.js +326 -0
  31. package/dist/baselines/atomizer/inPlaceModifier-deletion.js.map +1 -0
  32. package/dist/baselines/atomizer/inPlaceModifier-postprocess.d.ts +85 -0
  33. package/dist/baselines/atomizer/inPlaceModifier-postprocess.d.ts.map +1 -0
  34. package/dist/baselines/atomizer/inPlaceModifier-postprocess.js +402 -0
  35. package/dist/baselines/atomizer/inPlaceModifier-postprocess.js.map +1 -0
  36. package/dist/baselines/atomizer/inPlaceModifier-presplit.d.ts +39 -0
  37. package/dist/baselines/atomizer/inPlaceModifier-presplit.d.ts.map +1 -0
  38. package/dist/baselines/atomizer/inPlaceModifier-presplit.js +265 -0
  39. package/dist/baselines/atomizer/inPlaceModifier-presplit.js.map +1 -0
  40. package/dist/baselines/atomizer/inPlaceModifier-shared.d.ts +62 -0
  41. package/dist/baselines/atomizer/inPlaceModifier-shared.d.ts.map +1 -0
  42. package/dist/baselines/atomizer/inPlaceModifier-shared.js +139 -0
  43. package/dist/baselines/atomizer/inPlaceModifier-shared.js.map +1 -0
  44. package/dist/baselines/atomizer/inPlaceModifier-wrappers.d.ts +198 -0
  45. package/dist/baselines/atomizer/inPlaceModifier-wrappers.d.ts.map +1 -0
  46. package/dist/baselines/atomizer/inPlaceModifier-wrappers.js +475 -0
  47. package/dist/baselines/atomizer/inPlaceModifier-wrappers.js.map +1 -0
  48. package/dist/baselines/atomizer/inPlaceModifier.d.ts +6 -290
  49. package/dist/baselines/atomizer/inPlaceModifier.d.ts.map +1 -1
  50. package/dist/baselines/atomizer/inPlaceModifier.js +23 -1828
  51. package/dist/baselines/atomizer/inPlaceModifier.js.map +1 -1
  52. package/dist/baselines/atomizer/pipeline.d.ts +36 -2
  53. package/dist/baselines/atomizer/pipeline.d.ts.map +1 -1
  54. package/dist/baselines/atomizer/pipeline.js +216 -144
  55. package/dist/baselines/atomizer/pipeline.js.map +1 -1
  56. package/dist/baselines/atomizer/trackChangesAcceptorAst.d.ts.map +1 -1
  57. package/dist/baselines/atomizer/trackChangesAcceptorAst.js +199 -173
  58. package/dist/baselines/atomizer/trackChangesAcceptorAst.js.map +1 -1
  59. package/dist/baselines/wmlcomparer/DotnetCli.d.ts.map +1 -1
  60. package/dist/baselines/wmlcomparer/DotnetCli.js +7 -0
  61. package/dist/baselines/wmlcomparer/DotnetCli.js.map +1 -1
  62. package/dist/cli/compare-two.d.ts.map +1 -1
  63. package/dist/cli/compare-two.js +3 -1
  64. package/dist/cli/compare-two.js.map +1 -1
  65. package/dist/cli/conformance-adapter.d.ts +3 -0
  66. package/dist/cli/conformance-adapter.d.ts.map +1 -0
  67. package/dist/cli/conformance-adapter.js +93 -0
  68. package/dist/cli/conformance-adapter.js.map +1 -0
  69. package/dist/cli/index.d.ts.map +1 -1
  70. package/dist/cli/index.js +5 -1
  71. package/dist/cli/index.js.map +1 -1
  72. package/dist/compare-types.d.ts +197 -0
  73. package/dist/compare-types.d.ts.map +1 -0
  74. package/dist/compare-types.js +2 -0
  75. package/dist/compare-types.js.map +1 -0
  76. package/dist/core-types.d.ts +5 -1
  77. package/dist/core-types.d.ts.map +1 -1
  78. package/dist/core-types.js +5 -1
  79. package/dist/core-types.js.map +1 -1
  80. package/dist/footnotes.d.ts +8 -3
  81. package/dist/footnotes.d.ts.map +1 -1
  82. package/dist/footnotes.js +8 -3
  83. package/dist/footnotes.js.map +1 -1
  84. package/dist/generation/compile.d.ts +21 -0
  85. package/dist/generation/compile.d.ts.map +1 -0
  86. package/dist/generation/compile.js +46 -0
  87. package/dist/generation/compile.js.map +1 -0
  88. package/dist/generation/context.d.ts +42 -0
  89. package/dist/generation/context.d.ts.map +1 -0
  90. package/dist/generation/context.js +65 -0
  91. package/dist/generation/context.js.map +1 -0
  92. package/dist/generation/emit/comments-part.d.ts +36 -0
  93. package/dist/generation/emit/comments-part.d.ts.map +1 -0
  94. package/dist/generation/emit/comments-part.js +116 -0
  95. package/dist/generation/emit/comments-part.js.map +1 -0
  96. package/dist/generation/emit/document-part.d.ts +24 -0
  97. package/dist/generation/emit/document-part.d.ts.map +1 -0
  98. package/dist/generation/emit/document-part.js +60 -0
  99. package/dist/generation/emit/document-part.js.map +1 -0
  100. package/dist/generation/emit/emit-context.d.ts +26 -0
  101. package/dist/generation/emit/emit-context.d.ts.map +1 -0
  102. package/dist/generation/emit/emit-context.js +19 -0
  103. package/dist/generation/emit/emit-context.js.map +1 -0
  104. package/dist/generation/emit/header-footer-part.d.ts +23 -0
  105. package/dist/generation/emit/header-footer-part.d.ts.map +1 -0
  106. package/dist/generation/emit/header-footer-part.js +57 -0
  107. package/dist/generation/emit/header-footer-part.js.map +1 -0
  108. package/dist/generation/emit/numbering-part.d.ts +29 -0
  109. package/dist/generation/emit/numbering-part.d.ts.map +1 -0
  110. package/dist/generation/emit/numbering-part.js +100 -0
  111. package/dist/generation/emit/numbering-part.js.map +1 -0
  112. package/dist/generation/emit/package-parts.d.ts +24 -0
  113. package/dist/generation/emit/package-parts.d.ts.map +1 -0
  114. package/dist/generation/emit/package-parts.js +121 -0
  115. package/dist/generation/emit/package-parts.js.map +1 -0
  116. package/dist/generation/emit/paragraph.d.ts +24 -0
  117. package/dist/generation/emit/paragraph.d.ts.map +1 -0
  118. package/dist/generation/emit/paragraph.js +63 -0
  119. package/dist/generation/emit/paragraph.js.map +1 -0
  120. package/dist/generation/emit/properties.d.ts +34 -0
  121. package/dist/generation/emit/properties.d.ts.map +1 -0
  122. package/dist/generation/emit/properties.js +138 -0
  123. package/dist/generation/emit/properties.js.map +1 -0
  124. package/dist/generation/emit/run.d.ts +15 -0
  125. package/dist/generation/emit/run.d.ts.map +1 -0
  126. package/dist/generation/emit/run.js +71 -0
  127. package/dist/generation/emit/run.js.map +1 -0
  128. package/dist/generation/emit/section.d.ts +29 -0
  129. package/dist/generation/emit/section.d.ts.map +1 -0
  130. package/dist/generation/emit/section.js +117 -0
  131. package/dist/generation/emit/section.js.map +1 -0
  132. package/dist/generation/emit/settings-part.d.ts +13 -0
  133. package/dist/generation/emit/settings-part.d.ts.map +1 -0
  134. package/dist/generation/emit/settings-part.js +24 -0
  135. package/dist/generation/emit/settings-part.js.map +1 -0
  136. package/dist/generation/emit/styles-part.d.ts +16 -0
  137. package/dist/generation/emit/styles-part.d.ts.map +1 -0
  138. package/dist/generation/emit/styles-part.js +80 -0
  139. package/dist/generation/emit/styles-part.js.map +1 -0
  140. package/dist/generation/emit/table.d.ts +26 -0
  141. package/dist/generation/emit/table.d.ts.map +1 -0
  142. package/dist/generation/emit/table.js +196 -0
  143. package/dist/generation/emit/table.js.map +1 -0
  144. package/dist/generation/errors.d.ts +22 -0
  145. package/dist/generation/errors.d.ts.map +1 -0
  146. package/dist/generation/errors.js +29 -0
  147. package/dist/generation/errors.js.map +1 -0
  148. package/dist/generation/index.d.ts +13 -0
  149. package/dist/generation/index.d.ts.map +1 -0
  150. package/dist/generation/index.js +12 -0
  151. package/dist/generation/index.js.map +1 -0
  152. package/dist/generation/ordering.d.ts +46 -0
  153. package/dist/generation/ordering.d.ts.map +1 -0
  154. package/dist/generation/ordering.js +119 -0
  155. package/dist/generation/ordering.js.map +1 -0
  156. package/dist/generation/recipes.d.ts +47 -0
  157. package/dist/generation/recipes.d.ts.map +1 -0
  158. package/dist/generation/recipes.js +84 -0
  159. package/dist/generation/recipes.js.map +1 -0
  160. package/dist/generation/structural-checks.d.ts +24 -0
  161. package/dist/generation/structural-checks.d.ts.map +1 -0
  162. package/dist/generation/structural-checks.js +318 -0
  163. package/dist/generation/structural-checks.js.map +1 -0
  164. package/dist/generation/types.d.ts +217 -0
  165. package/dist/generation/types.d.ts.map +1 -0
  166. package/dist/generation/types.js +16 -0
  167. package/dist/generation/types.js.map +1 -0
  168. package/dist/generation/validate-spec.d.ts +27 -0
  169. package/dist/generation/validate-spec.d.ts.map +1 -0
  170. package/dist/generation/validate-spec.js +307 -0
  171. package/dist/generation/validate-spec.js.map +1 -0
  172. package/dist/index.d.ts +9 -150
  173. package/dist/index.d.ts.map +1 -1
  174. package/dist/index.js +14 -0
  175. package/dist/index.js.map +1 -1
  176. package/dist/integration/generation-probes.d.ts +15 -0
  177. package/dist/integration/generation-probes.d.ts.map +1 -0
  178. package/dist/integration/generation-probes.js +84 -0
  179. package/dist/integration/generation-probes.js.map +1 -0
  180. package/dist/integration/libreoffice-oracle.d.ts +49 -0
  181. package/dist/integration/libreoffice-oracle.d.ts.map +1 -0
  182. package/dist/integration/libreoffice-oracle.js +290 -0
  183. package/dist/integration/libreoffice-oracle.js.map +1 -0
  184. package/dist/integration/synthetic-docx-fixture.d.ts +72 -0
  185. package/dist/integration/synthetic-docx-fixture.d.ts.map +1 -1
  186. package/dist/integration/synthetic-docx-fixture.js +131 -4
  187. package/dist/integration/synthetic-docx-fixture.js.map +1 -1
  188. package/dist/primitives/accept_changes.d.ts +4 -3
  189. package/dist/primitives/accept_changes.d.ts.map +1 -1
  190. package/dist/primitives/accept_changes.js +163 -77
  191. package/dist/primitives/accept_changes.js.map +1 -1
  192. package/dist/primitives/comments.d.ts +12 -3
  193. package/dist/primitives/comments.d.ts.map +1 -1
  194. package/dist/primitives/comments.js +374 -97
  195. package/dist/primitives/comments.js.map +1 -1
  196. package/dist/primitives/content_fingerprint.d.ts +29 -0
  197. package/dist/primitives/content_fingerprint.d.ts.map +1 -0
  198. package/dist/primitives/content_fingerprint.js +63 -0
  199. package/dist/primitives/content_fingerprint.js.map +1 -0
  200. package/dist/primitives/document.d.ts +94 -15
  201. package/dist/primitives/document.d.ts.map +1 -1
  202. package/dist/primitives/document.js +373 -36
  203. package/dist/primitives/document.js.map +1 -1
  204. package/dist/primitives/document_view-comments.d.ts +18 -0
  205. package/dist/primitives/document_view-comments.d.ts.map +1 -0
  206. package/dist/primitives/document_view-comments.js +160 -0
  207. package/dist/primitives/document_view-comments.js.map +1 -0
  208. package/dist/primitives/document_view-headings.d.ts +45 -0
  209. package/dist/primitives/document_view-headings.d.ts.map +1 -0
  210. package/dist/primitives/document_view-headings.js +247 -0
  211. package/dist/primitives/document_view-headings.js.map +1 -0
  212. package/dist/primitives/document_view-styles.d.ts +11 -0
  213. package/dist/primitives/document_view-styles.d.ts.map +1 -0
  214. package/dist/primitives/document_view-styles.js +104 -0
  215. package/dist/primitives/document_view-styles.js.map +1 -0
  216. package/dist/primitives/document_view-toon.d.ts +37 -0
  217. package/dist/primitives/document_view-toon.d.ts.map +1 -0
  218. package/dist/primitives/document_view-toon.js +199 -0
  219. package/dist/primitives/document_view-toon.js.map +1 -0
  220. package/dist/primitives/document_view-types.d.ts +152 -0
  221. package/dist/primitives/document_view-types.d.ts.map +1 -0
  222. package/dist/primitives/document_view-types.js +2 -0
  223. package/dist/primitives/document_view-types.js.map +1 -0
  224. package/dist/primitives/document_view.d.ts +8 -106
  225. package/dist/primitives/document_view.d.ts.map +1 -1
  226. package/dist/primitives/document_view.js +153 -312
  227. package/dist/primitives/document_view.js.map +1 -1
  228. package/dist/primitives/dom-helpers.d.ts +9 -0
  229. package/dist/primitives/dom-helpers.d.ts.map +1 -1
  230. package/dist/primitives/dom-helpers.js +10 -1
  231. package/dist/primitives/dom-helpers.js.map +1 -1
  232. package/dist/primitives/footnotes.d.ts +4 -3
  233. package/dist/primitives/footnotes.d.ts.map +1 -1
  234. package/dist/primitives/footnotes.js +232 -44
  235. package/dist/primitives/footnotes.js.map +1 -1
  236. package/dist/primitives/formatting_tags.d.ts +7 -0
  237. package/dist/primitives/formatting_tags.d.ts.map +1 -1
  238. package/dist/primitives/formatting_tags.js +22 -11
  239. package/dist/primitives/formatting_tags.js.map +1 -1
  240. package/dist/primitives/index.d.ts +10 -0
  241. package/dist/primitives/index.d.ts.map +1 -1
  242. package/dist/primitives/index.js +9 -0
  243. package/dist/primitives/index.js.map +1 -1
  244. package/dist/primitives/layout.d.ts +4 -3
  245. package/dist/primitives/layout.d.ts.map +1 -1
  246. package/dist/primitives/layout.js +45 -3
  247. package/dist/primitives/layout.js.map +1 -1
  248. package/dist/primitives/merge_runs.d.ts +21 -3
  249. package/dist/primitives/merge_runs.d.ts.map +1 -1
  250. package/dist/primitives/merge_runs.js +32 -10
  251. package/dist/primitives/merge_runs.js.map +1 -1
  252. package/dist/primitives/minimal_save.d.ts +38 -0
  253. package/dist/primitives/minimal_save.d.ts.map +1 -0
  254. package/dist/primitives/minimal_save.js +323 -0
  255. package/dist/primitives/minimal_save.js.map +1 -0
  256. package/dist/primitives/namespaces.d.ts +47 -0
  257. package/dist/primitives/namespaces.d.ts.map +1 -1
  258. package/dist/primitives/namespaces.js +52 -0
  259. package/dist/primitives/namespaces.js.map +1 -1
  260. package/dist/primitives/reject_changes.d.ts +6 -4
  261. package/dist/primitives/reject_changes.d.ts.map +1 -1
  262. package/dist/primitives/reject_changes.js +187 -91
  263. package/dist/primitives/reject_changes.js.map +1 -1
  264. package/dist/primitives/revision-parts.d.ts +7 -0
  265. package/dist/primitives/revision-parts.d.ts.map +1 -0
  266. package/dist/primitives/revision-parts.js +27 -0
  267. package/dist/primitives/revision-parts.js.map +1 -0
  268. package/dist/primitives/revision-vocabulary.d.ts +7 -0
  269. package/dist/primitives/revision-vocabulary.d.ts.map +1 -0
  270. package/dist/primitives/revision-vocabulary.js +39 -0
  271. package/dist/primitives/revision-vocabulary.js.map +1 -0
  272. package/dist/primitives/schema-corpus-capture.d.ts +19 -0
  273. package/dist/primitives/schema-corpus-capture.d.ts.map +1 -0
  274. package/dist/primitives/schema-corpus-capture.js +29 -0
  275. package/dist/primitives/schema-corpus-capture.js.map +1 -0
  276. package/dist/primitives/sectPrAudit.d.ts +19 -0
  277. package/dist/primitives/sectPrAudit.d.ts.map +1 -0
  278. package/dist/primitives/sectPrAudit.js +165 -0
  279. package/dist/primitives/sectPrAudit.js.map +1 -0
  280. package/dist/primitives/semantic_tags.d.ts +7 -0
  281. package/dist/primitives/semantic_tags.d.ts.map +1 -1
  282. package/dist/primitives/semantic_tags.js +23 -4
  283. package/dist/primitives/semantic_tags.js.map +1 -1
  284. package/dist/primitives/serialize_html.d.ts +37 -0
  285. package/dist/primitives/serialize_html.d.ts.map +1 -0
  286. package/dist/primitives/serialize_html.js +395 -0
  287. package/dist/primitives/serialize_html.js.map +1 -0
  288. package/dist/primitives/serialize_markdown.d.ts +16 -0
  289. package/dist/primitives/serialize_markdown.d.ts.map +1 -0
  290. package/dist/primitives/serialize_markdown.js +300 -0
  291. package/dist/primitives/serialize_markdown.js.map +1 -0
  292. package/dist/primitives/serialize_plaintext.d.ts +15 -0
  293. package/dist/primitives/serialize_plaintext.d.ts.map +1 -0
  294. package/dist/primitives/serialize_plaintext.js +154 -0
  295. package/dist/primitives/serialize_plaintext.js.map +1 -0
  296. package/dist/primitives/styles.d.ts +15 -0
  297. package/dist/primitives/styles.d.ts.map +1 -1
  298. package/dist/primitives/styles.js +33 -22
  299. package/dist/primitives/styles.js.map +1 -1
  300. package/dist/primitives/tables.d.ts.map +1 -1
  301. package/dist/primitives/tables.js +13 -3
  302. package/dist/primitives/tables.js.map +1 -1
  303. package/dist/primitives/text.d.ts +2 -1
  304. package/dist/primitives/text.d.ts.map +1 -1
  305. package/dist/primitives/text.js +116 -12
  306. package/dist/primitives/text.js.map +1 -1
  307. package/dist/primitives/track-changes-emitter.d.ts +148 -0
  308. package/dist/primitives/track-changes-emitter.d.ts.map +1 -0
  309. package/dist/primitives/track-changes-emitter.js +291 -0
  310. package/dist/primitives/track-changes-emitter.js.map +1 -0
  311. package/dist/primitives/validate_ai_revisions.d.ts +35 -0
  312. package/dist/primitives/validate_ai_revisions.d.ts.map +1 -0
  313. package/dist/primitives/validate_ai_revisions.js +323 -0
  314. package/dist/primitives/validate_ai_revisions.js.map +1 -0
  315. package/dist/primitives/xml-helpers.d.ts +29 -0
  316. package/dist/primitives/xml-helpers.d.ts.map +1 -0
  317. package/dist/primitives/xml-helpers.js +35 -0
  318. package/dist/primitives/xml-helpers.js.map +1 -0
  319. package/dist/primitives/xml.d.ts +5 -0
  320. package/dist/primitives/xml.d.ts.map +1 -1
  321. package/dist/primitives/xml.js +5 -0
  322. package/dist/primitives/xml.js.map +1 -1
  323. package/dist/primitives/zip.d.ts +1 -0
  324. package/dist/primitives/zip.d.ts.map +1 -1
  325. package/dist/primitives/zip.js +21 -3
  326. package/dist/primitives/zip.js.map +1 -1
  327. package/dist/shared/field-structure.d.ts +14 -0
  328. package/dist/shared/field-structure.d.ts.map +1 -0
  329. package/dist/shared/field-structure.js +166 -0
  330. package/dist/shared/field-structure.js.map +1 -0
  331. package/dist/shared/ooxml/namespaces.d.ts +4 -1
  332. package/dist/shared/ooxml/namespaces.d.ts.map +1 -1
  333. package/dist/shared/ooxml/namespaces.js +4 -1
  334. package/dist/shared/ooxml/namespaces.js.map +1 -1
  335. package/package.json +13 -9
@@ -59,6 +59,20 @@ function runFormattingKey(run) {
59
59
  stripRsidAttributes(clone);
60
60
  return serializer.serializeToString(clone);
61
61
  }
62
+ /**
63
+ * Canonical key for a run's rsid attributes. Two runs with the same key
64
+ * carry identical revision-save-id provenance and are mergeable; runs
65
+ * with differing rsids represent distinct edit sessions and must not be
66
+ * merged (Word preserves the boundary as part of its revision-tracking
67
+ * heuristics).
68
+ */
69
+ function runRsidKey(run) {
70
+ return Array.from(run.attributes)
71
+ .filter((attr) => /^rsid/i.test(attr.localName ?? attr.name))
72
+ .map((attr) => `${attr.namespaceURI ?? ''}:${attr.localName ?? attr.name}=${attr.value}`)
73
+ .sort()
74
+ .join('|');
75
+ }
62
76
  /** Check whether a run contains barrier content (fldChar, instrText). */
63
77
  function runContainsBarrierContent(run) {
64
78
  let child = run.firstChild;
@@ -180,7 +194,7 @@ function collectMergeableRunGroups(paragraph) {
180
194
  return allGroups;
181
195
  }
182
196
  /** Merge adjacent format-identical runs within a paragraph. */
183
- function mergeParagraphRuns(paragraph) {
197
+ function mergeParagraphRuns(paragraph, preserveRsidIdentity) {
184
198
  let merged = 0;
185
199
  const groups = collectMergeableRunGroups(paragraph);
186
200
  for (const group of groups) {
@@ -192,7 +206,8 @@ function mergeParagraphRuns(paragraph) {
192
206
  const next = group[i + 1];
193
207
  if (!runContainsBarrierContent(current) &&
194
208
  !runContainsBarrierContent(next) &&
195
- runFormattingKey(current) === runFormattingKey(next)) {
209
+ runFormattingKey(current) === runFormattingKey(next) &&
210
+ (!preserveRsidIdentity || runRsidKey(current) === runRsidKey(next))) {
196
211
  // Move all content children of `next` into `current`.
197
212
  for (const node of runContentChildren(next)) {
198
213
  current.appendChild(node);
@@ -213,8 +228,13 @@ function mergeParagraphRuns(paragraph) {
213
228
  // ── Public API ─────────────────────────────────────────────────────────
214
229
  /**
215
230
  * Merge adjacent format-identical runs across all paragraphs in the
216
- * document body. Removes `<w:proofErr>` elements and strips `rsid`
217
- * attributes from runs before comparison.
231
+ * document body. Removes `<w:proofErr>` elements.
232
+ *
233
+ * Pass `{ preserveRsidIdentity: true }` from edit pipelines that must not
234
+ * disturb rsid attributes on runs the caller did not touch (see #286).
235
+ * The default omits that guard and matches the historical normalize-on-open
236
+ * behaviour, which consolidates rsid-fragmented runs that Word produces
237
+ * across edit sessions.
218
238
  *
219
239
  * Safety barriers prevent merges across:
220
240
  * - Field boundaries (fldChar, instrText)
@@ -222,21 +242,23 @@ function mergeParagraphRuns(paragraph) {
222
242
  * - Bookmark boundaries (bookmarkStart, bookmarkEnd)
223
243
  * - Tracked-change wrapper boundaries (ins, del, moveFrom, moveTo)
224
244
  */
225
- export function mergeRuns(doc) {
245
+ export function mergeRuns(doc, opts = {}) {
226
246
  const body = doc.getElementsByTagNameNS(OOXML.W_NS, W.body).item(0);
227
247
  if (!body)
228
248
  return { runsMerged: 0, proofErrRemoved: 0 };
249
+ const preserveRsidIdentity = opts.preserveRsidIdentity === true;
229
250
  let totalMerged = 0;
230
251
  let totalProofErr = 0;
231
252
  const paragraphs = Array.from(body.getElementsByTagNameNS(OOXML.W_NS, W.p));
232
253
  for (const p of paragraphs) {
233
254
  totalProofErr += removeProofErrors(p);
234
- // Strip rsid attributes from all runs before comparing.
235
- const runs = Array.from(p.getElementsByTagNameNS(OOXML.W_NS, W.r));
236
- for (const r of runs) {
237
- stripRsidAttributes(r);
255
+ if (!preserveRsidIdentity) {
256
+ const runs = Array.from(p.getElementsByTagNameNS(OOXML.W_NS, W.r));
257
+ for (const r of runs) {
258
+ stripRsidAttributes(r);
259
+ }
238
260
  }
239
- totalMerged += mergeParagraphRuns(p);
261
+ totalMerged += mergeParagraphRuns(p, preserveRsidIdentity);
240
262
  }
241
263
  return { runsMerged: totalMerged, proofErrRemoved: totalProofErr };
242
264
  }
@@ -1 +1 @@
1
- {"version":3,"file":"merge_runs.js","sourceRoot":"","sources":["../../src/primitives/merge_runs.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"merge_runs.js","sourceRoot":"","sources":["../../src/primitives/merge_runs.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,iBAAiB,CAAC;AAqB3C,0EAA0E;AAE1E,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC;IAC7B,CAAC,CAAC,OAAO;IACT,CAAC,CAAC,SAAS;IACX,CAAC,CAAC,aAAa;IACf,CAAC,CAAC,WAAW;IACb,mBAAmB;IACnB,iBAAiB;CAClB,CAAC,CAAC;AAEH,MAAM,iBAAiB,GAAG,IAAI,GAAG,CAAC;IAChC,KAAK;IACL,KAAK;IACL,UAAU;IACV,QAAQ;CACT,CAAC,CAAC;AAEH,0EAA0E;AAE1E,MAAM,UAAU,GAAG,IAAI,aAAa,EAAE,CAAC;AAEvC,SAAS,GAAG,CAAC,EAAW,EAAE,SAAiB;IACzC,OAAO,EAAE,CAAC,YAAY,KAAK,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC,SAAS,KAAK,SAAS,CAAC;AACtE,CAAC;AAED,SAAS,MAAM,CAAC,IAAU;IACxB,OAAO,CACL,IAAI,CAAC,QAAQ,KAAK,CAAC;QAClB,IAAgB,CAAC,YAAY,KAAK,KAAK,CAAC,IAAI;QAC5C,IAAgB,CAAC,SAAS,KAAK,CAAC,CAAC,CAAC,CACpC,CAAC;AACJ,CAAC;AAED,wEAAwE;AACxE,SAAS,mBAAmB,CAAC,EAAW;IACtC,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC;IACxC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,IAAI,CAAC;QACzC,IAAI,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACxB,EAAE,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC;QAC/B,CAAC;IACH,CAAC;IACD,IAAI,KAAK,GAAG,EAAE,CAAC,UAAU,CAAC;IAC1B,OAAO,KAAK,EAAE,CAAC;QACb,IAAI,KAAK,CAAC,QAAQ,KAAK,CAAC;YAAE,mBAAmB,CAAC,KAAgB,CAAC,CAAC;QAChE,KAAK,GAAG,KAAK,CAAC,WAAW,CAAC;IAC5B,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,SAAS,gBAAgB,CAAC,GAAY;IACpC,MAAM,GAAG,GAAG,GAAG,CAAC,sBAAsB,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClE,IAAI,CAAC,GAAG;QAAE,OAAO,EAAE,CAAC;IACpB,MAAM,KAAK,GAAG,GAAG,CAAC,SAAS,CAAC,IAAI,CAAY,CAAC;IAC7C,mBAAmB,CAAC,KAAK,CAAC,CAAC;IAC3B,OAAO,UAAU,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;AAC7C,CAAC;AAED;;;;;;GAMG;AACH,SAAS,UAAU,CAAC,GAAY;IAC9B,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC;SAC9B,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC;SAC5D,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,YAAY,IAAI,EAAE,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;SACxF,IAAI,EAAE;SACN,IAAI,CAAC,GAAG,CAAC,CAAC;AACf,CAAC;AAED,yEAAyE;AACzE,SAAS,yBAAyB,CAAC,GAAY;IAC7C,IAAI,KAAK,GAAG,GAAG,CAAC,UAAU,CAAC;IAC3B,OAAO,KAAK,EAAE,CAAC;QACb,IAAI,KAAK,CAAC,QAAQ,KAAK,CAAC,EAAE,CAAC;YACzB,MAAM,EAAE,GAAG,KAAgB,CAAC;YAC5B,IAAI,EAAE,CAAC,YAAY,KAAK,KAAK,CAAC,IAAI,IAAI,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC;gBACvE,OAAO,IAAI,CAAC;YACd,CAAC;QACH,CAAC;QACD,KAAK,GAAG,KAAK,CAAC,WAAW,CAAC;IAC5B,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,2DAA2D;AAC3D,SAAS,kBAAkB,CAAC,GAAY;IACtC,MAAM,GAAG,GAAW,EAAE,CAAC;IACvB,IAAI,KAAK,GAAG,GAAG,CAAC,UAAU,CAAC;IAC3B,OAAO,KAAK,EAAE,CAAC;QACb,IAAI,KAAK,CAAC,QAAQ,KAAK,CAAC,IAAI,GAAG,CAAC,KAAgB,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC;YACzD,KAAK,GAAG,KAAK,CAAC,WAAW,CAAC;YAC1B,SAAS;QACX,CAAC;QACD,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAChB,KAAK,GAAG,KAAK,CAAC,WAAW,CAAC;IAC5B,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;;;GAKG;AACH,SAAS,uBAAuB,CAAC,GAAY;IAC3C,IAAI,KAAK,GAAG,GAAG,CAAC,UAAU,CAAC;IAC3B,OAAO,KAAK,EAAE,CAAC;QACb,IAAI,KAAK,CAAC,QAAQ,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,KAAgB,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YACxD,KAAK,GAAG,KAAK,CAAC,WAAW,CAAC;YAC1B,SAAS;QACX,CAAC;QACD,mFAAmF;QACnF,MAAM,KAAK,GAAG,KAAgB,CAAC;QAC/B,IAAI,IAAI,GAAgB,KAAK,CAAC,WAAW,CAAC;QAC1C,OAAO,IAAI,EAAE,CAAC;YACZ,4DAA4D;YAC5D,IAAI,IAAI,CAAC,QAAQ,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;gBAC5D,MAAM,EAAE,GAAG,IAAI,CAAC;gBAChB,IAAI,GAAG,EAAE,CAAC,WAAW,CAAC;gBACtB,EAAE,CAAC,UAAU,EAAE,WAAW,CAAC,EAAE,CAAC,CAAC;gBAC/B,SAAS;YACX,CAAC;YACD,gCAAgC;YAChC,IAAI,IAAI,CAAC,QAAQ,KAAK,CAAC,IAAI,GAAG,CAAC,IAAe,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBACrD,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,CAAC;gBACnC,KAAK,CAAC,WAAW,GAAG,CAAC,KAAK,CAAC,WAAW,IAAI,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC;gBACzE,IAAI,CAAC,UAAU,EAAE,WAAW,CAAC,IAAI,CAAC,CAAC;gBACnC,IAAI,GAAG,SAAS,CAAC;gBACjB,SAAS;YACX,CAAC;YACD,sDAAsD;YACtD,MAAM;QACR,CAAC;QACD,qDAAqD;QACrD,MAAM,IAAI,GAAG,KAAK,CAAC,WAAW,IAAI,EAAE,CAAC;QACrC,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YAC/C,KAAK,CAAC,cAAc,CAAC,sCAAsC,EAAE,WAAW,EAAE,UAAU,CAAC,CAAC;QACxF,CAAC;aAAM,CAAC;YACN,KAAK,CAAC,iBAAiB,CAAC,sCAAsC,EAAE,OAAO,CAAC,CAAC;QAC3E,CAAC;QACD,KAAK,GAAG,KAAK,CAAC,WAAW,CAAC;IAC5B,CAAC;AACH,CAAC;AAED,2DAA2D;AAC3D,SAAS,iBAAiB,CAAC,SAAkB;IAC3C,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,CAC1B,SAAS,CAAC,sBAAsB,CAAC,KAAK,CAAC,IAAI,EAAE,UAAU,CAAC,CACzD,CAAC;IACF,KAAK,MAAM,EAAE,IAAI,SAAS,EAAE,CAAC;QAC3B,EAAE,CAAC,UAAU,EAAE,WAAW,CAAC,EAAE,CAAC,CAAC;IACjC,CAAC;IACD,OAAO,SAAS,CAAC,MAAM,CAAC;AAC1B,CAAC;AAED,0EAA0E;AAE1E;;;GAGG;AACH,SAAS,yBAAyB,CAAC,SAAkB;IACnD,MAAM,SAAS,GAAgB,EAAE,CAAC;IAClC,MAAM,UAAU,GAAc,CAAC,SAAS,CAAC,CAAC;IAE1C,mDAAmD;IACnD,KAAK,MAAM,KAAK,IAAI,iBAAiB,EAAE,CAAC;QACtC,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CACzB,SAAS,CAAC,sBAAsB,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,CACpD,CAAC;QACF,UAAU,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,CAAC;IAC/B,CAAC;IAED,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,IAAI,YAAY,GAAc,EAAE,CAAC;QACjC,IAAI,KAAK,GAAG,SAAS,CAAC,UAAU,CAAC;QAEjC,OAAO,KAAK,EAAE,CAAC;YACb,IAAI,KAAK,CAAC,QAAQ,KAAK,CAAC,EAAE,CAAC;gBACzB,MAAM,EAAE,GAAG,KAAgB,CAAC;gBAC5B,IAAI,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC;oBACf,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBACxB,CAAC;qBAAM,CAAC;oBACN,uCAAuC;oBACvC,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;wBAC5B,SAAS,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;wBAC7B,YAAY,GAAG,EAAE,CAAC;oBACpB,CAAC;gBACH,CAAC;YACH,CAAC;YACD,KAAK,GAAG,KAAK,CAAC,WAAW,CAAC;QAC5B,CAAC;QAED,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC5B,SAAS,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAC/B,CAAC;IACH,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,+DAA+D;AAC/D,SAAS,kBAAkB,CAAC,SAAkB,EAAE,oBAA6B;IAC3E,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,MAAM,MAAM,GAAG,yBAAyB,CAAC,SAAS,CAAC,CAAC;IAEpD,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;YAAE,SAAS;QAE/B,IAAI,CAAC,GAAG,CAAC,CAAC;QACV,OAAO,CAAC,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC5B,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAE,CAAC;YAC1B,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,CAAE,CAAC;YAE3B,IACE,CAAC,yBAAyB,CAAC,OAAO,CAAC;gBACnC,CAAC,yBAAyB,CAAC,IAAI,CAAC;gBAChC,gBAAgB,CAAC,OAAO,CAAC,KAAK,gBAAgB,CAAC,IAAI,CAAC;gBACpD,CAAC,CAAC,oBAAoB,IAAI,UAAU,CAAC,OAAO,CAAC,KAAK,UAAU,CAAC,IAAI,CAAC,CAAC,EACnE,CAAC;gBACD,sDAAsD;gBACtD,KAAK,MAAM,IAAI,IAAI,kBAAkB,CAAC,IAAI,CAAC,EAAE,CAAC;oBAC5C,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;gBAC5B,CAAC;gBACD,4DAA4D;gBAC5D,uBAAuB,CAAC,OAAO,CAAC,CAAC;gBACjC,IAAI,CAAC,UAAU,EAAE,WAAW,CAAC,IAAI,CAAC,CAAC;gBACnC,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;gBACvB,MAAM,EAAE,CAAC;YACX,CAAC;iBAAM,CAAC;gBACN,CAAC,EAAE,CAAC;YACN,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,0EAA0E;AAE1E;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,SAAS,CAAC,GAAa,EAAE,OAAyB,EAAE;IAClE,MAAM,IAAI,GAAG,GAAG,CAAC,sBAAsB,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpE,IAAI,CAAC,IAAI;QAAE,OAAO,EAAE,UAAU,EAAE,CAAC,EAAE,eAAe,EAAE,CAAC,EAAE,CAAC;IAExD,MAAM,oBAAoB,GAAG,IAAI,CAAC,oBAAoB,KAAK,IAAI,CAAC;IAChE,IAAI,WAAW,GAAG,CAAC,CAAC;IACpB,IAAI,aAAa,GAAG,CAAC,CAAC;IAEtB,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,CAC3B,IAAI,CAAC,sBAAsB,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAC7C,CAAC;IAEF,KAAK,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC;QAC3B,aAAa,IAAI,iBAAiB,CAAC,CAAC,CAAC,CAAC;QAEtC,IAAI,CAAC,oBAAoB,EAAE,CAAC;YAC1B,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,sBAAsB,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACnE,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;gBACrB,mBAAmB,CAAC,CAAC,CAAC,CAAC;YACzB,CAAC;QACH,CAAC;QAED,WAAW,IAAI,kBAAkB,CAAC,CAAC,EAAE,oBAAoB,CAAC,CAAC;IAC7D,CAAC;IAED,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,eAAe,EAAE,aAAa,EAAE,CAAC;AACrE,CAAC"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * minimal_save — restore untouched top-level body blocks from the original
3
+ * document.xml at save time.
4
+ *
5
+ * The in-memory session DOM is normalized at open (`mergeRuns` +
6
+ * `simplifyRedlines`) because text addressing, bookmarks, and comparison
7
+ * baselines all assume the normalized shape. Serializing that DOM wholesale
8
+ * persists the normalization for every paragraph, so a one-paragraph edit
9
+ * rewrites the whole document on disk (proofErr stripped, runs merged) and
10
+ * downstream diffs lie about the edit's blast radius.
11
+ *
12
+ * This module reconciles at save time instead: any body block (w:p, w:tbl,
13
+ * w:sectPr, ...) whose serialization equals the corresponding block of a
14
+ * freshly-normalized re-parse of the original XML was, by construction,
15
+ * untouched by edits — so it is replaced with the pristine original block.
16
+ * Edited blocks that are tables are descended into (rows → cells →
17
+ * paragraphs) so a one-cell edit doesn't churn the rest of the table.
18
+ * Edited or inserted leaves have no equal counterpart and are kept as-is.
19
+ * The output contract is element-for-element preservation of untouched
20
+ * blocks (the XML still passes through the serializer, so byte-identity
21
+ * with the original file is not guaranteed).
22
+ *
23
+ * @see https://github.com/UseJunior/safe-docx/issues/408
24
+ */
25
+ /**
26
+ * Replace every block of `currentDoc` that is untouched — i.e.
27
+ * serialization-equal to the same block of the original document.xml after
28
+ * open-time normalization — with the pristine original block, descending
29
+ * into edited tables so their untouched rows/cells/paragraphs restore too.
30
+ *
31
+ * `currentDoc` must already have internal bookmarks removed (untouched
32
+ * blocks otherwise never match the bookmark-free reference). Returns the
33
+ * number of elements restored; 0 means the document is fully edited or the
34
+ * reference could not be aligned (output then matches today's full
35
+ * re-serialization, never anything worse).
36
+ */
37
+ export declare function restoreUntouchedBlocks(currentDoc: Document, originalXmlText: string): number;
38
+ //# sourceMappingURL=minimal_save.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"minimal_save.d.ts","sourceRoot":"","sources":["../../src/primitives/minimal_save.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAiTH;;;;;;;;;;;GAWG;AACH,wBAAgB,sBAAsB,CACpC,UAAU,EAAE,QAAQ,EACpB,eAAe,EAAE,MAAM,GACtB,MAAM,CAaR"}
@@ -0,0 +1,323 @@
1
+ /**
2
+ * minimal_save — restore untouched top-level body blocks from the original
3
+ * document.xml at save time.
4
+ *
5
+ * The in-memory session DOM is normalized at open (`mergeRuns` +
6
+ * `simplifyRedlines`) because text addressing, bookmarks, and comparison
7
+ * baselines all assume the normalized shape. Serializing that DOM wholesale
8
+ * persists the normalization for every paragraph, so a one-paragraph edit
9
+ * rewrites the whole document on disk (proofErr stripped, runs merged) and
10
+ * downstream diffs lie about the edit's blast radius.
11
+ *
12
+ * This module reconciles at save time instead: any body block (w:p, w:tbl,
13
+ * w:sectPr, ...) whose serialization equals the corresponding block of a
14
+ * freshly-normalized re-parse of the original XML was, by construction,
15
+ * untouched by edits — so it is replaced with the pristine original block.
16
+ * Edited blocks that are tables are descended into (rows → cells →
17
+ * paragraphs) so a one-cell edit doesn't churn the rest of the table.
18
+ * Edited or inserted leaves have no equal counterpart and are kept as-is.
19
+ * The output contract is element-for-element preservation of untouched
20
+ * blocks (the XML still passes through the serializer, so byte-identity
21
+ * with the original file is not guaranteed).
22
+ *
23
+ * @see https://github.com/UseJunior/safe-docx/issues/408
24
+ */
25
+ import { XMLSerializer } from '@xmldom/xmldom';
26
+ import { parseXml } from './xml.js';
27
+ import { OOXML, W } from './namespaces.js';
28
+ import { childElements } from './dom-helpers.js';
29
+ import { mergeRuns } from './merge_runs.js';
30
+ import { simplifyRedlines } from './simplify_redlines.js';
31
+ /**
32
+ * Containers whose ELEMENT-CHILD structure normalization provably preserves
33
+ * (mergeRuns/simplifyRedlines mutate inside paragraphs only): an edited
34
+ * table can be descended into so its untouched rows/cells/paragraphs still
35
+ * restore. Paragraphs are deliberately absent — normalization adds/removes
36
+ * their children, so the original↔normalized index lockstep breaks there.
37
+ */
38
+ const RECURSABLE_CONTAINER_LOCALS = new Set([W.tbl, W.tr, W.tc]);
39
+ function bodyElement(doc) {
40
+ return doc.getElementsByTagNameNS(OOXML.W_NS, W.body).item(0);
41
+ }
42
+ /**
43
+ * DP cell budget (~16 MB of Int32). Edits touch few blocks, so the common
44
+ * prefix/suffix trim below collapses the DP to roughly the edited span;
45
+ * only a document with massive scattered edits exceeds this, and those
46
+ * blocks then simply stay normalized (conservative, never wrong).
47
+ */
48
+ const MAX_LCS_DP_CELLS = 4_000_000;
49
+ /**
50
+ * Order-preserving alignment of two sequences by longest common subsequence,
51
+ * returning matched index pairs `[i, j]` with `a[i] === b[j]`.
52
+ *
53
+ * An LCS (rather than a serialization-keyed FIFO map) is required for
54
+ * correctness when two blocks normalize to identical serializations: if the
55
+ * earlier duplicate is edited, a FIFO would hand the untouched later block
56
+ * the earlier block's original (swapping rsid/paraId provenance). The
57
+ * backtrack below matches from the tail, so untouched trailing duplicates
58
+ * pair with their own originals.
59
+ */
60
+ function lcsPairs(a, b) {
61
+ if (a.length === 0 || b.length === 0)
62
+ return [];
63
+ // Identical leading/trailing runs are LCS matches by construction; pairing
64
+ // them up front shrinks the DP to the edited middle span.
65
+ let start = 0;
66
+ while (start < a.length && start < b.length && a[start] === b[start])
67
+ start++;
68
+ let endA = a.length;
69
+ let endB = b.length;
70
+ while (endA > start && endB > start && a[endA - 1] === b[endB - 1]) {
71
+ endA--;
72
+ endB--;
73
+ }
74
+ const pairs = [];
75
+ for (let k = 0; k < start; k++)
76
+ pairs.push([k, k]);
77
+ const n = endA - start;
78
+ const m = endB - start;
79
+ if (n > 0 && m > 0 && n * m <= MAX_LCS_DP_CELLS) {
80
+ // Intern strings to integers so DP comparisons don't re-compare long XML.
81
+ const ids = new Map();
82
+ const intern = (s) => {
83
+ let id = ids.get(s);
84
+ if (id === undefined) {
85
+ id = ids.size;
86
+ ids.set(s, id);
87
+ }
88
+ return id;
89
+ };
90
+ const ai = a.slice(start, endA).map(intern);
91
+ const bi = b.slice(start, endB).map(intern);
92
+ // dp[(i, j)] = LCS length of ai[0..i) and bi[0..j), row-major stride m+1.
93
+ const stride = m + 1;
94
+ const dp = new Int32Array((n + 1) * stride);
95
+ for (let i = 1; i <= n; i++) {
96
+ for (let j = 1; j <= m; j++) {
97
+ dp[i * stride + j] =
98
+ ai[i - 1] === bi[j - 1]
99
+ ? dp[(i - 1) * stride + (j - 1)] + 1
100
+ : Math.max(dp[(i - 1) * stride + j], dp[i * stride + (j - 1)]);
101
+ }
102
+ }
103
+ const middle = [];
104
+ let i = n;
105
+ let j = m;
106
+ while (i > 0 && j > 0) {
107
+ if (ai[i - 1] === bi[j - 1] &&
108
+ dp[i * stride + j] === dp[(i - 1) * stride + (j - 1)] + 1) {
109
+ middle.push([start + i - 1, start + j - 1]);
110
+ i--;
111
+ j--;
112
+ }
113
+ else if (dp[(i - 1) * stride + j] >= dp[i * stride + (j - 1)]) {
114
+ i--;
115
+ }
116
+ else {
117
+ j--;
118
+ }
119
+ }
120
+ pairs.push(...middle.reverse());
121
+ }
122
+ for (let k = 0; endA + k < a.length; k++)
123
+ pairs.push([endA + k, endB + k]);
124
+ return pairs;
125
+ }
126
+ const serializer = new XMLSerializer();
127
+ function sameQualifiedName(a, b) {
128
+ return a.namespaceURI === b.namespaceURI && a.localName === b.localName;
129
+ }
130
+ function isWElement(node, localName) {
131
+ return (node.nodeType === 1 &&
132
+ node.namespaceURI === OOXML.W_NS &&
133
+ node.localName === localName);
134
+ }
135
+ function directChildElement(el, localName) {
136
+ let child = el.firstChild;
137
+ while (child) {
138
+ if (isWElement(child, localName))
139
+ return child;
140
+ child = child.nextSibling;
141
+ }
142
+ return null;
143
+ }
144
+ function clonedRunFormattingKey(run) {
145
+ const rPr = directChildElement(run, W.rPr);
146
+ return rPr ? serializer.serializeToString(rPr) : '';
147
+ }
148
+ function clonedRunContentChildren(run) {
149
+ const out = [];
150
+ let child = run.firstChild;
151
+ while (child) {
152
+ const next = child.nextSibling;
153
+ if (!isWElement(child, W.rPr))
154
+ out.push(child);
155
+ child = next;
156
+ }
157
+ return out;
158
+ }
159
+ function runHasOnlyTextContent(run) {
160
+ return clonedRunContentChildren(run).every((child) => {
161
+ if (child.nodeType === 3)
162
+ return !(child.textContent ?? '').trim();
163
+ return isWElement(child, W.t);
164
+ });
165
+ }
166
+ function consolidateAdjacentTextChildren(run) {
167
+ let child = run.firstChild;
168
+ while (child) {
169
+ if (!isWElement(child, W.t)) {
170
+ child = child.nextSibling;
171
+ continue;
172
+ }
173
+ const first = child;
174
+ let next = first.nextSibling;
175
+ while (next) {
176
+ if (next.nodeType === 3 && !(next.textContent ?? '').trim()) {
177
+ const whitespace = next;
178
+ next = whitespace.nextSibling;
179
+ whitespace.parentNode?.removeChild(whitespace);
180
+ continue;
181
+ }
182
+ if (!isWElement(next, W.t))
183
+ break;
184
+ const following = next.nextSibling;
185
+ first.textContent = (first.textContent ?? '') + (next.textContent ?? '');
186
+ next.parentNode?.removeChild(next);
187
+ next = following;
188
+ }
189
+ const text = first.textContent ?? '';
190
+ if (text.startsWith(' ') || text.endsWith(' ')) {
191
+ first.setAttributeNS('http://www.w3.org/XML/1998/namespace', 'xml:space', 'preserve');
192
+ }
193
+ else {
194
+ first.removeAttributeNS('http://www.w3.org/XML/1998/namespace', 'space');
195
+ }
196
+ child = first.nextSibling;
197
+ }
198
+ }
199
+ function mergeAdjacentRunsForKey(container) {
200
+ let child = container.firstChild;
201
+ let currentRun = null;
202
+ while (child) {
203
+ const next = child.nextSibling;
204
+ if (!isWElement(child, W.r)) {
205
+ currentRun = null;
206
+ child = next;
207
+ continue;
208
+ }
209
+ if (currentRun &&
210
+ runHasOnlyTextContent(currentRun) &&
211
+ runHasOnlyTextContent(child) &&
212
+ clonedRunFormattingKey(currentRun) === clonedRunFormattingKey(child)) {
213
+ for (const node of clonedRunContentChildren(child)) {
214
+ currentRun.appendChild(node);
215
+ }
216
+ consolidateAdjacentTextChildren(currentRun);
217
+ child.parentNode?.removeChild(child);
218
+ }
219
+ else {
220
+ currentRun = child;
221
+ consolidateAdjacentTextChildren(currentRun);
222
+ }
223
+ child = next;
224
+ }
225
+ }
226
+ function canonicalizeHyperlinkRunsForKey(root) {
227
+ const hyperlinks = Array.from(root.getElementsByTagNameNS(OOXML.W_NS, W.hyperlink));
228
+ if (root.namespaceURI === OOXML.W_NS && root.localName === W.hyperlink) {
229
+ hyperlinks.unshift(root);
230
+ }
231
+ for (const hyperlink of hyperlinks) {
232
+ mergeAdjacentRunsForKey(hyperlink);
233
+ }
234
+ }
235
+ /**
236
+ * The atomizer can reconstruct untouched hyperlink text as one run with
237
+ * multiple `w:t` children, while open-time `mergeRuns` leaves the original
238
+ * as adjacent runs inside `w:hyperlink`. Canonicalize that comparison-only
239
+ * shape so restore can still import the pristine original block.
240
+ */
241
+ function restoreKey(el) {
242
+ const clone = el.cloneNode(true);
243
+ canonicalizeHyperlinkRunsForKey(clone);
244
+ return serializer.serializeToString(clone);
245
+ }
246
+ /**
247
+ * Reconcile the element children of one container: LCS-matched (untouched)
248
+ * children of `cur` are replaced with the corresponding pristine `orig`
249
+ * child; unmatched (edited) children that pair 1:1 with a same-named
250
+ * recursable container across an LCS gap are descended into, so e.g. the
251
+ * untouched cells and paragraphs of an edited table still restore.
252
+ *
253
+ * `orig` and `norm` children are index-lockstep (norm is orig with
254
+ * normalization applied, which never adds/removes container children);
255
+ * a count mismatch abandons this subtree.
256
+ */
257
+ function reconcileChildren(orig, norm, cur, ownerDoc) {
258
+ const origChildren = childElements(orig);
259
+ const normChildren = childElements(norm);
260
+ const curChildren = childElements(cur);
261
+ if (origChildren.length !== normChildren.length)
262
+ return 0;
263
+ if (origChildren.length === 0 || curChildren.length === 0)
264
+ return 0;
265
+ const normKeys = normChildren.map(restoreKey);
266
+ const curKeys = curChildren.map(restoreKey);
267
+ const pairs = lcsPairs(normKeys, curKeys);
268
+ let restored = 0;
269
+ for (const [i, j] of pairs) {
270
+ const pristine = ownerDoc.importNode(origChildren[i], true);
271
+ cur.replaceChild(pristine, curChildren[j]);
272
+ restored++;
273
+ }
274
+ // Between consecutive LCS anchors, the leftovers on each side are the
275
+ // edited children. When they pair 1:1 in order and both sides are the
276
+ // same recursable container, descend — only serialization-equal
277
+ // descendants will restore, so a mispairing cannot corrupt content.
278
+ let prevI = -1;
279
+ let prevJ = -1;
280
+ for (const [ai, aj] of [...pairs, [normChildren.length, curChildren.length]]) {
281
+ const gapLen = ai - prevI - 1;
282
+ if (gapLen > 0 && gapLen === aj - prevJ - 1) {
283
+ for (let k = 1; k <= gapLen; k++) {
284
+ const normEl = normChildren[prevI + k];
285
+ const curEl = curChildren[prevJ + k];
286
+ if (sameQualifiedName(normEl, curEl) &&
287
+ normEl.namespaceURI === OOXML.W_NS &&
288
+ RECURSABLE_CONTAINER_LOCALS.has(normEl.localName)) {
289
+ restored += reconcileChildren(origChildren[prevI + k], normEl, curEl, ownerDoc);
290
+ }
291
+ }
292
+ }
293
+ prevI = ai;
294
+ prevJ = aj;
295
+ }
296
+ return restored;
297
+ }
298
+ /**
299
+ * Replace every block of `currentDoc` that is untouched — i.e.
300
+ * serialization-equal to the same block of the original document.xml after
301
+ * open-time normalization — with the pristine original block, descending
302
+ * into edited tables so their untouched rows/cells/paragraphs restore too.
303
+ *
304
+ * `currentDoc` must already have internal bookmarks removed (untouched
305
+ * blocks otherwise never match the bookmark-free reference). Returns the
306
+ * number of elements restored; 0 means the document is fully edited or the
307
+ * reference could not be aligned (output then matches today's full
308
+ * re-serialization, never anything worse).
309
+ */
310
+ export function restoreUntouchedBlocks(currentDoc, originalXmlText) {
311
+ const original = parseXml(originalXmlText);
312
+ const normRef = parseXml(originalXmlText);
313
+ // Mirror DocxDocument.normalize()'s document.xml steps, in order.
314
+ mergeRuns(normRef);
315
+ simplifyRedlines(normRef);
316
+ const originalBody = bodyElement(original);
317
+ const normRefBody = bodyElement(normRef);
318
+ const currentBody = bodyElement(currentDoc);
319
+ if (!originalBody || !normRefBody || !currentBody)
320
+ return 0;
321
+ return reconcileChildren(originalBody, normRefBody, currentBody, currentDoc);
322
+ }
323
+ //# sourceMappingURL=minimal_save.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"minimal_save.js","sourceRoot":"","sources":["../../src/primitives/minimal_save.ts"],"names":[],"mappings":"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"}
@@ -53,6 +53,8 @@ export declare const W: {
53
53
  readonly abstractNumId: "abstractNumId";
54
54
  readonly lvlOverride: "lvlOverride";
55
55
  readonly startOverride: "startOverride";
56
+ readonly lvlJc: "lvlJc";
57
+ readonly multiLevelType: "multiLevelType";
56
58
  readonly tbl: "tbl";
57
59
  readonly tr: "tr";
58
60
  readonly tc: "tc";
@@ -60,14 +62,53 @@ export declare const W: {
60
62
  readonly tcPr: "tcPr";
61
63
  readonly trHeight: "trHeight";
62
64
  readonly tcMar: "tcMar";
65
+ readonly tblPr: "tblPr";
66
+ readonly tblGrid: "tblGrid";
67
+ readonly gridCol: "gridCol";
68
+ readonly tblW: "tblW";
69
+ readonly tblLayout: "tblLayout";
70
+ readonly tblBorders: "tblBorders";
71
+ readonly tcBorders: "tcBorders";
72
+ readonly tcW: "tcW";
73
+ readonly gridSpan: "gridSpan";
74
+ readonly vMerge: "vMerge";
75
+ readonly vAlign: "vAlign";
76
+ readonly shd: "shd";
77
+ readonly tblHeader: "tblHeader";
78
+ readonly insideH: "insideH";
79
+ readonly insideV: "insideV";
63
80
  readonly top: "top";
64
81
  readonly bottom: "bottom";
65
82
  readonly left: "left";
66
83
  readonly right: "right";
84
+ readonly end: "end";
67
85
  readonly val: "val";
68
86
  readonly hRule: "hRule";
69
87
  readonly w: "w";
70
88
  readonly type: "type";
89
+ readonly sectPr: "sectPr";
90
+ readonly pgSz: "pgSz";
91
+ readonly pgMar: "pgMar";
92
+ readonly pgNumType: "pgNumType";
93
+ readonly headerReference: "headerReference";
94
+ readonly footerReference: "footerReference";
95
+ readonly titlePg: "titlePg";
96
+ readonly hdr: "hdr";
97
+ readonly ftr: "ftr";
98
+ readonly settings: "settings";
99
+ readonly evenAndOddHeaders: "evenAndOddHeaders";
100
+ readonly docDefaults: "docDefaults";
101
+ readonly pPrDefault: "pPrDefault";
102
+ readonly rPrDefault: "rPrDefault";
103
+ readonly next: "next";
104
+ readonly qFormat: "qFormat";
105
+ readonly bCs: "bCs";
106
+ readonly iCs: "iCs";
107
+ readonly caps: "caps";
108
+ readonly smallCaps: "smallCaps";
109
+ readonly keepNext: "keepNext";
110
+ readonly pageBreakBefore: "pageBreakBefore";
111
+ readonly tabs: "tabs";
71
112
  readonly fldChar: "fldChar";
72
113
  readonly instrText: "instrText";
73
114
  readonly fldSimple: "fldSimple";
@@ -87,5 +128,11 @@ export declare const W: {
87
128
  readonly footnoteRef: "footnoteRef";
88
129
  readonly separator: "separator";
89
130
  readonly continuationSeparator: "continuationSeparator";
131
+ readonly endnoteReference: "endnoteReference";
132
+ readonly drawing: "drawing";
133
+ readonly pict: "pict";
134
+ readonly object: "object";
135
+ readonly del: "del";
136
+ readonly moveFrom: "moveFrom";
90
137
  };
91
138
  //# sourceMappingURL=namespaces.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"namespaces.d.ts","sourceRoot":"","sources":["../../src/primitives/namespaces.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,KAAK;;;;;;;;;CAiBR,CAAC;AAEX,eAAO,MAAM,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiGJ,CAAC"}
1
+ {"version":3,"file":"namespaces.d.ts","sourceRoot":"","sources":["../../src/primitives/namespaces.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,KAAK;;;;;;;;;CAiBR,CAAC;AAEX,eAAO,MAAM,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA0JJ,CAAC"}
@@ -65,6 +65,8 @@ export const W = {
65
65
  abstractNumId: 'abstractNumId',
66
66
  lvlOverride: 'lvlOverride',
67
67
  startOverride: 'startOverride',
68
+ lvlJc: 'lvlJc',
69
+ multiLevelType: 'multiLevelType',
68
70
  // Tables + layout
69
71
  tbl: 'tbl',
70
72
  tr: 'tr',
@@ -73,14 +75,55 @@ export const W = {
73
75
  tcPr: 'tcPr',
74
76
  trHeight: 'trHeight',
75
77
  tcMar: 'tcMar',
78
+ tblPr: 'tblPr',
79
+ tblGrid: 'tblGrid',
80
+ gridCol: 'gridCol',
81
+ tblW: 'tblW',
82
+ tblLayout: 'tblLayout',
83
+ tblBorders: 'tblBorders',
84
+ tcBorders: 'tcBorders',
85
+ tcW: 'tcW',
86
+ gridSpan: 'gridSpan',
87
+ vMerge: 'vMerge',
88
+ vAlign: 'vAlign',
89
+ shd: 'shd',
90
+ tblHeader: 'tblHeader',
91
+ insideH: 'insideH',
92
+ insideV: 'insideV',
76
93
  top: 'top',
77
94
  bottom: 'bottom',
78
95
  left: 'left',
79
96
  right: 'right',
97
+ end: 'end',
80
98
  val: 'val',
81
99
  hRule: 'hRule',
82
100
  w: 'w',
83
101
  type: 'type',
102
+ // Sections + page setup (generation emitters)
103
+ sectPr: 'sectPr',
104
+ pgSz: 'pgSz',
105
+ pgMar: 'pgMar',
106
+ pgNumType: 'pgNumType',
107
+ headerReference: 'headerReference',
108
+ footerReference: 'footerReference',
109
+ titlePg: 'titlePg',
110
+ hdr: 'hdr',
111
+ ftr: 'ftr',
112
+ settings: 'settings',
113
+ evenAndOddHeaders: 'evenAndOddHeaders',
114
+ // Styles part + paragraph/run formatting (generation emitters)
115
+ docDefaults: 'docDefaults',
116
+ pPrDefault: 'pPrDefault',
117
+ rPrDefault: 'rPrDefault',
118
+ next: 'next',
119
+ qFormat: 'qFormat',
120
+ bCs: 'bCs',
121
+ iCs: 'iCs',
122
+ caps: 'caps',
123
+ smallCaps: 'smallCaps',
124
+ keepNext: 'keepNext',
125
+ pageBreakBefore: 'pageBreakBefore',
126
+ tabs: 'tabs',
84
127
  // Fields + special runs
85
128
  fldChar: 'fldChar',
86
129
  instrText: 'instrText',
@@ -104,5 +147,14 @@ export const W = {
104
147
  footnoteRef: 'footnoteRef',
105
148
  separator: 'separator',
106
149
  continuationSeparator: 'continuationSeparator',
150
+ // Endnotes
151
+ endnoteReference: 'endnoteReference',
152
+ // Embedded visual content (run-level children)
153
+ drawing: 'drawing',
154
+ pict: 'pict',
155
+ object: 'object',
156
+ // Revision wrappers
157
+ del: 'del',
158
+ moveFrom: 'moveFrom',
107
159
  };
108
160
  //# sourceMappingURL=namespaces.js.map