docxmlater 10.4.0 → 11.0.4

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 (699) hide show
  1. package/README.md +3 -3
  2. package/dist/constants/legacyCompatFlags.d.ts +1 -1
  3. package/dist/constants/legacyCompatFlags.d.ts.map +1 -1
  4. package/dist/constants/legacyCompatFlags.js.map +1 -1
  5. package/dist/core/Document.d.ts +75 -67
  6. package/dist/core/Document.d.ts.map +1 -1
  7. package/dist/core/Document.js +618 -414
  8. package/dist/core/Document.js.map +1 -1
  9. package/dist/core/DocumentContent.d.ts +11 -10
  10. package/dist/core/DocumentContent.d.ts.map +1 -1
  11. package/dist/core/DocumentContent.js +19 -19
  12. package/dist/core/DocumentContent.js.map +1 -1
  13. package/dist/core/DocumentEvents.d.ts +39 -0
  14. package/dist/core/DocumentEvents.d.ts.map +1 -0
  15. package/dist/core/DocumentEvents.js +51 -0
  16. package/dist/core/DocumentEvents.js.map +1 -0
  17. package/dist/core/DocumentGenerator.d.ts +11 -11
  18. package/dist/core/DocumentGenerator.d.ts.map +1 -1
  19. package/dist/core/DocumentGenerator.js +72 -52
  20. package/dist/core/DocumentGenerator.js.map +1 -1
  21. package/dist/core/DocumentParser.d.ts +15 -15
  22. package/dist/core/DocumentParser.d.ts.map +1 -1
  23. package/dist/core/DocumentParser.js +2100 -1076
  24. package/dist/core/DocumentParser.js.map +1 -1
  25. package/dist/core/DocumentValidator.d.ts +3 -3
  26. package/dist/core/DocumentValidator.d.ts.map +1 -1
  27. package/dist/core/DocumentValidator.js +31 -31
  28. package/dist/core/DocumentValidator.js.map +1 -1
  29. package/dist/core/ElementRegistry.d.ts +22 -0
  30. package/dist/core/ElementRegistry.d.ts.map +1 -0
  31. package/dist/core/ElementRegistry.js +27 -0
  32. package/dist/core/ElementRegistry.js.map +1 -0
  33. package/dist/core/Relationship.js +4 -4
  34. package/dist/core/Relationship.js.map +1 -1
  35. package/dist/core/RelationshipManager.d.ts +1 -1
  36. package/dist/core/RelationshipManager.d.ts.map +1 -1
  37. package/dist/core/RelationshipManager.js +32 -32
  38. package/dist/core/RelationshipManager.js.map +1 -1
  39. package/dist/elements/AlternateContent.d.ts +1 -1
  40. package/dist/elements/AlternateContent.d.ts.map +1 -1
  41. package/dist/elements/AlternateContent.js.map +1 -1
  42. package/dist/elements/Bookmark.d.ts +6 -1
  43. package/dist/elements/Bookmark.d.ts.map +1 -1
  44. package/dist/elements/Bookmark.js +19 -3
  45. package/dist/elements/Bookmark.js.map +1 -1
  46. package/dist/elements/BookmarkManager.d.ts +1 -1
  47. package/dist/elements/BookmarkManager.d.ts.map +1 -1
  48. package/dist/elements/BookmarkManager.js +7 -7
  49. package/dist/elements/BookmarkManager.js.map +1 -1
  50. package/dist/elements/Comment.d.ts +2 -2
  51. package/dist/elements/Comment.d.ts.map +1 -1
  52. package/dist/elements/Comment.js +4 -4
  53. package/dist/elements/Comment.js.map +1 -1
  54. package/dist/elements/CommentManager.d.ts +2 -2
  55. package/dist/elements/CommentManager.d.ts.map +1 -1
  56. package/dist/elements/CommentManager.js +9 -9
  57. package/dist/elements/CommentManager.js.map +1 -1
  58. package/dist/elements/CommonTypes.d.ts +9 -4
  59. package/dist/elements/CommonTypes.d.ts.map +1 -1
  60. package/dist/elements/CommonTypes.js +1 -0
  61. package/dist/elements/CommonTypes.js.map +1 -1
  62. package/dist/elements/CustomXml.d.ts +1 -1
  63. package/dist/elements/CustomXml.d.ts.map +1 -1
  64. package/dist/elements/CustomXml.js.map +1 -1
  65. package/dist/elements/Endnote.d.ts +2 -2
  66. package/dist/elements/Endnote.d.ts.map +1 -1
  67. package/dist/elements/Endnote.js +9 -9
  68. package/dist/elements/Endnote.js.map +1 -1
  69. package/dist/elements/EndnoteManager.d.ts +1 -1
  70. package/dist/elements/EndnoteManager.d.ts.map +1 -1
  71. package/dist/elements/EndnoteManager.js +11 -11
  72. package/dist/elements/EndnoteManager.js.map +1 -1
  73. package/dist/elements/Field.d.ts +9 -5
  74. package/dist/elements/Field.d.ts.map +1 -1
  75. package/dist/elements/Field.js +21 -9
  76. package/dist/elements/Field.js.map +1 -1
  77. package/dist/elements/FieldHelpers.d.ts +1 -1
  78. package/dist/elements/FieldHelpers.d.ts.map +1 -1
  79. package/dist/elements/FieldHelpers.js +10 -10
  80. package/dist/elements/FieldHelpers.js.map +1 -1
  81. package/dist/elements/Footer.d.ts +3 -3
  82. package/dist/elements/Footer.d.ts.map +1 -1
  83. package/dist/elements/Footer.js +5 -5
  84. package/dist/elements/Footer.js.map +1 -1
  85. package/dist/elements/Footnote.d.ts +2 -2
  86. package/dist/elements/Footnote.d.ts.map +1 -1
  87. package/dist/elements/Footnote.js +9 -9
  88. package/dist/elements/Footnote.js.map +1 -1
  89. package/dist/elements/FootnoteManager.d.ts +1 -1
  90. package/dist/elements/FootnoteManager.d.ts.map +1 -1
  91. package/dist/elements/FootnoteManager.js +11 -11
  92. package/dist/elements/FootnoteManager.js.map +1 -1
  93. package/dist/elements/Header.d.ts +3 -3
  94. package/dist/elements/Header.d.ts.map +1 -1
  95. package/dist/elements/Header.js +5 -5
  96. package/dist/elements/Header.js.map +1 -1
  97. package/dist/elements/HeaderFooterManager.d.ts +2 -2
  98. package/dist/elements/HeaderFooterManager.d.ts.map +1 -1
  99. package/dist/elements/HeaderFooterManager.js.map +1 -1
  100. package/dist/elements/Hyperlink.d.ts +5 -5
  101. package/dist/elements/Hyperlink.d.ts.map +1 -1
  102. package/dist/elements/Hyperlink.js +29 -29
  103. package/dist/elements/Hyperlink.js.map +1 -1
  104. package/dist/elements/Image.d.ts +1 -1
  105. package/dist/elements/Image.d.ts.map +1 -1
  106. package/dist/elements/Image.js +67 -67
  107. package/dist/elements/Image.js.map +1 -1
  108. package/dist/elements/ImageManager.d.ts +1 -1
  109. package/dist/elements/ImageManager.d.ts.map +1 -1
  110. package/dist/elements/ImageManager.js +4 -4
  111. package/dist/elements/ImageManager.js.map +1 -1
  112. package/dist/elements/ImageRun.d.ts +3 -3
  113. package/dist/elements/ImageRun.d.ts.map +1 -1
  114. package/dist/elements/ImageRun.js +2 -2
  115. package/dist/elements/ImageRun.js.map +1 -1
  116. package/dist/elements/MathElement.d.ts +1 -1
  117. package/dist/elements/MathElement.d.ts.map +1 -1
  118. package/dist/elements/MathElement.js.map +1 -1
  119. package/dist/elements/Paragraph.d.ts +34 -19
  120. package/dist/elements/Paragraph.d.ts.map +1 -1
  121. package/dist/elements/Paragraph.js +286 -231
  122. package/dist/elements/Paragraph.js.map +1 -1
  123. package/dist/elements/PreservedElement.d.ts +1 -1
  124. package/dist/elements/PreservedElement.d.ts.map +1 -1
  125. package/dist/elements/PreservedElement.js.map +1 -1
  126. package/dist/elements/PropertyChangeTypes.d.ts +2 -2
  127. package/dist/elements/PropertyChangeTypes.d.ts.map +1 -1
  128. package/dist/elements/PropertyChangeTypes.js.map +1 -1
  129. package/dist/elements/RangeMarker.d.ts +14 -1
  130. package/dist/elements/RangeMarker.d.ts.map +1 -1
  131. package/dist/elements/RangeMarker.js +46 -8
  132. package/dist/elements/RangeMarker.js.map +1 -1
  133. package/dist/elements/RegisteredBodyElement.d.ts +15 -0
  134. package/dist/elements/RegisteredBodyElement.d.ts.map +1 -0
  135. package/dist/elements/RegisteredBodyElement.js +44 -0
  136. package/dist/elements/RegisteredBodyElement.js.map +1 -0
  137. package/dist/elements/Revision.d.ts +8 -8
  138. package/dist/elements/Revision.d.ts.map +1 -1
  139. package/dist/elements/Revision.js +12 -12
  140. package/dist/elements/Revision.js.map +1 -1
  141. package/dist/elements/RevisionContent.d.ts +3 -3
  142. package/dist/elements/RevisionContent.d.ts.map +1 -1
  143. package/dist/elements/RevisionContent.js.map +1 -1
  144. package/dist/elements/RevisionManager.d.ts +2 -2
  145. package/dist/elements/RevisionManager.d.ts.map +1 -1
  146. package/dist/elements/RevisionManager.js +2 -2
  147. package/dist/elements/RevisionManager.js.map +1 -1
  148. package/dist/elements/Run.d.ts +16 -10
  149. package/dist/elements/Run.d.ts.map +1 -1
  150. package/dist/elements/Run.js +199 -173
  151. package/dist/elements/Run.js.map +1 -1
  152. package/dist/elements/Section.d.ts +4 -2
  153. package/dist/elements/Section.d.ts.map +1 -1
  154. package/dist/elements/Section.js +152 -145
  155. package/dist/elements/Section.js.map +1 -1
  156. package/dist/elements/Shape.d.ts +3 -3
  157. package/dist/elements/Shape.d.ts.map +1 -1
  158. package/dist/elements/Shape.js +12 -12
  159. package/dist/elements/Shape.js.map +1 -1
  160. package/dist/elements/StructuredDocumentTag.d.ts +3 -3
  161. package/dist/elements/StructuredDocumentTag.d.ts.map +1 -1
  162. package/dist/elements/StructuredDocumentTag.js +39 -39
  163. package/dist/elements/StructuredDocumentTag.js.map +1 -1
  164. package/dist/elements/Table.d.ts +16 -10
  165. package/dist/elements/Table.d.ts.map +1 -1
  166. package/dist/elements/Table.js +118 -89
  167. package/dist/elements/Table.js.map +1 -1
  168. package/dist/elements/TableCell.d.ts +11 -11
  169. package/dist/elements/TableCell.d.ts.map +1 -1
  170. package/dist/elements/TableCell.js +108 -78
  171. package/dist/elements/TableCell.js.map +1 -1
  172. package/dist/elements/TableGridChange.d.ts +1 -1
  173. package/dist/elements/TableGridChange.d.ts.map +1 -1
  174. package/dist/elements/TableGridChange.js +3 -3
  175. package/dist/elements/TableGridChange.js.map +1 -1
  176. package/dist/elements/TableOfContents.d.ts +1 -1
  177. package/dist/elements/TableOfContents.d.ts.map +1 -1
  178. package/dist/elements/TableOfContents.js +2 -2
  179. package/dist/elements/TableOfContents.js.map +1 -1
  180. package/dist/elements/TableOfContentsElement.d.ts +2 -2
  181. package/dist/elements/TableOfContentsElement.d.ts.map +1 -1
  182. package/dist/elements/TableOfContentsElement.js +5 -5
  183. package/dist/elements/TableOfContentsElement.js.map +1 -1
  184. package/dist/elements/TableRow.d.ts +18 -7
  185. package/dist/elements/TableRow.d.ts.map +1 -1
  186. package/dist/elements/TableRow.js +127 -74
  187. package/dist/elements/TableRow.js.map +1 -1
  188. package/dist/elements/TextBox.d.ts +4 -4
  189. package/dist/elements/TextBox.d.ts.map +1 -1
  190. package/dist/elements/TextBox.js +6 -6
  191. package/dist/elements/TextBox.js.map +1 -1
  192. package/dist/esm/constants/legacyCompatFlags.js +97 -0
  193. package/dist/esm/constants/legacyCompatFlags.js.map +1 -0
  194. package/dist/esm/constants/limits.js +36 -0
  195. package/dist/esm/constants/limits.js.map +1 -0
  196. package/dist/esm/core/Document.js +8498 -0
  197. package/dist/esm/core/Document.js.map +1 -0
  198. package/dist/esm/core/DocumentContent.js +190 -0
  199. package/dist/esm/core/DocumentContent.js.map +1 -0
  200. package/dist/esm/core/DocumentEvents.js +47 -0
  201. package/dist/esm/core/DocumentEvents.js.map +1 -0
  202. package/dist/esm/core/DocumentGenerator.js +764 -0
  203. package/dist/esm/core/DocumentGenerator.js.map +1 -0
  204. package/dist/esm/core/DocumentIdManager.js +67 -0
  205. package/dist/esm/core/DocumentIdManager.js.map +1 -0
  206. package/dist/esm/core/DocumentParser.js +8760 -0
  207. package/dist/esm/core/DocumentParser.js.map +1 -0
  208. package/dist/esm/core/DocumentValidator.js +222 -0
  209. package/dist/esm/core/DocumentValidator.js.map +1 -0
  210. package/dist/esm/core/ElementRegistry.js +24 -0
  211. package/dist/esm/core/ElementRegistry.js.map +1 -0
  212. package/dist/esm/core/Relationship.js +177 -0
  213. package/dist/esm/core/Relationship.js.map +1 -0
  214. package/dist/esm/core/RelationshipManager.js +202 -0
  215. package/dist/esm/core/RelationshipManager.js.map +1 -0
  216. package/dist/esm/elements/AlternateContent.js +19 -0
  217. package/dist/esm/elements/AlternateContent.js.map +1 -0
  218. package/dist/esm/elements/Bookmark.js +115 -0
  219. package/dist/esm/elements/Bookmark.js.map +1 -0
  220. package/dist/esm/elements/BookmarkManager.js +99 -0
  221. package/dist/esm/elements/BookmarkManager.js.map +1 -0
  222. package/dist/esm/elements/Comment.js +181 -0
  223. package/dist/esm/elements/Comment.js.map +1 -0
  224. package/dist/esm/elements/CommentManager.js +233 -0
  225. package/dist/esm/elements/CommentManager.js.map +1 -0
  226. package/dist/esm/elements/CommonTypes.js +106 -0
  227. package/dist/esm/elements/CommonTypes.js.map +1 -0
  228. package/dist/esm/elements/CustomXml.js +19 -0
  229. package/dist/esm/elements/CustomXml.js.map +1 -0
  230. package/dist/esm/elements/Endnote.js +107 -0
  231. package/dist/esm/elements/Endnote.js.map +1 -0
  232. package/dist/esm/elements/EndnoteManager.js +119 -0
  233. package/dist/esm/elements/EndnoteManager.js.map +1 -0
  234. package/dist/esm/elements/Field.js +856 -0
  235. package/dist/esm/elements/Field.js.map +1 -0
  236. package/dist/esm/elements/FieldHelpers.js +134 -0
  237. package/dist/esm/elements/FieldHelpers.js.map +1 -0
  238. package/dist/esm/elements/FontManager.js +158 -0
  239. package/dist/esm/elements/FontManager.js.map +1 -0
  240. package/dist/esm/elements/Footer.js +141 -0
  241. package/dist/esm/elements/Footer.js.map +1 -0
  242. package/dist/esm/elements/Footnote.js +107 -0
  243. package/dist/esm/elements/Footnote.js.map +1 -0
  244. package/dist/esm/elements/FootnoteManager.js +119 -0
  245. package/dist/esm/elements/FootnoteManager.js.map +1 -0
  246. package/dist/esm/elements/Header.js +141 -0
  247. package/dist/esm/elements/Header.js.map +1 -0
  248. package/dist/esm/elements/HeaderFooterManager.js +87 -0
  249. package/dist/esm/elements/HeaderFooterManager.js.map +1 -0
  250. package/dist/esm/elements/Hyperlink.js +586 -0
  251. package/dist/esm/elements/Hyperlink.js.map +1 -0
  252. package/dist/esm/elements/Image.js +1288 -0
  253. package/dist/esm/elements/Image.js.map +1 -0
  254. package/dist/esm/elements/ImageManager.js +223 -0
  255. package/dist/esm/elements/ImageManager.js.map +1 -0
  256. package/dist/esm/elements/ImageRun.js +29 -0
  257. package/dist/esm/elements/ImageRun.js.map +1 -0
  258. package/dist/esm/elements/MathElement.js +37 -0
  259. package/dist/esm/elements/MathElement.js.map +1 -0
  260. package/dist/esm/elements/Paragraph.js +2308 -0
  261. package/dist/esm/elements/Paragraph.js.map +1 -0
  262. package/dist/esm/elements/PreservedElement.js +29 -0
  263. package/dist/esm/elements/PreservedElement.js.map +1 -0
  264. package/dist/esm/elements/PropertyChangeTypes.js +53 -0
  265. package/dist/esm/elements/PropertyChangeTypes.js.map +1 -0
  266. package/dist/esm/elements/RangeMarker.js +219 -0
  267. package/dist/esm/elements/RangeMarker.js.map +1 -0
  268. package/dist/esm/elements/RegisteredBodyElement.js +40 -0
  269. package/dist/esm/elements/RegisteredBodyElement.js.map +1 -0
  270. package/dist/esm/elements/Revision.js +498 -0
  271. package/dist/esm/elements/Revision.js.map +1 -0
  272. package/dist/esm/elements/RevisionContent.js +18 -0
  273. package/dist/esm/elements/RevisionContent.js.map +1 -0
  274. package/dist/esm/elements/RevisionManager.js +486 -0
  275. package/dist/esm/elements/RevisionManager.js.map +1 -0
  276. package/dist/esm/elements/Run.js +1465 -0
  277. package/dist/esm/elements/Run.js.map +1 -0
  278. package/dist/esm/elements/Section.js +978 -0
  279. package/dist/esm/elements/Section.js.map +1 -0
  280. package/dist/esm/elements/Shape.js +493 -0
  281. package/dist/esm/elements/Shape.js.map +1 -0
  282. package/dist/esm/elements/StructuredDocumentTag.js +471 -0
  283. package/dist/esm/elements/StructuredDocumentTag.js.map +1 -0
  284. package/dist/esm/elements/Table.js +1456 -0
  285. package/dist/esm/elements/Table.js.map +1 -0
  286. package/dist/esm/elements/TableCell.js +835 -0
  287. package/dist/esm/elements/TableCell.js.map +1 -0
  288. package/dist/esm/elements/TableGridChange.js +52 -0
  289. package/dist/esm/elements/TableGridChange.js.map +1 -0
  290. package/dist/esm/elements/TableOfContents.js +389 -0
  291. package/dist/esm/elements/TableOfContents.js.map +1 -0
  292. package/dist/esm/elements/TableOfContentsElement.js +29 -0
  293. package/dist/esm/elements/TableOfContentsElement.js.map +1 -0
  294. package/dist/esm/elements/TableRow.js +555 -0
  295. package/dist/esm/elements/TableRow.js.map +1 -0
  296. package/dist/esm/elements/TextBox.js +459 -0
  297. package/dist/esm/elements/TextBox.js.map +1 -0
  298. package/dist/esm/formatting/AbstractNumbering.js +325 -0
  299. package/dist/esm/formatting/AbstractNumbering.js.map +1 -0
  300. package/dist/esm/formatting/NumberingInstance.js +150 -0
  301. package/dist/esm/formatting/NumberingInstance.js.map +1 -0
  302. package/dist/esm/formatting/NumberingLevel.js +608 -0
  303. package/dist/esm/formatting/NumberingLevel.js.map +1 -0
  304. package/dist/esm/formatting/NumberingManager.js +423 -0
  305. package/dist/esm/formatting/NumberingManager.js.map +1 -0
  306. package/dist/esm/formatting/Style.js +1151 -0
  307. package/dist/esm/formatting/Style.js.map +1 -0
  308. package/dist/esm/formatting/StylesManager.js +557 -0
  309. package/dist/esm/formatting/StylesManager.js.map +1 -0
  310. package/dist/esm/helpers/CleanupHelper.js +350 -0
  311. package/dist/esm/helpers/CleanupHelper.js.map +1 -0
  312. package/dist/esm/images/ImageOptimizer.js +161 -0
  313. package/dist/esm/images/ImageOptimizer.js.map +1 -0
  314. package/dist/esm/index.js +75 -0
  315. package/dist/esm/index.js.map +1 -0
  316. package/dist/esm/internal.js +16 -0
  317. package/dist/esm/internal.js.map +1 -0
  318. package/dist/esm/managers/DrawingManager.js +163 -0
  319. package/dist/esm/managers/DrawingManager.js.map +1 -0
  320. package/dist/esm/package.json +3 -0
  321. package/dist/esm/processors/ChangelogGenerator.js +970 -0
  322. package/dist/esm/processors/ChangelogGenerator.js.map +1 -0
  323. package/dist/esm/processors/CompatibilityUpgrader.js +130 -0
  324. package/dist/esm/processors/CompatibilityUpgrader.js.map +1 -0
  325. package/dist/esm/processors/InMemoryRevisionAcceptor.js +530 -0
  326. package/dist/esm/processors/InMemoryRevisionAcceptor.js.map +1 -0
  327. package/dist/esm/processors/MoveOperationHelper.js +57 -0
  328. package/dist/esm/processors/MoveOperationHelper.js.map +1 -0
  329. package/dist/esm/processors/RevisionAwareProcessor.js +232 -0
  330. package/dist/esm/processors/RevisionAwareProcessor.js.map +1 -0
  331. package/dist/esm/processors/RevisionWalker.js +278 -0
  332. package/dist/esm/processors/RevisionWalker.js.map +1 -0
  333. package/dist/{utils → esm/processors}/SelectiveRevisionAcceptor.js +81 -42
  334. package/dist/esm/processors/SelectiveRevisionAcceptor.js.map +1 -0
  335. package/dist/esm/processors/ShadingResolver.js +66 -0
  336. package/dist/esm/processors/ShadingResolver.js.map +1 -0
  337. package/dist/esm/processors/acceptRevisions.js +416 -0
  338. package/dist/esm/processors/acceptRevisions.js.map +1 -0
  339. package/dist/esm/processors/cnfStyleDecoder.js +89 -0
  340. package/dist/esm/processors/cnfStyleDecoder.js.map +1 -0
  341. package/dist/esm/processors/stripTrackedChanges.js +201 -0
  342. package/dist/esm/processors/stripTrackedChanges.js.map +1 -0
  343. package/dist/esm/tracking/DocumentTrackingContext.js +531 -0
  344. package/dist/esm/tracking/DocumentTrackingContext.js.map +1 -0
  345. package/dist/esm/tracking/TrackingContext.js +2 -0
  346. package/dist/esm/tracking/TrackingContext.js.map +1 -0
  347. package/dist/esm/types/compatibility-types.js +8 -0
  348. package/dist/esm/types/compatibility-types.js.map +1 -0
  349. package/dist/esm/types/document-types.js +2 -0
  350. package/dist/esm/types/document-types.js.map +1 -0
  351. package/dist/esm/types/formatting.js +2 -0
  352. package/dist/esm/types/formatting.js.map +1 -0
  353. package/dist/esm/types/list-types.js +2 -0
  354. package/dist/esm/types/list-types.js.map +1 -0
  355. package/dist/esm/types/settings-types.js +2 -0
  356. package/dist/esm/types/settings-types.js.map +1 -0
  357. package/dist/esm/types/styleConfig.js +2 -0
  358. package/dist/esm/types/styleConfig.js.map +1 -0
  359. package/dist/esm/utils/KeyedRegistry.js +32 -0
  360. package/dist/esm/utils/KeyedRegistry.js.map +1 -0
  361. package/dist/esm/utils/corruptionDetection.js +155 -0
  362. package/dist/esm/utils/corruptionDetection.js.map +1 -0
  363. package/dist/esm/utils/dateFormatting.js +4 -0
  364. package/dist/esm/utils/dateFormatting.js.map +1 -0
  365. package/dist/esm/utils/deepClone.js +40 -0
  366. package/dist/esm/utils/deepClone.js.map +1 -0
  367. package/dist/esm/utils/deepEqual.js +47 -0
  368. package/dist/esm/utils/deepEqual.js.map +1 -0
  369. package/dist/esm/utils/diagnostics.js +69 -0
  370. package/dist/esm/utils/diagnostics.js.map +1 -0
  371. package/dist/esm/utils/errorHandling.js +36 -0
  372. package/dist/esm/utils/errorHandling.js.map +1 -0
  373. package/dist/esm/utils/formatting.js +93 -0
  374. package/dist/esm/utils/formatting.js.map +1 -0
  375. package/dist/esm/utils/list-detection.js +148 -0
  376. package/dist/esm/utils/list-detection.js.map +1 -0
  377. package/dist/esm/utils/logger.js +205 -0
  378. package/dist/esm/utils/logger.js.map +1 -0
  379. package/dist/esm/utils/parsingHelpers.js +56 -0
  380. package/dist/esm/utils/parsingHelpers.js.map +1 -0
  381. package/dist/esm/utils/textDiff.js +42 -0
  382. package/dist/esm/utils/textDiff.js.map +1 -0
  383. package/dist/esm/utils/units.js +152 -0
  384. package/dist/esm/utils/units.js.map +1 -0
  385. package/dist/esm/utils/validation.js +285 -0
  386. package/dist/esm/utils/validation.js.map +1 -0
  387. package/dist/esm/utils/xmlSanitization.js +54 -0
  388. package/dist/esm/utils/xmlSanitization.js.map +1 -0
  389. package/dist/esm/validation/RevisionAutoFixer.js +340 -0
  390. package/dist/esm/validation/RevisionAutoFixer.js.map +1 -0
  391. package/dist/esm/validation/RevisionValidator.js +240 -0
  392. package/dist/esm/validation/RevisionValidator.js.map +1 -0
  393. package/dist/esm/validation/ValidationRuleRegistry.js +40 -0
  394. package/dist/esm/validation/ValidationRuleRegistry.js.map +1 -0
  395. package/dist/esm/validation/ValidationRules.js +92 -0
  396. package/dist/esm/validation/ValidationRules.js.map +1 -0
  397. package/dist/esm/validation/index.js +4 -0
  398. package/dist/esm/validation/index.js.map +1 -0
  399. package/dist/esm/xml/XMLBuilder.js +434 -0
  400. package/dist/esm/xml/XMLBuilder.js.map +1 -0
  401. package/dist/esm/xml/XMLParser.js +486 -0
  402. package/dist/esm/xml/XMLParser.js.map +1 -0
  403. package/dist/esm/zip/ZipHandler.js +298 -0
  404. package/dist/esm/zip/ZipHandler.js.map +1 -0
  405. package/dist/esm/zip/ZipReader.js +147 -0
  406. package/dist/esm/zip/ZipReader.js.map +1 -0
  407. package/dist/esm/zip/ZipWriter.js +199 -0
  408. package/dist/esm/zip/ZipWriter.js.map +1 -0
  409. package/dist/esm/zip/errors.js +43 -0
  410. package/dist/esm/zip/errors.js.map +1 -0
  411. package/dist/esm/zip/types.js +31 -0
  412. package/dist/esm/zip/types.js.map +1 -0
  413. package/dist/formatting/AbstractNumbering.d.ts +2 -2
  414. package/dist/formatting/AbstractNumbering.d.ts.map +1 -1
  415. package/dist/formatting/AbstractNumbering.js +33 -33
  416. package/dist/formatting/AbstractNumbering.js.map +1 -1
  417. package/dist/formatting/NumberingInstance.d.ts +2 -2
  418. package/dist/formatting/NumberingInstance.d.ts.map +1 -1
  419. package/dist/formatting/NumberingInstance.js +7 -7
  420. package/dist/formatting/NumberingInstance.js.map +1 -1
  421. package/dist/formatting/NumberingLevel.d.ts +11 -2
  422. package/dist/formatting/NumberingLevel.d.ts.map +1 -1
  423. package/dist/formatting/NumberingLevel.js +111 -25
  424. package/dist/formatting/NumberingLevel.js.map +1 -1
  425. package/dist/formatting/NumberingManager.d.ts +4 -4
  426. package/dist/formatting/NumberingManager.d.ts.map +1 -1
  427. package/dist/formatting/NumberingManager.js +28 -28
  428. package/dist/formatting/NumberingManager.js.map +1 -1
  429. package/dist/formatting/Style.d.ts +14 -7
  430. package/dist/formatting/Style.d.ts.map +1 -1
  431. package/dist/formatting/Style.js +309 -112
  432. package/dist/formatting/Style.js.map +1 -1
  433. package/dist/formatting/StylesManager.d.ts +2 -2
  434. package/dist/formatting/StylesManager.d.ts.map +1 -1
  435. package/dist/formatting/StylesManager.js +52 -52
  436. package/dist/formatting/StylesManager.js.map +1 -1
  437. package/dist/helpers/CleanupHelper.d.ts +1 -1
  438. package/dist/helpers/CleanupHelper.d.ts.map +1 -1
  439. package/dist/helpers/CleanupHelper.js +15 -15
  440. package/dist/helpers/CleanupHelper.js.map +1 -1
  441. package/dist/index.d.ts +81 -90
  442. package/dist/index.d.ts.map +1 -1
  443. package/dist/index.js +286 -317
  444. package/dist/index.js.map +1 -1
  445. package/dist/internal.d.ts +16 -0
  446. package/dist/internal.d.ts.map +1 -0
  447. package/dist/internal.js +42 -0
  448. package/dist/internal.js.map +1 -0
  449. package/dist/managers/DrawingManager.d.ts +3 -3
  450. package/dist/managers/DrawingManager.d.ts.map +1 -1
  451. package/dist/managers/DrawingManager.js +12 -12
  452. package/dist/managers/DrawingManager.js.map +1 -1
  453. package/dist/{utils → processors}/ChangelogGenerator.d.ts +2 -2
  454. package/dist/processors/ChangelogGenerator.d.ts.map +1 -0
  455. package/dist/{utils → processors}/ChangelogGenerator.js +2 -2
  456. package/dist/processors/ChangelogGenerator.js.map +1 -0
  457. package/dist/processors/CompatibilityUpgrader.d.ts.map +1 -0
  458. package/dist/{utils → processors}/CompatibilityUpgrader.js +10 -10
  459. package/dist/processors/CompatibilityUpgrader.js.map +1 -0
  460. package/dist/{utils → processors}/InMemoryRevisionAcceptor.d.ts +3 -3
  461. package/dist/processors/InMemoryRevisionAcceptor.d.ts.map +1 -0
  462. package/dist/{utils → processors}/InMemoryRevisionAcceptor.js +84 -27
  463. package/dist/processors/InMemoryRevisionAcceptor.js.map +1 -0
  464. package/dist/{utils → processors}/MoveOperationHelper.d.ts +4 -4
  465. package/dist/processors/MoveOperationHelper.d.ts.map +1 -0
  466. package/dist/{utils → processors}/MoveOperationHelper.js +10 -10
  467. package/dist/processors/MoveOperationHelper.js.map +1 -0
  468. package/dist/{utils → processors}/RevisionAwareProcessor.d.ts +3 -3
  469. package/dist/processors/RevisionAwareProcessor.d.ts.map +1 -0
  470. package/dist/{utils → processors}/RevisionAwareProcessor.js +2 -2
  471. package/dist/processors/RevisionAwareProcessor.js.map +1 -0
  472. package/dist/{utils → processors}/RevisionWalker.d.ts +2 -1
  473. package/dist/processors/RevisionWalker.d.ts.map +1 -0
  474. package/dist/{utils → processors}/RevisionWalker.js +28 -0
  475. package/dist/processors/RevisionWalker.js.map +1 -0
  476. package/dist/{utils → processors}/SelectiveRevisionAcceptor.d.ts +4 -3
  477. package/dist/processors/SelectiveRevisionAcceptor.d.ts.map +1 -0
  478. package/dist/processors/SelectiveRevisionAcceptor.js +402 -0
  479. package/dist/processors/SelectiveRevisionAcceptor.js.map +1 -0
  480. package/dist/processors/ShadingResolver.d.ts +6 -0
  481. package/dist/processors/ShadingResolver.d.ts.map +1 -0
  482. package/dist/{utils → processors}/ShadingResolver.js +2 -2
  483. package/dist/processors/ShadingResolver.js.map +1 -0
  484. package/dist/{utils → processors}/acceptRevisions.d.ts +1 -1
  485. package/dist/processors/acceptRevisions.d.ts.map +1 -0
  486. package/dist/{utils → processors}/acceptRevisions.js +24 -4
  487. package/dist/processors/acceptRevisions.js.map +1 -0
  488. package/dist/{utils → processors}/cnfStyleDecoder.d.ts +1 -1
  489. package/dist/processors/cnfStyleDecoder.d.ts.map +1 -0
  490. package/dist/processors/cnfStyleDecoder.js.map +1 -0
  491. package/dist/processors/stripTrackedChanges.d.ts +3 -0
  492. package/dist/processors/stripTrackedChanges.d.ts.map +1 -0
  493. package/dist/{utils → processors}/stripTrackedChanges.js +16 -6
  494. package/dist/processors/stripTrackedChanges.js.map +1 -0
  495. package/dist/tracking/DocumentTrackingContext.d.ts +4 -4
  496. package/dist/tracking/DocumentTrackingContext.d.ts.map +1 -1
  497. package/dist/tracking/DocumentTrackingContext.js +38 -43
  498. package/dist/tracking/DocumentTrackingContext.js.map +1 -1
  499. package/dist/tracking/TrackingContext.d.ts +8 -8
  500. package/dist/tracking/TrackingContext.d.ts.map +1 -1
  501. package/dist/tracking/TrackingContext.js.map +1 -1
  502. package/dist/types/document-types.d.ts +28 -0
  503. package/dist/types/document-types.d.ts.map +1 -0
  504. package/dist/types/document-types.js +3 -0
  505. package/dist/types/document-types.js.map +1 -0
  506. package/dist/types/formatting.d.ts +4 -4
  507. package/dist/types/formatting.d.ts.map +1 -1
  508. package/dist/types/formatting.js.map +1 -1
  509. package/dist/types/settings-types.d.ts +6 -0
  510. package/dist/types/settings-types.d.ts.map +1 -1
  511. package/dist/types/settings-types.js.map +1 -1
  512. package/dist/utils/KeyedRegistry.d.ts +13 -0
  513. package/dist/utils/KeyedRegistry.d.ts.map +1 -0
  514. package/dist/utils/KeyedRegistry.js +36 -0
  515. package/dist/utils/KeyedRegistry.js.map +1 -0
  516. package/dist/utils/corruptionDetection.d.ts +1 -1
  517. package/dist/utils/corruptionDetection.d.ts.map +1 -1
  518. package/dist/utils/corruptionDetection.js +4 -4
  519. package/dist/utils/corruptionDetection.js.map +1 -1
  520. package/dist/utils/deepEqual.d.ts +2 -0
  521. package/dist/utils/deepEqual.d.ts.map +1 -0
  522. package/dist/utils/deepEqual.js +50 -0
  523. package/dist/utils/deepEqual.js.map +1 -0
  524. package/dist/utils/list-detection.d.ts +2 -2
  525. package/dist/utils/list-detection.d.ts.map +1 -1
  526. package/dist/utils/list-detection.js.map +1 -1
  527. package/dist/utils/parsingHelpers.d.ts +1 -1
  528. package/dist/utils/parsingHelpers.d.ts.map +1 -1
  529. package/dist/utils/parsingHelpers.js +2 -2
  530. package/dist/utils/parsingHelpers.js.map +1 -1
  531. package/dist/utils/validation.js +7 -7
  532. package/dist/utils/validation.js.map +1 -1
  533. package/dist/utils/xmlSanitization.js +2 -2
  534. package/dist/utils/xmlSanitization.js.map +1 -1
  535. package/dist/validation/RevisionAutoFixer.d.ts +4 -4
  536. package/dist/validation/RevisionAutoFixer.d.ts.map +1 -1
  537. package/dist/validation/RevisionAutoFixer.js +11 -11
  538. package/dist/validation/RevisionAutoFixer.js.map +1 -1
  539. package/dist/validation/RevisionValidator.d.ts +5 -4
  540. package/dist/validation/RevisionValidator.d.ts.map +1 -1
  541. package/dist/validation/RevisionValidator.js +29 -30
  542. package/dist/validation/RevisionValidator.js.map +1 -1
  543. package/dist/validation/ValidationRuleRegistry.d.ts +27 -0
  544. package/dist/validation/ValidationRuleRegistry.d.ts.map +1 -0
  545. package/dist/validation/ValidationRuleRegistry.js +43 -0
  546. package/dist/validation/ValidationRuleRegistry.js.map +1 -0
  547. package/dist/validation/index.d.ts +3 -3
  548. package/dist/validation/index.d.ts.map +1 -1
  549. package/dist/validation/index.js +10 -10
  550. package/dist/validation/index.js.map +1 -1
  551. package/dist/xml/XMLBuilder.d.ts +6 -1
  552. package/dist/xml/XMLBuilder.d.ts.map +1 -1
  553. package/dist/xml/XMLBuilder.js +11 -6
  554. package/dist/xml/XMLBuilder.js.map +1 -1
  555. package/dist/xml/XMLParser.js +6 -6
  556. package/dist/xml/XMLParser.js.map +1 -1
  557. package/dist/zip/ZipHandler.d.ts +1 -1
  558. package/dist/zip/ZipHandler.d.ts.map +1 -1
  559. package/dist/zip/ZipHandler.js +8 -8
  560. package/dist/zip/ZipHandler.js.map +1 -1
  561. package/dist/zip/ZipReader.d.ts +1 -1
  562. package/dist/zip/ZipReader.d.ts.map +1 -1
  563. package/dist/zip/ZipReader.js +14 -14
  564. package/dist/zip/ZipReader.js.map +1 -1
  565. package/dist/zip/ZipWriter.d.ts +1 -1
  566. package/dist/zip/ZipWriter.d.ts.map +1 -1
  567. package/dist/zip/ZipWriter.js +10 -10
  568. package/dist/zip/ZipWriter.js.map +1 -1
  569. package/package.json +20 -4
  570. package/src/constants/legacyCompatFlags.ts +1 -1
  571. package/src/core/Document.ts +478 -167
  572. package/src/core/DocumentContent.ts +14 -11
  573. package/src/core/DocumentEvents.ts +90 -0
  574. package/src/core/DocumentGenerator.ts +49 -22
  575. package/src/core/DocumentParser.ts +2235 -620
  576. package/src/core/DocumentValidator.ts +7 -7
  577. package/src/core/ElementRegistry.ts +69 -0
  578. package/src/core/Relationship.ts +1 -1
  579. package/src/core/RelationshipManager.ts +4 -4
  580. package/src/elements/AlternateContent.ts +1 -1
  581. package/src/elements/Bookmark.ts +52 -4
  582. package/src/elements/BookmarkManager.ts +2 -2
  583. package/src/elements/Comment.ts +3 -3
  584. package/src/elements/CommentManager.ts +4 -4
  585. package/src/elements/CommonTypes.ts +45 -7
  586. package/src/elements/CustomXml.ts +1 -1
  587. package/src/elements/Endnote.ts +2 -2
  588. package/src/elements/EndnoteManager.ts +3 -3
  589. package/src/elements/Field.ts +44 -10
  590. package/src/elements/FieldHelpers.ts +2 -2
  591. package/src/elements/Footer.ts +4 -4
  592. package/src/elements/Footnote.ts +2 -2
  593. package/src/elements/FootnoteManager.ts +3 -3
  594. package/src/elements/Header.ts +4 -4
  595. package/src/elements/HeaderFooterManager.ts +2 -2
  596. package/src/elements/Hyperlink.ts +16 -12
  597. package/src/elements/Image.ts +3 -3
  598. package/src/elements/ImageManager.ts +2 -2
  599. package/src/elements/ImageRun.ts +3 -3
  600. package/src/elements/MathElement.ts +1 -1
  601. package/src/elements/Paragraph.ts +221 -88
  602. package/src/elements/PreservedElement.ts +1 -1
  603. package/src/elements/PropertyChangeTypes.ts +2 -2
  604. package/src/elements/RangeMarker.ts +153 -12
  605. package/src/elements/RegisteredBodyElement.ts +52 -0
  606. package/src/elements/Revision.ts +14 -14
  607. package/src/elements/RevisionContent.ts +3 -3
  608. package/src/elements/RevisionManager.ts +3 -3
  609. package/src/elements/Run.ts +221 -94
  610. package/src/elements/Section.ts +136 -69
  611. package/src/elements/Shape.ts +4 -4
  612. package/src/elements/StructuredDocumentTag.ts +3 -3
  613. package/src/elements/Table.ts +91 -27
  614. package/src/elements/TableCell.ts +62 -34
  615. package/src/elements/TableGridChange.ts +1 -1
  616. package/src/elements/TableOfContents.ts +1 -1
  617. package/src/elements/TableOfContentsElement.ts +2 -2
  618. package/src/elements/TableRow.ts +192 -48
  619. package/src/elements/TextBox.ts +5 -5
  620. package/src/formatting/AbstractNumbering.ts +3 -3
  621. package/src/formatting/NumberingInstance.ts +2 -2
  622. package/src/formatting/NumberingLevel.ts +201 -10
  623. package/src/formatting/NumberingManager.ts +5 -5
  624. package/src/formatting/Style.ts +382 -86
  625. package/src/formatting/StylesManager.ts +4 -4
  626. package/src/helpers/CleanupHelper.ts +6 -6
  627. package/src/index.ts +118 -127
  628. package/src/internal.ts +79 -0
  629. package/src/managers/DrawingManager.ts +3 -3
  630. package/src/{utils → processors}/ChangelogGenerator.ts +3 -3
  631. package/src/{utils → processors}/CompatibilityUpgrader.ts +2 -2
  632. package/src/{utils → processors}/InMemoryRevisionAcceptor.ts +100 -12
  633. package/src/{utils → processors}/MoveOperationHelper.ts +5 -5
  634. package/src/{utils → processors}/RevisionAwareProcessor.ts +3 -3
  635. package/src/{utils → processors}/RevisionWalker.ts +42 -1
  636. package/src/{utils → processors}/SelectiveRevisionAcceptor.ts +98 -39
  637. package/src/{utils → processors}/ShadingResolver.ts +5 -5
  638. package/src/{utils → processors}/acceptRevisions.ts +77 -9
  639. package/src/{utils → processors}/cnfStyleDecoder.ts +1 -1
  640. package/src/{utils → processors}/stripTrackedChanges.ts +35 -10
  641. package/src/tracking/DocumentTrackingContext.ts +12 -14
  642. package/src/tracking/TrackingContext.ts +8 -8
  643. package/src/types/document-types.ts +53 -0
  644. package/src/types/formatting.ts +4 -4
  645. package/src/types/settings-types.ts +32 -0
  646. package/src/utils/KeyedRegistry.ts +41 -0
  647. package/src/utils/corruptionDetection.ts +2 -2
  648. package/src/utils/deepEqual.ts +58 -0
  649. package/src/utils/list-detection.ts +2 -2
  650. package/src/utils/parsingHelpers.ts +11 -3
  651. package/src/utils/validation.ts +3 -3
  652. package/src/utils/xmlSanitization.ts +1 -1
  653. package/src/validation/RevisionAutoFixer.ts +5 -5
  654. package/src/validation/RevisionValidator.ts +39 -28
  655. package/src/validation/ValidationRuleRegistry.ts +86 -0
  656. package/src/validation/index.ts +3 -3
  657. package/src/xml/XMLBuilder.ts +13 -3
  658. package/src/xml/XMLParser.ts +2 -2
  659. package/src/zip/ZipHandler.ts +4 -4
  660. package/src/zip/ZipReader.ts +3 -3
  661. package/src/zip/ZipWriter.ts +3 -3
  662. package/dist/utils/ChangelogGenerator.d.ts.map +0 -1
  663. package/dist/utils/ChangelogGenerator.js.map +0 -1
  664. package/dist/utils/CompatibilityUpgrader.d.ts.map +0 -1
  665. package/dist/utils/CompatibilityUpgrader.js.map +0 -1
  666. package/dist/utils/InMemoryRevisionAcceptor.d.ts.map +0 -1
  667. package/dist/utils/InMemoryRevisionAcceptor.js.map +0 -1
  668. package/dist/utils/MoveOperationHelper.d.ts.map +0 -1
  669. package/dist/utils/MoveOperationHelper.js.map +0 -1
  670. package/dist/utils/RevisionAwareProcessor.d.ts.map +0 -1
  671. package/dist/utils/RevisionAwareProcessor.js.map +0 -1
  672. package/dist/utils/RevisionWalker.d.ts.map +0 -1
  673. package/dist/utils/RevisionWalker.js.map +0 -1
  674. package/dist/utils/SelectiveRevisionAcceptor.d.ts.map +0 -1
  675. package/dist/utils/SelectiveRevisionAcceptor.js.map +0 -1
  676. package/dist/utils/ShadingResolver.d.ts +0 -6
  677. package/dist/utils/ShadingResolver.d.ts.map +0 -1
  678. package/dist/utils/ShadingResolver.js.map +0 -1
  679. package/dist/utils/acceptRevisions.d.ts.map +0 -1
  680. package/dist/utils/acceptRevisions.js.map +0 -1
  681. package/dist/utils/cnfStyleDecoder.d.ts.map +0 -1
  682. package/dist/utils/cnfStyleDecoder.js.map +0 -1
  683. package/dist/utils/stripTrackedChanges.d.ts +0 -3
  684. package/dist/utils/stripTrackedChanges.d.ts.map +0 -1
  685. package/dist/utils/stripTrackedChanges.js.map +0 -1
  686. package/src/__tests__/helper-methods.test.ts +0 -512
  687. package/src/constants/CLAUDE.md +0 -28
  688. package/src/core/CLAUDE.md +0 -113
  689. package/src/elements/CLAUDE.md +0 -142
  690. package/src/formatting/CLAUDE.md +0 -78
  691. package/src/managers/CLAUDE.md +0 -47
  692. package/src/tracking/CLAUDE.md +0 -30
  693. package/src/types/CLAUDE.md +0 -39
  694. package/src/utils/CLAUDE.md +0 -168
  695. package/src/validation/CLAUDE.md +0 -40
  696. package/src/xml/CLAUDE.md +0 -65
  697. package/src/zip/CLAUDE.md +0 -55
  698. /package/dist/{utils → processors}/CompatibilityUpgrader.d.ts +0 -0
  699. /package/dist/{utils → processors}/cnfStyleDecoder.js +0 -0
@@ -8,8 +8,8 @@ exports.createMergeField = createMergeField;
8
8
  exports.createRefField = createRefField;
9
9
  exports.createIFField = createIFField;
10
10
  exports.createNestedField = createNestedField;
11
- const Field_1 = require("./Field");
12
- const logger_1 = require("../utils/logger");
11
+ const Field_js_1 = require("./Field.js");
12
+ const logger_js_1 = require("../utils/logger.js");
13
13
  function parseHyperlinkInstruction(instruction) {
14
14
  if (!instruction) {
15
15
  return null;
@@ -26,7 +26,7 @@ function parseHyperlinkInstruction(instruction) {
26
26
  url = decodeURIComponent(url);
27
27
  }
28
28
  catch (e) {
29
- logger_1.defaultLogger.debug(`[FieldHelpers] Failed to decode URL: ${url}`);
29
+ logger_js_1.defaultLogger.debug(`[FieldHelpers] Failed to decode URL: ${url}`);
30
30
  }
31
31
  }
32
32
  let anchor;
@@ -37,7 +37,7 @@ function parseHyperlinkInstruction(instruction) {
37
37
  anchor = decodeURIComponent(anchor);
38
38
  }
39
39
  catch (e) {
40
- logger_1.defaultLogger.debug(`[FieldHelpers] Failed to decode anchor: ${anchor}`);
40
+ logger_js_1.defaultLogger.debug(`[FieldHelpers] Failed to decode anchor: ${anchor}`);
41
41
  }
42
42
  }
43
43
  if (!url && !anchor) {
@@ -89,11 +89,11 @@ function isHyperlinkInstruction(instruction) {
89
89
  return instruction.trim().toUpperCase().startsWith('HYPERLINK');
90
90
  }
91
91
  function createNestedIFMergeField(condition, mergeFieldName, trueText = '', falseText = '') {
92
- const mergeField = new Field_1.ComplexField({
92
+ const mergeField = new Field_js_1.ComplexField({
93
93
  instruction: ` MERGEFIELD ${mergeFieldName} `,
94
94
  result: `[${mergeFieldName}]`,
95
95
  });
96
- const ifField = new Field_1.ComplexField({
96
+ const ifField = new Field_js_1.ComplexField({
97
97
  instruction: ` IF ${condition} "${trueText}" "${falseText}" `,
98
98
  result: trueText || falseText,
99
99
  });
@@ -106,7 +106,7 @@ function createMergeField(fieldName, format) {
106
106
  instruction += ` ${format}`;
107
107
  }
108
108
  instruction += ' \\* MERGEFORMAT ';
109
- return new Field_1.ComplexField({
109
+ return new Field_js_1.ComplexField({
110
110
  instruction,
111
111
  result: `[${fieldName}]`,
112
112
  });
@@ -120,20 +120,20 @@ function createRefField(bookmarkName, format) {
120
120
  instruction += ' \\h';
121
121
  }
122
122
  instruction += ' \\* MERGEFORMAT ';
123
- return new Field_1.ComplexField({
123
+ return new Field_js_1.ComplexField({
124
124
  instruction,
125
125
  result: `[${bookmarkName}]`,
126
126
  });
127
127
  }
128
128
  function createIFField(condition, trueContent, falseContent = '') {
129
129
  const instruction = ` IF ${condition} "${trueContent}" "${falseContent}" `;
130
- return new Field_1.ComplexField({
130
+ return new Field_js_1.ComplexField({
131
131
  instruction,
132
132
  result: trueContent,
133
133
  });
134
134
  }
135
135
  function createNestedField(outerInstruction, nestedFields) {
136
- const field = new Field_1.ComplexField({
136
+ const field = new Field_js_1.ComplexField({
137
137
  instruction: outerInstruction,
138
138
  });
139
139
  for (const nested of nestedFields) {
@@ -1 +1 @@
1
- {"version":3,"file":"FieldHelpers.js","sourceRoot":"","sources":["../../src/elements/FieldHelpers.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Helper functions for creating complex and nested fields\n */\n\nimport { ComplexField } from './Field';\nimport { defaultLogger } from '../utils/logger';\n\n/**\n * Parsed components of a HYPERLINK field instruction\n */\nexport interface ParsedHyperlinkInstruction {\n /** Base URL (with encoded characters decoded) */\n url: string;\n /** Anchor/fragment from \\l switch (decoded) */\n anchor?: string;\n /** Tooltip text from \\o switch */\n tooltip?: string;\n /** Whether \\h switch is present (creates hyperlink) */\n hasHSwitch: boolean;\n /** Combined full URL (url + \"#\" + anchor if both present) */\n fullUrl: string;\n /** Original raw instruction string */\n rawInstruction: string;\n}\n\n/**\n * Parses a HYPERLINK field instruction string into its components\n *\n * HYPERLINK field syntax per ECMA-376:\n * - HYPERLINK \"url\" - basic external hyperlink\n * - HYPERLINK \\l \"anchor\" - anchor-only internal hyperlink (no URL)\n * - \\l \"anchor\" - specifies a location (anchor/fragment) within the target\n * - \\o \"tooltip\" - specifies the tooltip/screentip text\n * - \\h - creates a hyperlink (always present for clickable links)\n * - \\n - opens link in new window\n * - \\t \"target\" - specifies target frame\n *\n * @param instruction The raw field instruction string (e.g., 'HYPERLINK \"url\" \\l \"anchor\" \\h')\n * @returns Parsed components or null if not a valid HYPERLINK instruction\n *\n * @example\n * ```typescript\n * // External hyperlink with anchor\n * const result = parseHyperlinkInstruction('HYPERLINK \"https://example.com/\" \\\\l \"section1\" \\\\h');\n * // result.url = \"https://example.com/\"\n * // result.anchor = \"section1\"\n * // result.fullUrl = \"https://example.com/#section1\"\n *\n * // Anchor-only internal hyperlink (e.g., \"Top of the Document\")\n * const result2 = parseHyperlinkInstruction('HYPERLINK \\\\l \"_top\" \\\\h');\n * // result2.url = \"\"\n * // result2.anchor = \"_top\"\n * // result2.fullUrl = \"#_top\"\n * ```\n */\nexport function parseHyperlinkInstruction(instruction: string): ParsedHyperlinkInstruction | null {\n if (!instruction) {\n return null;\n }\n\n // Normalize whitespace and trim\n const normalized = instruction.trim();\n\n // Check if this is a HYPERLINK instruction\n if (!normalized.toUpperCase().startsWith('HYPERLINK')) {\n return null;\n }\n\n // Extract the URL (first quoted string after HYPERLINK, before any switches)\n // URL is optional - anchor-only hyperlinks like 'HYPERLINK \\l \"_top\"' are valid\n let url = '';\n const urlMatch = /HYPERLINK\\s+\"([^\"]*)\"/i.exec(normalized);\n if (urlMatch?.[1] !== undefined) {\n url = urlMatch[1];\n // Decode URL-encoded characters\n try {\n url = decodeURIComponent(url);\n } catch (e) {\n defaultLogger.debug(`[FieldHelpers] Failed to decode URL: ${url}`);\n }\n }\n\n // Extract \\l switch (anchor/fragment)\n let anchor: string | undefined;\n const anchorMatch = /\\\\l\\s+\"([^\"]*)\"/i.exec(normalized);\n if (anchorMatch?.[1] !== undefined) {\n anchor = anchorMatch[1];\n // Decode anchor as well\n try {\n anchor = decodeURIComponent(anchor);\n } catch (e) {\n defaultLogger.debug(`[FieldHelpers] Failed to decode anchor: ${anchor}`);\n }\n }\n\n // Must have either URL or anchor to be valid\n if (!url && !anchor) {\n return null;\n }\n\n // Extract \\o switch (tooltip)\n let tooltip: string | undefined;\n const tooltipMatch = /\\\\o\\s+\"([^\"]*)\"/i.exec(normalized);\n if (tooltipMatch?.[1] !== undefined) {\n tooltip = tooltipMatch[1];\n }\n\n // Check for \\h switch\n const hasHSwitch = /\\\\h(?:\\s|$)/i.test(normalized);\n\n // Build full URL by combining base URL and anchor\n let fullUrl: string = url;\n if (anchor) {\n // If URL already has a fragment, replace it; otherwise append\n const hashIndex = url.indexOf('#');\n if (hashIndex >= 0) {\n fullUrl = url.substring(0, hashIndex) + '#' + anchor;\n } else if (url) {\n fullUrl = url + '#' + anchor;\n } else {\n // Anchor-only: just use #anchor\n fullUrl = '#' + anchor;\n }\n }\n\n return {\n url,\n anchor,\n tooltip,\n hasHSwitch,\n fullUrl,\n rawInstruction: instruction,\n };\n}\n\n/**\n * Creates a HYPERLINK field instruction string from components\n *\n * @param url The target URL\n * @param anchor Optional anchor/fragment (will use \\l switch)\n * @param tooltip Optional tooltip text (will use \\o switch)\n * @returns Properly formatted HYPERLINK instruction string\n *\n * @example\n * ```typescript\n * const instr = buildHyperlinkInstruction('https://example.com/', 'section1', 'Click here');\n * // Returns: 'HYPERLINK \"https://example.com/\" \\\\l \"section1\" \\\\o \"Click here\" \\\\h'\n * ```\n */\nexport function buildHyperlinkInstruction(url: string, anchor?: string, tooltip?: string): string {\n let instruction = `HYPERLINK \"${url}\"`;\n\n if (anchor) {\n instruction += ` \\\\l \"${anchor}\"`;\n }\n\n if (tooltip) {\n instruction += ` \\\\o \"${tooltip}\"`;\n }\n\n // Always add \\h switch for clickable hyperlinks\n instruction += ' \\\\h';\n\n return instruction;\n}\n\n/**\n * Checks if a field instruction is a HYPERLINK field\n *\n * @param instruction The field instruction to check\n * @returns True if the instruction is a HYPERLINK field\n */\nexport function isHyperlinkInstruction(instruction: string): boolean {\n if (!instruction) {\n return false;\n }\n return instruction.trim().toUpperCase().startsWith('HYPERLINK');\n}\n\n/**\n * Creates a nested IF field containing a MERGEFIELD\n * This is a common pattern for conditional mail merge\n *\n * @param condition The IF condition (e.g., 'Status = \"Active\"')\n * @param mergeFieldName The merge field name to include\n * @param trueText Text to show when condition is true\n * @param falseText Text to show when condition is false\n * @returns ComplexField with nested MERGEFIELD\n *\n * @example\n * ```typescript\n * const field = createNestedIFMergeField('Status = \"Active\"', 'Name', 'Active: ', 'Inactive');\n * // Result: IF field that shows \"Active: [Name]\" if Status is Active, otherwise \"Inactive\"\n * ```\n */\nexport function createNestedIFMergeField(\n condition: string,\n mergeFieldName: string,\n trueText = '',\n falseText = ''\n): ComplexField {\n // Create the nested MERGEFIELD\n const mergeField = new ComplexField({\n instruction: ` MERGEFIELD ${mergeFieldName} `,\n result: `[${mergeFieldName}]`,\n });\n\n // Create the IF field with nested MERGEFIELD\n const ifField = new ComplexField({\n instruction: ` IF ${condition} \"${trueText}\" \"${falseText}\" `,\n result: trueText || falseText,\n });\n\n ifField.addNestedField(mergeField);\n\n return ifField;\n}\n\n/**\n * Creates a MERGEFIELD with custom formatting\n *\n * @param fieldName The merge field name\n * @param format Optional format switches\n * @returns ComplexField for MERGEFIELD\n *\n * @example\n * ```typescript\n * const field = createMergeField('Date', '\\\\@ \"MMMM d, yyyy\"');\n * ```\n */\nexport function createMergeField(fieldName: string, format?: string): ComplexField {\n let instruction = ` MERGEFIELD ${fieldName}`;\n\n if (format) {\n instruction += ` ${format}`;\n }\n\n instruction += ' \\\\* MERGEFORMAT ';\n\n return new ComplexField({\n instruction,\n result: `[${fieldName}]`,\n });\n}\n\n/**\n * Creates a REF field with a nested field in the bookmark reference\n * Used for complex cross-references\n *\n * @param bookmarkName The bookmark to reference\n * @param format Optional format switches\n * @returns ComplexField for REF\n *\n * @example\n * ```typescript\n * const field = createRefField('Chapter1', '\\\\h');\n * ```\n */\nexport function createRefField(bookmarkName: string, format?: string): ComplexField {\n let instruction = ` REF ${bookmarkName}`;\n\n if (format) {\n instruction += ` ${format}`;\n } else {\n instruction += ' \\\\h'; // Hyperlink by default\n }\n\n instruction += ' \\\\* MERGEFORMAT ';\n\n return new ComplexField({\n instruction,\n result: `[${bookmarkName}]`,\n });\n}\n\n/**\n * Creates an IF field with custom true/false branches\n *\n * @param condition The condition to evaluate\n * @param trueContent Content to show when true\n * @param falseContent Content to show when false\n * @returns ComplexField for IF\n *\n * @example\n * ```typescript\n * const field = createIFField('Amount > 1000', 'High Value', 'Normal');\n * ```\n */\nexport function createIFField(\n condition: string,\n trueContent: string,\n falseContent = ''\n): ComplexField {\n const instruction = ` IF ${condition} \"${trueContent}\" \"${falseContent}\" `;\n\n return new ComplexField({\n instruction,\n result: trueContent,\n });\n}\n\n/**\n * Creates a complex nested field structure with multiple levels\n * Useful for advanced scenarios like nested IF statements\n *\n * @param outerInstruction The outer field instruction\n * @param nestedFields Array of nested fields to include\n * @returns ComplexField with nested structure\n *\n * @example\n * ```typescript\n * const innerField = createMergeField('Amount');\n * const field = createNestedField('IF Amount > 0', [innerField]);\n * ```\n */\nexport function createNestedField(\n outerInstruction: string,\n nestedFields: ComplexField[]\n): ComplexField {\n const field = new ComplexField({\n instruction: outerInstruction,\n });\n\n for (const nested of nestedFields) {\n field.addNestedField(nested);\n }\n\n return field;\n}\n"]}
1
+ {"version":3,"file":"FieldHelpers.js","sourceRoot":"","sources":["../../src/elements/FieldHelpers.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Helper functions for creating complex and nested fields\n */\n\nimport { ComplexField } from './Field.js';\nimport { defaultLogger } from '../utils/logger.js';\n\n/**\n * Parsed components of a HYPERLINK field instruction\n */\nexport interface ParsedHyperlinkInstruction {\n /** Base URL (with encoded characters decoded) */\n url: string;\n /** Anchor/fragment from \\l switch (decoded) */\n anchor?: string;\n /** Tooltip text from \\o switch */\n tooltip?: string;\n /** Whether \\h switch is present (creates hyperlink) */\n hasHSwitch: boolean;\n /** Combined full URL (url + \"#\" + anchor if both present) */\n fullUrl: string;\n /** Original raw instruction string */\n rawInstruction: string;\n}\n\n/**\n * Parses a HYPERLINK field instruction string into its components\n *\n * HYPERLINK field syntax per ECMA-376:\n * - HYPERLINK \"url\" - basic external hyperlink\n * - HYPERLINK \\l \"anchor\" - anchor-only internal hyperlink (no URL)\n * - \\l \"anchor\" - specifies a location (anchor/fragment) within the target\n * - \\o \"tooltip\" - specifies the tooltip/screentip text\n * - \\h - creates a hyperlink (always present for clickable links)\n * - \\n - opens link in new window\n * - \\t \"target\" - specifies target frame\n *\n * @param instruction The raw field instruction string (e.g., 'HYPERLINK \"url\" \\l \"anchor\" \\h')\n * @returns Parsed components or null if not a valid HYPERLINK instruction\n *\n * @example\n * ```typescript\n * // External hyperlink with anchor\n * const result = parseHyperlinkInstruction('HYPERLINK \"https://example.com/\" \\\\l \"section1\" \\\\h');\n * // result.url = \"https://example.com/\"\n * // result.anchor = \"section1\"\n * // result.fullUrl = \"https://example.com/#section1\"\n *\n * // Anchor-only internal hyperlink (e.g., \"Top of the Document\")\n * const result2 = parseHyperlinkInstruction('HYPERLINK \\\\l \"_top\" \\\\h');\n * // result2.url = \"\"\n * // result2.anchor = \"_top\"\n * // result2.fullUrl = \"#_top\"\n * ```\n */\nexport function parseHyperlinkInstruction(instruction: string): ParsedHyperlinkInstruction | null {\n if (!instruction) {\n return null;\n }\n\n // Normalize whitespace and trim\n const normalized = instruction.trim();\n\n // Check if this is a HYPERLINK instruction\n if (!normalized.toUpperCase().startsWith('HYPERLINK')) {\n return null;\n }\n\n // Extract the URL (first quoted string after HYPERLINK, before any switches)\n // URL is optional - anchor-only hyperlinks like 'HYPERLINK \\l \"_top\"' are valid\n let url = '';\n const urlMatch = /HYPERLINK\\s+\"([^\"]*)\"/i.exec(normalized);\n if (urlMatch?.[1] !== undefined) {\n url = urlMatch[1];\n // Decode URL-encoded characters\n try {\n url = decodeURIComponent(url);\n } catch (e) {\n defaultLogger.debug(`[FieldHelpers] Failed to decode URL: ${url}`);\n }\n }\n\n // Extract \\l switch (anchor/fragment)\n let anchor: string | undefined;\n const anchorMatch = /\\\\l\\s+\"([^\"]*)\"/i.exec(normalized);\n if (anchorMatch?.[1] !== undefined) {\n anchor = anchorMatch[1];\n // Decode anchor as well\n try {\n anchor = decodeURIComponent(anchor);\n } catch (e) {\n defaultLogger.debug(`[FieldHelpers] Failed to decode anchor: ${anchor}`);\n }\n }\n\n // Must have either URL or anchor to be valid\n if (!url && !anchor) {\n return null;\n }\n\n // Extract \\o switch (tooltip)\n let tooltip: string | undefined;\n const tooltipMatch = /\\\\o\\s+\"([^\"]*)\"/i.exec(normalized);\n if (tooltipMatch?.[1] !== undefined) {\n tooltip = tooltipMatch[1];\n }\n\n // Check for \\h switch\n const hasHSwitch = /\\\\h(?:\\s|$)/i.test(normalized);\n\n // Build full URL by combining base URL and anchor\n let fullUrl: string = url;\n if (anchor) {\n // If URL already has a fragment, replace it; otherwise append\n const hashIndex = url.indexOf('#');\n if (hashIndex >= 0) {\n fullUrl = url.substring(0, hashIndex) + '#' + anchor;\n } else if (url) {\n fullUrl = url + '#' + anchor;\n } else {\n // Anchor-only: just use #anchor\n fullUrl = '#' + anchor;\n }\n }\n\n return {\n url,\n anchor,\n tooltip,\n hasHSwitch,\n fullUrl,\n rawInstruction: instruction,\n };\n}\n\n/**\n * Creates a HYPERLINK field instruction string from components\n *\n * @param url The target URL\n * @param anchor Optional anchor/fragment (will use \\l switch)\n * @param tooltip Optional tooltip text (will use \\o switch)\n * @returns Properly formatted HYPERLINK instruction string\n *\n * @example\n * ```typescript\n * const instr = buildHyperlinkInstruction('https://example.com/', 'section1', 'Click here');\n * // Returns: 'HYPERLINK \"https://example.com/\" \\\\l \"section1\" \\\\o \"Click here\" \\\\h'\n * ```\n */\nexport function buildHyperlinkInstruction(url: string, anchor?: string, tooltip?: string): string {\n let instruction = `HYPERLINK \"${url}\"`;\n\n if (anchor) {\n instruction += ` \\\\l \"${anchor}\"`;\n }\n\n if (tooltip) {\n instruction += ` \\\\o \"${tooltip}\"`;\n }\n\n // Always add \\h switch for clickable hyperlinks\n instruction += ' \\\\h';\n\n return instruction;\n}\n\n/**\n * Checks if a field instruction is a HYPERLINK field\n *\n * @param instruction The field instruction to check\n * @returns True if the instruction is a HYPERLINK field\n */\nexport function isHyperlinkInstruction(instruction: string): boolean {\n if (!instruction) {\n return false;\n }\n return instruction.trim().toUpperCase().startsWith('HYPERLINK');\n}\n\n/**\n * Creates a nested IF field containing a MERGEFIELD\n * This is a common pattern for conditional mail merge\n *\n * @param condition The IF condition (e.g., 'Status = \"Active\"')\n * @param mergeFieldName The merge field name to include\n * @param trueText Text to show when condition is true\n * @param falseText Text to show when condition is false\n * @returns ComplexField with nested MERGEFIELD\n *\n * @example\n * ```typescript\n * const field = createNestedIFMergeField('Status = \"Active\"', 'Name', 'Active: ', 'Inactive');\n * // Result: IF field that shows \"Active: [Name]\" if Status is Active, otherwise \"Inactive\"\n * ```\n */\nexport function createNestedIFMergeField(\n condition: string,\n mergeFieldName: string,\n trueText = '',\n falseText = ''\n): ComplexField {\n // Create the nested MERGEFIELD\n const mergeField = new ComplexField({\n instruction: ` MERGEFIELD ${mergeFieldName} `,\n result: `[${mergeFieldName}]`,\n });\n\n // Create the IF field with nested MERGEFIELD\n const ifField = new ComplexField({\n instruction: ` IF ${condition} \"${trueText}\" \"${falseText}\" `,\n result: trueText || falseText,\n });\n\n ifField.addNestedField(mergeField);\n\n return ifField;\n}\n\n/**\n * Creates a MERGEFIELD with custom formatting\n *\n * @param fieldName The merge field name\n * @param format Optional format switches\n * @returns ComplexField for MERGEFIELD\n *\n * @example\n * ```typescript\n * const field = createMergeField('Date', '\\\\@ \"MMMM d, yyyy\"');\n * ```\n */\nexport function createMergeField(fieldName: string, format?: string): ComplexField {\n let instruction = ` MERGEFIELD ${fieldName}`;\n\n if (format) {\n instruction += ` ${format}`;\n }\n\n instruction += ' \\\\* MERGEFORMAT ';\n\n return new ComplexField({\n instruction,\n result: `[${fieldName}]`,\n });\n}\n\n/**\n * Creates a REF field with a nested field in the bookmark reference\n * Used for complex cross-references\n *\n * @param bookmarkName The bookmark to reference\n * @param format Optional format switches\n * @returns ComplexField for REF\n *\n * @example\n * ```typescript\n * const field = createRefField('Chapter1', '\\\\h');\n * ```\n */\nexport function createRefField(bookmarkName: string, format?: string): ComplexField {\n let instruction = ` REF ${bookmarkName}`;\n\n if (format) {\n instruction += ` ${format}`;\n } else {\n instruction += ' \\\\h'; // Hyperlink by default\n }\n\n instruction += ' \\\\* MERGEFORMAT ';\n\n return new ComplexField({\n instruction,\n result: `[${bookmarkName}]`,\n });\n}\n\n/**\n * Creates an IF field with custom true/false branches\n *\n * @param condition The condition to evaluate\n * @param trueContent Content to show when true\n * @param falseContent Content to show when false\n * @returns ComplexField for IF\n *\n * @example\n * ```typescript\n * const field = createIFField('Amount > 1000', 'High Value', 'Normal');\n * ```\n */\nexport function createIFField(\n condition: string,\n trueContent: string,\n falseContent = ''\n): ComplexField {\n const instruction = ` IF ${condition} \"${trueContent}\" \"${falseContent}\" `;\n\n return new ComplexField({\n instruction,\n result: trueContent,\n });\n}\n\n/**\n * Creates a complex nested field structure with multiple levels\n * Useful for advanced scenarios like nested IF statements\n *\n * @param outerInstruction The outer field instruction\n * @param nestedFields Array of nested fields to include\n * @returns ComplexField with nested structure\n *\n * @example\n * ```typescript\n * const innerField = createMergeField('Amount');\n * const field = createNestedField('IF Amount > 0', [innerField]);\n * ```\n */\nexport function createNestedField(\n outerInstruction: string,\n nestedFields: ComplexField[]\n): ComplexField {\n const field = new ComplexField({\n instruction: outerInstruction,\n });\n\n for (const nested of nestedFields) {\n field.addNestedField(nested);\n }\n\n return field;\n}\n"]}
@@ -1,6 +1,6 @@
1
- import { Paragraph } from './Paragraph';
2
- import { RunFormatting } from './Run';
3
- import { Table } from './Table';
1
+ import { Paragraph } from './Paragraph.js';
2
+ import { RunFormatting } from './Run.js';
3
+ import { Table } from './Table.js';
4
4
  export type FooterType = 'default' | 'first' | 'even';
5
5
  type FooterElement = Paragraph | Table;
6
6
  export interface FooterProperties {
@@ -1 +1 @@
1
- {"version":3,"file":"Footer.d.ts","sourceRoot":"","sources":["../../src/elements/Footer.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AACtC,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAKhC,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG,OAAO,GAAG,MAAM,CAAC;AAKtD,KAAK,aAAa,GAAG,SAAS,GAAG,KAAK,CAAC;AAKvC,MAAM,WAAW,gBAAgB;IAE/B,IAAI,CAAC,EAAE,UAAU,CAAC;CACnB;AAKD,qBAAa,MAAM;IACjB,OAAO,CAAC,QAAQ,CAAuB;IACvC,OAAO,CAAC,IAAI,CAAa;IACzB,OAAO,CAAC,QAAQ,CAAC,CAAS;IAC1B,OAAO,CAAC,MAAM,CAAC,CAAS;gBAMZ,UAAU,GAAE,gBAAqB;IAQ7C,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAQ5B,SAAS,IAAI,MAAM,GAAG,SAAS;IAO/B,OAAO,IAAI,UAAU;IAQrB,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAQ7B,WAAW,IAAI,MAAM,GAAG,SAAS;IAQjC,YAAY,CAAC,SAAS,EAAE,SAAS,GAAG,IAAI;IASxC,eAAe,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS;IAwBzC,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,aAAa,GAAG,SAAS;IAW5D,QAAQ,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI;IAU5B,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,KAAK;IASjD,WAAW,IAAI,aAAa,EAAE;IAO9B,eAAe,IAAI,MAAM;IAOzB,KAAK,IAAI,IAAI;IAUb,KAAK,IAAI,MAAM;IA+Bf,OAAO,CAAC,aAAa;IAmDrB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM;IAOnC,MAAM,CAAC,aAAa,IAAI,MAAM;IAO9B,MAAM,CAAC,WAAW,IAAI,MAAM;IAO5B,MAAM,CAAC,UAAU,IAAI,MAAM;IAQ3B,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,gBAAgB,GAAG,MAAM;CAGrD"}
1
+ {"version":3,"file":"Footer.d.ts","sourceRoot":"","sources":["../../src/elements/Footer.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAKnC,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG,OAAO,GAAG,MAAM,CAAC;AAKtD,KAAK,aAAa,GAAG,SAAS,GAAG,KAAK,CAAC;AAKvC,MAAM,WAAW,gBAAgB;IAE/B,IAAI,CAAC,EAAE,UAAU,CAAC;CACnB;AAKD,qBAAa,MAAM;IACjB,OAAO,CAAC,QAAQ,CAAuB;IACvC,OAAO,CAAC,IAAI,CAAa;IACzB,OAAO,CAAC,QAAQ,CAAC,CAAS;IAC1B,OAAO,CAAC,MAAM,CAAC,CAAS;gBAMZ,UAAU,GAAE,gBAAqB;IAQ7C,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAQ5B,SAAS,IAAI,MAAM,GAAG,SAAS;IAO/B,OAAO,IAAI,UAAU;IAQrB,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAQ7B,WAAW,IAAI,MAAM,GAAG,SAAS;IAQjC,YAAY,CAAC,SAAS,EAAE,SAAS,GAAG,IAAI;IASxC,eAAe,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS;IAwBzC,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,aAAa,GAAG,SAAS;IAW5D,QAAQ,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI;IAU5B,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,KAAK;IASjD,WAAW,IAAI,aAAa,EAAE;IAO9B,eAAe,IAAI,MAAM;IAOzB,KAAK,IAAI,IAAI;IAUb,KAAK,IAAI,MAAM;IA+Bf,OAAO,CAAC,aAAa;IAmDrB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM;IAOnC,MAAM,CAAC,aAAa,IAAI,MAAM;IAO9B,MAAM,CAAC,WAAW,IAAI,MAAM;IAO5B,MAAM,CAAC,UAAU,IAAI,MAAM;IAQ3B,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,gBAAgB,GAAG,MAAM;CAGrD"}
@@ -1,8 +1,8 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.Footer = void 0;
4
- const Paragraph_1 = require("./Paragraph");
5
- const Table_1 = require("./Table");
4
+ const Paragraph_js_1 = require("./Paragraph.js");
5
+ const Table_js_1 = require("./Table.js");
6
6
  class Footer {
7
7
  elements = [];
8
8
  type;
@@ -33,7 +33,7 @@ class Footer {
33
33
  return this;
34
34
  }
35
35
  createParagraph(text) {
36
- const para = new Paragraph_1.Paragraph();
36
+ const para = new Paragraph_js_1.Paragraph();
37
37
  if (text) {
38
38
  para.addText(text);
39
39
  }
@@ -41,7 +41,7 @@ class Footer {
41
41
  return para;
42
42
  }
43
43
  addText(text, formatting) {
44
- const para = new Paragraph_1.Paragraph();
44
+ const para = new Paragraph_js_1.Paragraph();
45
45
  para.addText(text, formatting);
46
46
  this.elements.push(para);
47
47
  return para;
@@ -51,7 +51,7 @@ class Footer {
51
51
  return this;
52
52
  }
53
53
  createTable(rows, columns) {
54
- const table = new Table_1.Table(rows, columns);
54
+ const table = new Table_js_1.Table(rows, columns);
55
55
  this.elements.push(table);
56
56
  return table;
57
57
  }
@@ -1 +1 @@
1
- {"version":3,"file":"Footer.js","sourceRoot":"","sources":["../../src/elements/Footer.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Footer - Represents a document footer\n *\n * Footers appear at the bottom of pages and can contain text, tables, images, and fields.\n * Different footers can be defined for first page, odd pages, and even pages.\n */\n\nimport { XMLElement } from '../xml/XMLBuilder';\nimport { Paragraph } from './Paragraph';\nimport { RunFormatting } from './Run';\nimport { Table } from './Table';\n\n/**\n * Footer type\n */\nexport type FooterType = 'default' | 'first' | 'even';\n\n/**\n * Footer content element\n */\ntype FooterElement = Paragraph | Table;\n\n/**\n * Footer properties\n */\nexport interface FooterProperties {\n /** Footer type (default, first page, or even page) */\n type?: FooterType;\n}\n\n/**\n * Represents a document footer\n */\nexport class Footer {\n private elements: FooterElement[] = [];\n private type: FooterType;\n private footerId?: string;\n private rawXML?: string; // Store original XML for preservation\n\n /**\n * Creates a new footer\n * @param properties Footer properties\n */\n constructor(properties: FooterProperties = {}) {\n this.type = properties.type || 'default';\n }\n\n /**\n * Sets the raw XML content (used when loading existing footers)\n * @param xml Raw XML content\n */\n setRawXML(xml: string): this {\n this.rawXML = xml;\n return this;\n }\n\n /**\n * Gets the raw XML content if available\n */\n getRawXML(): string | undefined {\n return this.rawXML;\n }\n\n /**\n * Gets the footer type\n */\n getType(): FooterType {\n return this.type;\n }\n\n /**\n * Sets the footer ID (used for relationships)\n * @param id Footer ID\n */\n setFooterId(id: string): this {\n this.footerId = id;\n return this;\n }\n\n /**\n * Gets the footer ID\n */\n getFooterId(): string | undefined {\n return this.footerId;\n }\n\n /**\n * Adds a paragraph to the footer\n * @param paragraph Paragraph to add\n */\n addParagraph(paragraph: Paragraph): this {\n this.elements.push(paragraph);\n return this;\n }\n\n /**\n * Creates and adds a new paragraph\n * @param text Optional text content\n */\n createParagraph(text?: string): Paragraph {\n const para = new Paragraph();\n if (text) {\n para.addText(text);\n }\n this.elements.push(para);\n return para;\n }\n\n /**\n * Adds formatted text to the footer as a new paragraph\n *\n * Convenience method that creates a paragraph with a single formatted run.\n *\n * @param text - Text content\n * @param formatting - Optional run formatting (bold, font, size, etc.)\n * @returns The created Paragraph for further customization\n *\n * @example\n * ```typescript\n * footer.addText('Page ', { size: 8 });\n * footer.addText('Confidential', { italic: true, color: '888888' });\n * ```\n */\n addText(text: string, formatting?: RunFormatting): Paragraph {\n const para = new Paragraph();\n para.addText(text, formatting);\n this.elements.push(para);\n return para;\n }\n\n /**\n * Adds a table to the footer\n * @param table Table to add\n */\n addTable(table: Table): this {\n this.elements.push(table);\n return this;\n }\n\n /**\n * Creates and adds a new table\n * @param rows Number of rows\n * @param columns Number of columns\n */\n createTable(rows: number, columns: number): Table {\n const table = new Table(rows, columns);\n this.elements.push(table);\n return table;\n }\n\n /**\n * Gets all elements in the footer\n */\n getElements(): FooterElement[] {\n return [...this.elements];\n }\n\n /**\n * Gets the number of elements\n */\n getElementCount(): number {\n return this.elements.length;\n }\n\n /**\n * Clears all elements and resets raw XML so toXML() regenerates an empty footer\n */\n clear(): this {\n this.elements = [];\n this.rawXML = undefined;\n return this;\n }\n\n /**\n * Generates the complete footer XML file content\n * This creates a complete footer document (footer1.xml, etc.)\n */\n toXML(): string {\n // If we have raw XML preserved from loading, use it\n if (this.rawXML) {\n return this.rawXML;\n }\n\n // Otherwise generate from elements\n const elementXmls = this.elements.map((el) => el.toXML());\n\n let xml = '<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\\n';\n xml += '<w:ftr xmlns:w=\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\" ';\n xml += 'xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\">\\n';\n\n // Add elements\n for (const element of elementXmls) {\n xml += this.renderElement(element, 1);\n }\n\n // If no elements, add an empty paragraph\n if (this.elements.length === 0) {\n xml += ' <w:p/>\\n';\n }\n\n xml += '</w:ftr>';\n\n return xml;\n }\n\n /**\n * Renders an XML element to string with indentation\n */\n private renderElement(element: XMLElement, indent: number): string {\n const spaces = ' '.repeat(indent);\n let xml = '';\n\n if (element.selfClosing) {\n xml += `${spaces}<${element.name}`;\n if (element.attributes) {\n for (const [key, value] of Object.entries(element.attributes)) {\n xml += ` ${key}=\"${value}\"`;\n }\n }\n xml += '/>\\n';\n } else {\n xml += `${spaces}<${element.name}`;\n if (element.attributes) {\n for (const [key, value] of Object.entries(element.attributes)) {\n xml += ` ${key}=\"${value}\"`;\n }\n }\n xml += '>';\n\n if (element.children && element.children.length > 0) {\n const hasOnlyText = element.children.every((c) => typeof c === 'string');\n\n if (hasOnlyText) {\n // Inline text content\n xml += element.children.join('');\n } else {\n // Block-level children\n xml += '\\n';\n for (const child of element.children) {\n if (typeof child === 'string') {\n xml += spaces + ' ' + child + '\\n';\n } else {\n xml += this.renderElement(child, indent + 1);\n }\n }\n xml += spaces;\n }\n }\n\n xml += `</${element.name}>\\n`;\n }\n\n return xml;\n }\n\n /**\n * Gets the filename for this footer\n * @param number Footer number (1, 2, 3, etc.)\n */\n getFilename(number: number): string {\n return `footer${number}.xml`;\n }\n\n /**\n * Creates a default footer\n */\n static createDefault(): Footer {\n return new Footer({ type: 'default' });\n }\n\n /**\n * Creates a first page footer\n */\n static createFirst(): Footer {\n return new Footer({ type: 'first' });\n }\n\n /**\n * Creates an even page footer\n */\n static createEven(): Footer {\n return new Footer({ type: 'even' });\n }\n\n /**\n * Creates a footer with properties\n * @param properties Footer properties\n */\n static create(properties?: FooterProperties): Footer {\n return new Footer(properties);\n }\n}\n"]}
1
+ {"version":3,"file":"Footer.js","sourceRoot":"","sources":["../../src/elements/Footer.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Footer - Represents a document footer\n *\n * Footers appear at the bottom of pages and can contain text, tables, images, and fields.\n * Different footers can be defined for first page, odd pages, and even pages.\n */\n\nimport { XMLElement } from '../xml/XMLBuilder.js';\nimport { Paragraph } from './Paragraph.js';\nimport { RunFormatting } from './Run.js';\nimport { Table } from './Table.js';\n\n/**\n * Footer type\n */\nexport type FooterType = 'default' | 'first' | 'even';\n\n/**\n * Footer content element\n */\ntype FooterElement = Paragraph | Table;\n\n/**\n * Footer properties\n */\nexport interface FooterProperties {\n /** Footer type (default, first page, or even page) */\n type?: FooterType;\n}\n\n/**\n * Represents a document footer\n */\nexport class Footer {\n private elements: FooterElement[] = [];\n private type: FooterType;\n private footerId?: string;\n private rawXML?: string; // Store original XML for preservation\n\n /**\n * Creates a new footer\n * @param properties Footer properties\n */\n constructor(properties: FooterProperties = {}) {\n this.type = properties.type || 'default';\n }\n\n /**\n * Sets the raw XML content (used when loading existing footers)\n * @param xml Raw XML content\n */\n setRawXML(xml: string): this {\n this.rawXML = xml;\n return this;\n }\n\n /**\n * Gets the raw XML content if available\n */\n getRawXML(): string | undefined {\n return this.rawXML;\n }\n\n /**\n * Gets the footer type\n */\n getType(): FooterType {\n return this.type;\n }\n\n /**\n * Sets the footer ID (used for relationships)\n * @param id Footer ID\n */\n setFooterId(id: string): this {\n this.footerId = id;\n return this;\n }\n\n /**\n * Gets the footer ID\n */\n getFooterId(): string | undefined {\n return this.footerId;\n }\n\n /**\n * Adds a paragraph to the footer\n * @param paragraph Paragraph to add\n */\n addParagraph(paragraph: Paragraph): this {\n this.elements.push(paragraph);\n return this;\n }\n\n /**\n * Creates and adds a new paragraph\n * @param text Optional text content\n */\n createParagraph(text?: string): Paragraph {\n const para = new Paragraph();\n if (text) {\n para.addText(text);\n }\n this.elements.push(para);\n return para;\n }\n\n /**\n * Adds formatted text to the footer as a new paragraph\n *\n * Convenience method that creates a paragraph with a single formatted run.\n *\n * @param text - Text content\n * @param formatting - Optional run formatting (bold, font, size, etc.)\n * @returns The created Paragraph for further customization\n *\n * @example\n * ```typescript\n * footer.addText('Page ', { size: 8 });\n * footer.addText('Confidential', { italic: true, color: '888888' });\n * ```\n */\n addText(text: string, formatting?: RunFormatting): Paragraph {\n const para = new Paragraph();\n para.addText(text, formatting);\n this.elements.push(para);\n return para;\n }\n\n /**\n * Adds a table to the footer\n * @param table Table to add\n */\n addTable(table: Table): this {\n this.elements.push(table);\n return this;\n }\n\n /**\n * Creates and adds a new table\n * @param rows Number of rows\n * @param columns Number of columns\n */\n createTable(rows: number, columns: number): Table {\n const table = new Table(rows, columns);\n this.elements.push(table);\n return table;\n }\n\n /**\n * Gets all elements in the footer\n */\n getElements(): FooterElement[] {\n return [...this.elements];\n }\n\n /**\n * Gets the number of elements\n */\n getElementCount(): number {\n return this.elements.length;\n }\n\n /**\n * Clears all elements and resets raw XML so toXML() regenerates an empty footer\n */\n clear(): this {\n this.elements = [];\n this.rawXML = undefined;\n return this;\n }\n\n /**\n * Generates the complete footer XML file content\n * This creates a complete footer document (footer1.xml, etc.)\n */\n toXML(): string {\n // If we have raw XML preserved from loading, use it\n if (this.rawXML) {\n return this.rawXML;\n }\n\n // Otherwise generate from elements\n const elementXmls = this.elements.map((el) => el.toXML());\n\n let xml = '<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\\n';\n xml += '<w:ftr xmlns:w=\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\" ';\n xml += 'xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\">\\n';\n\n // Add elements\n for (const element of elementXmls) {\n xml += this.renderElement(element, 1);\n }\n\n // If no elements, add an empty paragraph\n if (this.elements.length === 0) {\n xml += ' <w:p/>\\n';\n }\n\n xml += '</w:ftr>';\n\n return xml;\n }\n\n /**\n * Renders an XML element to string with indentation\n */\n private renderElement(element: XMLElement, indent: number): string {\n const spaces = ' '.repeat(indent);\n let xml = '';\n\n if (element.selfClosing) {\n xml += `${spaces}<${element.name}`;\n if (element.attributes) {\n for (const [key, value] of Object.entries(element.attributes)) {\n xml += ` ${key}=\"${value}\"`;\n }\n }\n xml += '/>\\n';\n } else {\n xml += `${spaces}<${element.name}`;\n if (element.attributes) {\n for (const [key, value] of Object.entries(element.attributes)) {\n xml += ` ${key}=\"${value}\"`;\n }\n }\n xml += '>';\n\n if (element.children && element.children.length > 0) {\n const hasOnlyText = element.children.every((c) => typeof c === 'string');\n\n if (hasOnlyText) {\n // Inline text content\n xml += element.children.join('');\n } else {\n // Block-level children\n xml += '\\n';\n for (const child of element.children) {\n if (typeof child === 'string') {\n xml += spaces + ' ' + child + '\\n';\n } else {\n xml += this.renderElement(child, indent + 1);\n }\n }\n xml += spaces;\n }\n }\n\n xml += `</${element.name}>\\n`;\n }\n\n return xml;\n }\n\n /**\n * Gets the filename for this footer\n * @param number Footer number (1, 2, 3, etc.)\n */\n getFilename(number: number): string {\n return `footer${number}.xml`;\n }\n\n /**\n * Creates a default footer\n */\n static createDefault(): Footer {\n return new Footer({ type: 'default' });\n }\n\n /**\n * Creates a first page footer\n */\n static createFirst(): Footer {\n return new Footer({ type: 'first' });\n }\n\n /**\n * Creates an even page footer\n */\n static createEven(): Footer {\n return new Footer({ type: 'even' });\n }\n\n /**\n * Creates a footer with properties\n * @param properties Footer properties\n */\n static create(properties?: FooterProperties): Footer {\n return new Footer(properties);\n }\n}\n"]}
@@ -1,5 +1,5 @@
1
- import { Paragraph } from './Paragraph';
2
- import { XMLElement } from '../xml/XMLBuilder';
1
+ import { Paragraph } from './Paragraph.js';
2
+ import { XMLElement } from '../xml/XMLBuilder.js';
3
3
  export declare enum FootnoteType {
4
4
  Normal = "normal",
5
5
  Separator = "separator",
@@ -1 +1 @@
1
- {"version":3,"file":"Footnote.d.ts","sourceRoot":"","sources":["../../src/elements/Footnote.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAc,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAK3D,oBAAY,YAAY;IAEtB,MAAM,WAAW;IAEjB,SAAS,cAAc;IAEvB,qBAAqB,0BAA0B;IAE/C,kBAAkB,uBAAuB;CAC1C;AAKD,MAAM,WAAW,kBAAkB;IAEjC,EAAE,EAAE,MAAM,CAAC;IAEX,IAAI,CAAC,EAAE,YAAY,CAAC;IAEpB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAKD,qBAAa,QAAQ;IACnB,OAAO,CAAC,EAAE,CAAS;IACnB,OAAO,CAAC,IAAI,CAAe;IAC3B,OAAO,CAAC,UAAU,CAAC,CAAS;IAC5B,OAAO,CAAC,UAAU,CAAmB;gBAMzB,UAAU,EAAE,kBAAkB;IAS1C,KAAK,IAAI,MAAM;IAOf,OAAO,IAAI,YAAY;IAOvB,aAAa,IAAI,MAAM,GAAG,SAAS;IAQnC,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IASjC,YAAY,CAAC,SAAS,EAAE,SAAS,GAAG,IAAI;IAUxC,eAAe,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS;IAYzC,aAAa,IAAI,SAAS,EAAE;IAO5B,OAAO,IAAI,MAAM;IAOjB,KAAK,IAAI,UAAU;IA+CnB,MAAM,CAAC,QAAQ,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,QAAQ;IAWnD,MAAM,CAAC,eAAe,CAAC,EAAE,EAAE,MAAM,GAAG,QAAQ;IAgB5C,MAAM,CAAC,2BAA2B,CAAC,EAAE,EAAE,MAAM,GAAG,QAAQ;IAaxD,MAAM,CAAC,wBAAwB,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,SAAiB,GAAG,QAAQ;CAQ7E"}
1
+ {"version":3,"file":"Footnote.d.ts","sourceRoot":"","sources":["../../src/elements/Footnote.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAc,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAK9D,oBAAY,YAAY;IAEtB,MAAM,WAAW;IAEjB,SAAS,cAAc;IAEvB,qBAAqB,0BAA0B;IAE/C,kBAAkB,uBAAuB;CAC1C;AAKD,MAAM,WAAW,kBAAkB;IAEjC,EAAE,EAAE,MAAM,CAAC;IAEX,IAAI,CAAC,EAAE,YAAY,CAAC;IAEpB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAKD,qBAAa,QAAQ;IACnB,OAAO,CAAC,EAAE,CAAS;IACnB,OAAO,CAAC,IAAI,CAAe;IAC3B,OAAO,CAAC,UAAU,CAAC,CAAS;IAC5B,OAAO,CAAC,UAAU,CAAmB;gBAMzB,UAAU,EAAE,kBAAkB;IAS1C,KAAK,IAAI,MAAM;IAOf,OAAO,IAAI,YAAY;IAOvB,aAAa,IAAI,MAAM,GAAG,SAAS;IAQnC,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IASjC,YAAY,CAAC,SAAS,EAAE,SAAS,GAAG,IAAI;IAUxC,eAAe,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS;IAYzC,aAAa,IAAI,SAAS,EAAE;IAO5B,OAAO,IAAI,MAAM;IAOjB,KAAK,IAAI,UAAU;IA+CnB,MAAM,CAAC,QAAQ,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,QAAQ;IAWnD,MAAM,CAAC,eAAe,CAAC,EAAE,EAAE,MAAM,GAAG,QAAQ;IAgB5C,MAAM,CAAC,2BAA2B,CAAC,EAAE,EAAE,MAAM,GAAG,QAAQ;IAaxD,MAAM,CAAC,wBAAwB,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,SAAiB,GAAG,QAAQ;CAQ7E"}
@@ -1,8 +1,8 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.Footnote = exports.FootnoteType = void 0;
4
- const Paragraph_1 = require("./Paragraph");
5
- const XMLBuilder_1 = require("../xml/XMLBuilder");
4
+ const Paragraph_js_1 = require("./Paragraph.js");
5
+ const XMLBuilder_js_1 = require("../xml/XMLBuilder.js");
6
6
  var FootnoteType;
7
7
  (function (FootnoteType) {
8
8
  FootnoteType["Normal"] = "normal";
@@ -38,7 +38,7 @@ class Footnote {
38
38
  return this;
39
39
  }
40
40
  createParagraph(text) {
41
- const para = new Paragraph_1.Paragraph();
41
+ const para = new Paragraph_js_1.Paragraph();
42
42
  if (text) {
43
43
  para.addText(text);
44
44
  }
@@ -60,13 +60,13 @@ class Footnote {
60
60
  }
61
61
  const children = [];
62
62
  if (this.type === FootnoteType.Separator) {
63
- children.push(XMLBuilder_1.XMLBuilder.w('p', undefined, [
64
- XMLBuilder_1.XMLBuilder.w('r', undefined, [XMLBuilder_1.XMLBuilder.wSelf('separator')]),
63
+ children.push(XMLBuilder_js_1.XMLBuilder.w('p', undefined, [
64
+ XMLBuilder_js_1.XMLBuilder.w('r', undefined, [XMLBuilder_js_1.XMLBuilder.wSelf('separator')]),
65
65
  ]));
66
66
  }
67
67
  else if (this.type === FootnoteType.ContinuationSeparator) {
68
- children.push(XMLBuilder_1.XMLBuilder.w('p', undefined, [
69
- XMLBuilder_1.XMLBuilder.w('r', undefined, [XMLBuilder_1.XMLBuilder.wSelf('continuationSeparator')]),
68
+ children.push(XMLBuilder_js_1.XMLBuilder.w('p', undefined, [
69
+ XMLBuilder_js_1.XMLBuilder.w('r', undefined, [XMLBuilder_js_1.XMLBuilder.wSelf('continuationSeparator')]),
70
70
  ]));
71
71
  }
72
72
  else {
@@ -74,10 +74,10 @@ class Footnote {
74
74
  children.push(para.toXML());
75
75
  }
76
76
  if (children.length === 0) {
77
- children.push(XMLBuilder_1.XMLBuilder.w('p'));
77
+ children.push(XMLBuilder_js_1.XMLBuilder.w('p'));
78
78
  }
79
79
  }
80
- return XMLBuilder_1.XMLBuilder.w('footnote', attrs, children);
80
+ return XMLBuilder_js_1.XMLBuilder.w('footnote', attrs, children);
81
81
  }
82
82
  static fromText(id, text) {
83
83
  const footnote = new Footnote({ id });
@@ -1 +1 @@
1
- {"version":3,"file":"Footnote.js","sourceRoot":"","sources":["../../src/elements/Footnote.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Footnote - Represents a footnote in a Word document\n *\n * Footnotes appear at the bottom of the page and are referenced\n * within the document text via footnote references.\n */\n\nimport { Paragraph } from './Paragraph';\nimport { XMLBuilder, XMLElement } from '../xml/XMLBuilder';\n\n/**\n * Footnote type\n */\nexport enum FootnoteType {\n /** Normal footnote */\n Normal = 'normal',\n /** Separator between document text and footnotes */\n Separator = 'separator',\n /** Continuation separator for footnotes that continue to next page */\n ContinuationSeparator = 'continuationSeparator',\n /** Continuation notice at bottom of page when footnotes continue */\n ContinuationNotice = 'continuationNotice',\n}\n\n/**\n * Footnote properties\n */\nexport interface FootnoteProperties {\n /** Footnote ID (required, must be unique) */\n id: number;\n /** Type of footnote */\n type?: FootnoteType;\n /** Custom mark/symbol (optional, otherwise uses numbering) */\n customMark?: string;\n}\n\n/**\n * Represents a footnote in a document\n */\nexport class Footnote {\n private id: number;\n private type: FootnoteType;\n private customMark?: string;\n private paragraphs: Paragraph[] = [];\n\n /**\n * Creates a new footnote\n * @param properties Footnote properties\n */\n constructor(properties: FootnoteProperties) {\n this.id = properties.id;\n this.type = properties.type || FootnoteType.Normal;\n this.customMark = properties.customMark;\n }\n\n /**\n * Gets the footnote ID\n */\n getId(): number {\n return this.id;\n }\n\n /**\n * Gets the footnote type\n */\n getType(): FootnoteType {\n return this.type;\n }\n\n /**\n * Gets the custom mark\n */\n getCustomMark(): string | undefined {\n return this.customMark;\n }\n\n /**\n * Sets the custom mark\n * @param mark Custom mark/symbol\n */\n setCustomMark(mark: string): this {\n this.customMark = mark;\n return this;\n }\n\n /**\n * Adds a paragraph to the footnote\n * @param paragraph Paragraph to add\n */\n addParagraph(paragraph: Paragraph): this {\n this.paragraphs.push(paragraph);\n return this;\n }\n\n /**\n * Creates and adds a new paragraph\n * @param text Optional text content\n * @returns The created paragraph\n */\n createParagraph(text?: string): Paragraph {\n const para = new Paragraph();\n if (text) {\n para.addText(text);\n }\n this.paragraphs.push(para);\n return para;\n }\n\n /**\n * Gets all paragraphs in the footnote\n */\n getParagraphs(): Paragraph[] {\n return [...this.paragraphs];\n }\n\n /**\n * Gets the text content of the footnote\n */\n getText(): string {\n return this.paragraphs.map((p) => p.getText()).join('\\n');\n }\n\n /**\n * Generates the XML for this footnote\n */\n toXML(): XMLElement {\n const attrs: Record<string, any> = {\n 'w:id': this.id.toString(),\n };\n\n if (this.type !== FootnoteType.Normal) {\n attrs['w:type'] = this.type;\n }\n\n const children: XMLElement[] = [];\n\n // Separator types require specific child elements per ECMA-376\n if (this.type === FootnoteType.Separator) {\n // <w:p><w:r><w:separator/></w:r></w:p>\n children.push(\n XMLBuilder.w('p', undefined, [\n XMLBuilder.w('r', undefined, [XMLBuilder.wSelf('separator')]),\n ])\n );\n } else if (this.type === FootnoteType.ContinuationSeparator) {\n // <w:p><w:r><w:continuationSeparator/></w:r></w:p>\n children.push(\n XMLBuilder.w('p', undefined, [\n XMLBuilder.w('r', undefined, [XMLBuilder.wSelf('continuationSeparator')]),\n ])\n );\n } else {\n // Add paragraphs\n for (const para of this.paragraphs) {\n children.push(para.toXML());\n }\n\n // If no paragraphs, add an empty one (required)\n if (children.length === 0) {\n children.push(XMLBuilder.w('p'));\n }\n }\n\n return XMLBuilder.w('footnote', attrs, children);\n }\n\n /**\n * Creates a footnote from text\n * @param id Footnote ID\n * @param text Text content\n * @returns New footnote instance\n */\n static fromText(id: number, text: string): Footnote {\n const footnote = new Footnote({ id });\n footnote.createParagraph(text);\n return footnote;\n }\n\n /**\n * Creates a separator footnote\n * @param id Footnote ID\n * @returns New separator footnote\n */\n static createSeparator(id: number): Footnote {\n const footnote = new Footnote({\n id,\n type: FootnoteType.Separator,\n });\n // Separator typically has a horizontal line\n footnote.createParagraph();\n // Add separator formatting if needed\n return footnote;\n }\n\n /**\n * Creates a continuation separator footnote\n * @param id Footnote ID\n * @returns New continuation separator footnote\n */\n static createContinuationSeparator(id: number): Footnote {\n return new Footnote({\n id,\n type: FootnoteType.ContinuationSeparator,\n });\n }\n\n /**\n * Creates a continuation notice footnote\n * @param id Footnote ID\n * @param text Notice text (e.g., \"Continued on next page...\")\n * @returns New continuation notice footnote\n */\n static createContinuationNotice(id: number, text = 'Continued...'): Footnote {\n const footnote = new Footnote({\n id,\n type: FootnoteType.ContinuationNotice,\n });\n footnote.createParagraph(text);\n return footnote;\n }\n}\n"]}
1
+ {"version":3,"file":"Footnote.js","sourceRoot":"","sources":["../../src/elements/Footnote.ts"],"names":[],"mappings":";;;AAOA,iDAA2C;AAC3C,wDAA8D;AAK9D,IAAY,YASX;AATD,WAAY,YAAY;IAEtB,iCAAiB,CAAA;IAEjB,uCAAuB,CAAA;IAEvB,+DAA+C,CAAA;IAE/C,yDAAyC,CAAA;AAC3C,CAAC,EATW,YAAY,4BAAZ,YAAY,QASvB;AAiBD,MAAa,QAAQ;IACX,EAAE,CAAS;IACX,IAAI,CAAe;IACnB,UAAU,CAAU;IACpB,UAAU,GAAgB,EAAE,CAAC;IAMrC,YAAY,UAA8B;QACxC,IAAI,CAAC,EAAE,GAAG,UAAU,CAAC,EAAE,CAAC;QACxB,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC,IAAI,IAAI,YAAY,CAAC,MAAM,CAAC;QACnD,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC,UAAU,CAAC;IAC1C,CAAC;IAKD,KAAK;QACH,OAAO,IAAI,CAAC,EAAE,CAAC;IACjB,CAAC;IAKD,OAAO;QACL,OAAO,IAAI,CAAC,IAAI,CAAC;IACnB,CAAC;IAKD,aAAa;QACX,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;IAMD,aAAa,CAAC,IAAY;QACxB,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QACvB,OAAO,IAAI,CAAC;IACd,CAAC;IAMD,YAAY,CAAC,SAAoB;QAC/B,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAChC,OAAO,IAAI,CAAC;IACd,CAAC;IAOD,eAAe,CAAC,IAAa;QAC3B,MAAM,IAAI,GAAG,IAAI,wBAAS,EAAE,CAAC;QAC7B,IAAI,IAAI,EAAE,CAAC;YACT,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACrB,CAAC;QACD,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC3B,OAAO,IAAI,CAAC;IACd,CAAC;IAKD,aAAa;QACX,OAAO,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC;IAC9B,CAAC;IAKD,OAAO;QACL,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC5D,CAAC;IAKD,KAAK;QACH,MAAM,KAAK,GAAwB;YACjC,MAAM,EAAE,IAAI,CAAC,EAAE,CAAC,QAAQ,EAAE;SAC3B,CAAC;QAEF,IAAI,IAAI,CAAC,IAAI,KAAK,YAAY,CAAC,MAAM,EAAE,CAAC;YACtC,KAAK,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC;QAC9B,CAAC;QAED,MAAM,QAAQ,GAAiB,EAAE,CAAC;QAGlC,IAAI,IAAI,CAAC,IAAI,KAAK,YAAY,CAAC,SAAS,EAAE,CAAC;YAEzC,QAAQ,CAAC,IAAI,CACX,0BAAU,CAAC,CAAC,CAAC,GAAG,EAAE,SAAS,EAAE;gBAC3B,0BAAU,CAAC,CAAC,CAAC,GAAG,EAAE,SAAS,EAAE,CAAC,0BAAU,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC;aAC9D,CAAC,CACH,CAAC;QACJ,CAAC;aAAM,IAAI,IAAI,CAAC,IAAI,KAAK,YAAY,CAAC,qBAAqB,EAAE,CAAC;YAE5D,QAAQ,CAAC,IAAI,CACX,0BAAU,CAAC,CAAC,CAAC,GAAG,EAAE,SAAS,EAAE;gBAC3B,0BAAU,CAAC,CAAC,CAAC,GAAG,EAAE,SAAS,EAAE,CAAC,0BAAU,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC,CAAC;aAC1E,CAAC,CACH,CAAC;QACJ,CAAC;aAAM,CAAC;YAEN,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;gBACnC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;YAC9B,CAAC;YAGD,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC1B,QAAQ,CAAC,IAAI,CAAC,0BAAU,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YACnC,CAAC;QACH,CAAC;QAED,OAAO,0BAAU,CAAC,CAAC,CAAC,UAAU,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;IACnD,CAAC;IAQD,MAAM,CAAC,QAAQ,CAAC,EAAU,EAAE,IAAY;QACtC,MAAM,QAAQ,GAAG,IAAI,QAAQ,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;QACtC,QAAQ,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;QAC/B,OAAO,QAAQ,CAAC;IAClB,CAAC;IAOD,MAAM,CAAC,eAAe,CAAC,EAAU;QAC/B,MAAM,QAAQ,GAAG,IAAI,QAAQ,CAAC;YAC5B,EAAE;YACF,IAAI,EAAE,YAAY,CAAC,SAAS;SAC7B,CAAC,CAAC;QAEH,QAAQ,CAAC,eAAe,EAAE,CAAC;QAE3B,OAAO,QAAQ,CAAC;IAClB,CAAC;IAOD,MAAM,CAAC,2BAA2B,CAAC,EAAU;QAC3C,OAAO,IAAI,QAAQ,CAAC;YAClB,EAAE;YACF,IAAI,EAAE,YAAY,CAAC,qBAAqB;SACzC,CAAC,CAAC;IACL,CAAC;IAQD,MAAM,CAAC,wBAAwB,CAAC,EAAU,EAAE,IAAI,GAAG,cAAc;QAC/D,MAAM,QAAQ,GAAG,IAAI,QAAQ,CAAC;YAC5B,EAAE;YACF,IAAI,EAAE,YAAY,CAAC,kBAAkB;SACtC,CAAC,CAAC;QACH,QAAQ,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;QAC/B,OAAO,QAAQ,CAAC;IAClB,CAAC;CACF;AArLD,4BAqLC","sourcesContent":["/**\n * Footnote - Represents a footnote in a Word document\n *\n * Footnotes appear at the bottom of the page and are referenced\n * within the document text via footnote references.\n */\n\nimport { Paragraph } from './Paragraph.js';\nimport { XMLBuilder, XMLElement } from '../xml/XMLBuilder.js';\n\n/**\n * Footnote type\n */\nexport enum FootnoteType {\n /** Normal footnote */\n Normal = 'normal',\n /** Separator between document text and footnotes */\n Separator = 'separator',\n /** Continuation separator for footnotes that continue to next page */\n ContinuationSeparator = 'continuationSeparator',\n /** Continuation notice at bottom of page when footnotes continue */\n ContinuationNotice = 'continuationNotice',\n}\n\n/**\n * Footnote properties\n */\nexport interface FootnoteProperties {\n /** Footnote ID (required, must be unique) */\n id: number;\n /** Type of footnote */\n type?: FootnoteType;\n /** Custom mark/symbol (optional, otherwise uses numbering) */\n customMark?: string;\n}\n\n/**\n * Represents a footnote in a document\n */\nexport class Footnote {\n private id: number;\n private type: FootnoteType;\n private customMark?: string;\n private paragraphs: Paragraph[] = [];\n\n /**\n * Creates a new footnote\n * @param properties Footnote properties\n */\n constructor(properties: FootnoteProperties) {\n this.id = properties.id;\n this.type = properties.type || FootnoteType.Normal;\n this.customMark = properties.customMark;\n }\n\n /**\n * Gets the footnote ID\n */\n getId(): number {\n return this.id;\n }\n\n /**\n * Gets the footnote type\n */\n getType(): FootnoteType {\n return this.type;\n }\n\n /**\n * Gets the custom mark\n */\n getCustomMark(): string | undefined {\n return this.customMark;\n }\n\n /**\n * Sets the custom mark\n * @param mark Custom mark/symbol\n */\n setCustomMark(mark: string): this {\n this.customMark = mark;\n return this;\n }\n\n /**\n * Adds a paragraph to the footnote\n * @param paragraph Paragraph to add\n */\n addParagraph(paragraph: Paragraph): this {\n this.paragraphs.push(paragraph);\n return this;\n }\n\n /**\n * Creates and adds a new paragraph\n * @param text Optional text content\n * @returns The created paragraph\n */\n createParagraph(text?: string): Paragraph {\n const para = new Paragraph();\n if (text) {\n para.addText(text);\n }\n this.paragraphs.push(para);\n return para;\n }\n\n /**\n * Gets all paragraphs in the footnote\n */\n getParagraphs(): Paragraph[] {\n return [...this.paragraphs];\n }\n\n /**\n * Gets the text content of the footnote\n */\n getText(): string {\n return this.paragraphs.map((p) => p.getText()).join('\\n');\n }\n\n /**\n * Generates the XML for this footnote\n */\n toXML(): XMLElement {\n const attrs: Record<string, any> = {\n 'w:id': this.id.toString(),\n };\n\n if (this.type !== FootnoteType.Normal) {\n attrs['w:type'] = this.type;\n }\n\n const children: XMLElement[] = [];\n\n // Separator types require specific child elements per ECMA-376\n if (this.type === FootnoteType.Separator) {\n // <w:p><w:r><w:separator/></w:r></w:p>\n children.push(\n XMLBuilder.w('p', undefined, [\n XMLBuilder.w('r', undefined, [XMLBuilder.wSelf('separator')]),\n ])\n );\n } else if (this.type === FootnoteType.ContinuationSeparator) {\n // <w:p><w:r><w:continuationSeparator/></w:r></w:p>\n children.push(\n XMLBuilder.w('p', undefined, [\n XMLBuilder.w('r', undefined, [XMLBuilder.wSelf('continuationSeparator')]),\n ])\n );\n } else {\n // Add paragraphs\n for (const para of this.paragraphs) {\n children.push(para.toXML());\n }\n\n // If no paragraphs, add an empty one (required)\n if (children.length === 0) {\n children.push(XMLBuilder.w('p'));\n }\n }\n\n return XMLBuilder.w('footnote', attrs, children);\n }\n\n /**\n * Creates a footnote from text\n * @param id Footnote ID\n * @param text Text content\n * @returns New footnote instance\n */\n static fromText(id: number, text: string): Footnote {\n const footnote = new Footnote({ id });\n footnote.createParagraph(text);\n return footnote;\n }\n\n /**\n * Creates a separator footnote\n * @param id Footnote ID\n * @returns New separator footnote\n */\n static createSeparator(id: number): Footnote {\n const footnote = new Footnote({\n id,\n type: FootnoteType.Separator,\n });\n // Separator typically has a horizontal line\n footnote.createParagraph();\n // Add separator formatting if needed\n return footnote;\n }\n\n /**\n * Creates a continuation separator footnote\n * @param id Footnote ID\n * @returns New continuation separator footnote\n */\n static createContinuationSeparator(id: number): Footnote {\n return new Footnote({\n id,\n type: FootnoteType.ContinuationSeparator,\n });\n }\n\n /**\n * Creates a continuation notice footnote\n * @param id Footnote ID\n * @param text Notice text (e.g., \"Continued on next page...\")\n * @returns New continuation notice footnote\n */\n static createContinuationNotice(id: number, text = 'Continued...'): Footnote {\n const footnote = new Footnote({\n id,\n type: FootnoteType.ContinuationNotice,\n });\n footnote.createParagraph(text);\n return footnote;\n }\n}\n"]}
@@ -1,4 +1,4 @@
1
- import { Footnote } from './Footnote';
1
+ import { Footnote } from './Footnote.js';
2
2
  export declare class FootnoteManager {
3
3
  private footnotes;
4
4
  private nextId;
@@ -1 +1 @@
1
- {"version":3,"file":"FootnoteManager.d.ts","sourceRoot":"","sources":["../../src/elements/FootnoteManager.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,QAAQ,EAAgB,MAAM,YAAY,CAAC;AAOpD,qBAAa,eAAe;IAC1B,OAAO,CAAC,SAAS,CAA+B;IAChD,OAAO,CAAC,MAAM,CAAK;IAMnB,OAAO;IASP,OAAO,CAAC,mBAAmB;IAgB3B,OAAO,CAAC,iBAAiB;IAYzB,MAAM,CAAC,MAAM,IAAI,eAAe;IAShC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,GAAG,QAAQ;IAuBtC,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ;IAWtC,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS;IAQ7C,eAAe,IAAI,QAAQ,EAAE;IAS7B,0BAA0B,IAAI,QAAQ,EAAE;IAQxC,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAShC,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAWnC,SAAS,IAAI,MAAM;IAOnB,QAAQ,IAAI,MAAM;IAOlB,OAAO,IAAI,OAAO;IAQlB,KAAK,IAAI,IAAI;IAqBb,QAAQ,IAAI;QACV,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;KAChB;IAUD,oBAAoB,IAAI,MAAM;IAwB9B,MAAM,CAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;CAkBtC"}
1
+ {"version":3,"file":"FootnoteManager.d.ts","sourceRoot":"","sources":["../../src/elements/FootnoteManager.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,QAAQ,EAAgB,MAAM,eAAe,CAAC;AAOvD,qBAAa,eAAe;IAC1B,OAAO,CAAC,SAAS,CAA+B;IAChD,OAAO,CAAC,MAAM,CAAK;IAMnB,OAAO;IASP,OAAO,CAAC,mBAAmB;IAgB3B,OAAO,CAAC,iBAAiB;IAYzB,MAAM,CAAC,MAAM,IAAI,eAAe;IAShC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,GAAG,QAAQ;IAuBtC,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ;IAWtC,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS;IAQ7C,eAAe,IAAI,QAAQ,EAAE;IAS7B,0BAA0B,IAAI,QAAQ,EAAE;IAQxC,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAShC,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAWnC,SAAS,IAAI,MAAM;IAOnB,QAAQ,IAAI,MAAM;IAOlB,OAAO,IAAI,OAAO;IAQlB,KAAK,IAAI,IAAI;IAqBb,QAAQ,IAAI;QACV,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;KAChB;IAUD,oBAAoB,IAAI,MAAM;IAwB9B,MAAM,CAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;CAkBtC"}
@@ -1,9 +1,9 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.FootnoteManager = void 0;
4
- const Footnote_1 = require("./Footnote");
5
- const XMLBuilder_1 = require("../xml/XMLBuilder");
6
- const XMLParser_1 = require("../xml/XMLParser");
4
+ const Footnote_js_1 = require("./Footnote.js");
5
+ const XMLBuilder_js_1 = require("../xml/XMLBuilder.js");
6
+ const XMLParser_js_1 = require("../xml/XMLParser.js");
7
7
  class FootnoteManager {
8
8
  footnotes = new Map();
9
9
  nextId = 1;
@@ -11,16 +11,16 @@ class FootnoteManager {
11
11
  this.addSpecialFootnotes();
12
12
  }
13
13
  addSpecialFootnotes() {
14
- const separator = Footnote_1.Footnote.createSeparator(-1);
14
+ const separator = Footnote_js_1.Footnote.createSeparator(-1);
15
15
  this.footnotes.set(-1, separator);
16
- const continuationSep = Footnote_1.Footnote.createContinuationSeparator(0);
16
+ const continuationSep = Footnote_js_1.Footnote.createContinuationSeparator(0);
17
17
  this.footnotes.set(0, continuationSep);
18
18
  }
19
19
  isSpecialFootnote(footnote) {
20
20
  const type = footnote.getType();
21
- return (type === Footnote_1.FootnoteType.Separator ||
22
- type === Footnote_1.FootnoteType.ContinuationSeparator ||
23
- type === Footnote_1.FootnoteType.ContinuationNotice);
21
+ return (type === Footnote_js_1.FootnoteType.Separator ||
22
+ type === Footnote_js_1.FootnoteType.ContinuationSeparator ||
23
+ type === Footnote_js_1.FootnoteType.ContinuationNotice);
24
24
  }
25
25
  static create() {
26
26
  return new FootnoteManager();
@@ -37,7 +37,7 @@ class FootnoteManager {
37
37
  return footnote;
38
38
  }
39
39
  createFootnote(text) {
40
- const footnote = Footnote_1.Footnote.fromText(this.nextId++, text);
40
+ const footnote = Footnote_js_1.Footnote.fromText(this.nextId++, text);
41
41
  this.footnotes.set(footnote.getId(), footnote);
42
42
  return footnote;
43
43
  }
@@ -101,7 +101,7 @@ class FootnoteManager {
101
101
  },
102
102
  children: footnotes.map((f) => f.toXML()),
103
103
  };
104
- const builder = new XMLBuilder_1.XMLBuilder();
104
+ const builder = new XMLBuilder_js_1.XMLBuilder();
105
105
  builder.element(footnotesElement.name, footnotesElement.attributes, footnotesElement.children);
106
106
  return builder.build(true);
107
107
  }
@@ -109,7 +109,7 @@ class FootnoteManager {
109
109
  if (!xml) {
110
110
  return false;
111
111
  }
112
- const footnotesContent = XMLParser_1.XMLParser.extractBetweenTags(xml, '<w:footnotes', '</w:footnotes>');
112
+ const footnotesContent = XMLParser_js_1.XMLParser.extractBetweenTags(xml, '<w:footnotes', '</w:footnotes>');
113
113
  if (!footnotesContent) {
114
114
  return false;
115
115
  }
@@ -1 +1 @@
1
- {"version":3,"file":"FootnoteManager.js","sourceRoot":"","sources":["../../src/elements/FootnoteManager.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * FootnoteManager - Manages footnotes in a document\n *\n * Handles creation, registration, and XML generation for footnotes.\n * Maintains unique IDs and proper ordering.\n */\n\nimport { Footnote, FootnoteType } from './Footnote';\nimport { XMLBuilder, XMLElement } from '../xml/XMLBuilder';\nimport { XMLParser } from '../xml/XMLParser';\n\n/**\n * Manages footnotes in a document\n */\nexport class FootnoteManager {\n private footnotes = new Map<number, Footnote>();\n private nextId = 1;\n\n /**\n * Creates a new FootnoteManager\n * @private Use static factory method\n */\n private constructor() {\n // Add special footnotes (separators) with negative IDs\n this.addSpecialFootnotes();\n }\n\n /**\n * Adds special footnotes (separator, continuation)\n * These use negative IDs as per OOXML specification\n */\n private addSpecialFootnotes(): void {\n // Separator footnote (ID -1)\n const separator = Footnote.createSeparator(-1);\n this.footnotes.set(-1, separator);\n\n // Continuation separator (ID 0)\n const continuationSep = Footnote.createContinuationSeparator(0);\n this.footnotes.set(0, continuationSep);\n }\n\n /**\n * Checks if a footnote is a special/system type (separator, continuationSeparator,\n * continuationNotice) that should be preserved across clear() operations.\n * Uses type-based detection rather than ID-based, because continuationNotice\n * has a positive ID (typically 1) but is still a system footnote.\n */\n private isSpecialFootnote(footnote: Footnote): boolean {\n const type = footnote.getType();\n return (\n type === FootnoteType.Separator ||\n type === FootnoteType.ContinuationSeparator ||\n type === FootnoteType.ContinuationNotice\n );\n }\n\n /**\n * Creates a new FootnoteManager instance\n */\n static create(): FootnoteManager {\n return new FootnoteManager();\n }\n\n /**\n * Registers a footnote\n * @param footnote Footnote to register\n * @returns The registered footnote\n */\n register(footnote: Footnote): Footnote {\n const id = footnote.getId();\n\n // Ensure ID is not already used (except for special footnotes)\n if (id > 0 && this.footnotes.has(id)) {\n throw new Error(`Footnote with ID ${id} already exists`);\n }\n\n this.footnotes.set(id, footnote);\n\n // Update next ID if needed\n if (id >= this.nextId) {\n this.nextId = id + 1;\n }\n\n return footnote;\n }\n\n /**\n * Creates and registers a new footnote\n * @param text Footnote text\n * @returns The created footnote\n */\n createFootnote(text: string): Footnote {\n const footnote = Footnote.fromText(this.nextId++, text);\n this.footnotes.set(footnote.getId(), footnote);\n return footnote;\n }\n\n /**\n * Gets a footnote by ID\n * @param id Footnote ID\n * @returns The footnote, or undefined if not found\n */\n getFootnote(id: number): Footnote | undefined {\n return this.footnotes.get(id);\n }\n\n /**\n * Gets all user footnotes (excluding special system types: separator,\n * continuationSeparator, continuationNotice)\n */\n getAllFootnotes(): Footnote[] {\n return Array.from(this.footnotes.values())\n .filter((f) => !this.isSpecialFootnote(f))\n .sort((a, b) => a.getId() - b.getId());\n }\n\n /**\n * Gets all footnotes including special ones\n */\n getAllFootnotesWithSpecial(): Footnote[] {\n return Array.from(this.footnotes.values()).sort((a, b) => a.getId() - b.getId());\n }\n\n /**\n * Checks if a footnote exists\n * @param id Footnote ID\n */\n hasFootnote(id: number): boolean {\n return this.footnotes.has(id);\n }\n\n /**\n * Removes a footnote\n * @param id Footnote ID\n * @returns True if removed, false if not found or if it's a special type\n */\n removeFootnote(id: number): boolean {\n const footnote = this.footnotes.get(id);\n if (!footnote || this.isSpecialFootnote(footnote)) {\n return false;\n }\n return this.footnotes.delete(id);\n }\n\n /**\n * Gets the next available ID\n */\n getNextId(): number {\n return this.nextId;\n }\n\n /**\n * Gets the count of footnotes (excluding special ones)\n */\n getCount(): number {\n return this.getAllFootnotes().length;\n }\n\n /**\n * Checks if there are any footnotes (excluding special ones)\n */\n isEmpty(): boolean {\n return this.getCount() === 0;\n }\n\n /**\n * Clears all user footnotes (preserves special system types: separator,\n * continuationSeparator, continuationNotice)\n */\n clear(): void {\n const specialFootnotes = new Map<number, Footnote>();\n let maxSpecialId = 0;\n\n for (const [id, footnote] of this.footnotes) {\n if (this.isSpecialFootnote(footnote)) {\n specialFootnotes.set(id, footnote);\n if (id > maxSpecialId) {\n maxSpecialId = id;\n }\n }\n }\n\n this.footnotes = specialFootnotes;\n // Ensure nextId doesn't collide with special footnotes that have positive IDs\n this.nextId = Math.max(maxSpecialId + 1, 1);\n }\n\n /**\n * Gets statistics about footnotes\n */\n getStats(): {\n total: number;\n nextId: number;\n } {\n return {\n total: this.getCount(),\n nextId: this.nextId,\n };\n }\n\n /**\n * Generates the footnotes.xml content\n */\n generateFootnotesXml(): string {\n const footnotes = this.getAllFootnotesWithSpecial();\n\n // Build footnotes element\n const footnotesElement: XMLElement = {\n name: 'w:footnotes',\n attributes: {\n 'xmlns:w': 'http://schemas.openxmlformats.org/wordprocessingml/2006/main',\n 'xmlns:r': 'http://schemas.openxmlformats.org/officeDocument/2006/relationships',\n },\n children: footnotes.map((f) => f.toXML()),\n };\n\n // Build XML using XMLBuilder\n const builder = new XMLBuilder();\n builder.element(footnotesElement.name, footnotesElement.attributes, footnotesElement.children);\n return builder.build(true);\n }\n\n /**\n * Validates footnotes XML\n * @param xml XML string to validate\n * @returns True if valid\n */\n static validate(xml: string): boolean {\n // Use XMLParser to extract root element\n if (!xml) {\n return false;\n }\n\n const footnotesContent = XMLParser.extractBetweenTags(xml, '<w:footnotes', '</w:footnotes>');\n if (!footnotesContent) {\n return false;\n }\n\n // Check for proper structure - namespace declaration\n if (!xml.includes('xmlns:w=')) {\n return false;\n }\n\n return true;\n }\n}\n"]}
1
+ {"version":3,"file":"FootnoteManager.js","sourceRoot":"","sources":["../../src/elements/FootnoteManager.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * FootnoteManager - Manages footnotes in a document\n *\n * Handles creation, registration, and XML generation for footnotes.\n * Maintains unique IDs and proper ordering.\n */\n\nimport { Footnote, FootnoteType } from './Footnote.js';\nimport { XMLBuilder, XMLElement } from '../xml/XMLBuilder.js';\nimport { XMLParser } from '../xml/XMLParser.js';\n\n/**\n * Manages footnotes in a document\n */\nexport class FootnoteManager {\n private footnotes = new Map<number, Footnote>();\n private nextId = 1;\n\n /**\n * Creates a new FootnoteManager\n * @private Use static factory method\n */\n private constructor() {\n // Add special footnotes (separators) with negative IDs\n this.addSpecialFootnotes();\n }\n\n /**\n * Adds special footnotes (separator, continuation)\n * These use negative IDs as per OOXML specification\n */\n private addSpecialFootnotes(): void {\n // Separator footnote (ID -1)\n const separator = Footnote.createSeparator(-1);\n this.footnotes.set(-1, separator);\n\n // Continuation separator (ID 0)\n const continuationSep = Footnote.createContinuationSeparator(0);\n this.footnotes.set(0, continuationSep);\n }\n\n /**\n * Checks if a footnote is a special/system type (separator, continuationSeparator,\n * continuationNotice) that should be preserved across clear() operations.\n * Uses type-based detection rather than ID-based, because continuationNotice\n * has a positive ID (typically 1) but is still a system footnote.\n */\n private isSpecialFootnote(footnote: Footnote): boolean {\n const type = footnote.getType();\n return (\n type === FootnoteType.Separator ||\n type === FootnoteType.ContinuationSeparator ||\n type === FootnoteType.ContinuationNotice\n );\n }\n\n /**\n * Creates a new FootnoteManager instance\n */\n static create(): FootnoteManager {\n return new FootnoteManager();\n }\n\n /**\n * Registers a footnote\n * @param footnote Footnote to register\n * @returns The registered footnote\n */\n register(footnote: Footnote): Footnote {\n const id = footnote.getId();\n\n // Ensure ID is not already used (except for special footnotes)\n if (id > 0 && this.footnotes.has(id)) {\n throw new Error(`Footnote with ID ${id} already exists`);\n }\n\n this.footnotes.set(id, footnote);\n\n // Update next ID if needed\n if (id >= this.nextId) {\n this.nextId = id + 1;\n }\n\n return footnote;\n }\n\n /**\n * Creates and registers a new footnote\n * @param text Footnote text\n * @returns The created footnote\n */\n createFootnote(text: string): Footnote {\n const footnote = Footnote.fromText(this.nextId++, text);\n this.footnotes.set(footnote.getId(), footnote);\n return footnote;\n }\n\n /**\n * Gets a footnote by ID\n * @param id Footnote ID\n * @returns The footnote, or undefined if not found\n */\n getFootnote(id: number): Footnote | undefined {\n return this.footnotes.get(id);\n }\n\n /**\n * Gets all user footnotes (excluding special system types: separator,\n * continuationSeparator, continuationNotice)\n */\n getAllFootnotes(): Footnote[] {\n return Array.from(this.footnotes.values())\n .filter((f) => !this.isSpecialFootnote(f))\n .sort((a, b) => a.getId() - b.getId());\n }\n\n /**\n * Gets all footnotes including special ones\n */\n getAllFootnotesWithSpecial(): Footnote[] {\n return Array.from(this.footnotes.values()).sort((a, b) => a.getId() - b.getId());\n }\n\n /**\n * Checks if a footnote exists\n * @param id Footnote ID\n */\n hasFootnote(id: number): boolean {\n return this.footnotes.has(id);\n }\n\n /**\n * Removes a footnote\n * @param id Footnote ID\n * @returns True if removed, false if not found or if it's a special type\n */\n removeFootnote(id: number): boolean {\n const footnote = this.footnotes.get(id);\n if (!footnote || this.isSpecialFootnote(footnote)) {\n return false;\n }\n return this.footnotes.delete(id);\n }\n\n /**\n * Gets the next available ID\n */\n getNextId(): number {\n return this.nextId;\n }\n\n /**\n * Gets the count of footnotes (excluding special ones)\n */\n getCount(): number {\n return this.getAllFootnotes().length;\n }\n\n /**\n * Checks if there are any footnotes (excluding special ones)\n */\n isEmpty(): boolean {\n return this.getCount() === 0;\n }\n\n /**\n * Clears all user footnotes (preserves special system types: separator,\n * continuationSeparator, continuationNotice)\n */\n clear(): void {\n const specialFootnotes = new Map<number, Footnote>();\n let maxSpecialId = 0;\n\n for (const [id, footnote] of this.footnotes) {\n if (this.isSpecialFootnote(footnote)) {\n specialFootnotes.set(id, footnote);\n if (id > maxSpecialId) {\n maxSpecialId = id;\n }\n }\n }\n\n this.footnotes = specialFootnotes;\n // Ensure nextId doesn't collide with special footnotes that have positive IDs\n this.nextId = Math.max(maxSpecialId + 1, 1);\n }\n\n /**\n * Gets statistics about footnotes\n */\n getStats(): {\n total: number;\n nextId: number;\n } {\n return {\n total: this.getCount(),\n nextId: this.nextId,\n };\n }\n\n /**\n * Generates the footnotes.xml content\n */\n generateFootnotesXml(): string {\n const footnotes = this.getAllFootnotesWithSpecial();\n\n // Build footnotes element\n const footnotesElement: XMLElement = {\n name: 'w:footnotes',\n attributes: {\n 'xmlns:w': 'http://schemas.openxmlformats.org/wordprocessingml/2006/main',\n 'xmlns:r': 'http://schemas.openxmlformats.org/officeDocument/2006/relationships',\n },\n children: footnotes.map((f) => f.toXML()),\n };\n\n // Build XML using XMLBuilder\n const builder = new XMLBuilder();\n builder.element(footnotesElement.name, footnotesElement.attributes, footnotesElement.children);\n return builder.build(true);\n }\n\n /**\n * Validates footnotes XML\n * @param xml XML string to validate\n * @returns True if valid\n */\n static validate(xml: string): boolean {\n // Use XMLParser to extract root element\n if (!xml) {\n return false;\n }\n\n const footnotesContent = XMLParser.extractBetweenTags(xml, '<w:footnotes', '</w:footnotes>');\n if (!footnotesContent) {\n return false;\n }\n\n // Check for proper structure - namespace declaration\n if (!xml.includes('xmlns:w=')) {\n return false;\n }\n\n return true;\n }\n}\n"]}
@@ -1,6 +1,6 @@
1
- import { Paragraph } from './Paragraph';
2
- import { RunFormatting } from './Run';
3
- import { Table } from './Table';
1
+ import { Paragraph } from './Paragraph.js';
2
+ import { RunFormatting } from './Run.js';
3
+ import { Table } from './Table.js';
4
4
  export type HeaderType = 'default' | 'first' | 'even';
5
5
  type HeaderElement = Paragraph | Table;
6
6
  export interface HeaderProperties {
@@ -1 +1 @@
1
- {"version":3,"file":"Header.d.ts","sourceRoot":"","sources":["../../src/elements/Header.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AACtC,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAKhC,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG,OAAO,GAAG,MAAM,CAAC;AAKtD,KAAK,aAAa,GAAG,SAAS,GAAG,KAAK,CAAC;AAKvC,MAAM,WAAW,gBAAgB;IAE/B,IAAI,CAAC,EAAE,UAAU,CAAC;CACnB;AAKD,qBAAa,MAAM;IACjB,OAAO,CAAC,QAAQ,CAAuB;IACvC,OAAO,CAAC,IAAI,CAAa;IACzB,OAAO,CAAC,QAAQ,CAAC,CAAS;IAC1B,OAAO,CAAC,MAAM,CAAC,CAAS;gBAMZ,UAAU,GAAE,gBAAqB;IAQ7C,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAQ5B,SAAS,IAAI,MAAM,GAAG,SAAS;IAO/B,OAAO,IAAI,UAAU;IAQrB,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAQ7B,WAAW,IAAI,MAAM,GAAG,SAAS;IAQjC,YAAY,CAAC,SAAS,EAAE,SAAS,GAAG,IAAI;IASxC,eAAe,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS;IA0BzC,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,aAAa,GAAG,SAAS;IAW5D,QAAQ,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI;IAU5B,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,KAAK;IASjD,WAAW,IAAI,aAAa,EAAE;IAO9B,eAAe,IAAI,MAAM;IAOzB,KAAK,IAAI,IAAI;IAUb,KAAK,IAAI,MAAM;IA+Bf,OAAO,CAAC,aAAa;IAmDrB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM;IAOnC,MAAM,CAAC,aAAa,IAAI,MAAM;IAO9B,MAAM,CAAC,WAAW,IAAI,MAAM;IAO5B,MAAM,CAAC,UAAU,IAAI,MAAM;IAQ3B,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,gBAAgB,GAAG,MAAM;CAGrD"}
1
+ {"version":3,"file":"Header.d.ts","sourceRoot":"","sources":["../../src/elements/Header.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAKnC,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG,OAAO,GAAG,MAAM,CAAC;AAKtD,KAAK,aAAa,GAAG,SAAS,GAAG,KAAK,CAAC;AAKvC,MAAM,WAAW,gBAAgB;IAE/B,IAAI,CAAC,EAAE,UAAU,CAAC;CACnB;AAKD,qBAAa,MAAM;IACjB,OAAO,CAAC,QAAQ,CAAuB;IACvC,OAAO,CAAC,IAAI,CAAa;IACzB,OAAO,CAAC,QAAQ,CAAC,CAAS;IAC1B,OAAO,CAAC,MAAM,CAAC,CAAS;gBAMZ,UAAU,GAAE,gBAAqB;IAQ7C,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAQ5B,SAAS,IAAI,MAAM,GAAG,SAAS;IAO/B,OAAO,IAAI,UAAU;IAQrB,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAQ7B,WAAW,IAAI,MAAM,GAAG,SAAS;IAQjC,YAAY,CAAC,SAAS,EAAE,SAAS,GAAG,IAAI;IASxC,eAAe,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS;IA0BzC,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,aAAa,GAAG,SAAS;IAW5D,QAAQ,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI;IAU5B,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,KAAK;IASjD,WAAW,IAAI,aAAa,EAAE;IAO9B,eAAe,IAAI,MAAM;IAOzB,KAAK,IAAI,IAAI;IAUb,KAAK,IAAI,MAAM;IA+Bf,OAAO,CAAC,aAAa;IAmDrB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM;IAOnC,MAAM,CAAC,aAAa,IAAI,MAAM;IAO9B,MAAM,CAAC,WAAW,IAAI,MAAM;IAO5B,MAAM,CAAC,UAAU,IAAI,MAAM;IAQ3B,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,gBAAgB,GAAG,MAAM;CAGrD"}
@@ -1,8 +1,8 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.Header = void 0;
4
- const Paragraph_1 = require("./Paragraph");
5
- const Table_1 = require("./Table");
4
+ const Paragraph_js_1 = require("./Paragraph.js");
5
+ const Table_js_1 = require("./Table.js");
6
6
  class Header {
7
7
  elements = [];
8
8
  type;
@@ -33,7 +33,7 @@ class Header {
33
33
  return this;
34
34
  }
35
35
  createParagraph(text) {
36
- const para = new Paragraph_1.Paragraph();
36
+ const para = new Paragraph_js_1.Paragraph();
37
37
  if (text) {
38
38
  para.addText(text);
39
39
  }
@@ -41,7 +41,7 @@ class Header {
41
41
  return para;
42
42
  }
43
43
  addText(text, formatting) {
44
- const para = new Paragraph_1.Paragraph();
44
+ const para = new Paragraph_js_1.Paragraph();
45
45
  para.addText(text, formatting);
46
46
  this.elements.push(para);
47
47
  return para;
@@ -51,7 +51,7 @@ class Header {
51
51
  return this;
52
52
  }
53
53
  createTable(rows, columns) {
54
- const table = new Table_1.Table(rows, columns);
54
+ const table = new Table_js_1.Table(rows, columns);
55
55
  this.elements.push(table);
56
56
  return table;
57
57
  }