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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Field.js","sourceRoot":"","sources":["../../../src/elements/Field.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Field - Represents a dynamic field in a Word document\n *\n * Fields are used for dynamic content like page numbers, dates, document properties, etc.\n * They are represented using the <w:fldSimple> element with field codes.\n */\n\nimport { XMLElement } from '../xml/XMLBuilder.js';\nimport { RunFormatting, FormFieldData } from './Run.js';\nimport {\n ParsedHyperlinkInstruction,\n parseHyperlinkInstruction,\n isHyperlinkInstruction,\n} from './FieldHelpers.js';\nimport type { Revision } from './Revision.js';\nimport { pointsToHalfPoints } from '../utils/units.js';\n\n/**\n * Common field types\n */\nexport type FieldType =\n | 'PAGE' // Current page number\n | 'NUMPAGES' // Total number of pages\n | 'DATE' // Current date\n | 'TIME' // Current time\n | 'AUTHOR' // Document author\n | 'TITLE' // Document title\n | 'FILENAME' // Document filename\n | 'FILENAMEWITHPATH' // Document filename with path\n | 'SUBJECT' // Document subject\n | 'KEYWORDS' // Document keywords\n | 'CREATEDATE' // Document creation date\n | 'SAVEDATE' // Last save date\n | 'PRINTDATE' // Last print date\n | 'SECTIONPAGES' // Pages in current section\n | 'SECTION' // Current section number\n | 'REF' // Cross-reference to bookmark\n | 'HYPERLINK' // Hyperlink field\n | 'SEQ' // Sequence numbering\n | 'TC' // Table of contents entry\n | 'XE' // Index entry\n | 'IF' // Conditional field\n | 'MERGEFIELD' // Mail merge field\n | 'INCLUDE' // Include text from external file\n | 'INCLUDETEXT' // Include text from external file (alias)\n | 'CUSTOM'; // Custom field type for unknown/specialized fields\n\n/**\n * Field properties\n */\nexport interface FieldProperties {\n /** Field type */\n type: FieldType;\n /** Field instruction (e.g., 'PAGE \\* MERGEFORMAT') */\n instruction?: string;\n /** Format switches (e.g., '\\\\* MERGEFORMAT') */\n format?: string;\n /** Date/time format (e.g., 'MMMM d, yyyy') */\n dateFormat?: string;\n /** Preserve formatting during updates */\n preserveFormatting?: boolean;\n /** Run formatting for field result */\n formatting?: RunFormatting;\n /**\n * `<w:fldSimple w:fldLock=\"…\">` — CT_OnOff per ECMA-376 §17.16.16.\n * When true, the field is locked against automatic updates.\n */\n fldLock?: boolean;\n /**\n * `<w:fldSimple w:dirty=\"…\">` — CT_OnOff per ECMA-376 §17.16.16.\n * When true, the field's cached result is out of date and Word should\n * refresh it at open-time.\n */\n dirty?: boolean;\n}\n\n/**\n * Represents a dynamic field\n */\nexport class Field {\n private type: FieldType;\n private instruction: string;\n private formatting?: RunFormatting;\n private fldLock?: boolean;\n private dirty?: boolean;\n\n /**\n * Creates a new field\n * @param properties Field properties\n */\n constructor(properties: FieldProperties) {\n this.type = properties.type;\n this.formatting = properties.formatting;\n this.fldLock = properties.fldLock;\n this.dirty = properties.dirty;\n\n // Build field instruction\n if (properties.instruction) {\n this.instruction = properties.instruction;\n } else {\n this.instruction = this.buildInstruction(properties);\n }\n }\n\n /**\n * Builds field instruction from properties\n */\n private buildInstruction(properties: FieldProperties): string {\n let instruction = properties.type;\n\n // Add date format for date/time fields\n if (properties.dateFormat && this.isDateField(properties.type)) {\n instruction += ` \\\\@ \"${properties.dateFormat}\"`;\n }\n\n // Add format switch\n if (properties.format) {\n instruction += ` ${properties.format}`;\n } else if (properties.preserveFormatting !== false) {\n // Add MERGEFORMAT by default to preserve formatting\n instruction += ' \\\\* MERGEFORMAT';\n }\n\n return instruction;\n }\n\n /**\n * Checks if field type is a date field\n */\n private isDateField(type: FieldType): boolean {\n return ['DATE', 'TIME', 'CREATEDATE', 'SAVEDATE', 'PRINTDATE'].includes(type);\n }\n\n /**\n * Gets the field type\n */\n getType(): FieldType {\n return this.type;\n }\n\n /**\n * Gets the field instruction\n */\n getInstruction(): string {\n return this.instruction;\n }\n\n /**\n * Sets run formatting for the field\n */\n setFormatting(formatting: RunFormatting): this {\n this.formatting = formatting;\n return this;\n }\n\n /**\n * Gets run formatting\n */\n getFormatting(): RunFormatting | undefined {\n return this.formatting;\n }\n\n /**\n * Checks if this field is a HYPERLINK field\n * @returns True if the field type is HYPERLINK or instruction starts with HYPERLINK\n */\n isHyperlinkField(): boolean {\n return (\n this.type === 'HYPERLINK' || this.instruction.trim().toUpperCase().startsWith('HYPERLINK')\n );\n }\n\n /**\n * Sets text color for the field\n * @param color Color in hex format (e.g., '0000FF')\n * @returns This field for chaining\n */\n setColor(color: string): this {\n if (!this.formatting) {\n this.formatting = {};\n }\n this.formatting.color = color.replace('#', '');\n return this;\n }\n\n /**\n * Generates XML for the field.\n * Per ECMA-376, w:fldSimple is a paragraph-level element that CONTAINS w:r children.\n * Structure: <w:fldSimple w:instr=\"...\"><w:r><w:rPr/><w:t>...</w:t></w:r></w:fldSimple>\n * The fldSimple element should be added directly to paragraph children (not wrapped in w:r).\n */\n toXML(): XMLElement {\n // Build the inner run with optional formatting\n const runChildren: XMLElement[] = [];\n if (this.formatting) {\n runChildren.push(this.createRunProperties());\n }\n // Per ECMA-376 §22.1.2.33 CT_Text, `xml:space=\"preserve\"` is the\n // standard sentinel that stops XML processors from collapsing leading /\n // trailing whitespace in the text content. Run.ts always emits it;\n // emit it here too so field placeholders with spaces (e.g. localized\n // date formats like \"1 Jan 2026\") survive XML round-trip intact.\n runChildren.push({\n name: 'w:t',\n attributes: { 'xml:space': 'preserve' },\n children: [this.getPlaceholderText()],\n });\n\n // CT_SimpleField (§17.16.16) carries two ST_OnOff attributes beyond\n // the required w:instr: w:fldLock (locked against updates) and\n // w:dirty (cached result out of date). Emit when the caller set\n // them so Word-authored fldSimple documents round-trip their\n // lock/dirty state instead of silently clearing it.\n const fldSimpleAttrs: Record<string, string> = {\n 'w:instr': this.instruction,\n };\n if (this.fldLock !== undefined) {\n fldSimpleAttrs['w:fldLock'] = this.fldLock ? '1' : '0';\n }\n if (this.dirty !== undefined) {\n fldSimpleAttrs['w:dirty'] = this.dirty ? '1' : '0';\n }\n\n return {\n name: 'w:fldSimple',\n attributes: fldSimpleAttrs,\n children: [\n {\n name: 'w:r',\n children: runChildren,\n },\n ],\n };\n }\n\n /**\n * Gets placeholder text for the field\n */\n private getPlaceholderText(): string {\n switch (this.type) {\n case 'PAGE':\n return '1';\n case 'NUMPAGES':\n return '1';\n case 'SECTIONPAGES':\n return '1';\n case 'SECTION':\n return '1';\n case 'DATE':\n return new Date().toLocaleDateString();\n case 'TIME':\n return new Date().toLocaleTimeString();\n case 'CREATEDATE':\n case 'SAVEDATE':\n case 'PRINTDATE':\n return new Date().toLocaleDateString();\n case 'FILENAME':\n return 'Document';\n case 'FILENAMEWITHPATH':\n return 'C:\\\\Document.docx';\n case 'AUTHOR':\n return 'Author';\n case 'TITLE':\n return 'Title';\n case 'SUBJECT':\n return 'Subject';\n case 'KEYWORDS':\n return 'Keywords';\n case 'REF':\n return '1'; // Reference typically shows page number or heading text\n case 'HYPERLINK':\n return 'Link'; // Hyperlink displays the link text\n case 'SEQ':\n return '1'; // Sequence shows the current number\n case 'TC':\n return ''; // TC fields are hidden\n case 'XE':\n return ''; // XE fields are hidden\n default:\n return '';\n }\n }\n\n /**\n * Creates run properties XML\n */\n private createRunProperties(): XMLElement {\n const children: XMLElement[] = [];\n\n if (!this.formatting) {\n return { name: 'w:rPr', children };\n }\n\n // Per ECMA-376 CT_RPr ordering:\n // rFonts → b → i → strike → color → sz/szCs → highlight → u\n\n if (this.formatting.font) {\n children.push({\n name: 'w:rFonts',\n attributes: {\n 'w:ascii': this.formatting.font,\n 'w:hAnsi': this.formatting.font,\n 'w:cs': this.formatting.font,\n },\n selfClosing: true,\n });\n }\n\n if (this.formatting.bold) {\n children.push({ name: 'w:b', selfClosing: true });\n }\n\n if (this.formatting.italic) {\n children.push({ name: 'w:i', selfClosing: true });\n }\n\n if (this.formatting.strike) {\n children.push({ name: 'w:strike', selfClosing: true });\n }\n\n if (this.formatting.color) {\n const color = this.formatting.color.replace('#', '');\n children.push({\n name: 'w:color',\n attributes: { 'w:val': color },\n selfClosing: true,\n });\n }\n\n if (this.formatting.size) {\n const sizeValue = pointsToHalfPoints(this.formatting.size).toString();\n children.push({\n name: 'w:sz',\n attributes: { 'w:val': sizeValue },\n selfClosing: true,\n });\n children.push({\n name: 'w:szCs',\n attributes: { 'w:val': sizeValue },\n selfClosing: true,\n });\n }\n\n if (this.formatting.highlight) {\n children.push({\n name: 'w:highlight',\n attributes: { 'w:val': this.formatting.highlight },\n selfClosing: true,\n });\n }\n\n if (this.formatting.underline) {\n const val =\n typeof this.formatting.underline === 'string' ? this.formatting.underline : 'single';\n children.push({\n name: 'w:u',\n attributes: { 'w:val': val },\n selfClosing: true,\n });\n }\n\n return { name: 'w:rPr', children };\n }\n\n /**\n * Creates a page number field\n * @param formatting Optional run formatting\n */\n static createPageNumber(formatting?: RunFormatting): Field {\n return new Field({\n type: 'PAGE',\n formatting,\n });\n }\n\n /**\n * Creates a total pages field\n * @param formatting Optional run formatting\n */\n static createTotalPages(formatting?: RunFormatting): Field {\n return new Field({\n type: 'NUMPAGES',\n formatting,\n });\n }\n\n /**\n * Creates a date field\n * @param format Date format (e.g., 'MMMM d, yyyy')\n * @param formatting Optional run formatting\n */\n static createDate(format?: string, formatting?: RunFormatting): Field {\n return new Field({\n type: 'DATE',\n dateFormat: format,\n formatting,\n });\n }\n\n /**\n * Creates a time field\n * @param format Time format\n * @param formatting Optional run formatting\n */\n static createTime(format?: string, formatting?: RunFormatting): Field {\n return new Field({\n type: 'TIME',\n dateFormat: format,\n formatting,\n });\n }\n\n /**\n * Creates a filename field\n * @param includePath Whether to include full path\n * @param formatting Optional run formatting\n */\n static createFilename(includePath = false, formatting?: RunFormatting): Field {\n return new Field({\n type: includePath ? 'FILENAMEWITHPATH' : 'FILENAME',\n formatting,\n });\n }\n\n /**\n * Creates an author field\n * @param formatting Optional run formatting\n */\n static createAuthor(formatting?: RunFormatting): Field {\n return new Field({\n type: 'AUTHOR',\n formatting,\n });\n }\n\n /**\n * Creates a title field\n * @param formatting Optional run formatting\n */\n static createTitle(formatting?: RunFormatting): Field {\n return new Field({\n type: 'TITLE',\n formatting,\n });\n }\n\n /**\n * Creates a section pages field (pages in current section)\n * @param formatting Optional run formatting\n */\n static createSectionPages(formatting?: RunFormatting): Field {\n return new Field({\n type: 'SECTIONPAGES',\n formatting,\n });\n }\n\n /**\n * Creates a cross-reference field\n * @param bookmark Bookmark name to reference\n * @param format Reference format (\\h for hyperlink, \\p for page number, etc.)\n * @param formatting Optional run formatting\n */\n static createRef(bookmark: string, format?: string, formatting?: RunFormatting): Field {\n const formatSwitch = format || '\\\\h'; // Default to hyperlink format\n const instruction = `REF ${bookmark} ${formatSwitch} \\\\* MERGEFORMAT`;\n\n return new Field({\n type: 'REF',\n instruction,\n formatting,\n });\n }\n\n /**\n * Creates a hyperlink field\n * @param url The URL to link to\n * @param displayText The text to display\n * @param tooltip Optional tooltip text\n * @param formatting Optional run formatting\n */\n static createHyperlink(\n url: string,\n _displayText: string = url,\n tooltip?: string,\n formatting?: RunFormatting\n ): Field {\n let instruction = `HYPERLINK \"${url}\"`;\n\n if (tooltip) {\n instruction += ` \\\\o \"${tooltip}\"`;\n }\n\n instruction += ' \\\\* MERGEFORMAT';\n\n return new Field({\n type: 'HYPERLINK',\n instruction,\n formatting,\n });\n }\n\n /**\n * Creates a sequence numbering field\n * @param identifier Sequence identifier (e.g., 'Figure', 'Table')\n * @param format Number format (\\* ARABIC, \\* ROMAN, etc.)\n * @param formatting Optional run formatting\n */\n static createSeq(identifier: string, format?: string, formatting?: RunFormatting): Field {\n let instruction = `SEQ ${identifier}`;\n\n if (format) {\n instruction += ` ${format}`;\n } else {\n instruction += ' \\\\* ARABIC'; // Default to Arabic numerals\n }\n\n instruction += ' \\\\* MERGEFORMAT';\n\n return new Field({\n type: 'SEQ',\n instruction,\n formatting,\n });\n }\n\n /**\n * Creates a table of contents entry field (TC)\n * @param text Entry text\n * @param level TOC level (1-9)\n * @param formatting Optional run formatting\n */\n static createTCEntry(text: string, level = 1, formatting?: RunFormatting): Field {\n if (level < 1 || level > 9) {\n throw new Error('TC level must be between 1 and 9');\n }\n\n const instruction = `TC \"${text}\" \\\\f C \\\\l ${level}`;\n\n return new Field({\n type: 'TC',\n instruction,\n formatting,\n });\n }\n\n /**\n * Creates an index entry field (XE)\n * @param text Entry text\n * @param subEntry Optional sub-entry text\n * @param formatting Optional run formatting\n */\n static createXEEntry(text: string, subEntry?: string, formatting?: RunFormatting): Field {\n let instruction = `XE \"${text}\"`;\n\n if (subEntry) {\n instruction += `:${subEntry}`;\n }\n\n return new Field({\n type: 'XE',\n instruction,\n formatting,\n });\n }\n\n /**\n * Creates a custom field with instruction\n * @param instruction Field instruction code\n * @param formatting Optional run formatting\n */\n static createCustom(instruction: string, formatting?: RunFormatting): Field {\n return new Field({\n type: 'PAGE', // Placeholder type\n instruction,\n formatting,\n });\n }\n\n /**\n * Creates a field from properties\n * @param properties Field properties\n */\n static create(properties: FieldProperties): Field {\n return new Field(properties);\n }\n}\n\n/**\n * Field character type for complex fields\n */\nexport type FieldCharType = 'begin' | 'separate' | 'end';\n\n/**\n * Complex field properties\n * Complex fields use begin/separate/end structure instead of fldSimple\n */\nexport interface ComplexFieldProperties {\n /** Field instruction (e.g., \" TOC \\\\o \\\"1-3\\\" \\\\h \\\\z \\\\u \") */\n instruction: string;\n\n /** Current field result text (optional) */\n result?: string;\n\n /** Run formatting for instruction */\n instructionFormatting?: RunFormatting;\n\n /** Run formatting for result */\n resultFormatting?: RunFormatting;\n\n /** Nested fields to include within this field */\n nestedFields?: ComplexField[];\n\n /** Custom XML content for result section */\n resultContent?: XMLElement[];\n\n /** Whether field spans multiple paragraphs */\n multiParagraph?: boolean;\n\n /** Parsed HYPERLINK instruction components (auto-populated if instruction is HYPERLINK) */\n parsedHyperlink?: ParsedHyperlinkInstruction;\n\n /**\n * Whether the field has a result section (w:fldSep was present during parsing)\n * Per ECMA-376, fields without results skip the separator element.\n * This flag distinguishes between:\n * - hasResult=true, result=\"\" → Field had separator but result was empty\n * - hasResult=false, result=\"\" → Field never had a result section (empty field)\n */\n hasResult?: boolean;\n\n /** Form field data (w:ffData) from begin field char per ECMA-376 §17.16.17 */\n formFieldData?: FormFieldData;\n}\n\n/**\n * Represents a complex field (begin/separate/end structure)\n * Used for TOC, cross-references, and other advanced fields\n *\n * Structure:\n * <w:r><w:fldChar w:fldCharType=\"begin\"/></w:r>\n * <w:r><w:instrText>INSTRUCTION</w:instrText></w:r>\n * <w:r><w:fldChar w:fldCharType=\"separate\"/></w:r>\n * <w:r><w:t>RESULT</w:t></w:r>\n * <w:r><w:fldChar w:fldCharType=\"end\"/></w:r>\n */\nexport class ComplexField {\n private instruction: string;\n private result?: string;\n private instructionFormatting?: RunFormatting;\n private resultFormatting?: RunFormatting;\n private nestedFields: ComplexField[];\n private resultContent: XMLElement[];\n private multiParagraph: boolean;\n private parsedHyperlink?: ParsedHyperlinkInstruction;\n /** Revisions that wrap the result section (for tracked changes in field content) */\n private resultRevisions: Revision[] = [];\n /**\n * Whether the field has a result section (w:fldSep was present during parsing)\n * Per ECMA-376, fields without results skip the separator element.\n */\n private _hasResultSection = false;\n private _formFieldData?: FormFieldData;\n private trackingContext?: import('../tracking/TrackingContext.js').TrackingContext;\n\n /**\n * Creates a new complex field\n * @param properties Complex field properties\n */\n constructor(properties: ComplexFieldProperties) {\n this.instruction = properties.instruction;\n this.result = properties.result;\n this.instructionFormatting = properties.instructionFormatting;\n this.resultFormatting = properties.resultFormatting;\n this.nestedFields = properties.nestedFields || [];\n this.resultContent = properties.resultContent || [];\n this.multiParagraph = properties.multiParagraph || false;\n this._hasResultSection = properties.hasResult ?? false;\n this._formFieldData = properties.formFieldData;\n\n // Auto-parse HYPERLINK instruction if provided or detected\n if (properties.parsedHyperlink) {\n this.parsedHyperlink = properties.parsedHyperlink;\n } else if (isHyperlinkInstruction(this.instruction)) {\n this.parsedHyperlink = parseHyperlinkInstruction(this.instruction) || undefined;\n }\n }\n\n /**\n * Gets the field instruction\n */\n getInstruction(): string {\n return this.instruction;\n }\n\n /**\n * Sets the field instruction\n */\n setInstruction(instruction: string): this {\n this.instruction = instruction;\n return this;\n }\n\n /**\n * Gets form field data (w:ffData) if present\n */\n getFormFieldData(): FormFieldData | undefined {\n return this._formFieldData;\n }\n\n /**\n * Gets the field result text\n */\n getResult(): string | undefined {\n return this.result;\n }\n\n /**\n * Sets the field result text\n */\n setResult(result: string): this {\n this.result = result;\n this.resultRevisions = []; // Clear orphaned revisions from old text\n this.resultContent = []; // Clear raw XML content since we have new text\n return this;\n }\n\n /**\n * Checks if the field has a result section\n *\n * Per ECMA-376, complex fields may or may not have a result section.\n * Fields without results (like TOC markers or empty PAGE fields) skip\n * the w:fldSep (separator) element entirely.\n *\n * This method distinguishes between:\n * - `hasResultSection() === true && getResult() === \"\"` → Field had separator but result was empty\n * - `hasResultSection() === false && getResult() === undefined` → Field never had a result section\n *\n * @returns True if the field has a result section (w:fldSep was present)\n *\n * @example\n * ```typescript\n * const field = paragraph.getFields()[0];\n * if (field instanceof ComplexField) {\n * if (field.hasResultSection()) {\n * console.log('Field result:', field.getResult());\n * } else {\n * console.log('Field has no result section (empty field)');\n * }\n * }\n * ```\n */\n hasResultSection(): boolean {\n return this._hasResultSection;\n }\n\n /**\n * Sets instruction formatting\n */\n setInstructionFormatting(formatting: RunFormatting): this {\n this.instructionFormatting = formatting;\n return this;\n }\n\n /**\n * Sets result formatting\n */\n setResultFormatting(formatting: RunFormatting): this {\n this.resultFormatting = formatting;\n return this;\n }\n\n /**\n * Gets the parsed HYPERLINK instruction components\n * Returns undefined if this is not a HYPERLINK field\n */\n getParsedHyperlink(): ParsedHyperlinkInstruction | undefined {\n return this.parsedHyperlink;\n }\n\n /**\n * Checks if this field is a HYPERLINK field\n */\n isHyperlinkField(): boolean {\n return this.parsedHyperlink !== undefined;\n }\n\n /**\n * Gets the full URL for HYPERLINK fields (combining base URL and anchor)\n * Returns undefined if not a HYPERLINK field\n */\n getHyperlinkUrl(): string | undefined {\n return this.parsedHyperlink?.fullUrl;\n }\n\n /**\n * Adds a nested field within this field\n * Nested fields appear between instruction and separator\n */\n addNestedField(field: ComplexField): this {\n this.nestedFields.push(field);\n return this;\n }\n\n /**\n * Gets all nested fields\n */\n getNestedFields(): ComplexField[] {\n return [...this.nestedFields];\n }\n\n /**\n * Removes a nested field at the specified index\n * @param index - Index of the nested field to remove (0-based)\n * @returns True if removed, false if index out of bounds\n *\n * @example\n * ```typescript\n * const field = new ComplexField({ instruction: 'TOC' });\n * field.addNestedField(nested1);\n * field.addNestedField(nested2);\n * field.removeNestedField(0); // Removes nested1\n * ```\n */\n removeNestedField(index: number): boolean {\n if (index < 0 || index >= this.nestedFields.length) {\n return false;\n }\n this.nestedFields.splice(index, 1);\n return true;\n }\n\n /**\n * Gets the count of nested fields\n * @returns Number of nested fields\n */\n getNestedFieldCount(): number {\n return this.nestedFields.length;\n }\n\n /**\n * Clears all nested fields\n * @returns This field for chaining\n */\n clearNestedFields(): this {\n this.nestedFields = [];\n return this;\n }\n\n /**\n * Updates the field instruction\n * @param instruction - New field instruction (e.g., 'TOC \\\\o \"1-3\"')\n * @returns This field for chaining\n *\n * @example\n * ```typescript\n * const field = new ComplexField({ instruction: 'DATE' });\n * field.updateInstruction('DATE \\\\@ \"yyyy-MM-dd\"');\n * ```\n */\n updateInstruction(instruction: string): this {\n this.instruction = instruction;\n return this;\n }\n\n /**\n * Adds custom XML content to the result section\n */\n addResultContent(content: XMLElement): this {\n this.resultContent.push(content);\n return this;\n }\n\n /**\n * Gets result content XML elements\n */\n getResultContent(): XMLElement[] {\n return [...this.resultContent];\n }\n\n /**\n * Sets the tracking context for automatic change tracking\n * @internal\n */\n _setTrackingContext(context: import('../tracking/TrackingContext.js').TrackingContext): void {\n this.trackingContext = context;\n }\n\n /**\n * Gets the accepted (visible) text from resultContent XMLElements.\n * Processes w:r (plain runs), w:ins (accepted insertions), skips w:del/w:moveFrom.\n * Falls back to this.result if resultContent is empty.\n */\n getAcceptedResultText(): string {\n if (this.resultContent.length === 0) {\n return this.result || '';\n }\n let text = '';\n for (const element of this.resultContent) {\n if (element.name === 'w:r') {\n text += this.extractTextFromRunXml(element);\n } else if (element.name === 'w:ins') {\n for (const child of element.children || []) {\n if (typeof child !== 'string' && child.name === 'w:r') {\n text += this.extractTextFromRunXml(child);\n }\n }\n }\n // Skip w:del, w:moveFrom (deleted/moved text not visible)\n }\n return text || this.result || '';\n }\n\n /**\n * Extracts text content from a w:r (run) XMLElement\n */\n private extractTextFromRunXml(run: XMLElement): string {\n let text = '';\n for (const child of run.children || []) {\n if (typeof child !== 'string' && (child.name === 'w:t' || child.name === 'w:delText')) {\n for (const t of child.children || []) {\n if (typeof t === 'string') text += t;\n }\n }\n }\n return text;\n }\n\n /**\n * Sets the field result with tracked changes (del/ins pair).\n * Creates a w:del wrapping the old text and a w:ins wrapping the new text,\n * preserving formatting from the original result runs.\n *\n * @param newText - New result text to display\n * @param author - Author name for the revision\n * @param options - Optional formatting control\n */\n setTrackedResult(\n newText: string,\n author: string,\n options?: {\n formatting?: RunFormatting;\n preserveFormatting?: boolean;\n }\n ): this {\n const currentText = this.getAcceptedResultText();\n if (currentText === newText) return this; // No-op if unchanged\n\n const date = new Date().toISOString().replace(/\\.\\d{3}Z$/, 'Z');\n\n // Get revision IDs from TrackingContext if available, else Date.now()-based\n let delId: number, insId: number;\n if (this.trackingContext) {\n const rm = this.trackingContext.getRevisionManager();\n delId = rm.consumeNextId();\n insId = rm.consumeNextId();\n } else {\n const base = Date.now() % 100000000;\n delId = base;\n insId = base + 1;\n }\n\n // Resolve formatting: explicit > preserve > resultFormatting\n let rPr: XMLElement | null = null;\n if (options?.formatting) {\n rPr = this.createRunProperties(options.formatting);\n } else if (options?.preserveFormatting) {\n rPr = this.extractFirstVisibleRunProperties();\n }\n\n // Build <w:del> with old text\n const delRunChildren: (string | XMLElement)[] = [];\n if (rPr) delRunChildren.push(rPr);\n delRunChildren.push({\n name: 'w:delText',\n attributes: { 'xml:space': 'preserve' },\n children: [currentText],\n });\n const delElement: XMLElement = {\n name: 'w:del',\n attributes: { 'w:id': String(delId), 'w:author': author, 'w:date': date },\n children: [{ name: 'w:r', children: delRunChildren }],\n };\n\n // Build <w:ins> with new text\n const insRunChildren: (string | XMLElement)[] = [];\n if (rPr) insRunChildren.push(rPr);\n insRunChildren.push({\n name: 'w:t',\n attributes: { 'xml:space': 'preserve' },\n children: [newText],\n });\n const insElement: XMLElement = {\n name: 'w:ins',\n attributes: { 'w:id': String(insId), 'w:author': author, 'w:date': date },\n children: [{ name: 'w:r', children: insRunChildren }],\n };\n\n // Replace content: resultContent takes priority in toXML()\n this.resultContent = [delElement, insElement];\n this.result = newText;\n this.resultRevisions = [];\n\n return this;\n }\n\n /**\n * Extracts w:rPr from the first visible run in resultContent\n */\n private extractFirstVisibleRunProperties(): XMLElement | null {\n for (const element of this.resultContent) {\n if (element.name === 'w:r') {\n const rPr = (element.children || []).find(\n (c): c is XMLElement => typeof c !== 'string' && c.name === 'w:rPr'\n );\n if (rPr) return rPr;\n } else if (element.name === 'w:ins') {\n for (const child of element.children || []) {\n if (typeof child !== 'string' && child.name === 'w:r') {\n const rPr = (child.children || []).find(\n (c): c is XMLElement => typeof c !== 'string' && c.name === 'w:rPr'\n );\n if (rPr) return rPr;\n }\n }\n }\n }\n // Fall back to resultFormatting\n if (this.resultFormatting) {\n return this.createRunProperties(this.resultFormatting);\n }\n return null;\n }\n\n /**\n * Sets whether this field spans multiple paragraphs\n */\n setMultiParagraph(multiParagraph: boolean): this {\n this.multiParagraph = multiParagraph;\n return this;\n }\n\n /**\n * Gets whether this field spans multiple paragraphs\n */\n isMultiParagraph(): boolean {\n return this.multiParagraph;\n }\n\n /**\n * Sets revisions that wrap the result section\n * These are tracked changes (w:ins, w:del) that need to wrap the result AND end marker\n * @param revisions Array of Revision objects\n */\n setResultRevisions(revisions: Revision[]): this {\n this.resultRevisions = revisions;\n return this;\n }\n\n /**\n * Adds a revision to the result section\n * @param revision Revision to add\n */\n addResultRevision(revision: Revision): this {\n this.resultRevisions.push(revision);\n return this;\n }\n\n /**\n * Gets revisions that wrap the result section\n */\n getResultRevisions(): Revision[] {\n return [...this.resultRevisions];\n }\n\n /**\n * Checks if this field has revisions in the result section\n */\n hasResultRevisions(): boolean {\n return this.resultRevisions.length > 0;\n }\n\n /**\n * Generates XML for the complex field\n * Returns array of run elements (begin, instr, sep, result, end)\n */\n toXML(): XMLElement[] {\n const runs: XMLElement[] = [];\n\n // 1. Begin marker run\n const beginFldChar: XMLElement = this._formFieldData\n ? this.buildFldCharWithFfData()\n : {\n name: 'w:fldChar',\n attributes: { 'w:fldCharType': 'begin' },\n selfClosing: true,\n };\n runs.push({\n name: 'w:r',\n children: [beginFldChar],\n });\n\n // 2. Instruction run\n const instrChildren: XMLElement[] = [];\n if (this.instructionFormatting) {\n instrChildren.push(this.createRunProperties(this.instructionFormatting));\n }\n instrChildren.push({\n name: 'w:instrText',\n attributes: { 'xml:space': 'preserve' },\n children: [this.instruction],\n });\n runs.push({\n name: 'w:r',\n children: instrChildren,\n });\n\n // 2a. Nested fields (if any)\n for (const nestedField of this.nestedFields) {\n runs.push(...nestedField.toXML());\n }\n\n // 3. Separator run\n runs.push({\n name: 'w:r',\n children: [\n {\n name: 'w:fldChar',\n attributes: { 'w:fldCharType': 'separate' },\n selfClosing: true,\n },\n ],\n });\n\n // 4. Result content (prioritize custom XML content, then simple text)\n // Design note: For INCLUDEPICTURE fields, the parser stores the w:drawing\n // content in resultContent so it survives the parser→generator round-trip.\n // When flattenFieldCodes() is active, the full field structure is emitted\n // here, then _postProcessDocumentXml() strips the INCLUDEPICTURE scaffolding\n // (fldChar/instrText runs) from the final XML while preserving the drawing.\n // Non-INCLUDEPICTURE fields emit their complete structure unchanged.\n if (this.resultContent.length > 0) {\n // Use custom XML content\n runs.push(...this.resultContent);\n } else if (this.result) {\n // Use simple text result\n const resultChildren: XMLElement[] = [];\n if (this.resultFormatting) {\n resultChildren.push(this.createRunProperties(this.resultFormatting));\n }\n resultChildren.push({\n name: 'w:t',\n attributes: { 'xml:space': 'preserve' },\n children: [this.result],\n });\n runs.push({\n name: 'w:r',\n children: resultChildren,\n });\n }\n\n // 4a. Result revisions — only when NOT using resultContent\n // When resultContent is populated (e.g., by DocumentParser with interleaved revision XML),\n // it already includes revision elements in the correct interleaved position.\n // Emitting them again here would cause duplication.\n if (this.resultContent.length === 0) {\n for (const revision of this.resultRevisions) {\n const revisionXml = revision.toXML();\n if (revisionXml) {\n runs.push(revisionXml);\n }\n }\n }\n\n // 5. End marker run\n runs.push({\n name: 'w:r',\n children: [\n {\n name: 'w:fldChar',\n attributes: { 'w:fldCharType': 'end' },\n selfClosing: true,\n },\n ],\n });\n\n return runs;\n }\n\n /**\n * Creates run properties XML from formatting\n */\n private createRunProperties(formatting: RunFormatting): XMLElement {\n const children: XMLElement[] = [];\n\n if (formatting.bold) {\n children.push({ name: 'w:b', selfClosing: true });\n }\n\n if (formatting.italic) {\n children.push({ name: 'w:i', selfClosing: true });\n }\n\n if (formatting.underline) {\n const val = typeof formatting.underline === 'string' ? formatting.underline : 'single';\n children.push({\n name: 'w:u',\n attributes: { 'w:val': val },\n selfClosing: true,\n });\n }\n\n if (formatting.strike) {\n children.push({ name: 'w:strike', selfClosing: true });\n }\n\n if (formatting.font) {\n children.push({\n name: 'w:rFonts',\n attributes: {\n 'w:ascii': formatting.font,\n 'w:hAnsi': formatting.font,\n 'w:cs': formatting.font,\n },\n selfClosing: true,\n });\n }\n\n if (formatting.size) {\n const sizeValue = pointsToHalfPoints(formatting.size).toString();\n children.push({\n name: 'w:sz',\n attributes: { 'w:val': sizeValue },\n selfClosing: true,\n });\n children.push({\n name: 'w:szCs',\n attributes: { 'w:val': sizeValue },\n selfClosing: true,\n });\n }\n\n if (formatting.color) {\n const color = formatting.color.replace('#', '');\n children.push({\n name: 'w:color',\n attributes: { 'w:val': color },\n selfClosing: true,\n });\n }\n\n if (formatting.highlight) {\n children.push({\n name: 'w:highlight',\n attributes: { 'w:val': formatting.highlight },\n selfClosing: true,\n });\n }\n\n return { name: 'w:rPr', children };\n }\n\n /**\n * Builds a w:fldChar begin element with w:ffData child\n */\n private buildFldCharWithFfData(): XMLElement {\n const ffd = this._formFieldData!;\n const ffDataChildren: (string | XMLElement)[] = [];\n\n if (ffd.name) {\n ffDataChildren.push({ name: 'w:name', attributes: { 'w:val': ffd.name }, selfClosing: true });\n }\n if (ffd.enabled !== undefined) {\n if (ffd.enabled) {\n ffDataChildren.push({ name: 'w:enabled', selfClosing: true });\n } else {\n ffDataChildren.push({ name: 'w:enabled', attributes: { 'w:val': '0' }, selfClosing: true });\n }\n }\n if (ffd.calcOnExit !== undefined) {\n ffDataChildren.push({\n name: 'w:calcOnExit',\n attributes: { 'w:val': ffd.calcOnExit ? '1' : '0' },\n selfClosing: true,\n });\n }\n if (ffd.helpText) {\n ffDataChildren.push({\n name: 'w:helpText',\n attributes: { 'w:type': 'text', 'w:val': ffd.helpText },\n selfClosing: true,\n });\n }\n if (ffd.statusText) {\n ffDataChildren.push({\n name: 'w:statusText',\n attributes: { 'w:type': 'text', 'w:val': ffd.statusText },\n selfClosing: true,\n });\n }\n if (ffd.entryMacro) {\n ffDataChildren.push({\n name: 'w:entryMacro',\n attributes: { 'w:val': ffd.entryMacro },\n selfClosing: true,\n });\n }\n if (ffd.exitMacro) {\n ffDataChildren.push({\n name: 'w:exitMacro',\n attributes: { 'w:val': ffd.exitMacro },\n selfClosing: true,\n });\n }\n\n if (ffd.fieldType) {\n switch (ffd.fieldType.type) {\n case 'textInput': {\n const tiChildren: (string | XMLElement)[] = [];\n if (ffd.fieldType.inputType)\n tiChildren.push({\n name: 'w:type',\n attributes: { 'w:val': ffd.fieldType.inputType },\n selfClosing: true,\n });\n if (ffd.fieldType.defaultValue)\n tiChildren.push({\n name: 'w:default',\n attributes: { 'w:val': ffd.fieldType.defaultValue },\n selfClosing: true,\n });\n if (ffd.fieldType.maxLength !== undefined)\n tiChildren.push({\n name: 'w:maxLength',\n attributes: { 'w:val': String(ffd.fieldType.maxLength) },\n selfClosing: true,\n });\n if (ffd.fieldType.format)\n tiChildren.push({\n name: 'w:format',\n attributes: { 'w:val': ffd.fieldType.format },\n selfClosing: true,\n });\n ffDataChildren.push({ name: 'w:textInput', children: tiChildren });\n break;\n }\n case 'checkBox': {\n const cbChildren: (string | XMLElement)[] = [];\n if (ffd.fieldType.size === 'auto') {\n cbChildren.push({ name: 'w:sizeAuto', selfClosing: true });\n } else if (ffd.fieldType.size !== undefined) {\n cbChildren.push({\n name: 'w:size',\n attributes: { 'w:val': String(ffd.fieldType.size) },\n selfClosing: true,\n });\n }\n if (ffd.fieldType.defaultChecked !== undefined)\n cbChildren.push({\n name: 'w:default',\n attributes: { 'w:val': ffd.fieldType.defaultChecked ? '1' : '0' },\n selfClosing: true,\n });\n if (ffd.fieldType.checked !== undefined)\n cbChildren.push({\n name: 'w:checked',\n attributes: { 'w:val': ffd.fieldType.checked ? '1' : '0' },\n selfClosing: true,\n });\n ffDataChildren.push({ name: 'w:checkBox', children: cbChildren });\n break;\n }\n case 'dropDownList': {\n const ddChildren: (string | XMLElement)[] = [];\n if (ffd.fieldType.result !== undefined)\n ddChildren.push({\n name: 'w:result',\n attributes: { 'w:val': String(ffd.fieldType.result) },\n selfClosing: true,\n });\n if (ffd.fieldType.defaultResult !== undefined)\n ddChildren.push({\n name: 'w:default',\n attributes: { 'w:val': String(ffd.fieldType.defaultResult) },\n selfClosing: true,\n });\n if (ffd.fieldType.listEntries) {\n for (const entry of ffd.fieldType.listEntries) {\n ddChildren.push({\n name: 'w:listEntry',\n attributes: { 'w:val': entry },\n selfClosing: true,\n });\n }\n }\n ffDataChildren.push({ name: 'w:ddList', children: ddChildren });\n break;\n }\n }\n }\n\n return {\n name: 'w:fldChar',\n attributes: { 'w:fldCharType': 'begin' },\n children: [{ name: 'w:ffData', children: ffDataChildren }],\n };\n }\n}\n\n/**\n * TOC field options\n */\nexport interface TOCFieldOptions {\n /** Heading levels to include (e.g., \"1-3\" for levels 1-3) */\n levels?: string;\n\n /** Make entries hyperlinks (\\h switch) */\n hyperlinks?: boolean;\n\n /** Hide tab leaders and page numbers in Web Layout (\\z switch) */\n hideInWebLayout?: boolean;\n\n /** Use outline levels (\\u switch) */\n useOutlineLevels?: boolean;\n\n /** Omit page numbers (\\n switch) */\n omitPageNumbers?: boolean;\n\n /** Custom styles to use (\\t switch) */\n customStyles?: string;\n}\n\n/**\n * Creates a TOC (Table of Contents) complex field\n * Generates proper field instruction with switches\n *\n * @param options TOC field options\n * @returns ComplexField configured for TOC\n *\n * @example\n * const toc = createTOCField({ levels: '1-3', hyperlinks: true });\n * // Generates: TOC \\o \"1-3\" \\h \\z \\u\n */\nexport function createTOCField(options: TOCFieldOptions = {}): ComplexField {\n // Build instruction string\n let instruction = ' TOC';\n\n // Add outline levels switch\n if (options.levels !== undefined) {\n instruction += ` \\\\o \"${options.levels}\"`;\n } else {\n instruction += ' \\\\o \"1-3\"'; // Default: levels 1-3\n }\n\n // Add hyperlinks switch\n if (options.hyperlinks !== false) {\n instruction += ' \\\\h';\n }\n\n // Add hide in web layout switch\n if (options.hideInWebLayout !== false) {\n instruction += ' \\\\z';\n }\n\n // Add use outline levels switch\n if (options.useOutlineLevels !== false) {\n instruction += ' \\\\u';\n }\n\n // Add omit page numbers switch\n if (options.omitPageNumbers) {\n instruction += ' \\\\n';\n }\n\n // Add custom styles switch\n if (options.customStyles) {\n instruction += ` \\\\t \"${options.customStyles}\"`;\n }\n\n instruction += ' '; // Trailing space per Microsoft convention\n\n return new ComplexField({\n instruction,\n result: 'Table of Contents', // Placeholder result\n });\n}\n"]}
@@ -0,0 +1,134 @@
1
+ import { ComplexField } from './Field.js';
2
+ import { defaultLogger } from '../utils/logger.js';
3
+ export function parseHyperlinkInstruction(instruction) {
4
+ if (!instruction) {
5
+ return null;
6
+ }
7
+ const normalized = instruction.trim();
8
+ if (!normalized.toUpperCase().startsWith('HYPERLINK')) {
9
+ return null;
10
+ }
11
+ let url = '';
12
+ const urlMatch = /HYPERLINK\s+"([^"]*)"/i.exec(normalized);
13
+ if (urlMatch?.[1] !== undefined) {
14
+ url = urlMatch[1];
15
+ try {
16
+ url = decodeURIComponent(url);
17
+ }
18
+ catch (e) {
19
+ defaultLogger.debug(`[FieldHelpers] Failed to decode URL: ${url}`);
20
+ }
21
+ }
22
+ let anchor;
23
+ const anchorMatch = /\\l\s+"([^"]*)"/i.exec(normalized);
24
+ if (anchorMatch?.[1] !== undefined) {
25
+ anchor = anchorMatch[1];
26
+ try {
27
+ anchor = decodeURIComponent(anchor);
28
+ }
29
+ catch (e) {
30
+ defaultLogger.debug(`[FieldHelpers] Failed to decode anchor: ${anchor}`);
31
+ }
32
+ }
33
+ if (!url && !anchor) {
34
+ return null;
35
+ }
36
+ let tooltip;
37
+ const tooltipMatch = /\\o\s+"([^"]*)"/i.exec(normalized);
38
+ if (tooltipMatch?.[1] !== undefined) {
39
+ tooltip = tooltipMatch[1];
40
+ }
41
+ const hasHSwitch = /\\h(?:\s|$)/i.test(normalized);
42
+ let fullUrl = url;
43
+ if (anchor) {
44
+ const hashIndex = url.indexOf('#');
45
+ if (hashIndex >= 0) {
46
+ fullUrl = url.substring(0, hashIndex) + '#' + anchor;
47
+ }
48
+ else if (url) {
49
+ fullUrl = url + '#' + anchor;
50
+ }
51
+ else {
52
+ fullUrl = '#' + anchor;
53
+ }
54
+ }
55
+ return {
56
+ url,
57
+ anchor,
58
+ tooltip,
59
+ hasHSwitch,
60
+ fullUrl,
61
+ rawInstruction: instruction,
62
+ };
63
+ }
64
+ export function buildHyperlinkInstruction(url, anchor, tooltip) {
65
+ let instruction = `HYPERLINK "${url}"`;
66
+ if (anchor) {
67
+ instruction += ` \\l "${anchor}"`;
68
+ }
69
+ if (tooltip) {
70
+ instruction += ` \\o "${tooltip}"`;
71
+ }
72
+ instruction += ' \\h';
73
+ return instruction;
74
+ }
75
+ export function isHyperlinkInstruction(instruction) {
76
+ if (!instruction) {
77
+ return false;
78
+ }
79
+ return instruction.trim().toUpperCase().startsWith('HYPERLINK');
80
+ }
81
+ export function createNestedIFMergeField(condition, mergeFieldName, trueText = '', falseText = '') {
82
+ const mergeField = new ComplexField({
83
+ instruction: ` MERGEFIELD ${mergeFieldName} `,
84
+ result: `[${mergeFieldName}]`,
85
+ });
86
+ const ifField = new ComplexField({
87
+ instruction: ` IF ${condition} "${trueText}" "${falseText}" `,
88
+ result: trueText || falseText,
89
+ });
90
+ ifField.addNestedField(mergeField);
91
+ return ifField;
92
+ }
93
+ export function createMergeField(fieldName, format) {
94
+ let instruction = ` MERGEFIELD ${fieldName}`;
95
+ if (format) {
96
+ instruction += ` ${format}`;
97
+ }
98
+ instruction += ' \\* MERGEFORMAT ';
99
+ return new ComplexField({
100
+ instruction,
101
+ result: `[${fieldName}]`,
102
+ });
103
+ }
104
+ export function createRefField(bookmarkName, format) {
105
+ let instruction = ` REF ${bookmarkName}`;
106
+ if (format) {
107
+ instruction += ` ${format}`;
108
+ }
109
+ else {
110
+ instruction += ' \\h';
111
+ }
112
+ instruction += ' \\* MERGEFORMAT ';
113
+ return new ComplexField({
114
+ instruction,
115
+ result: `[${bookmarkName}]`,
116
+ });
117
+ }
118
+ export function createIFField(condition, trueContent, falseContent = '') {
119
+ const instruction = ` IF ${condition} "${trueContent}" "${falseContent}" `;
120
+ return new ComplexField({
121
+ instruction,
122
+ result: trueContent,
123
+ });
124
+ }
125
+ export function createNestedField(outerInstruction, nestedFields) {
126
+ const field = new ComplexField({
127
+ instruction: outerInstruction,
128
+ });
129
+ for (const nested of nestedFields) {
130
+ field.addNestedField(nested);
131
+ }
132
+ return field;
133
+ }
134
+ //# sourceMappingURL=FieldHelpers.js.map
@@ -0,0 +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.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"]}
@@ -0,0 +1,158 @@
1
+ export class FontManager {
2
+ fonts = new Map();
3
+ static fontCounter = 1;
4
+ constructor() {
5
+ }
6
+ static create() {
7
+ return new FontManager();
8
+ }
9
+ addFont(fontFamily, data, format = 'ttf') {
10
+ const sanitizedFamily = this.sanitizeFontName(fontFamily);
11
+ const filename = `${sanitizedFamily}_${FontManager.fontCounter++}.${format}`;
12
+ const path = `word/fonts/${filename}`;
13
+ const entry = {
14
+ filename,
15
+ format,
16
+ fontFamily,
17
+ data,
18
+ path,
19
+ };
20
+ this.fonts.set(path, entry);
21
+ return path;
22
+ }
23
+ async addFontFromFile(fontFamily, filePath, format) {
24
+ const fs = require('fs').promises;
25
+ if (!format) {
26
+ const ext = filePath.split('.').pop()?.toLowerCase();
27
+ if (ext === 'ttf' || ext === 'otf' || ext === 'woff' || ext === 'woff2') {
28
+ format = ext;
29
+ }
30
+ else {
31
+ throw new Error(`Unable to detect font format from file: ${filePath}`);
32
+ }
33
+ }
34
+ const data = await fs.readFile(filePath);
35
+ return this.addFont(fontFamily, data, format);
36
+ }
37
+ hasFont(fontFamily) {
38
+ for (const entry of this.fonts.values()) {
39
+ if (entry.fontFamily === fontFamily) {
40
+ return true;
41
+ }
42
+ }
43
+ return false;
44
+ }
45
+ getAllFonts() {
46
+ return Array.from(this.fonts.values());
47
+ }
48
+ getCount() {
49
+ return this.fonts.size;
50
+ }
51
+ static getMimeType(format) {
52
+ const mimeTypes = {
53
+ ttf: 'application/x-font-ttf',
54
+ otf: 'application/x-font-opentype',
55
+ woff: 'application/font-woff',
56
+ woff2: 'font/woff2',
57
+ };
58
+ return mimeTypes[format] || 'application/octet-stream';
59
+ }
60
+ getExtensions() {
61
+ const extensions = new Set();
62
+ for (const entry of this.fonts.values()) {
63
+ extensions.add(entry.format);
64
+ }
65
+ return extensions;
66
+ }
67
+ generateContentTypeEntries() {
68
+ const entries = [];
69
+ const extensions = this.getExtensions();
70
+ for (const ext of extensions) {
71
+ const mimeType = FontManager.getMimeType(ext);
72
+ entries.push(` <Default Extension="${ext}" ContentType="${mimeType}"/>`);
73
+ }
74
+ return entries;
75
+ }
76
+ sanitizeFontName(fontName) {
77
+ return fontName
78
+ .toLowerCase()
79
+ .replace(/\s+/g, '_')
80
+ .replace(/[^a-z0-9_-]/g, '')
81
+ .substring(0, 50);
82
+ }
83
+ clear() {
84
+ this.fonts.clear();
85
+ }
86
+ removeFont(path) {
87
+ return this.fonts.delete(path);
88
+ }
89
+ getFontByPath(path) {
90
+ return this.fonts.get(path);
91
+ }
92
+ getFontByFamily(fontFamily) {
93
+ for (const entry of this.fonts.values()) {
94
+ if (entry.fontFamily === fontFamily) {
95
+ return entry;
96
+ }
97
+ }
98
+ return undefined;
99
+ }
100
+ static parseFontExtensionsFromContentTypes(contentTypesXml) {
101
+ const fontExtensions = [];
102
+ const fontMimeTypes = [
103
+ 'application/x-font-ttf',
104
+ 'application/x-font-opentype',
105
+ 'application/font-woff',
106
+ 'font/woff2',
107
+ ];
108
+ const defaultPattern = /<Default\s+Extension="([^"]+)"\s+ContentType="([^"]+)"/g;
109
+ let match;
110
+ while ((match = defaultPattern.exec(contentTypesXml)) !== null) {
111
+ const extension = match[1];
112
+ const mimeType = match[2];
113
+ if (extension && mimeType && fontMimeTypes.includes(mimeType)) {
114
+ fontExtensions.push(extension);
115
+ }
116
+ }
117
+ return fontExtensions;
118
+ }
119
+ static detectFormatFromExtension(extension) {
120
+ const ext = extension.toLowerCase().replace('.', '');
121
+ if (ext === 'ttf' || ext === 'otf' || ext === 'woff' || ext === 'woff2') {
122
+ return ext;
123
+ }
124
+ return undefined;
125
+ }
126
+ loadFontsFromArchive(zipFiles, contentTypesXml) {
127
+ const registeredExtensions = FontManager.parseFontExtensionsFromContentTypes(contentTypesXml);
128
+ for (const [path, content] of zipFiles.entries()) {
129
+ if (path.startsWith('word/fonts/') && content instanceof Buffer) {
130
+ const filename = path.split('/').pop() || '';
131
+ const extension = filename.split('.').pop()?.toLowerCase();
132
+ if (extension && registeredExtensions.includes(extension)) {
133
+ const format = FontManager.detectFormatFromExtension(extension);
134
+ if (format) {
135
+ const familyName = this.extractFontFamilyFromFilename(filename);
136
+ const entry = {
137
+ filename,
138
+ format,
139
+ fontFamily: familyName,
140
+ data: content,
141
+ path,
142
+ };
143
+ this.fonts.set(path, entry);
144
+ }
145
+ }
146
+ }
147
+ }
148
+ }
149
+ extractFontFamilyFromFilename(filename) {
150
+ const nameWithoutExt = filename.replace(/\.(ttf|otf|woff|woff2)$/i, '');
151
+ const nameWithoutCounter = nameWithoutExt.replace(/_\d+$/, '');
152
+ return nameWithoutCounter
153
+ .split('_')
154
+ .map((word) => word.charAt(0).toUpperCase() + word.slice(1))
155
+ .join(' ');
156
+ }
157
+ }
158
+ //# sourceMappingURL=FontManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FontManager.js","sourceRoot":"","sources":["../../../src/elements/FontManager.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * FontManager - Manages embedded fonts in DOCX documents\n * Handles font registration and Content_Types.xml updates\n */\n\n/**\n * Font format types supported in DOCX\n */\nexport type FontFormat = 'ttf' | 'otf' | 'woff' | 'woff2';\n\n/**\n * Font entry information\n */\nexport interface FontEntry {\n /** Font file name (e.g., 'arial.ttf') */\n filename: string;\n /** Font format */\n format: FontFormat;\n /** Font family name (e.g., 'Arial') */\n fontFamily: string;\n /** Font data (Buffer) */\n data: Buffer;\n /** Path in DOCX archive (e.g., 'word/fonts/arial.ttf') */\n path: string;\n}\n\n/**\n * FontManager handles embedded fonts in documents\n * Ensures fonts are properly registered in [Content_Types].xml\n */\nexport class FontManager {\n private fonts = new Map<string, FontEntry>();\n private static fontCounter = 1;\n\n /**\n * Creates a new FontManager\n */\n constructor() {\n // Empty constructor\n }\n\n /**\n * Factory method to create a new FontManager\n */\n static create(): FontManager {\n return new FontManager();\n }\n\n /**\n * Adds a font to the document\n * @param fontFamily - Font family name (e.g., 'Arial', 'Times New Roman')\n * @param data - Font file data as Buffer\n * @param format - Font format (ttf, otf, woff, woff2)\n * @returns Font path in the archive\n */\n addFont(fontFamily: string, data: Buffer, format: FontFormat = 'ttf'): string {\n // Generate unique filename\n const sanitizedFamily = this.sanitizeFontName(fontFamily);\n const filename = `${sanitizedFamily}_${FontManager.fontCounter++}.${format}`;\n const path = `word/fonts/${filename}`;\n\n // Create font entry\n const entry: FontEntry = {\n filename,\n format,\n fontFamily,\n data,\n path,\n };\n\n // Store with path as key for easy lookup\n this.fonts.set(path, entry);\n\n return path;\n }\n\n /**\n * Adds a font from a file path\n * @param fontFamily - Font family name\n * @param filePath - Path to font file\n * @param format - Font format (optional, detected from extension)\n * @returns Font path in the archive\n */\n async addFontFromFile(\n fontFamily: string,\n filePath: string,\n format?: FontFormat\n ): Promise<string> {\n const fs = require('fs').promises;\n\n // Detect format from extension if not provided\n if (!format) {\n const ext = filePath.split('.').pop()?.toLowerCase();\n if (ext === 'ttf' || ext === 'otf' || ext === 'woff' || ext === 'woff2') {\n format = ext as FontFormat;\n } else {\n throw new Error(`Unable to detect font format from file: ${filePath}`);\n }\n }\n\n // Read font file\n const data = await fs.readFile(filePath);\n\n return this.addFont(fontFamily, data, format);\n }\n\n /**\n * Checks if a font exists\n * @param fontFamily - Font family name\n * @returns True if font is registered\n */\n hasFont(fontFamily: string): boolean {\n for (const entry of this.fonts.values()) {\n if (entry.fontFamily === fontFamily) {\n return true;\n }\n }\n return false;\n }\n\n /**\n * Gets all registered fonts\n * @returns Array of font entries\n */\n getAllFonts(): FontEntry[] {\n return Array.from(this.fonts.values());\n }\n\n /**\n * Gets font count\n * @returns Number of fonts\n */\n getCount(): number {\n return this.fonts.size;\n }\n\n /**\n * Gets MIME type for font format\n * @param format - Font format\n * @returns MIME type string\n */\n static getMimeType(format: FontFormat): string {\n const mimeTypes: Record<FontFormat, string> = {\n ttf: 'application/x-font-ttf',\n otf: 'application/x-font-opentype',\n woff: 'application/font-woff',\n woff2: 'font/woff2',\n };\n\n return mimeTypes[format] || 'application/octet-stream';\n }\n\n /**\n * Gets all unique font extensions\n * @returns Set of extensions (e.g., 'ttf', 'otf')\n */\n getExtensions(): Set<string> {\n const extensions = new Set<string>();\n for (const entry of this.fonts.values()) {\n extensions.add(entry.format);\n }\n return extensions;\n }\n\n /**\n * Generates Content_Types.xml entries for fonts\n * @returns Array of XML strings\n */\n generateContentTypeEntries(): string[] {\n const entries: string[] = [];\n const extensions = this.getExtensions();\n\n // Add Default entries for each extension\n for (const ext of extensions) {\n const mimeType = FontManager.getMimeType(ext as FontFormat);\n entries.push(` <Default Extension=\"${ext}\" ContentType=\"${mimeType}\"/>`);\n }\n\n return entries;\n }\n\n /**\n * Sanitizes font name for use in filename\n * @param fontName - Font family name\n * @returns Sanitized name safe for filename\n */\n private sanitizeFontName(fontName: string): string {\n // Remove spaces and special characters\n return fontName\n .toLowerCase()\n .replace(/\\s+/g, '_')\n .replace(/[^a-z0-9_-]/g, '')\n .substring(0, 50); // Limit length\n }\n\n /**\n * Clears all fonts\n */\n clear(): void {\n this.fonts.clear();\n }\n\n /**\n * Removes a specific font\n * @param path - Font path in archive\n * @returns True if font was removed\n */\n removeFont(path: string): boolean {\n return this.fonts.delete(path);\n }\n\n /**\n * Gets font by path\n * @param path - Font path in archive\n * @returns Font entry or undefined\n */\n getFontByPath(path: string): FontEntry | undefined {\n return this.fonts.get(path);\n }\n\n /**\n * Gets font by family name\n * @param fontFamily - Font family name\n * @returns Font entry or undefined\n */\n getFontByFamily(fontFamily: string): FontEntry | undefined {\n for (const entry of this.fonts.values()) {\n if (entry.fontFamily === fontFamily) {\n return entry;\n }\n }\n return undefined;\n }\n\n /**\n * Parses Content_Types.xml to detect font extensions\n * @param contentTypesXml - Content_Types.xml content\n * @returns Array of font extensions found\n */\n static parseFontExtensionsFromContentTypes(contentTypesXml: string): string[] {\n const fontExtensions: string[] = [];\n const fontMimeTypes = [\n 'application/x-font-ttf',\n 'application/x-font-opentype',\n 'application/font-woff',\n 'font/woff2',\n ];\n\n // Parse XML to find Default elements with font MIME types\n const defaultPattern = /<Default\\s+Extension=\"([^\"]+)\"\\s+ContentType=\"([^\"]+)\"/g;\n let match;\n\n while ((match = defaultPattern.exec(contentTypesXml)) !== null) {\n const extension = match[1];\n const mimeType = match[2];\n\n if (extension && mimeType && fontMimeTypes.includes(mimeType)) {\n fontExtensions.push(extension);\n }\n }\n\n return fontExtensions;\n }\n\n /**\n * Detects font format from extension\n * @param extension - File extension\n * @returns FontFormat or undefined\n */\n static detectFormatFromExtension(extension: string): FontFormat | undefined {\n const ext = extension.toLowerCase().replace('.', '');\n if (ext === 'ttf' || ext === 'otf' || ext === 'woff' || ext === 'woff2') {\n return ext as FontFormat;\n }\n return undefined;\n }\n\n /**\n * Loads fonts from a ZIP archive\n * Reads fonts from word/fonts/ directory and registers them\n * @param zipFiles - Map of file paths to content (from ZipHandler)\n * @param contentTypesXml - Content of [Content_Types].xml\n */\n loadFontsFromArchive(zipFiles: Map<string, Buffer | string>, contentTypesXml: string): void {\n // First, detect which font formats are registered in Content_Types.xml\n const registeredExtensions = FontManager.parseFontExtensionsFromContentTypes(contentTypesXml);\n\n // Then, scan word/fonts/ directory for font files\n for (const [path, content] of zipFiles.entries()) {\n if (path.startsWith('word/fonts/') && content instanceof Buffer) {\n const filename = path.split('/').pop() || '';\n const extension = filename.split('.').pop()?.toLowerCase();\n\n // Check if this extension is registered\n if (extension && registeredExtensions.includes(extension)) {\n const format = FontManager.detectFormatFromExtension(extension);\n\n if (format) {\n // Extract font family from filename (sanitize back)\n const familyName = this.extractFontFamilyFromFilename(filename);\n\n // Create font entry\n const entry: FontEntry = {\n filename,\n format,\n fontFamily: familyName,\n data: content,\n path,\n };\n\n this.fonts.set(path, entry);\n }\n }\n }\n }\n }\n\n /**\n * Extracts font family name from filename\n * @param filename - Font filename\n * @returns Inferred font family name\n */\n private extractFontFamilyFromFilename(filename: string): string {\n // Remove extension\n const nameWithoutExt = filename.replace(/\\.(ttf|otf|woff|woff2)$/i, '');\n\n // Remove counter suffix (e.g., _1, _2)\n const nameWithoutCounter = nameWithoutExt.replace(/_\\d+$/, '');\n\n // Replace underscores with spaces and title case\n return nameWithoutCounter\n .split('_')\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1))\n .join(' ');\n }\n}\n"]}