docxmlater 10.1.3 → 10.1.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (371) hide show
  1. package/README.md +759 -754
  2. package/dist/constants/legacyCompatFlags.js +1 -1
  3. package/dist/constants/legacyCompatFlags.js.map +1 -1
  4. package/dist/constants/limits.js.map +1 -1
  5. package/dist/core/Document.d.ts +50 -50
  6. package/dist/core/Document.d.ts.map +1 -1
  7. package/dist/core/Document.js +483 -471
  8. package/dist/core/Document.js.map +1 -1
  9. package/dist/core/DocumentContent.d.ts +9 -9
  10. package/dist/core/DocumentContent.d.ts.map +1 -1
  11. package/dist/core/DocumentContent.js +1 -1
  12. package/dist/core/DocumentContent.js.map +1 -1
  13. package/dist/core/DocumentGenerator.d.ts +11 -11
  14. package/dist/core/DocumentGenerator.d.ts.map +1 -1
  15. package/dist/core/DocumentGenerator.js +251 -251
  16. package/dist/core/DocumentGenerator.js.map +1 -1
  17. package/dist/core/DocumentIdManager.js.map +1 -1
  18. package/dist/core/DocumentParser.d.ts +15 -15
  19. package/dist/core/DocumentParser.d.ts.map +1 -1
  20. package/dist/core/DocumentParser.js +2123 -2155
  21. package/dist/core/DocumentParser.js.map +1 -1
  22. package/dist/core/DocumentValidator.d.ts.map +1 -1
  23. package/dist/core/DocumentValidator.js +2 -5
  24. package/dist/core/DocumentValidator.js.map +1 -1
  25. package/dist/core/Relationship.js.map +1 -1
  26. package/dist/core/RelationshipManager.d.ts.map +1 -1
  27. package/dist/core/RelationshipManager.js +3 -3
  28. package/dist/core/RelationshipManager.js.map +1 -1
  29. package/dist/elements/AlternateContent.js.map +1 -1
  30. package/dist/elements/Bookmark.d.ts.map +1 -1
  31. package/dist/elements/Bookmark.js +3 -1
  32. package/dist/elements/Bookmark.js.map +1 -1
  33. package/dist/elements/BookmarkManager.d.ts.map +1 -1
  34. package/dist/elements/BookmarkManager.js.map +1 -1
  35. package/dist/elements/Comment.d.ts.map +1 -1
  36. package/dist/elements/Comment.js +9 -6
  37. package/dist/elements/Comment.js.map +1 -1
  38. package/dist/elements/CommentManager.d.ts.map +1 -1
  39. package/dist/elements/CommentManager.js +18 -17
  40. package/dist/elements/CommentManager.js.map +1 -1
  41. package/dist/elements/CommonTypes.d.ts +21 -21
  42. package/dist/elements/CommonTypes.d.ts.map +1 -1
  43. package/dist/elements/CommonTypes.js +56 -56
  44. package/dist/elements/CommonTypes.js.map +1 -1
  45. package/dist/elements/CustomXml.js.map +1 -1
  46. package/dist/elements/Endnote.d.ts.map +1 -1
  47. package/dist/elements/Endnote.js +6 -6
  48. package/dist/elements/Endnote.js.map +1 -1
  49. package/dist/elements/EndnoteManager.d.ts.map +1 -1
  50. package/dist/elements/EndnoteManager.js +6 -7
  51. package/dist/elements/EndnoteManager.js.map +1 -1
  52. package/dist/elements/Field.d.ts.map +1 -1
  53. package/dist/elements/Field.js +82 -25
  54. package/dist/elements/Field.js.map +1 -1
  55. package/dist/elements/FieldHelpers.d.ts.map +1 -1
  56. package/dist/elements/FieldHelpers.js.map +1 -1
  57. package/dist/elements/FontManager.d.ts.map +1 -1
  58. package/dist/elements/FontManager.js +1 -1
  59. package/dist/elements/FontManager.js.map +1 -1
  60. package/dist/elements/Footer.js +2 -2
  61. package/dist/elements/Footer.js.map +1 -1
  62. package/dist/elements/Footnote.d.ts.map +1 -1
  63. package/dist/elements/Footnote.js +6 -6
  64. package/dist/elements/Footnote.js.map +1 -1
  65. package/dist/elements/FootnoteManager.d.ts.map +1 -1
  66. package/dist/elements/FootnoteManager.js +6 -7
  67. package/dist/elements/FootnoteManager.js.map +1 -1
  68. package/dist/elements/Header.js +2 -2
  69. package/dist/elements/Header.js.map +1 -1
  70. package/dist/elements/HeaderFooterManager.js.map +1 -1
  71. package/dist/elements/Hyperlink.d.ts +5 -3
  72. package/dist/elements/Hyperlink.d.ts.map +1 -1
  73. package/dist/elements/Hyperlink.js +134 -76
  74. package/dist/elements/Hyperlink.js.map +1 -1
  75. package/dist/elements/Image.d.ts.map +1 -1
  76. package/dist/elements/Image.js +238 -106
  77. package/dist/elements/Image.js.map +1 -1
  78. package/dist/elements/ImageManager.d.ts.map +1 -1
  79. package/dist/elements/ImageManager.js +1 -1
  80. package/dist/elements/ImageManager.js.map +1 -1
  81. package/dist/elements/ImageRun.js +1 -1
  82. package/dist/elements/ImageRun.js.map +1 -1
  83. package/dist/elements/MathElement.js.map +1 -1
  84. package/dist/elements/Paragraph.d.ts +24 -24
  85. package/dist/elements/Paragraph.d.ts.map +1 -1
  86. package/dist/elements/Paragraph.js +181 -188
  87. package/dist/elements/Paragraph.js.map +1 -1
  88. package/dist/elements/PreservedElement.js.map +1 -1
  89. package/dist/elements/PropertyChangeTypes.d.ts.map +1 -1
  90. package/dist/elements/PropertyChangeTypes.js +6 -6
  91. package/dist/elements/PropertyChangeTypes.js.map +1 -1
  92. package/dist/elements/RangeMarker.d.ts.map +1 -1
  93. package/dist/elements/RangeMarker.js.map +1 -1
  94. package/dist/elements/Revision.d.ts.map +1 -1
  95. package/dist/elements/Revision.js +4 -5
  96. package/dist/elements/Revision.js.map +1 -1
  97. package/dist/elements/RevisionContent.js.map +1 -1
  98. package/dist/elements/RevisionManager.d.ts.map +1 -1
  99. package/dist/elements/RevisionManager.js +40 -48
  100. package/dist/elements/RevisionManager.js.map +1 -1
  101. package/dist/elements/Run.d.ts +16 -16
  102. package/dist/elements/Run.d.ts.map +1 -1
  103. package/dist/elements/Run.js +256 -238
  104. package/dist/elements/Run.js.map +1 -1
  105. package/dist/elements/Section.d.ts.map +1 -1
  106. package/dist/elements/Section.js +36 -11
  107. package/dist/elements/Section.js.map +1 -1
  108. package/dist/elements/Shape.d.ts.map +1 -1
  109. package/dist/elements/Shape.js.map +1 -1
  110. package/dist/elements/StructuredDocumentTag.d.ts +6 -6
  111. package/dist/elements/StructuredDocumentTag.d.ts.map +1 -1
  112. package/dist/elements/StructuredDocumentTag.js +99 -104
  113. package/dist/elements/StructuredDocumentTag.js.map +1 -1
  114. package/dist/elements/Table.d.ts +11 -11
  115. package/dist/elements/Table.d.ts.map +1 -1
  116. package/dist/elements/Table.js +102 -107
  117. package/dist/elements/Table.js.map +1 -1
  118. package/dist/elements/TableCell.d.ts +10 -10
  119. package/dist/elements/TableCell.d.ts.map +1 -1
  120. package/dist/elements/TableCell.js +105 -106
  121. package/dist/elements/TableCell.js.map +1 -1
  122. package/dist/elements/TableGridChange.d.ts.map +1 -1
  123. package/dist/elements/TableGridChange.js.map +1 -1
  124. package/dist/elements/TableOfContents.d.ts.map +1 -1
  125. package/dist/elements/TableOfContents.js +4 -4
  126. package/dist/elements/TableOfContents.js.map +1 -1
  127. package/dist/elements/TableOfContentsElement.js.map +1 -1
  128. package/dist/elements/TableRow.d.ts.map +1 -1
  129. package/dist/elements/TableRow.js +13 -6
  130. package/dist/elements/TableRow.js.map +1 -1
  131. package/dist/elements/TextBox.d.ts.map +1 -1
  132. package/dist/elements/TextBox.js +3 -5
  133. package/dist/elements/TextBox.js.map +1 -1
  134. package/dist/formatting/AbstractNumbering.d.ts +4 -4
  135. package/dist/formatting/AbstractNumbering.d.ts.map +1 -1
  136. package/dist/formatting/AbstractNumbering.js +54 -49
  137. package/dist/formatting/AbstractNumbering.js.map +1 -1
  138. package/dist/formatting/NumberingInstance.d.ts.map +1 -1
  139. package/dist/formatting/NumberingInstance.js +1 -3
  140. package/dist/formatting/NumberingInstance.js.map +1 -1
  141. package/dist/formatting/NumberingLevel.d.ts +5 -5
  142. package/dist/formatting/NumberingLevel.d.ts.map +1 -1
  143. package/dist/formatting/NumberingLevel.js +119 -125
  144. package/dist/formatting/NumberingLevel.js.map +1 -1
  145. package/dist/formatting/NumberingManager.d.ts.map +1 -1
  146. package/dist/formatting/NumberingManager.js +9 -9
  147. package/dist/formatting/NumberingManager.js.map +1 -1
  148. package/dist/formatting/Style.d.ts +11 -11
  149. package/dist/formatting/Style.d.ts.map +1 -1
  150. package/dist/formatting/Style.js +219 -247
  151. package/dist/formatting/Style.js.map +1 -1
  152. package/dist/formatting/StylesManager.d.ts +2 -2
  153. package/dist/formatting/StylesManager.d.ts.map +1 -1
  154. package/dist/formatting/StylesManager.js +96 -102
  155. package/dist/formatting/StylesManager.js.map +1 -1
  156. package/dist/helpers/CleanupHelper.d.ts +1 -1
  157. package/dist/helpers/CleanupHelper.d.ts.map +1 -1
  158. package/dist/helpers/CleanupHelper.js +6 -6
  159. package/dist/helpers/CleanupHelper.js.map +1 -1
  160. package/dist/images/ImageOptimizer.js +7 -7
  161. package/dist/images/ImageOptimizer.js.map +1 -1
  162. package/dist/index.d.ts +9 -9
  163. package/dist/index.d.ts.map +1 -1
  164. package/dist/index.js.map +1 -1
  165. package/dist/managers/DrawingManager.js.map +1 -1
  166. package/dist/tracking/DocumentTrackingContext.d.ts.map +1 -1
  167. package/dist/tracking/DocumentTrackingContext.js +23 -7
  168. package/dist/tracking/DocumentTrackingContext.js.map +1 -1
  169. package/dist/tracking/TrackingContext.d.ts.map +1 -1
  170. package/dist/tracking/TrackingContext.js.map +1 -1
  171. package/dist/types/compatibility-types.js.map +1 -1
  172. package/dist/types/formatting.js.map +1 -1
  173. package/dist/types/list-types.d.ts +6 -6
  174. package/dist/types/list-types.js.map +1 -1
  175. package/dist/types/settings-types.js.map +1 -1
  176. package/dist/types/styleConfig.d.ts +2 -2
  177. package/dist/types/styleConfig.js.map +1 -1
  178. package/dist/utils/ChangelogGenerator.d.ts.map +1 -1
  179. package/dist/utils/ChangelogGenerator.js +97 -101
  180. package/dist/utils/ChangelogGenerator.js.map +1 -1
  181. package/dist/utils/CompatibilityUpgrader.d.ts.map +1 -1
  182. package/dist/utils/CompatibilityUpgrader.js +1 -1
  183. package/dist/utils/CompatibilityUpgrader.js.map +1 -1
  184. package/dist/utils/InMemoryRevisionAcceptor.d.ts.map +1 -1
  185. package/dist/utils/InMemoryRevisionAcceptor.js +1 -6
  186. package/dist/utils/InMemoryRevisionAcceptor.js.map +1 -1
  187. package/dist/utils/MoveOperationHelper.d.ts.map +1 -1
  188. package/dist/utils/MoveOperationHelper.js +1 -1
  189. package/dist/utils/MoveOperationHelper.js.map +1 -1
  190. package/dist/utils/RevisionAwareProcessor.d.ts.map +1 -1
  191. package/dist/utils/RevisionAwareProcessor.js +2 -4
  192. package/dist/utils/RevisionAwareProcessor.js.map +1 -1
  193. package/dist/utils/RevisionWalker.d.ts.map +1 -1
  194. package/dist/utils/RevisionWalker.js +4 -12
  195. package/dist/utils/RevisionWalker.js.map +1 -1
  196. package/dist/utils/SelectiveRevisionAcceptor.d.ts.map +1 -1
  197. package/dist/utils/SelectiveRevisionAcceptor.js +2 -6
  198. package/dist/utils/SelectiveRevisionAcceptor.js.map +1 -1
  199. package/dist/utils/ShadingResolver.d.ts.map +1 -1
  200. package/dist/utils/ShadingResolver.js +1 -1
  201. package/dist/utils/ShadingResolver.js.map +1 -1
  202. package/dist/utils/acceptRevisions.d.ts.map +1 -1
  203. package/dist/utils/acceptRevisions.js +23 -12
  204. package/dist/utils/acceptRevisions.js.map +1 -1
  205. package/dist/utils/cnfStyleDecoder.d.ts +1 -1
  206. package/dist/utils/cnfStyleDecoder.d.ts.map +1 -1
  207. package/dist/utils/cnfStyleDecoder.js +40 -40
  208. package/dist/utils/cnfStyleDecoder.js.map +1 -1
  209. package/dist/utils/corruptionDetection.d.ts.map +1 -1
  210. package/dist/utils/corruptionDetection.js.map +1 -1
  211. package/dist/utils/dateFormatting.js.map +1 -1
  212. package/dist/utils/deepClone.js +1 -1
  213. package/dist/utils/deepClone.js.map +1 -1
  214. package/dist/utils/diagnostics.d.ts.map +1 -1
  215. package/dist/utils/diagnostics.js +1 -1
  216. package/dist/utils/diagnostics.js.map +1 -1
  217. package/dist/utils/errorHandling.js.map +1 -1
  218. package/dist/utils/formatting.d.ts.map +1 -1
  219. package/dist/utils/formatting.js +10 -2
  220. package/dist/utils/formatting.js.map +1 -1
  221. package/dist/utils/list-detection.d.ts +2 -2
  222. package/dist/utils/list-detection.d.ts.map +1 -1
  223. package/dist/utils/list-detection.js +21 -23
  224. package/dist/utils/list-detection.js.map +1 -1
  225. package/dist/utils/logger.d.ts.map +1 -1
  226. package/dist/utils/logger.js +12 -7
  227. package/dist/utils/logger.js.map +1 -1
  228. package/dist/utils/parsingHelpers.js.map +1 -1
  229. package/dist/utils/stripTrackedChanges.d.ts.map +1 -1
  230. package/dist/utils/stripTrackedChanges.js +3 -3
  231. package/dist/utils/stripTrackedChanges.js.map +1 -1
  232. package/dist/utils/textDiff.d.ts +1 -1
  233. package/dist/utils/textDiff.js +8 -8
  234. package/dist/utils/textDiff.js.map +1 -1
  235. package/dist/utils/units.js.map +1 -1
  236. package/dist/utils/validation.d.ts.map +1 -1
  237. package/dist/utils/validation.js +24 -7
  238. package/dist/utils/validation.js.map +1 -1
  239. package/dist/utils/xmlSanitization.d.ts.map +1 -1
  240. package/dist/utils/xmlSanitization.js +3 -3
  241. package/dist/utils/xmlSanitization.js.map +1 -1
  242. package/dist/validation/RevisionAutoFixer.d.ts.map +1 -1
  243. package/dist/validation/RevisionAutoFixer.js +5 -5
  244. package/dist/validation/RevisionAutoFixer.js.map +1 -1
  245. package/dist/validation/RevisionValidator.d.ts.map +1 -1
  246. package/dist/validation/RevisionValidator.js +7 -9
  247. package/dist/validation/RevisionValidator.js.map +1 -1
  248. package/dist/validation/ValidationRules.js +3 -3
  249. package/dist/validation/ValidationRules.js.map +1 -1
  250. package/dist/validation/index.js.map +1 -1
  251. package/dist/xml/XMLBuilder.d.ts +1 -1
  252. package/dist/xml/XMLBuilder.d.ts.map +1 -1
  253. package/dist/xml/XMLBuilder.js +98 -100
  254. package/dist/xml/XMLBuilder.js.map +1 -1
  255. package/dist/xml/XMLParser.d.ts.map +1 -1
  256. package/dist/xml/XMLParser.js +61 -66
  257. package/dist/xml/XMLParser.js.map +1 -1
  258. package/dist/zip/ZipHandler.d.ts.map +1 -1
  259. package/dist/zip/ZipHandler.js.map +1 -1
  260. package/dist/zip/ZipReader.d.ts.map +1 -1
  261. package/dist/zip/ZipReader.js +1 -3
  262. package/dist/zip/ZipReader.js.map +1 -1
  263. package/dist/zip/ZipWriter.d.ts +1 -1
  264. package/dist/zip/ZipWriter.d.ts.map +1 -1
  265. package/dist/zip/ZipWriter.js +28 -36
  266. package/dist/zip/ZipWriter.js.map +1 -1
  267. package/dist/zip/types.js +1 -1
  268. package/dist/zip/types.js.map +1 -1
  269. package/package.json +92 -92
  270. package/src/__tests__/helper-methods.test.ts +512 -512
  271. package/src/constants/legacyCompatFlags.ts +138 -138
  272. package/src/constants/limits.ts +50 -50
  273. package/src/core/Document.ts +985 -1145
  274. package/src/core/DocumentContent.ts +461 -467
  275. package/src/core/DocumentGenerator.ts +1133 -1104
  276. package/src/core/DocumentIdManager.ts +158 -158
  277. package/src/core/DocumentParser.ts +2347 -2716
  278. package/src/core/DocumentValidator.ts +363 -372
  279. package/src/core/Relationship.ts +367 -367
  280. package/src/core/RelationshipManager.ts +429 -428
  281. package/src/elements/AlternateContent.ts +42 -42
  282. package/src/elements/Bookmark.ts +212 -210
  283. package/src/elements/BookmarkManager.ts +247 -250
  284. package/src/elements/Comment.ts +356 -359
  285. package/src/elements/CommentManager.ts +499 -502
  286. package/src/elements/CommonTypes.ts +524 -549
  287. package/src/elements/CustomXml.ts +36 -36
  288. package/src/elements/Endnote.ts +221 -217
  289. package/src/elements/EndnoteManager.ts +246 -249
  290. package/src/elements/Field.ts +1292 -1233
  291. package/src/elements/FieldHelpers.ts +329 -333
  292. package/src/elements/FontManager.ts +336 -339
  293. package/src/elements/Footer.ts +269 -269
  294. package/src/elements/Footnote.ts +221 -217
  295. package/src/elements/FootnoteManager.ts +246 -249
  296. package/src/elements/Header.ts +269 -269
  297. package/src/elements/HeaderFooterManager.ts +219 -219
  298. package/src/elements/Hyperlink.ts +1288 -1193
  299. package/src/elements/Image.ts +1982 -1756
  300. package/src/elements/ImageManager.ts +437 -432
  301. package/src/elements/ImageRun.ts +59 -59
  302. package/src/elements/MathElement.ts +65 -65
  303. package/src/elements/Paragraph.ts +4347 -4287
  304. package/src/elements/PreservedElement.ts +53 -53
  305. package/src/elements/PropertyChangeTypes.ts +458 -442
  306. package/src/elements/RangeMarker.ts +382 -400
  307. package/src/elements/Revision.ts +1198 -1217
  308. package/src/elements/RevisionContent.ts +73 -73
  309. package/src/elements/RevisionManager.ts +1070 -1070
  310. package/src/elements/Run.ts +3103 -3073
  311. package/src/elements/Section.ts +1521 -1421
  312. package/src/elements/Shape.ts +884 -873
  313. package/src/elements/StructuredDocumentTag.ts +1176 -1207
  314. package/src/elements/Table.ts +2468 -2524
  315. package/src/elements/TableCell.ts +1617 -1621
  316. package/src/elements/TableGridChange.ts +149 -151
  317. package/src/elements/TableOfContents.ts +701 -691
  318. package/src/elements/TableOfContentsElement.ts +89 -89
  319. package/src/elements/TableRow.ts +960 -929
  320. package/src/elements/TextBox.ts +766 -768
  321. package/src/formatting/AbstractNumbering.ts +580 -579
  322. package/src/formatting/NumberingInstance.ts +295 -299
  323. package/src/formatting/NumberingLevel.ts +981 -1040
  324. package/src/formatting/NumberingManager.ts +833 -827
  325. package/src/formatting/Style.ts +1785 -1879
  326. package/src/formatting/StylesManager.ts +1090 -1130
  327. package/src/helpers/CleanupHelper.ts +524 -524
  328. package/src/images/ImageOptimizer.ts +274 -274
  329. package/src/index.ts +559 -554
  330. package/src/managers/DrawingManager.ts +319 -319
  331. package/src/tracking/DocumentTrackingContext.ts +687 -674
  332. package/src/tracking/TrackingContext.ts +175 -173
  333. package/src/types/compatibility-types.ts +49 -49
  334. package/src/types/formatting.ts +210 -210
  335. package/src/types/list-types.ts +14 -14
  336. package/src/types/settings-types.ts +59 -59
  337. package/src/types/styleConfig.ts +189 -189
  338. package/src/utils/ChangelogGenerator.ts +1583 -1581
  339. package/src/utils/CompatibilityUpgrader.ts +235 -237
  340. package/src/utils/InMemoryRevisionAcceptor.ts +691 -696
  341. package/src/utils/MoveOperationHelper.ts +233 -238
  342. package/src/utils/RevisionAwareProcessor.ts +518 -526
  343. package/src/utils/RevisionWalker.ts +427 -457
  344. package/src/utils/SelectiveRevisionAcceptor.ts +662 -683
  345. package/src/utils/ShadingResolver.ts +105 -107
  346. package/src/utils/acceptRevisions.ts +723 -714
  347. package/src/utils/cnfStyleDecoder.ts +212 -217
  348. package/src/utils/corruptionDetection.ts +346 -345
  349. package/src/utils/dateFormatting.ts +20 -20
  350. package/src/utils/deepClone.ts +77 -78
  351. package/src/utils/diagnostics.ts +125 -129
  352. package/src/utils/errorHandling.ts +80 -80
  353. package/src/utils/formatting.ts +220 -213
  354. package/src/utils/list-detection.ts +32 -42
  355. package/src/utils/logger.ts +412 -404
  356. package/src/utils/parsingHelpers.ts +190 -190
  357. package/src/utils/stripTrackedChanges.ts +356 -353
  358. package/src/utils/textDiff.ts +100 -100
  359. package/src/utils/units.ts +421 -421
  360. package/src/utils/validation.ts +553 -542
  361. package/src/utils/xmlSanitization.ts +179 -182
  362. package/src/validation/RevisionAutoFixer.ts +541 -542
  363. package/src/validation/RevisionValidator.ts +470 -460
  364. package/src/validation/ValidationRules.ts +338 -338
  365. package/src/validation/index.ts +30 -30
  366. package/src/xml/XMLBuilder.ts +857 -871
  367. package/src/xml/XMLParser.ts +877 -919
  368. package/src/zip/ZipHandler.ts +629 -637
  369. package/src/zip/ZipReader.ts +295 -299
  370. package/src/zip/ZipWriter.ts +374 -390
  371. package/src/zip/types.ts +116 -116
@@ -1,467 +1,461 @@
1
- /**
2
- * DocumentContent - Manages document body elements
3
- *
4
- * Handles paragraphs, tables, sections, and other body elements.
5
- * Extracted from Document.ts for better separation of concerns.
6
- */
7
-
8
- import { Paragraph } from "../elements/Paragraph";
9
- import { Table } from "../elements/Table";
10
- import { Section } from "../elements/Section";
11
- import { StructuredDocumentTag } from "../elements/StructuredDocumentTag";
12
- import { TableOfContentsElement } from "../elements/TableOfContentsElement";
13
- import { AlternateContent } from "../elements/AlternateContent";
14
- import { MathParagraph } from "../elements/MathElement";
15
- import { CustomXmlBlock } from "../elements/CustomXml";
16
- import { PreservedElement } from "../elements/PreservedElement";
17
-
18
- /**
19
- * Body element type - can be a Paragraph, Table, TOC, SDT, or raw XML preservation element
20
- */
21
- export type BodyElement =
22
- | Paragraph
23
- | Table
24
- | TableOfContentsElement
25
- | StructuredDocumentTag
26
- | AlternateContent
27
- | MathParagraph
28
- | CustomXmlBlock
29
- | PreservedElement;
30
-
31
- /**
32
- * Manages document content (paragraphs, tables, sections)
33
- */
34
- export class DocumentContent {
35
- private bodyElements: BodyElement[] = [];
36
- private section: Section;
37
-
38
- constructor() {
39
- this.section = new Section();
40
- }
41
-
42
- // ==================== Body Elements ====================
43
-
44
- /**
45
- * Adds an existing paragraph to the document body
46
- *
47
- * @param paragraph - The Paragraph instance to add
48
- * @returns This instance for chaining
49
- */
50
- addParagraph(paragraph: Paragraph): this {
51
- this.bodyElements.push(paragraph);
52
- return this;
53
- }
54
-
55
- /**
56
- * Creates a new paragraph and adds it to the document
57
- *
58
- * @param text - Optional text content for the paragraph
59
- * @returns The created Paragraph instance
60
- */
61
- createParagraph(text?: string): Paragraph {
62
- const para = new Paragraph();
63
- if (text) {
64
- para.addText(text);
65
- }
66
- this.bodyElements.push(para);
67
- return para;
68
- }
69
-
70
- /**
71
- * Adds an existing table to the document body
72
- *
73
- * @param table - The Table instance to add
74
- * @returns This instance for chaining
75
- */
76
- addTable(table: Table): this {
77
- this.bodyElements.push(table);
78
- return this;
79
- }
80
-
81
- /**
82
- * Creates a new table and adds it to the document
83
- *
84
- * @param rows - Number of rows to create
85
- * @param columns - Number of columns per row
86
- * @returns The created Table instance
87
- */
88
- createTable(rows: number, columns: number): Table {
89
- const table = new Table(rows, columns);
90
- this.bodyElements.push(table);
91
- return table;
92
- }
93
-
94
- /**
95
- * Adds a Structured Document Tag to the document body
96
- *
97
- * @param sdt - The StructuredDocumentTag instance to add
98
- * @returns This instance for chaining
99
- */
100
- addStructuredDocumentTag(sdt: StructuredDocumentTag): this {
101
- this.bodyElements.push(sdt);
102
- return this;
103
- }
104
-
105
- /**
106
- * Adds a Table of Contents element to the document body
107
- *
108
- * @param toc - The TableOfContentsElement to add
109
- * @returns This instance for chaining
110
- */
111
- addTableOfContents(toc: TableOfContentsElement): this {
112
- this.bodyElements.push(toc);
113
- return this;
114
- }
115
-
116
- /**
117
- * Adds any body element to the document
118
- *
119
- * @param element - The body element to add
120
- * @returns This instance for chaining
121
- */
122
- addBodyElement(element: BodyElement): this {
123
- this.bodyElements.push(element);
124
- return this;
125
- }
126
-
127
- /**
128
- * Inserts a body element at a specific index
129
- *
130
- * @param index - Position to insert at (0-based)
131
- * @param element - The body element to insert
132
- * @returns This instance for chaining
133
- */
134
- insertBodyElementAt(index: number, element: BodyElement): this {
135
- index = Math.max(0, Math.min(index, this.bodyElements.length));
136
- this.bodyElements.splice(index, 0, element);
137
- return this;
138
- }
139
-
140
- /**
141
- * Removes a body element at a specific index
142
- *
143
- * @param index - Position to remove from (0-based)
144
- * @returns The removed element or undefined
145
- */
146
- removeBodyElementAt(index: number): BodyElement | undefined {
147
- if (index < 0 || index >= this.bodyElements.length) {
148
- return undefined;
149
- }
150
- return this.bodyElements.splice(index, 1)[0];
151
- }
152
-
153
- // ==================== Getters ====================
154
-
155
- /**
156
- * Gets all body elements
157
- *
158
- * @returns Array of all body elements
159
- */
160
- getBodyElements(): BodyElement[] {
161
- return [...this.bodyElements];
162
- }
163
-
164
- /**
165
- * Gets body elements with mutable access (internal use)
166
- *
167
- * @returns Reference to body elements array
168
- * @internal
169
- */
170
- getBodyElementsMutable(): BodyElement[] {
171
- return this.bodyElements;
172
- }
173
-
174
- /**
175
- * Gets top-level paragraphs only
176
- *
177
- * @returns Array of Paragraph instances in document body
178
- */
179
- getParagraphs(): Paragraph[] {
180
- return this.bodyElements.filter(
181
- (el): el is Paragraph => el instanceof Paragraph
182
- );
183
- }
184
-
185
- /**
186
- * Gets all paragraphs including nested ones (in tables, SDTs)
187
- *
188
- * @returns Array of all Paragraph instances
189
- */
190
- getAllParagraphs(): Paragraph[] {
191
- const paragraphs: Paragraph[] = [];
192
-
193
- const collectParagraphs = (elements: BodyElement[]) => {
194
- for (const element of elements) {
195
- if (element instanceof Paragraph) {
196
- paragraphs.push(element);
197
- } else if (element instanceof Table) {
198
- // Collect paragraphs from table cells
199
- for (let row = 0; row < element.getRowCount(); row++) {
200
- for (let col = 0; col < element.getColumnCount(); col++) {
201
- const cell = element.getCell(row, col);
202
- if (cell) {
203
- paragraphs.push(...cell.getParagraphs());
204
- }
205
- }
206
- }
207
- } else if (element instanceof StructuredDocumentTag) {
208
- // Recursively collect from SDT content
209
- const content = element.getContent();
210
- collectParagraphs(content as BodyElement[]);
211
- }
212
- }
213
- };
214
-
215
- collectParagraphs(this.bodyElements);
216
- return paragraphs;
217
- }
218
-
219
- /**
220
- * Gets top-level tables only
221
- *
222
- * @returns Array of Table instances in document body
223
- */
224
- getTables(): Table[] {
225
- return this.bodyElements.filter((el): el is Table => el instanceof Table);
226
- }
227
-
228
- /**
229
- * Gets all tables including nested ones
230
- *
231
- * @returns Array of all Table instances
232
- */
233
- getAllTables(): Table[] {
234
- const tables: Table[] = [];
235
-
236
- const collectTables = (elements: BodyElement[]) => {
237
- for (const element of elements) {
238
- if (element instanceof Table) {
239
- tables.push(element);
240
- // Check for nested tables in cells
241
- for (let row = 0; row < element.getRowCount(); row++) {
242
- for (let col = 0; col < element.getColumnCount(); col++) {
243
- const cell = element.getCell(row, col);
244
- if (cell) {
245
- // Tables can be nested in cell content
246
- const cellContent = cell.getParagraphs();
247
- // Note: Cells typically contain paragraphs, not tables directly
248
- }
249
- }
250
- }
251
- } else if (element instanceof StructuredDocumentTag) {
252
- collectTables(element.getContent() as BodyElement[]);
253
- }
254
- }
255
- };
256
-
257
- collectTables(this.bodyElements);
258
- return tables;
259
- }
260
-
261
- /**
262
- * Gets Table of Contents elements
263
- *
264
- * @returns Array of TableOfContentsElement instances
265
- */
266
- getTableOfContentsElements(): TableOfContentsElement[] {
267
- return this.bodyElements.filter(
268
- (el): el is TableOfContentsElement => el instanceof TableOfContentsElement
269
- );
270
- }
271
-
272
- /**
273
- * Gets Structured Document Tags
274
- *
275
- * @returns Array of StructuredDocumentTag instances
276
- */
277
- getStructuredDocumentTags(): StructuredDocumentTag[] {
278
- return this.bodyElements.filter(
279
- (el): el is StructuredDocumentTag => el instanceof StructuredDocumentTag
280
- );
281
- }
282
-
283
- // ==================== Counts ====================
284
-
285
- /**
286
- * Gets the total number of body elements
287
- */
288
- getBodyElementCount(): number {
289
- return this.bodyElements.length;
290
- }
291
-
292
- /**
293
- * Gets the number of top-level paragraphs
294
- */
295
- getParagraphCount(): number {
296
- return this.getParagraphs().length;
297
- }
298
-
299
- /**
300
- * Gets the number of top-level tables
301
- */
302
- getTableCount(): number {
303
- return this.getTables().length;
304
- }
305
-
306
- // ==================== Section ====================
307
-
308
- /**
309
- * Gets the document section (page setup, margins, etc.)
310
- *
311
- * @returns The Section instance
312
- */
313
- getSection(): Section {
314
- return this.section;
315
- }
316
-
317
- /**
318
- * Sets the document section
319
- *
320
- * @param section - The Section instance to set
321
- * @returns This instance for chaining
322
- */
323
- setSection(section: Section): this {
324
- this.section = section;
325
- return this;
326
- }
327
-
328
- // ==================== Clearing ====================
329
-
330
- /**
331
- * Clears all body elements
332
- *
333
- * @returns This instance for chaining
334
- */
335
- clear(): this {
336
- this.bodyElements = [];
337
- return this;
338
- }
339
-
340
- /**
341
- * Clears all paragraphs from the document
342
- *
343
- * @returns This instance for chaining
344
- */
345
- clearParagraphs(): this {
346
- this.bodyElements = this.bodyElements.filter(
347
- (el) => !(el instanceof Paragraph)
348
- );
349
- return this;
350
- }
351
-
352
- /**
353
- * Clears all tables from the document
354
- *
355
- * @returns This instance for chaining
356
- */
357
- clearTables(): this {
358
- this.bodyElements = this.bodyElements.filter(
359
- (el) => !(el instanceof Table)
360
- );
361
- return this;
362
- }
363
-
364
- // ==================== Search ====================
365
-
366
- /**
367
- * Finds the index of a body element
368
- *
369
- * @param element - The element to find
370
- * @returns Index or -1 if not found
371
- */
372
- indexOf(element: BodyElement): number {
373
- return this.bodyElements.indexOf(element);
374
- }
375
-
376
- /**
377
- * Checks if a body element exists
378
- *
379
- * @param element - The element to check
380
- * @returns true if the element is in the document
381
- */
382
- contains(element: BodyElement): boolean {
383
- return this.bodyElements.includes(element);
384
- }
385
-
386
- /**
387
- * Finds paragraphs by style ID
388
- *
389
- * @param styleId - The style ID to search for
390
- * @returns Array of paragraphs with the style
391
- */
392
- findParagraphsByStyle(styleId: string): Paragraph[] {
393
- const results: Paragraph[] = [];
394
- const normalizedStyleId = styleId.toLowerCase();
395
-
396
- for (const paragraph of this.getAllParagraphs()) {
397
- const paraStyle = paragraph.getStyle()?.toLowerCase();
398
- if (paraStyle === normalizedStyleId) {
399
- results.push(paragraph);
400
- }
401
- }
402
-
403
- return results;
404
- }
405
-
406
- // ==================== Statistics ====================
407
-
408
- /**
409
- * Gets word count for all text content
410
- *
411
- * @returns Approximate word count
412
- */
413
- getWordCount(): number {
414
- let wordCount = 0;
415
- for (const paragraph of this.getAllParagraphs()) {
416
- const text = paragraph.getText();
417
- if (text) {
418
- // Simple word counting - split on whitespace
419
- wordCount += text.split(/\s+/).filter((word) => word.length > 0).length;
420
- }
421
- }
422
- return wordCount;
423
- }
424
-
425
- /**
426
- * Gets character count for all text content
427
- *
428
- * @param includeSpaces - Whether to include spaces (default: true)
429
- * @returns Character count
430
- */
431
- getCharacterCount(includeSpaces = true): number {
432
- let charCount = 0;
433
- for (const paragraph of this.getAllParagraphs()) {
434
- const text = paragraph.getText();
435
- if (text) {
436
- charCount += includeSpaces ? text.length : text.replace(/\s/g, "").length;
437
- }
438
- }
439
- return charCount;
440
- }
441
-
442
- // ==================== Utility ====================
443
-
444
- /**
445
- * Creates a clone of this content instance
446
- *
447
- * Note: This creates shallow copies of body elements.
448
- * For deep cloning, individual elements should be cloned.
449
- *
450
- * @returns New DocumentContent instance
451
- */
452
- clone(): DocumentContent {
453
- const cloned = new DocumentContent();
454
- cloned.bodyElements = [...this.bodyElements];
455
- cloned.section = this.section?.clone();
456
- return cloned;
457
- }
458
-
459
- /**
460
- * Checks if the document has any content
461
- *
462
- * @returns true if document has no body elements
463
- */
464
- isEmpty(): boolean {
465
- return this.bodyElements.length === 0;
466
- }
467
- }
1
+ /**
2
+ * DocumentContent - Manages document body elements
3
+ *
4
+ * Handles paragraphs, tables, sections, and other body elements.
5
+ * Extracted from Document.ts for better separation of concerns.
6
+ */
7
+
8
+ import { Paragraph } from '../elements/Paragraph';
9
+ import { Table } from '../elements/Table';
10
+ import { Section } from '../elements/Section';
11
+ import { StructuredDocumentTag } from '../elements/StructuredDocumentTag';
12
+ import { TableOfContentsElement } from '../elements/TableOfContentsElement';
13
+ import { AlternateContent } from '../elements/AlternateContent';
14
+ import { MathParagraph } from '../elements/MathElement';
15
+ import { CustomXmlBlock } from '../elements/CustomXml';
16
+ import { PreservedElement } from '../elements/PreservedElement';
17
+
18
+ /**
19
+ * Body element type - can be a Paragraph, Table, TOC, SDT, or raw XML preservation element
20
+ */
21
+ export type BodyElement =
22
+ | Paragraph
23
+ | Table
24
+ | TableOfContentsElement
25
+ | StructuredDocumentTag
26
+ | AlternateContent
27
+ | MathParagraph
28
+ | CustomXmlBlock
29
+ | PreservedElement;
30
+
31
+ /**
32
+ * Manages document content (paragraphs, tables, sections)
33
+ */
34
+ export class DocumentContent {
35
+ private bodyElements: BodyElement[] = [];
36
+ private section: Section;
37
+
38
+ constructor() {
39
+ this.section = new Section();
40
+ }
41
+
42
+ // ==================== Body Elements ====================
43
+
44
+ /**
45
+ * Adds an existing paragraph to the document body
46
+ *
47
+ * @param paragraph - The Paragraph instance to add
48
+ * @returns This instance for chaining
49
+ */
50
+ addParagraph(paragraph: Paragraph): this {
51
+ this.bodyElements.push(paragraph);
52
+ return this;
53
+ }
54
+
55
+ /**
56
+ * Creates a new paragraph and adds it to the document
57
+ *
58
+ * @param text - Optional text content for the paragraph
59
+ * @returns The created Paragraph instance
60
+ */
61
+ createParagraph(text?: string): Paragraph {
62
+ const para = new Paragraph();
63
+ if (text) {
64
+ para.addText(text);
65
+ }
66
+ this.bodyElements.push(para);
67
+ return para;
68
+ }
69
+
70
+ /**
71
+ * Adds an existing table to the document body
72
+ *
73
+ * @param table - The Table instance to add
74
+ * @returns This instance for chaining
75
+ */
76
+ addTable(table: Table): this {
77
+ this.bodyElements.push(table);
78
+ return this;
79
+ }
80
+
81
+ /**
82
+ * Creates a new table and adds it to the document
83
+ *
84
+ * @param rows - Number of rows to create
85
+ * @param columns - Number of columns per row
86
+ * @returns The created Table instance
87
+ */
88
+ createTable(rows: number, columns: number): Table {
89
+ const table = new Table(rows, columns);
90
+ this.bodyElements.push(table);
91
+ return table;
92
+ }
93
+
94
+ /**
95
+ * Adds a Structured Document Tag to the document body
96
+ *
97
+ * @param sdt - The StructuredDocumentTag instance to add
98
+ * @returns This instance for chaining
99
+ */
100
+ addStructuredDocumentTag(sdt: StructuredDocumentTag): this {
101
+ this.bodyElements.push(sdt);
102
+ return this;
103
+ }
104
+
105
+ /**
106
+ * Adds a Table of Contents element to the document body
107
+ *
108
+ * @param toc - The TableOfContentsElement to add
109
+ * @returns This instance for chaining
110
+ */
111
+ addTableOfContents(toc: TableOfContentsElement): this {
112
+ this.bodyElements.push(toc);
113
+ return this;
114
+ }
115
+
116
+ /**
117
+ * Adds any body element to the document
118
+ *
119
+ * @param element - The body element to add
120
+ * @returns This instance for chaining
121
+ */
122
+ addBodyElement(element: BodyElement): this {
123
+ this.bodyElements.push(element);
124
+ return this;
125
+ }
126
+
127
+ /**
128
+ * Inserts a body element at a specific index
129
+ *
130
+ * @param index - Position to insert at (0-based)
131
+ * @param element - The body element to insert
132
+ * @returns This instance for chaining
133
+ */
134
+ insertBodyElementAt(index: number, element: BodyElement): this {
135
+ index = Math.max(0, Math.min(index, this.bodyElements.length));
136
+ this.bodyElements.splice(index, 0, element);
137
+ return this;
138
+ }
139
+
140
+ /**
141
+ * Removes a body element at a specific index
142
+ *
143
+ * @param index - Position to remove from (0-based)
144
+ * @returns The removed element or undefined
145
+ */
146
+ removeBodyElementAt(index: number): BodyElement | undefined {
147
+ if (index < 0 || index >= this.bodyElements.length) {
148
+ return undefined;
149
+ }
150
+ return this.bodyElements.splice(index, 1)[0];
151
+ }
152
+
153
+ // ==================== Getters ====================
154
+
155
+ /**
156
+ * Gets all body elements
157
+ *
158
+ * @returns Array of all body elements
159
+ */
160
+ getBodyElements(): BodyElement[] {
161
+ return [...this.bodyElements];
162
+ }
163
+
164
+ /**
165
+ * Gets body elements with mutable access (internal use)
166
+ *
167
+ * @returns Reference to body elements array
168
+ * @internal
169
+ */
170
+ getBodyElementsMutable(): BodyElement[] {
171
+ return this.bodyElements;
172
+ }
173
+
174
+ /**
175
+ * Gets top-level paragraphs only
176
+ *
177
+ * @returns Array of Paragraph instances in document body
178
+ */
179
+ getParagraphs(): Paragraph[] {
180
+ return this.bodyElements.filter((el): el is Paragraph => el instanceof Paragraph);
181
+ }
182
+
183
+ /**
184
+ * Gets all paragraphs including nested ones (in tables, SDTs)
185
+ *
186
+ * @returns Array of all Paragraph instances
187
+ */
188
+ getAllParagraphs(): Paragraph[] {
189
+ const paragraphs: Paragraph[] = [];
190
+
191
+ const collectParagraphs = (elements: BodyElement[]) => {
192
+ for (const element of elements) {
193
+ if (element instanceof Paragraph) {
194
+ paragraphs.push(element);
195
+ } else if (element instanceof Table) {
196
+ // Collect paragraphs from table cells
197
+ for (let row = 0; row < element.getRowCount(); row++) {
198
+ for (let col = 0; col < element.getColumnCount(); col++) {
199
+ const cell = element.getCell(row, col);
200
+ if (cell) {
201
+ paragraphs.push(...cell.getParagraphs());
202
+ }
203
+ }
204
+ }
205
+ } else if (element instanceof StructuredDocumentTag) {
206
+ // Recursively collect from SDT content
207
+ const content = element.getContent();
208
+ collectParagraphs(content as BodyElement[]);
209
+ }
210
+ }
211
+ };
212
+
213
+ collectParagraphs(this.bodyElements);
214
+ return paragraphs;
215
+ }
216
+
217
+ /**
218
+ * Gets top-level tables only
219
+ *
220
+ * @returns Array of Table instances in document body
221
+ */
222
+ getTables(): Table[] {
223
+ return this.bodyElements.filter((el): el is Table => el instanceof Table);
224
+ }
225
+
226
+ /**
227
+ * Gets all tables including nested ones
228
+ *
229
+ * @returns Array of all Table instances
230
+ */
231
+ getAllTables(): Table[] {
232
+ const tables: Table[] = [];
233
+
234
+ const collectTables = (elements: BodyElement[]) => {
235
+ for (const element of elements) {
236
+ if (element instanceof Table) {
237
+ tables.push(element);
238
+ // Check for nested tables in cells
239
+ for (let row = 0; row < element.getRowCount(); row++) {
240
+ for (let col = 0; col < element.getColumnCount(); col++) {
241
+ const cell = element.getCell(row, col);
242
+ if (cell) {
243
+ // Tables can be nested in cell content
244
+ const cellContent = cell.getParagraphs();
245
+ // Note: Cells typically contain paragraphs, not tables directly
246
+ }
247
+ }
248
+ }
249
+ } else if (element instanceof StructuredDocumentTag) {
250
+ collectTables(element.getContent() as BodyElement[]);
251
+ }
252
+ }
253
+ };
254
+
255
+ collectTables(this.bodyElements);
256
+ return tables;
257
+ }
258
+
259
+ /**
260
+ * Gets Table of Contents elements
261
+ *
262
+ * @returns Array of TableOfContentsElement instances
263
+ */
264
+ getTableOfContentsElements(): TableOfContentsElement[] {
265
+ return this.bodyElements.filter(
266
+ (el): el is TableOfContentsElement => el instanceof TableOfContentsElement
267
+ );
268
+ }
269
+
270
+ /**
271
+ * Gets Structured Document Tags
272
+ *
273
+ * @returns Array of StructuredDocumentTag instances
274
+ */
275
+ getStructuredDocumentTags(): StructuredDocumentTag[] {
276
+ return this.bodyElements.filter(
277
+ (el): el is StructuredDocumentTag => el instanceof StructuredDocumentTag
278
+ );
279
+ }
280
+
281
+ // ==================== Counts ====================
282
+
283
+ /**
284
+ * Gets the total number of body elements
285
+ */
286
+ getBodyElementCount(): number {
287
+ return this.bodyElements.length;
288
+ }
289
+
290
+ /**
291
+ * Gets the number of top-level paragraphs
292
+ */
293
+ getParagraphCount(): number {
294
+ return this.getParagraphs().length;
295
+ }
296
+
297
+ /**
298
+ * Gets the number of top-level tables
299
+ */
300
+ getTableCount(): number {
301
+ return this.getTables().length;
302
+ }
303
+
304
+ // ==================== Section ====================
305
+
306
+ /**
307
+ * Gets the document section (page setup, margins, etc.)
308
+ *
309
+ * @returns The Section instance
310
+ */
311
+ getSection(): Section {
312
+ return this.section;
313
+ }
314
+
315
+ /**
316
+ * Sets the document section
317
+ *
318
+ * @param section - The Section instance to set
319
+ * @returns This instance for chaining
320
+ */
321
+ setSection(section: Section): this {
322
+ this.section = section;
323
+ return this;
324
+ }
325
+
326
+ // ==================== Clearing ====================
327
+
328
+ /**
329
+ * Clears all body elements
330
+ *
331
+ * @returns This instance for chaining
332
+ */
333
+ clear(): this {
334
+ this.bodyElements = [];
335
+ return this;
336
+ }
337
+
338
+ /**
339
+ * Clears all paragraphs from the document
340
+ *
341
+ * @returns This instance for chaining
342
+ */
343
+ clearParagraphs(): this {
344
+ this.bodyElements = this.bodyElements.filter((el) => !(el instanceof Paragraph));
345
+ return this;
346
+ }
347
+
348
+ /**
349
+ * Clears all tables from the document
350
+ *
351
+ * @returns This instance for chaining
352
+ */
353
+ clearTables(): this {
354
+ this.bodyElements = this.bodyElements.filter((el) => !(el instanceof Table));
355
+ return this;
356
+ }
357
+
358
+ // ==================== Search ====================
359
+
360
+ /**
361
+ * Finds the index of a body element
362
+ *
363
+ * @param element - The element to find
364
+ * @returns Index or -1 if not found
365
+ */
366
+ indexOf(element: BodyElement): number {
367
+ return this.bodyElements.indexOf(element);
368
+ }
369
+
370
+ /**
371
+ * Checks if a body element exists
372
+ *
373
+ * @param element - The element to check
374
+ * @returns true if the element is in the document
375
+ */
376
+ contains(element: BodyElement): boolean {
377
+ return this.bodyElements.includes(element);
378
+ }
379
+
380
+ /**
381
+ * Finds paragraphs by style ID
382
+ *
383
+ * @param styleId - The style ID to search for
384
+ * @returns Array of paragraphs with the style
385
+ */
386
+ findParagraphsByStyle(styleId: string): Paragraph[] {
387
+ const results: Paragraph[] = [];
388
+ const normalizedStyleId = styleId.toLowerCase();
389
+
390
+ for (const paragraph of this.getAllParagraphs()) {
391
+ const paraStyle = paragraph.getStyle()?.toLowerCase();
392
+ if (paraStyle === normalizedStyleId) {
393
+ results.push(paragraph);
394
+ }
395
+ }
396
+
397
+ return results;
398
+ }
399
+
400
+ // ==================== Statistics ====================
401
+
402
+ /**
403
+ * Gets word count for all text content
404
+ *
405
+ * @returns Approximate word count
406
+ */
407
+ getWordCount(): number {
408
+ let wordCount = 0;
409
+ for (const paragraph of this.getAllParagraphs()) {
410
+ const text = paragraph.getText();
411
+ if (text) {
412
+ // Simple word counting - split on whitespace
413
+ wordCount += text.split(/\s+/).filter((word) => word.length > 0).length;
414
+ }
415
+ }
416
+ return wordCount;
417
+ }
418
+
419
+ /**
420
+ * Gets character count for all text content
421
+ *
422
+ * @param includeSpaces - Whether to include spaces (default: true)
423
+ * @returns Character count
424
+ */
425
+ getCharacterCount(includeSpaces = true): number {
426
+ let charCount = 0;
427
+ for (const paragraph of this.getAllParagraphs()) {
428
+ const text = paragraph.getText();
429
+ if (text) {
430
+ charCount += includeSpaces ? text.length : text.replace(/\s/g, '').length;
431
+ }
432
+ }
433
+ return charCount;
434
+ }
435
+
436
+ // ==================== Utility ====================
437
+
438
+ /**
439
+ * Creates a clone of this content instance
440
+ *
441
+ * Note: This creates shallow copies of body elements.
442
+ * For deep cloning, individual elements should be cloned.
443
+ *
444
+ * @returns New DocumentContent instance
445
+ */
446
+ clone(): DocumentContent {
447
+ const cloned = new DocumentContent();
448
+ cloned.bodyElements = [...this.bodyElements];
449
+ cloned.section = this.section?.clone();
450
+ return cloned;
451
+ }
452
+
453
+ /**
454
+ * Checks if the document has any content
455
+ *
456
+ * @returns true if document has no body elements
457
+ */
458
+ isEmpty(): boolean {
459
+ return this.bodyElements.length === 0;
460
+ }
461
+ }