docxmlater 11.0.10 → 12.1.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 (361) hide show
  1. package/README.md +53 -13
  2. package/dist/core/Document.d.ts +29 -3
  3. package/dist/core/Document.d.ts.map +1 -1
  4. package/dist/core/Document.js +733 -170
  5. package/dist/core/Document.js.map +1 -1
  6. package/dist/core/DocumentGenerator.d.ts +1 -0
  7. package/dist/core/DocumentGenerator.d.ts.map +1 -1
  8. package/dist/core/DocumentGenerator.js +77 -25
  9. package/dist/core/DocumentGenerator.js.map +1 -1
  10. package/dist/core/DocumentParser.d.ts +7 -3
  11. package/dist/core/DocumentParser.d.ts.map +1 -1
  12. package/dist/core/DocumentParser.js +427 -81
  13. package/dist/core/DocumentParser.js.map +1 -1
  14. package/dist/core/RelationshipManager.d.ts.map +1 -1
  15. package/dist/core/RelationshipManager.js +2 -2
  16. package/dist/core/RelationshipManager.js.map +1 -1
  17. package/dist/elements/Comment.d.ts +15 -1
  18. package/dist/elements/Comment.d.ts.map +1 -1
  19. package/dist/elements/Comment.js +67 -12
  20. package/dist/elements/Comment.js.map +1 -1
  21. package/dist/elements/CommentManager.d.ts +4 -0
  22. package/dist/elements/CommentManager.d.ts.map +1 -1
  23. package/dist/elements/CommentManager.js +74 -16
  24. package/dist/elements/CommentManager.js.map +1 -1
  25. package/dist/elements/EndnoteManager.d.ts.map +1 -1
  26. package/dist/elements/EndnoteManager.js.map +1 -1
  27. package/dist/elements/Field.d.ts +10 -1
  28. package/dist/elements/Field.d.ts.map +1 -1
  29. package/dist/elements/Field.js +76 -34
  30. package/dist/elements/Field.js.map +1 -1
  31. package/dist/elements/FieldHelpers.d.ts +1 -0
  32. package/dist/elements/FieldHelpers.d.ts.map +1 -1
  33. package/dist/elements/FieldHelpers.js +8 -4
  34. package/dist/elements/FieldHelpers.js.map +1 -1
  35. package/dist/elements/Footer.d.ts +3 -1
  36. package/dist/elements/Footer.d.ts.map +1 -1
  37. package/dist/elements/Footer.js +39 -53
  38. package/dist/elements/Footer.js.map +1 -1
  39. package/dist/elements/FootnoteManager.d.ts.map +1 -1
  40. package/dist/elements/FootnoteManager.js.map +1 -1
  41. package/dist/elements/Header.d.ts +3 -1
  42. package/dist/elements/Header.d.ts.map +1 -1
  43. package/dist/elements/Header.js +39 -53
  44. package/dist/elements/Header.js.map +1 -1
  45. package/dist/elements/HeaderFooterManager.d.ts +4 -2
  46. package/dist/elements/HeaderFooterManager.d.ts.map +1 -1
  47. package/dist/elements/HeaderFooterManager.js +36 -6
  48. package/dist/elements/HeaderFooterManager.js.map +1 -1
  49. package/dist/elements/Hyperlink.d.ts +6 -1
  50. package/dist/elements/Hyperlink.d.ts.map +1 -1
  51. package/dist/elements/Hyperlink.js +69 -44
  52. package/dist/elements/Hyperlink.js.map +1 -1
  53. package/dist/elements/Image.d.ts.map +1 -1
  54. package/dist/elements/Image.js +33 -6
  55. package/dist/elements/Image.js.map +1 -1
  56. package/dist/elements/ImageManager.d.ts +1 -0
  57. package/dist/elements/ImageManager.d.ts.map +1 -1
  58. package/dist/elements/ImageManager.js +11 -0
  59. package/dist/elements/ImageManager.js.map +1 -1
  60. package/dist/elements/Paragraph.d.ts +3 -0
  61. package/dist/elements/Paragraph.d.ts.map +1 -1
  62. package/dist/elements/Paragraph.js +91 -26
  63. package/dist/elements/Paragraph.js.map +1 -1
  64. package/dist/elements/Revision.d.ts +4 -0
  65. package/dist/elements/Revision.d.ts.map +1 -1
  66. package/dist/elements/Revision.js +369 -29
  67. package/dist/elements/Revision.js.map +1 -1
  68. package/dist/elements/Run.d.ts +1 -0
  69. package/dist/elements/Run.d.ts.map +1 -1
  70. package/dist/elements/Run.js +24 -4
  71. package/dist/elements/Run.js.map +1 -1
  72. package/dist/elements/Section.d.ts.map +1 -1
  73. package/dist/elements/Section.js +17 -7
  74. package/dist/elements/Section.js.map +1 -1
  75. package/dist/elements/Shape.d.ts.map +1 -1
  76. package/dist/elements/Shape.js +50 -42
  77. package/dist/elements/Shape.js.map +1 -1
  78. package/dist/elements/StructuredDocumentTag.d.ts +9 -1
  79. package/dist/elements/StructuredDocumentTag.d.ts.map +1 -1
  80. package/dist/elements/StructuredDocumentTag.js +46 -6
  81. package/dist/elements/StructuredDocumentTag.js.map +1 -1
  82. package/dist/elements/Table.d.ts +2 -0
  83. package/dist/elements/Table.d.ts.map +1 -1
  84. package/dist/elements/Table.js +90 -42
  85. package/dist/elements/Table.js.map +1 -1
  86. package/dist/elements/TableCell.d.ts +1 -0
  87. package/dist/elements/TableCell.d.ts.map +1 -1
  88. package/dist/elements/TableCell.js +32 -13
  89. package/dist/elements/TableCell.js.map +1 -1
  90. package/dist/elements/TableOfContents.d.ts.map +1 -1
  91. package/dist/elements/TableOfContents.js +5 -7
  92. package/dist/elements/TableOfContents.js.map +1 -1
  93. package/dist/elements/TableRow.d.ts +1 -0
  94. package/dist/elements/TableRow.d.ts.map +1 -1
  95. package/dist/elements/TableRow.js +16 -1
  96. package/dist/elements/TableRow.js.map +1 -1
  97. package/dist/elements/TextBox.d.ts.map +1 -1
  98. package/dist/elements/TextBox.js +55 -42
  99. package/dist/elements/TextBox.js.map +1 -1
  100. package/dist/esm/core/Document.js +735 -172
  101. package/dist/esm/core/Document.js.map +1 -1
  102. package/dist/esm/core/DocumentGenerator.js +77 -25
  103. package/dist/esm/core/DocumentGenerator.js.map +1 -1
  104. package/dist/esm/core/DocumentParser.js +427 -81
  105. package/dist/esm/core/DocumentParser.js.map +1 -1
  106. package/dist/esm/core/RelationshipManager.js +2 -2
  107. package/dist/esm/core/RelationshipManager.js.map +1 -1
  108. package/dist/esm/elements/Comment.js +67 -12
  109. package/dist/esm/elements/Comment.js.map +1 -1
  110. package/dist/esm/elements/CommentManager.js +74 -16
  111. package/dist/esm/elements/CommentManager.js.map +1 -1
  112. package/dist/esm/elements/EndnoteManager.js.map +1 -1
  113. package/dist/esm/elements/Field.js +77 -35
  114. package/dist/esm/elements/Field.js.map +1 -1
  115. package/dist/esm/elements/FieldHelpers.js +7 -4
  116. package/dist/esm/elements/FieldHelpers.js.map +1 -1
  117. package/dist/esm/elements/Footer.js +39 -53
  118. package/dist/esm/elements/Footer.js.map +1 -1
  119. package/dist/esm/elements/FootnoteManager.js.map +1 -1
  120. package/dist/esm/elements/Header.js +39 -53
  121. package/dist/esm/elements/Header.js.map +1 -1
  122. package/dist/esm/elements/HeaderFooterManager.js +36 -6
  123. package/dist/esm/elements/HeaderFooterManager.js.map +1 -1
  124. package/dist/esm/elements/Hyperlink.js +69 -44
  125. package/dist/esm/elements/Hyperlink.js.map +1 -1
  126. package/dist/esm/elements/Image.js +33 -6
  127. package/dist/esm/elements/Image.js.map +1 -1
  128. package/dist/esm/elements/ImageManager.js +11 -0
  129. package/dist/esm/elements/ImageManager.js.map +1 -1
  130. package/dist/esm/elements/Paragraph.js +91 -26
  131. package/dist/esm/elements/Paragraph.js.map +1 -1
  132. package/dist/esm/elements/Revision.js +369 -29
  133. package/dist/esm/elements/Revision.js.map +1 -1
  134. package/dist/esm/elements/Run.js +24 -4
  135. package/dist/esm/elements/Run.js.map +1 -1
  136. package/dist/esm/elements/Section.js +17 -7
  137. package/dist/esm/elements/Section.js.map +1 -1
  138. package/dist/esm/elements/Shape.js +50 -42
  139. package/dist/esm/elements/Shape.js.map +1 -1
  140. package/dist/esm/elements/StructuredDocumentTag.js +46 -6
  141. package/dist/esm/elements/StructuredDocumentTag.js.map +1 -1
  142. package/dist/esm/elements/Table.js +90 -42
  143. package/dist/esm/elements/Table.js.map +1 -1
  144. package/dist/esm/elements/TableCell.js +32 -13
  145. package/dist/esm/elements/TableCell.js.map +1 -1
  146. package/dist/esm/elements/TableOfContents.js +5 -7
  147. package/dist/esm/elements/TableOfContents.js.map +1 -1
  148. package/dist/esm/elements/TableRow.js +16 -1
  149. package/dist/esm/elements/TableRow.js.map +1 -1
  150. package/dist/esm/elements/TextBox.js +55 -42
  151. package/dist/esm/elements/TextBox.js.map +1 -1
  152. package/dist/esm/formatting/AbstractNumbering.js +1 -1
  153. package/dist/esm/formatting/AbstractNumbering.js.map +1 -1
  154. package/dist/esm/formatting/NumberingLevel.js +8 -6
  155. package/dist/esm/formatting/NumberingLevel.js.map +1 -1
  156. package/dist/esm/formatting/NumberingManager.js +16 -1
  157. package/dist/esm/formatting/NumberingManager.js.map +1 -1
  158. package/dist/esm/formatting/Style.js +14 -0
  159. package/dist/esm/formatting/Style.js.map +1 -1
  160. package/dist/esm/formatting/StylesManager.js +14 -2
  161. package/dist/esm/formatting/StylesManager.js.map +1 -1
  162. package/dist/esm/helpers/CleanupHelper.js +103 -26
  163. package/dist/esm/helpers/CleanupHelper.js.map +1 -1
  164. package/dist/esm/images/ImageOptimizer.js +52 -4
  165. package/dist/esm/images/ImageOptimizer.js.map +1 -1
  166. package/dist/esm/index.js +1 -0
  167. package/dist/esm/index.js.map +1 -1
  168. package/dist/esm/internal.js +1 -1
  169. package/dist/esm/internal.js.map +1 -1
  170. package/dist/esm/processors/CompatibilityUpgrader.js +7 -1
  171. package/dist/esm/processors/CompatibilityUpgrader.js.map +1 -1
  172. package/dist/esm/processors/InMemoryRevisionAcceptor.js +134 -13
  173. package/dist/esm/processors/InMemoryRevisionAcceptor.js.map +1 -1
  174. package/dist/esm/processors/RevisionWalker.js +223 -39
  175. package/dist/esm/processors/RevisionWalker.js.map +1 -1
  176. package/dist/esm/processors/SelectiveRevisionAcceptor.js +116 -17
  177. package/dist/esm/processors/SelectiveRevisionAcceptor.js.map +1 -1
  178. package/dist/esm/processors/acceptRevisions.js +20 -11
  179. package/dist/esm/processors/acceptRevisions.js.map +1 -1
  180. package/dist/esm/processors/cnfStyleDecoder.js +7 -7
  181. package/dist/esm/processors/cnfStyleDecoder.js.map +1 -1
  182. package/dist/esm/processors/stripTrackedChanges.js +16 -5
  183. package/dist/esm/processors/stripTrackedChanges.js.map +1 -1
  184. package/dist/esm/utils/deepClone.js +24 -11
  185. package/dist/esm/utils/deepClone.js.map +1 -1
  186. package/dist/esm/utils/units.js +1 -1
  187. package/dist/esm/utils/units.js.map +1 -1
  188. package/dist/esm/utils/validation.js +11 -23
  189. package/dist/esm/utils/validation.js.map +1 -1
  190. package/dist/esm/utils/xmlSanitization.js +131 -7
  191. package/dist/esm/utils/xmlSanitization.js.map +1 -1
  192. package/dist/esm/validation/RevisionAutoFixer.js +69 -55
  193. package/dist/esm/validation/RevisionAutoFixer.js.map +1 -1
  194. package/dist/esm/validation/RevisionValidator.js +24 -20
  195. package/dist/esm/validation/RevisionValidator.js.map +1 -1
  196. package/dist/esm/xml/XMLBuilder.js +52 -20
  197. package/dist/esm/xml/XMLBuilder.js.map +1 -1
  198. package/dist/esm/xml/XMLParser.js +55 -13
  199. package/dist/esm/xml/XMLParser.js.map +1 -1
  200. package/dist/esm/zip/ZipHandler.js +37 -13
  201. package/dist/esm/zip/ZipHandler.js.map +1 -1
  202. package/dist/esm/zip/ZipReader.js +53 -6
  203. package/dist/esm/zip/ZipReader.js.map +1 -1
  204. package/dist/esm/zip/errors.js +7 -0
  205. package/dist/esm/zip/errors.js.map +1 -1
  206. package/dist/esm/zip/types.js +4 -0
  207. package/dist/esm/zip/types.js.map +1 -1
  208. package/dist/formatting/AbstractNumbering.d.ts.map +1 -1
  209. package/dist/formatting/AbstractNumbering.js +1 -1
  210. package/dist/formatting/AbstractNumbering.js.map +1 -1
  211. package/dist/formatting/NumberingLevel.d.ts +1 -1
  212. package/dist/formatting/NumberingLevel.d.ts.map +1 -1
  213. package/dist/formatting/NumberingLevel.js +8 -6
  214. package/dist/formatting/NumberingLevel.js.map +1 -1
  215. package/dist/formatting/NumberingManager.d.ts.map +1 -1
  216. package/dist/formatting/NumberingManager.js +16 -1
  217. package/dist/formatting/NumberingManager.js.map +1 -1
  218. package/dist/formatting/Style.d.ts.map +1 -1
  219. package/dist/formatting/Style.js +14 -0
  220. package/dist/formatting/Style.js.map +1 -1
  221. package/dist/formatting/StylesManager.d.ts +2 -0
  222. package/dist/formatting/StylesManager.d.ts.map +1 -1
  223. package/dist/formatting/StylesManager.js +14 -2
  224. package/dist/formatting/StylesManager.js.map +1 -1
  225. package/dist/helpers/CleanupHelper.d.ts.map +1 -1
  226. package/dist/helpers/CleanupHelper.js +103 -26
  227. package/dist/helpers/CleanupHelper.js.map +1 -1
  228. package/dist/images/ImageOptimizer.d.ts.map +1 -1
  229. package/dist/images/ImageOptimizer.js +52 -4
  230. package/dist/images/ImageOptimizer.js.map +1 -1
  231. package/dist/index.d.ts +3 -1
  232. package/dist/index.d.ts.map +1 -1
  233. package/dist/index.js +4 -2
  234. package/dist/index.js.map +1 -1
  235. package/dist/internal.d.ts +1 -1
  236. package/dist/internal.d.ts.map +1 -1
  237. package/dist/internal.js +2 -1
  238. package/dist/internal.js.map +1 -1
  239. package/dist/processors/CompatibilityUpgrader.d.ts.map +1 -1
  240. package/dist/processors/CompatibilityUpgrader.js +7 -1
  241. package/dist/processors/CompatibilityUpgrader.js.map +1 -1
  242. package/dist/processors/InMemoryRevisionAcceptor.d.ts +1 -0
  243. package/dist/processors/InMemoryRevisionAcceptor.d.ts.map +1 -1
  244. package/dist/processors/InMemoryRevisionAcceptor.js +135 -13
  245. package/dist/processors/InMemoryRevisionAcceptor.js.map +1 -1
  246. package/dist/processors/RevisionWalker.d.ts +9 -3
  247. package/dist/processors/RevisionWalker.d.ts.map +1 -1
  248. package/dist/processors/RevisionWalker.js +223 -39
  249. package/dist/processors/RevisionWalker.js.map +1 -1
  250. package/dist/processors/SelectiveRevisionAcceptor.d.ts.map +1 -1
  251. package/dist/processors/SelectiveRevisionAcceptor.js +116 -17
  252. package/dist/processors/SelectiveRevisionAcceptor.js.map +1 -1
  253. package/dist/processors/acceptRevisions.d.ts +1 -0
  254. package/dist/processors/acceptRevisions.d.ts.map +1 -1
  255. package/dist/processors/acceptRevisions.js +21 -11
  256. package/dist/processors/acceptRevisions.js.map +1 -1
  257. package/dist/processors/cnfStyleDecoder.d.ts.map +1 -1
  258. package/dist/processors/cnfStyleDecoder.js +7 -7
  259. package/dist/processors/cnfStyleDecoder.js.map +1 -1
  260. package/dist/processors/stripTrackedChanges.d.ts.map +1 -1
  261. package/dist/processors/stripTrackedChanges.js +16 -5
  262. package/dist/processors/stripTrackedChanges.js.map +1 -1
  263. package/dist/utils/deepClone.d.ts.map +1 -1
  264. package/dist/utils/deepClone.js +24 -11
  265. package/dist/utils/deepClone.js.map +1 -1
  266. package/dist/utils/units.d.ts.map +1 -1
  267. package/dist/utils/units.js +1 -1
  268. package/dist/utils/units.js.map +1 -1
  269. package/dist/utils/validation.d.ts.map +1 -1
  270. package/dist/utils/validation.js +11 -23
  271. package/dist/utils/validation.js.map +1 -1
  272. package/dist/utils/xmlSanitization.d.ts +2 -0
  273. package/dist/utils/xmlSanitization.d.ts.map +1 -1
  274. package/dist/utils/xmlSanitization.js +133 -7
  275. package/dist/utils/xmlSanitization.js.map +1 -1
  276. package/dist/validation/RevisionAutoFixer.d.ts +6 -2
  277. package/dist/validation/RevisionAutoFixer.d.ts.map +1 -1
  278. package/dist/validation/RevisionAutoFixer.js +68 -54
  279. package/dist/validation/RevisionAutoFixer.js.map +1 -1
  280. package/dist/validation/RevisionValidator.d.ts +2 -0
  281. package/dist/validation/RevisionValidator.d.ts.map +1 -1
  282. package/dist/validation/RevisionValidator.js +26 -21
  283. package/dist/validation/RevisionValidator.js.map +1 -1
  284. package/dist/xml/XMLBuilder.d.ts +1 -0
  285. package/dist/xml/XMLBuilder.d.ts.map +1 -1
  286. package/dist/xml/XMLBuilder.js +52 -20
  287. package/dist/xml/XMLBuilder.js.map +1 -1
  288. package/dist/xml/XMLParser.d.ts +1 -0
  289. package/dist/xml/XMLParser.d.ts.map +1 -1
  290. package/dist/xml/XMLParser.js +55 -13
  291. package/dist/xml/XMLParser.js.map +1 -1
  292. package/dist/zip/ZipHandler.d.ts.map +1 -1
  293. package/dist/zip/ZipHandler.js +37 -13
  294. package/dist/zip/ZipHandler.js.map +1 -1
  295. package/dist/zip/ZipReader.d.ts.map +1 -1
  296. package/dist/zip/ZipReader.js +52 -5
  297. package/dist/zip/ZipReader.js.map +1 -1
  298. package/dist/zip/errors.d.ts +3 -0
  299. package/dist/zip/errors.d.ts.map +1 -1
  300. package/dist/zip/errors.js +9 -1
  301. package/dist/zip/errors.js.map +1 -1
  302. package/dist/zip/types.d.ts +4 -0
  303. package/dist/zip/types.d.ts.map +1 -1
  304. package/dist/zip/types.js +4 -0
  305. package/dist/zip/types.js.map +1 -1
  306. package/package.json +2 -2
  307. package/src/core/Document.ts +1184 -242
  308. package/src/core/DocumentGenerator.ts +106 -26
  309. package/src/core/DocumentParser.ts +681 -114
  310. package/src/core/RelationshipManager.ts +446 -442
  311. package/src/elements/Comment.ts +123 -18
  312. package/src/elements/CommentManager.ts +121 -22
  313. package/src/elements/EndnoteManager.ts +4 -1
  314. package/src/elements/Field.ts +134 -43
  315. package/src/elements/FieldHelpers.ts +20 -4
  316. package/src/elements/Footer.ts +62 -67
  317. package/src/elements/FootnoteManager.ts +4 -1
  318. package/src/elements/Header.ts +62 -67
  319. package/src/elements/HeaderFooterManager.ts +56 -8
  320. package/src/elements/Hyperlink.ts +150 -55
  321. package/src/elements/Image.ts +51 -7
  322. package/src/elements/ImageManager.ts +24 -0
  323. package/src/elements/Paragraph.ts +161 -40
  324. package/src/elements/Revision.ts +446 -47
  325. package/src/elements/Run.ts +44 -6
  326. package/src/elements/Section.ts +25 -9
  327. package/src/elements/Shape.ts +52 -44
  328. package/src/elements/StructuredDocumentTag.ts +83 -8
  329. package/src/elements/Table.ts +151 -50
  330. package/src/elements/TableCell.ts +57 -17
  331. package/src/elements/TableOfContents.ts +10 -9
  332. package/src/elements/TableRow.ts +35 -3
  333. package/src/elements/TextBox.ts +58 -43
  334. package/src/formatting/AbstractNumbering.ts +4 -2
  335. package/src/formatting/NumberingLevel.ts +50 -12
  336. package/src/formatting/NumberingManager.ts +32 -3
  337. package/src/formatting/Style.ts +14 -0
  338. package/src/formatting/StylesManager.ts +29 -2
  339. package/src/helpers/CleanupHelper.ts +122 -30
  340. package/src/images/ImageOptimizer.ts +64 -5
  341. package/src/index.ts +7 -0
  342. package/src/internal.ts +1 -0
  343. package/src/processors/CompatibilityUpgrader.ts +15 -2
  344. package/src/processors/InMemoryRevisionAcceptor.ts +276 -17
  345. package/src/processors/RevisionWalker.ts +390 -46
  346. package/src/processors/SelectiveRevisionAcceptor.ts +164 -28
  347. package/src/processors/acceptRevisions.ts +67 -17
  348. package/src/processors/cnfStyleDecoder.ts +18 -12
  349. package/src/processors/stripTrackedChanges.ts +47 -10
  350. package/src/utils/deepClone.ts +48 -14
  351. package/src/utils/units.ts +3 -1
  352. package/src/utils/validation.ts +30 -32
  353. package/src/utils/xmlSanitization.ts +218 -22
  354. package/src/validation/RevisionAutoFixer.ts +109 -65
  355. package/src/validation/RevisionValidator.ts +48 -23
  356. package/src/xml/XMLBuilder.ts +82 -22
  357. package/src/xml/XMLParser.ts +87 -20
  358. package/src/zip/ZipHandler.ts +61 -21
  359. package/src/zip/ZipReader.ts +135 -13
  360. package/src/zip/errors.ts +15 -0
  361. package/src/zip/types.ts +44 -2
@@ -3,14 +3,19 @@
3
3
  * Converts structured data to OpenXML format
4
4
  */
5
5
 
6
+ import { AlternateContent } from '../elements/AlternateContent.js';
6
7
  import { CommentManager } from '../elements/CommentManager.js';
8
+ import { CustomXmlBlock } from '../elements/CustomXml.js';
7
9
  import { EndnoteManager } from '../elements/EndnoteManager.js';
8
10
  import { FontManager } from '../elements/FontManager.js';
9
11
  import { FootnoteManager } from '../elements/FootnoteManager.js';
10
12
  import { HeaderFooterManager } from '../elements/HeaderFooterManager.js';
11
13
  import { Hyperlink } from '../elements/Hyperlink.js';
12
14
  import { ImageManager } from '../elements/ImageManager.js';
15
+ import { ImageRun } from '../elements/ImageRun.js';
16
+ import { MathParagraph } from '../elements/MathElement.js';
13
17
  import { Paragraph } from '../elements/Paragraph.js';
18
+ import { RegisteredBodyElement } from '../elements/RegisteredBodyElement.js';
14
19
  import { Revision } from '../elements/Revision.js';
15
20
  import { isHyperlinkContent } from '../elements/RevisionContent.js';
16
21
  import { Section } from '../elements/Section.js';
@@ -102,6 +107,7 @@ export class DocumentGenerator {
102
107
  themeColor?: string;
103
108
  themeTint?: string;
104
109
  themeShade?: string;
110
+ rawInnerXml?: string;
105
111
  }
106
112
  ): string {
107
113
  const logger = getLogger();
@@ -127,7 +133,21 @@ export class DocumentGenerator {
127
133
  if (documentBackground.themeColor) bgAttrs['w:themeColor'] = documentBackground.themeColor;
128
134
  if (documentBackground.themeTint) bgAttrs['w:themeTint'] = documentBackground.themeTint;
129
135
  if (documentBackground.themeShade) bgAttrs['w:themeShade'] = documentBackground.themeShade;
130
- preBodyContent = [XMLBuilder.wSelf('background', bgAttrs)];
136
+ // Picture/gradient/texture page backgrounds carry a v:background child
137
+ // (ECMA-376 §17.2.1) preserved verbatim from parse; emit the expanded
138
+ // element form so the fill survives the round-trip. Flat-color
139
+ // backgrounds stay self-closing.
140
+ if (documentBackground.rawInnerXml) {
141
+ preBodyContent = [
142
+ {
143
+ name: 'w:background',
144
+ attributes: bgAttrs,
145
+ rawXml: documentBackground.rawInnerXml,
146
+ },
147
+ ];
148
+ } else {
149
+ preBodyContent = [XMLBuilder.wSelf('background', bgAttrs)];
150
+ }
131
151
  }
132
152
 
133
153
  const result = XMLBuilder.createDocument(bodyXmls, namespaces, preBodyContent);
@@ -468,8 +488,9 @@ ${properties}
468
488
  }
469
489
 
470
490
  // CustomXML entries — enumerate dynamically to handle multiple parts (item1, item2, etc.)
491
+ // Case-insensitive match: Word writes 'customXml/' but other producers vary casing
471
492
  for (const file of zipHandler.getFilePaths?.() || []) {
472
- if (file.startsWith('customXML/item') && file.endsWith('.xml')) {
493
+ if (file.toLowerCase().startsWith('customxml/item') && file.endsWith('.xml')) {
473
494
  if (file.includes('Props')) {
474
495
  generatedOverrides.add(
475
496
  `/${file}|application/vnd.openxmlformats-officedocument.customXmlProperties+xml`
@@ -483,7 +504,19 @@ ${properties}
483
504
  // Merge with original entries, but ONLY keep overrides for files that actually exist
484
505
  // This prevents corruption when headers/footers are removed but their Content_Types entries
485
506
  // from the original document would otherwise be preserved
486
- const allDefaults = new Set([...generatedDefaults, ...(originalContentTypes?.defaults || [])]);
507
+
508
+ // OPC allows at most one Default per extension (compared case-insensitively),
509
+ // so dedupe by extension rather than the full "ext|mimetype" string — a producer
510
+ // that declared a different-but-valid MIME (e.g. image/emf vs image/x-emf) must
511
+ // not yield duplicate <Default> elements. The original document's declared
512
+ // content type wins to preserve round-trip fidelity.
513
+ const allDefaults = new Map<string, string>();
514
+ for (const entry of [...(originalContentTypes?.defaults || []), ...generatedDefaults]) {
515
+ const ext = (entry.split('|')[0] || '').toLowerCase();
516
+ if (!allDefaults.has(ext)) {
517
+ allDefaults.set(ext, entry);
518
+ }
519
+ }
487
520
 
488
521
  // filesInArchive was created earlier (line 318) for header/footer validation
489
522
  // Reuse it here to filter original overrides as well
@@ -500,14 +533,23 @@ ${properties}
500
533
  }
501
534
  }
502
535
 
503
- const allOverrides = new Set([...generatedOverrides, ...filteredOriginalOverrides]);
536
+ // Same OPC constraint for Overrides: at most one per part name. The original
537
+ // document's declared content type wins (e.g. a macro-enabled main part must
538
+ // not be downgraded to the standard wordprocessingml content type).
539
+ const allOverrides = new Map<string, string>();
540
+ for (const entry of [...filteredOriginalOverrides, ...generatedOverrides]) {
541
+ const partName = (entry.split('|')[0] || '').toLowerCase();
542
+ if (!allOverrides.has(partName)) {
543
+ allOverrides.set(partName, entry);
544
+ }
545
+ }
504
546
 
505
547
  // Build XML from merged sets
506
548
  let xml = '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>\n';
507
549
  xml += '<Types xmlns="http://schemas.openxmlformats.org/package/2006/content-types">\n';
508
550
 
509
551
  // Add all default entries (escape attribute values for security)
510
- for (const entry of allDefaults) {
552
+ for (const entry of allDefaults.values()) {
511
553
  const parts = entry.split('|');
512
554
  const ext = parts[0] || '';
513
555
  const contentType = parts[1] || '';
@@ -517,7 +559,7 @@ ${properties}
517
559
  }
518
560
 
519
561
  // Add all override entries (escape attribute values for security)
520
- for (const entry of allOverrides) {
562
+ for (const entry of allOverrides.values()) {
521
563
  const parts = entry.split('|');
522
564
  const partName = parts[0] || '';
523
565
  const contentType = parts[1] || '';
@@ -549,6 +591,33 @@ ${properties}
549
591
  // Step 1: Collect all relationship IDs currently used by hyperlinks
550
592
  const usedRelIds = new Set<string>();
551
593
 
594
+ // Helper to extract r:id references from raw XML passthrough strings
595
+ const collectRelIds = (rawXml: string): void => {
596
+ const rIdPattern = /r:id="(rId\d+)"/g;
597
+ let rIdMatch: RegExpExecArray | null;
598
+ while ((rIdMatch = rIdPattern.exec(rawXml)) !== null) {
599
+ usedRelIds.add(rIdMatch[1]!);
600
+ }
601
+ };
602
+
603
+ // Helper to scan an image run's raw passthrough for r:id references.
604
+ // Clickable images carry <a:hlinkClick r:id=".."/> only in these slots
605
+ // (captured run XML, wp:docPr / pic:cNvPr extras) — never as a Hyperlink
606
+ // instance — so they must be scanned to keep the relationship alive.
607
+ const scanImageRun = (imageRun: ImageRun): void => {
608
+ const rawRunXml = imageRun.getRawRunXml();
609
+ if (rawRunXml) {
610
+ collectRelIds(rawRunXml);
611
+ }
612
+ const image = imageRun.getImageElement();
613
+ for (const slot of ['docPr-extra', 'cNvPr-extra']) {
614
+ const slotXml = image._getRawPassthrough(slot);
615
+ if (slotXml) {
616
+ collectRelIds(slotXml);
617
+ }
618
+ }
619
+ };
620
+
552
621
  // Helper to scan paragraphs for hyperlink relationship IDs
553
622
  const scanParagraph = (para: Paragraph) => {
554
623
  for (const item of para.getContent()) {
@@ -571,16 +640,19 @@ ${properties}
571
640
  }
572
641
  }
573
642
  }
643
+ // Image runs inside tracked insertions can be clickable too
644
+ if (revContent instanceof ImageRun) {
645
+ scanImageRun(revContent);
646
+ }
574
647
  }
575
648
  }
649
+ // Image runs may reference hyperlink relationships via hlinkClick
650
+ if (item instanceof ImageRun) {
651
+ scanImageRun(item);
652
+ }
576
653
  // PreservedElements (raw XML passthrough) may contain r:id references
577
654
  if (item instanceof PreservedElement) {
578
- const rawXml = item.getRawXml();
579
- const rIdPattern = /r:id="(rId\d+)"/g;
580
- let rIdMatch: RegExpExecArray | null;
581
- while ((rIdMatch = rIdPattern.exec(rawXml)) !== null) {
582
- usedRelIds.add(rIdMatch[1]!);
583
- }
655
+ collectRelIds(item.getRawXml());
584
656
  }
585
657
  }
586
658
  };
@@ -606,11 +678,7 @@ ${properties}
606
678
  // Scan raw nested content (nested tables, SDTs stored as raw XML)
607
679
  // Extract any relationship IDs referenced in the raw XML to prevent orphan removal
608
680
  for (const nested of cell.getRawNestedContent()) {
609
- const rIdPattern = /r:id="(rId\d+)"/g;
610
- let rIdMatch: RegExpExecArray | null;
611
- while ((rIdMatch = rIdPattern.exec(nested.xml)) !== null) {
612
- usedRelIds.add(rIdMatch[1]!);
613
- }
681
+ collectRelIds(nested.xml);
614
682
  }
615
683
  }
616
684
  }
@@ -621,6 +689,17 @@ ${properties}
621
689
  for (const item of content) {
622
690
  scanElement(item); // Recursive call handles nested structures
623
691
  }
692
+ } else if (
693
+ element instanceof AlternateContent ||
694
+ element instanceof MathParagraph ||
695
+ element instanceof CustomXmlBlock ||
696
+ element instanceof PreservedElement ||
697
+ element instanceof RegisteredBodyElement
698
+ ) {
699
+ // Raw-XML body blocks (mc:AlternateContent drawings, math, custom XML,
700
+ // altChunk, registry-handled elements) are re-emitted verbatim and may
701
+ // reference hyperlink relationships via r:id — keep those rIds alive.
702
+ collectRelIds(element.getRawXml());
624
703
  }
625
704
  // TableOfContentsElement is for programmatic TOCs - real TOCs come as SDTs
626
705
  };
@@ -1043,9 +1122,17 @@ ${properties}
1043
1122
  xml += `
1044
1123
  <w:defaultTabStop w:val="720"/>
1045
1124
  <w:characterSpacingControl w:val="doNotCompress"/>
1046
- <w:updateFields w:val="true"/>`;
1125
+ <w:updateFields w:val="true"/>
1126
+ <w:compat>
1127
+ <w:compatSetting w:name="compatibilityMode" w:uri="http://schemas.microsoft.com/office/word" w:val="15"/>
1128
+ <w:compatSetting w:name="overrideTableStyleFontSizeAndJustification" w:uri="http://schemas.microsoft.com/office/word" w:val="1"/>
1129
+ <w:compatSetting w:name="enableOpenTypeFeatures" w:uri="http://schemas.microsoft.com/office/word" w:val="1"/>
1130
+ <w:compatSetting w:name="doNotFlipMirrorIndents" w:uri="http://schemas.microsoft.com/office/word" w:val="1"/>
1131
+ <w:compatSetting w:name="differentiateMultirowTableHeaders" w:uri="http://schemas.microsoft.com/office/word" w:val="1"/>
1132
+ </w:compat>`;
1047
1133
 
1048
- // RSIDs (Revision Save IDs)
1134
+ // RSIDs (Revision Save IDs) — CT_Settings sequence places w:rsids (#83)
1135
+ // after w:compat (#81), matching the loaded-document merge path
1049
1136
  if (trackChangesSettings?.rsids && trackChangesSettings.rsids.length > 0) {
1050
1137
  xml += '\n <w:rsids>';
1051
1138
  if (trackChangesSettings.rsidRoot) {
@@ -1058,13 +1145,6 @@ ${properties}
1058
1145
  }
1059
1146
 
1060
1147
  xml += `
1061
- <w:compat>
1062
- <w:compatSetting w:name="compatibilityMode" w:uri="http://schemas.microsoft.com/office/word" w:val="15"/>
1063
- <w:compatSetting w:name="overrideTableStyleFontSizeAndJustification" w:uri="http://schemas.microsoft.com/office/word" w:val="1"/>
1064
- <w:compatSetting w:name="enableOpenTypeFeatures" w:uri="http://schemas.microsoft.com/office/word" w:val="1"/>
1065
- <w:compatSetting w:name="doNotFlipMirrorIndents" w:uri="http://schemas.microsoft.com/office/word" w:val="1"/>
1066
- <w:compatSetting w:name="differentiateMultirowTableHeaders" w:uri="http://schemas.microsoft.com/office/word" w:val="1"/>
1067
- </w:compat>
1068
1148
  <w:themeFontLang w:val="en-US"/>
1069
1149
  <w:clrSchemeMapping w:bg1="light1" w:t1="dark1" w:bg2="light2" w:t2="dark2" w:accent1="accent1" w:accent2="accent2" w:accent3="accent3" w:accent4="accent4" w:accent5="accent5" w:accent6="accent6" w:hyperlink="hyperlink" w:followedHyperlink="followedHyperlink"/>
1070
1150
  </w:settings>`;