@syncfusion/ej2-docx 0.0.0-stage → 35.1.40

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 (417) hide show
  1. package/.gitleaksignore +35 -0
  2. package/README.md +68 -2
  3. package/core.js +4 -0
  4. package/dist/ej2-docx.umd.min.js +11 -0
  5. package/dist/ej2-docx.umd.min.js.map +1 -0
  6. package/dist/es6/ej2-docx.es2015.js +66697 -0
  7. package/dist/es6/ej2-docx.es2015.js.map +1 -0
  8. package/dist/es6/ej2-docx.es5.js +77568 -0
  9. package/dist/es6/ej2-docx.es5.js.map +1 -0
  10. package/dist/global/ej2-docx.min.js +11 -0
  11. package/dist/global/ej2-docx.min.js.map +1 -0
  12. package/dist/global/index.d.ts +14 -0
  13. package/features.js +4 -0
  14. package/index.js +4 -0
  15. package/license +10 -0
  16. package/package.json +30 -3
  17. package/src/all.d.ts +50 -0
  18. package/src/all.js +147 -0
  19. package/src/core/compat/base64.d.ts +13 -0
  20. package/src/core/compat/base64.js +90 -0
  21. package/src/core/compat/object-compat.d.ts +30 -0
  22. package/src/core/compat/object-compat.js +40 -0
  23. package/src/core/compat/sha256.d.ts +9 -0
  24. package/src/core/compat/sha256.js +98 -0
  25. package/src/core/errors/docx-error.d.ts +89 -0
  26. package/src/core/errors/docx-error.js +138 -0
  27. package/src/core/errors/error-codes.d.ts +8 -0
  28. package/src/core/errors/error-codes.js +0 -0
  29. package/src/core/errors/index.d.ts +10 -0
  30. package/src/core/errors/index.js +9 -0
  31. package/src/core/index.d.ts +12 -0
  32. package/src/core/index.js +12 -0
  33. package/src/core/mc/alternate-content.d.ts +7 -0
  34. package/src/core/mc/alternate-content.js +67 -0
  35. package/src/core/mc/attributes.d.ts +24 -0
  36. package/src/core/mc/attributes.js +82 -0
  37. package/src/core/mc/index.d.ts +7 -0
  38. package/src/core/mc/index.js +5 -0
  39. package/src/core/mc/inspect.d.ts +16 -0
  40. package/src/core/mc/inspect.js +148 -0
  41. package/src/core/mc/namespaces.d.ts +4 -0
  42. package/src/core/mc/namespaces.js +4 -0
  43. package/src/core/mc/scope.d.ts +6 -0
  44. package/src/core/mc/scope.js +47 -0
  45. package/src/core/opc/content-types.d.ts +34 -0
  46. package/src/core/opc/content-types.js +162 -0
  47. package/src/core/opc/index.d.ts +8 -0
  48. package/src/core/opc/index.js +4 -0
  49. package/src/core/opc/package.d.ts +49 -0
  50. package/src/core/opc/package.js +324 -0
  51. package/src/core/opc/part-name.d.ts +47 -0
  52. package/src/core/opc/part-name.js +205 -0
  53. package/src/core/opc/relationships.d.ts +46 -0
  54. package/src/core/opc/relationships.js +212 -0
  55. package/src/core/preservation/index.d.ts +2 -0
  56. package/src/core/preservation/index.js +1 -0
  57. package/src/core/preservation/opaque-body.d.ts +16 -0
  58. package/src/core/preservation/opaque-body.js +69 -0
  59. package/src/core/registry/block-handlers.d.ts +30 -0
  60. package/src/core/registry/block-handlers.js +36 -0
  61. package/src/core/registry/create-defaults.d.ts +39 -0
  62. package/src/core/registry/create-defaults.js +42 -0
  63. package/src/core/registry/feature-registry.d.ts +20 -0
  64. package/src/core/registry/feature-registry.js +29 -0
  65. package/src/core/registry/index.d.ts +9 -0
  66. package/src/core/registry/index.js +8 -0
  67. package/src/core/registry/inline-handlers.d.ts +20 -0
  68. package/src/core/registry/inline-handlers.js +30 -0
  69. package/src/core/registry/materialize-handlers.d.ts +35 -0
  70. package/src/core/registry/materialize-handlers.js +75 -0
  71. package/src/core/registry/multi-part-handlers.d.ts +37 -0
  72. package/src/core/registry/multi-part-handlers.js +206 -0
  73. package/src/core/registry/package-part-handlers.d.ts +28 -0
  74. package/src/core/registry/package-part-handlers.js +190 -0
  75. package/src/core/registry/part-handlers.d.ts +24 -0
  76. package/src/core/registry/part-handlers.js +172 -0
  77. package/src/core/registry/run-leaf-handlers.d.ts +26 -0
  78. package/src/core/registry/run-leaf-handlers.js +72 -0
  79. package/src/core/security/limits.d.ts +40 -0
  80. package/src/core/security/limits.js +26 -0
  81. package/src/core/xml/index.d.ts +7 -0
  82. package/src/core/xml/index.js +3 -0
  83. package/src/core/xml/model.d.ts +66 -0
  84. package/src/core/xml/model.js +17 -0
  85. package/src/core/xml/parse.d.ts +12 -0
  86. package/src/core/xml/parse.js +382 -0
  87. package/src/core/xml/serialize.d.ts +6 -0
  88. package/src/core/xml/serialize.js +93 -0
  89. package/src/core/zip/crc32.d.ts +2 -0
  90. package/src/core/zip/crc32.js +25 -0
  91. package/src/core/zip/deflate.d.ts +6 -0
  92. package/src/core/zip/deflate.js +6 -0
  93. package/src/core/zip/index.d.ts +10 -0
  94. package/src/core/zip/index.js +4 -0
  95. package/src/core/zip/inflate-raw.d.ts +17 -0
  96. package/src/core/zip/inflate-raw.js +450 -0
  97. package/src/core/zip/names.d.ts +6 -0
  98. package/src/core/zip/names.js +52 -0
  99. package/src/core/zip/read.d.ts +8 -0
  100. package/src/core/zip/read.js +262 -0
  101. package/src/core/zip/write.d.ts +7 -0
  102. package/src/core/zip/write.js +189 -0
  103. package/src/core/zip/zip-entry.d.ts +4 -0
  104. package/src/core/zip/zip-entry.js +0 -0
  105. package/src/features/bibliography/index.d.ts +100 -0
  106. package/src/features/bibliography/index.js +290 -0
  107. package/src/features/bookmarks/index.d.ts +331 -0
  108. package/src/features/bookmarks/index.js +1009 -0
  109. package/src/features/comments/comment-extensions.d.ts +157 -0
  110. package/src/features/comments/comment-extensions.js +356 -0
  111. package/src/features/comments/index.d.ts +579 -0
  112. package/src/features/comments/index.js +1727 -0
  113. package/src/features/content-controls/index.d.ts +821 -0
  114. package/src/features/content-controls/index.js +2857 -0
  115. package/src/features/custom-xml/index.d.ts +236 -0
  116. package/src/features/custom-xml/index.js +661 -0
  117. package/src/features/document/alignment.d.ts +23 -0
  118. package/src/features/document/alignment.js +36 -0
  119. package/src/features/document/alt-chunk.d.ts +103 -0
  120. package/src/features/document/alt-chunk.js +221 -0
  121. package/src/features/document/assert-never.d.ts +1 -0
  122. package/src/features/document/assert-never.js +4 -0
  123. package/src/features/document/augmentations.d.ts +578 -0
  124. package/src/features/document/augmentations.js +0 -0
  125. package/src/features/document/body-always-on.d.ts +36 -0
  126. package/src/features/document/body-always-on.js +66 -0
  127. package/src/features/document/body-blocks.d.ts +7 -0
  128. package/src/features/document/body-blocks.js +78 -0
  129. package/src/features/document/body-item-adapters.d.ts +62 -0
  130. package/src/features/document/body-item-adapters.js +97 -0
  131. package/src/features/document/body-item-collection.d.ts +151 -0
  132. package/src/features/document/body-item-collection.js +440 -0
  133. package/src/features/document/body-item.d.ts +35 -0
  134. package/src/features/document/body-item.js +8 -0
  135. package/src/features/document/body.d.ts +150 -0
  136. package/src/features/document/body.js +263 -0
  137. package/src/features/document/character-format.d.ts +413 -0
  138. package/src/features/document/character-format.js +2054 -0
  139. package/src/features/document/color.d.ts +178 -0
  140. package/src/features/document/color.js +495 -0
  141. package/src/features/document/document.d.ts +410 -0
  142. package/src/features/document/document.js +1049 -0
  143. package/src/features/document/element-type.d.ts +68 -0
  144. package/src/features/document/element-type.js +133 -0
  145. package/src/features/document/entity-type.d.ts +92 -0
  146. package/src/features/document/entity-type.js +93 -0
  147. package/src/features/document/feature-block.d.ts +16 -0
  148. package/src/features/document/feature-block.js +0 -0
  149. package/src/features/document/feature-inline.d.ts +13 -0
  150. package/src/features/document/feature-inline.js +0 -0
  151. package/src/features/document/feature-multi-package-part.d.ts +19 -0
  152. package/src/features/document/feature-multi-package-part.js +8 -0
  153. package/src/features/document/feature-package-level-part.d.ts +18 -0
  154. package/src/features/document/feature-package-level-part.js +8 -0
  155. package/src/features/document/feature-package-part.d.ts +14 -0
  156. package/src/features/document/feature-package-part.js +0 -0
  157. package/src/features/document/feature-run-leaf.d.ts +9 -0
  158. package/src/features/document/feature-run-leaf.js +0 -0
  159. package/src/features/document/headers-footers.d.ts +206 -0
  160. package/src/features/document/headers-footers.js +384 -0
  161. package/src/features/document/index.d.ts +41 -0
  162. package/src/features/document/index.js +34 -0
  163. package/src/features/document/length.d.ts +152 -0
  164. package/src/features/document/length.js +245 -0
  165. package/src/features/document/load-options.d.ts +14 -0
  166. package/src/features/document/load-options.js +0 -0
  167. package/src/features/document/locale-ids.d.ts +227 -0
  168. package/src/features/document/locale-ids.js +485 -0
  169. package/src/features/document/on-off.d.ts +9 -0
  170. package/src/features/document/on-off.js +27 -0
  171. package/src/features/document/page-setup.d.ts +339 -0
  172. package/src/features/document/page-setup.js +244 -0
  173. package/src/features/document/paragraph-format.d.ts +880 -0
  174. package/src/features/document/paragraph-format.js +2807 -0
  175. package/src/features/document/paragraph-item-collection.d.ts +162 -0
  176. package/src/features/document/paragraph-item-collection.js +363 -0
  177. package/src/features/document/paragraph-item.d.ts +83 -0
  178. package/src/features/document/paragraph-item.js +103 -0
  179. package/src/features/document/paragraph.d.ts +435 -0
  180. package/src/features/document/paragraph.js +888 -0
  181. package/src/features/document/run.d.ts +1 -0
  182. package/src/features/document/run.js +768 -0
  183. package/src/features/document/section-partition-flatten.d.ts +124 -0
  184. package/src/features/document/section-partition-flatten.js +217 -0
  185. package/src/features/document/section-properties-model.d.ts +13 -0
  186. package/src/features/document/section-properties-model.js +0 -0
  187. package/src/features/document/section.d.ts +93 -0
  188. package/src/features/document/section.js +178 -0
  189. package/src/features/document/sections.d.ts +103 -0
  190. package/src/features/document/sections.js +217 -0
  191. package/src/features/document/sub-super-script.d.ts +23 -0
  192. package/src/features/document/sub-super-script.js +43 -0
  193. package/src/features/document/text-range.d.ts +445 -0
  194. package/src/features/document/text-range.js +1156 -0
  195. package/src/features/document/typed-body-collections.d.ts +162 -0
  196. package/src/features/document/typed-body-collections.js +371 -0
  197. package/src/features/document/underline-style.d.ts +38 -0
  198. package/src/features/document/underline-style.js +126 -0
  199. package/src/features/document/units.d.ts +8 -0
  200. package/src/features/document/units.js +7 -0
  201. package/src/features/document/wml.d.ts +16 -0
  202. package/src/features/document/wml.js +67 -0
  203. package/src/features/drawing/authoring.d.ts +27 -0
  204. package/src/features/drawing/authoring.js +271 -0
  205. package/src/features/drawing/body-pr.d.ts +271 -0
  206. package/src/features/drawing/body-pr.js +663 -0
  207. package/src/features/drawing/drawing-shape.d.ts +1192 -0
  208. package/src/features/drawing/drawing-shape.js +3239 -0
  209. package/src/features/drawing/encode-builders.d.ts +176 -0
  210. package/src/features/drawing/encode-builders.js +390 -0
  211. package/src/features/drawing/fill-format.d.ts +52 -0
  212. package/src/features/drawing/fill-format.js +124 -0
  213. package/src/features/drawing/host-codec.d.ts +632 -0
  214. package/src/features/drawing/host-codec.js +2595 -0
  215. package/src/features/drawing/index.d.ts +13 -0
  216. package/src/features/drawing/index.js +33 -0
  217. package/src/features/drawing/line-format.d.ts +76 -0
  218. package/src/features/drawing/line-format.js +343 -0
  219. package/src/features/drawing/parse-register.d.ts +50 -0
  220. package/src/features/drawing/parse-register.js +257 -0
  221. package/src/features/drawing/residual-utils.d.ts +47 -0
  222. package/src/features/drawing/residual-utils.js +290 -0
  223. package/src/features/drawing/shape-types.d.ts +433 -0
  224. package/src/features/drawing/shape-types.js +437 -0
  225. package/src/features/drawing/sp-pr.d.ts +396 -0
  226. package/src/features/drawing/sp-pr.js +610 -0
  227. package/src/features/drawing/text-frame.d.ts +90 -0
  228. package/src/features/drawing/text-frame.js +152 -0
  229. package/src/features/drawing/types.d.ts +352 -0
  230. package/src/features/drawing/types.js +60 -0
  231. package/src/features/drawing/wrap-format.d.ts +62 -0
  232. package/src/features/drawing/wrap-format.js +114 -0
  233. package/src/features/editable-ranges/index.d.ts +494 -0
  234. package/src/features/editable-ranges/index.js +1348 -0
  235. package/src/features/fields/index.d.ts +428 -0
  236. package/src/features/fields/index.js +2148 -0
  237. package/src/features/fields/paragraph-field.d.ts +187 -0
  238. package/src/features/fields/paragraph-field.js +692 -0
  239. package/src/features/font-table/font-substitution-table.d.ts +75 -0
  240. package/src/features/font-table/font-substitution-table.js +257 -0
  241. package/src/features/font-table/font-table-entry.d.ts +255 -0
  242. package/src/features/font-table/font-table-entry.js +823 -0
  243. package/src/features/font-table/font-table.d.ts +128 -0
  244. package/src/features/font-table/font-table.js +313 -0
  245. package/src/features/font-table/index.d.ts +27 -0
  246. package/src/features/font-table/index.js +48 -0
  247. package/src/features/glossary/index.d.ts +97 -0
  248. package/src/features/glossary/index.js +286 -0
  249. package/src/features/headers-footers/index.d.ts +506 -0
  250. package/src/features/headers-footers/index.js +1666 -0
  251. package/src/features/hyperlinks/index.d.ts +230 -0
  252. package/src/features/hyperlinks/index.js +685 -0
  253. package/src/features/images/caption-authoring-api.d.ts +33 -0
  254. package/src/features/images/caption-authoring-api.js +33 -0
  255. package/src/features/images/caption-enums.d.ts +52 -0
  256. package/src/features/images/caption-enums.js +141 -0
  257. package/src/features/images/caption-host.d.ts +10 -0
  258. package/src/features/images/caption-host.js +21 -0
  259. package/src/features/images/captions.d.ts +13 -0
  260. package/src/features/images/captions.js +142 -0
  261. package/src/features/images/host-codec.d.ts +103 -0
  262. package/src/features/images/host-codec.js +720 -0
  263. package/src/features/images/image-sniff.d.ts +21 -0
  264. package/src/features/images/image-sniff.js +71 -0
  265. package/src/features/images/index.d.ts +506 -0
  266. package/src/features/images/index.js +1429 -0
  267. package/src/features/images/layout-types.d.ts +232 -0
  268. package/src/features/images/layout-types.js +294 -0
  269. package/src/features/images/public-entry.d.ts +9 -0
  270. package/src/features/images/public-entry.js +9 -0
  271. package/src/features/index.d.ts +35 -0
  272. package/src/features/index.js +36 -0
  273. package/src/features/mail-merge/index.d.ts +113 -0
  274. package/src/features/mail-merge/index.js +315 -0
  275. package/src/features/notes/index.d.ts +573 -0
  276. package/src/features/notes/index.js +1725 -0
  277. package/src/features/numbering/abstract-numbering.d.ts +90 -0
  278. package/src/features/numbering/abstract-numbering.js +292 -0
  279. package/src/features/numbering/index.d.ts +182 -0
  280. package/src/features/numbering/index.js +668 -0
  281. package/src/features/numbering/list-format.d.ts +158 -0
  282. package/src/features/numbering/list-format.js +590 -0
  283. package/src/features/numbering/list-string.d.ts +7 -0
  284. package/src/features/numbering/list-string.js +423 -0
  285. package/src/features/numbering/list-style.d.ts +204 -0
  286. package/src/features/numbering/list-style.js +1084 -0
  287. package/src/features/numbering/numbering-instance.d.ts +101 -0
  288. package/src/features/numbering/numbering-instance.js +329 -0
  289. package/src/features/numbering/numbering-level.d.ts +118 -0
  290. package/src/features/numbering/numbering-level.js +501 -0
  291. package/src/features/numbering/picture-bullet.d.ts +34 -0
  292. package/src/features/numbering/picture-bullet.js +88 -0
  293. package/src/features/ole-object/catalog.d.ts +300 -0
  294. package/src/features/ole-object/catalog.js +908 -0
  295. package/src/features/ole-object/index.d.ts +526 -0
  296. package/src/features/ole-object/index.js +1421 -0
  297. package/src/features/ole-object/relationship.d.ts +27 -0
  298. package/src/features/ole-object/relationship.js +27 -0
  299. package/src/features/ole-object/typed-dom.d.ts +186 -0
  300. package/src/features/ole-object/typed-dom.js +595 -0
  301. package/src/features/properties/index.d.ts +205 -0
  302. package/src/features/properties/index.js +549 -0
  303. package/src/features/revisions/index.d.ts +204 -0
  304. package/src/features/revisions/index.js +695 -0
  305. package/src/features/sections/column-collection.d.ts +119 -0
  306. package/src/features/sections/column-collection.js +478 -0
  307. package/src/features/sections/column.d.ts +15 -0
  308. package/src/features/sections/column.js +37 -0
  309. package/src/features/sections/index.d.ts +91 -0
  310. package/src/features/sections/index.js +1096 -0
  311. package/src/features/sections/margins.d.ts +40 -0
  312. package/src/features/sections/margins.js +105 -0
  313. package/src/features/sections/page-number-style.d.ts +21 -0
  314. package/src/features/sections/page-number-style.js +62 -0
  315. package/src/features/sections/page-orientation.d.ts +10 -0
  316. package/src/features/sections/page-orientation.js +10 -0
  317. package/src/features/sections/page-setup.d.ts +435 -0
  318. package/src/features/sections/page-setup.js +1479 -0
  319. package/src/features/sections/page-size.d.ts +59 -0
  320. package/src/features/sections/page-size.js +68 -0
  321. package/src/features/sections/section-break-code.d.ts +27 -0
  322. package/src/features/sections/section-break-code.js +60 -0
  323. package/src/features/sections/section-document-association.d.ts +18 -0
  324. package/src/features/sections/section-document-association.js +31 -0
  325. package/src/features/sections/section-validation.d.ts +43 -0
  326. package/src/features/sections/section-validation.js +97 -0
  327. package/src/features/settings/attached-template.d.ts +35 -0
  328. package/src/features/settings/attached-template.js +98 -0
  329. package/src/features/settings/compat-settings.d.ts +216 -0
  330. package/src/features/settings/compat-settings.js +508 -0
  331. package/src/features/settings/document-background.d.ts +59 -0
  332. package/src/features/settings/document-background.js +131 -0
  333. package/src/features/settings/document-protection.d.ts +65 -0
  334. package/src/features/settings/document-protection.js +157 -0
  335. package/src/features/settings/document-settings-facades.d.ts +108 -0
  336. package/src/features/settings/document-settings-facades.js +312 -0
  337. package/src/features/settings/document-settings-values.d.ts +43 -0
  338. package/src/features/settings/document-settings-values.js +60 -0
  339. package/src/features/settings/footnote-properties.d.ts +211 -0
  340. package/src/features/settings/footnote-properties.js +591 -0
  341. package/src/features/settings/index.d.ts +356 -0
  342. package/src/features/settings/index.js +829 -0
  343. package/src/features/settings/settings-children.d.ts +151 -0
  344. package/src/features/settings/settings-children.js +505 -0
  345. package/src/features/settings/web-settings.d.ts +88 -0
  346. package/src/features/settings/web-settings.js +227 -0
  347. package/src/features/settings/zoom.d.ts +79 -0
  348. package/src/features/settings/zoom.js +147 -0
  349. package/src/features/styles/builtin-catalog.d.ts +159 -0
  350. package/src/features/styles/builtin-catalog.js +963 -0
  351. package/src/features/styles/builtin-resolver.d.ts +49 -0
  352. package/src/features/styles/builtin-resolver.js +165 -0
  353. package/src/features/styles/default-styles.d.ts +37 -0
  354. package/src/features/styles/default-styles.js +186 -0
  355. package/src/features/styles/default-theme.d.ts +13 -0
  356. package/src/features/styles/default-theme.js +13 -0
  357. package/src/features/styles/doc-defaults.d.ts +58 -0
  358. package/src/features/styles/doc-defaults.js +178 -0
  359. package/src/features/styles/formatting-resolver.d.ts +27 -0
  360. package/src/features/styles/formatting-resolver.js +72 -0
  361. package/src/features/styles/index.d.ts +256 -0
  362. package/src/features/styles/index.js +1325 -0
  363. package/src/features/styles/latent-styles.d.ts +68 -0
  364. package/src/features/styles/latent-styles.js +305 -0
  365. package/src/features/styles/paragraph-properties.d.ts +71 -0
  366. package/src/features/styles/paragraph-properties.js +237 -0
  367. package/src/features/styles/run-properties.d.ts +93 -0
  368. package/src/features/styles/run-properties.js +516 -0
  369. package/src/features/styles/style-base.d.ts +402 -0
  370. package/src/features/styles/style-base.js +1026 -0
  371. package/src/features/styles/style-collection.d.ts +264 -0
  372. package/src/features/styles/style-collection.js +714 -0
  373. package/src/features/styles/style-format-bridge.d.ts +64 -0
  374. package/src/features/styles/style-format-bridge.js +100 -0
  375. package/src/features/styles/style.d.ts +84 -0
  376. package/src/features/styles/style.js +375 -0
  377. package/src/features/styles/styles-with-effects.d.ts +71 -0
  378. package/src/features/styles/styles-with-effects.js +180 -0
  379. package/src/features/styles/table-style.d.ts +272 -0
  380. package/src/features/styles/table-style.js +1226 -0
  381. package/src/features/styles/theme.d.ts +126 -0
  382. package/src/features/styles/theme.js +377 -0
  383. package/src/features/tables/border-style-map.d.ts +24 -0
  384. package/src/features/tables/border-style-map.js +81 -0
  385. package/src/features/tables/borders.d.ts +126 -0
  386. package/src/features/tables/borders.js +527 -0
  387. package/src/features/tables/collections.d.ts +113 -0
  388. package/src/features/tables/collections.js +261 -0
  389. package/src/features/tables/format.d.ts +208 -0
  390. package/src/features/tables/format.js +716 -0
  391. package/src/features/tables/index.d.ts +597 -0
  392. package/src/features/tables/index.js +2386 -0
  393. package/src/features/tables/paddings.d.ts +41 -0
  394. package/src/features/tables/paddings.js +97 -0
  395. package/src/features/tables/tbl-pr-positioning.d.ts +27 -0
  396. package/src/features/tables/tbl-pr-positioning.js +178 -0
  397. package/src/features/tables/tbl-pr.d.ts +528 -0
  398. package/src/features/tables/tbl-pr.js +1208 -0
  399. package/src/features/tables/tc-pr.d.ts +168 -0
  400. package/src/features/tables/tc-pr.js +553 -0
  401. package/src/features/tables/tr-pr.d.ts +60 -0
  402. package/src/features/tables/tr-pr.js +215 -0
  403. package/src/features/watermark/detect.d.ts +76 -0
  404. package/src/features/watermark/detect.js +219 -0
  405. package/src/features/watermark/index.d.ts +28 -0
  406. package/src/features/watermark/index.js +91 -0
  407. package/src/features/watermark/logical-store.d.ts +29 -0
  408. package/src/features/watermark/logical-store.js +31 -0
  409. package/src/features/watermark/model.d.ts +285 -0
  410. package/src/features/watermark/model.js +597 -0
  411. package/src/features/watermark/parse.d.ts +84 -0
  412. package/src/features/watermark/parse.js +815 -0
  413. package/src/features/watermark/serialize.d.ts +98 -0
  414. package/src/features/watermark/serialize.js +1517 -0
  415. package/src/global.js +1 -0
  416. package/src/index.d.ts +2 -0
  417. package/src/index.js +2 -0
@@ -0,0 +1,1009 @@
1
+ var __read = (this && this.__read) || function (o, n) {
2
+ var m = typeof Symbol === "function" && o[Symbol.iterator];
3
+ if (!m) return o;
4
+ var i = m.call(o), r, ar = [], e;
5
+ try {
6
+ while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
7
+ }
8
+ catch (error) { e = { error: error }; }
9
+ finally {
10
+ try {
11
+ if (r && !r.done && (m = i["return"])) m.call(i);
12
+ }
13
+ finally { if (e) throw e.error; }
14
+ }
15
+ return ar;
16
+ };
17
+ var __spread = (this && this.__spread) || function () {
18
+ for (var ar = [], i = 0; i < arguments.length; i++) ar = ar.concat(__read(arguments[i]));
19
+ return ar;
20
+ };
21
+ var __values = (this && this.__values) || function (o) {
22
+ var m = typeof Symbol === "function" && o[Symbol.iterator], i = 0;
23
+ if (m) return m.call(o);
24
+ return {
25
+ next: function () {
26
+ if (o && i >= o.length) o = void 0;
27
+ return { value: o && o[i++], done: !o };
28
+ }
29
+ };
30
+ };
31
+ import { DocxError } from '../../core/errors/docx-error';
32
+ import { registerAlwaysOnBodyFeatureBootstrap } from '../document/body-always-on';
33
+ import { WordDocument } from '../document/document';
34
+ import { Paragraph } from '../document/paragraph';
35
+ import { FeatureInlineParagraphItem, } from '../document/text-range';
36
+ import { isWml, wmlAttr, wmlElement } from '../document/wml';
37
+ import { featureId, registerFeature, registerFeatureInlineHandler, registerFeatureMaterializeHandler, visitParagraphsInDocumentOrder, } from '../../core/registry/index';
38
+ var BOOKMARKS = featureId('bookmarks');
39
+ /**
40
+ * Attributes the bookmark model consumes; everything else is residual.
41
+ *
42
+ * @private
43
+ */
44
+ var MODELED_ATTRIBUTE_LOCAL_NAMES = [
45
+ 'id',
46
+ 'name',
47
+ 'colFirst',
48
+ 'colLast',
49
+ ];
50
+ function wmlAttribute(el, localName) {
51
+ var __ts33_0;
52
+ return ((__ts33_0 = el.attributes.find(function (a) { return a.localName === localName && (a.namespaceUri === '' || a.prefix === 'w'); })), __ts33_0 == null ? undefined : __ts33_0.value);
53
+ }
54
+ function isWmlAttribute(a) {
55
+ return a.prefix === 'w' || a.namespaceUri === '' || a.namespaceUri.indexOf('wordprocessingml') >= 0;
56
+ }
57
+ /**
58
+ * Residual attributes for lossless serialize.
59
+ *
60
+ * Modeled local names are omitted only when their values were successfully
61
+ * consumed. Invalid modeled values stay residual so they round-trip.
62
+ *
63
+ * @private
64
+ */
65
+ function residualAttributesOf(el, consumedLocalNames) {
66
+ return el.attributes.filter(function (a) {
67
+ if (a.localName === 'space' && a.prefix === 'xml') {
68
+ return false;
69
+ }
70
+ if (isWmlAttribute(a) && MODELED_ATTRIBUTE_LOCAL_NAMES.indexOf(a.localName) !== -1) {
71
+ return !consumedLocalNames.has(a.localName);
72
+ }
73
+ return true;
74
+ });
75
+ }
76
+ function parseBookmarkId(raw) {
77
+ if (raw === undefined || !/^\d+$/.test(raw)) {
78
+ return undefined;
79
+ }
80
+ return Number.parseInt(raw, 10);
81
+ }
82
+ function parseColumnIndex(raw) {
83
+ return parseBookmarkId(raw);
84
+ }
85
+ /**
86
+ * Whether `name` is usable as `w:name` (non-empty after rejecting whitespace-only).
87
+ *
88
+ * @private
89
+ */
90
+ function isValidBookmarkName(name) {
91
+ if (name.length === 0) {
92
+ return false;
93
+ }
94
+ // Reject whitespace-only names (DocIO / Word authoring parity).
95
+ for (var i = 0; i < name.length; i += 1) {
96
+ var c = name.charCodeAt(i);
97
+ if (c !== 0x20 && c !== 0x09 && c !== 0x0a && c !== 0x0d) {
98
+ return true;
99
+ }
100
+ }
101
+ return false;
102
+ }
103
+ function assertValidBookmarkName(name) {
104
+ if (!isValidBookmarkName(name)) {
105
+ throw new DocxError('content/invalid-bookmark', 'Bookmark name must not be empty');
106
+ }
107
+ }
108
+ function assertNonNegativeInteger(value, label) {
109
+ if (typeof value !== 'number' || !Number.isFinite(value) || value < 0 || Math.floor(value) !== value) {
110
+ throw new DocxError('content/invalid-bookmark', label + ' must be a non-negative integer');
111
+ }
112
+ }
113
+ /**
114
+ * Bookmark range start marker (`w:bookmarkStart`, ECMA-376-1 §17.13.6.2).
115
+ *
116
+ * Paired with a {@link BookmarkEnd} that shares the same internal package id.
117
+ * Public surface is {@link BookmarkStart.name} and optional table column span
118
+ * (`firstColumn` / `lastColumn`). Pairing id stays internal.
119
+ *
120
+ * @remarks
121
+ * - `name` maps `w:name`; empty or whitespace-only names are rejected.
122
+ * - `firstColumn` / `lastColumn` map `w:colFirst` / `w:colLast` (zero-based).
123
+ * - `undefined` means the column attribute is absent on serialize.
124
+ * - Residual attributes outside the modeled set round-trip verbatim.
125
+ *
126
+ * @public
127
+ */
128
+ var BookmarkStart = /** @class */ (function () {
129
+ /**
130
+ * @private
131
+ */
132
+ function BookmarkStart(bookmarkId, name, options) {
133
+ assertValidBookmarkName(name);
134
+ this.bookmarkIdValue = bookmarkId;
135
+ this.nameValue = name;
136
+ this.firstColumnValue = options == null ? undefined : options.firstColumn;
137
+ this.lastColumnValue = options == null ? undefined : options.lastColumn;
138
+ this.residual = (options == null ? undefined : options.residualAttributes) !== undefined
139
+ ? __spread(options.residualAttributes) : [];
140
+ }
141
+ Object.defineProperty(BookmarkStart.prototype, "bookmarkId", {
142
+ /**
143
+ * Bookmark identifier shared with the paired end marker (`w:id`).
144
+ *
145
+ * @private
146
+ */
147
+ get: function () {
148
+ return this.bookmarkIdValue;
149
+ },
150
+ enumerable: true,
151
+ configurable: true
152
+ });
153
+ Object.defineProperty(BookmarkStart.prototype, "name", {
154
+ /**
155
+ * Bookmark name (`w:name`). Must be non-empty and not whitespace-only.
156
+ *
157
+ * Setting an invalid name throws {@link DocxError} with code
158
+ * `content/invalid-bookmark`.
159
+ */
160
+ get: function () {
161
+ return this.nameValue;
162
+ },
163
+ set: function (value) {
164
+ assertValidBookmarkName(value);
165
+ this.nameValue = value;
166
+ },
167
+ enumerable: true,
168
+ configurable: true
169
+ });
170
+ Object.defineProperty(BookmarkStart.prototype, "firstColumn", {
171
+ /**
172
+ * Zero-based first table column of the bookmark (`w:colFirst`).
173
+ *
174
+ * `undefined` means the attribute is absent. Assigning `undefined` clears it.
175
+ */
176
+ get: function () {
177
+ return this.firstColumnValue;
178
+ },
179
+ set: function (value) {
180
+ if (value !== undefined) {
181
+ assertNonNegativeInteger(value, 'firstColumn');
182
+ }
183
+ this.firstColumnValue = value;
184
+ },
185
+ enumerable: true,
186
+ configurable: true
187
+ });
188
+ Object.defineProperty(BookmarkStart.prototype, "lastColumn", {
189
+ /**
190
+ * Zero-based last table column of the bookmark (`w:colLast`).
191
+ *
192
+ * `undefined` means the attribute is absent. Assigning `undefined` clears it.
193
+ */
194
+ get: function () {
195
+ return this.lastColumnValue;
196
+ },
197
+ set: function (value) {
198
+ if (value !== undefined) {
199
+ assertNonNegativeInteger(value, 'lastColumn');
200
+ }
201
+ this.lastColumnValue = value;
202
+ },
203
+ enumerable: true,
204
+ configurable: true
205
+ });
206
+ /**
207
+ * Assigns the package `w:id` used to pair start and end markers.
208
+ *
209
+ * @private
210
+ */
211
+ BookmarkStart.prototype.setBookmarkId = function (bookmarkId) {
212
+ this.bookmarkIdValue = bookmarkId;
213
+ };
214
+ /**
215
+ * Whether this marker still holds a temporary negative id before save materialization.
216
+ *
217
+ * @private
218
+ */
219
+ BookmarkStart.prototype.isPendingBookmarkId = function () {
220
+ return this.bookmarkIdValue < 0;
221
+ };
222
+ /**
223
+ * @private
224
+ * Residual attributes preserved for lossless serialization.
225
+ */
226
+ BookmarkStart.prototype.residualAttributes = function () {
227
+ return this.residual;
228
+ };
229
+ /**
230
+ * No-op detach hook for {@link FeatureInline} parity.
231
+ *
232
+ * @private
233
+ */
234
+ BookmarkStart.prototype.releaseContent = function () {
235
+ return;
236
+ };
237
+ /**
238
+ * Serializes this marker to `w:bookmarkStart`.
239
+ *
240
+ * @private
241
+ */
242
+ BookmarkStart.prototype.toOpenXml = function () {
243
+ var attributes = [
244
+ wmlAttr('id', String(this.bookmarkIdValue)),
245
+ wmlAttr('name', this.nameValue),
246
+ ];
247
+ if (this.firstColumnValue !== undefined) {
248
+ attributes.push(wmlAttr('colFirst', String(this.firstColumnValue)));
249
+ }
250
+ if (this.lastColumnValue !== undefined) {
251
+ attributes.push(wmlAttr('colLast', String(this.lastColumnValue)));
252
+ }
253
+ attributes.push.apply(attributes, __spread(this.residual));
254
+ return wmlElement('bookmarkStart', { attributes: attributes });
255
+ };
256
+ return BookmarkStart;
257
+ }());
258
+ export { BookmarkStart };
259
+ /**
260
+ * Bookmark range end marker (`w:bookmarkEnd`, ECMA-376-1 §17.13.6.1).
261
+ *
262
+ * Closes the range opened by a matching {@link BookmarkStart}. Pairing uses the
263
+ * internal package id; {@link BookmarkEnd.name} is a public convenience mirror
264
+ * of the start name when paired (settable independently for authoring symmetry
265
+ * with DocIO). OOXML `bookmarkEnd` serializes `w:id` only.
266
+ *
267
+ * @public
268
+ */
269
+ var BookmarkEnd = /** @class */ (function () {
270
+ /**
271
+ * @private
272
+ */
273
+ function BookmarkEnd(bookmarkId, name) {
274
+ this.bookmarkIdValue = bookmarkId;
275
+ this.nameValue = name !== undefined ? name : '';
276
+ }
277
+ Object.defineProperty(BookmarkEnd.prototype, "bookmarkId", {
278
+ /**
279
+ * Bookmark identifier shared with the paired start marker (`w:id`).
280
+ *
281
+ * @private
282
+ */
283
+ get: function () {
284
+ return this.bookmarkIdValue;
285
+ },
286
+ enumerable: true,
287
+ configurable: true
288
+ });
289
+ Object.defineProperty(BookmarkEnd.prototype, "name", {
290
+ /**
291
+ * Bookmark name convenience on the end marker (DocIO parity).
292
+ *
293
+ * Empty string is allowed on the end marker itself (schema has no `w:name`
294
+ * on `bookmarkEnd`). When set to a non-empty value, whitespace-only is
295
+ * rejected. Pairing always uses internal id, never this name.
296
+ */
297
+ get: function () {
298
+ return this.nameValue;
299
+ },
300
+ set: function (value) {
301
+ if (value.length > 0) {
302
+ assertValidBookmarkName(value);
303
+ }
304
+ this.nameValue = value;
305
+ },
306
+ enumerable: true,
307
+ configurable: true
308
+ });
309
+ /**
310
+ * Assigns the package `w:id` used to pair start and end markers.
311
+ *
312
+ * @private
313
+ */
314
+ BookmarkEnd.prototype.setBookmarkId = function (bookmarkId) {
315
+ this.bookmarkIdValue = bookmarkId;
316
+ };
317
+ /**
318
+ * Whether this marker still holds a temporary negative id before save materialization.
319
+ *
320
+ * @private
321
+ */
322
+ BookmarkEnd.prototype.isPendingBookmarkId = function () {
323
+ return this.bookmarkIdValue < 0;
324
+ };
325
+ /**
326
+ * No-op detach hook for {@link FeatureInline} parity.
327
+ *
328
+ * @private
329
+ */
330
+ BookmarkEnd.prototype.releaseContent = function () {
331
+ return;
332
+ };
333
+ /**
334
+ * Serializes this marker to `w:bookmarkEnd`.
335
+ *
336
+ * @private
337
+ */
338
+ BookmarkEnd.prototype.toOpenXml = function () {
339
+ return wmlElement('bookmarkEnd', {
340
+ attributes: [wmlAttr('id', String(this.bookmarkIdValue))],
341
+ });
342
+ };
343
+ return BookmarkEnd;
344
+ }());
345
+ export { BookmarkEnd };
346
+ /**
347
+ * Live view over a paired {@link BookmarkStart} / {@link BookmarkEnd}.
348
+ *
349
+ * Does not own markup or cache enclosed content: markers remain paragraph
350
+ * inlines (possibly in different paragraphs). Property reads/writes for name
351
+ * and column span go through the start marker. Empty ranges and arbitrary
352
+ * content between markers are valid.
353
+ *
354
+ * Discover via {@link WordDocument.bookmarks} / {@link BookmarkCollection}.
355
+ *
356
+ * @public
357
+ */
358
+ var Bookmark = /** @class */ (function () {
359
+ /**
360
+ * @private
361
+ */
362
+ function Bookmark(start, end) {
363
+ this.startMarkerValue = start;
364
+ this.endMarkerValue = end;
365
+ // Keep end-name convenience in sync when constructed from a start pair.
366
+ if (this.endMarkerValue.name.length === 0 && start.name.length > 0) {
367
+ this.endMarkerValue.name = start.name;
368
+ }
369
+ }
370
+ Object.defineProperty(Bookmark.prototype, "name", {
371
+ /**
372
+ * Bookmark name (`w:name` on the start marker). Read-only on the pair view;
373
+ * rename via {@link BookmarkStart.name} / {@link bookmarkStart}.
374
+ */
375
+ get: function () {
376
+ return this.startMarkerValue.name;
377
+ },
378
+ enumerable: true,
379
+ configurable: true
380
+ });
381
+ Object.defineProperty(Bookmark.prototype, "bookmarkStart", {
382
+ /**
383
+ * Start marker for this bookmark.
384
+ */
385
+ get: function () {
386
+ return this.startMarkerValue;
387
+ },
388
+ enumerable: true,
389
+ configurable: true
390
+ });
391
+ Object.defineProperty(Bookmark.prototype, "bookmarkEnd", {
392
+ /**
393
+ * End marker for this bookmark.
394
+ */
395
+ get: function () {
396
+ return this.endMarkerValue;
397
+ },
398
+ enumerable: true,
399
+ configurable: true
400
+ });
401
+ Object.defineProperty(Bookmark.prototype, "firstColumn", {
402
+ /**
403
+ * Zero-based first table column (`w:colFirst` on the start marker).
404
+ */
405
+ get: function () {
406
+ return this.startMarkerValue.firstColumn;
407
+ },
408
+ set: function (value) {
409
+ this.startMarkerValue.firstColumn = value;
410
+ },
411
+ enumerable: true,
412
+ configurable: true
413
+ });
414
+ Object.defineProperty(Bookmark.prototype, "lastColumn", {
415
+ /**
416
+ * Zero-based last table column (`w:colLast` on the start marker).
417
+ */
418
+ get: function () {
419
+ return this.startMarkerValue.lastColumn;
420
+ },
421
+ set: function (value) {
422
+ this.startMarkerValue.lastColumn = value;
423
+ },
424
+ enumerable: true,
425
+ configurable: true
426
+ });
427
+ Object.defineProperty(Bookmark.prototype, "bookmarkId", {
428
+ /**
429
+ * Identifier shared by the start and end markers (`w:id`).
430
+ *
431
+ * @private
432
+ */
433
+ get: function () {
434
+ return this.startMarkerValue.bookmarkId;
435
+ },
436
+ enumerable: true,
437
+ configurable: true
438
+ });
439
+ Object.defineProperty(Bookmark.prototype, "startMarker", {
440
+ /**
441
+ * Start marker (internal alias of {@link bookmarkStart}).
442
+ *
443
+ * @private
444
+ */
445
+ get: function () {
446
+ return this.startMarkerValue;
447
+ },
448
+ enumerable: true,
449
+ configurable: true
450
+ });
451
+ Object.defineProperty(Bookmark.prototype, "endMarker", {
452
+ /**
453
+ * End marker (internal alias of {@link bookmarkEnd}).
454
+ *
455
+ * @private
456
+ */
457
+ get: function () {
458
+ return this.endMarkerValue;
459
+ },
460
+ enumerable: true,
461
+ configurable: true
462
+ });
463
+ return Bookmark;
464
+ }());
465
+ export { Bookmark };
466
+ function parseBookmarkStart(element) {
467
+ if (!isWml(element, 'bookmarkStart')) {
468
+ return undefined;
469
+ }
470
+ var bookmarkId = parseBookmarkId(wmlAttribute(element, 'id'));
471
+ var name = wmlAttribute(element, 'name');
472
+ if (bookmarkId === undefined || name === undefined || !isValidBookmarkName(name)) {
473
+ return undefined;
474
+ }
475
+ var consumed = new Set();
476
+ consumed.add('id');
477
+ consumed.add('name');
478
+ var firstColumnRaw = wmlAttribute(element, 'colFirst');
479
+ var firstColumn = parseColumnIndex(firstColumnRaw);
480
+ if (firstColumnRaw !== undefined && firstColumn !== undefined) {
481
+ consumed.add('colFirst');
482
+ }
483
+ var lastColumnRaw = wmlAttribute(element, 'colLast');
484
+ var lastColumn = parseColumnIndex(lastColumnRaw);
485
+ if (lastColumnRaw !== undefined && lastColumn !== undefined) {
486
+ consumed.add('colLast');
487
+ }
488
+ return new BookmarkStart(bookmarkId, name, {
489
+ firstColumn: firstColumn,
490
+ lastColumn: lastColumn,
491
+ residualAttributes: residualAttributesOf(element, consumed),
492
+ });
493
+ }
494
+ function parseBookmarkEnd(element) {
495
+ if (!isWml(element, 'bookmarkEnd')) {
496
+ return undefined;
497
+ }
498
+ var bookmarkId = parseBookmarkId(wmlAttribute(element, 'id'));
499
+ if (bookmarkId === undefined) {
500
+ return undefined;
501
+ }
502
+ return new BookmarkEnd(bookmarkId);
503
+ }
504
+ /**
505
+ * Collect bookmark markers from all paragraphs in document order
506
+ * (main story + nested feature paragraphs such as table cells).
507
+ *
508
+ * @private
509
+ */
510
+ function collectBookmarkMarkersInDocumentOrder(document) {
511
+ var markers = [];
512
+ visitParagraphsInDocumentOrder(document, function (paragraph) {
513
+ var content = paragraph.items.toArray();
514
+ for (var i = 0; i < content.length; i += 1) {
515
+ var inline = content[i];
516
+ if (inline === undefined || !(inline instanceof FeatureInlineParagraphItem)) {
517
+ continue;
518
+ }
519
+ if (inline.value instanceof BookmarkStart || inline.value instanceof BookmarkEnd) {
520
+ markers.push(inline.value);
521
+ }
522
+ }
523
+ });
524
+ return markers;
525
+ }
526
+ function collectBookmarkIds(document, visit) {
527
+ var markers = collectBookmarkMarkersInDocumentOrder(document);
528
+ for (var i = 0; i < markers.length; i += 1) {
529
+ visit(markers[i].bookmarkId);
530
+ }
531
+ }
532
+ function usedBookmarkIds(document) {
533
+ var used = new Set();
534
+ collectBookmarkIds(document, function (bookmarkId) {
535
+ used.add(bookmarkId);
536
+ });
537
+ return used;
538
+ }
539
+ function allocatePendingBookmarkId(document) {
540
+ var used = usedBookmarkIds(document);
541
+ var candidate = -1;
542
+ while (used.has(candidate)) {
543
+ candidate -= 1;
544
+ }
545
+ return candidate;
546
+ }
547
+ function materializeBookmarkIds(document) {
548
+ var remap = new Map();
549
+ var nextId = 0;
550
+ collectBookmarkIds(document, function (bookmarkId) {
551
+ if (bookmarkId >= 0 && bookmarkId >= nextId) {
552
+ nextId = bookmarkId + 1;
553
+ }
554
+ });
555
+ visitParagraphsInDocumentOrder(document, function (paragraph) {
556
+ var e_1, _a;
557
+ try {
558
+ for (var _b = __values(paragraph.items), _c = _b.next(); !_c.done; _c = _b.next()) {
559
+ var inline = _c.value;
560
+ if (!(inline instanceof FeatureInlineParagraphItem)) {
561
+ continue;
562
+ }
563
+ if (inline.value instanceof BookmarkStart && inline.value.isPendingBookmarkId()) {
564
+ var pendingId = inline.value.bookmarkId;
565
+ var resolved = remap.get(pendingId);
566
+ if (resolved === undefined) {
567
+ resolved = nextId;
568
+ nextId += 1;
569
+ remap.set(pendingId, resolved);
570
+ }
571
+ inline.value.setBookmarkId(resolved);
572
+ }
573
+ if (inline.value instanceof BookmarkEnd && inline.value.isPendingBookmarkId()) {
574
+ var pendingId = inline.value.bookmarkId;
575
+ var resolved = remap.get(pendingId);
576
+ if (resolved === undefined) {
577
+ resolved = nextId;
578
+ nextId += 1;
579
+ remap.set(pendingId, resolved);
580
+ }
581
+ inline.value.setBookmarkId(resolved);
582
+ }
583
+ }
584
+ }
585
+ catch (e_1_1) { e_1 = { error: e_1_1 }; }
586
+ finally {
587
+ try {
588
+ if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
589
+ }
590
+ finally { if (e_1) throw e_1.error; }
591
+ }
592
+ });
593
+ }
594
+ function allocateBookmarkId(document) {
595
+ return allocatePendingBookmarkId(document);
596
+ }
597
+ /** Stable Bookmark identity for a start marker while its paired end is unchanged. */
598
+ var bookmarkByStart = new WeakMap();
599
+ /**
600
+ * Pair starts to ends in document order (ECMA one-start/one-end by id).
601
+ *
602
+ * For each start, the matching end is the first subsequent unpaired end with
603
+ * the same id. Duplicate starts before an end: first start pairs; later starts
604
+ * remain unpaired. Orphan ends remain unpaired. All markers stay in the DOM.
605
+ *
606
+ * @private
607
+ */
608
+ function pairBookmarks(markers) {
609
+ var pairedEnd = new Set();
610
+ var ranges = [];
611
+ for (var i = 0; i < markers.length; i += 1) {
612
+ var marker = markers[i];
613
+ if (!(marker instanceof BookmarkStart)) {
614
+ continue;
615
+ }
616
+ var start = marker;
617
+ for (var j = i + 1; j < markers.length; j += 1) {
618
+ var candidate = markers[j];
619
+ if (!(candidate instanceof BookmarkEnd)) {
620
+ continue;
621
+ }
622
+ if (candidate.bookmarkId !== start.bookmarkId) {
623
+ continue;
624
+ }
625
+ if (pairedEnd.has(candidate)) {
626
+ continue;
627
+ }
628
+ pairedEnd.add(candidate);
629
+ var bookmark = bookmarkByStart.get(start);
630
+ if (bookmark === undefined || bookmark.bookmarkEnd !== candidate) {
631
+ bookmark = new Bookmark(start, candidate);
632
+ bookmarkByStart.set(start, bookmark);
633
+ }
634
+ ranges.push(bookmark);
635
+ break;
636
+ }
637
+ }
638
+ return ranges;
639
+ }
640
+ /**
641
+ * All paired bookmarks in document order of their start markers.
642
+ *
643
+ * Orphan start/end markers are omitted from the list but remain in the DOM
644
+ * and continue to serialize.
645
+ *
646
+ * @private
647
+ */
648
+ export function bookmarksInDocument(document) {
649
+ return pairBookmarks(collectBookmarkMarkersInDocumentOrder(document));
650
+ }
651
+ /**
652
+ * Named bookmarks whose start marker lives in `paragraph`, in document order.
653
+ *
654
+ * Cross-paragraph bookmarks are included when their **start** is in this
655
+ * paragraph. Orphans are omitted.
656
+ *
657
+ * @private
658
+ */
659
+ export function bookmarksInParagraph(paragraph) {
660
+ var document = paragraph.owningDocument();
661
+ var all = bookmarksInDocument(document);
662
+ var found = [];
663
+ for (var i = 0; i < all.length; i += 1) {
664
+ var bookmark = all[i];
665
+ var startLoc = locateBookmarkMarker(document, bookmark.bookmarkStart);
666
+ if (startLoc !== undefined && startLoc.paragraph === paragraph) {
667
+ found.push(bookmark);
668
+ }
669
+ }
670
+ return found;
671
+ }
672
+ /**
673
+ * First paired bookmark whose name matches exactly (case-sensitive), document order.
674
+ *
675
+ * @private
676
+ */
677
+ export function bookmarkByName(document, name) {
678
+ var all = bookmarksInDocument(document);
679
+ for (var i = 0; i < all.length; i += 1) {
680
+ if (all[i].name === name) {
681
+ return all[i];
682
+ }
683
+ }
684
+ return undefined;
685
+ }
686
+ /**
687
+ * Locate a bookmark marker among paragraph inlines (document-wide walk).
688
+ *
689
+ * @private
690
+ */
691
+ function locateBookmarkMarker(document, marker) {
692
+ var found;
693
+ visitParagraphsInDocumentOrder(document, function (paragraph) {
694
+ if (found !== undefined) {
695
+ return;
696
+ }
697
+ var content = paragraph.items.toArray();
698
+ for (var i = 0; i < content.length; i += 1) {
699
+ var inline = content[i];
700
+ if (inline !== undefined &&
701
+ inline instanceof FeatureInlineParagraphItem &&
702
+ inline.value === marker) {
703
+ found = { paragraph: paragraph, index: i };
704
+ return;
705
+ }
706
+ }
707
+ });
708
+ return found;
709
+ }
710
+ /**
711
+ * Remove start and end markers of a paired bookmark; enclosed content is kept.
712
+ *
713
+ * Markers may live in different paragraphs. Throws
714
+ * {@link DocxError} `content/unknown-bookmark` when either marker is missing.
715
+ *
716
+ * @private
717
+ */
718
+ export function removeBookmark(document, bookmark) {
719
+ var startLoc = locateBookmarkMarker(document, bookmark.bookmarkStart);
720
+ var endLoc = locateBookmarkMarker(document, bookmark.bookmarkEnd);
721
+ if (startLoc === undefined || endLoc === undefined) {
722
+ throw new DocxError('content/unknown-bookmark', 'Bookmark markers are not in this document');
723
+ }
724
+ // Remove higher document-order index first when same paragraph so indices stay valid.
725
+ if (startLoc.paragraph === endLoc.paragraph) {
726
+ if (endLoc.index > startLoc.index) {
727
+ endLoc.paragraph.removeFeatureInline(bookmark.bookmarkEnd);
728
+ startLoc.paragraph.removeFeatureInline(bookmark.bookmarkStart);
729
+ }
730
+ else {
731
+ startLoc.paragraph.removeFeatureInline(bookmark.bookmarkStart);
732
+ var endReloc = locateBookmarkMarker(document, bookmark.bookmarkEnd);
733
+ if (endReloc === undefined) {
734
+ throw new DocxError('content/unknown-bookmark', 'Bookmark end marker is not in this document');
735
+ }
736
+ endReloc.paragraph.removeFeatureInline(bookmark.bookmarkEnd);
737
+ }
738
+ }
739
+ else {
740
+ // Different paragraphs — order does not affect indices across hosts.
741
+ endLoc.paragraph.removeFeatureInline(bookmark.bookmarkEnd);
742
+ startLoc.paragraph.removeFeatureInline(bookmark.bookmarkStart);
743
+ }
744
+ bookmarkByStart.delete(bookmark.bookmarkStart);
745
+ }
746
+ /**
747
+ * Live query collection of paired bookmarks on a {@link WordDocument}.
748
+ *
749
+ * Members are stable {@link Bookmark} views for the current start/end pairing.
750
+ * Index properties refresh on {@link count} / mutation helpers.
751
+ *
752
+ * @public
753
+ */
754
+ var BookmarkCollection = /** @class */ (function () {
755
+ /**
756
+ * @private
757
+ */
758
+ function BookmarkCollection(document) {
759
+ this.cachedLength = 0;
760
+ this.document = document;
761
+ }
762
+ Object.defineProperty(BookmarkCollection.prototype, "count", {
763
+ /**
764
+ * Number of paired bookmarks in document order.
765
+ *
766
+ * @public
767
+ */
768
+ get: function () {
769
+ this.rebuildIndexProperties();
770
+ return this.cachedLength;
771
+ },
772
+ enumerable: true,
773
+ configurable: true
774
+ });
775
+ /**
776
+ * Bookmark at zero-based `index`, or `undefined` when out of range.
777
+ *
778
+ * @public
779
+ */
780
+ BookmarkCollection.prototype.itemAt = function (index) {
781
+ var items = bookmarksInDocument(this.document);
782
+ return items[index];
783
+ };
784
+ /**
785
+ * First bookmark whose name matches exactly (case-sensitive).
786
+ *
787
+ * @public
788
+ */
789
+ BookmarkCollection.prototype.findByName = function (name) {
790
+ return bookmarkByName(this.document, name);
791
+ };
792
+ /**
793
+ * Remove markers for `bookmark`; content between markers is preserved.
794
+ *
795
+ * @throws DocxError `content/unknown-bookmark` when markers are detached.
796
+ * @public
797
+ */
798
+ BookmarkCollection.prototype.remove = function (bookmark) {
799
+ removeBookmark(this.document, bookmark);
800
+ this.rebuildIndexProperties();
801
+ };
802
+ /**
803
+ * Remove the bookmark at zero-based `index`.
804
+ *
805
+ * @throws RangeError when `index` is out of range.
806
+ * @public
807
+ */
808
+ BookmarkCollection.prototype.removeAt = function (index) {
809
+ var items = bookmarksInDocument(this.document);
810
+ if (index < 0 || index >= items.length) {
811
+ throw new RangeError('Bookmark index ' + String(index) + ' is out of range');
812
+ }
813
+ removeBookmark(this.document, items[index]);
814
+ this.rebuildIndexProperties();
815
+ };
816
+ /**
817
+ * Remove every paired bookmark’s markers; content is preserved.
818
+ *
819
+ * @public
820
+ */
821
+ BookmarkCollection.prototype.clear = function () {
822
+ var items = bookmarksInDocument(this.document).slice();
823
+ for (var i = 0; i < items.length; i += 1) {
824
+ removeBookmark(this.document, items[i]);
825
+ }
826
+ this.rebuildIndexProperties();
827
+ };
828
+ BookmarkCollection.prototype[Symbol.iterator] = function () {
829
+ var items = bookmarksInDocument(this.document).slice();
830
+ var i = 0;
831
+ return {
832
+ next: function () {
833
+ if (i >= items.length) {
834
+ return { done: true, value: undefined };
835
+ }
836
+ var value = items[i];
837
+ i += 1;
838
+ return { done: false, value: value };
839
+ },
840
+ };
841
+ };
842
+ /**
843
+ * Refresh numeric index properties from the current pairing.
844
+ *
845
+ * @private
846
+ */
847
+ BookmarkCollection.prototype.rebuildIndexProperties = function () {
848
+ var items = bookmarksInDocument(this.document);
849
+ var nextLen = items.length;
850
+ var prevLen = this.cachedLength;
851
+ var limit = prevLen > nextLen ? prevLen : nextLen;
852
+ for (var i = 0; i < limit; i += 1) {
853
+ var key = String(i);
854
+ if (i < nextLen) {
855
+ Object.defineProperty(this, key, {
856
+ value: items[i],
857
+ writable: false,
858
+ enumerable: true,
859
+ configurable: true,
860
+ });
861
+ }
862
+ else {
863
+ delete this[key];
864
+ }
865
+ }
866
+ this.cachedLength = nextLen;
867
+ };
868
+ return BookmarkCollection;
869
+ }());
870
+ export { BookmarkCollection };
871
+ var bookmarkCollections = new WeakMap();
872
+ /**
873
+ * Stable public {@link BookmarkCollection} for `document`.
874
+ *
875
+ * @private
876
+ */
877
+ export function bookmarkCollectionFor(document) {
878
+ registerBookmarksFeature();
879
+ var cached = bookmarkCollections.get(document);
880
+ if (cached !== undefined) {
881
+ cached.rebuildIndexProperties();
882
+ return cached;
883
+ }
884
+ var created = new BookmarkCollection(document);
885
+ created.rebuildIndexProperties();
886
+ bookmarkCollections.set(document, created);
887
+ return created;
888
+ }
889
+ Object.defineProperty(WordDocument.prototype, 'bookmarks', {
890
+ configurable: true,
891
+ enumerable: false,
892
+ get: function () {
893
+ return bookmarkCollectionFor(this);
894
+ },
895
+ });
896
+ var registered = false;
897
+ /**
898
+ * @private
899
+ * Test hook */
900
+ export function resetBookmarksFeatureForTests() {
901
+ registered = false;
902
+ }
903
+ /**
904
+ * @private
905
+ * Register bookmark inline handlers. Idempotent. */
906
+ export function registerBookmarksFeature() {
907
+ if (registered) {
908
+ return;
909
+ }
910
+ registered = true;
911
+ registerFeature({ id: BOOKMARKS });
912
+ registerFeatureInlineHandler({
913
+ featureId: BOOKMARKS,
914
+ wmlLocalName: 'bookmarkStart',
915
+ tryParse: function (element) {
916
+ return parseBookmarkStart(element);
917
+ },
918
+ });
919
+ registerFeatureInlineHandler({
920
+ featureId: BOOKMARKS,
921
+ wmlLocalName: 'bookmarkEnd',
922
+ tryParse: function (element) {
923
+ return parseBookmarkEnd(element);
924
+ },
925
+ });
926
+ registerFeatureMaterializeHandler({
927
+ featureId: BOOKMARKS,
928
+ materialize: function (document) {
929
+ materializeBookmarkIds(document);
930
+ },
931
+ });
932
+ }
933
+ /**
934
+ * Whether paragraph inline content is a modeled bookmark start from this module.
935
+ *
936
+ * @private
937
+ */
938
+ export function isBookmarkStartInline(inline) {
939
+ return (inline instanceof FeatureInlineParagraphItem &&
940
+ inline.featureId === BOOKMARKS &&
941
+ inline.value instanceof BookmarkStart);
942
+ }
943
+ /**
944
+ * Whether paragraph inline content is a modeled bookmark end from this module.
945
+ *
946
+ * @private
947
+ */
948
+ export function isBookmarkEndInline(inline) {
949
+ return (inline instanceof FeatureInlineParagraphItem &&
950
+ inline.featureId === BOOKMARKS &&
951
+ inline.value instanceof BookmarkEnd);
952
+ }
953
+ /**
954
+ * Append a bookmark start marker (`w:bookmarkStart`) at the end of the paragraph.
955
+ *
956
+ * @param name - Bookmark name (`w:name`); must be non-empty / not whitespace-only.
957
+ * @returns The authored start marker (pending negative id until save).
958
+ * @throws DocxError `content/invalid-bookmark` for an invalid name.
959
+ * @public
960
+ */
961
+ Paragraph.prototype.appendBookmarkStart = function (name) {
962
+ assertValidBookmarkName(name);
963
+ var bookmarkId = allocateBookmarkId(this.owningDocument());
964
+ var start = new BookmarkStart(bookmarkId, name);
965
+ this.appendFeatureInline(BOOKMARKS, start);
966
+ return start;
967
+ };
968
+ /**
969
+ * Append a bookmark end marker (`w:bookmarkEnd`) pairing with `start`.
970
+ *
971
+ * Uses the start marker’s internal id. Place after the desired enclosed content
972
+ * (same or a later paragraph) so the pair spans the intended range.
973
+ *
974
+ * @param start - Start marker previously appended (possibly in another paragraph).
975
+ * @returns The authored end marker.
976
+ * @public
977
+ */
978
+ Paragraph.prototype.appendBookmarkEnd = function (start) {
979
+ var end = new BookmarkEnd(start.bookmarkId, start.name);
980
+ this.appendFeatureInline(BOOKMARKS, end);
981
+ return end;
982
+ };
983
+ /**
984
+ * Append a same-paragraph bookmark: start, optional text run, then end.
985
+ *
986
+ * When `options.text` is omitted or empty, an empty bookmark (adjacent markers)
987
+ * is created. Content already present in the paragraph is not enclosed; use
988
+ * {@link Paragraph.appendBookmarkStart} / {@link Paragraph.appendBookmarkEnd}
989
+ * around existing content for that case.
990
+ *
991
+ * @public
992
+ */
993
+ Paragraph.prototype.appendBookmark = function (name, options) {
994
+ assertValidBookmarkName(name);
995
+ var bookmarkId = allocateBookmarkId(this.owningDocument());
996
+ var start = new BookmarkStart(bookmarkId, name);
997
+ this.appendFeatureInline(BOOKMARKS, start);
998
+ var text = options == null ? undefined : options.text;
999
+ if (text !== undefined && text.length > 0) {
1000
+ this.appendText(text);
1001
+ }
1002
+ var end = new BookmarkEnd(bookmarkId, name);
1003
+ this.appendFeatureInline(BOOKMARKS, end);
1004
+ return new Bookmark(start, end);
1005
+ };
1006
+ registerAlwaysOnBodyFeatureBootstrap(function () {
1007
+ registerBookmarksFeature();
1008
+ });
1009
+ registerBookmarksFeature();