docxmlater 10.0.2 → 10.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 (398) hide show
  1. package/README.md +3 -2
  2. package/dist/constants/legacyCompatFlags.d.ts.map +1 -1
  3. package/dist/constants/legacyCompatFlags.js.map +1 -1
  4. package/dist/constants/limits.d.ts +0 -27
  5. package/dist/constants/limits.d.ts.map +1 -1
  6. package/dist/constants/limits.js +13 -13
  7. package/dist/constants/limits.js.map +1 -1
  8. package/dist/core/Document.d.ts +23 -19
  9. package/dist/core/Document.d.ts.map +1 -1
  10. package/dist/core/Document.js +197 -63
  11. package/dist/core/Document.js.map +1 -1
  12. package/dist/core/DocumentContent.d.ts.map +1 -1
  13. package/dist/core/DocumentContent.js.map +1 -1
  14. package/dist/core/DocumentGenerator.d.ts.map +1 -1
  15. package/dist/core/DocumentGenerator.js +59 -24
  16. package/dist/core/DocumentGenerator.js.map +1 -1
  17. package/dist/core/DocumentIdManager.d.ts.map +1 -1
  18. package/dist/core/DocumentIdManager.js.map +1 -1
  19. package/dist/core/DocumentParser.d.ts +6 -6
  20. package/dist/core/DocumentParser.d.ts.map +1 -1
  21. package/dist/core/DocumentParser.js +86 -55
  22. package/dist/core/DocumentParser.js.map +1 -1
  23. package/dist/core/DocumentValidator.d.ts.map +1 -1
  24. package/dist/core/DocumentValidator.js.map +1 -1
  25. package/dist/core/Relationship.d.ts.map +1 -1
  26. package/dist/core/Relationship.js +1 -1
  27. package/dist/core/Relationship.js.map +1 -1
  28. package/dist/core/RelationshipManager.js +3 -3
  29. package/dist/core/RelationshipManager.js.map +1 -1
  30. package/dist/elements/AlternateContent.js.map +1 -1
  31. package/dist/elements/Bookmark.d.ts.map +1 -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.js +1 -1
  36. package/dist/elements/Comment.js.map +1 -1
  37. package/dist/elements/CommentManager.d.ts.map +1 -1
  38. package/dist/elements/CommentManager.js +8 -2
  39. package/dist/elements/CommentManager.js.map +1 -1
  40. package/dist/elements/CommonTypes.d.ts.map +1 -1
  41. package/dist/elements/CommonTypes.js +1 -2
  42. package/dist/elements/CommonTypes.js.map +1 -1
  43. package/dist/elements/CustomXml.js.map +1 -1
  44. package/dist/elements/Endnote.d.ts.map +1 -1
  45. package/dist/elements/Endnote.js.map +1 -1
  46. package/dist/elements/EndnoteManager.d.ts.map +1 -1
  47. package/dist/elements/EndnoteManager.js.map +1 -1
  48. package/dist/elements/Field.d.ts.map +1 -1
  49. package/dist/elements/Field.js +31 -28
  50. package/dist/elements/Field.js.map +1 -1
  51. package/dist/elements/FieldHelpers.d.ts.map +1 -1
  52. package/dist/elements/FieldHelpers.js +6 -6
  53. package/dist/elements/FieldHelpers.js.map +1 -1
  54. package/dist/elements/FontManager.d.ts.map +1 -1
  55. package/dist/elements/FontManager.js.map +1 -1
  56. package/dist/elements/Footer.js.map +1 -1
  57. package/dist/elements/Footnote.d.ts.map +1 -1
  58. package/dist/elements/Footnote.js.map +1 -1
  59. package/dist/elements/FootnoteManager.d.ts.map +1 -1
  60. package/dist/elements/FootnoteManager.js.map +1 -1
  61. package/dist/elements/Header.js.map +1 -1
  62. package/dist/elements/HeaderFooterManager.js.map +1 -1
  63. package/dist/elements/Hyperlink.d.ts.map +1 -1
  64. package/dist/elements/Hyperlink.js +5 -5
  65. package/dist/elements/Hyperlink.js.map +1 -1
  66. package/dist/elements/Image.d.ts +2 -2
  67. package/dist/elements/Image.d.ts.map +1 -1
  68. package/dist/elements/Image.js +21 -5
  69. package/dist/elements/Image.js.map +1 -1
  70. package/dist/elements/ImageManager.d.ts.map +1 -1
  71. package/dist/elements/ImageManager.js +2 -2
  72. package/dist/elements/ImageManager.js.map +1 -1
  73. package/dist/elements/ImageRun.js.map +1 -1
  74. package/dist/elements/MathElement.js.map +1 -1
  75. package/dist/elements/Paragraph.d.ts +8 -0
  76. package/dist/elements/Paragraph.d.ts.map +1 -1
  77. package/dist/elements/Paragraph.js +153 -118
  78. package/dist/elements/Paragraph.js.map +1 -1
  79. package/dist/elements/PreservedElement.js.map +1 -1
  80. package/dist/elements/PropertyChangeTypes.js.map +1 -1
  81. package/dist/elements/RangeMarker.js.map +1 -1
  82. package/dist/elements/Revision.d.ts +1 -0
  83. package/dist/elements/Revision.d.ts.map +1 -1
  84. package/dist/elements/Revision.js +44 -5
  85. package/dist/elements/Revision.js.map +1 -1
  86. package/dist/elements/RevisionContent.js.map +1 -1
  87. package/dist/elements/RevisionManager.d.ts.map +1 -1
  88. package/dist/elements/RevisionManager.js.map +1 -1
  89. package/dist/elements/Run.d.ts.map +1 -1
  90. package/dist/elements/Run.js +1 -3
  91. package/dist/elements/Run.js.map +1 -1
  92. package/dist/elements/Section.d.ts.map +1 -1
  93. package/dist/elements/Section.js +127 -118
  94. package/dist/elements/Section.js.map +1 -1
  95. package/dist/elements/Shape.d.ts.map +1 -1
  96. package/dist/elements/Shape.js +21 -0
  97. package/dist/elements/Shape.js.map +1 -1
  98. package/dist/elements/StructuredDocumentTag.d.ts.map +1 -1
  99. package/dist/elements/StructuredDocumentTag.js +20 -8
  100. package/dist/elements/StructuredDocumentTag.js.map +1 -1
  101. package/dist/elements/Table.d.ts +2 -2
  102. package/dist/elements/Table.d.ts.map +1 -1
  103. package/dist/elements/Table.js +29 -35
  104. package/dist/elements/Table.js.map +1 -1
  105. package/dist/elements/TableCell.d.ts +2 -2
  106. package/dist/elements/TableCell.d.ts.map +1 -1
  107. package/dist/elements/TableCell.js +63 -67
  108. package/dist/elements/TableCell.js.map +1 -1
  109. package/dist/elements/TableGridChange.js.map +1 -1
  110. package/dist/elements/TableOfContents.d.ts +6 -6
  111. package/dist/elements/TableOfContents.d.ts.map +1 -1
  112. package/dist/elements/TableOfContents.js.map +1 -1
  113. package/dist/elements/TableOfContentsElement.js.map +1 -1
  114. package/dist/elements/TableRow.d.ts.map +1 -1
  115. package/dist/elements/TableRow.js +65 -47
  116. package/dist/elements/TableRow.js.map +1 -1
  117. package/dist/elements/TextBox.d.ts.map +1 -1
  118. package/dist/elements/TextBox.js +1 -1
  119. package/dist/elements/TextBox.js.map +1 -1
  120. package/dist/formatting/AbstractNumbering.d.ts +1 -1
  121. package/dist/formatting/AbstractNumbering.d.ts.map +1 -1
  122. package/dist/formatting/AbstractNumbering.js +11 -11
  123. package/dist/formatting/AbstractNumbering.js.map +1 -1
  124. package/dist/formatting/NumberingInstance.d.ts.map +1 -1
  125. package/dist/formatting/NumberingInstance.js +4 -4
  126. package/dist/formatting/NumberingInstance.js.map +1 -1
  127. package/dist/formatting/NumberingLevel.d.ts.map +1 -1
  128. package/dist/formatting/NumberingLevel.js +26 -26
  129. package/dist/formatting/NumberingLevel.js.map +1 -1
  130. package/dist/formatting/NumberingManager.d.ts +1 -1
  131. package/dist/formatting/NumberingManager.d.ts.map +1 -1
  132. package/dist/formatting/NumberingManager.js.map +1 -1
  133. package/dist/formatting/Style.d.ts.map +1 -1
  134. package/dist/formatting/Style.js +87 -95
  135. package/dist/formatting/Style.js.map +1 -1
  136. package/dist/formatting/StylesManager.d.ts +3 -3
  137. package/dist/formatting/StylesManager.d.ts.map +1 -1
  138. package/dist/formatting/StylesManager.js.map +1 -1
  139. package/dist/helpers/CleanupHelper.js.map +1 -1
  140. package/dist/images/ImageOptimizer.js.map +1 -1
  141. package/dist/index.js.map +1 -1
  142. package/dist/managers/DrawingManager.d.ts.map +1 -1
  143. package/dist/managers/DrawingManager.js.map +1 -1
  144. package/dist/tracking/DocumentTrackingContext.js.map +1 -1
  145. package/dist/tracking/TrackingContext.js.map +1 -1
  146. package/dist/types/compatibility-types.js.map +1 -1
  147. package/dist/types/formatting.js.map +1 -1
  148. package/dist/types/list-types.d.ts +4 -4
  149. package/dist/types/list-types.d.ts.map +1 -1
  150. package/dist/types/list-types.js.map +1 -1
  151. package/dist/types/settings-types.js.map +1 -1
  152. package/dist/types/styleConfig.js.map +1 -1
  153. package/dist/utils/ChangelogGenerator.d.ts.map +1 -1
  154. package/dist/utils/ChangelogGenerator.js.map +1 -1
  155. package/dist/utils/CompatibilityUpgrader.d.ts.map +1 -1
  156. package/dist/utils/CompatibilityUpgrader.js +7 -7
  157. package/dist/utils/CompatibilityUpgrader.js.map +1 -1
  158. package/dist/utils/InMemoryRevisionAcceptor.d.ts.map +1 -1
  159. package/dist/utils/InMemoryRevisionAcceptor.js +23 -2
  160. package/dist/utils/InMemoryRevisionAcceptor.js.map +1 -1
  161. package/dist/utils/MoveOperationHelper.js.map +1 -1
  162. package/dist/utils/RevisionAwareProcessor.js.map +1 -1
  163. package/dist/utils/RevisionWalker.js.map +1 -1
  164. package/dist/utils/SelectiveRevisionAcceptor.d.ts +1 -0
  165. package/dist/utils/SelectiveRevisionAcceptor.d.ts.map +1 -1
  166. package/dist/utils/SelectiveRevisionAcceptor.js +46 -0
  167. package/dist/utils/SelectiveRevisionAcceptor.js.map +1 -1
  168. package/dist/utils/ShadingResolver.js +1 -1
  169. package/dist/utils/ShadingResolver.js.map +1 -1
  170. package/dist/utils/acceptRevisions.d.ts +0 -28
  171. package/dist/utils/acceptRevisions.d.ts.map +1 -1
  172. package/dist/utils/acceptRevisions.js +5 -7
  173. package/dist/utils/acceptRevisions.js.map +1 -1
  174. package/dist/utils/cnfStyleDecoder.js +1 -1
  175. package/dist/utils/cnfStyleDecoder.js.map +1 -1
  176. package/dist/utils/corruptionDetection.js.map +1 -1
  177. package/dist/utils/dateFormatting.js.map +1 -1
  178. package/dist/utils/deepClone.d.ts +0 -1
  179. package/dist/utils/deepClone.d.ts.map +1 -1
  180. package/dist/utils/deepClone.js +0 -7
  181. package/dist/utils/deepClone.js.map +1 -1
  182. package/dist/utils/diagnostics.d.ts +2 -2
  183. package/dist/utils/diagnostics.d.ts.map +1 -1
  184. package/dist/utils/diagnostics.js.map +1 -1
  185. package/dist/utils/errorHandling.js.map +1 -1
  186. package/dist/utils/formatting.js.map +1 -1
  187. package/dist/utils/list-detection.d.ts +2 -2
  188. package/dist/utils/list-detection.d.ts.map +1 -1
  189. package/dist/utils/list-detection.js +3 -3
  190. package/dist/utils/list-detection.js.map +1 -1
  191. package/dist/utils/logger.d.ts +2 -4
  192. package/dist/utils/logger.d.ts.map +1 -1
  193. package/dist/utils/logger.js +0 -2
  194. package/dist/utils/logger.js.map +1 -1
  195. package/dist/utils/parsingHelpers.js.map +1 -1
  196. package/dist/utils/stripTrackedChanges.d.ts +0 -19
  197. package/dist/utils/stripTrackedChanges.d.ts.map +1 -1
  198. package/dist/utils/stripTrackedChanges.js +0 -2
  199. package/dist/utils/stripTrackedChanges.js.map +1 -1
  200. package/dist/utils/textDiff.js.map +1 -1
  201. package/dist/utils/units.js.map +1 -1
  202. package/dist/utils/validation.d.ts.map +1 -1
  203. package/dist/utils/validation.js.map +1 -1
  204. package/dist/utils/xmlSanitization.js.map +1 -1
  205. package/dist/validation/RevisionAutoFixer.js.map +1 -1
  206. package/dist/validation/RevisionValidator.js.map +1 -1
  207. package/dist/validation/ValidationRules.js.map +1 -1
  208. package/dist/validation/index.js.map +1 -1
  209. package/dist/xml/XMLBuilder.d.ts.map +1 -1
  210. package/dist/xml/XMLBuilder.js +10 -0
  211. package/dist/xml/XMLBuilder.js.map +1 -1
  212. package/dist/xml/XMLParser.d.ts.map +1 -1
  213. package/dist/xml/XMLParser.js +4 -5
  214. package/dist/xml/XMLParser.js.map +1 -1
  215. package/dist/zip/ZipHandler.js.map +1 -1
  216. package/dist/zip/ZipReader.js.map +1 -1
  217. package/dist/zip/ZipWriter.js.map +1 -1
  218. package/dist/zip/errors.js.map +1 -1
  219. package/dist/zip/types.js.map +1 -1
  220. package/package.json +34 -4
  221. package/src/__tests__/helper-methods.test.ts +512 -0
  222. package/src/constants/legacyCompatFlags.ts +138 -0
  223. package/src/constants/limits.ts +50 -0
  224. package/src/core/CLAUDE.md +109 -0
  225. package/src/core/Document.ts +15569 -0
  226. package/src/core/DocumentContent.ts +467 -0
  227. package/src/core/DocumentGenerator.ts +1104 -0
  228. package/src/core/DocumentIdManager.ts +158 -0
  229. package/src/core/DocumentParser.ts +10140 -0
  230. package/src/core/DocumentValidator.ts +372 -0
  231. package/src/core/Relationship.ts +367 -0
  232. package/src/core/RelationshipManager.ts +428 -0
  233. package/src/elements/AlternateContent.ts +42 -0
  234. package/src/elements/Bookmark.ts +210 -0
  235. package/src/elements/BookmarkManager.ts +250 -0
  236. package/src/elements/CLAUDE.md +126 -0
  237. package/src/elements/Comment.ts +359 -0
  238. package/src/elements/CommentManager.ts +502 -0
  239. package/src/elements/CommonTypes.ts +549 -0
  240. package/src/elements/CustomXml.ts +36 -0
  241. package/src/elements/Endnote.ts +217 -0
  242. package/src/elements/EndnoteManager.ts +249 -0
  243. package/src/elements/Field.ts +1233 -0
  244. package/src/elements/FieldHelpers.ts +333 -0
  245. package/src/elements/FontManager.ts +339 -0
  246. package/src/elements/Footer.ts +269 -0
  247. package/src/elements/Footnote.ts +217 -0
  248. package/src/elements/FootnoteManager.ts +249 -0
  249. package/src/elements/Header.ts +269 -0
  250. package/src/elements/HeaderFooterManager.ts +219 -0
  251. package/src/elements/Hyperlink.ts +1146 -0
  252. package/src/elements/Image.ts +1756 -0
  253. package/src/elements/ImageManager.ts +432 -0
  254. package/src/elements/ImageRun.ts +59 -0
  255. package/src/elements/MathElement.ts +65 -0
  256. package/src/elements/Paragraph.ts +4287 -0
  257. package/src/elements/PreservedElement.ts +53 -0
  258. package/src/elements/PropertyChangeTypes.ts +442 -0
  259. package/src/elements/RangeMarker.ts +400 -0
  260. package/src/elements/Revision.ts +1217 -0
  261. package/src/elements/RevisionContent.ts +73 -0
  262. package/src/elements/RevisionManager.ts +1070 -0
  263. package/src/elements/Run.ts +3068 -0
  264. package/src/elements/Section.ts +1421 -0
  265. package/src/elements/Shape.ts +873 -0
  266. package/src/elements/StructuredDocumentTag.ts +978 -0
  267. package/src/elements/Table.ts +2524 -0
  268. package/src/elements/TableCell.ts +1586 -0
  269. package/src/elements/TableGridChange.ts +151 -0
  270. package/src/elements/TableOfContents.ts +691 -0
  271. package/src/elements/TableOfContentsElement.ts +89 -0
  272. package/src/elements/TableRow.ts +906 -0
  273. package/src/elements/TextBox.ts +768 -0
  274. package/src/formatting/AbstractNumbering.ts +548 -0
  275. package/src/formatting/CLAUDE.md +74 -0
  276. package/src/formatting/NumberingInstance.ts +212 -0
  277. package/src/formatting/NumberingLevel.ts +1006 -0
  278. package/src/formatting/NumberingManager.ts +827 -0
  279. package/src/formatting/Style.ts +1833 -0
  280. package/src/formatting/StylesManager.ts +1005 -0
  281. package/src/helpers/CleanupHelper.ts +524 -0
  282. package/src/images/ImageOptimizer.ts +274 -0
  283. package/src/index.ts +554 -0
  284. package/src/managers/CLAUDE.md +47 -0
  285. package/src/managers/DrawingManager.ts +319 -0
  286. package/src/tracking/DocumentTrackingContext.ts +643 -0
  287. package/src/tracking/TrackingContext.ts +173 -0
  288. package/src/types/compatibility-types.ts +49 -0
  289. package/src/types/formatting.ts +210 -0
  290. package/src/types/list-types.ts +152 -0
  291. package/src/types/settings-types.ts +59 -0
  292. package/src/types/styleConfig.ts +189 -0
  293. package/src/utils/CLAUDE.md +153 -0
  294. package/src/utils/ChangelogGenerator.ts +1581 -0
  295. package/src/utils/CompatibilityUpgrader.ts +237 -0
  296. package/src/utils/InMemoryRevisionAcceptor.ts +696 -0
  297. package/src/utils/MoveOperationHelper.ts +238 -0
  298. package/src/utils/RevisionAwareProcessor.ts +526 -0
  299. package/src/utils/RevisionWalker.ts +457 -0
  300. package/src/utils/SelectiveRevisionAcceptor.ts +683 -0
  301. package/src/utils/ShadingResolver.ts +107 -0
  302. package/src/utils/acceptRevisions.ts +714 -0
  303. package/src/utils/cnfStyleDecoder.ts +217 -0
  304. package/src/utils/corruptionDetection.ts +345 -0
  305. package/src/utils/dateFormatting.ts +20 -0
  306. package/src/utils/deepClone.ts +78 -0
  307. package/src/utils/diagnostics.ts +129 -0
  308. package/src/utils/errorHandling.ts +80 -0
  309. package/src/utils/formatting.ts +213 -0
  310. package/src/utils/list-detection.ts +274 -0
  311. package/src/utils/logger.ts +404 -0
  312. package/src/utils/parsingHelpers.ts +190 -0
  313. package/src/utils/stripTrackedChanges.ts +353 -0
  314. package/src/utils/textDiff.ts +100 -0
  315. package/src/utils/units.ts +421 -0
  316. package/src/utils/validation.ts +542 -0
  317. package/src/utils/xmlSanitization.ts +182 -0
  318. package/src/validation/RevisionAutoFixer.ts +542 -0
  319. package/src/validation/RevisionValidator.ts +460 -0
  320. package/src/validation/ValidationRules.ts +338 -0
  321. package/src/validation/index.ts +30 -0
  322. package/src/xml/CLAUDE.md +65 -0
  323. package/src/xml/XMLBuilder.ts +871 -0
  324. package/src/xml/XMLParser.ts +919 -0
  325. package/src/zip/CLAUDE.md +55 -0
  326. package/src/zip/ZipHandler.ts +637 -0
  327. package/src/zip/ZipReader.ts +299 -0
  328. package/src/zip/ZipWriter.ts +390 -0
  329. package/src/zip/errors.ts +69 -0
  330. package/src/zip/types.ts +116 -0
  331. package/dist/core/ListNormalizer.d.ts +0 -23
  332. package/dist/core/ListNormalizer.d.ts.map +0 -1
  333. package/dist/core/ListNormalizer.js +0 -624
  334. package/dist/core/ListNormalizer.js.map +0 -1
  335. package/dist/images/index.d.ts +0 -2
  336. package/dist/images/index.d.ts.map +0 -1
  337. package/dist/images/index.js +0 -8
  338. package/dist/images/index.js.map +0 -1
  339. package/dist/ms-doc/cfb/CFBReader.d.ts +0 -35
  340. package/dist/ms-doc/cfb/CFBReader.d.ts.map +0 -1
  341. package/dist/ms-doc/cfb/CFBReader.js +0 -360
  342. package/dist/ms-doc/cfb/CFBReader.js.map +0 -1
  343. package/dist/ms-doc/converter/DocToDocxConverter.d.ts +0 -55
  344. package/dist/ms-doc/converter/DocToDocxConverter.d.ts.map +0 -1
  345. package/dist/ms-doc/converter/DocToDocxConverter.js +0 -324
  346. package/dist/ms-doc/converter/DocToDocxConverter.js.map +0 -1
  347. package/dist/ms-doc/fib/FIB.d.ts +0 -18
  348. package/dist/ms-doc/fib/FIB.d.ts.map +0 -1
  349. package/dist/ms-doc/fib/FIB.js +0 -342
  350. package/dist/ms-doc/fib/FIB.js.map +0 -1
  351. package/dist/ms-doc/fields/FieldParser.d.ts +0 -31
  352. package/dist/ms-doc/fields/FieldParser.d.ts.map +0 -1
  353. package/dist/ms-doc/fields/FieldParser.js +0 -266
  354. package/dist/ms-doc/fields/FieldParser.js.map +0 -1
  355. package/dist/ms-doc/images/PictureExtractor.d.ts +0 -22
  356. package/dist/ms-doc/images/PictureExtractor.d.ts.map +0 -1
  357. package/dist/ms-doc/images/PictureExtractor.js +0 -233
  358. package/dist/ms-doc/images/PictureExtractor.js.map +0 -1
  359. package/dist/ms-doc/index.d.ts +0 -20
  360. package/dist/ms-doc/index.d.ts.map +0 -1
  361. package/dist/ms-doc/index.js +0 -59
  362. package/dist/ms-doc/index.js.map +0 -1
  363. package/dist/ms-doc/properties/SPRM.d.ts +0 -210
  364. package/dist/ms-doc/properties/SPRM.d.ts.map +0 -1
  365. package/dist/ms-doc/properties/SPRM.js +0 -633
  366. package/dist/ms-doc/properties/SPRM.js.map +0 -1
  367. package/dist/ms-doc/sections/SectionParser.d.ts +0 -25
  368. package/dist/ms-doc/sections/SectionParser.d.ts.map +0 -1
  369. package/dist/ms-doc/sections/SectionParser.js +0 -214
  370. package/dist/ms-doc/sections/SectionParser.js.map +0 -1
  371. package/dist/ms-doc/styles/StyleSheet.d.ts +0 -23
  372. package/dist/ms-doc/styles/StyleSheet.d.ts.map +0 -1
  373. package/dist/ms-doc/styles/StyleSheet.js +0 -268
  374. package/dist/ms-doc/styles/StyleSheet.js.map +0 -1
  375. package/dist/ms-doc/subdocuments/SubdocumentParser.d.ts +0 -61
  376. package/dist/ms-doc/subdocuments/SubdocumentParser.d.ts.map +0 -1
  377. package/dist/ms-doc/subdocuments/SubdocumentParser.js +0 -208
  378. package/dist/ms-doc/subdocuments/SubdocumentParser.js.map +0 -1
  379. package/dist/ms-doc/tables/TableParser.d.ts +0 -29
  380. package/dist/ms-doc/tables/TableParser.d.ts.map +0 -1
  381. package/dist/ms-doc/tables/TableParser.js +0 -176
  382. package/dist/ms-doc/tables/TableParser.js.map +0 -1
  383. package/dist/ms-doc/text/PieceTable.d.ts +0 -21
  384. package/dist/ms-doc/text/PieceTable.d.ts.map +0 -1
  385. package/dist/ms-doc/text/PieceTable.js +0 -171
  386. package/dist/ms-doc/text/PieceTable.js.map +0 -1
  387. package/dist/ms-doc/types/Constants.d.ts +0 -99
  388. package/dist/ms-doc/types/Constants.d.ts.map +0 -1
  389. package/dist/ms-doc/types/Constants.js +0 -102
  390. package/dist/ms-doc/types/Constants.js.map +0 -1
  391. package/dist/ms-doc/types/DocTypes.d.ts +0 -368
  392. package/dist/ms-doc/types/DocTypes.d.ts.map +0 -1
  393. package/dist/ms-doc/types/DocTypes.js +0 -3
  394. package/dist/ms-doc/types/DocTypes.js.map +0 -1
  395. package/dist/tracking/index.d.ts +0 -3
  396. package/dist/tracking/index.d.ts.map +0 -1
  397. package/dist/tracking/index.js +0 -6
  398. package/dist/tracking/index.js.map +0 -1
@@ -0,0 +1,873 @@
1
+ /**
2
+ * Shape - Represents a drawing shape in a Word document
3
+ *
4
+ * Shapes use DrawingML (a:) and WordprocessingML Drawing (wp:) namespaces,
5
+ * plus WordprocessingShape (wps:) namespace for Word 2010+ shape features.
6
+ *
7
+ * Per ECMA-376 Part 4 (Transitional) and Office Open XML extensions,
8
+ * shapes in Word documents use the wps:wsp element structure.
9
+ */
10
+
11
+ import { XMLBuilder, XMLElement } from '../xml/XMLBuilder';
12
+ import { inchesToEmus, pointsToHalfPoints } from '../utils/units';
13
+ import { RunFormatting } from './Run';
14
+ import {
15
+ ImagePosition,
16
+ ImageAnchor,
17
+ PositionAnchor,
18
+ HorizontalAlignment,
19
+ VerticalAlignment
20
+ } from './Image';
21
+
22
+ /**
23
+ * Preset shape types available in DrawingML
24
+ * Based on ECMA-376 Part 1 §20.1.10.56 ST_ShapeType
25
+ */
26
+ export type ShapeType =
27
+ | 'rect' // Rectangle
28
+ | 'ellipse' // Circle/Ellipse
29
+ | 'rightArrow' // Right arrow
30
+ | 'leftArrow' // Left arrow
31
+ | 'upArrow' // Up arrow
32
+ | 'downArrow' // Down arrow
33
+ | 'straightConnector1' // Straight line
34
+ | 'roundRect' // Rounded rectangle
35
+ | 'triangle' // Triangle
36
+ | 'diamond'; // Diamond
37
+
38
+ /**
39
+ * Shape fill configuration
40
+ */
41
+ export interface ShapeFill {
42
+ /** Fill color in hex (e.g., 'FF0000' for red) */
43
+ color: string;
44
+ /** Transparency percentage (0-100, where 100 is fully transparent) */
45
+ transparency?: number;
46
+ }
47
+
48
+ /**
49
+ * Shape outline/border configuration
50
+ */
51
+ export interface ShapeOutline {
52
+ /** Outline color in hex */
53
+ color: string;
54
+ /** Outline width in EMUs */
55
+ width: number;
56
+ /** Line dash style */
57
+ style?: 'solid' | 'dash' | 'dot' | 'dashDot' | 'lgDash' | 'lgDashDot' | 'lgDashDotDot' | 'sysDash' | 'sysDot' | 'sysDashDot' | 'sysDashDotDot';
58
+ /** Line cap style (ECMA-376 §20.1.10.31) */
59
+ cap?: 'flat' | 'rnd' | 'sq';
60
+ /** Line join style (ECMA-376 §20.1.10.32) */
61
+ join?: 'bevel' | 'miter' | 'round';
62
+ /** Compound line type (ECMA-376 §20.1.10.15) */
63
+ compound?: 'sng' | 'dbl' | 'thickThin' | 'thinThick' | 'tri';
64
+ }
65
+
66
+ /**
67
+ * Shape properties
68
+ */
69
+ export interface ShapeProperties {
70
+ /** Shape type (preset geometry) */
71
+ shapeType: ShapeType;
72
+ /** Width in EMUs */
73
+ width: number;
74
+ /** Height in EMUs */
75
+ height: number;
76
+ /** Fill color and transparency */
77
+ fill?: ShapeFill;
78
+ /** Outline/border properties */
79
+ outline?: ShapeOutline;
80
+ /** Position configuration (reuses Image position types) */
81
+ position?: ImagePosition;
82
+ /** Anchor configuration (reuses Image anchor types) */
83
+ anchor?: ImageAnchor;
84
+ /** Rotation angle in degrees (0-360) */
85
+ rotation?: number;
86
+ /** Text content within the shape */
87
+ text?: string;
88
+ /** Text formatting */
89
+ textFormatting?: RunFormatting;
90
+ /** Shape name/title */
91
+ name?: string;
92
+ /** Shape description (for accessibility) */
93
+ description?: string;
94
+ }
95
+
96
+ /**
97
+ * Represents a drawing shape
98
+ */
99
+ export class Shape {
100
+ private shapeType: ShapeType;
101
+ private width: number;
102
+ private height: number;
103
+ private fill?: ShapeFill;
104
+ private outline?: ShapeOutline;
105
+ private position?: ImagePosition;
106
+ private anchor?: ImageAnchor;
107
+ private rotation = 0;
108
+ private text?: string;
109
+ private textFormatting?: RunFormatting;
110
+ private name: string;
111
+ private description: string;
112
+ private docPrId = 1;
113
+
114
+ /**
115
+ * Creates a new shape
116
+ * @param properties Shape properties
117
+ * @private Use static factory methods instead (create, createRectangle, etc.)
118
+ */
119
+ private constructor(properties: ShapeProperties) {
120
+ this.shapeType = properties.shapeType;
121
+ this.width = properties.width;
122
+ this.height = properties.height;
123
+ this.fill = properties.fill;
124
+ this.outline = properties.outline;
125
+ this.position = properties.position;
126
+ this.anchor = properties.anchor;
127
+ this.rotation = properties.rotation || 0;
128
+ this.text = properties.text;
129
+ this.textFormatting = properties.textFormatting;
130
+ this.name = properties.name || 'Shape';
131
+ this.description = properties.description || '';
132
+ }
133
+
134
+ /**
135
+ * Factory method for creating a shape
136
+ * @param shapeType Shape type
137
+ * @param width Width in EMUs (or use inchesToEmus)
138
+ * @param height Height in EMUs (or use inchesToEmus)
139
+ * @returns New Shape instance
140
+ * @example
141
+ * const rect = Shape.create('rect', inchesToEmus(2), inchesToEmus(1));
142
+ */
143
+ static create(shapeType: ShapeType, width: number, height: number): Shape {
144
+ return new Shape({ shapeType, width, height });
145
+ }
146
+
147
+ /**
148
+ * Creates a rectangle shape
149
+ * @param width Width in EMUs
150
+ * @param height Height in EMUs
151
+ * @returns New Shape instance
152
+ */
153
+ static createRectangle(width: number, height: number): Shape {
154
+ return Shape.create('rect', width, height);
155
+ }
156
+
157
+ /**
158
+ * Creates a circle shape
159
+ * @param diameter Diameter in EMUs
160
+ * @returns New Shape instance
161
+ */
162
+ static createCircle(diameter: number): Shape {
163
+ return Shape.create('ellipse', diameter, diameter);
164
+ }
165
+
166
+ /**
167
+ * Creates an ellipse shape
168
+ * @param width Width in EMUs
169
+ * @param height Height in EMUs
170
+ * @returns New Shape instance
171
+ */
172
+ static createEllipse(width: number, height: number): Shape {
173
+ return Shape.create('ellipse', width, height);
174
+ }
175
+
176
+ /**
177
+ * Creates an arrow shape
178
+ * @param direction Arrow direction
179
+ * @param width Width in EMUs
180
+ * @param height Height in EMUs
181
+ * @returns New Shape instance
182
+ */
183
+ static createArrow(
184
+ direction: 'right' | 'left' | 'up' | 'down',
185
+ width: number,
186
+ height: number
187
+ ): Shape {
188
+ const shapeType = `${direction}Arrow` as ShapeType;
189
+ return Shape.create(shapeType, width, height);
190
+ }
191
+
192
+ /**
193
+ * Creates a line shape
194
+ * @param width Line width in EMUs
195
+ * @returns New Shape instance
196
+ */
197
+ static createLine(width: number): Shape {
198
+ // Lines are typically very thin in height
199
+ return Shape.create('straightConnector1', width, 12700); // 12700 EMU ≈ 1pt height
200
+ }
201
+
202
+ /**
203
+ * Gets the shape type
204
+ * @returns Shape type
205
+ */
206
+ getShapeType(): ShapeType {
207
+ return this.shapeType;
208
+ }
209
+
210
+ /**
211
+ * Gets the shape width in EMUs
212
+ * @returns Width
213
+ */
214
+ getWidth(): number {
215
+ return this.width;
216
+ }
217
+
218
+ /**
219
+ * Gets the shape height in EMUs
220
+ * @returns Height
221
+ */
222
+ getHeight(): number {
223
+ return this.height;
224
+ }
225
+
226
+ /**
227
+ * Sets the shape fill color
228
+ * @param color Fill color in hex (e.g., 'FF0000')
229
+ * @param transparency Optional transparency percentage (0-100)
230
+ * @returns This shape for chaining
231
+ */
232
+ setFill(color: string, transparency?: number): this {
233
+ this.fill = { color, transparency };
234
+ return this;
235
+ }
236
+
237
+ /**
238
+ * Gets the fill configuration
239
+ * @returns Fill or undefined
240
+ */
241
+ getFill(): ShapeFill | undefined {
242
+ return this.fill;
243
+ }
244
+
245
+ /**
246
+ * Sets the shape outline
247
+ * @param color Outline color in hex
248
+ * @param width Outline width in EMUs
249
+ * @param style Line style
250
+ * @returns This shape for chaining
251
+ */
252
+ setOutline(color: string, width: number, style?: 'solid' | 'dash' | 'dot' | 'dashDot'): this {
253
+ this.outline = { color, width, style: style || 'solid' };
254
+ return this;
255
+ }
256
+
257
+ /**
258
+ * Gets the outline configuration
259
+ * @returns Outline or undefined
260
+ */
261
+ getOutline(): ShapeOutline | undefined {
262
+ return this.outline;
263
+ }
264
+
265
+ /**
266
+ * Sets shape position (for floating shapes)
267
+ * @param horizontal Horizontal positioning configuration
268
+ * @param vertical Vertical positioning configuration
269
+ * @returns This shape for chaining
270
+ */
271
+ setPosition(
272
+ horizontal: { anchor: PositionAnchor; offset?: number; alignment?: HorizontalAlignment },
273
+ vertical: { anchor: PositionAnchor; offset?: number; alignment?: VerticalAlignment }
274
+ ): this {
275
+ this.position = { horizontal, vertical };
276
+ return this;
277
+ }
278
+
279
+ /**
280
+ * Gets the position configuration
281
+ * @returns Position or undefined
282
+ */
283
+ getPosition(): ImagePosition | undefined {
284
+ return this.position;
285
+ }
286
+
287
+ /**
288
+ * Sets anchor configuration (converts shape to floating)
289
+ * @param options Anchor configuration
290
+ * @returns This shape for chaining
291
+ */
292
+ setAnchor(options: ImageAnchor): this {
293
+ this.anchor = options;
294
+ return this;
295
+ }
296
+
297
+ /**
298
+ * Gets the anchor configuration
299
+ * @returns Anchor configuration or undefined
300
+ */
301
+ getAnchor(): ImageAnchor | undefined {
302
+ return this.anchor;
303
+ }
304
+
305
+ /**
306
+ * Sets the rotation angle
307
+ * @param degrees Rotation in degrees (0-360)
308
+ * @returns This shape for chaining
309
+ */
310
+ setRotation(degrees: number): this {
311
+ this.rotation = ((degrees % 360) + 360) % 360;
312
+ return this;
313
+ }
314
+
315
+ /**
316
+ * Gets the rotation angle
317
+ * @returns Rotation in degrees
318
+ */
319
+ getRotation(): number {
320
+ return this.rotation;
321
+ }
322
+
323
+ /**
324
+ * Sets text content within the shape
325
+ * @param text Text content
326
+ * @param formatting Optional text formatting
327
+ * @returns This shape for chaining
328
+ */
329
+ setText(text: string, formatting?: RunFormatting): this {
330
+ this.text = text;
331
+ if (formatting) {
332
+ this.textFormatting = formatting;
333
+ }
334
+ return this;
335
+ }
336
+
337
+ /**
338
+ * Gets the text content
339
+ * @returns Text or undefined
340
+ */
341
+ getText(): string | undefined {
342
+ return this.text;
343
+ }
344
+
345
+ /**
346
+ * Sets the shape name
347
+ * @param name Shape name
348
+ * @returns This shape for chaining
349
+ */
350
+ setName(name: string): this {
351
+ this.name = name;
352
+ return this;
353
+ }
354
+
355
+ /**
356
+ * Gets the shape name
357
+ * @returns Shape name
358
+ */
359
+ getName(): string {
360
+ return this.name;
361
+ }
362
+
363
+ /**
364
+ * Sets the shape description (for accessibility)
365
+ * @param description Shape description
366
+ * @returns This shape for chaining
367
+ */
368
+ setDescription(description: string): this {
369
+ this.description = description;
370
+ return this;
371
+ }
372
+
373
+ /**
374
+ * Gets the shape description
375
+ * @returns Shape description
376
+ */
377
+ getDescription(): string {
378
+ return this.description;
379
+ }
380
+
381
+ /**
382
+ * Sets the docPr ID (drawing object ID)
383
+ * @param id Document property ID
384
+ * @returns This shape for chaining
385
+ */
386
+ setDocPrId(id: number): this {
387
+ this.docPrId = id;
388
+ return this;
389
+ }
390
+
391
+ /**
392
+ * Checks if this shape is floating (has anchor or position configuration)
393
+ * @returns True if floating, false if inline
394
+ */
395
+ isFloating(): boolean {
396
+ return this.anchor !== undefined || this.position !== undefined;
397
+ }
398
+
399
+ /**
400
+ * Generates DrawingML XML for the shape
401
+ * Creates either inline or floating (anchor) shape based on configuration
402
+ * @returns XML element representing the shape
403
+ */
404
+ toXML(): XMLElement {
405
+ // Choose between inline and anchor based on configuration
406
+ const shapeElement = this.isFloating() ? this.createAnchor() : this.createInline();
407
+
408
+ // Create the drawing structure
409
+ return XMLBuilder.w('drawing', undefined, [shapeElement]);
410
+ }
411
+
412
+ /**
413
+ * Creates the wp:inline element for inline shapes
414
+ * @private
415
+ */
416
+ private createInline(): XMLElement {
417
+ const children: XMLElement[] = [];
418
+
419
+ // Extent (size)
420
+ children.push({
421
+ name: 'wp:extent',
422
+ attributes: {
423
+ cx: this.width.toString(),
424
+ cy: this.height.toString(),
425
+ },
426
+ selfClosing: true,
427
+ });
428
+
429
+ // Effect extent (set to 0 for shapes)
430
+ children.push({
431
+ name: 'wp:effectExtent',
432
+ attributes: {
433
+ l: '0',
434
+ t: '0',
435
+ r: '0',
436
+ b: '0',
437
+ },
438
+ selfClosing: true,
439
+ });
440
+
441
+ // Document properties
442
+ children.push({
443
+ name: 'wp:docPr',
444
+ attributes: {
445
+ id: this.docPrId.toString(),
446
+ name: this.name,
447
+ descr: this.description,
448
+ },
449
+ selfClosing: true,
450
+ });
451
+
452
+ // Non-visual graphic frame properties
453
+ children.push({
454
+ name: 'wp:cNvGraphicFramePr',
455
+ selfClosing: true,
456
+ });
457
+
458
+ // Graphic data (the actual shape)
459
+ children.push(this.createGraphic());
460
+
461
+ return {
462
+ name: 'wp:inline',
463
+ attributes: {
464
+ distT: '0',
465
+ distB: '0',
466
+ distL: '0',
467
+ distR: '0',
468
+ },
469
+ children,
470
+ };
471
+ }
472
+
473
+ /**
474
+ * Creates the wp:anchor element for floating shapes
475
+ * @private
476
+ */
477
+ private createAnchor(): XMLElement {
478
+ const children: XMLElement[] = [];
479
+
480
+ const anchorConfig = this.anchor || {
481
+ behindDoc: false,
482
+ locked: false,
483
+ layoutInCell: true,
484
+ allowOverlap: false,
485
+ relativeHeight: 251658240,
486
+ };
487
+
488
+ // simplePos (required first child per CT_Anchor)
489
+ children.push({
490
+ name: 'wp:simplePos',
491
+ attributes: { x: '0', y: '0' },
492
+ selfClosing: true,
493
+ });
494
+
495
+ // Position H (horizontal)
496
+ if (this.position) {
497
+ const posH = this.position.horizontal;
498
+ const posHChildren: XMLElement[] = [];
499
+
500
+ if (posH.offset !== undefined) {
501
+ posHChildren.push({
502
+ name: 'wp:posOffset',
503
+ children: [posH.offset.toString()],
504
+ });
505
+ } else if (posH.alignment) {
506
+ posHChildren.push({
507
+ name: 'wp:align',
508
+ children: [posH.alignment],
509
+ });
510
+ }
511
+
512
+ children.push({
513
+ name: 'wp:positionH',
514
+ attributes: {
515
+ relativeFrom: posH.anchor,
516
+ },
517
+ children: posHChildren,
518
+ });
519
+ }
520
+
521
+ // Position V (vertical)
522
+ if (this.position) {
523
+ const posV = this.position.vertical;
524
+ const posVChildren: XMLElement[] = [];
525
+
526
+ if (posV.offset !== undefined) {
527
+ posVChildren.push({
528
+ name: 'wp:posOffset',
529
+ children: [posV.offset.toString()],
530
+ });
531
+ } else if (posV.alignment) {
532
+ posVChildren.push({
533
+ name: 'wp:align',
534
+ children: [posV.alignment],
535
+ });
536
+ }
537
+
538
+ children.push({
539
+ name: 'wp:positionV',
540
+ attributes: {
541
+ relativeFrom: posV.anchor,
542
+ },
543
+ children: posVChildren,
544
+ });
545
+ }
546
+
547
+ // Extent (size)
548
+ children.push({
549
+ name: 'wp:extent',
550
+ attributes: {
551
+ cx: this.width.toString(),
552
+ cy: this.height.toString(),
553
+ },
554
+ selfClosing: true,
555
+ });
556
+
557
+ // Effect extent
558
+ children.push({
559
+ name: 'wp:effectExtent',
560
+ attributes: {
561
+ l: '0',
562
+ t: '0',
563
+ r: '0',
564
+ b: '0',
565
+ },
566
+ selfClosing: true,
567
+ });
568
+
569
+ // Wrap square (default for shapes)
570
+ children.push({
571
+ name: 'wp:wrapSquare',
572
+ attributes: {
573
+ wrapText: 'bothSides',
574
+ },
575
+ selfClosing: true,
576
+ });
577
+
578
+ // Document properties
579
+ children.push({
580
+ name: 'wp:docPr',
581
+ attributes: {
582
+ id: this.docPrId.toString(),
583
+ name: this.name,
584
+ descr: this.description,
585
+ },
586
+ selfClosing: true,
587
+ });
588
+
589
+ // Non-visual graphic frame properties
590
+ children.push({
591
+ name: 'wp:cNvGraphicFramePr',
592
+ selfClosing: true,
593
+ });
594
+
595
+ // Graphic data (the actual shape)
596
+ children.push(this.createGraphic());
597
+
598
+ return {
599
+ name: 'wp:anchor',
600
+ attributes: {
601
+ distT: '0',
602
+ distB: '0',
603
+ distL: '0',
604
+ distR: '0',
605
+ simplePos: '0',
606
+ relativeHeight: anchorConfig.relativeHeight.toString(),
607
+ behindDoc: anchorConfig.behindDoc ? '1' : '0',
608
+ locked: anchorConfig.locked ? '1' : '0',
609
+ layoutInCell: anchorConfig.layoutInCell ? '1' : '0',
610
+ allowOverlap: anchorConfig.allowOverlap ? '1' : '0',
611
+ },
612
+ children,
613
+ };
614
+ }
615
+
616
+ /**
617
+ * Creates the a:graphic element containing the shape
618
+ * @private
619
+ */
620
+ private createGraphic(): XMLElement {
621
+ return {
622
+ name: 'a:graphic',
623
+ attributes: {
624
+ 'xmlns:a': 'http://schemas.openxmlformats.org/drawingml/2006/main',
625
+ },
626
+ children: [
627
+ {
628
+ name: 'a:graphicData',
629
+ attributes: {
630
+ uri: 'http://schemas.microsoft.com/office/word/2010/wordprocessingShape',
631
+ },
632
+ children: [this.createWps()],
633
+ },
634
+ ],
635
+ };
636
+ }
637
+
638
+ /**
639
+ * Creates the wps:wsp element (WordprocessingShape)
640
+ * @private
641
+ */
642
+ private createWps(): XMLElement {
643
+ const children: XMLElement[] = [];
644
+
645
+ // Non-visual shape properties
646
+ children.push({
647
+ name: 'wps:cNvSpPr',
648
+ attributes: {
649
+ 'xmlns:wps': 'http://schemas.microsoft.com/office/word/2010/wordprocessingShape',
650
+ },
651
+ selfClosing: true,
652
+ });
653
+
654
+ // Shape properties (geometry, fill, outline)
655
+ children.push(this.createSpPr());
656
+
657
+ // Text box (if text is present)
658
+ if (this.text) {
659
+ children.push(this.createTextBox());
660
+ }
661
+
662
+ // Body properties (required per CT_WordprocessingShape)
663
+ children.push({
664
+ name: 'wps:bodyPr',
665
+ attributes: {
666
+ rot: '0',
667
+ vert: 'horz',
668
+ wrap: 'square',
669
+ lIns: '91440',
670
+ tIns: '45720',
671
+ rIns: '91440',
672
+ bIns: '45720',
673
+ anchor: 't',
674
+ anchorCtr: '0',
675
+ upright: '1',
676
+ },
677
+ selfClosing: true,
678
+ });
679
+
680
+ return {
681
+ name: 'wps:wsp',
682
+ attributes: {
683
+ 'xmlns:wps': 'http://schemas.microsoft.com/office/word/2010/wordprocessingShape',
684
+ },
685
+ children,
686
+ };
687
+ }
688
+
689
+ /**
690
+ * Creates the wps:spPr element (shape properties)
691
+ * @private
692
+ */
693
+ private createSpPr(): XMLElement {
694
+ const children: XMLElement[] = [];
695
+
696
+ // Transform (position and size)
697
+ const xfrmAttrs = this.rotation > 0 ? { rot: (this.rotation * 60000).toString() } : undefined;
698
+ children.push({
699
+ name: 'a:xfrm',
700
+ attributes: xfrmAttrs,
701
+ children: [
702
+ {
703
+ name: 'a:off',
704
+ attributes: { x: '0', y: '0' },
705
+ selfClosing: true,
706
+ },
707
+ {
708
+ name: 'a:ext',
709
+ attributes: {
710
+ cx: this.width.toString(),
711
+ cy: this.height.toString(),
712
+ },
713
+ selfClosing: true,
714
+ },
715
+ ],
716
+ });
717
+
718
+ // Preset geometry (shape type)
719
+ children.push({
720
+ name: 'a:prstGeom',
721
+ attributes: {
722
+ prst: this.shapeType,
723
+ },
724
+ children: [
725
+ {
726
+ name: 'a:avLst',
727
+ selfClosing: true,
728
+ },
729
+ ],
730
+ });
731
+
732
+ // Fill
733
+ if (this.fill) {
734
+ const fillChildren: XMLElement[] = [];
735
+
736
+ // Color
737
+ const colorAttrs: Record<string, string> = {
738
+ val: this.fill.color.toUpperCase(),
739
+ };
740
+
741
+ // Transparency (alpha percentage)
742
+ if (this.fill.transparency !== undefined) {
743
+ // Convert 0-100 to 0-100000 (percentage * 1000)
744
+ const alpha = 100 - this.fill.transparency; // Invert (0=transparent, 100=opaque)
745
+ fillChildren.push({
746
+ name: 'a:alpha',
747
+ attributes: {
748
+ val: Math.round(alpha * 1000).toString(),
749
+ },
750
+ selfClosing: true,
751
+ });
752
+ }
753
+
754
+ children.push({
755
+ name: 'a:solidFill',
756
+ children: [
757
+ {
758
+ name: 'a:srgbClr',
759
+ attributes: colorAttrs,
760
+ ...(fillChildren.length > 0 ? { children: fillChildren } : { selfClosing: true }),
761
+ },
762
+ ],
763
+ });
764
+ }
765
+
766
+ // Outline
767
+ if (this.outline) {
768
+ const lnAttrs: Record<string, string> = {
769
+ w: this.outline.width.toString(),
770
+ };
771
+ if (this.outline.cap) lnAttrs.cap = this.outline.cap;
772
+ if (this.outline.compound) lnAttrs.cmpd = this.outline.compound;
773
+
774
+ const lnChildren: XMLElement[] = [];
775
+
776
+ // Outline color
777
+ lnChildren.push({
778
+ name: 'a:solidFill',
779
+ children: [
780
+ {
781
+ name: 'a:srgbClr',
782
+ attributes: {
783
+ val: this.outline.color.toUpperCase(),
784
+ },
785
+ selfClosing: true,
786
+ },
787
+ ],
788
+ });
789
+
790
+ // Line style (prstDash)
791
+ if (this.outline.style && this.outline.style !== 'solid') {
792
+ lnChildren.push({
793
+ name: 'a:prstDash',
794
+ attributes: {
795
+ val: this.outline.style,
796
+ },
797
+ selfClosing: true,
798
+ });
799
+ }
800
+
801
+ // Line join style
802
+ if (this.outline.join) {
803
+ const joinNames = { bevel: 'a:bevel', miter: 'a:miter', round: 'a:round' } as const;
804
+ const joinName = joinNames[this.outline.join];
805
+ if (joinName) {
806
+ lnChildren.push({
807
+ name: joinName,
808
+ selfClosing: true,
809
+ });
810
+ }
811
+ }
812
+
813
+ children.push({
814
+ name: 'a:ln',
815
+ attributes: lnAttrs,
816
+ children: lnChildren,
817
+ });
818
+ }
819
+
820
+ return {
821
+ name: 'wps:spPr',
822
+ children,
823
+ };
824
+ }
825
+
826
+ /**
827
+ * Creates the wps:txbx element (text box within shape)
828
+ * @private
829
+ */
830
+ private createTextBox(): XMLElement {
831
+ if (!this.text) {
832
+ return { name: 'wps:txbx', selfClosing: true };
833
+ }
834
+
835
+ // Build run properties
836
+ const rPrChildren: XMLElement[] = [];
837
+ if (this.textFormatting) {
838
+ if (this.textFormatting.bold) {
839
+ rPrChildren.push(XMLBuilder.wSelf('b'));
840
+ }
841
+ if (this.textFormatting.italic) {
842
+ rPrChildren.push(XMLBuilder.wSelf('i'));
843
+ }
844
+ if (this.textFormatting.color) {
845
+ rPrChildren.push(XMLBuilder.wSelf('color', { 'w:val': this.textFormatting.color }));
846
+ }
847
+ if (this.textFormatting.size) {
848
+ const halfPoints = pointsToHalfPoints(this.textFormatting.size);
849
+ rPrChildren.push(XMLBuilder.wSelf('sz', { 'w:val': halfPoints }));
850
+ rPrChildren.push(XMLBuilder.wSelf('szCs', { 'w:val': halfPoints }));
851
+ }
852
+ }
853
+
854
+ // Build paragraph with run
855
+ const runChildren: XMLElement[] = [];
856
+ if (rPrChildren.length > 0) {
857
+ runChildren.push(XMLBuilder.w('rPr', undefined, rPrChildren));
858
+ }
859
+ runChildren.push(XMLBuilder.w('t', { 'xml:space': 'preserve' }, [this.text]));
860
+
861
+ const paragraph = XMLBuilder.w('p', undefined, [XMLBuilder.w('r', undefined, runChildren)]);
862
+
863
+ return {
864
+ name: 'wps:txbx',
865
+ children: [
866
+ {
867
+ name: 'w:txbxContent',
868
+ children: [paragraph],
869
+ },
870
+ ],
871
+ };
872
+ }
873
+ }