@syncfusion/ej2-docx 0.0.0-stage → 35.1.39
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.
- package/README.md +68 -2
- package/core.js +4 -0
- package/dist/ej2-docx.umd.min.js +2 -0
- package/dist/ej2-docx.umd.min.js.map +1 -0
- package/dist/es6/ej2-docx.es2015.js +66697 -0
- package/dist/es6/ej2-docx.es2015.js.map +1 -0
- package/dist/es6/ej2-docx.es5.js +77568 -0
- package/dist/es6/ej2-docx.es5.js.map +1 -0
- package/dist/global/ej2-docx.min.js +2 -0
- package/dist/global/ej2-docx.min.js.map +1 -0
- package/dist/global/index.d.ts +5 -0
- package/features.js +4 -0
- package/index.js +4 -0
- package/license +10 -0
- package/package.json +31 -4
- package/src/all.d.ts +50 -0
- package/src/all.js +147 -0
- package/src/core/compat/base64.d.ts +13 -0
- package/src/core/compat/base64.js +90 -0
- package/src/core/compat/object-compat.d.ts +30 -0
- package/src/core/compat/object-compat.js +40 -0
- package/src/core/compat/sha256.d.ts +9 -0
- package/src/core/compat/sha256.js +98 -0
- package/src/core/errors/docx-error.d.ts +89 -0
- package/src/core/errors/docx-error.js +138 -0
- package/src/core/errors/error-codes.d.ts +8 -0
- package/src/core/errors/error-codes.js +0 -0
- package/src/core/errors/index.d.ts +10 -0
- package/src/core/errors/index.js +9 -0
- package/src/core/index.d.ts +12 -0
- package/src/core/index.js +12 -0
- package/src/core/mc/alternate-content.d.ts +7 -0
- package/src/core/mc/alternate-content.js +67 -0
- package/src/core/mc/attributes.d.ts +24 -0
- package/src/core/mc/attributes.js +82 -0
- package/src/core/mc/index.d.ts +7 -0
- package/src/core/mc/index.js +5 -0
- package/src/core/mc/inspect.d.ts +16 -0
- package/src/core/mc/inspect.js +148 -0
- package/src/core/mc/namespaces.d.ts +4 -0
- package/src/core/mc/namespaces.js +4 -0
- package/src/core/mc/scope.d.ts +6 -0
- package/src/core/mc/scope.js +47 -0
- package/src/core/opc/content-types.d.ts +34 -0
- package/src/core/opc/content-types.js +162 -0
- package/src/core/opc/index.d.ts +8 -0
- package/src/core/opc/index.js +4 -0
- package/src/core/opc/package.d.ts +49 -0
- package/src/core/opc/package.js +324 -0
- package/src/core/opc/part-name.d.ts +47 -0
- package/src/core/opc/part-name.js +205 -0
- package/src/core/opc/relationships.d.ts +46 -0
- package/src/core/opc/relationships.js +212 -0
- package/src/core/preservation/index.d.ts +2 -0
- package/src/core/preservation/index.js +1 -0
- package/src/core/preservation/opaque-body.d.ts +16 -0
- package/src/core/preservation/opaque-body.js +69 -0
- package/src/core/registry/block-handlers.d.ts +30 -0
- package/src/core/registry/block-handlers.js +36 -0
- package/src/core/registry/create-defaults.d.ts +39 -0
- package/src/core/registry/create-defaults.js +42 -0
- package/src/core/registry/feature-registry.d.ts +20 -0
- package/src/core/registry/feature-registry.js +29 -0
- package/src/core/registry/index.d.ts +9 -0
- package/src/core/registry/index.js +8 -0
- package/src/core/registry/inline-handlers.d.ts +20 -0
- package/src/core/registry/inline-handlers.js +30 -0
- package/src/core/registry/materialize-handlers.d.ts +35 -0
- package/src/core/registry/materialize-handlers.js +75 -0
- package/src/core/registry/multi-part-handlers.d.ts +37 -0
- package/src/core/registry/multi-part-handlers.js +206 -0
- package/src/core/registry/package-part-handlers.d.ts +28 -0
- package/src/core/registry/package-part-handlers.js +190 -0
- package/src/core/registry/part-handlers.d.ts +24 -0
- package/src/core/registry/part-handlers.js +172 -0
- package/src/core/registry/run-leaf-handlers.d.ts +26 -0
- package/src/core/registry/run-leaf-handlers.js +72 -0
- package/src/core/security/limits.d.ts +40 -0
- package/src/core/security/limits.js +26 -0
- package/src/core/xml/index.d.ts +7 -0
- package/src/core/xml/index.js +3 -0
- package/src/core/xml/model.d.ts +66 -0
- package/src/core/xml/model.js +17 -0
- package/src/core/xml/parse.d.ts +12 -0
- package/src/core/xml/parse.js +382 -0
- package/src/core/xml/serialize.d.ts +6 -0
- package/src/core/xml/serialize.js +93 -0
- package/src/core/zip/crc32.d.ts +2 -0
- package/src/core/zip/crc32.js +25 -0
- package/src/core/zip/deflate.d.ts +6 -0
- package/src/core/zip/deflate.js +6 -0
- package/src/core/zip/index.d.ts +10 -0
- package/src/core/zip/index.js +4 -0
- package/src/core/zip/inflate-raw.d.ts +17 -0
- package/src/core/zip/inflate-raw.js +450 -0
- package/src/core/zip/names.d.ts +6 -0
- package/src/core/zip/names.js +52 -0
- package/src/core/zip/read.d.ts +8 -0
- package/src/core/zip/read.js +262 -0
- package/src/core/zip/write.d.ts +7 -0
- package/src/core/zip/write.js +189 -0
- package/src/core/zip/zip-entry.d.ts +4 -0
- package/src/core/zip/zip-entry.js +0 -0
- package/src/features/bibliography/index.d.ts +100 -0
- package/src/features/bibliography/index.js +290 -0
- package/src/features/bookmarks/index.d.ts +331 -0
- package/src/features/bookmarks/index.js +1009 -0
- package/src/features/comments/comment-extensions.d.ts +157 -0
- package/src/features/comments/comment-extensions.js +356 -0
- package/src/features/comments/index.d.ts +579 -0
- package/src/features/comments/index.js +1727 -0
- package/src/features/content-controls/index.d.ts +821 -0
- package/src/features/content-controls/index.js +2857 -0
- package/src/features/custom-xml/index.d.ts +236 -0
- package/src/features/custom-xml/index.js +661 -0
- package/src/features/document/alignment.d.ts +23 -0
- package/src/features/document/alignment.js +36 -0
- package/src/features/document/alt-chunk.d.ts +103 -0
- package/src/features/document/alt-chunk.js +221 -0
- package/src/features/document/assert-never.d.ts +1 -0
- package/src/features/document/assert-never.js +4 -0
- package/src/features/document/augmentations.d.ts +578 -0
- package/src/features/document/augmentations.js +0 -0
- package/src/features/document/body-always-on.d.ts +36 -0
- package/src/features/document/body-always-on.js +66 -0
- package/src/features/document/body-blocks.d.ts +7 -0
- package/src/features/document/body-blocks.js +78 -0
- package/src/features/document/body-item-adapters.d.ts +62 -0
- package/src/features/document/body-item-adapters.js +97 -0
- package/src/features/document/body-item-collection.d.ts +151 -0
- package/src/features/document/body-item-collection.js +440 -0
- package/src/features/document/body-item.d.ts +35 -0
- package/src/features/document/body-item.js +8 -0
- package/src/features/document/body.d.ts +150 -0
- package/src/features/document/body.js +263 -0
- package/src/features/document/character-format.d.ts +413 -0
- package/src/features/document/character-format.js +2054 -0
- package/src/features/document/color.d.ts +178 -0
- package/src/features/document/color.js +495 -0
- package/src/features/document/document.d.ts +410 -0
- package/src/features/document/document.js +1049 -0
- package/src/features/document/element-type.d.ts +68 -0
- package/src/features/document/element-type.js +133 -0
- package/src/features/document/entity-type.d.ts +92 -0
- package/src/features/document/entity-type.js +93 -0
- package/src/features/document/feature-block.d.ts +16 -0
- package/src/features/document/feature-block.js +0 -0
- package/src/features/document/feature-inline.d.ts +13 -0
- package/src/features/document/feature-inline.js +0 -0
- package/src/features/document/feature-multi-package-part.d.ts +19 -0
- package/src/features/document/feature-multi-package-part.js +8 -0
- package/src/features/document/feature-package-level-part.d.ts +18 -0
- package/src/features/document/feature-package-level-part.js +8 -0
- package/src/features/document/feature-package-part.d.ts +14 -0
- package/src/features/document/feature-package-part.js +0 -0
- package/src/features/document/feature-run-leaf.d.ts +9 -0
- package/src/features/document/feature-run-leaf.js +0 -0
- package/src/features/document/headers-footers.d.ts +206 -0
- package/src/features/document/headers-footers.js +384 -0
- package/src/features/document/index.d.ts +41 -0
- package/src/features/document/index.js +34 -0
- package/src/features/document/length.d.ts +152 -0
- package/src/features/document/length.js +245 -0
- package/src/features/document/load-options.d.ts +14 -0
- package/src/features/document/load-options.js +0 -0
- package/src/features/document/locale-ids.d.ts +227 -0
- package/src/features/document/locale-ids.js +485 -0
- package/src/features/document/on-off.d.ts +9 -0
- package/src/features/document/on-off.js +27 -0
- package/src/features/document/page-setup.d.ts +339 -0
- package/src/features/document/page-setup.js +244 -0
- package/src/features/document/paragraph-format.d.ts +880 -0
- package/src/features/document/paragraph-format.js +2807 -0
- package/src/features/document/paragraph-item-collection.d.ts +162 -0
- package/src/features/document/paragraph-item-collection.js +363 -0
- package/src/features/document/paragraph-item.d.ts +83 -0
- package/src/features/document/paragraph-item.js +103 -0
- package/src/features/document/paragraph.d.ts +435 -0
- package/src/features/document/paragraph.js +888 -0
- package/src/features/document/run.d.ts +1 -0
- package/src/features/document/run.js +768 -0
- package/src/features/document/section-partition-flatten.d.ts +124 -0
- package/src/features/document/section-partition-flatten.js +217 -0
- package/src/features/document/section-properties-model.d.ts +13 -0
- package/src/features/document/section-properties-model.js +0 -0
- package/src/features/document/section.d.ts +93 -0
- package/src/features/document/section.js +178 -0
- package/src/features/document/sections.d.ts +103 -0
- package/src/features/document/sections.js +217 -0
- package/src/features/document/sub-super-script.d.ts +23 -0
- package/src/features/document/sub-super-script.js +43 -0
- package/src/features/document/text-range.d.ts +445 -0
- package/src/features/document/text-range.js +1156 -0
- package/src/features/document/typed-body-collections.d.ts +162 -0
- package/src/features/document/typed-body-collections.js +371 -0
- package/src/features/document/underline-style.d.ts +38 -0
- package/src/features/document/underline-style.js +126 -0
- package/src/features/document/units.d.ts +8 -0
- package/src/features/document/units.js +7 -0
- package/src/features/document/wml.d.ts +16 -0
- package/src/features/document/wml.js +67 -0
- package/src/features/drawing/authoring.d.ts +27 -0
- package/src/features/drawing/authoring.js +271 -0
- package/src/features/drawing/body-pr.d.ts +271 -0
- package/src/features/drawing/body-pr.js +663 -0
- package/src/features/drawing/drawing-shape.d.ts +1192 -0
- package/src/features/drawing/drawing-shape.js +3239 -0
- package/src/features/drawing/encode-builders.d.ts +176 -0
- package/src/features/drawing/encode-builders.js +390 -0
- package/src/features/drawing/fill-format.d.ts +52 -0
- package/src/features/drawing/fill-format.js +124 -0
- package/src/features/drawing/host-codec.d.ts +632 -0
- package/src/features/drawing/host-codec.js +2595 -0
- package/src/features/drawing/index.d.ts +13 -0
- package/src/features/drawing/index.js +33 -0
- package/src/features/drawing/line-format.d.ts +76 -0
- package/src/features/drawing/line-format.js +343 -0
- package/src/features/drawing/parse-register.d.ts +50 -0
- package/src/features/drawing/parse-register.js +257 -0
- package/src/features/drawing/residual-utils.d.ts +47 -0
- package/src/features/drawing/residual-utils.js +290 -0
- package/src/features/drawing/shape-types.d.ts +433 -0
- package/src/features/drawing/shape-types.js +437 -0
- package/src/features/drawing/sp-pr.d.ts +396 -0
- package/src/features/drawing/sp-pr.js +610 -0
- package/src/features/drawing/text-frame.d.ts +90 -0
- package/src/features/drawing/text-frame.js +152 -0
- package/src/features/drawing/types.d.ts +352 -0
- package/src/features/drawing/types.js +60 -0
- package/src/features/drawing/wrap-format.d.ts +62 -0
- package/src/features/drawing/wrap-format.js +114 -0
- package/src/features/editable-ranges/index.d.ts +494 -0
- package/src/features/editable-ranges/index.js +1348 -0
- package/src/features/fields/index.d.ts +428 -0
- package/src/features/fields/index.js +2148 -0
- package/src/features/fields/paragraph-field.d.ts +187 -0
- package/src/features/fields/paragraph-field.js +692 -0
- package/src/features/font-table/font-substitution-table.d.ts +75 -0
- package/src/features/font-table/font-substitution-table.js +257 -0
- package/src/features/font-table/font-table-entry.d.ts +255 -0
- package/src/features/font-table/font-table-entry.js +823 -0
- package/src/features/font-table/font-table.d.ts +128 -0
- package/src/features/font-table/font-table.js +313 -0
- package/src/features/font-table/index.d.ts +27 -0
- package/src/features/font-table/index.js +48 -0
- package/src/features/glossary/index.d.ts +97 -0
- package/src/features/glossary/index.js +286 -0
- package/src/features/headers-footers/index.d.ts +506 -0
- package/src/features/headers-footers/index.js +1666 -0
- package/src/features/hyperlinks/index.d.ts +230 -0
- package/src/features/hyperlinks/index.js +685 -0
- package/src/features/images/caption-authoring-api.d.ts +33 -0
- package/src/features/images/caption-authoring-api.js +33 -0
- package/src/features/images/caption-enums.d.ts +52 -0
- package/src/features/images/caption-enums.js +141 -0
- package/src/features/images/caption-host.d.ts +10 -0
- package/src/features/images/caption-host.js +21 -0
- package/src/features/images/captions.d.ts +13 -0
- package/src/features/images/captions.js +142 -0
- package/src/features/images/host-codec.d.ts +103 -0
- package/src/features/images/host-codec.js +720 -0
- package/src/features/images/image-sniff.d.ts +21 -0
- package/src/features/images/image-sniff.js +71 -0
- package/src/features/images/index.d.ts +506 -0
- package/src/features/images/index.js +1429 -0
- package/src/features/images/layout-types.d.ts +232 -0
- package/src/features/images/layout-types.js +294 -0
- package/src/features/images/public-entry.d.ts +9 -0
- package/src/features/images/public-entry.js +9 -0
- package/src/features/index.d.ts +35 -0
- package/src/features/index.js +36 -0
- package/src/features/mail-merge/index.d.ts +113 -0
- package/src/features/mail-merge/index.js +315 -0
- package/src/features/notes/index.d.ts +573 -0
- package/src/features/notes/index.js +1725 -0
- package/src/features/numbering/abstract-numbering.d.ts +90 -0
- package/src/features/numbering/abstract-numbering.js +292 -0
- package/src/features/numbering/index.d.ts +182 -0
- package/src/features/numbering/index.js +668 -0
- package/src/features/numbering/list-format.d.ts +158 -0
- package/src/features/numbering/list-format.js +590 -0
- package/src/features/numbering/list-string.d.ts +7 -0
- package/src/features/numbering/list-string.js +423 -0
- package/src/features/numbering/list-style.d.ts +204 -0
- package/src/features/numbering/list-style.js +1084 -0
- package/src/features/numbering/numbering-instance.d.ts +101 -0
- package/src/features/numbering/numbering-instance.js +329 -0
- package/src/features/numbering/numbering-level.d.ts +118 -0
- package/src/features/numbering/numbering-level.js +501 -0
- package/src/features/numbering/picture-bullet.d.ts +34 -0
- package/src/features/numbering/picture-bullet.js +88 -0
- package/src/features/ole-object/catalog.d.ts +300 -0
- package/src/features/ole-object/catalog.js +908 -0
- package/src/features/ole-object/index.d.ts +526 -0
- package/src/features/ole-object/index.js +1421 -0
- package/src/features/ole-object/relationship.d.ts +27 -0
- package/src/features/ole-object/relationship.js +27 -0
- package/src/features/ole-object/typed-dom.d.ts +186 -0
- package/src/features/ole-object/typed-dom.js +595 -0
- package/src/features/properties/index.d.ts +205 -0
- package/src/features/properties/index.js +549 -0
- package/src/features/revisions/index.d.ts +204 -0
- package/src/features/revisions/index.js +695 -0
- package/src/features/sections/column-collection.d.ts +119 -0
- package/src/features/sections/column-collection.js +478 -0
- package/src/features/sections/column.d.ts +15 -0
- package/src/features/sections/column.js +37 -0
- package/src/features/sections/index.d.ts +91 -0
- package/src/features/sections/index.js +1096 -0
- package/src/features/sections/margins.d.ts +40 -0
- package/src/features/sections/margins.js +105 -0
- package/src/features/sections/page-number-style.d.ts +21 -0
- package/src/features/sections/page-number-style.js +62 -0
- package/src/features/sections/page-orientation.d.ts +10 -0
- package/src/features/sections/page-orientation.js +10 -0
- package/src/features/sections/page-setup.d.ts +435 -0
- package/src/features/sections/page-setup.js +1479 -0
- package/src/features/sections/page-size.d.ts +59 -0
- package/src/features/sections/page-size.js +68 -0
- package/src/features/sections/section-break-code.d.ts +27 -0
- package/src/features/sections/section-break-code.js +60 -0
- package/src/features/sections/section-document-association.d.ts +18 -0
- package/src/features/sections/section-document-association.js +31 -0
- package/src/features/sections/section-validation.d.ts +43 -0
- package/src/features/sections/section-validation.js +97 -0
- package/src/features/settings/attached-template.d.ts +35 -0
- package/src/features/settings/attached-template.js +98 -0
- package/src/features/settings/compat-settings.d.ts +216 -0
- package/src/features/settings/compat-settings.js +508 -0
- package/src/features/settings/document-background.d.ts +59 -0
- package/src/features/settings/document-background.js +131 -0
- package/src/features/settings/document-protection.d.ts +65 -0
- package/src/features/settings/document-protection.js +157 -0
- package/src/features/settings/document-settings-facades.d.ts +108 -0
- package/src/features/settings/document-settings-facades.js +312 -0
- package/src/features/settings/document-settings-values.d.ts +43 -0
- package/src/features/settings/document-settings-values.js +60 -0
- package/src/features/settings/footnote-properties.d.ts +211 -0
- package/src/features/settings/footnote-properties.js +591 -0
- package/src/features/settings/index.d.ts +356 -0
- package/src/features/settings/index.js +829 -0
- package/src/features/settings/settings-children.d.ts +151 -0
- package/src/features/settings/settings-children.js +505 -0
- package/src/features/settings/web-settings.d.ts +88 -0
- package/src/features/settings/web-settings.js +227 -0
- package/src/features/settings/zoom.d.ts +79 -0
- package/src/features/settings/zoom.js +147 -0
- package/src/features/styles/builtin-catalog.d.ts +159 -0
- package/src/features/styles/builtin-catalog.js +963 -0
- package/src/features/styles/builtin-resolver.d.ts +49 -0
- package/src/features/styles/builtin-resolver.js +165 -0
- package/src/features/styles/default-styles.d.ts +37 -0
- package/src/features/styles/default-styles.js +186 -0
- package/src/features/styles/default-theme.d.ts +13 -0
- package/src/features/styles/default-theme.js +13 -0
- package/src/features/styles/doc-defaults.d.ts +58 -0
- package/src/features/styles/doc-defaults.js +178 -0
- package/src/features/styles/formatting-resolver.d.ts +27 -0
- package/src/features/styles/formatting-resolver.js +72 -0
- package/src/features/styles/index.d.ts +256 -0
- package/src/features/styles/index.js +1325 -0
- package/src/features/styles/latent-styles.d.ts +68 -0
- package/src/features/styles/latent-styles.js +305 -0
- package/src/features/styles/paragraph-properties.d.ts +71 -0
- package/src/features/styles/paragraph-properties.js +237 -0
- package/src/features/styles/run-properties.d.ts +93 -0
- package/src/features/styles/run-properties.js +516 -0
- package/src/features/styles/style-base.d.ts +402 -0
- package/src/features/styles/style-base.js +1026 -0
- package/src/features/styles/style-collection.d.ts +264 -0
- package/src/features/styles/style-collection.js +714 -0
- package/src/features/styles/style-format-bridge.d.ts +64 -0
- package/src/features/styles/style-format-bridge.js +100 -0
- package/src/features/styles/style.d.ts +84 -0
- package/src/features/styles/style.js +375 -0
- package/src/features/styles/styles-with-effects.d.ts +71 -0
- package/src/features/styles/styles-with-effects.js +180 -0
- package/src/features/styles/table-style.d.ts +272 -0
- package/src/features/styles/table-style.js +1226 -0
- package/src/features/styles/theme.d.ts +126 -0
- package/src/features/styles/theme.js +377 -0
- package/src/features/tables/border-style-map.d.ts +24 -0
- package/src/features/tables/border-style-map.js +81 -0
- package/src/features/tables/borders.d.ts +126 -0
- package/src/features/tables/borders.js +527 -0
- package/src/features/tables/collections.d.ts +113 -0
- package/src/features/tables/collections.js +261 -0
- package/src/features/tables/format.d.ts +208 -0
- package/src/features/tables/format.js +716 -0
- package/src/features/tables/index.d.ts +597 -0
- package/src/features/tables/index.js +2386 -0
- package/src/features/tables/paddings.d.ts +41 -0
- package/src/features/tables/paddings.js +97 -0
- package/src/features/tables/tbl-pr-positioning.d.ts +27 -0
- package/src/features/tables/tbl-pr-positioning.js +178 -0
- package/src/features/tables/tbl-pr.d.ts +528 -0
- package/src/features/tables/tbl-pr.js +1208 -0
- package/src/features/tables/tc-pr.d.ts +168 -0
- package/src/features/tables/tc-pr.js +553 -0
- package/src/features/tables/tr-pr.d.ts +60 -0
- package/src/features/tables/tr-pr.js +215 -0
- package/src/features/watermark/detect.d.ts +76 -0
- package/src/features/watermark/detect.js +219 -0
- package/src/features/watermark/index.d.ts +28 -0
- package/src/features/watermark/index.js +91 -0
- package/src/features/watermark/logical-store.d.ts +29 -0
- package/src/features/watermark/logical-store.js +31 -0
- package/src/features/watermark/model.d.ts +285 -0
- package/src/features/watermark/model.js +597 -0
- package/src/features/watermark/parse.d.ts +84 -0
- package/src/features/watermark/parse.js +815 -0
- package/src/features/watermark/serialize.d.ts +98 -0
- package/src/features/watermark/serialize.js +1517 -0
- package/src/global.js +1 -0
- package/src/index.d.ts +2 -0
- 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();
|