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
@@ -1 +1 @@
1
- {"version":3,"file":"HeaderFooterManager.js","sourceRoot":"","sources":["../../../src/elements/HeaderFooterManager.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * HeaderFooterManager - Manages headers and footers in a document\n *\n * Tracks all headers and footers, assigns unique IDs, generates filenames,\n * and manages relationships.\n */\n\nimport { Header } from './Header.js';\nimport { Footer } from './Footer.js';\n\n/**\n * Header entry with metadata\n */\ninterface HeaderEntry {\n header: Header;\n filename: string;\n relationshipId: string;\n number: number;\n}\n\n/**\n * Footer entry with metadata\n */\ninterface FooterEntry {\n footer: Footer;\n filename: string;\n relationshipId: string;\n number: number;\n}\n\n/**\n * Manages all headers and footers in a document\n */\nexport class HeaderFooterManager {\n private headers: Map<Header, HeaderEntry>;\n private footers: Map<Footer, FooterEntry>;\n private nextHeaderNumber: number;\n private nextFooterNumber: number;\n\n /**\n * Creates a new header/footer manager\n */\n constructor() {\n this.headers = new Map();\n this.footers = new Map();\n this.nextHeaderNumber = 1;\n this.nextFooterNumber = 1;\n }\n\n /**\n * Registers a header with the manager\n * @param header The header to register\n * @param relationshipId The relationship ID for this header\n * @returns The filename assigned to this header\n */\n registerHeader(header: Header, relationshipId: string): string {\n // Check if already registered\n const existing = this.headers.get(header);\n if (existing) {\n return existing.filename;\n }\n\n // Generate filename\n const number = this.nextHeaderNumber++;\n const filename = header.getFilename(number);\n\n // Set header ID\n header.setHeaderId(relationshipId);\n\n // Store entry\n const entry: HeaderEntry = {\n header,\n filename,\n relationshipId,\n number,\n };\n\n this.headers.set(header, entry);\n\n return filename;\n }\n\n /**\n * Registers a footer with the manager\n * @param footer The footer to register\n * @param relationshipId The relationship ID for this footer\n * @returns The filename assigned to this footer\n */\n registerFooter(footer: Footer, relationshipId: string): string {\n // Check if already registered\n const existing = this.footers.get(footer);\n if (existing) {\n return existing.filename;\n }\n\n // Generate filename\n const number = this.nextFooterNumber++;\n const filename = footer.getFilename(number);\n\n // Set footer ID\n footer.setFooterId(relationshipId);\n\n // Store entry\n const entry: FooterEntry = {\n footer,\n filename,\n relationshipId,\n number,\n };\n\n this.footers.set(footer, entry);\n\n return filename;\n }\n\n /**\n * Gets the filename for a header\n * @param header The header\n * @returns The filename, or undefined if not registered\n */\n getHeaderFilename(header: Header): string | undefined {\n return this.headers.get(header)?.filename;\n }\n\n /**\n * Gets the filename for a footer\n * @param footer The footer\n * @returns The filename, or undefined if not registered\n */\n getFooterFilename(footer: Footer): string | undefined {\n return this.footers.get(footer)?.filename;\n }\n\n /**\n * Gets the relationship ID for a header\n * @param header The header\n * @returns The relationship ID, or undefined if not registered\n */\n getHeaderRelationshipId(header: Header): string | undefined {\n return this.headers.get(header)?.relationshipId;\n }\n\n /**\n * Gets the relationship ID for a footer\n * @param footer The footer\n * @returns The relationship ID, or undefined if not registered\n */\n getFooterRelationshipId(footer: Footer): string | undefined {\n return this.footers.get(footer)?.relationshipId;\n }\n\n /**\n * Gets all registered headers\n * @returns Array of header entries\n */\n getAllHeaders(): HeaderEntry[] {\n return Array.from(this.headers.values());\n }\n\n /**\n * Gets all registered footers\n * @returns Array of footer entries\n */\n getAllFooters(): FooterEntry[] {\n return Array.from(this.footers.values());\n }\n\n /**\n * Gets the number of headers\n * @returns Number of registered headers\n */\n getHeaderCount(): number {\n return this.headers.size;\n }\n\n /**\n * Gets the number of footers\n * @returns Number of registered footers\n */\n getFooterCount(): number {\n return this.footers.size;\n }\n\n /**\n * Checks if a header is registered\n * @param header The header\n * @returns True if registered\n */\n hasHeader(header: Header): boolean {\n return this.headers.has(header);\n }\n\n /**\n * Checks if a footer is registered\n * @param footer The footer\n * @returns True if registered\n */\n hasFooter(footer: Footer): boolean {\n return this.footers.has(footer);\n }\n\n /**\n * Clears all headers and footers\n */\n clear(): this {\n this.headers.clear();\n this.footers.clear();\n this.nextHeaderNumber = 1;\n this.nextFooterNumber = 1;\n return this;\n }\n\n /**\n * Creates a new header/footer manager\n */\n static create(): HeaderFooterManager {\n return new HeaderFooterManager();\n }\n}\n"]}
1
+ {"version":3,"file":"HeaderFooterManager.js","sourceRoot":"","sources":["../../../src/elements/HeaderFooterManager.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * HeaderFooterManager - Manages headers and footers in a document\n *\n * Tracks all headers and footers, assigns unique IDs, generates filenames,\n * and manages relationships.\n */\n\nimport { Header } from './Header.js';\nimport { Footer } from './Footer.js';\n\n/**\n * Header entry with metadata\n */\ninterface HeaderEntry {\n header: Header;\n filename: string;\n relationshipId: string;\n number: number;\n}\n\n/**\n * Footer entry with metadata\n */\ninterface FooterEntry {\n footer: Footer;\n filename: string;\n relationshipId: string;\n number: number;\n}\n\n/**\n * Manages all headers and footers in a document\n */\nexport class HeaderFooterManager {\n private headers: Map<Header, HeaderEntry>;\n private footers: Map<Footer, FooterEntry>;\n private nextHeaderNumber: number;\n private nextFooterNumber: number;\n\n /**\n * Creates a new header/footer manager\n */\n constructor() {\n this.headers = new Map();\n this.footers = new Map();\n this.nextHeaderNumber = 1;\n this.nextFooterNumber = 1;\n }\n\n /**\n * Registers a header with the manager\n * @param header The header to register\n * @param relationshipId The relationship ID for this header\n * @param originalFilename Part name from the relationship target for loaded\n * headers — kept as-is so saved content lands where the relationship points\n * @returns The filename assigned to this header\n */\n registerHeader(header: Header, relationshipId: string, originalFilename?: string): string {\n // Check if already registered\n const existing = this.headers.get(header);\n if (existing) {\n return existing.filename;\n }\n\n let number: number;\n let filename: string;\n if (originalFilename) {\n filename = originalFilename;\n const digits = /(\\d+)\\.xml$/i.exec(originalFilename)?.[1];\n number = digits ? parseInt(digits, 10) : this.nextHeaderNumber;\n // Keep the counter ahead of parsed part names so generated names never collide\n if (number >= this.nextHeaderNumber) {\n this.nextHeaderNumber = number + 1;\n }\n } else {\n number = this.nextHeaderNumber++;\n filename = header.getFilename(number);\n }\n\n // Set header ID\n header.setHeaderId(relationshipId);\n\n // Store entry\n const entry: HeaderEntry = {\n header,\n filename,\n relationshipId,\n number,\n };\n\n this.headers.set(header, entry);\n\n return filename;\n }\n\n /**\n * Registers a footer with the manager\n * @param footer The footer to register\n * @param relationshipId The relationship ID for this footer\n * @param originalFilename Part name from the relationship target for loaded\n * footers — kept as-is so saved content lands where the relationship points\n * @returns The filename assigned to this footer\n */\n registerFooter(footer: Footer, relationshipId: string, originalFilename?: string): string {\n // Check if already registered\n const existing = this.footers.get(footer);\n if (existing) {\n return existing.filename;\n }\n\n let number: number;\n let filename: string;\n if (originalFilename) {\n filename = originalFilename;\n const digits = /(\\d+)\\.xml$/i.exec(originalFilename)?.[1];\n number = digits ? parseInt(digits, 10) : this.nextFooterNumber;\n // Keep the counter ahead of parsed part names so generated names never collide\n if (number >= this.nextFooterNumber) {\n this.nextFooterNumber = number + 1;\n }\n } else {\n number = this.nextFooterNumber++;\n filename = footer.getFilename(number);\n }\n\n // Set footer ID\n footer.setFooterId(relationshipId);\n\n // Store entry\n const entry: FooterEntry = {\n footer,\n filename,\n relationshipId,\n number,\n };\n\n this.footers.set(footer, entry);\n\n return filename;\n }\n\n /**\n * Returns the part filename this header has, or would receive when\n * registered. Does not consume a sequence number — callers can create the\n * relationship targeting the same part name registerHeader() will assign.\n * @param header The header\n * @returns The current or upcoming filename\n */\n peekHeaderFilename(header: Header): string {\n return this.headers.get(header)?.filename ?? header.getFilename(this.nextHeaderNumber);\n }\n\n /**\n * Returns the part filename this footer has, or would receive when\n * registered. Does not consume a sequence number — callers can create the\n * relationship targeting the same part name registerFooter() will assign.\n * @param footer The footer\n * @returns The current or upcoming filename\n */\n peekFooterFilename(footer: Footer): string {\n return this.footers.get(footer)?.filename ?? footer.getFilename(this.nextFooterNumber);\n }\n\n /**\n * Gets the filename for a header\n * @param header The header\n * @returns The filename, or undefined if not registered\n */\n getHeaderFilename(header: Header): string | undefined {\n return this.headers.get(header)?.filename;\n }\n\n /**\n * Gets the filename for a footer\n * @param footer The footer\n * @returns The filename, or undefined if not registered\n */\n getFooterFilename(footer: Footer): string | undefined {\n return this.footers.get(footer)?.filename;\n }\n\n /**\n * Gets the relationship ID for a header\n * @param header The header\n * @returns The relationship ID, or undefined if not registered\n */\n getHeaderRelationshipId(header: Header): string | undefined {\n return this.headers.get(header)?.relationshipId;\n }\n\n /**\n * Gets the relationship ID for a footer\n * @param footer The footer\n * @returns The relationship ID, or undefined if not registered\n */\n getFooterRelationshipId(footer: Footer): string | undefined {\n return this.footers.get(footer)?.relationshipId;\n }\n\n /**\n * Gets all registered headers\n * @returns Array of header entries\n */\n getAllHeaders(): HeaderEntry[] {\n return Array.from(this.headers.values());\n }\n\n /**\n * Gets all registered footers\n * @returns Array of footer entries\n */\n getAllFooters(): FooterEntry[] {\n return Array.from(this.footers.values());\n }\n\n /**\n * Gets the number of headers\n * @returns Number of registered headers\n */\n getHeaderCount(): number {\n return this.headers.size;\n }\n\n /**\n * Gets the number of footers\n * @returns Number of registered footers\n */\n getFooterCount(): number {\n return this.footers.size;\n }\n\n /**\n * Checks if a header is registered\n * @param header The header\n * @returns True if registered\n */\n hasHeader(header: Header): boolean {\n return this.headers.has(header);\n }\n\n /**\n * Checks if a footer is registered\n * @param footer The footer\n * @returns True if registered\n */\n hasFooter(footer: Footer): boolean {\n return this.footers.has(footer);\n }\n\n /**\n * Clears all headers and footers\n */\n clear(): this {\n this.headers.clear();\n this.footers.clear();\n this.nextHeaderNumber = 1;\n this.nextFooterNumber = 1;\n return this;\n }\n\n /**\n * Creates a new header/footer manager\n */\n static create(): HeaderFooterManager {\n return new HeaderFooterManager();\n }\n}\n"]}
@@ -6,7 +6,7 @@ export class Hyperlink {
6
6
  url;
7
7
  anchor;
8
8
  text;
9
- run;
9
+ runs;
10
10
  tooltip;
11
11
  relationshipId;
12
12
  formatting;
@@ -34,7 +34,7 @@ export class Hyperlink {
34
34
  if (this._isEmpty) {
35
35
  this.text = '';
36
36
  this.formatting = {};
37
- this.run = new Run('', {});
37
+ this.runs = [new Run('', {})];
38
38
  return;
39
39
  }
40
40
  this.text = properties.text || this.url || 'Link';
@@ -46,14 +46,16 @@ export class Hyperlink {
46
46
  if (validation.cleanedText) {
47
47
  this.text = validation.cleanedText;
48
48
  }
49
- this.formatting = {
50
- font: 'Verdana',
51
- size: 12,
52
- color: '0000FF',
53
- underline: 'single',
54
- ...properties.formatting,
55
- };
56
- this.run = new Run(this.text, this.formatting);
49
+ this.formatting = properties.preserveFormatting
50
+ ? { ...properties.formatting }
51
+ : {
52
+ font: 'Verdana',
53
+ size: 12,
54
+ color: '0000FF',
55
+ underline: 'single',
56
+ ...properties.formatting,
57
+ };
58
+ this.runs = [new Run(this.text, this.formatting)];
57
59
  }
58
60
  _setTrackingContext(context) {
59
61
  this.trackingContext = context;
@@ -88,7 +90,7 @@ export class Hyperlink {
88
90
  return;
89
91
  const revisionId = this.trackingContext.getRevisionManager().consumeNextId();
90
92
  const author = this.trackingContext.getAuthor();
91
- this.run.setPropertyChangeRevision({
93
+ this.runs[0].setPropertyChangeRevision({
92
94
  id: revisionId,
93
95
  author,
94
96
  date: new Date(),
@@ -132,7 +134,12 @@ export class Hyperlink {
132
134
  return this;
133
135
  }
134
136
  getText() {
135
- return this.run.getText();
137
+ return this.runs.map((run) => run.getText()).join('');
138
+ }
139
+ replaceRunText(text) {
140
+ const first = this.runs[0];
141
+ first.setText(text);
142
+ this.runs = [first];
136
143
  }
137
144
  setText(text) {
138
145
  const validation = validateRunText(text, {
@@ -140,8 +147,9 @@ export class Hyperlink {
140
147
  autoClean: this.formatting.cleanXmlFromText !== false,
141
148
  warnToConsole: true,
142
149
  });
143
- const cleanedText = validation.cleanedText || text;
150
+ const cleanedText = validation.cleanedText ?? text;
144
151
  const previousValue = this.text;
152
+ this._isEmpty = false;
145
153
  if (previousValue === cleanedText) {
146
154
  return this;
147
155
  }
@@ -149,7 +157,7 @@ export class Hyperlink {
149
157
  const author = this.trackingContext.getAuthor();
150
158
  const oldHyperlink = this.clone();
151
159
  this.text = cleanedText;
152
- this.run.setText(cleanedText);
160
+ this.replaceRunText(cleanedText);
153
161
  const deletion = Revision.createDeletion(author, [oldHyperlink]);
154
162
  const insertion = Revision.createInsertion(author, [this]);
155
163
  this._parentParagraph.replaceContent(this, [deletion, insertion]);
@@ -158,14 +166,25 @@ export class Hyperlink {
158
166
  return this;
159
167
  }
160
168
  this.text = cleanedText;
161
- this.run.setText(cleanedText);
169
+ this.replaceRunText(cleanedText);
162
170
  return this;
163
171
  }
164
172
  setRun(run) {
165
- this.run = run;
173
+ this.runs = [run];
166
174
  this.text = run.getText();
167
175
  return this;
168
176
  }
177
+ setRuns(runs) {
178
+ if (runs.length === 0) {
179
+ return this;
180
+ }
181
+ this.runs = [...runs];
182
+ this.text = this.getText();
183
+ return this;
184
+ }
185
+ getRuns() {
186
+ return [...this.runs];
187
+ }
169
188
  getTooltip() {
170
189
  return this.tooltip;
171
190
  }
@@ -197,7 +216,7 @@ export class Hyperlink {
197
216
  }
198
217
  setUrl(url) {
199
218
  if (!url && !this.anchor) {
200
- throw new Error(`Cannot set URL to undefined: Hyperlink "${this.run.getText()}" has no anchor. ` +
219
+ throw new Error(`Cannot set URL to undefined: Hyperlink "${this.getText()}" has no anchor. ` +
201
220
  `Clearing the URL would create an invalid hyperlink per ECMA-376 §17.16.22. ` +
202
221
  `Either provide a new URL or delete the hyperlink entirely.`);
203
222
  }
@@ -210,9 +229,9 @@ export class Hyperlink {
210
229
  const oldHyperlink = this.clone();
211
230
  this.url = url;
212
231
  this.relationshipId = undefined;
213
- if (this.run.getText() === oldUrl) {
232
+ if (this.getText() === oldUrl) {
214
233
  this.text = url || this.anchor || 'Link';
215
- this.run.setText(this.text);
234
+ this.replaceRunText(this.text);
216
235
  }
217
236
  const deletion = Revision.createDeletion(author, [oldHyperlink]);
218
237
  const insertion = Revision.createInsertion(author, [this]);
@@ -222,15 +241,15 @@ export class Hyperlink {
222
241
  }
223
242
  this.url = url;
224
243
  this.relationshipId = undefined;
225
- if (this.run.getText() === oldUrl) {
244
+ if (this.getText() === oldUrl) {
226
245
  this.text = url || this.anchor || 'Link';
227
- this.run.setText(this.text);
246
+ this.replaceRunText(this.text);
228
247
  }
229
248
  return this;
230
249
  }
231
250
  setAnchor(anchor) {
232
251
  if (!anchor && !this.url) {
233
- throw new Error(`Cannot set anchor to undefined: Hyperlink "${this.run.getText()}" has no URL. ` +
252
+ throw new Error(`Cannot set anchor to undefined: Hyperlink "${this.getText()}" has no URL. ` +
234
253
  `Clearing the anchor would create an invalid hyperlink per ECMA-376 §17.16.22. ` +
235
254
  `Either provide a new anchor or delete the hyperlink entirely.`);
236
255
  }
@@ -248,9 +267,9 @@ export class Hyperlink {
248
267
  this.url = undefined;
249
268
  this.relationshipId = undefined;
250
269
  }
251
- if (this.run.getText() === oldAnchor) {
270
+ if (this.getText() === oldAnchor) {
252
271
  this.text = anchor || this.url || 'Link';
253
- this.run.setText(this.text);
272
+ this.replaceRunText(this.text);
254
273
  }
255
274
  const deletion = Revision.createDeletion(author, [oldHyperlink]);
256
275
  const insertion = Revision.createInsertion(author, [this]);
@@ -265,14 +284,14 @@ export class Hyperlink {
265
284
  this.url = undefined;
266
285
  this.relationshipId = undefined;
267
286
  }
268
- if (this.run.getText() === oldAnchor) {
287
+ if (this.getText() === oldAnchor) {
269
288
  this.text = anchor || this.url || 'Link';
270
- this.run.setText(this.text);
289
+ this.replaceRunText(this.text);
271
290
  }
272
291
  return this;
273
292
  }
274
293
  getRun() {
275
- return this.run;
294
+ return this.runs[0];
276
295
  }
277
296
  setFormatting(formatting, options) {
278
297
  const previousFormatting = { ...this.formatting };
@@ -282,14 +301,16 @@ export class Hyperlink {
282
301
  else {
283
302
  this.formatting = { ...this.formatting, ...formatting };
284
303
  }
285
- const currentText = this.run.getText();
286
- this.run = new Run(currentText, this.formatting);
287
- this.text = currentText;
304
+ this.runs = this.runs.map((run) => Run.createFromContent(run.getContent(), options?.replace ? { ...formatting } : { ...run.getFormatting(), ...formatting }));
305
+ this.text = this.getText();
288
306
  if (this.trackingContext?.isEnabled()) {
289
307
  this._applyFormattingRPrChange(previousFormatting);
290
308
  }
291
309
  return this;
292
310
  }
311
+ patchRunFormatting(patch) {
312
+ this.runs = this.runs.map((run) => Run.createFromContent(run.getContent(), { ...run.getFormatting(), ...patch }));
313
+ }
293
314
  getFormatting() {
294
315
  return this;
295
316
  }
@@ -317,7 +338,7 @@ export class Hyperlink {
317
338
  setColor(color) {
318
339
  const previousFormatting = { ...this.formatting };
319
340
  this.formatting.color = color;
320
- this.run = new Run(this.text, this.formatting);
341
+ this.patchRunFormatting({ color });
321
342
  if (this.trackingContext?.isEnabled() && previousFormatting.color !== color) {
322
343
  this._applyFormattingRPrChange(previousFormatting);
323
344
  }
@@ -326,7 +347,7 @@ export class Hyperlink {
326
347
  setUnderline(underline) {
327
348
  const previousFormatting = { ...this.formatting };
328
349
  this.formatting.underline = underline;
329
- this.run = new Run(this.text, this.formatting);
350
+ this.patchRunFormatting({ underline });
330
351
  if (this.trackingContext?.isEnabled() && previousFormatting.underline !== underline) {
331
352
  this._applyFormattingRPrChange(previousFormatting);
332
353
  }
@@ -335,7 +356,7 @@ export class Hyperlink {
335
356
  setBold(bold = true) {
336
357
  const previousFormatting = { ...this.formatting };
337
358
  this.formatting.bold = bold;
338
- this.run = new Run(this.text, this.formatting);
359
+ this.patchRunFormatting({ bold });
339
360
  if (this.trackingContext?.isEnabled() && previousFormatting.bold !== bold) {
340
361
  this._applyFormattingRPrChange(previousFormatting);
341
362
  }
@@ -344,7 +365,7 @@ export class Hyperlink {
344
365
  setItalic(italic = true) {
345
366
  const previousFormatting = { ...this.formatting };
346
367
  this.formatting.italic = italic;
347
- this.run = new Run(this.text, this.formatting);
368
+ this.patchRunFormatting({ italic });
348
369
  if (this.trackingContext?.isEnabled() && previousFormatting.italic !== italic) {
349
370
  this._applyFormattingRPrChange(previousFormatting);
350
371
  }
@@ -353,7 +374,7 @@ export class Hyperlink {
353
374
  setFont(font) {
354
375
  const previousFormatting = { ...this.formatting };
355
376
  this.formatting.font = font;
356
- this.run = new Run(this.text, this.formatting);
377
+ this.patchRunFormatting({ font });
357
378
  if (this.trackingContext?.isEnabled() && previousFormatting.font !== font) {
358
379
  this._applyFormattingRPrChange(previousFormatting);
359
380
  }
@@ -362,7 +383,7 @@ export class Hyperlink {
362
383
  setSize(size) {
363
384
  const previousFormatting = { ...this.formatting };
364
385
  this.formatting.size = size;
365
- this.run = new Run(this.text, this.formatting);
386
+ this.patchRunFormatting({ size });
366
387
  if (this.trackingContext?.isEnabled() && previousFormatting.size !== size) {
367
388
  this._applyFormattingRPrChange(previousFormatting);
368
389
  }
@@ -420,8 +441,9 @@ export class Hyperlink {
420
441
  fixedUrl = fixedUrl.replace(/\/$/, '');
421
442
  fixed.push('Removed trailing slash');
422
443
  }
444
+ const beforeUpgrade = fixedUrl;
423
445
  fixedUrl = fixedUrl.replace(/^http:\/\//i, 'https://');
424
- if (fixedUrl !== this.url && fixedUrl.startsWith('https://')) {
446
+ if (fixedUrl !== beforeUpgrade) {
425
447
  fixed.push('Upgraded HTTP to HTTPS');
426
448
  }
427
449
  if (fixedUrl !== this.url) {
@@ -502,17 +524,21 @@ export class Hyperlink {
502
524
  tooltip: this.tooltip,
503
525
  relationshipId: this.relationshipId,
504
526
  formatting: { ...this.formatting },
527
+ preserveFormatting: true,
505
528
  tgtFrame: this.tgtFrame,
506
529
  history: this.history,
507
530
  docLocation: this.docLocation,
531
+ isEmpty: this._isEmpty,
508
532
  });
509
- if (this.run) {
510
- cloned.run = new Run(this.run.getText(), { ...this.run.getFormatting() });
511
- const existingRPrChange = this.run.getPropertyChangeRevision();
533
+ cloned.runs = this.runs.map((run) => {
534
+ const copy = run.clone();
535
+ const existingRPrChange = run.getPropertyChangeRevision();
512
536
  if (existingRPrChange) {
513
- cloned.run.setPropertyChangeRevision({ ...existingRPrChange });
537
+ copy.setPropertyChangeRevision({ ...existingRPrChange });
514
538
  }
515
- }
539
+ return copy;
540
+ });
541
+ cloned.text = cloned.getText();
516
542
  return cloned;
517
543
  }
518
544
  toXML() {
@@ -552,11 +578,10 @@ export class Hyperlink {
552
578
  children: [],
553
579
  };
554
580
  }
555
- const runXml = this.run.toXML();
556
581
  return {
557
582
  name: 'w:hyperlink',
558
583
  attributes,
559
- children: [runXml],
584
+ children: this.runs.map((run) => run.toXML()),
560
585
  };
561
586
  }
562
587
  static createExternal(url, text, formatting) {