docxmlater 10.1.3 → 10.1.5

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 (371) hide show
  1. package/README.md +759 -754
  2. package/dist/constants/legacyCompatFlags.js +1 -1
  3. package/dist/constants/legacyCompatFlags.js.map +1 -1
  4. package/dist/constants/limits.js.map +1 -1
  5. package/dist/core/Document.d.ts +50 -50
  6. package/dist/core/Document.d.ts.map +1 -1
  7. package/dist/core/Document.js +483 -471
  8. package/dist/core/Document.js.map +1 -1
  9. package/dist/core/DocumentContent.d.ts +9 -9
  10. package/dist/core/DocumentContent.d.ts.map +1 -1
  11. package/dist/core/DocumentContent.js +1 -1
  12. package/dist/core/DocumentContent.js.map +1 -1
  13. package/dist/core/DocumentGenerator.d.ts +11 -11
  14. package/dist/core/DocumentGenerator.d.ts.map +1 -1
  15. package/dist/core/DocumentGenerator.js +251 -251
  16. package/dist/core/DocumentGenerator.js.map +1 -1
  17. package/dist/core/DocumentIdManager.js.map +1 -1
  18. package/dist/core/DocumentParser.d.ts +15 -15
  19. package/dist/core/DocumentParser.d.ts.map +1 -1
  20. package/dist/core/DocumentParser.js +2123 -2155
  21. package/dist/core/DocumentParser.js.map +1 -1
  22. package/dist/core/DocumentValidator.d.ts.map +1 -1
  23. package/dist/core/DocumentValidator.js +2 -5
  24. package/dist/core/DocumentValidator.js.map +1 -1
  25. package/dist/core/Relationship.js.map +1 -1
  26. package/dist/core/RelationshipManager.d.ts.map +1 -1
  27. package/dist/core/RelationshipManager.js +3 -3
  28. package/dist/core/RelationshipManager.js.map +1 -1
  29. package/dist/elements/AlternateContent.js.map +1 -1
  30. package/dist/elements/Bookmark.d.ts.map +1 -1
  31. package/dist/elements/Bookmark.js +3 -1
  32. package/dist/elements/Bookmark.js.map +1 -1
  33. package/dist/elements/BookmarkManager.d.ts.map +1 -1
  34. package/dist/elements/BookmarkManager.js.map +1 -1
  35. package/dist/elements/Comment.d.ts.map +1 -1
  36. package/dist/elements/Comment.js +9 -6
  37. package/dist/elements/Comment.js.map +1 -1
  38. package/dist/elements/CommentManager.d.ts.map +1 -1
  39. package/dist/elements/CommentManager.js +18 -17
  40. package/dist/elements/CommentManager.js.map +1 -1
  41. package/dist/elements/CommonTypes.d.ts +21 -21
  42. package/dist/elements/CommonTypes.d.ts.map +1 -1
  43. package/dist/elements/CommonTypes.js +56 -56
  44. package/dist/elements/CommonTypes.js.map +1 -1
  45. package/dist/elements/CustomXml.js.map +1 -1
  46. package/dist/elements/Endnote.d.ts.map +1 -1
  47. package/dist/elements/Endnote.js +6 -6
  48. package/dist/elements/Endnote.js.map +1 -1
  49. package/dist/elements/EndnoteManager.d.ts.map +1 -1
  50. package/dist/elements/EndnoteManager.js +6 -7
  51. package/dist/elements/EndnoteManager.js.map +1 -1
  52. package/dist/elements/Field.d.ts.map +1 -1
  53. package/dist/elements/Field.js +82 -25
  54. package/dist/elements/Field.js.map +1 -1
  55. package/dist/elements/FieldHelpers.d.ts.map +1 -1
  56. package/dist/elements/FieldHelpers.js.map +1 -1
  57. package/dist/elements/FontManager.d.ts.map +1 -1
  58. package/dist/elements/FontManager.js +1 -1
  59. package/dist/elements/FontManager.js.map +1 -1
  60. package/dist/elements/Footer.js +2 -2
  61. package/dist/elements/Footer.js.map +1 -1
  62. package/dist/elements/Footnote.d.ts.map +1 -1
  63. package/dist/elements/Footnote.js +6 -6
  64. package/dist/elements/Footnote.js.map +1 -1
  65. package/dist/elements/FootnoteManager.d.ts.map +1 -1
  66. package/dist/elements/FootnoteManager.js +6 -7
  67. package/dist/elements/FootnoteManager.js.map +1 -1
  68. package/dist/elements/Header.js +2 -2
  69. package/dist/elements/Header.js.map +1 -1
  70. package/dist/elements/HeaderFooterManager.js.map +1 -1
  71. package/dist/elements/Hyperlink.d.ts +5 -3
  72. package/dist/elements/Hyperlink.d.ts.map +1 -1
  73. package/dist/elements/Hyperlink.js +134 -76
  74. package/dist/elements/Hyperlink.js.map +1 -1
  75. package/dist/elements/Image.d.ts.map +1 -1
  76. package/dist/elements/Image.js +238 -106
  77. package/dist/elements/Image.js.map +1 -1
  78. package/dist/elements/ImageManager.d.ts.map +1 -1
  79. package/dist/elements/ImageManager.js +1 -1
  80. package/dist/elements/ImageManager.js.map +1 -1
  81. package/dist/elements/ImageRun.js +1 -1
  82. package/dist/elements/ImageRun.js.map +1 -1
  83. package/dist/elements/MathElement.js.map +1 -1
  84. package/dist/elements/Paragraph.d.ts +24 -24
  85. package/dist/elements/Paragraph.d.ts.map +1 -1
  86. package/dist/elements/Paragraph.js +181 -188
  87. package/dist/elements/Paragraph.js.map +1 -1
  88. package/dist/elements/PreservedElement.js.map +1 -1
  89. package/dist/elements/PropertyChangeTypes.d.ts.map +1 -1
  90. package/dist/elements/PropertyChangeTypes.js +6 -6
  91. package/dist/elements/PropertyChangeTypes.js.map +1 -1
  92. package/dist/elements/RangeMarker.d.ts.map +1 -1
  93. package/dist/elements/RangeMarker.js.map +1 -1
  94. package/dist/elements/Revision.d.ts.map +1 -1
  95. package/dist/elements/Revision.js +4 -5
  96. package/dist/elements/Revision.js.map +1 -1
  97. package/dist/elements/RevisionContent.js.map +1 -1
  98. package/dist/elements/RevisionManager.d.ts.map +1 -1
  99. package/dist/elements/RevisionManager.js +40 -48
  100. package/dist/elements/RevisionManager.js.map +1 -1
  101. package/dist/elements/Run.d.ts +16 -16
  102. package/dist/elements/Run.d.ts.map +1 -1
  103. package/dist/elements/Run.js +256 -238
  104. package/dist/elements/Run.js.map +1 -1
  105. package/dist/elements/Section.d.ts.map +1 -1
  106. package/dist/elements/Section.js +36 -11
  107. package/dist/elements/Section.js.map +1 -1
  108. package/dist/elements/Shape.d.ts.map +1 -1
  109. package/dist/elements/Shape.js.map +1 -1
  110. package/dist/elements/StructuredDocumentTag.d.ts +6 -6
  111. package/dist/elements/StructuredDocumentTag.d.ts.map +1 -1
  112. package/dist/elements/StructuredDocumentTag.js +99 -104
  113. package/dist/elements/StructuredDocumentTag.js.map +1 -1
  114. package/dist/elements/Table.d.ts +11 -11
  115. package/dist/elements/Table.d.ts.map +1 -1
  116. package/dist/elements/Table.js +102 -107
  117. package/dist/elements/Table.js.map +1 -1
  118. package/dist/elements/TableCell.d.ts +10 -10
  119. package/dist/elements/TableCell.d.ts.map +1 -1
  120. package/dist/elements/TableCell.js +105 -106
  121. package/dist/elements/TableCell.js.map +1 -1
  122. package/dist/elements/TableGridChange.d.ts.map +1 -1
  123. package/dist/elements/TableGridChange.js.map +1 -1
  124. package/dist/elements/TableOfContents.d.ts.map +1 -1
  125. package/dist/elements/TableOfContents.js +4 -4
  126. package/dist/elements/TableOfContents.js.map +1 -1
  127. package/dist/elements/TableOfContentsElement.js.map +1 -1
  128. package/dist/elements/TableRow.d.ts.map +1 -1
  129. package/dist/elements/TableRow.js +13 -6
  130. package/dist/elements/TableRow.js.map +1 -1
  131. package/dist/elements/TextBox.d.ts.map +1 -1
  132. package/dist/elements/TextBox.js +3 -5
  133. package/dist/elements/TextBox.js.map +1 -1
  134. package/dist/formatting/AbstractNumbering.d.ts +4 -4
  135. package/dist/formatting/AbstractNumbering.d.ts.map +1 -1
  136. package/dist/formatting/AbstractNumbering.js +54 -49
  137. package/dist/formatting/AbstractNumbering.js.map +1 -1
  138. package/dist/formatting/NumberingInstance.d.ts.map +1 -1
  139. package/dist/formatting/NumberingInstance.js +1 -3
  140. package/dist/formatting/NumberingInstance.js.map +1 -1
  141. package/dist/formatting/NumberingLevel.d.ts +5 -5
  142. package/dist/formatting/NumberingLevel.d.ts.map +1 -1
  143. package/dist/formatting/NumberingLevel.js +119 -125
  144. package/dist/formatting/NumberingLevel.js.map +1 -1
  145. package/dist/formatting/NumberingManager.d.ts.map +1 -1
  146. package/dist/formatting/NumberingManager.js +9 -9
  147. package/dist/formatting/NumberingManager.js.map +1 -1
  148. package/dist/formatting/Style.d.ts +11 -11
  149. package/dist/formatting/Style.d.ts.map +1 -1
  150. package/dist/formatting/Style.js +219 -247
  151. package/dist/formatting/Style.js.map +1 -1
  152. package/dist/formatting/StylesManager.d.ts +2 -2
  153. package/dist/formatting/StylesManager.d.ts.map +1 -1
  154. package/dist/formatting/StylesManager.js +96 -102
  155. package/dist/formatting/StylesManager.js.map +1 -1
  156. package/dist/helpers/CleanupHelper.d.ts +1 -1
  157. package/dist/helpers/CleanupHelper.d.ts.map +1 -1
  158. package/dist/helpers/CleanupHelper.js +6 -6
  159. package/dist/helpers/CleanupHelper.js.map +1 -1
  160. package/dist/images/ImageOptimizer.js +7 -7
  161. package/dist/images/ImageOptimizer.js.map +1 -1
  162. package/dist/index.d.ts +9 -9
  163. package/dist/index.d.ts.map +1 -1
  164. package/dist/index.js.map +1 -1
  165. package/dist/managers/DrawingManager.js.map +1 -1
  166. package/dist/tracking/DocumentTrackingContext.d.ts.map +1 -1
  167. package/dist/tracking/DocumentTrackingContext.js +23 -7
  168. package/dist/tracking/DocumentTrackingContext.js.map +1 -1
  169. package/dist/tracking/TrackingContext.d.ts.map +1 -1
  170. package/dist/tracking/TrackingContext.js.map +1 -1
  171. package/dist/types/compatibility-types.js.map +1 -1
  172. package/dist/types/formatting.js.map +1 -1
  173. package/dist/types/list-types.d.ts +6 -6
  174. package/dist/types/list-types.js.map +1 -1
  175. package/dist/types/settings-types.js.map +1 -1
  176. package/dist/types/styleConfig.d.ts +2 -2
  177. package/dist/types/styleConfig.js.map +1 -1
  178. package/dist/utils/ChangelogGenerator.d.ts.map +1 -1
  179. package/dist/utils/ChangelogGenerator.js +97 -101
  180. package/dist/utils/ChangelogGenerator.js.map +1 -1
  181. package/dist/utils/CompatibilityUpgrader.d.ts.map +1 -1
  182. package/dist/utils/CompatibilityUpgrader.js +1 -1
  183. package/dist/utils/CompatibilityUpgrader.js.map +1 -1
  184. package/dist/utils/InMemoryRevisionAcceptor.d.ts.map +1 -1
  185. package/dist/utils/InMemoryRevisionAcceptor.js +1 -6
  186. package/dist/utils/InMemoryRevisionAcceptor.js.map +1 -1
  187. package/dist/utils/MoveOperationHelper.d.ts.map +1 -1
  188. package/dist/utils/MoveOperationHelper.js +1 -1
  189. package/dist/utils/MoveOperationHelper.js.map +1 -1
  190. package/dist/utils/RevisionAwareProcessor.d.ts.map +1 -1
  191. package/dist/utils/RevisionAwareProcessor.js +2 -4
  192. package/dist/utils/RevisionAwareProcessor.js.map +1 -1
  193. package/dist/utils/RevisionWalker.d.ts.map +1 -1
  194. package/dist/utils/RevisionWalker.js +4 -12
  195. package/dist/utils/RevisionWalker.js.map +1 -1
  196. package/dist/utils/SelectiveRevisionAcceptor.d.ts.map +1 -1
  197. package/dist/utils/SelectiveRevisionAcceptor.js +2 -6
  198. package/dist/utils/SelectiveRevisionAcceptor.js.map +1 -1
  199. package/dist/utils/ShadingResolver.d.ts.map +1 -1
  200. package/dist/utils/ShadingResolver.js +1 -1
  201. package/dist/utils/ShadingResolver.js.map +1 -1
  202. package/dist/utils/acceptRevisions.d.ts.map +1 -1
  203. package/dist/utils/acceptRevisions.js +23 -12
  204. package/dist/utils/acceptRevisions.js.map +1 -1
  205. package/dist/utils/cnfStyleDecoder.d.ts +1 -1
  206. package/dist/utils/cnfStyleDecoder.d.ts.map +1 -1
  207. package/dist/utils/cnfStyleDecoder.js +40 -40
  208. package/dist/utils/cnfStyleDecoder.js.map +1 -1
  209. package/dist/utils/corruptionDetection.d.ts.map +1 -1
  210. package/dist/utils/corruptionDetection.js.map +1 -1
  211. package/dist/utils/dateFormatting.js.map +1 -1
  212. package/dist/utils/deepClone.js +1 -1
  213. package/dist/utils/deepClone.js.map +1 -1
  214. package/dist/utils/diagnostics.d.ts.map +1 -1
  215. package/dist/utils/diagnostics.js +1 -1
  216. package/dist/utils/diagnostics.js.map +1 -1
  217. package/dist/utils/errorHandling.js.map +1 -1
  218. package/dist/utils/formatting.d.ts.map +1 -1
  219. package/dist/utils/formatting.js +10 -2
  220. package/dist/utils/formatting.js.map +1 -1
  221. package/dist/utils/list-detection.d.ts +2 -2
  222. package/dist/utils/list-detection.d.ts.map +1 -1
  223. package/dist/utils/list-detection.js +21 -23
  224. package/dist/utils/list-detection.js.map +1 -1
  225. package/dist/utils/logger.d.ts.map +1 -1
  226. package/dist/utils/logger.js +12 -7
  227. package/dist/utils/logger.js.map +1 -1
  228. package/dist/utils/parsingHelpers.js.map +1 -1
  229. package/dist/utils/stripTrackedChanges.d.ts.map +1 -1
  230. package/dist/utils/stripTrackedChanges.js +3 -3
  231. package/dist/utils/stripTrackedChanges.js.map +1 -1
  232. package/dist/utils/textDiff.d.ts +1 -1
  233. package/dist/utils/textDiff.js +8 -8
  234. package/dist/utils/textDiff.js.map +1 -1
  235. package/dist/utils/units.js.map +1 -1
  236. package/dist/utils/validation.d.ts.map +1 -1
  237. package/dist/utils/validation.js +24 -7
  238. package/dist/utils/validation.js.map +1 -1
  239. package/dist/utils/xmlSanitization.d.ts.map +1 -1
  240. package/dist/utils/xmlSanitization.js +3 -3
  241. package/dist/utils/xmlSanitization.js.map +1 -1
  242. package/dist/validation/RevisionAutoFixer.d.ts.map +1 -1
  243. package/dist/validation/RevisionAutoFixer.js +5 -5
  244. package/dist/validation/RevisionAutoFixer.js.map +1 -1
  245. package/dist/validation/RevisionValidator.d.ts.map +1 -1
  246. package/dist/validation/RevisionValidator.js +7 -9
  247. package/dist/validation/RevisionValidator.js.map +1 -1
  248. package/dist/validation/ValidationRules.js +3 -3
  249. package/dist/validation/ValidationRules.js.map +1 -1
  250. package/dist/validation/index.js.map +1 -1
  251. package/dist/xml/XMLBuilder.d.ts +1 -1
  252. package/dist/xml/XMLBuilder.d.ts.map +1 -1
  253. package/dist/xml/XMLBuilder.js +98 -100
  254. package/dist/xml/XMLBuilder.js.map +1 -1
  255. package/dist/xml/XMLParser.d.ts.map +1 -1
  256. package/dist/xml/XMLParser.js +61 -66
  257. package/dist/xml/XMLParser.js.map +1 -1
  258. package/dist/zip/ZipHandler.d.ts.map +1 -1
  259. package/dist/zip/ZipHandler.js.map +1 -1
  260. package/dist/zip/ZipReader.d.ts.map +1 -1
  261. package/dist/zip/ZipReader.js +1 -3
  262. package/dist/zip/ZipReader.js.map +1 -1
  263. package/dist/zip/ZipWriter.d.ts +1 -1
  264. package/dist/zip/ZipWriter.d.ts.map +1 -1
  265. package/dist/zip/ZipWriter.js +28 -36
  266. package/dist/zip/ZipWriter.js.map +1 -1
  267. package/dist/zip/types.js +1 -1
  268. package/dist/zip/types.js.map +1 -1
  269. package/package.json +92 -92
  270. package/src/__tests__/helper-methods.test.ts +512 -512
  271. package/src/constants/legacyCompatFlags.ts +138 -138
  272. package/src/constants/limits.ts +50 -50
  273. package/src/core/Document.ts +985 -1145
  274. package/src/core/DocumentContent.ts +461 -467
  275. package/src/core/DocumentGenerator.ts +1133 -1104
  276. package/src/core/DocumentIdManager.ts +158 -158
  277. package/src/core/DocumentParser.ts +2347 -2716
  278. package/src/core/DocumentValidator.ts +363 -372
  279. package/src/core/Relationship.ts +367 -367
  280. package/src/core/RelationshipManager.ts +429 -428
  281. package/src/elements/AlternateContent.ts +42 -42
  282. package/src/elements/Bookmark.ts +212 -210
  283. package/src/elements/BookmarkManager.ts +247 -250
  284. package/src/elements/Comment.ts +356 -359
  285. package/src/elements/CommentManager.ts +499 -502
  286. package/src/elements/CommonTypes.ts +524 -549
  287. package/src/elements/CustomXml.ts +36 -36
  288. package/src/elements/Endnote.ts +221 -217
  289. package/src/elements/EndnoteManager.ts +246 -249
  290. package/src/elements/Field.ts +1292 -1233
  291. package/src/elements/FieldHelpers.ts +329 -333
  292. package/src/elements/FontManager.ts +336 -339
  293. package/src/elements/Footer.ts +269 -269
  294. package/src/elements/Footnote.ts +221 -217
  295. package/src/elements/FootnoteManager.ts +246 -249
  296. package/src/elements/Header.ts +269 -269
  297. package/src/elements/HeaderFooterManager.ts +219 -219
  298. package/src/elements/Hyperlink.ts +1288 -1193
  299. package/src/elements/Image.ts +1982 -1756
  300. package/src/elements/ImageManager.ts +437 -432
  301. package/src/elements/ImageRun.ts +59 -59
  302. package/src/elements/MathElement.ts +65 -65
  303. package/src/elements/Paragraph.ts +4347 -4287
  304. package/src/elements/PreservedElement.ts +53 -53
  305. package/src/elements/PropertyChangeTypes.ts +458 -442
  306. package/src/elements/RangeMarker.ts +382 -400
  307. package/src/elements/Revision.ts +1198 -1217
  308. package/src/elements/RevisionContent.ts +73 -73
  309. package/src/elements/RevisionManager.ts +1070 -1070
  310. package/src/elements/Run.ts +3103 -3073
  311. package/src/elements/Section.ts +1521 -1421
  312. package/src/elements/Shape.ts +884 -873
  313. package/src/elements/StructuredDocumentTag.ts +1176 -1207
  314. package/src/elements/Table.ts +2468 -2524
  315. package/src/elements/TableCell.ts +1617 -1621
  316. package/src/elements/TableGridChange.ts +149 -151
  317. package/src/elements/TableOfContents.ts +701 -691
  318. package/src/elements/TableOfContentsElement.ts +89 -89
  319. package/src/elements/TableRow.ts +960 -929
  320. package/src/elements/TextBox.ts +766 -768
  321. package/src/formatting/AbstractNumbering.ts +580 -579
  322. package/src/formatting/NumberingInstance.ts +295 -299
  323. package/src/formatting/NumberingLevel.ts +981 -1040
  324. package/src/formatting/NumberingManager.ts +833 -827
  325. package/src/formatting/Style.ts +1785 -1879
  326. package/src/formatting/StylesManager.ts +1090 -1130
  327. package/src/helpers/CleanupHelper.ts +524 -524
  328. package/src/images/ImageOptimizer.ts +274 -274
  329. package/src/index.ts +559 -554
  330. package/src/managers/DrawingManager.ts +319 -319
  331. package/src/tracking/DocumentTrackingContext.ts +687 -674
  332. package/src/tracking/TrackingContext.ts +175 -173
  333. package/src/types/compatibility-types.ts +49 -49
  334. package/src/types/formatting.ts +210 -210
  335. package/src/types/list-types.ts +14 -14
  336. package/src/types/settings-types.ts +59 -59
  337. package/src/types/styleConfig.ts +189 -189
  338. package/src/utils/ChangelogGenerator.ts +1583 -1581
  339. package/src/utils/CompatibilityUpgrader.ts +235 -237
  340. package/src/utils/InMemoryRevisionAcceptor.ts +691 -696
  341. package/src/utils/MoveOperationHelper.ts +233 -238
  342. package/src/utils/RevisionAwareProcessor.ts +518 -526
  343. package/src/utils/RevisionWalker.ts +427 -457
  344. package/src/utils/SelectiveRevisionAcceptor.ts +662 -683
  345. package/src/utils/ShadingResolver.ts +105 -107
  346. package/src/utils/acceptRevisions.ts +723 -714
  347. package/src/utils/cnfStyleDecoder.ts +212 -217
  348. package/src/utils/corruptionDetection.ts +346 -345
  349. package/src/utils/dateFormatting.ts +20 -20
  350. package/src/utils/deepClone.ts +77 -78
  351. package/src/utils/diagnostics.ts +125 -129
  352. package/src/utils/errorHandling.ts +80 -80
  353. package/src/utils/formatting.ts +220 -213
  354. package/src/utils/list-detection.ts +32 -42
  355. package/src/utils/logger.ts +412 -404
  356. package/src/utils/parsingHelpers.ts +190 -190
  357. package/src/utils/stripTrackedChanges.ts +356 -353
  358. package/src/utils/textDiff.ts +100 -100
  359. package/src/utils/units.ts +421 -421
  360. package/src/utils/validation.ts +553 -542
  361. package/src/utils/xmlSanitization.ts +179 -182
  362. package/src/validation/RevisionAutoFixer.ts +541 -542
  363. package/src/validation/RevisionValidator.ts +470 -460
  364. package/src/validation/ValidationRules.ts +338 -338
  365. package/src/validation/index.ts +30 -30
  366. package/src/xml/XMLBuilder.ts +857 -871
  367. package/src/xml/XMLParser.ts +877 -919
  368. package/src/zip/ZipHandler.ts +629 -637
  369. package/src/zip/ZipReader.ts +295 -299
  370. package/src/zip/ZipWriter.ts +374 -390
  371. package/src/zip/types.ts +116 -116
@@ -6,25 +6,25 @@ const CommonTypes_1 = require("../elements/CommonTypes");
6
6
  class XMLBuilder {
7
7
  elements = [];
8
8
  static CANNOT_SELF_CLOSE = [
9
- "w:t",
10
- "w:r",
11
- "w:p",
12
- "w:tbl",
13
- "w:tr",
14
- "w:tc",
15
- "w:body",
16
- "w:document",
17
- "w:hyperlink",
18
- "w:sdt",
19
- "w:sdtContent",
20
- "w:sdtPr",
21
- "w:pPr",
22
- "w:rPr",
23
- "w:sectPr",
24
- "w:del",
25
- "w:ins",
26
- "w:moveFrom",
27
- "w:moveTo",
9
+ 'w:t',
10
+ 'w:r',
11
+ 'w:p',
12
+ 'w:tbl',
13
+ 'w:tr',
14
+ 'w:tc',
15
+ 'w:body',
16
+ 'w:document',
17
+ 'w:hyperlink',
18
+ 'w:sdt',
19
+ 'w:sdtContent',
20
+ 'w:sdtPr',
21
+ 'w:pPr',
22
+ 'w:rPr',
23
+ 'w:sectPr',
24
+ 'w:del',
25
+ 'w:ins',
26
+ 'w:moveFrom',
27
+ 'w:moveTo',
28
28
  ];
29
29
  element(name, attributes, children) {
30
30
  this.elements.push({
@@ -51,7 +51,7 @@ class XMLBuilder {
51
51
  return this;
52
52
  }
53
53
  build(includeDeclaration = false) {
54
- let xml = "";
54
+ let xml = '';
55
55
  if (includeDeclaration) {
56
56
  xml += '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>\n';
57
57
  }
@@ -59,9 +59,9 @@ class XMLBuilder {
59
59
  return xml;
60
60
  }
61
61
  elementsToString(elements) {
62
- let xml = "";
62
+ let xml = '';
63
63
  for (const element of elements) {
64
- if (typeof element === "string") {
64
+ if (typeof element === 'string') {
65
65
  xml += this.escapeXml(element);
66
66
  }
67
67
  else {
@@ -71,7 +71,7 @@ class XMLBuilder {
71
71
  return xml;
72
72
  }
73
73
  elementToString(element) {
74
- if (element.name === "__rawXml" && element.rawXml) {
74
+ if (element.name === '__rawXml' && element.rawXml) {
75
75
  return element.rawXml;
76
76
  }
77
77
  let xml = `<${element.name}`;
@@ -85,13 +85,13 @@ class XMLBuilder {
85
85
  }
86
86
  if (element.selfClosing) {
87
87
  if (XMLBuilder.CANNOT_SELF_CLOSE.includes(element.name)) {
88
- xml += "></" + element.name + ">";
88
+ xml += '></' + element.name + '>';
89
89
  return xml;
90
90
  }
91
- xml += "/>";
91
+ xml += '/>';
92
92
  return xml;
93
93
  }
94
- xml += ">";
94
+ xml += '>';
95
95
  if (element.rawXml) {
96
96
  xml += element.rawXml;
97
97
  }
@@ -106,53 +106,53 @@ class XMLBuilder {
106
106
  }
107
107
  static escapeXmlText(text) {
108
108
  return (0, xmlSanitization_1.removeInvalidXmlChars)(text)
109
- .replace(/&/g, "&amp;")
110
- .replace(/</g, "&lt;")
111
- .replace(/>/g, "&gt;");
109
+ .replace(/&/g, '&amp;')
110
+ .replace(/</g, '&lt;')
111
+ .replace(/>/g, '&gt;');
112
112
  }
113
113
  static escapeXmlAttribute(value) {
114
114
  return (0, xmlSanitization_1.removeInvalidXmlChars)(value)
115
- .replace(/&/g, "&amp;")
116
- .replace(/</g, "&lt;")
117
- .replace(/>/g, "&gt;")
118
- .replace(/"/g, "&quot;")
119
- .replace(/'/g, "&apos;");
115
+ .replace(/&/g, '&amp;')
116
+ .replace(/</g, '&lt;')
117
+ .replace(/>/g, '&gt;')
118
+ .replace(/"/g, '&quot;')
119
+ .replace(/'/g, '&apos;');
120
120
  }
121
121
  static unescapeXml(text) {
122
122
  return text
123
- .replace(/&lt;/g, "<")
124
- .replace(/&gt;/g, ">")
123
+ .replace(/&lt;/g, '<')
124
+ .replace(/&gt;/g, '>')
125
125
  .replace(/&quot;/g, '"')
126
126
  .replace(/&apos;/g, "'")
127
- .replace(/&amp;/g, "&");
127
+ .replace(/&amp;/g, '&');
128
128
  }
129
129
  static sanitizeXmlContent(text) {
130
130
  return ((0, xmlSanitization_1.removeInvalidXmlChars)(text)
131
- .replace(/\]\]>/g, "]]&gt;")
132
- .replace(/&/g, "&amp;")
133
- .replace(/</g, "&lt;")
134
- .replace(/>/g, "&gt;"));
131
+ .replace(/\]\]>/g, ']]&gt;')
132
+ .replace(/&/g, '&amp;')
133
+ .replace(/</g, '&lt;')
134
+ .replace(/>/g, '&gt;'));
135
135
  }
136
136
  static createNamespaces() {
137
137
  return {
138
- "xmlns:w": "http://schemas.openxmlformats.org/wordprocessingml/2006/main",
139
- "xmlns:r": "http://schemas.openxmlformats.org/officeDocument/2006/relationships",
140
- "xmlns:wp": "http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing",
141
- "xmlns:a": "http://schemas.openxmlformats.org/drawingml/2006/main",
142
- "xmlns:pic": "http://schemas.openxmlformats.org/drawingml/2006/picture",
143
- "xmlns:w14": "http://schemas.microsoft.com/office/word/2010/wordml",
144
- "xmlns:wpc": "http://schemas.microsoft.com/office/word/2010/wordprocessingCanvas",
145
- "xmlns:mc": "http://schemas.openxmlformats.org/markup-compatibility/2006",
146
- "xmlns:o": "urn:schemas-microsoft-com:office:office",
147
- "xmlns:v": "urn:schemas-microsoft-com:vml",
148
- "xmlns:wp14": "http://schemas.microsoft.com/office/word/2010/wordprocessingDrawing",
149
- "xmlns:w10": "urn:schemas-microsoft-com:office:word",
150
- "xmlns:w15": "http://schemas.microsoft.com/office/word/2012/wordml",
151
- "xmlns:wpg": "http://schemas.microsoft.com/office/word/2010/wordprocessingGroup",
152
- "xmlns:wpi": "http://schemas.microsoft.com/office/word/2010/wordprocessingInk",
153
- "xmlns:wne": "http://schemas.microsoft.com/office/word/2006/wordml",
154
- "xmlns:wps": "http://schemas.microsoft.com/office/word/2010/wordprocessingShape",
155
- "xmlns:asvg": "http://schemas.microsoft.com/office/drawing/2016/SVG/main",
138
+ 'xmlns:w': 'http://schemas.openxmlformats.org/wordprocessingml/2006/main',
139
+ 'xmlns:r': 'http://schemas.openxmlformats.org/officeDocument/2006/relationships',
140
+ 'xmlns:wp': 'http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing',
141
+ 'xmlns:a': 'http://schemas.openxmlformats.org/drawingml/2006/main',
142
+ 'xmlns:pic': 'http://schemas.openxmlformats.org/drawingml/2006/picture',
143
+ 'xmlns:w14': 'http://schemas.microsoft.com/office/word/2010/wordml',
144
+ 'xmlns:wpc': 'http://schemas.microsoft.com/office/word/2010/wordprocessingCanvas',
145
+ 'xmlns:mc': 'http://schemas.openxmlformats.org/markup-compatibility/2006',
146
+ 'xmlns:o': 'urn:schemas-microsoft-com:office:office',
147
+ 'xmlns:v': 'urn:schemas-microsoft-com:vml',
148
+ 'xmlns:wp14': 'http://schemas.microsoft.com/office/word/2010/wordprocessingDrawing',
149
+ 'xmlns:w10': 'urn:schemas-microsoft-com:office:word',
150
+ 'xmlns:w15': 'http://schemas.microsoft.com/office/word/2012/wordml',
151
+ 'xmlns:wpg': 'http://schemas.microsoft.com/office/word/2010/wordprocessingGroup',
152
+ 'xmlns:wpi': 'http://schemas.microsoft.com/office/word/2010/wordprocessingInk',
153
+ 'xmlns:wne': 'http://schemas.microsoft.com/office/word/2006/wordml',
154
+ 'xmlns:wps': 'http://schemas.microsoft.com/office/word/2010/wordprocessingShape',
155
+ 'xmlns:asvg': 'http://schemas.microsoft.com/office/drawing/2016/SVG/main',
156
156
  };
157
157
  }
158
158
  static elementToString(element) {
@@ -234,25 +234,23 @@ class XMLBuilder {
234
234
  return {
235
235
  name,
236
236
  attributes: { cx, cy },
237
- selfClosing: true
237
+ selfClosing: true,
238
238
  };
239
239
  }
240
240
  static createSDT(content, options) {
241
241
  const sdtId = options?.id ?? Math.floor(Math.random() * 2000000000) - 1000000000;
242
- const sdtPrChildren = [
243
- XMLBuilder.wSelf('id', { 'w:val': sdtId })
244
- ];
242
+ const sdtPrChildren = [XMLBuilder.wSelf('id', { 'w:val': sdtId })];
245
243
  if (options?.docPartGallery) {
246
244
  sdtPrChildren.push(XMLBuilder.w('docPartObj', undefined, [
247
245
  XMLBuilder.wSelf('docPartGallery', { 'w:val': options.docPartGallery }),
248
246
  XMLBuilder.wSelf('docPartUnique', {
249
- 'w:val': options?.docPartUnique !== false ? '1' : '0'
250
- })
247
+ 'w:val': options?.docPartUnique !== false ? '1' : '0',
248
+ }),
251
249
  ]));
252
250
  }
253
251
  return XMLBuilder.w('sdt', undefined, [
254
252
  XMLBuilder.w('sdtPr', undefined, sdtPrChildren),
255
- XMLBuilder.w('sdtContent', undefined, content)
253
+ XMLBuilder.w('sdtContent', undefined, content),
256
254
  ]);
257
255
  }
258
256
  static createDocument(bodyContent, namespaces = {}, preBodyContent) {
@@ -266,37 +264,37 @@ class XMLBuilder {
266
264
  allNamespaces[key] = value;
267
265
  }
268
266
  }
269
- if (!allNamespaces["mc:Ignorable"]) {
267
+ if (!allNamespaces['mc:Ignorable']) {
270
268
  const ignorable = [];
271
- if (allNamespaces["xmlns:w14"])
272
- ignorable.push("w14");
273
- if (allNamespaces["xmlns:w15"])
274
- ignorable.push("w15");
275
- if (allNamespaces["xmlns:wp14"])
276
- ignorable.push("wp14");
277
- if (allNamespaces["xmlns:w16se"])
278
- ignorable.push("w16se");
279
- if (allNamespaces["xmlns:w16cid"])
280
- ignorable.push("w16cid");
281
- if (allNamespaces["xmlns:w16"])
282
- ignorable.push("w16");
283
- if (allNamespaces["xmlns:w16cex"])
284
- ignorable.push("w16cex");
285
- if (allNamespaces["xmlns:w16sdtdh"])
286
- ignorable.push("w16sdtdh");
287
- if (allNamespaces["xmlns:w16sdtfl"])
288
- ignorable.push("w16sdtfl");
289
- if (allNamespaces["xmlns:w16du"])
290
- ignorable.push("w16du");
291
- if (allNamespaces["xmlns:asvg"])
292
- ignorable.push("asvg");
269
+ if (allNamespaces['xmlns:w14'])
270
+ ignorable.push('w14');
271
+ if (allNamespaces['xmlns:w15'])
272
+ ignorable.push('w15');
273
+ if (allNamespaces['xmlns:wp14'])
274
+ ignorable.push('wp14');
275
+ if (allNamespaces['xmlns:w16se'])
276
+ ignorable.push('w16se');
277
+ if (allNamespaces['xmlns:w16cid'])
278
+ ignorable.push('w16cid');
279
+ if (allNamespaces['xmlns:w16'])
280
+ ignorable.push('w16');
281
+ if (allNamespaces['xmlns:w16cex'])
282
+ ignorable.push('w16cex');
283
+ if (allNamespaces['xmlns:w16sdtdh'])
284
+ ignorable.push('w16sdtdh');
285
+ if (allNamespaces['xmlns:w16sdtfl'])
286
+ ignorable.push('w16sdtfl');
287
+ if (allNamespaces['xmlns:w16du'])
288
+ ignorable.push('w16du');
289
+ if (allNamespaces['xmlns:asvg'])
290
+ ignorable.push('asvg');
293
291
  if (ignorable.length > 0) {
294
- allNamespaces["mc:Ignorable"] = ignorable.join(" ");
292
+ allNamespaces['mc:Ignorable'] = ignorable.join(' ');
295
293
  }
296
294
  }
297
295
  else {
298
296
  const defaults = XMLBuilder.createNamespaces();
299
- const prefixes = allNamespaces["mc:Ignorable"].split(/\s+/);
297
+ const prefixes = allNamespaces['mc:Ignorable'].split(/\s+/);
300
298
  for (const prefix of prefixes) {
301
299
  const nsKey = `xmlns:${prefix}`;
302
300
  if (!allNamespaces[nsKey] && defaults[nsKey]) {
@@ -308,15 +306,15 @@ class XMLBuilder {
308
306
  if (preBodyContent) {
309
307
  documentChildren.push(...preBodyContent);
310
308
  }
311
- documentChildren.push(XMLBuilder.w("body", undefined, bodyContent));
312
- builder.element("w:document", allNamespaces, documentChildren);
309
+ documentChildren.push(XMLBuilder.w('body', undefined, bodyContent));
310
+ builder.element('w:document', allNamespaces, documentChildren);
313
311
  return builder.build(true);
314
312
  }
315
313
  static buildObject(obj, rootName) {
316
314
  const builder = new XMLBuilder();
317
315
  const element = XMLBuilder.objectToElement(obj, rootName);
318
316
  if (element) {
319
- if (typeof element === "string") {
317
+ if (typeof element === 'string') {
320
318
  builder.text(element);
321
319
  }
322
320
  else {
@@ -329,22 +327,22 @@ class XMLBuilder {
329
327
  if (obj === null || obj === undefined) {
330
328
  return null;
331
329
  }
332
- if (typeof obj !== "object" || obj === null) {
330
+ if (typeof obj !== 'object' || obj === null) {
333
331
  return String(obj);
334
332
  }
335
333
  const attributes = {};
336
334
  const children = [];
337
- if (obj["#text"] && Object.keys(obj).length === 1) {
338
- return String(obj["#text"]);
335
+ if (obj['#text'] && Object.keys(obj).length === 1) {
336
+ return String(obj['#text']);
339
337
  }
340
338
  for (const key in obj) {
341
- if (key.startsWith("@_")) {
339
+ if (key.startsWith('@_')) {
342
340
  const attrName = key.substring(2);
343
341
  if (attrName.length > 0) {
344
342
  attributes[attrName] = obj[key];
345
343
  }
346
344
  }
347
- else if (key === "#text") {
345
+ else if (key === '#text') {
348
346
  children.push(String(obj[key]));
349
347
  }
350
348
  else {
@@ -391,7 +389,7 @@ class XMLBuilder {
391
389
  'w:val': border.style || 'single',
392
390
  'w:sz': border.size,
393
391
  'w:color': border.color,
394
- 'w:space': border.space
392
+ 'w:space': border.space,
395
393
  });
396
394
  return XMLBuilder.wSelf(side, attrs);
397
395
  }
@@ -1 +1 @@
1
- {"version":3,"file":"XMLBuilder.js","sourceRoot":"","sources":["../../src/xml/XMLBuilder.ts"],"names":[],"mappings":"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","sourcesContent":["/**\r\n * XMLBuilder - Utility for building XML content\r\n * Provides a simple fluent API for generating WordprocessingML XML\r\n */\r\n\r\nimport { removeInvalidXmlChars } from \"../utils/xmlSanitization\";\r\nimport type { ShadingConfig } from \"../elements/CommonTypes\";\r\nimport { buildShadingAttributes } from \"../elements/CommonTypes\";\r\n\r\n/** Represents a parsed XML object from XMLParser.parseToObject() */\r\n// eslint-disable-next-line @typescript-eslint/no-explicit-any -- parsed XML has dynamic keys and recursive structure\r\ntype ParsedXmlObject = Record<string, any>;\r\n\r\n/**\r\n * Represents an XML element with attributes and children\r\n */\r\nexport interface XMLElement {\r\n name: string;\r\n attributes?: Record<string, string | number | boolean | undefined>;\r\n children?: (XMLElement | string)[];\r\n selfClosing?: boolean;\r\n /** Raw XML content to include without escaping (used for VML passthrough) */\r\n rawXml?: string;\r\n}\r\n\r\n/**\r\n * XML Builder for creating WordprocessingML XML\r\n */\r\nexport class XMLBuilder {\r\n private elements: (XMLElement | string)[] = [];\r\n\r\n /**\r\n * Elements that must NEVER be self-closing in Word XML per ECMA-376.\r\n * Self-closing these elements causes Word to not parse correctly or lose content.\r\n */\r\n private static readonly CANNOT_SELF_CLOSE = [\r\n \"w:t\",\r\n \"w:r\",\r\n \"w:p\",\r\n \"w:tbl\",\r\n \"w:tr\",\r\n \"w:tc\",\r\n \"w:body\",\r\n \"w:document\",\r\n \"w:hyperlink\",\r\n \"w:sdt\",\r\n \"w:sdtContent\",\r\n \"w:sdtPr\",\r\n \"w:pPr\",\r\n \"w:rPr\",\r\n \"w:sectPr\",\r\n \"w:del\", // Deletion revisions - container element, must have closing tag\r\n \"w:ins\", // Insertion revisions - container element, must have closing tag\r\n \"w:moveFrom\", // Move source markers - container element\r\n \"w:moveTo\", // Move destination markers - container element\r\n // Note: w:bookmarkStart and w:bookmarkEnd MUST be self-closing per ECMA-376\r\n ];\r\n\r\n /**\r\n * Adds an element to the builder\r\n * @param name - Element name (with namespace prefix if needed)\r\n * @param attributes - Element attributes\r\n * @param children - Child elements or text\r\n * @returns This builder for chaining\r\n */\r\n element(\r\n name: string,\r\n attributes?: Record<string, string | number | boolean | undefined>,\r\n children?: (XMLElement | string)[]\r\n ): XMLBuilder {\r\n this.elements.push({\r\n name,\r\n attributes,\r\n children,\r\n });\r\n return this;\r\n }\r\n\r\n /**\r\n * Adds a self-closing element\r\n * @param name - Element name\r\n * @param attributes - Element attributes\r\n * @returns This builder for chaining\r\n * @throws {Error} If attempting to create self-closing w:t element (not allowed per ECMA-376)\r\n */\r\n selfClosingElement(\r\n name: string,\r\n attributes?: Record<string, string | number | boolean | undefined>\r\n ): XMLBuilder {\r\n // Validation: Text elements (<w:t>) cannot be self-closing per ECMA-376\r\n // Self-closing <w:t/> elements cause Word to fail opening the document\r\n if (name === 'w:t' || name === 't') {\r\n throw new Error(\r\n 'Text elements (<w:t>) cannot be self-closing per ECMA-376. ' +\r\n 'Use element() with empty text content instead: XMLBuilder.w(\"t\", attrs, [\"\"])'\r\n );\r\n }\r\n\r\n this.elements.push({\r\n name,\r\n attributes,\r\n selfClosing: true,\r\n });\r\n return this;\r\n }\r\n\r\n /**\r\n * Adds text content\r\n * @param text - Text to add\r\n * @returns This builder for chaining\r\n */\r\n text(text: string): XMLBuilder {\r\n this.elements.push(text);\r\n return this;\r\n }\r\n\r\n /**\r\n * Builds the XML string\r\n * @param includeDeclaration - Whether to include XML declaration\r\n * @returns Generated XML string\r\n */\r\n build(includeDeclaration = false): string {\r\n let xml = \"\";\r\n\r\n if (includeDeclaration) {\r\n xml += '<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\\n';\r\n }\r\n\r\n xml += this.elementsToString(this.elements);\r\n return xml;\r\n }\r\n\r\n /**\r\n * Converts elements to XML string\r\n */\r\n private elementsToString(elements: (XMLElement | string)[]): string {\r\n let xml = \"\";\r\n\r\n for (const element of elements) {\r\n if (typeof element === \"string\") {\r\n xml += this.escapeXml(element);\r\n } else {\r\n xml += this.elementToString(element);\r\n }\r\n }\r\n\r\n return xml;\r\n }\r\n\r\n /**\r\n * Converts a single element to XML string\r\n */\r\n private elementToString(element: XMLElement): string {\r\n // Special case: raw XML passthrough (no wrapper element)\r\n // Used for VML and other legacy content that must be preserved exactly\r\n if (element.name === \"__rawXml\" && element.rawXml) {\r\n return element.rawXml;\r\n }\r\n\r\n let xml = `<${element.name}`;\r\n\r\n // Add attributes\r\n if (element.attributes) {\r\n for (const [key, value] of Object.entries(element.attributes)) {\r\n if (value !== undefined && value !== null && value !== false) {\r\n // Handle boolean attributes\r\n const attrValue = value === true ? key : String(value);\r\n // Use escapeXmlAttribute for attribute values (Issue #8)\r\n xml += ` ${key}=\"${XMLBuilder.escapeXmlAttribute(attrValue)}\"`;\r\n }\r\n }\r\n }\r\n\r\n // Self-closing element validation\r\n if (element.selfClosing) {\r\n if (XMLBuilder.CANNOT_SELF_CLOSE.includes(element.name)) {\r\n // Instead of throwing, force open/close tags for safety\r\n xml += \"></\" + element.name + \">\";\r\n return xml;\r\n }\r\n xml += \"/>\";\r\n return xml;\r\n }\r\n\r\n xml += \">\";\r\n\r\n // Add raw XML content if present (for VML passthrough)\r\n if (element.rawXml) {\r\n xml += element.rawXml;\r\n }\r\n\r\n // Add children\r\n if (element.children && element.children.length > 0) {\r\n xml += this.elementsToString(element.children);\r\n }\r\n\r\n xml += `</${element.name}>`;\r\n return xml;\r\n }\r\n\r\n /**\r\n * Escapes special XML characters for text content\r\n * (Issue #8 fix: Use escapeXmlText for element text, escapeXmlAttribute called directly for attrs)\r\n */\r\n private escapeXml(text: string): string {\r\n // This method is now only used for text content in elementsToString()\r\n // Attributes call escapeXmlAttribute() directly in elementToString()\r\n // Text content should NOT escape quotes (only & < >)\r\n return XMLBuilder.escapeXmlText(text);\r\n }\r\n\r\n /**\r\n * Escapes XML text content (element text nodes)\r\n * Removes invalid XML 1.0 control characters and escapes: & < >\r\n *\r\n * Per XML 1.0 spec, control chars 0x00-0x08, 0x0B-0x0C, 0x0E-0x1F, 0x7F are invalid.\r\n * Tab (0x09), newline (0x0A), and CR (0x0D) are preserved.\r\n *\r\n * @param text Text to escape\r\n * @returns Escaped text safe for XML content\r\n */\r\n static escapeXmlText(text: string): string {\r\n return removeInvalidXmlChars(text)\r\n .replace(/&/g, \"&amp;\")\r\n .replace(/</g, \"&lt;\")\r\n .replace(/>/g, \"&gt;\");\r\n }\r\n\r\n /**\r\n * Escapes XML attribute values\r\n * Removes invalid XML 1.0 control characters and escapes: & < > \" '\r\n *\r\n * Per XML 1.0 spec, control chars 0x00-0x08, 0x0B-0x0C, 0x0E-0x1F, 0x7F are invalid.\r\n * Tab (0x09), newline (0x0A), and CR (0x0D) are preserved.\r\n *\r\n * @param value Attribute value to escape\r\n * @returns Escaped value safe for XML attributes\r\n */\r\n static escapeXmlAttribute(value: string): string {\r\n return removeInvalidXmlChars(value)\r\n .replace(/&/g, \"&amp;\")\r\n .replace(/</g, \"&lt;\")\r\n .replace(/>/g, \"&gt;\")\r\n .replace(/\"/g, \"&quot;\")\r\n .replace(/'/g, \"&apos;\");\r\n }\r\n\r\n /**\r\n * Unescapes XML entities back to original characters\r\n * @param text Text with XML entities\r\n * @returns Unescaped text\r\n */\r\n static unescapeXml(text: string): string {\r\n return text\r\n .replace(/&lt;/g, \"<\")\r\n .replace(/&gt;/g, \">\")\r\n .replace(/&quot;/g, '\"')\r\n .replace(/&apos;/g, \"'\")\r\n .replace(/&amp;/g, \"&\"); // Must be last to avoid double-unescaping\r\n }\r\n\r\n /**\r\n * Sanitizes and escapes XML content for safe inclusion in XML documents\r\n * Removes control characters, null bytes, and escapes special XML characters\r\n * Use this for user-provided content that may contain unsafe characters\r\n *\r\n * Per XML 1.0 spec, control chars 0x00-0x08, 0x0B-0x0C, 0x0E-0x1F, 0x7F are invalid.\r\n * Tab (0x09), newline (0x0A), and CR (0x0D) are preserved.\r\n *\r\n * @param text Text to sanitize and escape\r\n * @returns Sanitized text safe for XML content\r\n *\r\n * **Issue #11 fix:** Prevents malformed XML from CDATA markers, control chars, etc.\r\n */\r\n static sanitizeXmlContent(text: string): string {\r\n return (\r\n removeInvalidXmlChars(text)\r\n // Escape CDATA end marker to prevent CDATA injection\r\n .replace(/\\]\\]>/g, \"]]&gt;\")\r\n // Standard XML escaping (& must be first to avoid double-escaping)\r\n .replace(/&/g, \"&amp;\")\r\n .replace(/</g, \"&lt;\")\r\n .replace(/>/g, \"&gt;\")\r\n );\r\n }\r\n\r\n /**\r\n * Creates a WordprocessingML namespace attribute object\r\n */\r\n static createNamespaces(): Record<string, string> {\r\n return {\r\n \"xmlns:w\": \"http://schemas.openxmlformats.org/wordprocessingml/2006/main\",\r\n \"xmlns:r\":\r\n \"http://schemas.openxmlformats.org/officeDocument/2006/relationships\",\r\n \"xmlns:wp\":\r\n \"http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing\",\r\n \"xmlns:a\": \"http://schemas.openxmlformats.org/drawingml/2006/main\",\r\n \"xmlns:pic\": \"http://schemas.openxmlformats.org/drawingml/2006/picture\",\r\n \"xmlns:w14\": \"http://schemas.microsoft.com/office/word/2010/wordml\",\r\n \"xmlns:wpc\":\r\n \"http://schemas.microsoft.com/office/word/2010/wordprocessingCanvas\",\r\n \"xmlns:mc\": \"http://schemas.openxmlformats.org/markup-compatibility/2006\",\r\n \"xmlns:o\": \"urn:schemas-microsoft-com:office:office\",\r\n \"xmlns:v\": \"urn:schemas-microsoft-com:vml\",\r\n \"xmlns:wp14\":\r\n \"http://schemas.microsoft.com/office/word/2010/wordprocessingDrawing\",\r\n \"xmlns:w10\": \"urn:schemas-microsoft-com:office:word\",\r\n \"xmlns:w15\": \"http://schemas.microsoft.com/office/word/2012/wordml\",\r\n \"xmlns:wpg\":\r\n \"http://schemas.microsoft.com/office/word/2010/wordprocessingGroup\",\r\n \"xmlns:wpi\":\r\n \"http://schemas.microsoft.com/office/word/2010/wordprocessingInk\",\r\n \"xmlns:wne\": \"http://schemas.microsoft.com/office/word/2006/wordml\",\r\n \"xmlns:wps\":\r\n \"http://schemas.microsoft.com/office/word/2010/wordprocessingShape\",\r\n \"xmlns:asvg\":\r\n \"http://schemas.microsoft.com/office/drawing/2016/SVG/main\",\r\n };\r\n }\r\n\r\n /**\r\n * Converts a single XMLElement to its XML string representation\r\n * Useful for merging elements into existing XML\r\n *\r\n * @param element - The XMLElement to convert\r\n * @returns XML string representation of the element\r\n */\r\n static elementToString(element: XMLElement): string {\r\n const builder = new XMLBuilder();\r\n // Use the private elementToString via the elements array + build\r\n (builder as any).elements.push(element);\r\n return builder.build();\r\n }\r\n\r\n /**\r\n * Helper method to create a WordprocessingML element\r\n * @param name - Element name (without 'w:' prefix)\r\n * @param attributes - Element attributes\r\n * @param children - Child elements\r\n * @returns XMLElement\r\n */\r\n static w(\r\n name: string,\r\n attributes?: Record<string, string | number | boolean | undefined>,\r\n children?: (XMLElement | string)[]\r\n ): XMLElement {\r\n return {\r\n name: `w:${name}`,\r\n attributes,\r\n children,\r\n };\r\n }\r\n\r\n /**\r\n * Helper method to create a self-closing WordprocessingML element\r\n * @param name - Element name (without 'w:' prefix)\r\n * @param attributes - Element attributes\r\n * @returns XMLElement\r\n */\r\n static wSelf(\r\n name: string,\r\n attributes?: Record<string, string | number | boolean | undefined>\r\n ): XMLElement {\r\n return {\r\n name: `w:${name}`,\r\n attributes,\r\n selfClosing: true,\r\n };\r\n }\r\n\r\n /**\r\n * Helper method to create a w14 element (Word 2010+ features)\r\n * @param name - Element name (without 'w14:' prefix)\r\n * @param attributes - Element attributes\r\n * @param children - Child elements\r\n * @returns XMLElement\r\n */\r\n static w14(\r\n name: string,\r\n attributes?: Record<string, string | number | boolean | undefined>,\r\n children?: (XMLElement | string)[]\r\n ): XMLElement {\r\n return {\r\n name: `w14:${name}`,\r\n attributes,\r\n children,\r\n };\r\n }\r\n\r\n /**\r\n * Helper method to create a self-closing w14 element\r\n * @param name - Element name (without 'w14:' prefix)\r\n * @param attributes - Element attributes\r\n * @returns XMLElement\r\n */\r\n static w14Self(\r\n name: string,\r\n attributes?: Record<string, string | number | boolean | undefined>\r\n ): XMLElement {\r\n return {\r\n name: `w14:${name}`,\r\n attributes,\r\n selfClosing: true,\r\n };\r\n }\r\n\r\n /**\r\n * Helper method to create a DrawingML element (a: namespace)\r\n * @param name - Element name (without 'a:' prefix)\r\n * @param attributes - Element attributes\r\n * @param children - Child elements\r\n * @returns XMLElement\r\n */\r\n static a(\r\n name: string,\r\n attributes?: Record<string, string | number | boolean | undefined>,\r\n children?: (XMLElement | string)[]\r\n ): XMLElement {\r\n return {\r\n name: `a:${name}`,\r\n attributes,\r\n children,\r\n };\r\n }\r\n\r\n /**\r\n * Helper method to create a self-closing DrawingML element\r\n * @param name - Element name (without 'a:' prefix)\r\n * @param attributes - Element attributes\r\n * @returns XMLElement\r\n */\r\n static aSelf(\r\n name: string,\r\n attributes?: Record<string, string | number | boolean | undefined>\r\n ): XMLElement {\r\n return {\r\n name: `a:${name}`,\r\n attributes,\r\n selfClosing: true,\r\n };\r\n }\r\n\r\n /**\r\n * Helper method to create a Picture element (pic: namespace)\r\n * @param name - Element name (without 'pic:' prefix)\r\n * @param attributes - Element attributes\r\n * @param children - Child elements\r\n * @returns XMLElement\r\n */\r\n static pic(\r\n name: string,\r\n attributes?: Record<string, string | number | boolean | undefined>,\r\n children?: (XMLElement | string)[]\r\n ): XMLElement {\r\n return {\r\n name: `pic:${name}`,\r\n attributes,\r\n children,\r\n };\r\n }\r\n\r\n /**\r\n * Helper method to create a self-closing Picture element\r\n * @param name - Element name (without 'pic:' prefix)\r\n * @param attributes - Element attributes\r\n * @returns XMLElement\r\n */\r\n static picSelf(\r\n name: string,\r\n attributes?: Record<string, string | number | boolean | undefined>\r\n ): XMLElement {\r\n return {\r\n name: `pic:${name}`,\r\n attributes,\r\n selfClosing: true,\r\n };\r\n }\r\n\r\n /**\r\n * Helper method to create a Wordprocessing Drawing element (wp: namespace)\r\n * @param name - Element name (without 'wp:' prefix)\r\n * @param attributes - Element attributes\r\n * @param children - Child elements\r\n * @returns XMLElement\r\n */\r\n static wp(\r\n name: string,\r\n attributes?: Record<string, string | number | boolean | undefined>,\r\n children?: (XMLElement | string)[]\r\n ): XMLElement {\r\n return {\r\n name: `wp:${name}`,\r\n attributes,\r\n children,\r\n };\r\n }\r\n\r\n /**\r\n * Helper method to create a self-closing Wordprocessing Drawing element\r\n * @param name - Element name (without 'wp:' prefix)\r\n * @param attributes - Element attributes\r\n * @returns XMLElement\r\n */\r\n static wpSelf(\r\n name: string,\r\n attributes?: Record<string, string | number | boolean | undefined>\r\n ): XMLElement {\r\n return {\r\n name: `wp:${name}`,\r\n attributes,\r\n selfClosing: true,\r\n };\r\n }\r\n\r\n /**\r\n * Helper to create cx/cy extent attributes (for a:ext, wp:extent, etc.)\r\n * @param name - Element name (e.g., 'ext')\r\n * @param cx - Width in EMUs\r\n * @param cy - Height in EMUs\r\n * @returns Self-closing XMLElement\r\n */\r\n static cxCy(\r\n name: string,\r\n cx: number,\r\n cy: number\r\n ): XMLElement {\r\n return {\r\n name,\r\n attributes: { cx, cy },\r\n selfClosing: true\r\n };\r\n }\r\n\r\n /**\r\n * Creates an SDT (Structured Document Tag) wrapper for content\r\n * @param content - Content to wrap (paragraphs, tables, etc.)\r\n * @param options - SDT options\r\n * @returns XMLElement representing the SDT wrapper\r\n */\r\n static createSDT(\r\n content: XMLElement[],\r\n options?: {\r\n id?: number;\r\n docPartGallery?: string;\r\n docPartUnique?: boolean;\r\n }\r\n ): XMLElement {\r\n const sdtId = options?.id ?? Math.floor(Math.random() * 2000000000) - 1000000000;\r\n\r\n // Build SDT properties\r\n const sdtPrChildren: XMLElement[] = [\r\n XMLBuilder.wSelf('id', { 'w:val': sdtId })\r\n ];\r\n\r\n // Add docPartObj if docPartGallery is specified\r\n if (options?.docPartGallery) {\r\n sdtPrChildren.push(\r\n XMLBuilder.w('docPartObj', undefined, [\r\n XMLBuilder.wSelf('docPartGallery', { 'w:val': options.docPartGallery }),\r\n XMLBuilder.wSelf('docPartUnique', {\r\n 'w:val': options?.docPartUnique !== false ? '1' : '0'\r\n })\r\n ])\r\n );\r\n }\r\n\r\n // Create complete SDT structure\r\n return XMLBuilder.w('sdt', undefined, [\r\n XMLBuilder.w('sdtPr', undefined, sdtPrChildren),\r\n XMLBuilder.w('sdtContent', undefined, content)\r\n ]);\r\n }\r\n\r\n /**\r\n * Creates a complete WordprocessingML document structure\r\n * @param bodyContent - Content for the document body\r\n * @returns XML string for word/document.xml\r\n */\r\n static createDocument(\r\n bodyContent: XMLElement[],\r\n namespaces: Record<string, string> = {},\r\n preBodyContent?: XMLElement[]\r\n ): string {\r\n const builder = new XMLBuilder();\r\n\r\n // Preserve document's original namespace order, then fill in framework defaults\r\n const allNamespaces: Record<string, string> = {};\r\n for (const [key, value] of Object.entries(namespaces)) {\r\n allNamespaces[key] = value;\r\n }\r\n for (const [key, value] of Object.entries(XMLBuilder.createNamespaces())) {\r\n if (!(key in allNamespaces)) {\r\n allNamespaces[key] = value;\r\n }\r\n }\r\n\r\n // Ensure mc:Ignorable is present when extended namespaces are declared.\r\n // Per ECMA-376, mc:Ignorable tells Word which namespace prefixes can be\r\n // safely ignored if the processor doesn't support them. Without it,\r\n // attributes like w14:paraId in raw XML passthrough zones cause corruption.\r\n if (!allNamespaces[\"mc:Ignorable\"]) {\r\n const ignorable: string[] = [];\r\n if (allNamespaces[\"xmlns:w14\"]) ignorable.push(\"w14\");\r\n if (allNamespaces[\"xmlns:w15\"]) ignorable.push(\"w15\");\r\n if (allNamespaces[\"xmlns:wp14\"]) ignorable.push(\"wp14\");\r\n if (allNamespaces[\"xmlns:w16se\"]) ignorable.push(\"w16se\");\r\n if (allNamespaces[\"xmlns:w16cid\"]) ignorable.push(\"w16cid\");\r\n if (allNamespaces[\"xmlns:w16\"]) ignorable.push(\"w16\");\r\n if (allNamespaces[\"xmlns:w16cex\"]) ignorable.push(\"w16cex\");\r\n if (allNamespaces[\"xmlns:w16sdtdh\"]) ignorable.push(\"w16sdtdh\");\r\n if (allNamespaces[\"xmlns:w16sdtfl\"]) ignorable.push(\"w16sdtfl\");\r\n if (allNamespaces[\"xmlns:w16du\"]) ignorable.push(\"w16du\");\r\n if (allNamespaces[\"xmlns:asvg\"]) ignorable.push(\"asvg\");\r\n if (ignorable.length > 0) {\r\n allNamespaces[\"mc:Ignorable\"] = ignorable.join(\" \");\r\n }\r\n } else {\r\n // mc:Ignorable was loaded from the original document — ensure every\r\n // prefix referenced in mc:Ignorable has a matching xmlns declaration.\r\n // Without this, the validator rejects prefixes that appear in\r\n // mc:Ignorable but lack namespace declarations in the root element.\r\n const defaults = XMLBuilder.createNamespaces();\r\n const prefixes = allNamespaces[\"mc:Ignorable\"].split(/\\s+/);\r\n for (const prefix of prefixes) {\r\n const nsKey = `xmlns:${prefix}`;\r\n if (!allNamespaces[nsKey] && defaults[nsKey]) {\r\n allNamespaces[nsKey] = defaults[nsKey];\r\n }\r\n }\r\n }\r\n\r\n const documentChildren: XMLElement[] = [];\r\n if (preBodyContent) {\r\n documentChildren.push(...preBodyContent);\r\n }\r\n documentChildren.push(XMLBuilder.w(\"body\", undefined, bodyContent));\r\n builder.element(\"w:document\", allNamespaces, documentChildren);\r\n\r\n return builder.build(true);\r\n }\r\n\r\n /**\r\n * Builds an XML string from a JavaScript object.\r\n * This is the reverse of XMLParser.parseToObject\r\n */\r\n static buildObject(obj: ParsedXmlObject, rootName: string): string {\r\n const builder = new XMLBuilder();\r\n const element = XMLBuilder.objectToElement(obj, rootName);\r\n if (element) {\r\n if (typeof element === \"string\") {\r\n builder.text(element);\r\n } else {\r\n builder.elements.push(element);\r\n }\r\n }\r\n return builder.build();\r\n }\r\n\r\n /**\r\n * Converts a JavaScript object to an XMLElement.\r\n * @private\r\n */\r\n private static objectToElement(\r\n obj: ParsedXmlObject | string | number | boolean | null | undefined,\r\n name: string\r\n ): XMLElement | string | null {\r\n if (obj === null || obj === undefined) {\r\n return null;\r\n }\r\n\r\n if (typeof obj !== \"object\" || obj === null) {\r\n return String(obj);\r\n }\r\n\r\n const attributes: Record<string, string | number | boolean> = {};\r\n const children: (XMLElement | string)[] = [];\r\n\r\n if (obj[\"#text\"] && Object.keys(obj).length === 1) {\r\n return String(obj[\"#text\"]);\r\n }\r\n\r\n for (const key in obj) {\r\n if (key.startsWith(\"@_\")) {\r\n const attrName = key.substring(2);\r\n // Validate attribute name is not empty after prefix removal\r\n if (attrName.length > 0) {\r\n attributes[attrName] = obj[key];\r\n }\r\n } else if (key === \"#text\") {\r\n children.push(String(obj[key]));\r\n } else {\r\n const childObj = obj[key];\r\n if (Array.isArray(childObj)) {\r\n childObj.forEach((item) => {\r\n const childElement = XMLBuilder.objectToElement(item, key);\r\n if (childElement) {\r\n children.push(childElement);\r\n }\r\n });\r\n } else {\r\n const childElement = XMLBuilder.objectToElement(childObj, key);\r\n if (childElement) {\r\n children.push(childElement);\r\n }\r\n }\r\n }\r\n }\r\n\r\n const element: XMLElement = {\r\n name,\r\n attributes,\r\n children: children.length > 0 ? children : undefined,\r\n };\r\n\r\n if (!element.children || element.children.length === 0) {\r\n if (!XMLBuilder.CANNOT_SELF_CLOSE.includes(name)) {\r\n element.selfClosing = true;\r\n }\r\n }\r\n\r\n return element;\r\n }\r\n\r\n /**\r\n * Helper method to build attributes object, filtering out undefined/null values\r\n * This simplifies the common pattern of conditionally adding attributes\r\n *\r\n * @param mapping - Map of attribute names to values\r\n * @returns Filtered attributes object with only defined values\r\n *\r\n * @example\r\n * ```typescript\r\n * const attrs = XMLBuilder.buildAttributes({\r\n * 'w:before': spacing?.before,\r\n * 'w:after': spacing?.after,\r\n * 'w:line': spacing?.line\r\n * });\r\n * // Returns only attributes with defined values\r\n * ```\r\n */\r\n static buildAttributes(mapping: Record<string, any>): Record<string, string | number> {\r\n const attrs: Record<string, string | number> = {};\r\n for (const [key, value] of Object.entries(mapping)) {\r\n if (value !== undefined && value !== null) {\r\n attrs[key] = value;\r\n }\r\n }\r\n return attrs;\r\n }\r\n\r\n /**\r\n * Creates a border element for WordprocessingML\r\n * Used for table borders, cell borders, and paragraph borders\r\n *\r\n * @param side - Border side (e.g., 'top', 'left', 'bottom', 'right', 'insideH', 'insideV')\r\n * @param border - Border definition\r\n * @returns XML element for border\r\n *\r\n * @example\r\n * ```typescript\r\n * const border = XMLBuilder.createBorder('top', {\r\n * style: 'single',\r\n * size: 4,\r\n * color: 'FF0000',\r\n * space: 0\r\n * });\r\n * ```\r\n */\r\n static createBorder(\r\n side: string,\r\n border: {\r\n style?: string;\r\n size?: number;\r\n color?: string;\r\n space?: number;\r\n }\r\n ): XMLElement {\r\n const attrs = XMLBuilder.buildAttributes({\r\n 'w:val': border.style || 'single',\r\n 'w:sz': border.size,\r\n 'w:color': border.color,\r\n 'w:space': border.space\r\n });\r\n\r\n return XMLBuilder.wSelf(side, attrs);\r\n }\r\n\r\n /**\r\n * Creates a shading element for WordprocessingML\r\n * Used for paragraph shading, table shading, and cell shading\r\n *\r\n * @param shading - Shading definition (ShadingConfig with theme support)\r\n * @returns XML element for shading, or null if no shading properties\r\n *\r\n * @example\r\n * ```typescript\r\n * const shading = XMLBuilder.createShading({\r\n * fill: 'FFFF00',\r\n * pattern: 'clear',\r\n * color: '000000'\r\n * });\r\n * ```\r\n */\r\n static createShading(shading: ShadingConfig): XMLElement | null {\r\n const attrs = buildShadingAttributes(shading);\r\n // Default w:val to \"clear\" if not specified but other attrs exist\r\n if (!attrs['w:val'] && Object.keys(attrs).length > 0) {\r\n attrs['w:val'] = 'clear';\r\n }\r\n if (Object.keys(attrs).length > 0) {\r\n return XMLBuilder.wSelf('shd', attrs);\r\n }\r\n return null;\r\n }\r\n\r\n /**\r\n * Creates a margins element (tcMar, pgMar, etc.)\r\n * Used for cell margins, page margins, etc.\r\n *\r\n * @param type - Margin type element name (e.g., 'tcMar', 'pgMar')\r\n * @param margins - Margin values in twips\r\n * @returns XML element for margins, or null if no margins defined\r\n *\r\n * @example\r\n * ```typescript\r\n * const margins = XMLBuilder.createMargins('tcMar', {\r\n * top: 100,\r\n * bottom: 100,\r\n * left: 100,\r\n * right: 100\r\n * });\r\n * ```\r\n */\r\n static createMargins(\r\n type: string,\r\n margins: {\r\n top?: number;\r\n bottom?: number;\r\n left?: number;\r\n right?: number;\r\n start?: number;\r\n end?: number;\r\n }\r\n ): XMLElement | null {\r\n const children: XMLElement[] = [];\r\n\r\n if (margins.top !== undefined) {\r\n children.push(XMLBuilder.wSelf('top', { 'w:w': margins.top, 'w:type': 'dxa' }));\r\n }\r\n if (margins.bottom !== undefined) {\r\n children.push(XMLBuilder.wSelf('bottom', { 'w:w': margins.bottom, 'w:type': 'dxa' }));\r\n }\r\n if (margins.left !== undefined) {\r\n children.push(XMLBuilder.wSelf('left', { 'w:w': margins.left, 'w:type': 'dxa' }));\r\n }\r\n if (margins.right !== undefined) {\r\n children.push(XMLBuilder.wSelf('right', { 'w:w': margins.right, 'w:type': 'dxa' }));\r\n }\r\n if (margins.start !== undefined) {\r\n children.push(XMLBuilder.wSelf('start', { 'w:w': margins.start, 'w:type': 'dxa' }));\r\n }\r\n if (margins.end !== undefined) {\r\n children.push(XMLBuilder.wSelf('end', { 'w:w': margins.end, 'w:type': 'dxa' }));\r\n }\r\n\r\n if (children.length > 0) {\r\n return XMLBuilder.w(type, undefined, children);\r\n }\r\n return null;\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"XMLBuilder.js","sourceRoot":"","sources":["../../src/xml/XMLBuilder.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * XMLBuilder - Utility for building XML content\n * Provides a simple fluent API for generating WordprocessingML XML\n */\n\nimport { removeInvalidXmlChars } from '../utils/xmlSanitization';\nimport type { ShadingConfig } from '../elements/CommonTypes';\nimport { buildShadingAttributes } from '../elements/CommonTypes';\n\n/** Represents a parsed XML object from XMLParser.parseToObject() */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any -- parsed XML has dynamic keys and recursive structure\ntype ParsedXmlObject = Record<string, any>;\n\n/**\n * Represents an XML element with attributes and children\n */\nexport interface XMLElement {\n name: string;\n attributes?: Record<string, string | number | boolean | undefined>;\n children?: (XMLElement | string)[];\n selfClosing?: boolean;\n /** Raw XML content to include without escaping (used for VML passthrough) */\n rawXml?: string;\n}\n\n/**\n * XML Builder for creating WordprocessingML XML\n */\nexport class XMLBuilder {\n private elements: (XMLElement | string)[] = [];\n\n /**\n * Elements that must NEVER be self-closing in Word XML per ECMA-376.\n * Self-closing these elements causes Word to not parse correctly or lose content.\n */\n private static readonly CANNOT_SELF_CLOSE = [\n 'w:t',\n 'w:r',\n 'w:p',\n 'w:tbl',\n 'w:tr',\n 'w:tc',\n 'w:body',\n 'w:document',\n 'w:hyperlink',\n 'w:sdt',\n 'w:sdtContent',\n 'w:sdtPr',\n 'w:pPr',\n 'w:rPr',\n 'w:sectPr',\n 'w:del', // Deletion revisions - container element, must have closing tag\n 'w:ins', // Insertion revisions - container element, must have closing tag\n 'w:moveFrom', // Move source markers - container element\n 'w:moveTo', // Move destination markers - container element\n // Note: w:bookmarkStart and w:bookmarkEnd MUST be self-closing per ECMA-376\n ];\n\n /**\n * Adds an element to the builder\n * @param name - Element name (with namespace prefix if needed)\n * @param attributes - Element attributes\n * @param children - Child elements or text\n * @returns This builder for chaining\n */\n element(\n name: string,\n attributes?: Record<string, string | number | boolean | undefined>,\n children?: (XMLElement | string)[]\n ): XMLBuilder {\n this.elements.push({\n name,\n attributes,\n children,\n });\n return this;\n }\n\n /**\n * Adds a self-closing element\n * @param name - Element name\n * @param attributes - Element attributes\n * @returns This builder for chaining\n * @throws {Error} If attempting to create self-closing w:t element (not allowed per ECMA-376)\n */\n selfClosingElement(\n name: string,\n attributes?: Record<string, string | number | boolean | undefined>\n ): XMLBuilder {\n // Validation: Text elements (<w:t>) cannot be self-closing per ECMA-376\n // Self-closing <w:t/> elements cause Word to fail opening the document\n if (name === 'w:t' || name === 't') {\n throw new Error(\n 'Text elements (<w:t>) cannot be self-closing per ECMA-376. ' +\n 'Use element() with empty text content instead: XMLBuilder.w(\"t\", attrs, [\"\"])'\n );\n }\n\n this.elements.push({\n name,\n attributes,\n selfClosing: true,\n });\n return this;\n }\n\n /**\n * Adds text content\n * @param text - Text to add\n * @returns This builder for chaining\n */\n text(text: string): XMLBuilder {\n this.elements.push(text);\n return this;\n }\n\n /**\n * Builds the XML string\n * @param includeDeclaration - Whether to include XML declaration\n * @returns Generated XML string\n */\n build(includeDeclaration = false): string {\n let xml = '';\n\n if (includeDeclaration) {\n xml += '<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\\n';\n }\n\n xml += this.elementsToString(this.elements);\n return xml;\n }\n\n /**\n * Converts elements to XML string\n */\n private elementsToString(elements: (XMLElement | string)[]): string {\n let xml = '';\n\n for (const element of elements) {\n if (typeof element === 'string') {\n xml += this.escapeXml(element);\n } else {\n xml += this.elementToString(element);\n }\n }\n\n return xml;\n }\n\n /**\n * Converts a single element to XML string\n */\n private elementToString(element: XMLElement): string {\n // Special case: raw XML passthrough (no wrapper element)\n // Used for VML and other legacy content that must be preserved exactly\n if (element.name === '__rawXml' && element.rawXml) {\n return element.rawXml;\n }\n\n let xml = `<${element.name}`;\n\n // Add attributes\n if (element.attributes) {\n for (const [key, value] of Object.entries(element.attributes)) {\n if (value !== undefined && value !== null && value !== false) {\n // Handle boolean attributes\n const attrValue = value === true ? key : String(value);\n // Use escapeXmlAttribute for attribute values (Issue #8)\n xml += ` ${key}=\"${XMLBuilder.escapeXmlAttribute(attrValue)}\"`;\n }\n }\n }\n\n // Self-closing element validation\n if (element.selfClosing) {\n if (XMLBuilder.CANNOT_SELF_CLOSE.includes(element.name)) {\n // Instead of throwing, force open/close tags for safety\n xml += '></' + element.name + '>';\n return xml;\n }\n xml += '/>';\n return xml;\n }\n\n xml += '>';\n\n // Add raw XML content if present (for VML passthrough)\n if (element.rawXml) {\n xml += element.rawXml;\n }\n\n // Add children\n if (element.children && element.children.length > 0) {\n xml += this.elementsToString(element.children);\n }\n\n xml += `</${element.name}>`;\n return xml;\n }\n\n /**\n * Escapes special XML characters for text content\n * (Issue #8 fix: Use escapeXmlText for element text, escapeXmlAttribute called directly for attrs)\n */\n private escapeXml(text: string): string {\n // This method is now only used for text content in elementsToString()\n // Attributes call escapeXmlAttribute() directly in elementToString()\n // Text content should NOT escape quotes (only & < >)\n return XMLBuilder.escapeXmlText(text);\n }\n\n /**\n * Escapes XML text content (element text nodes)\n * Removes invalid XML 1.0 control characters and escapes: & < >\n *\n * Per XML 1.0 spec, control chars 0x00-0x08, 0x0B-0x0C, 0x0E-0x1F, 0x7F are invalid.\n * Tab (0x09), newline (0x0A), and CR (0x0D) are preserved.\n *\n * @param text Text to escape\n * @returns Escaped text safe for XML content\n */\n static escapeXmlText(text: string): string {\n return removeInvalidXmlChars(text)\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;');\n }\n\n /**\n * Escapes XML attribute values\n * Removes invalid XML 1.0 control characters and escapes: & < > \" '\n *\n * Per XML 1.0 spec, control chars 0x00-0x08, 0x0B-0x0C, 0x0E-0x1F, 0x7F are invalid.\n * Tab (0x09), newline (0x0A), and CR (0x0D) are preserved.\n *\n * @param value Attribute value to escape\n * @returns Escaped value safe for XML attributes\n */\n static escapeXmlAttribute(value: string): string {\n return removeInvalidXmlChars(value)\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&apos;');\n }\n\n /**\n * Unescapes XML entities back to original characters\n * @param text Text with XML entities\n * @returns Unescaped text\n */\n static unescapeXml(text: string): string {\n return text\n .replace(/&lt;/g, '<')\n .replace(/&gt;/g, '>')\n .replace(/&quot;/g, '\"')\n .replace(/&apos;/g, \"'\")\n .replace(/&amp;/g, '&'); // Must be last to avoid double-unescaping\n }\n\n /**\n * Sanitizes and escapes XML content for safe inclusion in XML documents\n * Removes control characters, null bytes, and escapes special XML characters\n * Use this for user-provided content that may contain unsafe characters\n *\n * Per XML 1.0 spec, control chars 0x00-0x08, 0x0B-0x0C, 0x0E-0x1F, 0x7F are invalid.\n * Tab (0x09), newline (0x0A), and CR (0x0D) are preserved.\n *\n * @param text Text to sanitize and escape\n * @returns Sanitized text safe for XML content\n *\n * **Issue #11 fix:** Prevents malformed XML from CDATA markers, control chars, etc.\n */\n static sanitizeXmlContent(text: string): string {\n return (\n removeInvalidXmlChars(text)\n // Escape CDATA end marker to prevent CDATA injection\n .replace(/\\]\\]>/g, ']]&gt;')\n // Standard XML escaping (& must be first to avoid double-escaping)\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n );\n }\n\n /**\n * Creates a WordprocessingML namespace attribute object\n */\n static createNamespaces(): Record<string, string> {\n return {\n 'xmlns:w': 'http://schemas.openxmlformats.org/wordprocessingml/2006/main',\n 'xmlns:r': 'http://schemas.openxmlformats.org/officeDocument/2006/relationships',\n 'xmlns:wp': 'http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing',\n 'xmlns:a': 'http://schemas.openxmlformats.org/drawingml/2006/main',\n 'xmlns:pic': 'http://schemas.openxmlformats.org/drawingml/2006/picture',\n 'xmlns:w14': 'http://schemas.microsoft.com/office/word/2010/wordml',\n 'xmlns:wpc': 'http://schemas.microsoft.com/office/word/2010/wordprocessingCanvas',\n 'xmlns:mc': 'http://schemas.openxmlformats.org/markup-compatibility/2006',\n 'xmlns:o': 'urn:schemas-microsoft-com:office:office',\n 'xmlns:v': 'urn:schemas-microsoft-com:vml',\n 'xmlns:wp14': 'http://schemas.microsoft.com/office/word/2010/wordprocessingDrawing',\n 'xmlns:w10': 'urn:schemas-microsoft-com:office:word',\n 'xmlns:w15': 'http://schemas.microsoft.com/office/word/2012/wordml',\n 'xmlns:wpg': 'http://schemas.microsoft.com/office/word/2010/wordprocessingGroup',\n 'xmlns:wpi': 'http://schemas.microsoft.com/office/word/2010/wordprocessingInk',\n 'xmlns:wne': 'http://schemas.microsoft.com/office/word/2006/wordml',\n 'xmlns:wps': 'http://schemas.microsoft.com/office/word/2010/wordprocessingShape',\n 'xmlns:asvg': 'http://schemas.microsoft.com/office/drawing/2016/SVG/main',\n };\n }\n\n /**\n * Converts a single XMLElement to its XML string representation\n * Useful for merging elements into existing XML\n *\n * @param element - The XMLElement to convert\n * @returns XML string representation of the element\n */\n static elementToString(element: XMLElement): string {\n const builder = new XMLBuilder();\n // Use the private elementToString via the elements array + build\n (builder as any).elements.push(element);\n return builder.build();\n }\n\n /**\n * Helper method to create a WordprocessingML element\n * @param name - Element name (without 'w:' prefix)\n * @param attributes - Element attributes\n * @param children - Child elements\n * @returns XMLElement\n */\n static w(\n name: string,\n attributes?: Record<string, string | number | boolean | undefined>,\n children?: (XMLElement | string)[]\n ): XMLElement {\n return {\n name: `w:${name}`,\n attributes,\n children,\n };\n }\n\n /**\n * Helper method to create a self-closing WordprocessingML element\n * @param name - Element name (without 'w:' prefix)\n * @param attributes - Element attributes\n * @returns XMLElement\n */\n static wSelf(\n name: string,\n attributes?: Record<string, string | number | boolean | undefined>\n ): XMLElement {\n return {\n name: `w:${name}`,\n attributes,\n selfClosing: true,\n };\n }\n\n /**\n * Helper method to create a w14 element (Word 2010+ features)\n * @param name - Element name (without 'w14:' prefix)\n * @param attributes - Element attributes\n * @param children - Child elements\n * @returns XMLElement\n */\n static w14(\n name: string,\n attributes?: Record<string, string | number | boolean | undefined>,\n children?: (XMLElement | string)[]\n ): XMLElement {\n return {\n name: `w14:${name}`,\n attributes,\n children,\n };\n }\n\n /**\n * Helper method to create a self-closing w14 element\n * @param name - Element name (without 'w14:' prefix)\n * @param attributes - Element attributes\n * @returns XMLElement\n */\n static w14Self(\n name: string,\n attributes?: Record<string, string | number | boolean | undefined>\n ): XMLElement {\n return {\n name: `w14:${name}`,\n attributes,\n selfClosing: true,\n };\n }\n\n /**\n * Helper method to create a DrawingML element (a: namespace)\n * @param name - Element name (without 'a:' prefix)\n * @param attributes - Element attributes\n * @param children - Child elements\n * @returns XMLElement\n */\n static a(\n name: string,\n attributes?: Record<string, string | number | boolean | undefined>,\n children?: (XMLElement | string)[]\n ): XMLElement {\n return {\n name: `a:${name}`,\n attributes,\n children,\n };\n }\n\n /**\n * Helper method to create a self-closing DrawingML element\n * @param name - Element name (without 'a:' prefix)\n * @param attributes - Element attributes\n * @returns XMLElement\n */\n static aSelf(\n name: string,\n attributes?: Record<string, string | number | boolean | undefined>\n ): XMLElement {\n return {\n name: `a:${name}`,\n attributes,\n selfClosing: true,\n };\n }\n\n /**\n * Helper method to create a Picture element (pic: namespace)\n * @param name - Element name (without 'pic:' prefix)\n * @param attributes - Element attributes\n * @param children - Child elements\n * @returns XMLElement\n */\n static pic(\n name: string,\n attributes?: Record<string, string | number | boolean | undefined>,\n children?: (XMLElement | string)[]\n ): XMLElement {\n return {\n name: `pic:${name}`,\n attributes,\n children,\n };\n }\n\n /**\n * Helper method to create a self-closing Picture element\n * @param name - Element name (without 'pic:' prefix)\n * @param attributes - Element attributes\n * @returns XMLElement\n */\n static picSelf(\n name: string,\n attributes?: Record<string, string | number | boolean | undefined>\n ): XMLElement {\n return {\n name: `pic:${name}`,\n attributes,\n selfClosing: true,\n };\n }\n\n /**\n * Helper method to create a Wordprocessing Drawing element (wp: namespace)\n * @param name - Element name (without 'wp:' prefix)\n * @param attributes - Element attributes\n * @param children - Child elements\n * @returns XMLElement\n */\n static wp(\n name: string,\n attributes?: Record<string, string | number | boolean | undefined>,\n children?: (XMLElement | string)[]\n ): XMLElement {\n return {\n name: `wp:${name}`,\n attributes,\n children,\n };\n }\n\n /**\n * Helper method to create a self-closing Wordprocessing Drawing element\n * @param name - Element name (without 'wp:' prefix)\n * @param attributes - Element attributes\n * @returns XMLElement\n */\n static wpSelf(\n name: string,\n attributes?: Record<string, string | number | boolean | undefined>\n ): XMLElement {\n return {\n name: `wp:${name}`,\n attributes,\n selfClosing: true,\n };\n }\n\n /**\n * Helper to create cx/cy extent attributes (for a:ext, wp:extent, etc.)\n * @param name - Element name (e.g., 'ext')\n * @param cx - Width in EMUs\n * @param cy - Height in EMUs\n * @returns Self-closing XMLElement\n */\n static cxCy(name: string, cx: number, cy: number): XMLElement {\n return {\n name,\n attributes: { cx, cy },\n selfClosing: true,\n };\n }\n\n /**\n * Creates an SDT (Structured Document Tag) wrapper for content\n * @param content - Content to wrap (paragraphs, tables, etc.)\n * @param options - SDT options\n * @returns XMLElement representing the SDT wrapper\n */\n static createSDT(\n content: XMLElement[],\n options?: {\n id?: number;\n docPartGallery?: string;\n docPartUnique?: boolean;\n }\n ): XMLElement {\n const sdtId = options?.id ?? Math.floor(Math.random() * 2000000000) - 1000000000;\n\n // Build SDT properties\n const sdtPrChildren: XMLElement[] = [XMLBuilder.wSelf('id', { 'w:val': sdtId })];\n\n // Add docPartObj if docPartGallery is specified\n if (options?.docPartGallery) {\n sdtPrChildren.push(\n XMLBuilder.w('docPartObj', undefined, [\n XMLBuilder.wSelf('docPartGallery', { 'w:val': options.docPartGallery }),\n XMLBuilder.wSelf('docPartUnique', {\n 'w:val': options?.docPartUnique !== false ? '1' : '0',\n }),\n ])\n );\n }\n\n // Create complete SDT structure\n return XMLBuilder.w('sdt', undefined, [\n XMLBuilder.w('sdtPr', undefined, sdtPrChildren),\n XMLBuilder.w('sdtContent', undefined, content),\n ]);\n }\n\n /**\n * Creates a complete WordprocessingML document structure\n * @param bodyContent - Content for the document body\n * @returns XML string for word/document.xml\n */\n static createDocument(\n bodyContent: XMLElement[],\n namespaces: Record<string, string> = {},\n preBodyContent?: XMLElement[]\n ): string {\n const builder = new XMLBuilder();\n\n // Preserve document's original namespace order, then fill in framework defaults\n const allNamespaces: Record<string, string> = {};\n for (const [key, value] of Object.entries(namespaces)) {\n allNamespaces[key] = value;\n }\n for (const [key, value] of Object.entries(XMLBuilder.createNamespaces())) {\n if (!(key in allNamespaces)) {\n allNamespaces[key] = value;\n }\n }\n\n // Ensure mc:Ignorable is present when extended namespaces are declared.\n // Per ECMA-376, mc:Ignorable tells Word which namespace prefixes can be\n // safely ignored if the processor doesn't support them. Without it,\n // attributes like w14:paraId in raw XML passthrough zones cause corruption.\n if (!allNamespaces['mc:Ignorable']) {\n const ignorable: string[] = [];\n if (allNamespaces['xmlns:w14']) ignorable.push('w14');\n if (allNamespaces['xmlns:w15']) ignorable.push('w15');\n if (allNamespaces['xmlns:wp14']) ignorable.push('wp14');\n if (allNamespaces['xmlns:w16se']) ignorable.push('w16se');\n if (allNamespaces['xmlns:w16cid']) ignorable.push('w16cid');\n if (allNamespaces['xmlns:w16']) ignorable.push('w16');\n if (allNamespaces['xmlns:w16cex']) ignorable.push('w16cex');\n if (allNamespaces['xmlns:w16sdtdh']) ignorable.push('w16sdtdh');\n if (allNamespaces['xmlns:w16sdtfl']) ignorable.push('w16sdtfl');\n if (allNamespaces['xmlns:w16du']) ignorable.push('w16du');\n if (allNamespaces['xmlns:asvg']) ignorable.push('asvg');\n if (ignorable.length > 0) {\n allNamespaces['mc:Ignorable'] = ignorable.join(' ');\n }\n } else {\n // mc:Ignorable was loaded from the original document — ensure every\n // prefix referenced in mc:Ignorable has a matching xmlns declaration.\n // Without this, the validator rejects prefixes that appear in\n // mc:Ignorable but lack namespace declarations in the root element.\n const defaults = XMLBuilder.createNamespaces();\n const prefixes = allNamespaces['mc:Ignorable'].split(/\\s+/);\n for (const prefix of prefixes) {\n const nsKey = `xmlns:${prefix}`;\n if (!allNamespaces[nsKey] && defaults[nsKey]) {\n allNamespaces[nsKey] = defaults[nsKey];\n }\n }\n }\n\n const documentChildren: XMLElement[] = [];\n if (preBodyContent) {\n documentChildren.push(...preBodyContent);\n }\n documentChildren.push(XMLBuilder.w('body', undefined, bodyContent));\n builder.element('w:document', allNamespaces, documentChildren);\n\n return builder.build(true);\n }\n\n /**\n * Builds an XML string from a JavaScript object.\n * This is the reverse of XMLParser.parseToObject\n */\n static buildObject(obj: ParsedXmlObject, rootName: string): string {\n const builder = new XMLBuilder();\n const element = XMLBuilder.objectToElement(obj, rootName);\n if (element) {\n if (typeof element === 'string') {\n builder.text(element);\n } else {\n builder.elements.push(element);\n }\n }\n return builder.build();\n }\n\n /**\n * Converts a JavaScript object to an XMLElement.\n * @private\n */\n private static objectToElement(\n obj: ParsedXmlObject | string | number | boolean | null | undefined,\n name: string\n ): XMLElement | string | null {\n if (obj === null || obj === undefined) {\n return null;\n }\n\n if (typeof obj !== 'object' || obj === null) {\n return String(obj);\n }\n\n const attributes: Record<string, string | number | boolean> = {};\n const children: (XMLElement | string)[] = [];\n\n if (obj['#text'] && Object.keys(obj).length === 1) {\n return String(obj['#text']);\n }\n\n for (const key in obj) {\n if (key.startsWith('@_')) {\n const attrName = key.substring(2);\n // Validate attribute name is not empty after prefix removal\n if (attrName.length > 0) {\n attributes[attrName] = obj[key];\n }\n } else if (key === '#text') {\n children.push(String(obj[key]));\n } else {\n const childObj = obj[key];\n if (Array.isArray(childObj)) {\n childObj.forEach((item) => {\n const childElement = XMLBuilder.objectToElement(item, key);\n if (childElement) {\n children.push(childElement);\n }\n });\n } else {\n const childElement = XMLBuilder.objectToElement(childObj, key);\n if (childElement) {\n children.push(childElement);\n }\n }\n }\n }\n\n const element: XMLElement = {\n name,\n attributes,\n children: children.length > 0 ? children : undefined,\n };\n\n if (!element.children || element.children.length === 0) {\n if (!XMLBuilder.CANNOT_SELF_CLOSE.includes(name)) {\n element.selfClosing = true;\n }\n }\n\n return element;\n }\n\n /**\n * Helper method to build attributes object, filtering out undefined/null values\n * This simplifies the common pattern of conditionally adding attributes\n *\n * @param mapping - Map of attribute names to values\n * @returns Filtered attributes object with only defined values\n *\n * @example\n * ```typescript\n * const attrs = XMLBuilder.buildAttributes({\n * 'w:before': spacing?.before,\n * 'w:after': spacing?.after,\n * 'w:line': spacing?.line\n * });\n * // Returns only attributes with defined values\n * ```\n */\n static buildAttributes(mapping: Record<string, any>): Record<string, string | number> {\n const attrs: Record<string, string | number> = {};\n for (const [key, value] of Object.entries(mapping)) {\n if (value !== undefined && value !== null) {\n attrs[key] = value;\n }\n }\n return attrs;\n }\n\n /**\n * Creates a border element for WordprocessingML\n * Used for table borders, cell borders, and paragraph borders\n *\n * @param side - Border side (e.g., 'top', 'left', 'bottom', 'right', 'insideH', 'insideV')\n * @param border - Border definition\n * @returns XML element for border\n *\n * @example\n * ```typescript\n * const border = XMLBuilder.createBorder('top', {\n * style: 'single',\n * size: 4,\n * color: 'FF0000',\n * space: 0\n * });\n * ```\n */\n static createBorder(\n side: string,\n border: {\n style?: string;\n size?: number;\n color?: string;\n space?: number;\n }\n ): XMLElement {\n const attrs = XMLBuilder.buildAttributes({\n 'w:val': border.style || 'single',\n 'w:sz': border.size,\n 'w:color': border.color,\n 'w:space': border.space,\n });\n\n return XMLBuilder.wSelf(side, attrs);\n }\n\n /**\n * Creates a shading element for WordprocessingML\n * Used for paragraph shading, table shading, and cell shading\n *\n * @param shading - Shading definition (ShadingConfig with theme support)\n * @returns XML element for shading, or null if no shading properties\n *\n * @example\n * ```typescript\n * const shading = XMLBuilder.createShading({\n * fill: 'FFFF00',\n * pattern: 'clear',\n * color: '000000'\n * });\n * ```\n */\n static createShading(shading: ShadingConfig): XMLElement | null {\n const attrs = buildShadingAttributes(shading);\n // Default w:val to \"clear\" if not specified but other attrs exist\n if (!attrs['w:val'] && Object.keys(attrs).length > 0) {\n attrs['w:val'] = 'clear';\n }\n if (Object.keys(attrs).length > 0) {\n return XMLBuilder.wSelf('shd', attrs);\n }\n return null;\n }\n\n /**\n * Creates a margins element (tcMar, pgMar, etc.)\n * Used for cell margins, page margins, etc.\n *\n * @param type - Margin type element name (e.g., 'tcMar', 'pgMar')\n * @param margins - Margin values in twips\n * @returns XML element for margins, or null if no margins defined\n *\n * @example\n * ```typescript\n * const margins = XMLBuilder.createMargins('tcMar', {\n * top: 100,\n * bottom: 100,\n * left: 100,\n * right: 100\n * });\n * ```\n */\n static createMargins(\n type: string,\n margins: {\n top?: number;\n bottom?: number;\n left?: number;\n right?: number;\n start?: number;\n end?: number;\n }\n ): XMLElement | null {\n const children: XMLElement[] = [];\n\n if (margins.top !== undefined) {\n children.push(XMLBuilder.wSelf('top', { 'w:w': margins.top, 'w:type': 'dxa' }));\n }\n if (margins.bottom !== undefined) {\n children.push(XMLBuilder.wSelf('bottom', { 'w:w': margins.bottom, 'w:type': 'dxa' }));\n }\n if (margins.left !== undefined) {\n children.push(XMLBuilder.wSelf('left', { 'w:w': margins.left, 'w:type': 'dxa' }));\n }\n if (margins.right !== undefined) {\n children.push(XMLBuilder.wSelf('right', { 'w:w': margins.right, 'w:type': 'dxa' }));\n }\n if (margins.start !== undefined) {\n children.push(XMLBuilder.wSelf('start', { 'w:w': margins.start, 'w:type': 'dxa' }));\n }\n if (margins.end !== undefined) {\n children.push(XMLBuilder.wSelf('end', { 'w:w': margins.end, 'w:type': 'dxa' }));\n }\n\n if (children.length > 0) {\n return XMLBuilder.w(type, undefined, children);\n }\n return null;\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"XMLParser.d.ts","sourceRoot":"","sources":["../../src/xml/XMLParser.ts"],"names":[],"mappings":"AAkBA,eAAO,MAAM,yBAAyB,MAAM,CAAC;AAK7C,MAAM,WAAW,oBAAoB;IAEnC,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAG3B,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAG7B,YAAY,CAAC,EAAE,MAAM,CAAC;IAGtB,eAAe,CAAC,EAAE,OAAO,CAAC;IAG1B,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAG9B,UAAU,CAAC,EAAE,OAAO,CAAC;IAGrB,WAAW,CAAC,EAAE,OAAO,CAAC;IAGtB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAMD,MAAM,MAAM,cAAc,GACtB,MAAM,GACN,MAAM,GACN,OAAO,GACP,eAAe,GACf,eAAe,EAAE,GACjB,IAAI,GACJ,SAAS,CAAC;AAKd,MAAM,WAAW,eAAe;IAC9B,CAAC,GAAG,EAAE,MAAM,GAAG,cAAc,CAAC;CAC/B;AAcD,qBAAa,SAAS;IAMpB,MAAM,CAAC,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM;IAyB1C,MAAM,CAAC,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE;IAyG9D,MAAM,CAAC,gBAAgB,CACrB,GAAG,EAAE,MAAM,EACX,aAAa,EAAE,MAAM,GACpB,MAAM,GAAG,SAAS;IAsBrB,MAAM,CAAC,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO;IAoB/D,MAAM,CAAC,kBAAkB,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO;IAwBhE,MAAM,CAAC,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;IAkCvC,MAAM,CAAC,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,GAAE,MAAyB,GAAG,IAAI;IAqB1E,MAAM,CAAC,kBAAkB,CACvB,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,GACb,MAAM,GAAG,SAAS;IA4BrB,MAAM,CAAC,qBAAqB,CAC1B,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,MAAM,GACd,MAAM,GAAG,SAAS;IAsDrB,MAAM,CAAC,aAAa,CAClB,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE,oBAAoB,GAC7B,eAAe;IAoClB,OAAO,CAAC,MAAM,CAAC,oBAAoB;IAmMnC,OAAO,CAAC,MAAM,CAAC,wBAAwB;IA6FvC,OAAO,CAAC,MAAM,CAAC,cAAc;IA2E7B,OAAO,CAAC,MAAM,CAAC,gBAAgB;IAiD/B,OAAO,CAAC,MAAM,CAAC,UAAU;CAqC1B"}
1
+ {"version":3,"file":"XMLParser.d.ts","sourceRoot":"","sources":["../../src/xml/XMLParser.ts"],"names":[],"mappings":"AAkBA,eAAO,MAAM,yBAAyB,MAAM,CAAC;AAK7C,MAAM,WAAW,oBAAoB;IAEnC,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAG3B,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAG7B,YAAY,CAAC,EAAE,MAAM,CAAC;IAGtB,eAAe,CAAC,EAAE,OAAO,CAAC;IAG1B,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAG9B,UAAU,CAAC,EAAE,OAAO,CAAC;IAGrB,WAAW,CAAC,EAAE,OAAO,CAAC;IAGtB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAMD,MAAM,MAAM,cAAc,GACtB,MAAM,GACN,MAAM,GACN,OAAO,GACP,eAAe,GACf,eAAe,EAAE,GACjB,IAAI,GACJ,SAAS,CAAC;AAKd,MAAM,WAAW,eAAe;IAC9B,CAAC,GAAG,EAAE,MAAM,GAAG,cAAc,CAAC;CAC/B;AAcD,qBAAa,SAAS;IAMpB,MAAM,CAAC,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM;IAyB1C,MAAM,CAAC,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE;IAyG9D,MAAM,CAAC,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAsB/E,MAAM,CAAC,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO;IAoB/D,MAAM,CAAC,kBAAkB,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO;IAqBhE,MAAM,CAAC,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;IAkCvC,MAAM,CAAC,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,GAAE,MAAyB,GAAG,IAAI;IAiB1E,MAAM,CAAC,kBAAkB,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IA4B5F,MAAM,CAAC,qBAAqB,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAsD9E,MAAM,CAAC,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,oBAAoB,GAAG,eAAe;IAoClF,OAAO,CAAC,MAAM,CAAC,oBAAoB;IAqLnC,OAAO,CAAC,MAAM,CAAC,wBAAwB;IA0FvC,OAAO,CAAC,MAAM,CAAC,cAAc;IAuE7B,OAAO,CAAC,MAAM,CAAC,gBAAgB;IAgD/B,OAAO,CAAC,MAAM,CAAC,UAAU;CAqC1B"}