ooxml-core 1.8.4 → 1.10.0
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/dist/PptxHandler-5UURGJEV.mjs +2 -0
- package/dist/{PptxHandler-BL4B7CZO.mjs → PptxHandler-ADEFY476.mjs} +2 -2
- package/dist/PptxHandler-U5XB2HUE.cjs +11 -0
- package/dist/automation/index.cjs +7239 -4037
- package/dist/automation/index.mjs +7239 -4037
- package/dist/chunk-3N6XMMTT.cjs +87913 -0
- package/dist/{chunk-TTPZITQN.mjs → chunk-5NVJN4E6.mjs} +30 -2
- package/dist/{chunk-ZAP5WLEN.mjs → chunk-A6P7G3UK.mjs} +1 -1
- package/dist/{chunk-CPKNMQLX.cjs → chunk-AWIDASUW.cjs} +25 -2
- package/dist/{chunk-SVQZXP3F.mjs → chunk-CBNKBVX5.mjs} +25 -2
- package/dist/{chunk-GAGSCAR3.mjs → chunk-CCHYFCPD.mjs} +1199 -348
- package/dist/chunk-R6KSBNKX.mjs +44133 -0
- package/dist/chunk-S6DOCMQC.cjs +44451 -0
- package/dist/{chunk-Z7IQR4S4.mjs → chunk-WUE5ZHU3.mjs} +269 -21
- package/dist/chunk-ZE53K7DH.mjs +87907 -0
- package/dist/{chunk-NIHPA63A.mjs → chunk-ZOUGMAZG.mjs} +54 -37
- package/dist/docx/block-parser.d.ts.map +1 -1
- package/dist/docx/cell-blocks.d.ts +4 -0
- package/dist/docx/cell-blocks.d.ts.map +1 -0
- package/dist/docx/document-paragraphs.d.ts.map +1 -1
- package/dist/docx/document-parts.d.ts +2 -0
- package/dist/docx/document-parts.d.ts.map +1 -1
- package/dist/docx/embedded.cjs +189 -20
- package/dist/docx/embedded.mjs +189 -20
- package/dist/docx/index.cjs +219 -24
- package/dist/docx/index.mjs +219 -24
- package/dist/docx/layout/adapt-table.d.ts +2 -2
- package/dist/docx/layout/adapt-table.d.ts.map +1 -1
- package/dist/docx/layout/adapter.d.ts.map +1 -1
- package/dist/docx/layout/flow-paragraph.d.ts +5 -0
- package/dist/docx/layout/flow-paragraph.d.ts.map +1 -1
- package/dist/docx/layout/flow-table.d.ts +2 -1
- package/dist/docx/layout/flow-table.d.ts.map +1 -1
- package/dist/docx/layout/footnote-columns.d.ts +22 -0
- package/dist/docx/layout/footnote-columns.d.ts.map +1 -0
- package/dist/docx/layout/footnote-flow.d.ts +27 -0
- package/dist/docx/layout/footnote-flow.d.ts.map +1 -0
- package/dist/docx/layout/footnote-split.d.ts +7 -0
- package/dist/docx/layout/footnote-split.d.ts.map +1 -0
- package/dist/docx/layout/index.cjs +1528 -119
- package/dist/docx/layout/index.mjs +1528 -120
- package/dist/docx/layout/input.d.ts +17 -1
- package/dist/docx/layout/input.d.ts.map +1 -1
- package/dist/docx/layout/legacy-footnote-flow.d.ts +18 -0
- package/dist/docx/layout/legacy-footnote-flow.d.ts.map +1 -0
- package/dist/docx/layout/line-metrics.d.ts.map +1 -1
- package/dist/docx/layout/nested-frame-profile.d.ts +9 -0
- package/dist/docx/layout/nested-frame-profile.d.ts.map +1 -0
- package/dist/docx/layout/page-cursor.d.ts +15 -8
- package/dist/docx/layout/page-cursor.d.ts.map +1 -1
- package/dist/docx/layout/page-flow.d.ts.map +1 -1
- package/dist/docx/layout/paragraph-layout.d.ts.map +1 -1
- package/dist/docx/layout/paragraph-tokens.d.ts +2 -0
- package/dist/docx/layout/paragraph-tokens.d.ts.map +1 -1
- package/dist/docx/layout/reference-footnotes.d.ts +7 -0
- package/dist/docx/layout/reference-footnotes.d.ts.map +1 -0
- package/dist/docx/layout/result.d.ts +44 -0
- package/dist/docx/layout/result.d.ts.map +1 -1
- package/dist/docx/layout/section-flow.d.ts +2 -0
- package/dist/docx/layout/section-flow.d.ts.map +1 -1
- package/dist/docx/layout/table-border-layout.d.ts +16 -0
- package/dist/docx/layout/table-border-layout.d.ts.map +1 -0
- package/dist/docx/layout/table-cell-layout.d.ts +12 -0
- package/dist/docx/layout/table-cell-layout.d.ts.map +1 -0
- package/dist/docx/layout/table-content.d.ts +4 -0
- package/dist/docx/layout/table-content.d.ts.map +1 -0
- package/dist/docx/layout/table-footnotes.d.ts +32 -0
- package/dist/docx/layout/table-footnotes.d.ts.map +1 -0
- package/dist/docx/layout/table-frames.d.ts +4 -0
- package/dist/docx/layout/table-frames.d.ts.map +1 -0
- package/dist/docx/layout/table-layout.d.ts +16 -5
- package/dist/docx/layout/table-layout.d.ts.map +1 -1
- package/dist/docx/layout/table-note-completion.d.ts +5 -0
- package/dist/docx/layout/table-note-completion.d.ts.map +1 -0
- package/dist/docx/layout/table-note-stories.d.ts +6 -0
- package/dist/docx/layout/table-note-stories.d.ts.map +1 -0
- package/dist/docx/load/index.cjs +194 -25
- package/dist/docx/load/index.mjs +194 -25
- package/dist/docx/model-run.d.ts +2 -0
- package/dist/docx/model-run.d.ts.map +1 -1
- package/dist/docx/model.d.ts +7 -0
- package/dist/docx/model.d.ts.map +1 -1
- package/dist/docx/notes.d.ts +5 -0
- package/dist/docx/notes.d.ts.map +1 -1
- package/dist/docx/parse-table.d.ts.map +1 -1
- package/dist/docx/parse.d.ts.map +1 -1
- package/dist/docx/save.d.ts.map +1 -1
- package/dist/docx/section-model.d.ts +2 -0
- package/dist/docx/section-model.d.ts.map +1 -1
- package/dist/docx/sections.d.ts.map +1 -1
- package/dist/docx/settings.d.ts +2 -0
- package/dist/docx/settings.d.ts.map +1 -1
- package/dist/docx/table-model.d.ts +3 -1
- package/dist/docx/table-model.d.ts.map +1 -1
- package/dist/docx/ui/index.cjs +55 -0
- package/dist/docx/ui/index.d.ts +1 -0
- package/dist/docx/ui/index.d.ts.map +1 -1
- package/dist/docx/ui/index.mjs +55 -1
- package/dist/docx/ui/table-structure-guard.d.ts +4 -0
- package/dist/docx/ui/table-structure-guard.d.ts.map +1 -0
- package/dist/docx/write-footnote-columns.d.ts +3 -0
- package/dist/docx/write-footnote-columns.d.ts.map +1 -0
- package/dist/docx/write-notes.d.ts.map +1 -1
- package/dist/docx/write-run.d.ts.map +1 -1
- package/dist/docx/write-sections.d.ts.map +1 -1
- package/dist/index.cjs +8 -5
- package/dist/index.mjs +8 -5
- package/dist/opc/clone-part-graph.d.ts +4 -0
- package/dist/opc/clone-part-graph.d.ts.map +1 -1
- package/dist/opc/index.cjs +8 -5
- package/dist/opc/index.mjs +8 -5
- package/dist/pptx/automation/index.cjs +1156 -389
- package/dist/pptx/automation/index.d.ts +4 -4
- package/dist/pptx/automation/index.mjs +5 -5
- package/dist/pptx/chunks/{index-CKIUurnd.d.ts → index-Cuxtr76Y.d.ts} +29 -10
- package/dist/pptx/chunks/index-Cuxtr76Y.d.ts.map +1 -0
- package/dist/pptx/chunks/{index-Cn-GzYGp.d.ts → index-DUCGeZh7.d.ts} +94 -5
- package/dist/pptx/chunks/index-DUCGeZh7.d.ts.map +1 -0
- package/dist/pptx/chunks/{smart-art-Q2kZQtHh.d.ts → smart-art-D-sXa_Nb.d.ts} +11 -1
- package/dist/pptx/chunks/smart-art-D-sXa_Nb.d.ts.map +1 -0
- package/dist/pptx/chunks/{text-operations-BHfAm5K9.d.ts → text-operations-BqHmLaLA.d.ts} +54 -13
- package/dist/pptx/chunks/text-operations-BqHmLaLA.d.ts.map +1 -0
- package/dist/pptx/cli/index.cjs +1157 -395
- package/dist/pptx/cli/index.d.ts +1 -1
- package/dist/pptx/cli/index.mjs +4 -4
- package/dist/pptx/converter/index.cjs +54 -36
- package/dist/pptx/converter/index.d.ts +1 -1
- package/dist/pptx/converter/index.mjs +2 -2
- package/dist/pptx/editor/render/collaboration-live-patch-target.cjs +2 -2
- package/dist/pptx/editor/render/collaboration-live-patch-target.mjs +1 -1
- package/dist/pptx/editor/render/find-replace.cjs +416 -45
- package/dist/pptx/editor/render/find-replace.d.ts +35 -4
- package/dist/pptx/editor/render/find-replace.d.ts.map +1 -1
- package/dist/pptx/editor/render/find-replace.mjs +416 -46
- package/dist/pptx/editor/render/remap-text.cjs +2 -2
- package/dist/pptx/editor/render/remap-text.d.ts.map +1 -1
- package/dist/pptx/editor/render/remap-text.mjs +1 -1
- package/dist/pptx/editor/render/slide-operations.cjs +87 -0
- package/dist/pptx/editor/render/slide-operations.d.ts +17 -1
- package/dist/pptx/editor/render/slide-operations.d.ts.map +1 -1
- package/dist/pptx/editor/render/slide-operations.mjs +83 -1
- package/dist/pptx/editor/render/slide-search.cjs +6 -10
- package/dist/pptx/editor/render/slide-search.d.ts +1 -1
- package/dist/pptx/editor/render/slide-search.mjs +6 -10
- package/dist/pptx/editor/render/template-editing.d.ts +1 -1
- package/dist/pptx/editor/render/template-editing.d.ts.map +1 -1
- package/dist/pptx/index.cjs +1651 -419
- package/dist/pptx/index.d.ts +5 -5
- package/dist/pptx/index.mjs +5 -5
- package/dist/pptx/smartart-layouts/index.d.ts +1 -1
- package/dist/teams/index.cjs +965 -34
- package/dist/teams/index.mjs +965 -34
- package/dist/visio/accessibility.d.ts +10 -0
- package/dist/visio/accessibility.d.ts.map +1 -0
- package/dist/visio/cell-formula.d.ts +2 -0
- package/dist/visio/cell-formula.d.ts.map +1 -1
- package/dist/visio/connector-curve-aligned.d.ts +5 -0
- package/dist/visio/connector-curve-aligned.d.ts.map +1 -0
- package/dist/visio/connector-curve-spans.d.ts +14 -0
- package/dist/visio/connector-curve-spans.d.ts.map +1 -0
- package/dist/visio/connector-jumps.d.ts +5 -0
- package/dist/visio/connector-jumps.d.ts.map +1 -0
- package/dist/visio/connector-route-walk.d.ts +2 -1
- package/dist/visio/connector-route-walk.d.ts.map +1 -1
- package/dist/visio/date-cache.d.ts +3 -0
- package/dist/visio/date-cache.d.ts.map +1 -0
- package/dist/visio/edit-alt-text-scope.d.ts +5 -0
- package/dist/visio/edit-alt-text-scope.d.ts.map +1 -0
- package/dist/visio/edit-alt-text.d.ts +3 -0
- package/dist/visio/edit-alt-text.d.ts.map +1 -0
- package/dist/visio/edit-commands.d.ts +7 -2
- package/dist/visio/edit-commands.d.ts.map +1 -1
- package/dist/visio/edit-formatting-commands.d.ts +5 -0
- package/dist/visio/edit-formatting-commands.d.ts.map +1 -1
- package/dist/visio/edit-formatting-paint.d.ts.map +1 -1
- package/dist/visio/edit-formatting-scope.d.ts.map +1 -1
- package/dist/visio/edit-line-jump-cache.d.ts +4 -0
- package/dist/visio/edit-line-jump-cache.d.ts.map +1 -0
- package/dist/visio/edit-master-index.d.ts.map +1 -1
- package/dist/visio/edit-metadata-commands.d.ts +10 -2
- package/dist/visio/edit-metadata-commands.d.ts.map +1 -1
- package/dist/visio/edit-metadata.d.ts +3 -1
- package/dist/visio/edit-metadata.d.ts.map +1 -1
- package/dist/visio/edit-page-alt-text.d.ts +4 -0
- package/dist/visio/edit-page-alt-text.d.ts.map +1 -0
- package/dist/visio/edit-page-layout.d.ts.map +1 -1
- package/dist/visio/edit-page-rename.d.ts.map +1 -1
- package/dist/visio/edit-page-setup-commands.d.ts +7 -1
- package/dist/visio/edit-page-setup-commands.d.ts.map +1 -1
- package/dist/visio/edit-page-size.d.ts.map +1 -1
- package/dist/visio/edit-pages.d.ts.map +1 -1
- package/dist/visio/edit-recalculate-index.d.ts.map +1 -1
- package/dist/visio/edit-scope.d.ts.map +1 -1
- package/dist/visio/edit-shape-create.d.ts.map +1 -1
- package/dist/visio/edit-stencil-connector-write.d.ts.map +1 -1
- package/dist/visio/edit-style-admission.d.ts.map +1 -1
- package/dist/visio/edit-text-field.d.ts.map +1 -1
- package/dist/visio/edit-text.d.ts.map +1 -1
- package/dist/visio/edit.d.ts +1 -1
- package/dist/visio/edit.d.ts.map +1 -1
- package/dist/visio/index.cjs +1215 -248
- package/dist/visio/index.d.ts +2 -1
- package/dist/visio/index.d.ts.map +1 -1
- package/dist/visio/index.mjs +1215 -249
- package/dist/visio/line-jumps.d.ts +1 -5
- package/dist/visio/line-jumps.d.ts.map +1 -1
- package/dist/visio/model.d.ts +13 -0
- package/dist/visio/model.d.ts.map +1 -1
- package/dist/visio/page-layout.d.ts +11 -2
- package/dist/visio/page-layout.d.ts.map +1 -1
- package/dist/visio/parser.d.ts.map +1 -1
- package/dist/visio/shape-metadata.d.ts +6 -0
- package/dist/visio/shape-metadata.d.ts.map +1 -1
- package/dist/visio/shapes.d.ts.map +1 -1
- package/dist/visio/text-field-case.d.ts +2 -0
- package/dist/visio/text-field-case.d.ts.map +1 -0
- package/dist/visio/text-field-display.d.ts.map +1 -1
- package/dist/visio/text-field-fraction.d.ts +3 -0
- package/dist/visio/text-field-fraction.d.ts.map +1 -0
- package/dist/visio/text-field-numeric.d.ts +4 -0
- package/dist/visio/text-field-numeric.d.ts.map +1 -0
- package/dist/visio/text-field-system-date.d.ts +4 -0
- package/dist/visio/text-field-system-date.d.ts.map +1 -0
- package/dist/visio/text-fields.d.ts +1 -0
- package/dist/visio/text-fields.d.ts.map +1 -1
- package/dist/visio/ui/connector-preview.d.ts +1 -1
- package/dist/visio/ui/connector-preview.d.ts.map +1 -1
- package/dist/visio/ui/data-graphic-rules.d.ts +2 -0
- package/dist/visio/ui/data-graphic-rules.d.ts.map +1 -1
- package/dist/visio/ui/data-graphics.d.ts +3 -2
- package/dist/visio/ui/data-graphics.d.ts.map +1 -1
- package/dist/visio/ui/edit-commands.d.ts.map +1 -1
- package/dist/visio/ui/index.cjs +19310 -18157
- package/dist/visio/ui/index.mjs +19310 -18158
- package/dist/visio/ui/scene-details.d.ts.map +1 -1
- package/dist/visio/ui/scene-validation.d.ts.map +1 -1
- package/dist/visio/ui/snapshot-scene.d.ts +2 -1
- package/dist/visio/ui/snapshot-scene.d.ts.map +1 -1
- package/dist/visio/ui/text-field-catalog.d.ts.map +1 -1
- package/dist/visio/xml-attribute-whitespace.d.ts +5 -0
- package/dist/visio/xml-attribute-whitespace.d.ts.map +1 -0
- package/dist/xlsx/edit/index.d.ts +1 -0
- package/dist/xlsx/edit/index.d.ts.map +1 -1
- package/dist/xlsx/edit/insert-guard.d.ts.map +1 -1
- package/dist/xlsx/edit/merge.d.ts.map +1 -1
- package/dist/xlsx/edit/page-breaks.d.ts +5 -0
- package/dist/xlsx/edit/page-breaks.d.ts.map +1 -0
- package/dist/xlsx/edit/pivots.d.ts +8 -0
- package/dist/xlsx/edit/pivots.d.ts.map +1 -0
- package/dist/xlsx/edit/print-titles.d.ts +7 -0
- package/dist/xlsx/edit/print-titles.d.ts.map +1 -0
- package/dist/xlsx/edit/session.d.ts.map +1 -1
- package/dist/xlsx/edit/sheets.d.ts.map +1 -1
- package/dist/xlsx/edit/shift-formulas.d.ts.map +1 -1
- package/dist/xlsx/edit/shift-sheet.d.ts.map +1 -1
- package/dist/xlsx/edit/sparkline-ranges.d.ts +11 -0
- package/dist/xlsx/edit/sparkline-ranges.d.ts.map +1 -0
- package/dist/xlsx/edit/sparkline-xml.d.ts +13 -0
- package/dist/xlsx/edit/sparkline-xml.d.ts.map +1 -0
- package/dist/xlsx/edit/sparklines.d.ts +16 -0
- package/dist/xlsx/edit/sparklines.d.ts.map +1 -0
- package/dist/xlsx/edit/table-edits.d.ts.map +1 -1
- package/dist/xlsx/edit/tables.d.ts.map +1 -1
- package/dist/xlsx/edit/types.d.ts +22 -1
- package/dist/xlsx/edit/types.d.ts.map +1 -1
- package/dist/xlsx/formula/functions/text-regex.d.ts.map +1 -1
- package/dist/xlsx/index.cjs +3638 -1199
- package/dist/xlsx/index.d.ts +1 -0
- package/dist/xlsx/index.d.ts.map +1 -1
- package/dist/xlsx/index.mjs +3619 -1200
- package/dist/xlsx/layout/cell-view.d.ts +2 -0
- package/dist/xlsx/layout/cell-view.d.ts.map +1 -1
- package/dist/xlsx/layout/header-footer.d.ts +58 -0
- package/dist/xlsx/layout/header-footer.d.ts.map +1 -0
- package/dist/xlsx/layout/index.d.ts +5 -0
- package/dist/xlsx/layout/index.d.ts.map +1 -1
- package/dist/xlsx/layout/print-breaks.d.ts +11 -0
- package/dist/xlsx/layout/print-breaks.d.ts.map +1 -0
- package/dist/xlsx/layout/print-layout.d.ts +34 -0
- package/dist/xlsx/layout/print-layout.d.ts.map +1 -0
- package/dist/xlsx/layout/print-merges.d.ts +18 -0
- package/dist/xlsx/layout/print-merges.d.ts.map +1 -0
- package/dist/xlsx/layout/print-repeat.d.ts +12 -0
- package/dist/xlsx/layout/print-repeat.d.ts.map +1 -0
- package/dist/xlsx/layout/print-titles.d.ts +20 -0
- package/dist/xlsx/layout/print-titles.d.ts.map +1 -0
- package/dist/xlsx/layout/sparkline-data.d.ts.map +1 -1
- package/dist/xlsx/layout/sparkline-view.d.ts.map +1 -1
- package/dist/xlsx/load/index.cjs +8165 -6945
- package/dist/xlsx/load/index.mjs +8165 -6945
- package/dist/xlsx/model-pivots.d.ts +67 -0
- package/dist/xlsx/model-pivots.d.ts.map +1 -0
- package/dist/xlsx/model.d.ts +5 -0
- package/dist/xlsx/model.d.ts.map +1 -1
- package/dist/xlsx/pivot/admission.d.ts +5 -0
- package/dist/xlsx/pivot/admission.d.ts.map +1 -0
- package/dist/xlsx/pivot/aggregate.d.ts +21 -0
- package/dist/xlsx/pivot/aggregate.d.ts.map +1 -0
- package/dist/xlsx/pivot/cache-xml.d.ts +9 -0
- package/dist/xlsx/pivot/cache-xml.d.ts.map +1 -0
- package/dist/xlsx/pivot/data.d.ts +12 -0
- package/dist/xlsx/pivot/data.d.ts.map +1 -0
- package/dist/xlsx/pivot/hierarchy-first.d.ts +21 -0
- package/dist/xlsx/pivot/hierarchy-first.d.ts.map +1 -0
- package/dist/xlsx/pivot/hierarchy.d.ts +5 -0
- package/dist/xlsx/pivot/hierarchy.d.ts.map +1 -0
- package/dist/xlsx/pivot/index.d.ts +3 -0
- package/dist/xlsx/pivot/index.d.ts.map +1 -0
- package/dist/xlsx/pivot/measures.d.ts +13 -0
- package/dist/xlsx/pivot/measures.d.ts.map +1 -0
- package/dist/xlsx/pivot/read.d.ts +5 -0
- package/dist/xlsx/pivot/read.d.ts.map +1 -0
- package/dist/xlsx/pivot/table-xml.d.ts +5 -0
- package/dist/xlsx/pivot/table-xml.d.ts.map +1 -0
- package/dist/xlsx/pivot/values-axis.d.ts +9 -0
- package/dist/xlsx/pivot/values-axis.d.ts.map +1 -0
- package/dist/xlsx/pivot/write.d.ts +11 -0
- package/dist/xlsx/pivot/write.d.ts.map +1 -0
- package/dist/xlsx/read/load.d.ts.map +1 -1
- package/dist/xlsx/read/sheet-props.d.ts.map +1 -1
- package/dist/xlsx/ui/commands/i18n/index.d.ts.map +1 -1
- package/dist/xlsx/ui/commands/i18n/navigation.d.ts.map +1 -1
- package/dist/xlsx/ui/commands/i18n/pivots.d.ts +3 -0
- package/dist/xlsx/ui/commands/i18n/pivots.d.ts.map +1 -0
- package/dist/xlsx/ui/commands/i18n/print-layout.d.ts +3 -0
- package/dist/xlsx/ui/commands/i18n/print-layout.d.ts.map +1 -0
- package/dist/xlsx/ui/commands/i18n/sparklines.d.ts +3 -0
- package/dist/xlsx/ui/commands/i18n/sparklines.d.ts.map +1 -0
- package/dist/xlsx/ui/commands/i18n/tools.d.ts.map +1 -1
- package/dist/xlsx/ui/commands/page-breaks.d.ts +3 -0
- package/dist/xlsx/ui/commands/page-breaks.d.ts.map +1 -0
- package/dist/xlsx/ui/index.cjs +2421 -288
- package/dist/xlsx/ui/index.d.ts +1 -0
- package/dist/xlsx/ui/index.d.ts.map +1 -1
- package/dist/xlsx/ui/index.mjs +2421 -289
- package/dist/xlsx/write/page-setup.d.ts.map +1 -1
- package/dist/xlsx/write/save.d.ts.map +1 -1
- package/dist/xlsx/write/sheet-parts.d.ts +1 -0
- package/dist/xlsx/write/sheet-parts.d.ts.map +1 -1
- package/dist/xlsx/write/workbook-part.d.ts +1 -1
- package/dist/xlsx/write/workbook-part.d.ts.map +1 -1
- package/dist/xlsx/write/worksheet.d.ts.map +1 -1
- package/package.json +1 -1
- package/dist/pptx/chunks/index-CKIUurnd.d.ts.map +0 -1
- package/dist/pptx/chunks/index-Cn-GzYGp.d.ts.map +0 -1
- package/dist/pptx/chunks/smart-art-Q2kZQtHh.d.ts.map +0 -1
- package/dist/pptx/chunks/text-operations-BHfAm5K9.d.ts.map +0 -1
|
@@ -1,39 +1,377 @@
|
|
|
1
|
-
import { hasTextProperties } from '
|
|
1
|
+
import { hasTextProperties, updateCellTextInRawXml, getTblFromRawXml, ensureArray, flattenCellTxBodyText, updateSmartArtNodeText, reconcileSmartArtTextParagraphs } from '../../../chunk-R6KSBNKX.mjs';
|
|
2
|
+
import { remapTextToSegments } from '../../../chunk-CBNKBVX5.mjs';
|
|
3
|
+
import '../../../chunk-F4TB6B32.mjs';
|
|
4
|
+
import '../../../chunk-3E6KBUG5.mjs';
|
|
5
|
+
import '../../../chunk-3GAQLUP6.mjs';
|
|
6
|
+
import '../../../chunk-LRKFBOAA.mjs';
|
|
7
|
+
import '../../../chunk-VPHSMBTD.mjs';
|
|
8
|
+
import '../../../chunk-BEGN4NBQ.mjs';
|
|
9
|
+
import '../../../chunk-WWOVZOGU.mjs';
|
|
10
|
+
|
|
11
|
+
// pptx/editor/render/chart-find-source-guards.ts
|
|
12
|
+
function chartSourceReferenceCounts(slides) {
|
|
13
|
+
const counts = /* @__PURE__ */ new Map();
|
|
14
|
+
function visit(elements) {
|
|
15
|
+
for (const element of elements) {
|
|
16
|
+
if (element.type === "group") visit(element.children);
|
|
17
|
+
else if (element.type === "chart" && element.chartData?.chartPartPath) {
|
|
18
|
+
const part = element.chartData.chartPartPath;
|
|
19
|
+
counts.set(part, (counts.get(part) ?? 0) + 1);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
for (const slide of slides) visit(slide.elements);
|
|
24
|
+
return counts;
|
|
25
|
+
}
|
|
26
|
+
function findMatchChartSource(slides, match) {
|
|
27
|
+
let element = slides[match.slideIndex]?.elements.find((item) => item.id === match.elementId);
|
|
28
|
+
for (const index of match.elementPath ?? []) {
|
|
29
|
+
element = element?.type === "group" ? element.children[index] : void 0;
|
|
30
|
+
}
|
|
31
|
+
return element?.type === "chart" ? element.chartData?.chartPartPath : void 0;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
// pptx/editor/render/chart-label-editability.ts
|
|
35
|
+
var LITERAL_CATEGORY_TYPES = /* @__PURE__ */ new Set([
|
|
36
|
+
"bar",
|
|
37
|
+
"line",
|
|
38
|
+
"pie",
|
|
39
|
+
"ofPie",
|
|
40
|
+
"doughnut",
|
|
41
|
+
"area",
|
|
42
|
+
"radar",
|
|
43
|
+
"bar3D",
|
|
44
|
+
"line3D",
|
|
45
|
+
"pie3D",
|
|
46
|
+
"area3D",
|
|
47
|
+
"surface"
|
|
48
|
+
]);
|
|
49
|
+
function chartLabelsAreEditable(element) {
|
|
50
|
+
const data = element.chartData;
|
|
51
|
+
if (!data) return false;
|
|
52
|
+
if (data.dataLabelTextEditable !== void 0) {
|
|
53
|
+
const shape = data.dataLabelSourceShape;
|
|
54
|
+
return data.dataLabelTextEditable && (!shape || shape.categoryCount === data.categories.length && shape.seriesValueCounts.length === data.series.length && shape.seriesValueCounts.every(
|
|
55
|
+
(count, index) => count === data.series[index]?.values.length
|
|
56
|
+
));
|
|
57
|
+
}
|
|
58
|
+
return !element.rawXml && !data.chartPartPath && !data.externalData && !data.categoryLevels && !data.dateCategories && LITERAL_CATEGORY_TYPES.has(data.chartType) && data.categories.length > 0 && data.series.length > 0 && data.series.every(
|
|
59
|
+
(series) => series.values.length === data.categories.length && series.values.every(Number.isFinite)
|
|
60
|
+
);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
// pptx/editor/render/find-text-targets.ts
|
|
64
|
+
function* smartArtNodes(nodes) {
|
|
65
|
+
for (const node of nodes) {
|
|
66
|
+
yield node;
|
|
67
|
+
if (node.children) yield* smartArtNodes(node.children);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
function textRuns(cell) {
|
|
71
|
+
return cell.textRuns?.length ? cell.textRuns : [{ text: cell.text }];
|
|
72
|
+
}
|
|
73
|
+
function* findTextTargets(element, elementId = element.id, path = [], includeChartTitles = true, includeChartData = false) {
|
|
74
|
+
const location = { elementId, ...path.length ? { elementPath: path } : {} };
|
|
75
|
+
if (element.type === "group") {
|
|
76
|
+
for (const [index, child] of element.children.entries())
|
|
77
|
+
yield* findTextTargets(
|
|
78
|
+
child,
|
|
79
|
+
elementId,
|
|
80
|
+
[...path, index],
|
|
81
|
+
includeChartTitles,
|
|
82
|
+
includeChartData
|
|
83
|
+
);
|
|
84
|
+
} else if (hasTextProperties(element)) {
|
|
85
|
+
const runs = element.textSegments?.length ? element.textSegments : element.text ? [{ text: element.text, style: element.textStyle ?? {} }] : [];
|
|
86
|
+
yield { ...location, runs };
|
|
87
|
+
} else if (element.type === "table" && element.tableData) {
|
|
88
|
+
for (const [rowIndex, row] of element.tableData.rows.entries())
|
|
89
|
+
for (const [colIndex, cell] of row.cells.entries())
|
|
90
|
+
yield { ...location, tableCell: { rowIndex, colIndex }, runs: textRuns(cell) };
|
|
91
|
+
} else if (element.type === "smartArt" && element.smartArtData) {
|
|
92
|
+
for (const node of smartArtNodes(element.smartArtData.nodes))
|
|
93
|
+
yield { ...location, smartArtNodeId: node.id, runs: [{ text: node.text }] };
|
|
94
|
+
} else if (element.type === "chart" && element.chartData) {
|
|
95
|
+
const chart = element.chartData;
|
|
96
|
+
if (includeChartTitles && chart.style?.hasTitle !== false) {
|
|
97
|
+
const runs = chart.titleRuns?.length ? chart.titleRuns : chart.title ? [{ text: chart.title }] : [];
|
|
98
|
+
yield { ...location, chartTitle: true, readOnly: chart.titleTextEditable === false, runs };
|
|
99
|
+
}
|
|
100
|
+
if (includeChartData) {
|
|
101
|
+
const readOnly = !chartLabelsAreEditable(element);
|
|
102
|
+
for (const [chartSeriesIndex, series] of chart.series.entries())
|
|
103
|
+
yield { ...location, chartSeriesIndex, readOnly, runs: [{ text: series.name }] };
|
|
104
|
+
for (const [chartCategoryIndex, text] of chart.categories.entries())
|
|
105
|
+
yield { ...location, chartCategoryIndex, readOnly, runs: [{ text }] };
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
function isFindBreak(run) {
|
|
110
|
+
return Boolean(run.isParagraphBreak || run.isLineBreak || run.text === "\n");
|
|
111
|
+
}
|
|
112
|
+
function replaceFindRuns(runs, startIndex, startOffset, length, replacement) {
|
|
113
|
+
const first = runs[startIndex];
|
|
114
|
+
if (!first || isFindBreak(first) || startOffset < 0 || startOffset >= first.text.length || length <= 0)
|
|
115
|
+
return void 0;
|
|
116
|
+
const next = [...runs];
|
|
117
|
+
let remaining = length;
|
|
118
|
+
for (let index = startIndex; index < runs.length && remaining > 0; index++) {
|
|
119
|
+
const run = runs[index];
|
|
120
|
+
if (isFindBreak(run)) return void 0;
|
|
121
|
+
const offset = index === startIndex ? startOffset : 0;
|
|
122
|
+
const removed = Math.min(remaining, run.text.length - offset);
|
|
123
|
+
next[index] = {
|
|
124
|
+
...run,
|
|
125
|
+
text: run.text.slice(0, offset) + (index === startIndex ? replacement : "") + run.text.slice(offset + removed)
|
|
126
|
+
};
|
|
127
|
+
remaining -= removed;
|
|
128
|
+
}
|
|
129
|
+
return remaining === 0 ? next : void 0;
|
|
130
|
+
}
|
|
131
|
+
function* findSlideTextTargets(slide, includeNotes = false, includeChartTitles = true, includeChartData = false) {
|
|
132
|
+
for (const element of slide.elements)
|
|
133
|
+
yield* findTextTargets(element, element.id, [], includeChartTitles, includeChartData);
|
|
134
|
+
if (includeNotes && slide.notes) {
|
|
135
|
+
const runs = slide.notesSegments?.length && slide.notesSegments.map((run) => run.text).join("") === slide.notes ? slide.notesSegments : [{ text: slide.notes, style: {} }];
|
|
136
|
+
yield { elementId: "", notes: true, runs };
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
// pptx/editor/render/find-replace-target.ts
|
|
141
|
+
function patchTableXml(element, rowIndex, colIndex, original, runs) {
|
|
142
|
+
if (!element.rawXml) return void 0;
|
|
143
|
+
const rawXml = structuredClone(element.rawXml);
|
|
144
|
+
const table = getTblFromRawXml(rawXml);
|
|
145
|
+
const row = ensureArray(table?.["a:tr"])[rowIndex];
|
|
146
|
+
const cell = ensureArray(row?.["a:tc"])[colIndex];
|
|
147
|
+
const paragraphs = ensureArray(
|
|
148
|
+
cell?.["a:txBody"]?.["a:p"]
|
|
149
|
+
);
|
|
150
|
+
let paragraphIndex = 0, runIndex = 0, fieldIndex = 0;
|
|
151
|
+
for (let index = 0; index < original.length; index++) {
|
|
152
|
+
const previous = original[index];
|
|
153
|
+
if (previous.isParagraphBreak) {
|
|
154
|
+
paragraphIndex++;
|
|
155
|
+
runIndex = 0;
|
|
156
|
+
fieldIndex = 0;
|
|
157
|
+
continue;
|
|
158
|
+
}
|
|
159
|
+
if (previous.isLineBreak) continue;
|
|
160
|
+
const paragraph = paragraphs[paragraphIndex];
|
|
161
|
+
const key = previous.isField ? "a:fld" : "a:r";
|
|
162
|
+
const xmlRun = ensureArray(paragraph?.[key])[previous.isField ? fieldIndex++ : runIndex++];
|
|
163
|
+
if (!xmlRun) return void 0;
|
|
164
|
+
if (previous.text !== runs[index].text) xmlRun["a:t"] = runs[index].text;
|
|
165
|
+
}
|
|
166
|
+
return rawXml;
|
|
167
|
+
}
|
|
168
|
+
function updateNode(nodes, nodeId, text) {
|
|
169
|
+
return nodes.map((node) => {
|
|
170
|
+
if (node.id === nodeId) {
|
|
171
|
+
const originalParagraphs = node.paragraphs ?? (node.runs?.length ? [{ items: node.runs.map((run) => ({ kind: "run", run })) }] : void 0);
|
|
172
|
+
const paragraphs = originalParagraphs ? reconcileSmartArtTextParagraphs(originalParagraphs, text) : void 0;
|
|
173
|
+
return { ...node, text, ...paragraphs ? { paragraphs } : {} };
|
|
174
|
+
}
|
|
175
|
+
if (!node.children) return node;
|
|
176
|
+
const children = updateNode(node.children, nodeId, text);
|
|
177
|
+
return children.every((child, index) => child === node.children[index]) ? node : { ...node, children };
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
function replaceLeaf(element, match, replacement) {
|
|
181
|
+
if ((match.chartSeriesIndex !== void 0 || match.chartCategoryIndex !== void 0) && element.type === "chart" && element.chartData) {
|
|
182
|
+
const data = element.chartData;
|
|
183
|
+
if (!chartLabelsAreEditable(element))
|
|
184
|
+
throw new Error("Chart labels require editing in PowerPoint or their source workbook");
|
|
185
|
+
const text = match.chartSeriesIndex !== void 0 ? data.series[match.chartSeriesIndex]?.name : data.categories[match.chartCategoryIndex];
|
|
186
|
+
if (text === void 0) return element;
|
|
187
|
+
const next = replaceFindRuns(
|
|
188
|
+
[{ text }],
|
|
189
|
+
match.segmentIndex,
|
|
190
|
+
match.startOffset,
|
|
191
|
+
match.length,
|
|
192
|
+
replacement
|
|
193
|
+
);
|
|
194
|
+
if (!next) return element;
|
|
195
|
+
return {
|
|
196
|
+
...element,
|
|
197
|
+
chartData: {
|
|
198
|
+
...data,
|
|
199
|
+
dataLabelTextOnly: true,
|
|
200
|
+
...match.chartSeriesIndex !== void 0 ? {
|
|
201
|
+
series: data.series.map(
|
|
202
|
+
(series, index) => index === match.chartSeriesIndex ? { ...series, name: next[0].text } : series
|
|
203
|
+
)
|
|
204
|
+
} : {
|
|
205
|
+
categories: data.categories.map(
|
|
206
|
+
(category, index) => index === match.chartCategoryIndex ? next[0].text : category
|
|
207
|
+
)
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
};
|
|
211
|
+
}
|
|
212
|
+
if (match.chartTitle && element.type === "chart" && element.chartData) {
|
|
213
|
+
const data = element.chartData;
|
|
214
|
+
if (data.titleTextEditable === false)
|
|
215
|
+
throw new Error("This chart title requires editing in PowerPoint or its source workbook");
|
|
216
|
+
const runs = data.titleRuns?.length ? data.titleRuns : [{ text: data.title ?? "" }];
|
|
217
|
+
const next = replaceFindRuns(
|
|
218
|
+
runs,
|
|
219
|
+
match.segmentIndex,
|
|
220
|
+
match.startOffset,
|
|
221
|
+
match.length,
|
|
222
|
+
replacement
|
|
223
|
+
);
|
|
224
|
+
if (!next) return element;
|
|
225
|
+
return {
|
|
226
|
+
...element,
|
|
227
|
+
chartData: {
|
|
228
|
+
...data,
|
|
229
|
+
title: next[0]?.text ?? "",
|
|
230
|
+
titleRuns: next,
|
|
231
|
+
titleTextOnly: true,
|
|
232
|
+
titleTextOnlyStyles: data.titleTextOnlyStyles ?? runs.map(({ text: _text, ...style }) => style),
|
|
233
|
+
style: { ...data.style, hasTitle: next.some((run) => run.text.length > 0) }
|
|
234
|
+
}
|
|
235
|
+
};
|
|
236
|
+
}
|
|
237
|
+
if (match.tableCell && element.type === "table" && element.tableData) {
|
|
238
|
+
const { rowIndex, colIndex } = match.tableCell;
|
|
239
|
+
const row = element.tableData.rows[rowIndex], cell = row?.cells[colIndex];
|
|
240
|
+
if (!cell) return element;
|
|
241
|
+
const original2 = cell.textRuns?.length ? cell.textRuns : [{ text: cell.text }];
|
|
242
|
+
const runs = replaceFindRuns(
|
|
243
|
+
original2,
|
|
244
|
+
match.segmentIndex,
|
|
245
|
+
match.startOffset,
|
|
246
|
+
match.length,
|
|
247
|
+
replacement
|
|
248
|
+
);
|
|
249
|
+
if (!runs) return element;
|
|
250
|
+
let text = runs.map((run) => run.isParagraphBreak ? "\n" : run.isLineBreak ? "" : run.text).join("");
|
|
251
|
+
let rawXml = cell.textRuns?.length ? patchTableXml(element, rowIndex, colIndex, original2, runs) : updateCellTextInRawXml(element, rowIndex, colIndex, text);
|
|
252
|
+
if (rawXml) {
|
|
253
|
+
const table = getTblFromRawXml(rawXml);
|
|
254
|
+
const xmlRow = ensureArray(table?.["a:tr"])[rowIndex];
|
|
255
|
+
const xmlCell = ensureArray(xmlRow?.["a:tc"])[colIndex];
|
|
256
|
+
text = flattenCellTxBodyText(
|
|
257
|
+
xmlCell?.["a:txBody"],
|
|
258
|
+
(value) => ensureArray(value)
|
|
259
|
+
);
|
|
260
|
+
}
|
|
261
|
+
const rows = [...element.tableData.rows], cells = [...row.cells];
|
|
262
|
+
cells[colIndex] = { ...cell, text, ...cell.textRuns ? { textRuns: runs } : {} };
|
|
263
|
+
rows[rowIndex] = { ...row, cells };
|
|
264
|
+
return { ...element, tableData: { ...element.tableData, rows }, ...rawXml ? { rawXml } : {} };
|
|
265
|
+
}
|
|
266
|
+
if (match.smartArtNodeId && element.type === "smartArt" && element.smartArtData) {
|
|
267
|
+
const data = element.smartArtData;
|
|
268
|
+
const nodes = [...smartArtNodes(data.nodes)], node = nodes.find((candidate) => candidate.id === match.smartArtNodeId);
|
|
269
|
+
if (!node || match.startOffset < 0 || match.startOffset + match.length > node.text.length)
|
|
270
|
+
return element;
|
|
271
|
+
const text = node.text.slice(0, match.startOffset) + replacement + node.text.slice(match.startOffset + match.length);
|
|
272
|
+
const next = updateSmartArtNodeText({ ...data, nodes }, node.id, text);
|
|
273
|
+
const drawingShapes = next.drawingShapes?.map((shape, index) => {
|
|
274
|
+
if (shape === data.drawingShapes?.[index] || !shape.textSegments) return shape;
|
|
275
|
+
return {
|
|
276
|
+
...shape,
|
|
277
|
+
textSegments: remapTextToSegments(text, shape.textSegments, { fontSize: shape.fontSize })
|
|
278
|
+
};
|
|
279
|
+
});
|
|
280
|
+
return {
|
|
281
|
+
...element,
|
|
282
|
+
smartArtData: { ...next, drawingShapes, nodes: updateNode(data.nodes, node.id, text) }
|
|
283
|
+
};
|
|
284
|
+
}
|
|
285
|
+
if (!hasTextProperties(element)) return element;
|
|
286
|
+
const original = element.textSegments?.length ? element.textSegments : element.text ? [{ text: element.text, style: element.textStyle ?? {} }] : [];
|
|
287
|
+
const segments = replaceFindRuns(
|
|
288
|
+
original,
|
|
289
|
+
match.segmentIndex,
|
|
290
|
+
match.startOffset,
|
|
291
|
+
match.length,
|
|
292
|
+
replacement
|
|
293
|
+
);
|
|
294
|
+
if (!segments) return element;
|
|
295
|
+
return {
|
|
296
|
+
...element,
|
|
297
|
+
textSegments: segments,
|
|
298
|
+
text: segments.map((run) => isFindBreak(run) ? "\n" : run.text).join("")
|
|
299
|
+
};
|
|
300
|
+
}
|
|
301
|
+
function replaceFindTarget(element, match, replacement, path = match.elementPath ?? []) {
|
|
302
|
+
if (!path.length) return replaceLeaf(element, match, replacement);
|
|
303
|
+
if (element.type !== "group") return element;
|
|
304
|
+
const index = path[0], child = element.children[index];
|
|
305
|
+
if (!child) return element;
|
|
306
|
+
const next = replaceFindTarget(child, match, replacement, path.slice(1));
|
|
307
|
+
if (next === child) return element;
|
|
308
|
+
const children = [...element.children];
|
|
309
|
+
children[index] = next;
|
|
310
|
+
return { ...element, children };
|
|
311
|
+
}
|
|
2
312
|
|
|
3
313
|
// pptx/editor/render/find-replace.ts
|
|
314
|
+
function findReplacementAvailability(matches, index) {
|
|
315
|
+
const hasReadOnly = matches.some((match) => match.readOnly);
|
|
316
|
+
return {
|
|
317
|
+
current: Boolean(matches[index] && !matches[index].readOnly),
|
|
318
|
+
all: matches.length > 0 && !hasReadOnly,
|
|
319
|
+
hasReadOnly
|
|
320
|
+
};
|
|
321
|
+
}
|
|
4
322
|
function findInSlides(slides, query, opts = {}) {
|
|
5
323
|
if (!query) {
|
|
6
324
|
return [];
|
|
7
325
|
}
|
|
8
|
-
const
|
|
9
|
-
const
|
|
326
|
+
const escaped = query.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
327
|
+
const pattern = new RegExp(`(?=(${escaped}))`, opts.matchCase ? "gu" : "giu");
|
|
10
328
|
const results = [];
|
|
329
|
+
const chartSources = chartSourceReferenceCounts(slides);
|
|
11
330
|
for (let slideIndex = 0; slideIndex < slides.length; slideIndex++) {
|
|
12
331
|
const slide = slides[slideIndex];
|
|
13
|
-
for (const
|
|
14
|
-
|
|
15
|
-
|
|
332
|
+
for (const { runs, ...target } of findSlideTextTargets(
|
|
333
|
+
slide,
|
|
334
|
+
opts.includeNotes,
|
|
335
|
+
opts.includeChartTitles,
|
|
336
|
+
opts.includeChartData
|
|
337
|
+
)) {
|
|
338
|
+
if (target.chartTitle || target.chartSeriesIndex !== void 0 || target.chartCategoryIndex !== void 0) {
|
|
339
|
+
const source = findMatchChartSource(slides, { ...target, slideIndex });
|
|
340
|
+
if (source && (chartSources.get(source) ?? 0) > 1) target.readOnly = true;
|
|
16
341
|
}
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
const
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
offset = pos + 1;
|
|
342
|
+
let text = "", totalOffset = 0, regionOffset = 0;
|
|
343
|
+
let positions = [];
|
|
344
|
+
const flush = () => {
|
|
345
|
+
for (const match of text.matchAll(pattern)) {
|
|
346
|
+
const pos = match.index;
|
|
347
|
+
const run = positions.find(
|
|
348
|
+
(position) => pos >= position.offset && pos < position.offset + position.length
|
|
349
|
+
);
|
|
350
|
+
if (run)
|
|
351
|
+
results.push({
|
|
352
|
+
...target,
|
|
353
|
+
slideIndex,
|
|
354
|
+
segmentIndex: run.index,
|
|
355
|
+
startOffset: pos - run.offset,
|
|
356
|
+
length: match[1].length,
|
|
357
|
+
textOffset: regionOffset + pos
|
|
358
|
+
});
|
|
35
359
|
}
|
|
360
|
+
text = "";
|
|
361
|
+
positions = [];
|
|
362
|
+
};
|
|
363
|
+
for (const [index, run] of runs.entries()) {
|
|
364
|
+
if (isFindBreak(run)) {
|
|
365
|
+
flush();
|
|
366
|
+
totalOffset++;
|
|
367
|
+
regionOffset = totalOffset;
|
|
368
|
+
continue;
|
|
369
|
+
}
|
|
370
|
+
positions.push({ index, offset: text.length, length: run.text.length });
|
|
371
|
+
text += run.text;
|
|
372
|
+
totalOffset += run.text.length;
|
|
36
373
|
}
|
|
374
|
+
flush();
|
|
37
375
|
}
|
|
38
376
|
}
|
|
39
377
|
return results;
|
|
@@ -42,9 +380,33 @@ function applyFindReplacements(slides, toReplace, replacement) {
|
|
|
42
380
|
if (toReplace.length === 0) {
|
|
43
381
|
return { slides, replacements: 0 };
|
|
44
382
|
}
|
|
383
|
+
if (toReplace.some((match) => match.readOnly))
|
|
384
|
+
throw new Error(
|
|
385
|
+
"Linked or complex chart text must be edited in PowerPoint or their source workbook"
|
|
386
|
+
);
|
|
387
|
+
const chartSources = chartSourceReferenceCounts(slides);
|
|
388
|
+
if (toReplace.some((match) => {
|
|
389
|
+
if (!match.chartTitle && match.chartSeriesIndex === void 0 && match.chartCategoryIndex === void 0)
|
|
390
|
+
return false;
|
|
391
|
+
const source = findMatchChartSource(slides, match);
|
|
392
|
+
return source && (chartSources.get(source) ?? 0) > 1;
|
|
393
|
+
}))
|
|
394
|
+
throw new Error(
|
|
395
|
+
"Text in a shared chart part requires editing in PowerPoint or its source workbook"
|
|
396
|
+
);
|
|
45
397
|
const grouped = /* @__PURE__ */ new Map();
|
|
46
398
|
for (const match of toReplace) {
|
|
47
|
-
const key =
|
|
399
|
+
const key = JSON.stringify([
|
|
400
|
+
match.slideIndex,
|
|
401
|
+
match.elementId,
|
|
402
|
+
match.elementPath,
|
|
403
|
+
match.tableCell,
|
|
404
|
+
match.smartArtNodeId,
|
|
405
|
+
match.notes,
|
|
406
|
+
match.chartTitle,
|
|
407
|
+
match.chartSeriesIndex,
|
|
408
|
+
match.chartCategoryIndex
|
|
409
|
+
]);
|
|
48
410
|
let bucket = grouped.get(key);
|
|
49
411
|
if (!bucket) {
|
|
50
412
|
bucket = [];
|
|
@@ -55,37 +417,45 @@ function applyFindReplacements(slides, toReplace, replacement) {
|
|
|
55
417
|
const nextSlides = slides.slice();
|
|
56
418
|
let totalReplacements = 0;
|
|
57
419
|
for (const [, matches] of grouped) {
|
|
58
|
-
const sorted = matches.slice().sort((a, b) => b.startOffset - a.startOffset);
|
|
420
|
+
const sorted = matches.slice().sort((a, b) => b.segmentIndex - a.segmentIndex || b.startOffset - a.startOffset);
|
|
421
|
+
let lastOffset = Infinity;
|
|
59
422
|
for (const match of sorted) {
|
|
60
423
|
const slide = nextSlides[match.slideIndex];
|
|
61
424
|
if (!slide) {
|
|
62
425
|
continue;
|
|
63
426
|
}
|
|
427
|
+
if (match.notes) {
|
|
428
|
+
if (match.textOffset !== void 0 && match.textOffset + match.length > lastOffset)
|
|
429
|
+
continue;
|
|
430
|
+
const runs = slide.notesSegments?.length && slide.notesSegments.map((run) => run.text).join("") === slide.notes ? slide.notesSegments : [{ text: slide.notes ?? "", style: {} }];
|
|
431
|
+
const updated2 = replaceFindRuns(
|
|
432
|
+
runs,
|
|
433
|
+
match.segmentIndex,
|
|
434
|
+
match.startOffset,
|
|
435
|
+
match.length,
|
|
436
|
+
replacement
|
|
437
|
+
);
|
|
438
|
+
if (!updated2) continue;
|
|
439
|
+
nextSlides[match.slideIndex] = {
|
|
440
|
+
...slide,
|
|
441
|
+
notes: updated2.map((run) => run.text).join(""),
|
|
442
|
+
notesSegments: updated2
|
|
443
|
+
};
|
|
444
|
+
if (match.textOffset !== void 0) lastOffset = match.textOffset;
|
|
445
|
+
totalReplacements++;
|
|
446
|
+
continue;
|
|
447
|
+
}
|
|
64
448
|
const elIdx = slide.elements.findIndex((e) => e.id === match.elementId);
|
|
65
449
|
if (elIdx === -1) {
|
|
66
450
|
continue;
|
|
67
451
|
}
|
|
452
|
+
if (match.textOffset !== void 0 && match.textOffset + match.length > lastOffset) continue;
|
|
68
453
|
const element = slide.elements[elIdx];
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
const segments = element.textSegments ?? [];
|
|
73
|
-
const seg = segments[match.segmentIndex];
|
|
74
|
-
if (!seg) {
|
|
75
|
-
continue;
|
|
76
|
-
}
|
|
77
|
-
const before = seg.text.slice(0, match.startOffset);
|
|
78
|
-
const after = seg.text.slice(match.startOffset + match.length);
|
|
79
|
-
const newSegText = before + replacement + after;
|
|
80
|
-
const nextSegments = segments.slice();
|
|
81
|
-
nextSegments[match.segmentIndex] = { ...seg, text: newSegText };
|
|
82
|
-
const nextText = nextSegments.map((s) => s.text).join("");
|
|
454
|
+
const updated = replaceFindTarget(element, match, replacement);
|
|
455
|
+
if (updated === element) continue;
|
|
456
|
+
if (match.textOffset !== void 0) lastOffset = match.textOffset;
|
|
83
457
|
const nextElements = slide.elements.slice();
|
|
84
|
-
nextElements[elIdx] =
|
|
85
|
-
...element,
|
|
86
|
-
text: nextText,
|
|
87
|
-
textSegments: nextSegments
|
|
88
|
-
};
|
|
458
|
+
nextElements[elIdx] = updated;
|
|
89
459
|
nextSlides[match.slideIndex] = { ...slide, elements: nextElements };
|
|
90
460
|
totalReplacements++;
|
|
91
461
|
}
|
|
@@ -104,4 +474,4 @@ function replaceInSlides(slides, query, replacement, opts = {}) {
|
|
|
104
474
|
return applyFindReplacements(slides, results, replacement);
|
|
105
475
|
}
|
|
106
476
|
|
|
107
|
-
export { applyFindReplacements, findInSlides, replaceInSlides, replaceMatch };
|
|
477
|
+
export { applyFindReplacements, findInSlides, findReplacementAvailability, replaceInSlides, replaceMatch };
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var chunkAWIDASUW_cjs = require('../../../chunk-AWIDASUW.cjs');
|
|
4
4
|
require('../../../chunk-7IUNOWFJ.cjs');
|
|
5
5
|
require('../../../chunk-Y6665UXH.cjs');
|
|
6
6
|
require('../../../chunk-RGLJ6BCK.cjs');
|
|
@@ -13,5 +13,5 @@ require('../../../chunk-V33BRBWQ.cjs');
|
|
|
13
13
|
|
|
14
14
|
Object.defineProperty(exports, "remapTextToSegments", {
|
|
15
15
|
enumerable: true,
|
|
16
|
-
get: function () { return
|
|
16
|
+
get: function () { return chunkAWIDASUW_cjs.remapTextToSegments; }
|
|
17
17
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"remap-text.d.ts","names":[],"sources":["../../../../pptx/editor/render/remap-text.ts"],"mappings":";;;;;;;;;
|
|
1
|
+
{"version":3,"file":"remap-text.d.ts","names":[],"sources":["../../../../pptx/editor/render/remap-text.ts"],"mappings":";;;;;;;;;wBAiFgB,oBACf,iBACA,kBAAkB,2BAClB,kBAAkB,wBAChB"}
|
|
@@ -1,6 +1,88 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
+
require('../../../chunk-3N6XMMTT.cjs');
|
|
4
|
+
var chunkS6DOCMQC_cjs = require('../../../chunk-S6DOCMQC.cjs');
|
|
5
|
+
|
|
6
|
+
// pptx/core/builders/sdk/slide-operations.ts
|
|
7
|
+
var cloneIdCounter = 0;
|
|
8
|
+
function generateCloneId(prefix) {
|
|
9
|
+
cloneIdCounter += 1;
|
|
10
|
+
return `${prefix}_clone_${Date.now().toString(36)}_${cloneIdCounter}`;
|
|
11
|
+
}
|
|
12
|
+
function reassignElementId(element) {
|
|
13
|
+
const prefix = element.type === "text" ? "txt" : element.type === "shape" ? "shp" : element.type === "connector" ? "cxn" : element.type === "image" || element.type === "picture" ? "img" : element.type === "table" ? "tbl" : element.type === "chart" ? "cht" : element.type === "media" ? "med" : element.type === "group" ? "grp" : element.type;
|
|
14
|
+
const newElement = { ...element, id: generateCloneId(prefix) };
|
|
15
|
+
if (newElement.type === "group" && "children" in newElement) {
|
|
16
|
+
newElement.children = newElement.children.map((child) => reassignElementId(child));
|
|
17
|
+
}
|
|
18
|
+
return newElement;
|
|
19
|
+
}
|
|
20
|
+
function duplicateSlide(slide, newSlideNumber) {
|
|
21
|
+
const cloned = chunkS6DOCMQC_cjs.cloneSlide(slide);
|
|
22
|
+
cloned.sourceSlideId = slide.id.startsWith("ppt/slides/") ? slide.id : slide.sourceSlideId ?? slide.id;
|
|
23
|
+
cloned.id = `slide${newSlideNumber}`;
|
|
24
|
+
cloned.rId = `rId${newSlideNumber + 1}`;
|
|
25
|
+
cloned.slideNumber = newSlideNumber;
|
|
26
|
+
cloned.elements = cloned.elements.map(reassignElementId);
|
|
27
|
+
if (cloned.animations && cloned.animations.length > 0) {
|
|
28
|
+
const idMap = /* @__PURE__ */ new Map();
|
|
29
|
+
const mapElements = (originals, copies) => {
|
|
30
|
+
originals.forEach((original, index) => {
|
|
31
|
+
const copy = copies[index];
|
|
32
|
+
if (!copy) return;
|
|
33
|
+
idMap.set(original.id, copy.id);
|
|
34
|
+
if (original.type === "group" && copy.type === "group")
|
|
35
|
+
mapElements(original.children, copy.children);
|
|
36
|
+
});
|
|
37
|
+
};
|
|
38
|
+
mapElements(slide.elements, cloned.elements);
|
|
39
|
+
cloned.animations = cloned.animations.map((anim) => ({
|
|
40
|
+
...anim,
|
|
41
|
+
elementId: idMap.get(anim.elementId) ?? anim.elementId
|
|
42
|
+
}));
|
|
43
|
+
}
|
|
44
|
+
return cloned;
|
|
45
|
+
}
|
|
46
|
+
|
|
3
47
|
// pptx/editor/render/slide-operations.ts
|
|
48
|
+
function captureSlideClipboard(slides, ids) {
|
|
49
|
+
return ids.flatMap((id) => {
|
|
50
|
+
const slide = slides.find((candidate) => candidate.id === id);
|
|
51
|
+
return slide ? [chunkS6DOCMQC_cjs.cloneSlide(slide)] : [];
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
function createSlidePaste(clipboard, insertAt, templates = {}) {
|
|
55
|
+
return {
|
|
56
|
+
copies: clipboard.map((slide, index) => ({
|
|
57
|
+
...duplicateSlide(slide, insertAt + index + 1),
|
|
58
|
+
id: makeSlideId()
|
|
59
|
+
})),
|
|
60
|
+
sourceIds: clipboard.map((slide) => slide.id),
|
|
61
|
+
insertAt,
|
|
62
|
+
templateElements: clipboard.map((slide) => (templates[slide.id] ?? []).map(chunkS6DOCMQC_cjs.cloneElement))
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
function insertSlidePaste(slides, request) {
|
|
66
|
+
const index = Math.max(0, Math.min(slides.length, request.insertAt));
|
|
67
|
+
const next = [
|
|
68
|
+
...slides.slice(0, index),
|
|
69
|
+
...request.copies.map(chunkS6DOCMQC_cjs.cloneSlide),
|
|
70
|
+
...slides.slice(index)
|
|
71
|
+
];
|
|
72
|
+
return next.map(
|
|
73
|
+
(slide, position) => slide.slideNumber === position + 1 ? slide : { ...slide, slideNumber: position + 1 }
|
|
74
|
+
);
|
|
75
|
+
}
|
|
76
|
+
function applySlidePasteTemplates(mapping, request) {
|
|
77
|
+
const next = { ...mapping };
|
|
78
|
+
request.copies.forEach((copy, index) => {
|
|
79
|
+
next[copy.id] = (request.templateElements[index] ?? []).map(chunkS6DOCMQC_cjs.cloneElement);
|
|
80
|
+
});
|
|
81
|
+
return next;
|
|
82
|
+
}
|
|
83
|
+
function captureSlideClipboardTemplates(mapping, ids) {
|
|
84
|
+
return Object.fromEntries(ids.map((id) => [id, (mapping[id] ?? []).map(chunkS6DOCMQC_cjs.cloneElement)]));
|
|
85
|
+
}
|
|
4
86
|
function makeSlideId(idGenerator) {
|
|
5
87
|
if (idGenerator) {
|
|
6
88
|
return idGenerator();
|
|
@@ -16,5 +98,10 @@ function createBlankSlide(slideNumber, idGenerator) {
|
|
|
16
98
|
};
|
|
17
99
|
}
|
|
18
100
|
|
|
101
|
+
exports.applySlidePasteTemplates = applySlidePasteTemplates;
|
|
102
|
+
exports.captureSlideClipboard = captureSlideClipboard;
|
|
103
|
+
exports.captureSlideClipboardTemplates = captureSlideClipboardTemplates;
|
|
19
104
|
exports.createBlankSlide = createBlankSlide;
|
|
105
|
+
exports.createSlidePaste = createSlidePaste;
|
|
106
|
+
exports.insertSlidePaste = insertSlidePaste;
|
|
20
107
|
exports.makeSlideId = makeSlideId;
|
|
@@ -1,5 +1,21 @@
|
|
|
1
|
-
import { PptxSlide } from "ooxml-core/pptx";
|
|
1
|
+
import { PptxElement, PptxSlide } from "ooxml-core/pptx";
|
|
2
2
|
//#region pptx/editor/render/slide-operations.d.ts
|
|
3
|
+
export interface SlidePasteRequest {
|
|
4
|
+
/** Independent slide copies with their new identities already assigned. */
|
|
5
|
+
readonly copies: PptxSlide[];
|
|
6
|
+
/** Original clipboard identities, for the host's separate template-view cache. */
|
|
7
|
+
readonly sourceIds: string[];
|
|
8
|
+
/** Zero-based insertion position, immediately after the destination selection. */
|
|
9
|
+
readonly insertAt: number;
|
|
10
|
+
/** Template-view content captured with the clipboard, never read from a later live cache. */
|
|
11
|
+
readonly templateElements: PptxElement[][];
|
|
12
|
+
}
|
|
13
|
+
export declare function captureSlideClipboard(slides: readonly PptxSlide[], ids: readonly string[]): PptxSlide[];
|
|
14
|
+
export declare function createSlidePaste(clipboard: readonly PptxSlide[], insertAt: number, templates?: Record<string, PptxElement[]>): SlidePasteRequest;
|
|
15
|
+
/** Apply one paste atomically; copied content and source package hints remain independent. */
|
|
16
|
+
export declare function insertSlidePaste(slides: readonly PptxSlide[], request: SlidePasteRequest): PptxSlide[];
|
|
17
|
+
export declare function applySlidePasteTemplates(mapping: Record<string, PptxElement[]>, request: SlidePasteRequest): Record<string, PptxElement[]>;
|
|
18
|
+
export declare function captureSlideClipboardTemplates(mapping: Record<string, PptxElement[]>, ids: readonly string[]): Record<string, PptxElement[]>;
|
|
3
19
|
/**
|
|
4
20
|
* Generate a collision-resistant slide id of the form
|
|
5
21
|
* `slide-<timestamp>-<base36 suffix>`.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"slide-operations.d.ts","names":[],"sources":["../../../../pptx/editor/render/slide-operations.ts"],"mappings":"
|
|
1
|
+
{"version":3,"file":"slide-operations.d.ts","names":[],"sources":["../../../../pptx/editor/render/slide-operations.ts"],"mappings":";;iBAgBiB;;WAEP,QAAQ;;WAER;;WAEA;;WAEA,kBAAkB;;wBAGZ,sBACf,iBAAiB,aACjB,yBACE;wBAOa,iBACf,oBAAoB,aACpB,kBACA,YAAW,eAAe,iBACxB;;wBAaa,iBACf,iBAAiB,aACjB,SAAS,oBACP;wBAYa,yBACf,SAAS,eAAe,gBACxB,SAAS,oBACP,eAAe;wBAQF,+BACf,SAAS,eAAe,gBACxB,yBACE,eAAe;;;;;;;;wBAWF,YAAY;;;;;;;;;wBAeZ,iBAAiB,qBAAqB,6BAA6B"}
|