docxmlater 10.0.1 → 10.0.3

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 (395) 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 +24 -19
  9. package/dist/core/Document.d.ts.map +1 -1
  10. package/dist/core/Document.js +272 -71
  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 +60 -54
  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.map +1 -1
  76. package/dist/elements/Paragraph.js +128 -117
  77. package/dist/elements/Paragraph.js.map +1 -1
  78. package/dist/elements/PreservedElement.js.map +1 -1
  79. package/dist/elements/PropertyChangeTypes.js.map +1 -1
  80. package/dist/elements/RangeMarker.js.map +1 -1
  81. package/dist/elements/Revision.d.ts +1 -0
  82. package/dist/elements/Revision.d.ts.map +1 -1
  83. package/dist/elements/Revision.js +44 -5
  84. package/dist/elements/Revision.js.map +1 -1
  85. package/dist/elements/RevisionContent.js.map +1 -1
  86. package/dist/elements/RevisionManager.d.ts.map +1 -1
  87. package/dist/elements/RevisionManager.js.map +1 -1
  88. package/dist/elements/Run.d.ts.map +1 -1
  89. package/dist/elements/Run.js +1 -3
  90. package/dist/elements/Run.js.map +1 -1
  91. package/dist/elements/Section.d.ts.map +1 -1
  92. package/dist/elements/Section.js +127 -118
  93. package/dist/elements/Section.js.map +1 -1
  94. package/dist/elements/Shape.d.ts.map +1 -1
  95. package/dist/elements/Shape.js +21 -0
  96. package/dist/elements/Shape.js.map +1 -1
  97. package/dist/elements/StructuredDocumentTag.d.ts.map +1 -1
  98. package/dist/elements/StructuredDocumentTag.js +20 -8
  99. package/dist/elements/StructuredDocumentTag.js.map +1 -1
  100. package/dist/elements/Table.d.ts +2 -2
  101. package/dist/elements/Table.d.ts.map +1 -1
  102. package/dist/elements/Table.js +29 -35
  103. package/dist/elements/Table.js.map +1 -1
  104. package/dist/elements/TableCell.d.ts +2 -2
  105. package/dist/elements/TableCell.d.ts.map +1 -1
  106. package/dist/elements/TableCell.js +63 -67
  107. package/dist/elements/TableCell.js.map +1 -1
  108. package/dist/elements/TableGridChange.js.map +1 -1
  109. package/dist/elements/TableOfContents.d.ts +6 -6
  110. package/dist/elements/TableOfContents.d.ts.map +1 -1
  111. package/dist/elements/TableOfContents.js.map +1 -1
  112. package/dist/elements/TableOfContentsElement.js.map +1 -1
  113. package/dist/elements/TableRow.d.ts.map +1 -1
  114. package/dist/elements/TableRow.js +65 -47
  115. package/dist/elements/TableRow.js.map +1 -1
  116. package/dist/elements/TextBox.d.ts.map +1 -1
  117. package/dist/elements/TextBox.js +1 -1
  118. package/dist/elements/TextBox.js.map +1 -1
  119. package/dist/formatting/AbstractNumbering.d.ts +1 -1
  120. package/dist/formatting/AbstractNumbering.d.ts.map +1 -1
  121. package/dist/formatting/AbstractNumbering.js +11 -11
  122. package/dist/formatting/AbstractNumbering.js.map +1 -1
  123. package/dist/formatting/NumberingInstance.d.ts.map +1 -1
  124. package/dist/formatting/NumberingInstance.js +4 -4
  125. package/dist/formatting/NumberingInstance.js.map +1 -1
  126. package/dist/formatting/NumberingLevel.d.ts.map +1 -1
  127. package/dist/formatting/NumberingLevel.js +26 -26
  128. package/dist/formatting/NumberingLevel.js.map +1 -1
  129. package/dist/formatting/NumberingManager.d.ts +1 -1
  130. package/dist/formatting/NumberingManager.d.ts.map +1 -1
  131. package/dist/formatting/NumberingManager.js.map +1 -1
  132. package/dist/formatting/Style.d.ts.map +1 -1
  133. package/dist/formatting/Style.js +87 -95
  134. package/dist/formatting/Style.js.map +1 -1
  135. package/dist/formatting/StylesManager.d.ts +3 -3
  136. package/dist/formatting/StylesManager.d.ts.map +1 -1
  137. package/dist/formatting/StylesManager.js.map +1 -1
  138. package/dist/helpers/CleanupHelper.d.ts.map +1 -1
  139. package/dist/helpers/CleanupHelper.js +1 -7
  140. package/dist/helpers/CleanupHelper.js.map +1 -1
  141. package/dist/images/ImageOptimizer.js.map +1 -1
  142. package/dist/index.js.map +1 -1
  143. package/dist/managers/DrawingManager.d.ts.map +1 -1
  144. package/dist/managers/DrawingManager.js.map +1 -1
  145. package/dist/tracking/DocumentTrackingContext.js.map +1 -1
  146. package/dist/tracking/TrackingContext.js.map +1 -1
  147. package/dist/types/compatibility-types.js.map +1 -1
  148. package/dist/types/formatting.js.map +1 -1
  149. package/dist/types/list-types.d.ts +4 -4
  150. package/dist/types/list-types.d.ts.map +1 -1
  151. package/dist/types/list-types.js.map +1 -1
  152. package/dist/types/settings-types.js.map +1 -1
  153. package/dist/types/styleConfig.js.map +1 -1
  154. package/dist/utils/ChangelogGenerator.d.ts.map +1 -1
  155. package/dist/utils/ChangelogGenerator.js.map +1 -1
  156. package/dist/utils/CompatibilityUpgrader.d.ts.map +1 -1
  157. package/dist/utils/CompatibilityUpgrader.js +7 -7
  158. package/dist/utils/CompatibilityUpgrader.js.map +1 -1
  159. package/dist/utils/InMemoryRevisionAcceptor.js +1 -1
  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.js.map +1 -1
  165. package/dist/utils/ShadingResolver.js +1 -1
  166. package/dist/utils/ShadingResolver.js.map +1 -1
  167. package/dist/utils/acceptRevisions.d.ts +0 -28
  168. package/dist/utils/acceptRevisions.d.ts.map +1 -1
  169. package/dist/utils/acceptRevisions.js +5 -7
  170. package/dist/utils/acceptRevisions.js.map +1 -1
  171. package/dist/utils/cnfStyleDecoder.js +1 -1
  172. package/dist/utils/cnfStyleDecoder.js.map +1 -1
  173. package/dist/utils/corruptionDetection.js.map +1 -1
  174. package/dist/utils/dateFormatting.js.map +1 -1
  175. package/dist/utils/deepClone.d.ts +0 -1
  176. package/dist/utils/deepClone.d.ts.map +1 -1
  177. package/dist/utils/deepClone.js +0 -7
  178. package/dist/utils/deepClone.js.map +1 -1
  179. package/dist/utils/diagnostics.d.ts +2 -2
  180. package/dist/utils/diagnostics.d.ts.map +1 -1
  181. package/dist/utils/diagnostics.js.map +1 -1
  182. package/dist/utils/errorHandling.js.map +1 -1
  183. package/dist/utils/formatting.js.map +1 -1
  184. package/dist/utils/list-detection.d.ts +2 -2
  185. package/dist/utils/list-detection.d.ts.map +1 -1
  186. package/dist/utils/list-detection.js +3 -3
  187. package/dist/utils/list-detection.js.map +1 -1
  188. package/dist/utils/logger.d.ts +2 -4
  189. package/dist/utils/logger.d.ts.map +1 -1
  190. package/dist/utils/logger.js +0 -2
  191. package/dist/utils/logger.js.map +1 -1
  192. package/dist/utils/parsingHelpers.js.map +1 -1
  193. package/dist/utils/stripTrackedChanges.d.ts +0 -19
  194. package/dist/utils/stripTrackedChanges.d.ts.map +1 -1
  195. package/dist/utils/stripTrackedChanges.js +0 -2
  196. package/dist/utils/stripTrackedChanges.js.map +1 -1
  197. package/dist/utils/textDiff.js.map +1 -1
  198. package/dist/utils/units.js.map +1 -1
  199. package/dist/utils/validation.d.ts.map +1 -1
  200. package/dist/utils/validation.js.map +1 -1
  201. package/dist/utils/xmlSanitization.js.map +1 -1
  202. package/dist/validation/RevisionAutoFixer.js.map +1 -1
  203. package/dist/validation/RevisionValidator.js.map +1 -1
  204. package/dist/validation/ValidationRules.js.map +1 -1
  205. package/dist/validation/index.js.map +1 -1
  206. package/dist/xml/XMLBuilder.d.ts.map +1 -1
  207. package/dist/xml/XMLBuilder.js +10 -0
  208. package/dist/xml/XMLBuilder.js.map +1 -1
  209. package/dist/xml/XMLParser.d.ts.map +1 -1
  210. package/dist/xml/XMLParser.js +4 -5
  211. package/dist/xml/XMLParser.js.map +1 -1
  212. package/dist/zip/ZipHandler.js.map +1 -1
  213. package/dist/zip/ZipReader.js.map +1 -1
  214. package/dist/zip/ZipWriter.js.map +1 -1
  215. package/dist/zip/errors.js.map +1 -1
  216. package/dist/zip/types.js.map +1 -1
  217. package/package.json +34 -4
  218. package/src/__tests__/helper-methods.test.ts +512 -0
  219. package/src/constants/legacyCompatFlags.ts +138 -0
  220. package/src/constants/limits.ts +50 -0
  221. package/src/core/CLAUDE.md +109 -0
  222. package/src/core/Document.ts +15569 -0
  223. package/src/core/DocumentContent.ts +467 -0
  224. package/src/core/DocumentGenerator.ts +1104 -0
  225. package/src/core/DocumentIdManager.ts +158 -0
  226. package/src/core/DocumentParser.ts +10107 -0
  227. package/src/core/DocumentValidator.ts +372 -0
  228. package/src/core/Relationship.ts +367 -0
  229. package/src/core/RelationshipManager.ts +428 -0
  230. package/src/elements/AlternateContent.ts +42 -0
  231. package/src/elements/Bookmark.ts +210 -0
  232. package/src/elements/BookmarkManager.ts +250 -0
  233. package/src/elements/CLAUDE.md +126 -0
  234. package/src/elements/Comment.ts +359 -0
  235. package/src/elements/CommentManager.ts +502 -0
  236. package/src/elements/CommonTypes.ts +549 -0
  237. package/src/elements/CustomXml.ts +36 -0
  238. package/src/elements/Endnote.ts +217 -0
  239. package/src/elements/EndnoteManager.ts +249 -0
  240. package/src/elements/Field.ts +1233 -0
  241. package/src/elements/FieldHelpers.ts +333 -0
  242. package/src/elements/FontManager.ts +339 -0
  243. package/src/elements/Footer.ts +269 -0
  244. package/src/elements/Footnote.ts +217 -0
  245. package/src/elements/FootnoteManager.ts +249 -0
  246. package/src/elements/Header.ts +269 -0
  247. package/src/elements/HeaderFooterManager.ts +219 -0
  248. package/src/elements/Hyperlink.ts +1146 -0
  249. package/src/elements/Image.ts +1756 -0
  250. package/src/elements/ImageManager.ts +432 -0
  251. package/src/elements/ImageRun.ts +59 -0
  252. package/src/elements/MathElement.ts +65 -0
  253. package/src/elements/Paragraph.ts +4227 -0
  254. package/src/elements/PreservedElement.ts +53 -0
  255. package/src/elements/PropertyChangeTypes.ts +442 -0
  256. package/src/elements/RangeMarker.ts +400 -0
  257. package/src/elements/Revision.ts +1217 -0
  258. package/src/elements/RevisionContent.ts +73 -0
  259. package/src/elements/RevisionManager.ts +1070 -0
  260. package/src/elements/Run.ts +3068 -0
  261. package/src/elements/Section.ts +1421 -0
  262. package/src/elements/Shape.ts +873 -0
  263. package/src/elements/StructuredDocumentTag.ts +978 -0
  264. package/src/elements/Table.ts +2524 -0
  265. package/src/elements/TableCell.ts +1586 -0
  266. package/src/elements/TableGridChange.ts +151 -0
  267. package/src/elements/TableOfContents.ts +691 -0
  268. package/src/elements/TableOfContentsElement.ts +89 -0
  269. package/src/elements/TableRow.ts +906 -0
  270. package/src/elements/TextBox.ts +768 -0
  271. package/src/formatting/AbstractNumbering.ts +548 -0
  272. package/src/formatting/CLAUDE.md +74 -0
  273. package/src/formatting/NumberingInstance.ts +212 -0
  274. package/src/formatting/NumberingLevel.ts +1006 -0
  275. package/src/formatting/NumberingManager.ts +827 -0
  276. package/src/formatting/Style.ts +1833 -0
  277. package/src/formatting/StylesManager.ts +1005 -0
  278. package/src/helpers/CleanupHelper.ts +524 -0
  279. package/src/images/ImageOptimizer.ts +274 -0
  280. package/src/index.ts +554 -0
  281. package/src/managers/CLAUDE.md +47 -0
  282. package/src/managers/DrawingManager.ts +319 -0
  283. package/src/tracking/DocumentTrackingContext.ts +643 -0
  284. package/src/tracking/TrackingContext.ts +173 -0
  285. package/src/types/compatibility-types.ts +49 -0
  286. package/src/types/formatting.ts +210 -0
  287. package/src/types/list-types.ts +152 -0
  288. package/src/types/settings-types.ts +59 -0
  289. package/src/types/styleConfig.ts +189 -0
  290. package/src/utils/CLAUDE.md +153 -0
  291. package/src/utils/ChangelogGenerator.ts +1581 -0
  292. package/src/utils/CompatibilityUpgrader.ts +237 -0
  293. package/src/utils/InMemoryRevisionAcceptor.ts +668 -0
  294. package/src/utils/MoveOperationHelper.ts +238 -0
  295. package/src/utils/RevisionAwareProcessor.ts +526 -0
  296. package/src/utils/RevisionWalker.ts +457 -0
  297. package/src/utils/SelectiveRevisionAcceptor.ts +613 -0
  298. package/src/utils/ShadingResolver.ts +107 -0
  299. package/src/utils/acceptRevisions.ts +714 -0
  300. package/src/utils/cnfStyleDecoder.ts +217 -0
  301. package/src/utils/corruptionDetection.ts +345 -0
  302. package/src/utils/dateFormatting.ts +20 -0
  303. package/src/utils/deepClone.ts +78 -0
  304. package/src/utils/diagnostics.ts +129 -0
  305. package/src/utils/errorHandling.ts +80 -0
  306. package/src/utils/formatting.ts +213 -0
  307. package/src/utils/list-detection.ts +274 -0
  308. package/src/utils/logger.ts +404 -0
  309. package/src/utils/parsingHelpers.ts +190 -0
  310. package/src/utils/stripTrackedChanges.ts +353 -0
  311. package/src/utils/textDiff.ts +100 -0
  312. package/src/utils/units.ts +421 -0
  313. package/src/utils/validation.ts +542 -0
  314. package/src/utils/xmlSanitization.ts +182 -0
  315. package/src/validation/RevisionAutoFixer.ts +542 -0
  316. package/src/validation/RevisionValidator.ts +460 -0
  317. package/src/validation/ValidationRules.ts +338 -0
  318. package/src/validation/index.ts +30 -0
  319. package/src/xml/CLAUDE.md +65 -0
  320. package/src/xml/XMLBuilder.ts +871 -0
  321. package/src/xml/XMLParser.ts +919 -0
  322. package/src/zip/CLAUDE.md +55 -0
  323. package/src/zip/ZipHandler.ts +637 -0
  324. package/src/zip/ZipReader.ts +299 -0
  325. package/src/zip/ZipWriter.ts +390 -0
  326. package/src/zip/errors.ts +69 -0
  327. package/src/zip/types.ts +116 -0
  328. package/dist/core/ListNormalizer.d.ts +0 -23
  329. package/dist/core/ListNormalizer.d.ts.map +0 -1
  330. package/dist/core/ListNormalizer.js +0 -624
  331. package/dist/core/ListNormalizer.js.map +0 -1
  332. package/dist/images/index.d.ts +0 -2
  333. package/dist/images/index.d.ts.map +0 -1
  334. package/dist/images/index.js +0 -8
  335. package/dist/images/index.js.map +0 -1
  336. package/dist/ms-doc/cfb/CFBReader.d.ts +0 -35
  337. package/dist/ms-doc/cfb/CFBReader.d.ts.map +0 -1
  338. package/dist/ms-doc/cfb/CFBReader.js +0 -360
  339. package/dist/ms-doc/cfb/CFBReader.js.map +0 -1
  340. package/dist/ms-doc/converter/DocToDocxConverter.d.ts +0 -55
  341. package/dist/ms-doc/converter/DocToDocxConverter.d.ts.map +0 -1
  342. package/dist/ms-doc/converter/DocToDocxConverter.js +0 -324
  343. package/dist/ms-doc/converter/DocToDocxConverter.js.map +0 -1
  344. package/dist/ms-doc/fib/FIB.d.ts +0 -18
  345. package/dist/ms-doc/fib/FIB.d.ts.map +0 -1
  346. package/dist/ms-doc/fib/FIB.js +0 -342
  347. package/dist/ms-doc/fib/FIB.js.map +0 -1
  348. package/dist/ms-doc/fields/FieldParser.d.ts +0 -31
  349. package/dist/ms-doc/fields/FieldParser.d.ts.map +0 -1
  350. package/dist/ms-doc/fields/FieldParser.js +0 -266
  351. package/dist/ms-doc/fields/FieldParser.js.map +0 -1
  352. package/dist/ms-doc/images/PictureExtractor.d.ts +0 -22
  353. package/dist/ms-doc/images/PictureExtractor.d.ts.map +0 -1
  354. package/dist/ms-doc/images/PictureExtractor.js +0 -233
  355. package/dist/ms-doc/images/PictureExtractor.js.map +0 -1
  356. package/dist/ms-doc/index.d.ts +0 -20
  357. package/dist/ms-doc/index.d.ts.map +0 -1
  358. package/dist/ms-doc/index.js +0 -59
  359. package/dist/ms-doc/index.js.map +0 -1
  360. package/dist/ms-doc/properties/SPRM.d.ts +0 -210
  361. package/dist/ms-doc/properties/SPRM.d.ts.map +0 -1
  362. package/dist/ms-doc/properties/SPRM.js +0 -633
  363. package/dist/ms-doc/properties/SPRM.js.map +0 -1
  364. package/dist/ms-doc/sections/SectionParser.d.ts +0 -25
  365. package/dist/ms-doc/sections/SectionParser.d.ts.map +0 -1
  366. package/dist/ms-doc/sections/SectionParser.js +0 -214
  367. package/dist/ms-doc/sections/SectionParser.js.map +0 -1
  368. package/dist/ms-doc/styles/StyleSheet.d.ts +0 -23
  369. package/dist/ms-doc/styles/StyleSheet.d.ts.map +0 -1
  370. package/dist/ms-doc/styles/StyleSheet.js +0 -268
  371. package/dist/ms-doc/styles/StyleSheet.js.map +0 -1
  372. package/dist/ms-doc/subdocuments/SubdocumentParser.d.ts +0 -61
  373. package/dist/ms-doc/subdocuments/SubdocumentParser.d.ts.map +0 -1
  374. package/dist/ms-doc/subdocuments/SubdocumentParser.js +0 -208
  375. package/dist/ms-doc/subdocuments/SubdocumentParser.js.map +0 -1
  376. package/dist/ms-doc/tables/TableParser.d.ts +0 -29
  377. package/dist/ms-doc/tables/TableParser.d.ts.map +0 -1
  378. package/dist/ms-doc/tables/TableParser.js +0 -176
  379. package/dist/ms-doc/tables/TableParser.js.map +0 -1
  380. package/dist/ms-doc/text/PieceTable.d.ts +0 -21
  381. package/dist/ms-doc/text/PieceTable.d.ts.map +0 -1
  382. package/dist/ms-doc/text/PieceTable.js +0 -171
  383. package/dist/ms-doc/text/PieceTable.js.map +0 -1
  384. package/dist/ms-doc/types/Constants.d.ts +0 -99
  385. package/dist/ms-doc/types/Constants.d.ts.map +0 -1
  386. package/dist/ms-doc/types/Constants.js +0 -102
  387. package/dist/ms-doc/types/Constants.js.map +0 -1
  388. package/dist/ms-doc/types/DocTypes.d.ts +0 -368
  389. package/dist/ms-doc/types/DocTypes.d.ts.map +0 -1
  390. package/dist/ms-doc/types/DocTypes.js +0 -3
  391. package/dist/ms-doc/types/DocTypes.js.map +0 -1
  392. package/dist/tracking/index.d.ts +0 -3
  393. package/dist/tracking/index.d.ts.map +0 -1
  394. package/dist/tracking/index.js +0 -6
  395. package/dist/tracking/index.js.map +0 -1
@@ -0,0 +1,978 @@
1
+ /**
2
+ * Structured Document Tag (SDT) - Content control wrapper
3
+ *
4
+ * SDTs are used by applications like Google Docs to wrap content
5
+ * with metadata and control settings. They can contain paragraphs,
6
+ * tables, or other block-level elements.
7
+ */
8
+
9
+ import { XMLBuilder, XMLElement } from "../xml/XMLBuilder";
10
+ import { Paragraph } from "./Paragraph";
11
+ import { Table } from "./Table";
12
+
13
+ /**
14
+ * Type of content lock for SDT
15
+ */
16
+ export type SDTLockType =
17
+ | "unlocked"
18
+ | "sdtLocked"
19
+ | "contentLocked"
20
+ | "sdtContentLocked";
21
+
22
+ /**
23
+ * Content control type
24
+ */
25
+ export type ContentControlType =
26
+ | "richText"
27
+ | "plainText"
28
+ | "comboBox"
29
+ | "dropDownList"
30
+ | "datePicker"
31
+ | "checkbox"
32
+ | "picture"
33
+ | "buildingBlock"
34
+ | "group";
35
+
36
+ /**
37
+ * List item for combo box or dropdown
38
+ */
39
+ export interface ListItem {
40
+ /** Display text shown to user */
41
+ displayText: string;
42
+ /** Internal value */
43
+ value: string;
44
+ }
45
+
46
+ /**
47
+ * Plain text control properties
48
+ */
49
+ export interface PlainTextProperties {
50
+ /** Allow multiple lines */
51
+ multiLine?: boolean;
52
+ }
53
+
54
+ /**
55
+ * Combo box control properties
56
+ */
57
+ export interface ComboBoxProperties {
58
+ /** List of items */
59
+ items: ListItem[];
60
+ /** Last selected value */
61
+ lastValue?: string;
62
+ }
63
+
64
+ /**
65
+ * Dropdown list control properties
66
+ */
67
+ export interface DropDownListProperties {
68
+ /** List of items */
69
+ items: ListItem[];
70
+ /** Last selected value */
71
+ lastValue?: string;
72
+ }
73
+
74
+ /**
75
+ * Date picker control properties
76
+ */
77
+ export interface DatePickerProperties {
78
+ /** Date format string (e.g., 'M/d/yyyy') */
79
+ dateFormat?: string;
80
+ /** Full date value */
81
+ fullDate?: Date;
82
+ /** Locale ID */
83
+ lid?: string;
84
+ /** Calendar type */
85
+ calendar?:
86
+ | "gregorian"
87
+ | "hijri"
88
+ | "hebrew"
89
+ | "taiwan"
90
+ | "japan"
91
+ | "thai"
92
+ | "korean";
93
+ }
94
+
95
+ /**
96
+ * Checkbox control properties
97
+ */
98
+ export interface CheckboxProperties {
99
+ /** Whether the checkbox is checked */
100
+ checked?: boolean;
101
+ /** Character code for checked state (default: '2612' - ☒) */
102
+ checkedState?: string;
103
+ /** Character code for unchecked state (default: '2610' - ☐) */
104
+ uncheckedState?: string;
105
+ }
106
+
107
+ /**
108
+ * Building block control properties
109
+ */
110
+ export interface BuildingBlockProperties {
111
+ /** Building block gallery name */
112
+ gallery?: string;
113
+ /** Building block category */
114
+ category?: string;
115
+ }
116
+
117
+ /**
118
+ * Properties for a Structured Document Tag
119
+ */
120
+ export interface SDTProperties {
121
+ /** Unique ID for this SDT */
122
+ id?: number;
123
+ /** Tag value (used by applications) */
124
+ tag?: string;
125
+ /** Lock type */
126
+ lock?: SDTLockType;
127
+ /** Alias (display name) */
128
+ alias?: string;
129
+ /** Temporary placeholder (removed when content is edited) */
130
+ temporary?: boolean;
131
+ /** Content control type */
132
+ controlType?: ContentControlType;
133
+ /** Plain text properties */
134
+ plainText?: PlainTextProperties;
135
+ /** Combo box properties */
136
+ comboBox?: ComboBoxProperties;
137
+ /** Dropdown list properties */
138
+ dropDownList?: DropDownListProperties;
139
+ /** Date picker properties */
140
+ datePicker?: DatePickerProperties;
141
+ /** Checkbox properties */
142
+ checkbox?: CheckboxProperties;
143
+ /** Building block properties */
144
+ buildingBlock?: BuildingBlockProperties;
145
+ }
146
+
147
+ /**
148
+ * Content that can be wrapped by an SDT
149
+ */
150
+ export type SDTContent = Table | Paragraph | StructuredDocumentTag;
151
+
152
+ /**
153
+ * Structured Document Tag class
154
+ * Wraps content with metadata and control settings
155
+ *
156
+ * Example XML:
157
+ * ```xml
158
+ * <w:sdt>
159
+ * <w:sdtPr>
160
+ * <w:lock w:val="contentLocked"/>
161
+ * <w:id w:val="-258490443"/>
162
+ * <w:tag w:val="goog_rdk_0"/>
163
+ * </w:sdtPr>
164
+ * <w:sdtContent>
165
+ * <!-- content here -->
166
+ * </w:sdtContent>
167
+ * </w:sdt>
168
+ * ```
169
+ */
170
+ export class StructuredDocumentTag {
171
+ private properties: SDTProperties;
172
+ private content: SDTContent[];
173
+
174
+ /**
175
+ * Create a new Structured Document Tag
176
+ * @param properties - SDT properties
177
+ * @param content - Content elements to wrap
178
+ */
179
+ constructor(properties: SDTProperties = {}, content: SDTContent[] = []) {
180
+ this.properties = properties;
181
+ this.content = content;
182
+ }
183
+
184
+ /**
185
+ * Get the SDT ID
186
+ * @returns SDT ID or undefined
187
+ */
188
+ getId(): number | undefined {
189
+ return this.properties.id;
190
+ }
191
+
192
+ /**
193
+ * Set the SDT ID
194
+ * @param id - Unique ID
195
+ */
196
+ setId(id: number): this {
197
+ this.properties.id = id;
198
+ return this;
199
+ }
200
+
201
+ /**
202
+ * Get the SDT tag
203
+ * @returns Tag value or undefined
204
+ */
205
+ getTag(): string | undefined {
206
+ return this.properties.tag;
207
+ }
208
+
209
+ /**
210
+ * Set the SDT tag
211
+ * @param tag - Tag value
212
+ */
213
+ setTag(tag: string): this {
214
+ this.properties.tag = tag;
215
+ return this;
216
+ }
217
+
218
+ /**
219
+ * Get the lock type
220
+ * @returns Lock type or undefined
221
+ */
222
+ getLock(): SDTLockType | undefined {
223
+ return this.properties.lock;
224
+ }
225
+
226
+ /**
227
+ * Set the lock type
228
+ * @param lock - Lock type
229
+ */
230
+ setLock(lock: SDTLockType): this {
231
+ this.properties.lock = lock;
232
+ return this;
233
+ }
234
+
235
+ /**
236
+ * Get the alias (display name)
237
+ * @returns Alias or undefined
238
+ */
239
+ getAlias(): string | undefined {
240
+ return this.properties.alias;
241
+ }
242
+
243
+ /**
244
+ * Set the alias (display name)
245
+ * @param alias - Display name
246
+ */
247
+ setAlias(alias: string): this {
248
+ this.properties.alias = alias;
249
+ return this;
250
+ }
251
+
252
+ /**
253
+ * Get the content control type
254
+ * @returns Control type or undefined
255
+ */
256
+ getControlType(): ContentControlType | undefined {
257
+ return this.properties.controlType;
258
+ }
259
+
260
+ /**
261
+ * Set the content control type
262
+ * @param type - Control type
263
+ */
264
+ setControlType(type: ContentControlType): this {
265
+ this.properties.controlType = type;
266
+ return this;
267
+ }
268
+
269
+ /**
270
+ * Get plain text properties
271
+ * @returns Plain text properties or undefined
272
+ */
273
+ getPlainTextProperties(): PlainTextProperties | undefined {
274
+ return this.properties.plainText;
275
+ }
276
+
277
+ /**
278
+ * Set plain text properties
279
+ * @param properties - Plain text properties
280
+ */
281
+ setPlainTextProperties(properties: PlainTextProperties): this {
282
+ this.properties.controlType = "plainText";
283
+ this.properties.plainText = properties;
284
+ return this;
285
+ }
286
+
287
+ /**
288
+ * Get combo box properties
289
+ * @returns Combo box properties or undefined
290
+ */
291
+ getComboBoxProperties(): ComboBoxProperties | undefined {
292
+ return this.properties.comboBox;
293
+ }
294
+
295
+ /**
296
+ * Set combo box properties
297
+ * @param properties - Combo box properties
298
+ */
299
+ setComboBoxProperties(properties: ComboBoxProperties): this {
300
+ this.properties.controlType = "comboBox";
301
+ this.properties.comboBox = properties;
302
+ return this;
303
+ }
304
+
305
+ /**
306
+ * Get dropdown list properties
307
+ * @returns Dropdown list properties or undefined
308
+ */
309
+ getDropDownListProperties(): DropDownListProperties | undefined {
310
+ return this.properties.dropDownList;
311
+ }
312
+
313
+ /**
314
+ * Set dropdown list properties
315
+ * @param properties - Dropdown list properties
316
+ */
317
+ setDropDownListProperties(properties: DropDownListProperties): this {
318
+ this.properties.controlType = "dropDownList";
319
+ this.properties.dropDownList = properties;
320
+ return this;
321
+ }
322
+
323
+ /**
324
+ * Get date picker properties
325
+ * @returns Date picker properties or undefined
326
+ */
327
+ getDatePickerProperties(): DatePickerProperties | undefined {
328
+ return this.properties.datePicker;
329
+ }
330
+
331
+ /**
332
+ * Set date picker properties
333
+ * @param properties - Date picker properties
334
+ */
335
+ setDatePickerProperties(properties: DatePickerProperties): this {
336
+ this.properties.controlType = "datePicker";
337
+ this.properties.datePicker = properties;
338
+ return this;
339
+ }
340
+
341
+ /**
342
+ * Get checkbox properties
343
+ * @returns Checkbox properties or undefined
344
+ */
345
+ getCheckboxProperties(): CheckboxProperties | undefined {
346
+ return this.properties.checkbox;
347
+ }
348
+
349
+ /**
350
+ * Set checkbox properties
351
+ * @param properties - Checkbox properties
352
+ */
353
+ setCheckboxProperties(properties: CheckboxProperties): this {
354
+ this.properties.controlType = "checkbox";
355
+ this.properties.checkbox = properties;
356
+ return this;
357
+ }
358
+
359
+ /**
360
+ * Get building block properties
361
+ * @returns Building block properties or undefined
362
+ */
363
+ getBuildingBlockProperties(): BuildingBlockProperties | undefined {
364
+ return this.properties.buildingBlock;
365
+ }
366
+
367
+ /**
368
+ * Alias for getBuildingBlockProperties() for backward compatibility
369
+ * @returns Building block properties or undefined
370
+ */
371
+ getBuildingBlock(): BuildingBlockProperties | undefined {
372
+ return this.getBuildingBlockProperties();
373
+ }
374
+
375
+ /**
376
+ * Set building block properties
377
+ * @param properties - Building block properties
378
+ */
379
+ setBuildingBlockProperties(properties: BuildingBlockProperties): this {
380
+ this.properties.controlType = "buildingBlock";
381
+ this.properties.buildingBlock = properties;
382
+ return this;
383
+ }
384
+
385
+ /**
386
+ * Get list items from combo box or dropdown list
387
+ * @returns List items or undefined if not a list control
388
+ */
389
+ getListItems(): ListItem[] | undefined {
390
+ if (this.properties.comboBox) {
391
+ return this.properties.comboBox.items;
392
+ }
393
+ if (this.properties.dropDownList) {
394
+ return this.properties.dropDownList.items;
395
+ }
396
+ return undefined;
397
+ }
398
+
399
+ /**
400
+ * Get date format from date picker
401
+ * @returns Date format string or undefined
402
+ */
403
+ getDateFormat(): string | undefined {
404
+ return this.properties.datePicker?.dateFormat;
405
+ }
406
+
407
+ /**
408
+ * Get checked state from checkbox
409
+ * @returns True if checkbox is checked, false otherwise
410
+ */
411
+ isChecked(): boolean {
412
+ return this.properties.checkbox?.checked ?? false;
413
+ }
414
+
415
+ /**
416
+ * Get temporary state
417
+ * Temporary SDTs are placeholders removed when content is edited
418
+ * @returns True if SDT is temporary (placeholder), false otherwise
419
+ */
420
+ isTemporary(): boolean {
421
+ return this.properties.temporary === true;
422
+ }
423
+
424
+ /**
425
+ * Set whether SDT is temporary
426
+ * @param temporary - Whether SDT is temporary
427
+ * @returns This instance for chaining
428
+ */
429
+ setTemporary(temporary: boolean): this {
430
+ this.properties.temporary = temporary;
431
+ return this;
432
+ }
433
+
434
+ /**
435
+ * Get all content elements
436
+ * @returns Array of content elements
437
+ */
438
+ getContent(): SDTContent[] {
439
+ return [...this.content];
440
+ }
441
+
442
+ /**
443
+ * Add content element
444
+ * @param element - Element to add
445
+ */
446
+ addContent(element: SDTContent): this {
447
+ this.content.push(element);
448
+ return this;
449
+ }
450
+
451
+ /**
452
+ * Clear all content
453
+ */
454
+ clearContent(): this {
455
+ this.content = [];
456
+ return this;
457
+ }
458
+
459
+ /**
460
+ * Generate XML for this SDT
461
+ * @returns XML element
462
+ */
463
+ toXML(): XMLElement {
464
+ const children: XMLElement[] = [];
465
+
466
+ // Build sdtPr (properties)
467
+ const sdtPrChildren: XMLElement[] = [];
468
+
469
+ if (this.properties.lock) {
470
+ sdtPrChildren.push(
471
+ XMLBuilder.wSelf("lock", { "w:val": this.properties.lock })
472
+ );
473
+ }
474
+
475
+ if (this.properties.id !== undefined) {
476
+ sdtPrChildren.push(
477
+ XMLBuilder.wSelf("id", { "w:val": this.properties.id.toString() })
478
+ );
479
+ }
480
+
481
+ if (this.properties.tag) {
482
+ sdtPrChildren.push(
483
+ XMLBuilder.wSelf("tag", { "w:val": this.properties.tag })
484
+ );
485
+ }
486
+
487
+ if (this.properties.alias) {
488
+ sdtPrChildren.push(
489
+ XMLBuilder.wSelf("alias", { "w:val": this.properties.alias })
490
+ );
491
+ }
492
+
493
+ // Add control type-specific XML
494
+ if (this.properties.controlType) {
495
+ switch (this.properties.controlType) {
496
+ case "richText":
497
+ sdtPrChildren.push(XMLBuilder.wSelf("richText", {}));
498
+ break;
499
+
500
+ case "plainText":
501
+ if (this.properties.plainText) {
502
+ const attrs: Record<string, string> = {};
503
+ if (this.properties.plainText.multiLine !== undefined) {
504
+ attrs["w:multiLine"] = this.properties.plainText.multiLine
505
+ ? "1"
506
+ : "0";
507
+ }
508
+ sdtPrChildren.push(XMLBuilder.wSelf("text", attrs));
509
+ } else {
510
+ sdtPrChildren.push(XMLBuilder.wSelf("text", {}));
511
+ }
512
+ break;
513
+
514
+ case "comboBox":
515
+ if (this.properties.comboBox) {
516
+ const comboBoxChildren: XMLElement[] = [];
517
+ for (const item of this.properties.comboBox.items) {
518
+ comboBoxChildren.push(
519
+ XMLBuilder.wSelf("listItem", {
520
+ "w:displayText": item.displayText,
521
+ "w:value": item.value,
522
+ })
523
+ );
524
+ }
525
+ sdtPrChildren.push(XMLBuilder.w("comboBox", {}, comboBoxChildren));
526
+ }
527
+ break;
528
+
529
+ case "dropDownList":
530
+ if (this.properties.dropDownList) {
531
+ const dropDownChildren: XMLElement[] = [];
532
+ for (const item of this.properties.dropDownList.items) {
533
+ dropDownChildren.push(
534
+ XMLBuilder.wSelf("listItem", {
535
+ "w:displayText": item.displayText,
536
+ "w:value": item.value,
537
+ })
538
+ );
539
+ }
540
+ sdtPrChildren.push(
541
+ XMLBuilder.w("dropDownList", {}, dropDownChildren)
542
+ );
543
+ }
544
+ break;
545
+
546
+ case "datePicker":
547
+ if (this.properties.datePicker) {
548
+ // Per ECMA-376, w:date has w:fullDate as attribute; dateFormat, lid,
549
+ // storeMappedDataAs, and calendar are child elements with w:val
550
+ const dateAttrs: Record<string, string> = {};
551
+ if (this.properties.datePicker.fullDate) {
552
+ dateAttrs["w:fullDate"] =
553
+ this.properties.datePicker.fullDate.toISOString();
554
+ }
555
+ const dateChildren: XMLElement[] = [];
556
+ if (this.properties.datePicker.dateFormat) {
557
+ dateChildren.push(XMLBuilder.wSelf("dateFormat", {
558
+ "w:val": this.properties.datePicker.dateFormat,
559
+ }));
560
+ }
561
+ if (this.properties.datePicker.lid) {
562
+ dateChildren.push(XMLBuilder.wSelf("lid", {
563
+ "w:val": this.properties.datePicker.lid,
564
+ }));
565
+ }
566
+ if (this.properties.datePicker.calendar) {
567
+ dateChildren.push(XMLBuilder.wSelf("calendar", {
568
+ "w:val": this.properties.datePicker.calendar,
569
+ }));
570
+ }
571
+ if (dateChildren.length > 0) {
572
+ sdtPrChildren.push(XMLBuilder.w("date", dateAttrs, dateChildren));
573
+ } else {
574
+ sdtPrChildren.push(XMLBuilder.wSelf("date", dateAttrs));
575
+ }
576
+ }
577
+ break;
578
+
579
+ case "checkbox":
580
+ if (this.properties.checkbox) {
581
+ const checkboxChildren: XMLElement[] = [];
582
+
583
+ // Add checked state - use w14 namespace per OOXML spec
584
+ if (this.properties.checkbox.checked !== undefined) {
585
+ checkboxChildren.push(
586
+ XMLBuilder.w14Self("checked", {
587
+ "w14:val": this.properties.checkbox.checked ? "1" : "0",
588
+ })
589
+ );
590
+ }
591
+
592
+ // Add checked state symbol - use w14 namespace per OOXML spec
593
+ if (this.properties.checkbox.checkedState) {
594
+ checkboxChildren.push(
595
+ XMLBuilder.w14Self("checkedState", {
596
+ "w14:val": this.properties.checkbox.checkedState,
597
+ "w14:font": "MS Gothic",
598
+ })
599
+ );
600
+ }
601
+
602
+ // Add unchecked state symbol - use w14 namespace per OOXML spec
603
+ if (this.properties.checkbox.uncheckedState) {
604
+ checkboxChildren.push(
605
+ XMLBuilder.w14Self("uncheckedState", {
606
+ "w14:val": this.properties.checkbox.uncheckedState,
607
+ "w14:font": "MS Gothic",
608
+ })
609
+ );
610
+ }
611
+
612
+ sdtPrChildren.push(
613
+ XMLBuilder.w14("checkbox", {}, checkboxChildren)
614
+ );
615
+ }
616
+ break;
617
+
618
+ case "picture":
619
+ sdtPrChildren.push(XMLBuilder.wSelf("picture", {}));
620
+ break;
621
+
622
+ case "buildingBlock":
623
+ if (this.properties.buildingBlock) {
624
+ const bbChildren: XMLElement[] = [];
625
+ if (this.properties.buildingBlock.gallery) {
626
+ bbChildren.push(
627
+ XMLBuilder.wSelf("docPartGallery", {
628
+ "w:val": this.properties.buildingBlock.gallery,
629
+ })
630
+ );
631
+ }
632
+ if (this.properties.buildingBlock.category) {
633
+ bbChildren.push(
634
+ XMLBuilder.wSelf("docPartCategory", {
635
+ "w:val": this.properties.buildingBlock.category,
636
+ })
637
+ );
638
+ }
639
+ sdtPrChildren.push(XMLBuilder.w("docPartObj", {}, bbChildren));
640
+ }
641
+ break;
642
+
643
+ case "group":
644
+ sdtPrChildren.push(XMLBuilder.wSelf("group", {}));
645
+ break;
646
+ }
647
+ }
648
+
649
+ if (sdtPrChildren.length > 0) {
650
+ children.push(XMLBuilder.w("sdtPr", {}, sdtPrChildren));
651
+ }
652
+
653
+ // Build sdtContent
654
+ const sdtContentChildren: XMLElement[] = [];
655
+ for (const element of this.content) {
656
+ sdtContentChildren.push(element.toXML());
657
+ }
658
+
659
+ children.push(XMLBuilder.w("sdtContent", {}, sdtContentChildren));
660
+
661
+ return XMLBuilder.w("sdt", {}, children);
662
+ }
663
+
664
+ /**
665
+ * Create an SDT wrapping a table (common for Google Docs)
666
+ * @param table - Table to wrap
667
+ * @param tag - Optional tag value
668
+ * @param lock - Optional lock type (default: unlocked for editability)
669
+ * @returns New SDT instance
670
+ * @example
671
+ * ```typescript
672
+ * // Unlocked table (editable in Word) - RECOMMENDED
673
+ * const sdt = StructuredDocumentTag.wrapTable(table);
674
+ *
675
+ * // Locked table (read-only in Word)
676
+ * const lockedSdt = StructuredDocumentTag.wrapTable(table, 'my-table', 'contentLocked');
677
+ * ```
678
+ */
679
+ static wrapTable(
680
+ table: Table,
681
+ tag = "goog_rdk_0",
682
+ lock?: SDTLockType
683
+ ): StructuredDocumentTag {
684
+ return new StructuredDocumentTag(
685
+ {
686
+ id: Date.now() % 1000000000, // Generate a reasonable ID
687
+ tag,
688
+ lock, // Only set if provided - defaults to unlocked
689
+ },
690
+ [table]
691
+ );
692
+ }
693
+
694
+ /**
695
+ * Create an SDT wrapping a paragraph
696
+ * @param paragraph - Paragraph to wrap
697
+ * @param tag - Optional tag value
698
+ * @returns New SDT instance
699
+ */
700
+ static wrapParagraph(
701
+ paragraph: Paragraph,
702
+ tag?: string
703
+ ): StructuredDocumentTag {
704
+ return new StructuredDocumentTag(
705
+ {
706
+ id: Date.now() % 1000000000,
707
+ tag,
708
+ },
709
+ [paragraph]
710
+ );
711
+ }
712
+
713
+ /**
714
+ * Create an empty SDT
715
+ * @param properties - SDT properties
716
+ * @returns New SDT instance
717
+ */
718
+ static create(properties: SDTProperties = {}): StructuredDocumentTag {
719
+ return new StructuredDocumentTag(properties);
720
+ }
721
+
722
+ /**
723
+ * Create a rich text content control
724
+ * @param content - Initial content
725
+ * @param properties - Additional SDT properties
726
+ * @returns New SDT instance
727
+ */
728
+ static createRichText(
729
+ content: SDTContent[] = [],
730
+ properties: Partial<SDTProperties> = {}
731
+ ): StructuredDocumentTag {
732
+ return new StructuredDocumentTag(
733
+ {
734
+ id: Date.now() % 1000000000,
735
+ controlType: "richText",
736
+ ...properties,
737
+ },
738
+ content
739
+ );
740
+ }
741
+
742
+ /**
743
+ * Create a plain text content control
744
+ * @param content - Initial content
745
+ * @param multiLine - Allow multiple lines
746
+ * @param properties - Additional SDT properties
747
+ * @returns New SDT instance
748
+ */
749
+ static createPlainText(
750
+ content: SDTContent[] = [],
751
+ multiLine = false,
752
+ properties: Partial<SDTProperties> = {}
753
+ ): StructuredDocumentTag {
754
+ return new StructuredDocumentTag(
755
+ {
756
+ id: Date.now() % 1000000000,
757
+ controlType: "plainText",
758
+ plainText: { multiLine },
759
+ ...properties,
760
+ },
761
+ content
762
+ );
763
+ }
764
+
765
+ /**
766
+ * Create a combo box content control
767
+ * @param items - List items
768
+ * @param content - Initial content
769
+ * @param properties - Additional SDT properties
770
+ * @returns New SDT instance
771
+ */
772
+ static createComboBox(
773
+ items: ListItem[],
774
+ content: SDTContent[] = [],
775
+ properties: Partial<SDTProperties> = {}
776
+ ): StructuredDocumentTag {
777
+ return new StructuredDocumentTag(
778
+ {
779
+ id: Date.now() % 1000000000,
780
+ controlType: "comboBox",
781
+ comboBox: { items },
782
+ ...properties,
783
+ },
784
+ content
785
+ );
786
+ }
787
+
788
+ /**
789
+ * Create a dropdown list content control
790
+ * @param items - List items
791
+ * @param content - Initial content
792
+ * @param properties - Additional SDT properties
793
+ * @returns New SDT instance
794
+ */
795
+ static createDropDownList(
796
+ items: ListItem[],
797
+ content: SDTContent[] = [],
798
+ properties: Partial<SDTProperties> = {}
799
+ ): StructuredDocumentTag {
800
+ return new StructuredDocumentTag(
801
+ {
802
+ id: Date.now() % 1000000000,
803
+ controlType: "dropDownList",
804
+ dropDownList: { items },
805
+ ...properties,
806
+ },
807
+ content
808
+ );
809
+ }
810
+
811
+ /**
812
+ * Create a date picker content control
813
+ * @param dateFormat - Date format string (e.g., 'M/d/yyyy')
814
+ * @param content - Initial content
815
+ * @param properties - Additional SDT properties
816
+ * @returns New SDT instance
817
+ */
818
+ static createDatePicker(
819
+ dateFormat = "M/d/yyyy",
820
+ content: SDTContent[] = [],
821
+ properties: Partial<SDTProperties> = {}
822
+ ): StructuredDocumentTag {
823
+ return new StructuredDocumentTag(
824
+ {
825
+ id: Date.now() % 1000000000,
826
+ controlType: "datePicker",
827
+ datePicker: { dateFormat },
828
+ ...properties,
829
+ },
830
+ content
831
+ );
832
+ }
833
+
834
+ /**
835
+ * Create a checkbox content control
836
+ * @param checked - Initial checked state
837
+ * @param content - Initial content
838
+ * @param properties - Additional SDT properties
839
+ * @returns New SDT instance
840
+ */
841
+ static createCheckbox(
842
+ checked = false,
843
+ content: SDTContent[] = [],
844
+ properties: Partial<SDTProperties> = {}
845
+ ): StructuredDocumentTag {
846
+ return new StructuredDocumentTag(
847
+ {
848
+ id: Date.now() % 1000000000,
849
+ controlType: "checkbox",
850
+ checkbox: {
851
+ checked,
852
+ checkedState: "2612", // ☒
853
+ uncheckedState: "2610", // ☐
854
+ },
855
+ ...properties,
856
+ },
857
+ content
858
+ );
859
+ }
860
+
861
+ /**
862
+ * Create a picture content control
863
+ * @param content - Initial content (typically contains an image)
864
+ * @param properties - Additional SDT properties
865
+ * @returns New SDT instance
866
+ */
867
+ static createPicture(
868
+ content: SDTContent[] = [],
869
+ properties: Partial<SDTProperties> = {}
870
+ ): StructuredDocumentTag {
871
+ return new StructuredDocumentTag(
872
+ {
873
+ id: Date.now() % 1000000000,
874
+ controlType: "picture",
875
+ ...properties,
876
+ },
877
+ content
878
+ );
879
+ }
880
+
881
+ /**
882
+ * Create a building block content control
883
+ * @param gallery - Building block gallery name
884
+ * @param category - Building block category
885
+ * @param content - Initial content
886
+ * @param properties - Additional SDT properties
887
+ * @returns New SDT instance
888
+ */
889
+ static createBuildingBlock(
890
+ gallery: string,
891
+ category: string,
892
+ content: SDTContent[] = [],
893
+ properties: Partial<SDTProperties> = {}
894
+ ): StructuredDocumentTag {
895
+ return new StructuredDocumentTag(
896
+ {
897
+ id: Date.now() % 1000000000,
898
+ controlType: "buildingBlock",
899
+ buildingBlock: { gallery, category },
900
+ ...properties,
901
+ },
902
+ content
903
+ );
904
+ }
905
+
906
+ /**
907
+ * Create a group content control
908
+ * @param content - Initial content
909
+ * @param properties - Additional SDT properties
910
+ * @returns New SDT instance
911
+ */
912
+ static createGroup(
913
+ content: SDTContent[] = [],
914
+ properties: Partial<SDTProperties> = {}
915
+ ): StructuredDocumentTag {
916
+ return new StructuredDocumentTag(
917
+ {
918
+ id: Date.now() % 1000000000,
919
+ controlType: "group",
920
+ lock: "sdtContentLocked", // Groups typically lock content
921
+ ...properties,
922
+ },
923
+ content
924
+ );
925
+ }
926
+
927
+ /**
928
+ * Unlocks the SDT content (allows editing)
929
+ * Removes any lock that prevents content modification
930
+ * @returns This SDT for chaining
931
+ * @example
932
+ * ```typescript
933
+ * // Unlock a locked SDT to enable editing
934
+ * sdt.unlock();
935
+ *
936
+ * // Chain with other modifications
937
+ * sdt.unlock().setTag('editable-content');
938
+ * ```
939
+ */
940
+ unlock(): this {
941
+ delete this.properties.lock;
942
+ return this;
943
+ }
944
+
945
+ /**
946
+ * Checks if SDT content is locked in any way
947
+ * @returns True if content is locked (contentLocked, sdtLocked, or sdtContentLocked)
948
+ * @example
949
+ * ```typescript
950
+ * if (sdt.isLocked()) {
951
+ * console.log('SDT is locked - unlocking for editing');
952
+ * sdt.unlock();
953
+ * }
954
+ * ```
955
+ */
956
+ isLocked(): boolean {
957
+ const lock = this.properties.lock;
958
+ return (
959
+ lock === "contentLocked" ||
960
+ lock === "sdtContentLocked" ||
961
+ lock === "sdtLocked"
962
+ );
963
+ }
964
+
965
+ /**
966
+ * Checks if SDT content can be edited by users
967
+ * @returns True if content can be modified (not locked by contentLocked or sdtContentLocked)
968
+ * @example
969
+ * ```typescript
970
+ * const editable = sdt.isContentEditable();
971
+ * console.log(editable ? 'Can edit' : 'Cannot edit');
972
+ * ```
973
+ */
974
+ isContentEditable(): boolean {
975
+ const lock = this.properties.lock;
976
+ return lock !== "contentLocked" && lock !== "sdtContentLocked";
977
+ }
978
+ }