ooxml-core 1.8.4 → 1.9.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-AT7FVG5Q.mjs +2 -0
- package/dist/{PptxHandler-BL4B7CZO.mjs → PptxHandler-EX4WBIQQ.mjs} +2 -2
- package/dist/PptxHandler-VFSCECPL.cjs +11 -0
- package/dist/automation/index.cjs +6652 -4002
- package/dist/automation/index.mjs +6652 -4002
- package/dist/chunk-AT66SA5M.cjs +44423 -0
- package/dist/{chunk-TTPZITQN.mjs → chunk-FIELY5PI.mjs} +1 -1
- package/dist/{chunk-ZAP5WLEN.mjs → chunk-IGOA57LE.mjs} +1 -1
- package/dist/chunk-LCS3J3QI.mjs +87604 -0
- package/dist/{chunk-NIHPA63A.mjs → chunk-M76PHYRR.mjs} +54 -37
- package/dist/chunk-OB277ZGE.mjs +44107 -0
- package/dist/{chunk-GAGSCAR3.mjs → chunk-OXHMZS7B.mjs} +552 -178
- package/dist/chunk-SWF7KVL5.cjs +87610 -0
- package/dist/{chunk-Z7IQR4S4.mjs → chunk-WSO4T2LJ.mjs} +246 -21
- 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.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 +1099 -92
- package/dist/docx/layout/index.mjs +1099 -92
- 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/page-cursor.d.ts +13 -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 +31 -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-cell-layout.d.ts +11 -0
- package/dist/docx/layout/table-cell-layout.d.ts.map +1 -0
- package/dist/docx/layout/table-footnotes.d.ts +27 -0
- package/dist/docx/layout/table-footnotes.d.ts.map +1 -0
- package/dist/docx/layout/table-layout.d.ts +10 -4
- package/dist/docx/layout/table-layout.d.ts.map +1 -1
- 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 +621 -207
- package/dist/pptx/automation/index.d.ts +3 -3
- package/dist/pptx/automation/index.mjs +5 -5
- package/dist/pptx/chunks/{index-Cn-GzYGp.d.ts → index-B4cnSPNz.d.ts} +33 -4
- package/dist/pptx/chunks/index-B4cnSPNz.d.ts.map +1 -0
- package/dist/pptx/chunks/{index-CKIUurnd.d.ts → index-BZh-IMkN.d.ts} +14 -9
- package/dist/pptx/chunks/{index-CKIUurnd.d.ts.map → index-BZh-IMkN.d.ts.map} +1 -1
- package/dist/pptx/chunks/{text-operations-BHfAm5K9.d.ts → text-operations-BLodkuXE.d.ts} +29 -12
- package/dist/pptx/chunks/text-operations-BLodkuXE.d.ts.map +1 -0
- package/dist/pptx/cli/index.cjs +622 -213
- package/dist/pptx/cli/index.d.ts +1 -1
- package/dist/pptx/cli/index.mjs +4 -4
- package/dist/pptx/converter/index.cjs +53 -36
- package/dist/pptx/converter/index.d.ts +1 -1
- package/dist/pptx/converter/index.mjs +2 -2
- 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/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 +889 -237
- package/dist/pptx/index.d.ts +4 -4
- package/dist/pptx/index.mjs +5 -5
- package/dist/teams/index.cjs +593 -34
- package/dist/teams/index.mjs +593 -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/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.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 +1091 -233
- package/dist/visio/index.d.ts +2 -1
- package/dist/visio/index.d.ts.map +1 -1
- package/dist/visio/index.mjs +1091 -234
- 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-numeric.d.ts +4 -0
- package/dist/visio/text-field-numeric.d.ts.map +1 -0
- 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 +16898 -15855
- package/dist/visio/ui/index.mjs +16898 -15856
- 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/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 +3159 -1164
- package/dist/xlsx/index.d.ts +1 -0
- package/dist/xlsx/index.d.ts.map +1 -1
- package/dist/xlsx/index.mjs +3140 -1165
- 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 +7784 -6976
- package/dist/xlsx/load/index.mjs +7784 -6976
- package/dist/xlsx/model-pivots.d.ts +46 -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 +19 -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.d.ts +7 -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/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/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 +2001 -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 +2001 -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-Cn-GzYGp.d.ts.map +0 -1
- package/dist/pptx/chunks/text-operations-BHfAm5K9.d.ts.map +0 -1
package/dist/pptx/cli/index.cjs
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
'use strict';
|
|
3
3
|
|
|
4
4
|
var xmldom = require('@xmldom/xmldom');
|
|
5
|
-
var
|
|
5
|
+
var JSZip7 = require('jszip');
|
|
6
6
|
var fastXmlParser = require('fast-xml-parser');
|
|
7
7
|
var mtxDecompressor = require('mtx-decompressor');
|
|
8
8
|
var fs = require('fs');
|
|
@@ -28,7 +28,7 @@ function _interopNamespace(e) {
|
|
|
28
28
|
return Object.freeze(n);
|
|
29
29
|
}
|
|
30
30
|
|
|
31
|
-
var
|
|
31
|
+
var JSZip7__default = /*#__PURE__*/_interopDefault(JSZip7);
|
|
32
32
|
var fs__namespace = /*#__PURE__*/_interopNamespace(fs);
|
|
33
33
|
var path2__namespace = /*#__PURE__*/_interopNamespace(path2);
|
|
34
34
|
|
|
@@ -33057,6 +33057,13 @@ function parseContentTypes(xml) {
|
|
|
33057
33057
|
}
|
|
33058
33058
|
return { defaults, overrides };
|
|
33059
33059
|
}
|
|
33060
|
+
function contentTypeForPart(types, partName) {
|
|
33061
|
+
const overridePath = partName.startsWith("/") ? partName : `/${partName}`;
|
|
33062
|
+
const override = types.overrides.get(overridePath);
|
|
33063
|
+
if (override) return override;
|
|
33064
|
+
const extension = partName.split(".").pop()?.toLowerCase();
|
|
33065
|
+
return extension ? types.defaults.get(extension) : void 0;
|
|
33066
|
+
}
|
|
33060
33067
|
var init_content_types = __esm({
|
|
33061
33068
|
"opc/content-types.ts"() {
|
|
33062
33069
|
init_xml2();
|
|
@@ -33096,10 +33103,13 @@ function relativePartTarget(basePart, targetPart) {
|
|
|
33096
33103
|
}
|
|
33097
33104
|
async function clonePartGraph(options) {
|
|
33098
33105
|
const { zip, sourcePart, targetPart, shouldClone } = options;
|
|
33099
|
-
const
|
|
33100
|
-
const
|
|
33106
|
+
const sourceZip = options.sourceZip ?? zip;
|
|
33107
|
+
const copies = options.copies ?? /* @__PURE__ */ new Map();
|
|
33108
|
+
copies.set(sourcePart, targetPart);
|
|
33109
|
+
const types = parseContentTypes(await sourceZip.file("[Content_Types].xml")?.async("string"));
|
|
33101
33110
|
const reserved = new Set(Object.keys(zip.files));
|
|
33102
33111
|
reserved.add(targetPart);
|
|
33112
|
+
for (const target of copies.values()) reserved.add(target);
|
|
33103
33113
|
const allocate = (source) => {
|
|
33104
33114
|
const match = /^(?<stem>.*?)(?:\d+)?(?<extension>\.[^/.]+)$/u.exec(source);
|
|
33105
33115
|
const stem = match?.groups?.stem ?? source;
|
|
@@ -33111,9 +33121,9 @@ async function clonePartGraph(options) {
|
|
|
33111
33121
|
return path3;
|
|
33112
33122
|
};
|
|
33113
33123
|
const copyRelationships = async (source, destination) => {
|
|
33114
|
-
const contentType = types
|
|
33124
|
+
const contentType = contentTypeForPart(types, source);
|
|
33115
33125
|
if (contentType) await ensureContentTypeOverride(zip, destination, contentType);
|
|
33116
|
-
const xml = await
|
|
33126
|
+
const xml = await sourceZip.file(relationshipsPartFor(source))?.async("string");
|
|
33117
33127
|
if (!xml) return;
|
|
33118
33128
|
const relationships2 = parseRelationships(xml);
|
|
33119
33129
|
for (const relationship of relationships2.values()) {
|
|
@@ -33121,7 +33131,7 @@ async function clonePartGraph(options) {
|
|
|
33121
33131
|
const originalTarget = resolvePartPath(source, relationship.target);
|
|
33122
33132
|
let newTarget = copies.get(originalTarget);
|
|
33123
33133
|
if (!newTarget && shouldClone(relationship, originalTarget)) {
|
|
33124
|
-
const file =
|
|
33134
|
+
const file = sourceZip.file(originalTarget);
|
|
33125
33135
|
if (!file) throw new Error(`Cannot clone missing package part: ${originalTarget}`);
|
|
33126
33136
|
newTarget = allocate(originalTarget);
|
|
33127
33137
|
copies.set(originalTarget, newTarget);
|
|
@@ -41789,7 +41799,7 @@ function resolveCellValue(cell, sharedStrings) {
|
|
|
41789
41799
|
}
|
|
41790
41800
|
async function parseEmbeddedXlsx(xlsxData) {
|
|
41791
41801
|
try {
|
|
41792
|
-
const xlsxZip = await
|
|
41802
|
+
const xlsxZip = await JSZip7__default.default.loadAsync(xlsxData);
|
|
41793
41803
|
const xmlParser = new fastXmlParser.XMLParser({
|
|
41794
41804
|
ignoreAttributes: false,
|
|
41795
41805
|
attributeNamePrefix: "@_",
|
|
@@ -53121,7 +53131,7 @@ async function buildBlankPresentationArchive(options) {
|
|
|
53121
53131
|
const layoutCount = STANDARD_LAYOUTS.length;
|
|
53122
53132
|
const initialSlideCount = Math.max(0, options?.initialSlideCount ?? 0);
|
|
53123
53133
|
const blankLayoutIdx = STANDARD_LAYOUTS.findIndex((l) => l.type === "blank") + 1 || 7;
|
|
53124
|
-
const zip = new
|
|
53134
|
+
const zip = new JSZip7__default.default();
|
|
53125
53135
|
zip.file("[Content_Types].xml", contentTypesXml(layoutCount, initialSlideCount));
|
|
53126
53136
|
zip.file("_rels/.rels", rootRelsXml());
|
|
53127
53137
|
zip.file("ppt/presentation.xml", presentationXml(width, height, initialSlideCount));
|
|
@@ -55806,7 +55816,13 @@ var init_PptxSlideNotesPartUpdater = __esm({
|
|
|
55806
55816
|
init.slideNotesRelationshipType,
|
|
55807
55817
|
`../notesSlides/${fileName}`
|
|
55808
55818
|
);
|
|
55809
|
-
|
|
55819
|
+
const notesXmlObject = this.buildNotesSlide(init.slide, strict);
|
|
55820
|
+
init.updateNotesXmlText(
|
|
55821
|
+
notesXmlObject,
|
|
55822
|
+
init.slide.notes ?? init.slide.notesSegments?.map((segment) => segment.text).join("") ?? "",
|
|
55823
|
+
init.slide.notesSegments
|
|
55824
|
+
);
|
|
55825
|
+
init.zip.file(notesPath, init.xmlBuilder.build(notesXmlObject));
|
|
55810
55826
|
init.zip.file(
|
|
55811
55827
|
`ppt/notesSlides/_rels/${fileName}.rels`,
|
|
55812
55828
|
init.xmlBuilder.build({
|
|
@@ -88339,6 +88355,341 @@ var init_header_footer_parts = __esm({
|
|
|
88339
88355
|
}
|
|
88340
88356
|
});
|
|
88341
88357
|
|
|
88358
|
+
// pptx/core/utils/chart-xlsx-write-validation.ts
|
|
88359
|
+
function unsupported(reason) {
|
|
88360
|
+
throw new Error(`Chart label replacement requires direct literal workbook cells: ${reason}.`);
|
|
88361
|
+
}
|
|
88362
|
+
async function validateAtomicChartWorkbookWrites(zip, parser, paths, writes, requireCurrentValues = false) {
|
|
88363
|
+
const relationships2 = xmlChild(
|
|
88364
|
+
parser.parse(
|
|
88365
|
+
await zip.file("xl/_rels/workbook.xml.rels")?.async("string") ?? ""
|
|
88366
|
+
),
|
|
88367
|
+
"Relationships"
|
|
88368
|
+
);
|
|
88369
|
+
for (const rel of xmlChildren(relationships2, "Relationship")) {
|
|
88370
|
+
if (xmlAttr(rel, "TargetMode") === "External") {
|
|
88371
|
+
unsupported("external worksheet relationships are not supported");
|
|
88372
|
+
}
|
|
88373
|
+
}
|
|
88374
|
+
const sheets = /* @__PURE__ */ new Map();
|
|
88375
|
+
const cellsByPath = /* @__PURE__ */ new Map();
|
|
88376
|
+
for (const path3 of new Set(paths.values())) {
|
|
88377
|
+
const file = zip.file(path3);
|
|
88378
|
+
if (!file) {
|
|
88379
|
+
unsupported("a referenced worksheet is missing");
|
|
88380
|
+
}
|
|
88381
|
+
let tree;
|
|
88382
|
+
try {
|
|
88383
|
+
tree = parser.parse(await file.async("string"));
|
|
88384
|
+
} catch {
|
|
88385
|
+
unsupported("a worksheet cannot be parsed");
|
|
88386
|
+
}
|
|
88387
|
+
const data = xmlChild(xmlChild(tree, "worksheet"), "sheetData");
|
|
88388
|
+
if (!data) {
|
|
88389
|
+
unsupported("a worksheet has no cell data");
|
|
88390
|
+
}
|
|
88391
|
+
if (Object.keys(data).some((key2) => key2.includes(":"))) {
|
|
88392
|
+
unsupported("prefixed worksheet cell nodes are not supported");
|
|
88393
|
+
}
|
|
88394
|
+
const cells = /* @__PURE__ */ new Map();
|
|
88395
|
+
for (const row of xmlChildren(data, "row")) {
|
|
88396
|
+
if (Object.keys(row).some((key2) => key2.includes(":"))) {
|
|
88397
|
+
unsupported("prefixed worksheet cell nodes are not supported");
|
|
88398
|
+
}
|
|
88399
|
+
for (const cell of xmlChildren(row, "c")) {
|
|
88400
|
+
const ref = xmlAttr(cell, "r");
|
|
88401
|
+
if (!ref || cells.has(ref)) {
|
|
88402
|
+
unsupported("duplicate or unidentified worksheet cells are not supported");
|
|
88403
|
+
}
|
|
88404
|
+
cells.set(ref, cell);
|
|
88405
|
+
if (Object.keys(cell).some((key2) => key2 === "f" || key2.endsWith(":f"))) {
|
|
88406
|
+
unsupported("formula-dependent workbooks are not supported");
|
|
88407
|
+
}
|
|
88408
|
+
}
|
|
88409
|
+
}
|
|
88410
|
+
sheets.set(path3, data);
|
|
88411
|
+
cellsByPath.set(path3, cells);
|
|
88412
|
+
}
|
|
88413
|
+
const sharedFile = zip.file("xl/sharedStrings.xml");
|
|
88414
|
+
const shared = sharedFile ? xmlChildren(
|
|
88415
|
+
xmlChild(parser.parse(await sharedFile.async("string")), "sst"),
|
|
88416
|
+
"si"
|
|
88417
|
+
) : [];
|
|
88418
|
+
const destinations = /* @__PURE__ */ new Map();
|
|
88419
|
+
for (const write of writes) {
|
|
88420
|
+
const range = parseChartFormulaRange(write.formula);
|
|
88421
|
+
if (!range || /[\[\]:!]/u.test(range.sheetName)) {
|
|
88422
|
+
unsupported("a range is not a direct local reference");
|
|
88423
|
+
}
|
|
88424
|
+
if ([range.start, range.end].some(
|
|
88425
|
+
(cell) => cell.row < 0 || cell.row >= 1048576 || cell.col < 0 || cell.col >= 16384
|
|
88426
|
+
)) {
|
|
88427
|
+
unsupported("a source cell lies outside the worksheet limits");
|
|
88428
|
+
}
|
|
88429
|
+
const addresses = expandRangeAddresses(range, write.values.length);
|
|
88430
|
+
const path3 = paths.get(range.sheetName.toLowerCase());
|
|
88431
|
+
const data = path3 ? sheets.get(path3) : void 0;
|
|
88432
|
+
if (!addresses || !path3 || !data) {
|
|
88433
|
+
unsupported("a source range cannot be resolved");
|
|
88434
|
+
}
|
|
88435
|
+
for (const [index, address] of addresses.entries()) {
|
|
88436
|
+
const value = write.values[index];
|
|
88437
|
+
const key2 = `${path3}!${address}`;
|
|
88438
|
+
const prior = destinations.get(key2);
|
|
88439
|
+
if (prior && (prior.value !== value || prior.numeric !== write.isNumeric)) {
|
|
88440
|
+
unsupported("overlapping source ranges request conflicting values");
|
|
88441
|
+
}
|
|
88442
|
+
destinations.set(key2, { value, numeric: write.isNumeric });
|
|
88443
|
+
const cell = cellsByPath.get(path3)?.get(address);
|
|
88444
|
+
if (!cell) {
|
|
88445
|
+
unsupported("a source cell is missing");
|
|
88446
|
+
}
|
|
88447
|
+
const type = xmlAttr(cell, "t") ?? "n";
|
|
88448
|
+
const text2 = type === "s" ? shared[Number(xmlText(cell.v))] : xmlChild(cell, "is");
|
|
88449
|
+
if (text2 && Object.keys(text2).some((node) => !node.startsWith("@_") && node !== "t" && node !== "#text")) {
|
|
88450
|
+
unsupported("rich worksheet strings require source-workbook editing");
|
|
88451
|
+
}
|
|
88452
|
+
if (requireCurrentValues) {
|
|
88453
|
+
const current = text2 ? xmlText(text2.t) : xmlText(cell.v);
|
|
88454
|
+
const equal = write.isNumeric ? current !== void 0 && Number(current) === Number(value) : current === value;
|
|
88455
|
+
if (!equal) {
|
|
88456
|
+
unsupported("the workbook and chart caches disagree");
|
|
88457
|
+
}
|
|
88458
|
+
}
|
|
88459
|
+
if (write.isNumeric && !Number.isFinite(Number(value))) {
|
|
88460
|
+
unsupported("a numeric cache value is not finite");
|
|
88461
|
+
}
|
|
88462
|
+
if (!["n", "s", "inlineStr", "str"].includes(type)) {
|
|
88463
|
+
unsupported("a source cell has an unsupported value type");
|
|
88464
|
+
}
|
|
88465
|
+
}
|
|
88466
|
+
}
|
|
88467
|
+
}
|
|
88468
|
+
var init_chart_xlsx_write_validation = __esm({
|
|
88469
|
+
"pptx/core/utils/chart-xlsx-write-validation.ts"() {
|
|
88470
|
+
init_chart_xlsx_cellref();
|
|
88471
|
+
init_xml_access();
|
|
88472
|
+
}
|
|
88473
|
+
});
|
|
88474
|
+
function collectChartWorkbookWrite(xmlLookupService, container2, isNumeric2, values) {
|
|
88475
|
+
if (!container2) {
|
|
88476
|
+
return void 0;
|
|
88477
|
+
}
|
|
88478
|
+
const refNode = xmlLookupService.getChildByLocalName(container2, isNumeric2 ? "numRef" : "strRef");
|
|
88479
|
+
const formula = refNode ? xmlLookupService.getScalarChildByLocalName(refNode, "f") : void 0;
|
|
88480
|
+
return formula ? { formula, isNumeric: isNumeric2, values } : void 0;
|
|
88481
|
+
}
|
|
88482
|
+
function createSpreadsheetXmlParser() {
|
|
88483
|
+
return new fastXmlParser.XMLParser({
|
|
88484
|
+
ignoreAttributes: false,
|
|
88485
|
+
attributeNamePrefix: "@_",
|
|
88486
|
+
trimValues: false,
|
|
88487
|
+
parseTagValue: false,
|
|
88488
|
+
tagValueProcessor: (tagName, tagValue) => preservesSpreadsheetXmlWhitespace(tagName) ? tagValue : tagValue.trim()
|
|
88489
|
+
});
|
|
88490
|
+
}
|
|
88491
|
+
function createSpreadsheetXmlBuilder() {
|
|
88492
|
+
return new fastXmlParser.XMLBuilder({
|
|
88493
|
+
ignoreAttributes: false,
|
|
88494
|
+
attributeNamePrefix: "@_",
|
|
88495
|
+
suppressBooleanAttributes: false,
|
|
88496
|
+
format: false
|
|
88497
|
+
});
|
|
88498
|
+
}
|
|
88499
|
+
async function resolveWorksheetPathsByName(xlsxZip, parser) {
|
|
88500
|
+
const result = /* @__PURE__ */ new Map();
|
|
88501
|
+
const workbookFile = xlsxZip.file("xl/workbook.xml");
|
|
88502
|
+
const relsFile = xlsxZip.file("xl/_rels/workbook.xml.rels");
|
|
88503
|
+
if (!workbookFile || !relsFile) {
|
|
88504
|
+
return result;
|
|
88505
|
+
}
|
|
88506
|
+
try {
|
|
88507
|
+
const workbookTree = parser.parse(await workbookFile.async("string"));
|
|
88508
|
+
const relsTree = parser.parse(await relsFile.async("string"));
|
|
88509
|
+
const targetByRelId = /* @__PURE__ */ new Map();
|
|
88510
|
+
const relationships2 = xmlChild(relsTree, "Relationships");
|
|
88511
|
+
for (const rel of xmlChildren(relationships2, "Relationship")) {
|
|
88512
|
+
const id = xmlAttr(rel, "Id");
|
|
88513
|
+
const target = xmlAttr(rel, "Target");
|
|
88514
|
+
if (id && target) {
|
|
88515
|
+
targetByRelId.set(id, target);
|
|
88516
|
+
}
|
|
88517
|
+
}
|
|
88518
|
+
const workbookRoot = xmlChild(workbookTree, "workbook");
|
|
88519
|
+
const sheets = xmlChild(workbookRoot, "sheets");
|
|
88520
|
+
for (const sheet of xmlChildren(sheets, "sheet")) {
|
|
88521
|
+
const name = xmlAttr(sheet, "name");
|
|
88522
|
+
const relId = xmlAttr(sheet, "r:id") ?? xmlAttr(sheet, "id");
|
|
88523
|
+
const target = relId ? targetByRelId.get(relId) : void 0;
|
|
88524
|
+
if (name && target) {
|
|
88525
|
+
result.set(name.toLowerCase(), resolveWorkbookPartPath(target));
|
|
88526
|
+
}
|
|
88527
|
+
}
|
|
88528
|
+
} catch {
|
|
88529
|
+
}
|
|
88530
|
+
return result;
|
|
88531
|
+
}
|
|
88532
|
+
function resolveWorkbookPartPath(target) {
|
|
88533
|
+
return target.startsWith("/") ? target.slice(1) : `xl/${target}`;
|
|
88534
|
+
}
|
|
88535
|
+
async function writeChartWorkbookUpdates(xlsxBytes, writes, options = {}) {
|
|
88536
|
+
if (writes.length === 0) {
|
|
88537
|
+
return { unresolved: 0 };
|
|
88538
|
+
}
|
|
88539
|
+
let xlsxZip;
|
|
88540
|
+
try {
|
|
88541
|
+
xlsxZip = await JSZip7__default.default.loadAsync(xlsxBytes);
|
|
88542
|
+
} catch {
|
|
88543
|
+
if (options.atomic) {
|
|
88544
|
+
throw new Error("Chart label replacement requires a readable embedded workbook.");
|
|
88545
|
+
}
|
|
88546
|
+
return { unresolved: writes.length };
|
|
88547
|
+
}
|
|
88548
|
+
const parser = createSpreadsheetXmlParser();
|
|
88549
|
+
const sheetPathByName = await resolveWorksheetPathsByName(xlsxZip, parser);
|
|
88550
|
+
if (options.atomic) {
|
|
88551
|
+
await validateAtomicChartWorkbookWrites(
|
|
88552
|
+
xlsxZip,
|
|
88553
|
+
parser,
|
|
88554
|
+
sheetPathByName,
|
|
88555
|
+
writes,
|
|
88556
|
+
options.requireCurrentValues ?? false
|
|
88557
|
+
);
|
|
88558
|
+
}
|
|
88559
|
+
const writesBySheetPath = /* @__PURE__ */ new Map();
|
|
88560
|
+
let unresolved = 0;
|
|
88561
|
+
for (const write of writes) {
|
|
88562
|
+
const range = parseChartFormulaRange(write.formula);
|
|
88563
|
+
const sheetPath = range ? sheetPathByName.get(range.sheetName.toLowerCase()) : void 0;
|
|
88564
|
+
const refs = range ? expandRangeAddresses(range, write.values.length) : void 0;
|
|
88565
|
+
if (!range || !sheetPath || !refs) {
|
|
88566
|
+
unresolved += 1;
|
|
88567
|
+
continue;
|
|
88568
|
+
}
|
|
88569
|
+
const bucket = writesBySheetPath.get(sheetPath) ?? [];
|
|
88570
|
+
bucket.push({ refs, values: write.values, isNumeric: write.isNumeric });
|
|
88571
|
+
writesBySheetPath.set(sheetPath, bucket);
|
|
88572
|
+
}
|
|
88573
|
+
const builder3 = createSpreadsheetXmlBuilder();
|
|
88574
|
+
let changedAny = false;
|
|
88575
|
+
for (const [sheetPath, resolvedWrites] of writesBySheetPath) {
|
|
88576
|
+
const sheetFile = xlsxZip.file(sheetPath);
|
|
88577
|
+
if (!sheetFile) {
|
|
88578
|
+
unresolved += resolvedWrites.length;
|
|
88579
|
+
continue;
|
|
88580
|
+
}
|
|
88581
|
+
try {
|
|
88582
|
+
const sheetTree = parser.parse(await sheetFile.async("string"));
|
|
88583
|
+
const cellWrites = resolvedWrites.flatMap(
|
|
88584
|
+
({ refs, values, isNumeric: isNumeric2 }) => refs.map((ref, i2) => ({ ref, isNumeric: isNumeric2, value: values[i2] }))
|
|
88585
|
+
);
|
|
88586
|
+
if (applyCellWritesToWorksheet(sheetTree, cellWrites)) {
|
|
88587
|
+
xlsxZip.file(sheetPath, builder3.build(sheetTree));
|
|
88588
|
+
changedAny = true;
|
|
88589
|
+
}
|
|
88590
|
+
} catch {
|
|
88591
|
+
unresolved += resolvedWrites.length;
|
|
88592
|
+
}
|
|
88593
|
+
}
|
|
88594
|
+
if (options.atomic && unresolved > 0) {
|
|
88595
|
+
throw new Error("Chart label replacement could not update every source range.");
|
|
88596
|
+
}
|
|
88597
|
+
if (!changedAny) {
|
|
88598
|
+
return { unresolved };
|
|
88599
|
+
}
|
|
88600
|
+
const bytes = await xlsxZip.generateAsync({
|
|
88601
|
+
type: "uint8array",
|
|
88602
|
+
compression: "DEFLATE",
|
|
88603
|
+
compressionOptions: { level: 6 }
|
|
88604
|
+
});
|
|
88605
|
+
return { bytes, unresolved };
|
|
88606
|
+
}
|
|
88607
|
+
var init_chart_xlsx_writer = __esm({
|
|
88608
|
+
"pptx/core/utils/chart-xlsx-writer.ts"() {
|
|
88609
|
+
init_chart_xlsx_cellref();
|
|
88610
|
+
init_chart_xlsx_write_validation();
|
|
88611
|
+
init_chart_xlsx_sheet_cells();
|
|
88612
|
+
init_xml_access();
|
|
88613
|
+
init_xml_whitespace();
|
|
88614
|
+
}
|
|
88615
|
+
});
|
|
88616
|
+
function formulaCount(value) {
|
|
88617
|
+
if (!value || typeof value !== "object") return 0;
|
|
88618
|
+
if (Array.isArray(value)) return value.reduce((total, item) => total + formulaCount(item), 0);
|
|
88619
|
+
return Object.entries(value).reduce(
|
|
88620
|
+
(total, [key2, child30]) => total + (key2 === "f" || key2.endsWith(":f") ? 1 : formulaCount(child30)),
|
|
88621
|
+
0
|
|
88622
|
+
);
|
|
88623
|
+
}
|
|
88624
|
+
async function chartLabelsHaveEditableSources(xml, zip, chartSpace, seriesNodes, series, categories, external, chartPartPath, resolve2) {
|
|
88625
|
+
if (!chartSpace || seriesNodes.length !== series.length || !categories.length || external?.isExternal)
|
|
88626
|
+
return false;
|
|
88627
|
+
if (formulaCount(chartSpace) !== seriesNodes.reduce((sum, node) => sum + formulaCount(node), 0))
|
|
88628
|
+
return false;
|
|
88629
|
+
const writes = [];
|
|
88630
|
+
const labelOwners = /* @__PURE__ */ new Map();
|
|
88631
|
+
for (const [index, node] of seriesNodes.entries()) {
|
|
88632
|
+
const entry2 = series[index];
|
|
88633
|
+
for (const [name, numeric, values] of [
|
|
88634
|
+
["tx", false, [entry2.name]],
|
|
88635
|
+
["cat", false, [...categories]],
|
|
88636
|
+
["val", true, entry2.values.map(String)]
|
|
88637
|
+
]) {
|
|
88638
|
+
const container2 = xml.getChildByLocalName(node, name);
|
|
88639
|
+
if (!container2) return false;
|
|
88640
|
+
const write = collectChartWorkbookWrite(xml, container2, numeric, [...values]);
|
|
88641
|
+
if (write) {
|
|
88642
|
+
writes.push(write);
|
|
88643
|
+
if (!numeric) {
|
|
88644
|
+
const range = parseChartFormulaRange(write.formula);
|
|
88645
|
+
const addresses = range ? expandRangeAddresses(range, values.length) : void 0;
|
|
88646
|
+
if (!range || !addresses) return false;
|
|
88647
|
+
for (const [point2, address] of addresses.entries()) {
|
|
88648
|
+
const key2 = `${range.sheetName.toLowerCase()}!${address}`;
|
|
88649
|
+
const owner = name === "tx" ? `series:${index}` : `category:${point2}`;
|
|
88650
|
+
if (labelOwners.has(key2) && labelOwners.get(key2) !== owner) return false;
|
|
88651
|
+
labelOwners.set(key2, owner);
|
|
88652
|
+
}
|
|
88653
|
+
}
|
|
88654
|
+
} else if (external || !xml.getChildByLocalName(container2, numeric ? "numLit" : "strLit") && !(name === "tx" && xml.getScalarChildByLocalName(container2, "v") !== void 0))
|
|
88655
|
+
return false;
|
|
88656
|
+
}
|
|
88657
|
+
}
|
|
88658
|
+
if (formulaCount(chartSpace) !== writes.length) return false;
|
|
88659
|
+
if (!external) return writes.length === 0;
|
|
88660
|
+
if (!external.targetPath || !external.embeddedWorkbookData) return false;
|
|
88661
|
+
const target = resolve2(chartPartPath, external.targetPath);
|
|
88662
|
+
let references = 0;
|
|
88663
|
+
const parser = new fastXmlParser.XMLParser({ ignoreAttributes: false, attributeNamePrefix: "@_" });
|
|
88664
|
+
try {
|
|
88665
|
+
for (const path3 of Object.keys(zip.files)) {
|
|
88666
|
+
if (!path3.endsWith(".rels") || !path3.includes("/_rels/")) continue;
|
|
88667
|
+
const source = path3.replace("/_rels/", "/").slice(0, -5);
|
|
88668
|
+
const tree = parser.parse(await zip.file(path3).async("string"));
|
|
88669
|
+
for (const rel of xmlChildren(xmlChild(tree, "Relationships"), "Relationship")) {
|
|
88670
|
+
const relationshipTarget2 = xmlAttr(rel, "Target");
|
|
88671
|
+
if (relationshipTarget2 && xmlAttr(rel, "TargetMode") !== "External" && resolve2(source, relationshipTarget2) === target)
|
|
88672
|
+
references++;
|
|
88673
|
+
}
|
|
88674
|
+
}
|
|
88675
|
+
if (references !== 1) return false;
|
|
88676
|
+
await writeChartWorkbookUpdates(external.embeddedWorkbookData, writes, {
|
|
88677
|
+
atomic: true,
|
|
88678
|
+
requireCurrentValues: true
|
|
88679
|
+
});
|
|
88680
|
+
return true;
|
|
88681
|
+
} catch {
|
|
88682
|
+
return false;
|
|
88683
|
+
}
|
|
88684
|
+
}
|
|
88685
|
+
var init_chart_label_source = __esm({
|
|
88686
|
+
"pptx/core/utils/chart-label-source.ts"() {
|
|
88687
|
+
init_chart_xlsx_writer();
|
|
88688
|
+
init_xml_access();
|
|
88689
|
+
init_chart_xlsx_cellref();
|
|
88690
|
+
}
|
|
88691
|
+
});
|
|
88692
|
+
|
|
88342
88693
|
// pptx/core/utils/chart-band-fmts.ts
|
|
88343
88694
|
function safeUnsignedInt2(val) {
|
|
88344
88695
|
const n = Number(val);
|
|
@@ -95768,7 +96119,7 @@ function buildContentTypesXml(overrides) {
|
|
|
95768
96119
|
}
|
|
95769
96120
|
async function buildMetroBlobPackage(input) {
|
|
95770
96121
|
const root = ROOT[input.kind];
|
|
95771
|
-
const zip = new
|
|
96122
|
+
const zip = new JSZip7__default.default();
|
|
95772
96123
|
const overrides = new Map([
|
|
95773
96124
|
[root.path, root.contentType],
|
|
95774
96125
|
...input.parts.contentTypes,
|
|
@@ -96084,7 +96435,7 @@ async function buildOne(zip, slidePath, slideXml3, element) {
|
|
|
96084
96435
|
});
|
|
96085
96436
|
}
|
|
96086
96437
|
async function buildMetroBlobs(pptxBytes, slides) {
|
|
96087
|
-
const zip = await
|
|
96438
|
+
const zip = await JSZip7__default.default.loadAsync(pptxBytes);
|
|
96088
96439
|
const slidePaths = await orderedSlidePaths(zip);
|
|
96089
96440
|
const out = /* @__PURE__ */ new Map();
|
|
96090
96441
|
for (let i2 = 0; i2 < slides.length; i2++) {
|
|
@@ -99076,7 +99427,7 @@ function withDeclaration(xml) {
|
|
|
99076
99427
|
${body}`;
|
|
99077
99428
|
}
|
|
99078
99429
|
async function zipParts(parts) {
|
|
99079
|
-
const zip = new
|
|
99430
|
+
const zip = new JSZip7__default.default();
|
|
99080
99431
|
for (const [name, text2] of parts) {
|
|
99081
99432
|
zip.file(name, text2);
|
|
99082
99433
|
}
|
|
@@ -99123,7 +99474,7 @@ async function buildMasterRoundTrip(source) {
|
|
|
99123
99474
|
};
|
|
99124
99475
|
}
|
|
99125
99476
|
async function buildDeckMasterRoundTripsFromPptx(pptxBytes) {
|
|
99126
|
-
const zip = await
|
|
99477
|
+
const zip = await JSZip7__default.default.loadAsync(pptxBytes);
|
|
99127
99478
|
const slidePaths = await readSlideMasterPaths(zip);
|
|
99128
99479
|
const masterPaths = [...new Set(slidePaths)];
|
|
99129
99480
|
if (masterPaths.length === 0) {
|
|
@@ -102370,6 +102721,18 @@ var init_tag_package = __esm({
|
|
|
102370
102721
|
}
|
|
102371
102722
|
});
|
|
102372
102723
|
|
|
102724
|
+
// pptx/core/utils/chart-workbook-data-signature.ts
|
|
102725
|
+
function chartWorkbookDataSignature(data) {
|
|
102726
|
+
return JSON.stringify({
|
|
102727
|
+
categories: data.dateCategories?.values ?? data.categories,
|
|
102728
|
+
series: data.series.map((series) => ({ name: series.name, values: series.values }))
|
|
102729
|
+
});
|
|
102730
|
+
}
|
|
102731
|
+
var init_chart_workbook_data_signature = __esm({
|
|
102732
|
+
"pptx/core/utils/chart-workbook-data-signature.ts"() {
|
|
102733
|
+
}
|
|
102734
|
+
});
|
|
102735
|
+
|
|
102373
102736
|
// pptx/core/utils/chart-axis-deleted.ts
|
|
102374
102737
|
function authoredDeleted(node) {
|
|
102375
102738
|
if (node === void 0) {
|
|
@@ -103457,6 +103820,33 @@ var init_chart_title_run_alignment = __esm({
|
|
|
103457
103820
|
}
|
|
103458
103821
|
});
|
|
103459
103822
|
|
|
103823
|
+
// pptx/core/utils/chart-title-text-edit.ts
|
|
103824
|
+
function patchChartTitleRunText(title, runs, local) {
|
|
103825
|
+
const tx = title[findKey6(title, "tx", local) ?? ""];
|
|
103826
|
+
const rich = tx?.[findKey6(tx, "rich", local) ?? ""];
|
|
103827
|
+
const raw = rich?.[findKey6(rich, "p", local) ?? ""];
|
|
103828
|
+
const paragraphs = Array.isArray(raw) ? raw : raw ? [raw] : [];
|
|
103829
|
+
if (paragraphs.length !== 1) return false;
|
|
103830
|
+
const paragraph = paragraphs[0];
|
|
103831
|
+
if (findKey6(paragraph, "br", local) || findKey6(paragraph, "fld", local)) return false;
|
|
103832
|
+
const rawRuns = paragraph[findKey6(paragraph, "r", local) ?? ""];
|
|
103833
|
+
const original = Array.isArray(rawRuns) ? rawRuns : rawRuns ? [rawRuns] : [];
|
|
103834
|
+
if (original.length !== runs.length) return false;
|
|
103835
|
+
const keys = original.map((run) => findKey6(run, "t", local));
|
|
103836
|
+
if (keys.some((key2) => !key2)) return false;
|
|
103837
|
+
for (const [index, value] of original.entries()) {
|
|
103838
|
+
const run = value, key2 = keys[index];
|
|
103839
|
+
const text2 = run[key2];
|
|
103840
|
+
run[key2] = text2 && typeof text2 === "object" && !Array.isArray(text2) ? { ...text2, "#text": runs[index].text } : runs[index].text;
|
|
103841
|
+
}
|
|
103842
|
+
return true;
|
|
103843
|
+
}
|
|
103844
|
+
var init_chart_title_text_edit = __esm({
|
|
103845
|
+
"pptx/core/utils/chart-title-text-edit.ts"() {
|
|
103846
|
+
init_chart_title_xml_ops();
|
|
103847
|
+
}
|
|
103848
|
+
});
|
|
103849
|
+
|
|
103460
103850
|
// pptx/core/utils/chart-title-serializer.ts
|
|
103461
103851
|
function applyChartTitleToXml(chartRoot, model, getLocalName2, options = { prefix: "c" }) {
|
|
103462
103852
|
const { prefix } = options;
|
|
@@ -103482,11 +103872,18 @@ function applyChartTitleToXml(chartRoot, model, getLocalName2, options = { prefi
|
|
|
103482
103872
|
runs = realignOrCollapseTitleRuns(staleRuns, model.title);
|
|
103483
103873
|
}
|
|
103484
103874
|
let titleNode = existingKey ? chartRoot[existingKey] : void 0;
|
|
103875
|
+
const textOnlyStylesMatch = Boolean(
|
|
103876
|
+
runs && model.titleTextOnlyStyles?.length === runs.length && runs.every(
|
|
103877
|
+
(run, index) => ["bold", "italic", "fontSize", "color"].every(
|
|
103878
|
+
(key2) => run[key2] === model.titleTextOnlyStyles[index][key2]
|
|
103879
|
+
)
|
|
103880
|
+
)
|
|
103881
|
+
);
|
|
103485
103882
|
if (runs && titleNode && typeof titleNode === "object") {
|
|
103486
103883
|
const existingTexts = [];
|
|
103487
103884
|
collectAllText(titleNode, getLocalName2, existingTexts);
|
|
103488
103885
|
const newTexts = runs.map((run) => run.text);
|
|
103489
|
-
if (existingTexts.length === newTexts.length && existingTexts.every((text2, index) => text2 === newTexts[index])) {
|
|
103886
|
+
if ((!model.titleTextOnly || textOnlyStylesMatch) && existingTexts.length === newTexts.length && existingTexts.every((text2, index) => text2 === newTexts[index])) {
|
|
103490
103887
|
runs = void 0;
|
|
103491
103888
|
}
|
|
103492
103889
|
}
|
|
@@ -103498,6 +103895,12 @@ function applyChartTitleToXml(chartRoot, model, getLocalName2, options = { prefi
|
|
|
103498
103895
|
insertAt2(chartRoot, 0, `${prefix}:title`, titleNode);
|
|
103499
103896
|
}
|
|
103500
103897
|
} else if (runs) {
|
|
103898
|
+
if (model.titleTextOnly && textOnlyStylesMatch) {
|
|
103899
|
+
if (!patchChartTitleRunText(titleNode, runs, getLocalName2))
|
|
103900
|
+
throw new Error("This chart title cannot be replaced without changing its text source");
|
|
103901
|
+
if (prefix === "c") setAutoTitleDeleted(chartRoot, false, getLocalName2);
|
|
103902
|
+
return true;
|
|
103903
|
+
}
|
|
103501
103904
|
const txKey = findKey6(titleNode, "tx", getLocalName2);
|
|
103502
103905
|
if (txKey) {
|
|
103503
103906
|
titleNode[txKey] = buildTitleTextFromRuns(prefix, runs);
|
|
@@ -103521,6 +103924,7 @@ var init_chart_title_serializer = __esm({
|
|
|
103521
103924
|
"pptx/core/utils/chart-title-serializer.ts"() {
|
|
103522
103925
|
init_chart_title_node_builder();
|
|
103523
103926
|
init_chart_title_run_alignment();
|
|
103927
|
+
init_chart_title_text_edit();
|
|
103524
103928
|
init_chart_title_xml_ops();
|
|
103525
103929
|
}
|
|
103526
103930
|
});
|
|
@@ -103682,131 +104086,6 @@ var init_chart_title_style_serializer = __esm({
|
|
|
103682
104086
|
};
|
|
103683
104087
|
}
|
|
103684
104088
|
});
|
|
103685
|
-
function collectChartWorkbookWrite(xmlLookupService, container2, isNumeric2, values) {
|
|
103686
|
-
if (!container2) {
|
|
103687
|
-
return void 0;
|
|
103688
|
-
}
|
|
103689
|
-
const refNode = xmlLookupService.getChildByLocalName(container2, isNumeric2 ? "numRef" : "strRef");
|
|
103690
|
-
const formula = refNode ? xmlLookupService.getScalarChildByLocalName(refNode, "f") : void 0;
|
|
103691
|
-
return formula ? { formula, isNumeric: isNumeric2, values } : void 0;
|
|
103692
|
-
}
|
|
103693
|
-
function createSpreadsheetXmlParser() {
|
|
103694
|
-
return new fastXmlParser.XMLParser({
|
|
103695
|
-
ignoreAttributes: false,
|
|
103696
|
-
attributeNamePrefix: "@_",
|
|
103697
|
-
trimValues: false,
|
|
103698
|
-
tagValueProcessor: (tagName, tagValue) => preservesSpreadsheetXmlWhitespace(tagName) ? tagValue : tagValue.trim()
|
|
103699
|
-
});
|
|
103700
|
-
}
|
|
103701
|
-
function createSpreadsheetXmlBuilder() {
|
|
103702
|
-
return new fastXmlParser.XMLBuilder({
|
|
103703
|
-
ignoreAttributes: false,
|
|
103704
|
-
attributeNamePrefix: "@_",
|
|
103705
|
-
suppressBooleanAttributes: false,
|
|
103706
|
-
format: false
|
|
103707
|
-
});
|
|
103708
|
-
}
|
|
103709
|
-
async function resolveWorksheetPathsByName(xlsxZip, parser) {
|
|
103710
|
-
const result = /* @__PURE__ */ new Map();
|
|
103711
|
-
const workbookFile = xlsxZip.file("xl/workbook.xml");
|
|
103712
|
-
const relsFile = xlsxZip.file("xl/_rels/workbook.xml.rels");
|
|
103713
|
-
if (!workbookFile || !relsFile) {
|
|
103714
|
-
return result;
|
|
103715
|
-
}
|
|
103716
|
-
try {
|
|
103717
|
-
const workbookTree = parser.parse(await workbookFile.async("string"));
|
|
103718
|
-
const relsTree = parser.parse(await relsFile.async("string"));
|
|
103719
|
-
const targetByRelId = /* @__PURE__ */ new Map();
|
|
103720
|
-
const relationships2 = xmlChild(relsTree, "Relationships");
|
|
103721
|
-
for (const rel of xmlChildren(relationships2, "Relationship")) {
|
|
103722
|
-
const id = xmlAttr(rel, "Id");
|
|
103723
|
-
const target = xmlAttr(rel, "Target");
|
|
103724
|
-
if (id && target) {
|
|
103725
|
-
targetByRelId.set(id, target);
|
|
103726
|
-
}
|
|
103727
|
-
}
|
|
103728
|
-
const workbookRoot = xmlChild(workbookTree, "workbook");
|
|
103729
|
-
const sheets = xmlChild(workbookRoot, "sheets");
|
|
103730
|
-
for (const sheet of xmlChildren(sheets, "sheet")) {
|
|
103731
|
-
const name = xmlAttr(sheet, "name");
|
|
103732
|
-
const relId = xmlAttr(sheet, "r:id") ?? xmlAttr(sheet, "id");
|
|
103733
|
-
const target = relId ? targetByRelId.get(relId) : void 0;
|
|
103734
|
-
if (name && target) {
|
|
103735
|
-
result.set(name.toLowerCase(), resolveWorkbookPartPath(target));
|
|
103736
|
-
}
|
|
103737
|
-
}
|
|
103738
|
-
} catch {
|
|
103739
|
-
}
|
|
103740
|
-
return result;
|
|
103741
|
-
}
|
|
103742
|
-
function resolveWorkbookPartPath(target) {
|
|
103743
|
-
return target.startsWith("/") ? target.slice(1) : `xl/${target}`;
|
|
103744
|
-
}
|
|
103745
|
-
async function writeChartWorkbookUpdates(xlsxBytes, writes) {
|
|
103746
|
-
if (writes.length === 0) {
|
|
103747
|
-
return { unresolved: 0 };
|
|
103748
|
-
}
|
|
103749
|
-
let xlsxZip;
|
|
103750
|
-
try {
|
|
103751
|
-
xlsxZip = await JSZip6__default.default.loadAsync(xlsxBytes);
|
|
103752
|
-
} catch {
|
|
103753
|
-
return { unresolved: writes.length };
|
|
103754
|
-
}
|
|
103755
|
-
const parser = createSpreadsheetXmlParser();
|
|
103756
|
-
const sheetPathByName = await resolveWorksheetPathsByName(xlsxZip, parser);
|
|
103757
|
-
const writesBySheetPath = /* @__PURE__ */ new Map();
|
|
103758
|
-
let unresolved = 0;
|
|
103759
|
-
for (const write of writes) {
|
|
103760
|
-
const range = parseChartFormulaRange(write.formula);
|
|
103761
|
-
const sheetPath = range ? sheetPathByName.get(range.sheetName.toLowerCase()) : void 0;
|
|
103762
|
-
const refs = range ? expandRangeAddresses(range, write.values.length) : void 0;
|
|
103763
|
-
if (!range || !sheetPath || !refs) {
|
|
103764
|
-
unresolved += 1;
|
|
103765
|
-
continue;
|
|
103766
|
-
}
|
|
103767
|
-
const bucket = writesBySheetPath.get(sheetPath) ?? [];
|
|
103768
|
-
bucket.push({ refs, values: write.values, isNumeric: write.isNumeric });
|
|
103769
|
-
writesBySheetPath.set(sheetPath, bucket);
|
|
103770
|
-
}
|
|
103771
|
-
const builder3 = createSpreadsheetXmlBuilder();
|
|
103772
|
-
let changedAny = false;
|
|
103773
|
-
for (const [sheetPath, resolvedWrites] of writesBySheetPath) {
|
|
103774
|
-
const sheetFile = xlsxZip.file(sheetPath);
|
|
103775
|
-
if (!sheetFile) {
|
|
103776
|
-
unresolved += resolvedWrites.length;
|
|
103777
|
-
continue;
|
|
103778
|
-
}
|
|
103779
|
-
try {
|
|
103780
|
-
const sheetTree = parser.parse(await sheetFile.async("string"));
|
|
103781
|
-
const cellWrites = resolvedWrites.flatMap(
|
|
103782
|
-
({ refs, values, isNumeric: isNumeric2 }) => refs.map((ref, i2) => ({ ref, isNumeric: isNumeric2, value: values[i2] }))
|
|
103783
|
-
);
|
|
103784
|
-
if (applyCellWritesToWorksheet(sheetTree, cellWrites)) {
|
|
103785
|
-
xlsxZip.file(sheetPath, builder3.build(sheetTree));
|
|
103786
|
-
changedAny = true;
|
|
103787
|
-
}
|
|
103788
|
-
} catch {
|
|
103789
|
-
unresolved += resolvedWrites.length;
|
|
103790
|
-
}
|
|
103791
|
-
}
|
|
103792
|
-
if (!changedAny) {
|
|
103793
|
-
return { unresolved };
|
|
103794
|
-
}
|
|
103795
|
-
const bytes = await xlsxZip.generateAsync({
|
|
103796
|
-
type: "uint8array",
|
|
103797
|
-
compression: "DEFLATE",
|
|
103798
|
-
compressionOptions: { level: 6 }
|
|
103799
|
-
});
|
|
103800
|
-
return { bytes, unresolved };
|
|
103801
|
-
}
|
|
103802
|
-
var init_chart_xlsx_writer = __esm({
|
|
103803
|
-
"pptx/core/utils/chart-xlsx-writer.ts"() {
|
|
103804
|
-
init_chart_xlsx_cellref();
|
|
103805
|
-
init_chart_xlsx_sheet_cells();
|
|
103806
|
-
init_xml_access();
|
|
103807
|
-
init_xml_whitespace();
|
|
103808
|
-
}
|
|
103809
|
-
});
|
|
103810
104089
|
|
|
103811
104090
|
// pptx/core/core/runtime/chart-cx-update-data.ts
|
|
103812
104091
|
function findKey31(node, localName28, getLocalName2) {
|
|
@@ -104142,13 +104421,19 @@ var init_chart_cx_update = __esm({
|
|
|
104142
104421
|
});
|
|
104143
104422
|
|
|
104144
104423
|
// pptx/core/core/runtime/chart-external-workbook-save.ts
|
|
104145
|
-
async function saveChartExternalWorkbookUpdates(deps, chartPartPath, slidePath, externalData, writes) {
|
|
104424
|
+
async function saveChartExternalWorkbookUpdates(deps, chartPartPath, slidePath, externalData, writes, atomic = false) {
|
|
104425
|
+
if (atomic && externalData && (!externalData.targetPath || externalData.isExternal)) {
|
|
104426
|
+
throw new Error("Chart label replacement cannot update an external or missing workbook.");
|
|
104427
|
+
}
|
|
104146
104428
|
if (writes.length === 0 || !externalData?.targetPath) {
|
|
104147
|
-
return;
|
|
104429
|
+
return writes.length === 0;
|
|
104148
104430
|
}
|
|
104149
104431
|
const embeddingPath = deps.resolveImagePath(chartPartPath, externalData.targetPath);
|
|
104150
104432
|
const looksEmbedded = embeddingPath.includes("embeddings/") && /\.xlsx$/iu.test(embeddingPath);
|
|
104151
|
-
if (!looksEmbedded) {
|
|
104433
|
+
if (!looksEmbedded || externalData.isExternal) {
|
|
104434
|
+
if (atomic) {
|
|
104435
|
+
throw new Error("Chart label replacement requires an embedded .xlsx workbook.");
|
|
104436
|
+
}
|
|
104152
104437
|
deps.reportWarning({
|
|
104153
104438
|
code: "CHART_EXTERNAL_DATA_WRITEBACK_UNSUPPORTED",
|
|
104154
104439
|
message: "Chart data changes were saved to the cached values only: the linked data source is external or not an embedded .xlsx workbook, so it was not updated.",
|
|
@@ -104157,10 +104442,13 @@ async function saveChartExternalWorkbookUpdates(deps, chartPartPath, slidePath,
|
|
|
104157
104442
|
slideId: slidePath,
|
|
104158
104443
|
xmlPath: chartPartPath
|
|
104159
104444
|
});
|
|
104160
|
-
return;
|
|
104445
|
+
return false;
|
|
104161
104446
|
}
|
|
104162
104447
|
const xlsxFile = deps.zip.file(embeddingPath);
|
|
104163
104448
|
if (!xlsxFile) {
|
|
104449
|
+
if (atomic) {
|
|
104450
|
+
throw new Error("Chart label replacement workbook is missing.");
|
|
104451
|
+
}
|
|
104164
104452
|
deps.reportWarning({
|
|
104165
104453
|
code: "CHART_EMBEDDED_WORKBOOK_MISSING",
|
|
104166
104454
|
message: "Chart data changes were saved to the cached values only: the referenced embedded workbook was not found in the package.",
|
|
@@ -104169,12 +104457,15 @@ async function saveChartExternalWorkbookUpdates(deps, chartPartPath, slidePath,
|
|
|
104169
104457
|
slideId: slidePath,
|
|
104170
104458
|
xmlPath: embeddingPath
|
|
104171
104459
|
});
|
|
104172
|
-
return;
|
|
104460
|
+
return false;
|
|
104173
104461
|
}
|
|
104174
104462
|
let xlsxBytes;
|
|
104175
104463
|
try {
|
|
104176
104464
|
xlsxBytes = await xlsxFile.async("uint8array");
|
|
104177
104465
|
} catch {
|
|
104466
|
+
if (atomic) {
|
|
104467
|
+
throw new Error("Chart label replacement workbook cannot be read.");
|
|
104468
|
+
}
|
|
104178
104469
|
deps.reportWarning({
|
|
104179
104470
|
code: "CHART_EMBEDDED_WORKBOOK_UNREADABLE",
|
|
104180
104471
|
message: "Chart data changes were saved to the cached values only: the referenced embedded workbook could not be read.",
|
|
@@ -104183,9 +104474,9 @@ async function saveChartExternalWorkbookUpdates(deps, chartPartPath, slidePath,
|
|
|
104183
104474
|
slideId: slidePath,
|
|
104184
104475
|
xmlPath: embeddingPath
|
|
104185
104476
|
});
|
|
104186
|
-
return;
|
|
104477
|
+
return false;
|
|
104187
104478
|
}
|
|
104188
|
-
const result = await writeChartWorkbookUpdates(xlsxBytes, writes);
|
|
104479
|
+
const result = await writeChartWorkbookUpdates(xlsxBytes, writes, { atomic });
|
|
104189
104480
|
if (result.bytes) {
|
|
104190
104481
|
deps.zip.file(embeddingPath, result.bytes);
|
|
104191
104482
|
}
|
|
@@ -104199,6 +104490,7 @@ async function saveChartExternalWorkbookUpdates(deps, chartPartPath, slidePath,
|
|
|
104199
104490
|
xmlPath: embeddingPath
|
|
104200
104491
|
});
|
|
104201
104492
|
}
|
|
104493
|
+
return result.unresolved === 0;
|
|
104202
104494
|
}
|
|
104203
104495
|
var init_chart_external_workbook_save = __esm({
|
|
104204
104496
|
"pptx/core/core/runtime/chart-external-workbook-save.ts"() {
|
|
@@ -106708,7 +107000,7 @@ var init_PptxHandlerRuntimeState = __esm({
|
|
|
106708
107000
|
*/
|
|
106709
107001
|
savedSlideFingerprints = /* @__PURE__ */ new Map();
|
|
106710
107002
|
/**
|
|
106711
|
-
* `chartData`
|
|
107003
|
+
* `chartData` as parsed or last serialized into the current ZIP,
|
|
106712
107004
|
* serialized to JSON and keyed by `chartPartPath`. The save pipeline used
|
|
106713
107005
|
* to re-serialize EVERY chart part on any slide rewrite regardless of
|
|
106714
107006
|
* whether the chart itself was touched, which materializes the load-time
|
|
@@ -106721,6 +107013,10 @@ var init_PptxHandlerRuntimeState = __esm({
|
|
|
106721
107013
|
* untouched chart part pass through byte-for-byte instead.
|
|
106722
107014
|
*/
|
|
106723
107015
|
chartDataBaselines = /* @__PURE__ */ new Map();
|
|
107016
|
+
/** Pending chart requests also retain warned workbook writes for later retry. */
|
|
107017
|
+
pendingChartUpdates;
|
|
107018
|
+
/** Last fully reconciled workbook data plus whether a write-back needs retry. */
|
|
107019
|
+
chartWorkbookDataBaselines = /* @__PURE__ */ new Map();
|
|
106724
107020
|
/** Per-slide relationship maps: slide path -> (rId -> target path). */
|
|
106725
107021
|
slideRelsMap = /* @__PURE__ */ new Map();
|
|
106726
107022
|
/** Tracks relationship IDs with TargetMode="External" per slide/part path. */
|
|
@@ -114555,6 +114851,7 @@ var init_table_tblpr_save = __esm({
|
|
|
114555
114851
|
var CHART_DATA_DISPLAY_OPTIONS_EXT_URI, PptxHandlerRuntime24;
|
|
114556
114852
|
var init_PptxHandlerRuntimeSaveDataSerialization = __esm({
|
|
114557
114853
|
"pptx/core/core/runtime/PptxHandlerRuntimeSaveDataSerialization.ts"() {
|
|
114854
|
+
init_chart_workbook_data_signature();
|
|
114558
114855
|
init_chart_axis_dispunits_serializer();
|
|
114559
114856
|
init_chart_axis_gridlines_serializer();
|
|
114560
114857
|
init_chart_axis_label_formatting();
|
|
@@ -114692,8 +114989,6 @@ var init_PptxHandlerRuntimeSaveDataSerialization = __esm({
|
|
|
114692
114989
|
console.warn("Failed to serialize table data:", e);
|
|
114693
114990
|
}
|
|
114694
114991
|
}
|
|
114695
|
-
/** Pending chart data updates to process in the async save method. */
|
|
114696
|
-
pendingChartUpdates;
|
|
114697
114992
|
/**
|
|
114698
114993
|
* Record `chartData` as parsed, straight off `enrichChartData`, as this
|
|
114699
114994
|
* chart's load-time baseline. See {@link chartDataBaselines}.
|
|
@@ -114703,6 +114998,10 @@ var init_PptxHandlerRuntimeSaveDataSerialization = __esm({
|
|
|
114703
114998
|
return;
|
|
114704
114999
|
}
|
|
114705
115000
|
this.chartDataBaselines.set(chartData.chartPartPath, JSON.stringify(chartData));
|
|
115001
|
+
this.chartWorkbookDataBaselines.set(chartData.chartPartPath, {
|
|
115002
|
+
signature: chartWorkbookDataSignature(chartData),
|
|
115003
|
+
pending: false
|
|
115004
|
+
});
|
|
114706
115005
|
}
|
|
114707
115006
|
/**
|
|
114708
115007
|
* Collect chart data for deferred async processing during save.
|
|
@@ -114719,12 +115018,28 @@ var init_PptxHandlerRuntimeSaveDataSerialization = __esm({
|
|
|
114719
115018
|
/**
|
|
114720
115019
|
* Process all pending chart data updates (called from the async save method).
|
|
114721
115020
|
*/
|
|
114722
|
-
async processPendingChartUpdates() {
|
|
115021
|
+
async processPendingChartUpdates(slides) {
|
|
114723
115022
|
if (!this.pendingChartUpdates || this.pendingChartUpdates.length === 0) {
|
|
114724
115023
|
return;
|
|
114725
115024
|
}
|
|
115025
|
+
if (slides) {
|
|
115026
|
+
const current = /* @__PURE__ */ new Map();
|
|
115027
|
+
const visit = (elements2, slidePath) => {
|
|
115028
|
+
for (const element of elements2) {
|
|
115029
|
+
if (element.type === "group") visit(element.children, slidePath);
|
|
115030
|
+
else if (element.type === "chart" && element.chartData?.chartPartPath) {
|
|
115031
|
+
current.set(element.chartData.chartPartPath, {
|
|
115032
|
+
chartData: element.chartData,
|
|
115033
|
+
slidePath
|
|
115034
|
+
});
|
|
115035
|
+
}
|
|
115036
|
+
}
|
|
115037
|
+
};
|
|
115038
|
+
for (const slide of slides) visit(slide.elements, slide.id);
|
|
115039
|
+
this.pendingChartUpdates = [...current.values()];
|
|
115040
|
+
}
|
|
114726
115041
|
for (const { chartData, slidePath } of this.pendingChartUpdates) {
|
|
114727
|
-
if (chartData.chartPartPath && this.chartDataBaselines.get(chartData.chartPartPath) === JSON.stringify(chartData)) {
|
|
115042
|
+
if (chartData.chartPartPath && !this.chartWorkbookDataBaselines.get(chartData.chartPartPath)?.pending && this.chartDataBaselines.get(chartData.chartPartPath) === JSON.stringify(chartData)) {
|
|
114728
115043
|
continue;
|
|
114729
115044
|
}
|
|
114730
115045
|
if (chartData.colorPalette && chartData.colorStylePartPath) {
|
|
@@ -115143,7 +115458,9 @@ var init_PptxHandlerRuntimeSaveDataSerialization = __esm({
|
|
|
115143
115458
|
{
|
|
115144
115459
|
title: chartData.title,
|
|
115145
115460
|
hasTitle: chartData.style?.hasTitle,
|
|
115146
|
-
titleRuns: chartData.titleRuns
|
|
115461
|
+
titleRuns: chartData.titleRuns,
|
|
115462
|
+
titleTextOnly: chartData.titleTextOnly,
|
|
115463
|
+
titleTextOnlyStyles: chartData.titleTextOnlyStyles
|
|
115147
115464
|
},
|
|
115148
115465
|
(key2) => this.compatibilityService.getXmlLocalName(key2)
|
|
115149
115466
|
);
|
|
@@ -115335,23 +115652,41 @@ var init_PptxHandlerRuntimeSaveDataSerialization = __esm({
|
|
|
115335
115652
|
}
|
|
115336
115653
|
}
|
|
115337
115654
|
await this.syncChartUserShapesToXml(chartSpace, chartData, chartPartPath);
|
|
115655
|
+
const serializedBaseline = this.chartDataBaselines.get(chartPartPath);
|
|
115656
|
+
const signature = chartWorkbookDataSignature(chartData);
|
|
115657
|
+
const workbookBaseline = this.chartWorkbookDataBaselines.get(chartPartPath);
|
|
115658
|
+
const previousSignature = workbookBaseline?.signature ?? (serializedBaseline ? chartWorkbookDataSignature(JSON.parse(serializedBaseline)) : void 0);
|
|
115659
|
+
const workbookDataChanged = workbookBaseline?.pending || signature !== previousSignature;
|
|
115660
|
+
if (workbookDataChanged) {
|
|
115661
|
+
const complete = await saveChartExternalWorkbookUpdates(
|
|
115662
|
+
{
|
|
115663
|
+
zip: this.zip,
|
|
115664
|
+
resolveImagePath: (basePath, target) => this.resolveImagePath(basePath, target),
|
|
115665
|
+
reportWarning: (warning) => this.compatibilityService.reportWarning(warning)
|
|
115666
|
+
},
|
|
115667
|
+
chartPartPath,
|
|
115668
|
+
slidePath,
|
|
115669
|
+
chartData.externalData,
|
|
115670
|
+
workbookWrites,
|
|
115671
|
+
chartData.dataLabelTextOnly ?? false
|
|
115672
|
+
);
|
|
115673
|
+
this.chartWorkbookDataBaselines.set(chartPartPath, {
|
|
115674
|
+
signature: complete ? signature : previousSignature ?? signature,
|
|
115675
|
+
pending: !complete
|
|
115676
|
+
});
|
|
115677
|
+
}
|
|
115338
115678
|
this.zip.file(chartPartPath, this.builder.build(chartXmlData));
|
|
115339
|
-
|
|
115340
|
-
{
|
|
115341
|
-
zip: this.zip,
|
|
115342
|
-
resolveImagePath: (basePath, target) => this.resolveImagePath(basePath, target),
|
|
115343
|
-
reportWarning: (warning) => this.compatibilityService.reportWarning(warning)
|
|
115344
|
-
},
|
|
115345
|
-
chartPartPath,
|
|
115346
|
-
slidePath,
|
|
115347
|
-
chartData.externalData,
|
|
115348
|
-
workbookWrites
|
|
115349
|
-
);
|
|
115679
|
+
this.chartDataBaselines.set(chartPartPath, JSON.stringify(chartData));
|
|
115350
115680
|
} catch (e) {
|
|
115681
|
+
if (chartData.dataLabelTextOnly) {
|
|
115682
|
+
throw e;
|
|
115683
|
+
}
|
|
115351
115684
|
console.warn(`[pptx-save] Failed to serialize chart data for ${chartPartPath}:`, e);
|
|
115352
115685
|
}
|
|
115353
115686
|
}
|
|
115354
|
-
this.pendingChartUpdates =
|
|
115687
|
+
this.pendingChartUpdates = this.pendingChartUpdates.filter(
|
|
115688
|
+
({ chartData }) => chartData.chartPartPath && this.chartWorkbookDataBaselines.get(chartData.chartPartPath)?.pending
|
|
115689
|
+
);
|
|
115355
115690
|
}
|
|
115356
115691
|
/**
|
|
115357
115692
|
* Route a chart save that the 2006 `c:*Chart` update loop cannot handle:
|
|
@@ -123555,22 +123890,44 @@ function drawingNamespace(strict) {
|
|
|
123555
123890
|
var NOTES_MASTER_CONTENT_TYPE, PptxHandlerRuntime50;
|
|
123556
123891
|
var init_PptxHandlerRuntimeSaveNotesInfrastructure = __esm({
|
|
123557
123892
|
"pptx/core/core/runtime/PptxHandlerRuntimeSaveNotesInfrastructure.ts"() {
|
|
123893
|
+
init_relationships();
|
|
123558
123894
|
init_PptxHandlerRuntimeSaveViewProperties();
|
|
123559
123895
|
NOTES_MASTER_CONTENT_TYPE = "application/vnd.openxmlformats-officedocument.presentationml.notesMaster+xml";
|
|
123560
123896
|
PptxHandlerRuntime50 = class extends PptxHandlerRuntime49 {
|
|
123561
123897
|
/** Ensure authored notes have the global notes-master OPC infrastructure. */
|
|
123562
123898
|
async ensureNotesMasterForAuthoredNotes(slides, constants) {
|
|
123563
123899
|
const needsNotes = slides.some(
|
|
123564
|
-
(slide) => slide.notes
|
|
123900
|
+
(slide) => Boolean(slide.notes) || Boolean(slide.notesSegments?.some((segment) => segment.text))
|
|
123565
123901
|
);
|
|
123566
123902
|
if (!needsNotes || Object.keys(this.zip.files).some(
|
|
123567
123903
|
(path3) => /^ppt\/notesMasters\/notesMaster\d+\.xml$/u.test(path3)
|
|
123568
123904
|
)) {
|
|
123569
123905
|
return;
|
|
123570
123906
|
}
|
|
123907
|
+
const relsPath2 = "ppt/_rels/presentation.xml.rels";
|
|
123908
|
+
const relsXml = await this.zip.file(relsPath2)?.async("string");
|
|
123909
|
+
if (!relsXml || !this.presentationData) return;
|
|
123910
|
+
if (Array.from(parseRelationships(relsXml).values()).some(
|
|
123911
|
+
(relationship) => relationship.type.endsWith("/notesMaster") && relationship.mode !== "External" && this.zip.file(resolvePartPath("ppt/presentation.xml", relationship.target))
|
|
123912
|
+
))
|
|
123913
|
+
return;
|
|
123571
123914
|
const strict = constants.conformance === "strict";
|
|
123572
123915
|
const masterPath = "ppt/notesMasters/notesMaster1.xml";
|
|
123573
|
-
const
|
|
123916
|
+
const sourceThemePath = Object.keys(this.zip.files).find((path3) => /^ppt\/theme\/theme\d+\.xml$/u.test(path3)) ?? "ppt/theme/theme1.xml";
|
|
123917
|
+
let themeIndex = 1;
|
|
123918
|
+
while (this.zip.file(`ppt/theme/theme${themeIndex}.xml`)) themeIndex += 1;
|
|
123919
|
+
const themePath = `ppt/theme/theme${themeIndex}.xml`;
|
|
123920
|
+
const themeBytes = await this.zip.file(sourceThemePath)?.async("uint8array");
|
|
123921
|
+
const theme = themeBytes ?? this.buildThemeXml(themePath, void 0);
|
|
123922
|
+
if (!theme) throw new Error("Cannot create a notes theme from the presentation state");
|
|
123923
|
+
this.zip.file(themePath, theme);
|
|
123924
|
+
const themeRelationships = await this.zip.file(`ppt/theme/_rels/${sourceThemePath.slice(sourceThemePath.lastIndexOf("/") + 1)}.rels`)?.async("uint8array");
|
|
123925
|
+
if (themeRelationships)
|
|
123926
|
+
this.zip.file(`ppt/theme/_rels/theme${themeIndex}.xml.rels`, themeRelationships);
|
|
123927
|
+
await this.addContentTypeOverride(
|
|
123928
|
+
`/${themePath}`,
|
|
123929
|
+
"application/vnd.openxmlformats-officedocument.theme+xml"
|
|
123930
|
+
);
|
|
123574
123931
|
this.zip.file(masterPath, this.builder.build(this.buildDefaultNotesMaster(strict)));
|
|
123575
123932
|
this.zip.file(
|
|
123576
123933
|
"ppt/notesMasters/_rels/notesMaster1.xml.rels",
|
|
@@ -123585,11 +123942,6 @@ var init_PptxHandlerRuntimeSaveNotesInfrastructure = __esm({
|
|
|
123585
123942
|
}
|
|
123586
123943
|
})
|
|
123587
123944
|
);
|
|
123588
|
-
const relsPath2 = "ppt/_rels/presentation.xml.rels";
|
|
123589
|
-
const relsXml = await this.zip.file(relsPath2)?.async("string");
|
|
123590
|
-
if (!relsXml || !this.presentationData) {
|
|
123591
|
-
return;
|
|
123592
|
-
}
|
|
123593
123945
|
const relsData = this.parser.parse(relsXml);
|
|
123594
123946
|
const relsRoot = relsData["Relationships"] ?? {};
|
|
123595
123947
|
const relationships2 = asArray7(relsRoot["Relationship"]);
|
|
@@ -124324,7 +124676,7 @@ var init_PptxHandlerRuntimeSavePipeline = __esm({
|
|
|
124324
124676
|
saveSession,
|
|
124325
124677
|
saveConstants
|
|
124326
124678
|
);
|
|
124327
|
-
await this.processPendingChartUpdates();
|
|
124679
|
+
await this.processPendingChartUpdates(slides);
|
|
124328
124680
|
await this.ensureChartPartContentTypes();
|
|
124329
124681
|
await this.ensureOleEmbeddingContentTypes();
|
|
124330
124682
|
await this.processPendingOleContentUpdates();
|
|
@@ -134335,6 +134687,7 @@ var init_PptxHandlerRuntimeChartExternalData = __esm({
|
|
|
134335
134687
|
);
|
|
134336
134688
|
const autoUpdateAttr = externalDataNode["@_autoUpdate"];
|
|
134337
134689
|
const autoUpdate = autoUpdateNode?.["@_val"] === "1" || autoUpdateNode?.["@_val"] === "true" || autoUpdateAttr === "1" || autoUpdateAttr === "true" || false;
|
|
134690
|
+
let isExternal = false;
|
|
134338
134691
|
let targetPath;
|
|
134339
134692
|
try {
|
|
134340
134693
|
const chartDir = chartPartPath.substring(0, chartPartPath.lastIndexOf("/") + 1);
|
|
@@ -134349,6 +134702,7 @@ var init_PptxHandlerRuntimeChartExternalData = __esm({
|
|
|
134349
134702
|
for (const rel of rels) {
|
|
134350
134703
|
if (String(rel?.["@_Id"] || "") === relId) {
|
|
134351
134704
|
targetPath = String(rel?.["@_Target"] || "").trim() || void 0;
|
|
134705
|
+
isExternal = String(rel?.["@_TargetMode"] || "") === "External";
|
|
134352
134706
|
break;
|
|
134353
134707
|
}
|
|
134354
134708
|
}
|
|
@@ -134357,7 +134711,7 @@ var init_PptxHandlerRuntimeChartExternalData = __esm({
|
|
|
134357
134711
|
} catch {
|
|
134358
134712
|
}
|
|
134359
134713
|
let embeddedWorkbookData;
|
|
134360
|
-
if (targetPath) {
|
|
134714
|
+
if (targetPath && !isExternal) {
|
|
134361
134715
|
try {
|
|
134362
134716
|
const embeddingPath = this.resolveImagePath(chartPartPath, targetPath);
|
|
134363
134717
|
if (embeddingPath.includes("embeddings/") && embeddingPath.endsWith(".xlsx")) {
|
|
@@ -134371,6 +134725,7 @@ var init_PptxHandlerRuntimeChartExternalData = __esm({
|
|
|
134371
134725
|
}
|
|
134372
134726
|
return {
|
|
134373
134727
|
relId,
|
|
134728
|
+
...isExternal ? { isExternal: true } : {},
|
|
134374
134729
|
targetPath,
|
|
134375
134730
|
autoUpdate,
|
|
134376
134731
|
...embeddedWorkbookData ? { embeddedWorkbookData } : {}
|
|
@@ -134741,6 +135096,8 @@ var init_PptxHandlerRuntimeChartExParsing = __esm({
|
|
|
134741
135096
|
...result.categoryLevels ? { categoryLevels: result.categoryLevels } : {},
|
|
134742
135097
|
series: result.series,
|
|
134743
135098
|
title: cxTitleText,
|
|
135099
|
+
titleTextEditable: false,
|
|
135100
|
+
dataLabelTextEditable: false,
|
|
134744
135101
|
style: chartStyle2,
|
|
134745
135102
|
chartPartPath,
|
|
134746
135103
|
chartRelationshipId,
|
|
@@ -134764,6 +135121,7 @@ var init_PptxHandlerRuntimeChartExParsing = __esm({
|
|
|
134764
135121
|
var PptxHandlerRuntime95;
|
|
134765
135122
|
var init_PptxHandlerRuntimeChartParsing = __esm({
|
|
134766
135123
|
"pptx/core/core/runtime/PptxHandlerRuntimeChartParsing.ts"() {
|
|
135124
|
+
init_chart_label_source();
|
|
134767
135125
|
init_chart_advanced_parser();
|
|
134768
135126
|
init_chart_axis_parser();
|
|
134769
135127
|
init_chart_band_fmts();
|
|
@@ -134954,12 +135312,34 @@ var init_PptxHandlerRuntimeChartParsing = __esm({
|
|
|
134954
135312
|
colorAdapter
|
|
134955
135313
|
);
|
|
134956
135314
|
const style = chartStyleFromNeutral(neutral, this.extractChartStyle(chartSpace, chartRoot));
|
|
135315
|
+
const titleTx = reader2.xml.getChildByLocalName(
|
|
135316
|
+
reader2.xml.getChildByLocalName(chartRoot, "title"),
|
|
135317
|
+
"tx"
|
|
135318
|
+
);
|
|
135319
|
+
const titleRich = reader2.xml.getChildByLocalName(titleTx, "rich");
|
|
135320
|
+
const titleParagraphs = reader2.xml.getChildrenArrayByLocalName(titleRich, "p");
|
|
135321
|
+
const titleTextEditable = Boolean(
|
|
135322
|
+
titleRuns?.length && titleParagraphs.length === 1 && !Object.keys(titleParagraphs[0] ?? {}).some(
|
|
135323
|
+
(key2) => ["br", "fld"].includes(reader2.localName(key2))
|
|
135324
|
+
)
|
|
135325
|
+
);
|
|
134957
135326
|
const groupOptions = groupOptionsFromNeutral(groups[0]?.group, chartType);
|
|
134958
135327
|
const linesAndChrome = this.readChartLinesAndChrome(neutral, tree, groups, reader2);
|
|
134959
135328
|
const facts = await this.readChartPartFacts(chartSpace, chartRoot, chartPartPath);
|
|
134960
135329
|
const workbook = facts.embeddedWorkbookData;
|
|
134961
135330
|
const dateCategories = rawDateCategories ? { ...rawDateCategories, date1904: neutral.date1904 ?? workbook?.date1904 ?? false } : void 0;
|
|
134962
135331
|
const filled = applyEmbeddedWorkbookFallback(chartType, categories, built.series, workbook);
|
|
135332
|
+
const dataLabelTextEditable = !categoryLevels && !dateCategories && await chartLabelsHaveEditableSources(
|
|
135333
|
+
reader2.xml,
|
|
135334
|
+
this.zip,
|
|
135335
|
+
chartSpace,
|
|
135336
|
+
built.seriesNodes,
|
|
135337
|
+
filled.series,
|
|
135338
|
+
filled.categories,
|
|
135339
|
+
facts.externalData,
|
|
135340
|
+
chartPartPath,
|
|
135341
|
+
this.resolveImagePath.bind(this)
|
|
135342
|
+
);
|
|
134963
135343
|
const hasPicture = filled.series.some(
|
|
134964
135344
|
(entry2) => entry2.picture || entry2.impliedPicture || entry2.dataPoints?.some((point2) => point2.picture || point2.impliedPicture)
|
|
134965
135345
|
);
|
|
@@ -134992,6 +135372,14 @@ var init_PptxHandlerRuntimeChartParsing = __esm({
|
|
|
134992
135372
|
...built.filtered,
|
|
134993
135373
|
title: neutralTitleText(neutral.title),
|
|
134994
135374
|
...titleRuns ? { titleRuns } : {},
|
|
135375
|
+
titleTextEditable,
|
|
135376
|
+
dataLabelTextEditable,
|
|
135377
|
+
...dataLabelTextEditable ? {
|
|
135378
|
+
dataLabelSourceShape: {
|
|
135379
|
+
categoryCount: filled.categories.length,
|
|
135380
|
+
seriesValueCounts: filled.series.map((series) => series.values.length)
|
|
135381
|
+
}
|
|
135382
|
+
} : {},
|
|
134995
135383
|
style,
|
|
134996
135384
|
grouping: groupOptions.grouping,
|
|
134997
135385
|
...groupOptions,
|
|
@@ -135451,7 +135839,7 @@ var init_PptxHandlerRuntimeLoadSession = __esm({
|
|
|
135451
135839
|
);
|
|
135452
135840
|
}
|
|
135453
135841
|
try {
|
|
135454
|
-
this.zip = await
|
|
135842
|
+
this.zip = await JSZip7__default.default.loadAsync(data);
|
|
135455
135843
|
this.documentPropertiesUpdater = this.dependencyFactory.createDocumentPropertiesUpdater(
|
|
135456
135844
|
this.zip,
|
|
135457
135845
|
this.parser,
|
|
@@ -135489,6 +135877,8 @@ var init_PptxHandlerRuntimeLoadSession = __esm({
|
|
|
135489
135877
|
this.slideMap.clear();
|
|
135490
135878
|
this.savedSlideFingerprints.clear();
|
|
135491
135879
|
this.chartDataBaselines.clear();
|
|
135880
|
+
this.chartWorkbookDataBaselines.clear();
|
|
135881
|
+
this.pendingChartUpdates = void 0;
|
|
135492
135882
|
this.layoutCache.clear();
|
|
135493
135883
|
this.masterCache.clear();
|
|
135494
135884
|
this.templateElementBaselines.reset();
|
|
@@ -135978,6 +136368,8 @@ var init_PptxHandlerRuntimeLoadPipeline = __esm({
|
|
|
135978
136368
|
this.slideMap.clear();
|
|
135979
136369
|
this.savedSlideFingerprints.clear();
|
|
135980
136370
|
this.chartDataBaselines.clear();
|
|
136371
|
+
this.chartWorkbookDataBaselines.clear();
|
|
136372
|
+
this.pendingChartUpdates = void 0;
|
|
135981
136373
|
this.slideRelsMap.clear();
|
|
135982
136374
|
this.externalRelsMap.clear();
|
|
135983
136375
|
this.layoutCache.clear();
|
|
@@ -136376,7 +136768,7 @@ var init_PptxHandlerRuntimeImplementation = __esm({
|
|
|
136376
136768
|
constructor(dependencyFactory = new PptxRuntimeDependencyFactory()) {
|
|
136377
136769
|
super();
|
|
136378
136770
|
this.dependencyFactory = dependencyFactory;
|
|
136379
|
-
this.zip = new
|
|
136771
|
+
this.zip = new JSZip7__default.default();
|
|
136380
136772
|
this.parser = this.dependencyFactory.createParser();
|
|
136381
136773
|
this.builder = this.dependencyFactory.createBuilder();
|
|
136382
136774
|
this.elementXmlBuilder = new PptxElementXmlBuilder({
|
|
@@ -139381,7 +139773,7 @@ function collectPictureIndexes(slide) {
|
|
|
139381
139773
|
return indexes;
|
|
139382
139774
|
}
|
|
139383
139775
|
async function buildPptxPackage(deck) {
|
|
139384
|
-
const zip = new
|
|
139776
|
+
const zip = new JSZip7__default.default();
|
|
139385
139777
|
const usage = { fileNumbers: /* @__PURE__ */ new Map() };
|
|
139386
139778
|
let mediaCounter = 0;
|
|
139387
139779
|
for (const slide of deck.slides) {
|
|
@@ -141521,15 +141913,26 @@ init_font_substitution();
|
|
|
141521
141913
|
var DEFAULT_FONT_SIZE = 18;
|
|
141522
141914
|
var FALLBACK_PAD_FACTOR = 0.06;
|
|
141523
141915
|
function drawTextSegments(ctx, segments, bodyStyle, w, h2, scaleFactor = 1) {
|
|
141524
|
-
const padL = bodyStyle?.bodyInsetLeft ? bodyStyle.bodyInsetLeft * scaleFactor : Math.round(w * FALLBACK_PAD_FACTOR);
|
|
141525
|
-
const padR = bodyStyle?.bodyInsetRight ? bodyStyle.bodyInsetRight * scaleFactor : Math.round(w * FALLBACK_PAD_FACTOR);
|
|
141526
|
-
const padT = bodyStyle?.bodyInsetTop ? bodyStyle.bodyInsetTop * scaleFactor : Math.round(h2 * FALLBACK_PAD_FACTOR);
|
|
141527
|
-
const padB = bodyStyle?.bodyInsetBottom ? bodyStyle.bodyInsetBottom * scaleFactor : Math.round(h2 * FALLBACK_PAD_FACTOR);
|
|
141916
|
+
const padL = bodyStyle?.bodyInsetLeft !== void 0 ? bodyStyle.bodyInsetLeft * scaleFactor : Math.round(w * FALLBACK_PAD_FACTOR);
|
|
141917
|
+
const padR = bodyStyle?.bodyInsetRight !== void 0 ? bodyStyle.bodyInsetRight * scaleFactor : Math.round(w * FALLBACK_PAD_FACTOR);
|
|
141918
|
+
const padT = bodyStyle?.bodyInsetTop !== void 0 ? bodyStyle.bodyInsetTop * scaleFactor : Math.round(h2 * FALLBACK_PAD_FACTOR);
|
|
141919
|
+
const padB = bodyStyle?.bodyInsetBottom !== void 0 ? bodyStyle.bodyInsetBottom * scaleFactor : Math.round(h2 * FALLBACK_PAD_FACTOR);
|
|
141528
141920
|
const maxWidth = w - padL - padR;
|
|
141529
141921
|
if (maxWidth <= 0) {
|
|
141530
141922
|
return;
|
|
141531
141923
|
}
|
|
141532
|
-
const paragraphs = splitIntoParagraphs(
|
|
141924
|
+
const paragraphs = splitIntoParagraphs(
|
|
141925
|
+
segments.map((segment) => ({
|
|
141926
|
+
...segment,
|
|
141927
|
+
style: {
|
|
141928
|
+
...bodyStyle,
|
|
141929
|
+
...Object.fromEntries(
|
|
141930
|
+
Object.entries(segment.style).filter(([, value]) => value !== void 0)
|
|
141931
|
+
)
|
|
141932
|
+
}
|
|
141933
|
+
})),
|
|
141934
|
+
bodyStyle
|
|
141935
|
+
);
|
|
141533
141936
|
const lines = layoutParagraphs(ctx, paragraphs, maxWidth, scaleFactor);
|
|
141534
141937
|
if (lines.length === 0) {
|
|
141535
141938
|
return;
|
|
@@ -141565,33 +141968,58 @@ function drawTextSegments(ctx, segments, bodyStyle, w, h2, scaleFactor = 1) {
|
|
|
141565
141968
|
y += line2.height * 0.3;
|
|
141566
141969
|
}
|
|
141567
141970
|
}
|
|
141568
|
-
function splitIntoParagraphs(segments) {
|
|
141569
|
-
const paragraphs = [[]];
|
|
141971
|
+
function splitIntoParagraphs(segments, bodyStyle) {
|
|
141972
|
+
const paragraphs = [{ segments: [], style: bodyStyle ?? {} }];
|
|
141570
141973
|
for (const seg of segments) {
|
|
141571
|
-
if (seg.isParagraphBreak) {
|
|
141572
|
-
paragraphs.push([]);
|
|
141573
|
-
} else if (seg.text) {
|
|
141574
|
-
paragraphs[paragraphs.length - 1].push(seg);
|
|
141974
|
+
if (seg.isParagraphBreak || seg.text === "\n" && !seg.isLineBreak) {
|
|
141975
|
+
paragraphs.push({ segments: [], style: seg.style });
|
|
141976
|
+
} else if (seg.text || seg.isLineBreak) {
|
|
141977
|
+
paragraphs[paragraphs.length - 1].segments.push(seg);
|
|
141575
141978
|
}
|
|
141576
141979
|
}
|
|
141577
|
-
return paragraphs
|
|
141980
|
+
return paragraphs;
|
|
141578
141981
|
}
|
|
141579
141982
|
function layoutParagraphs(ctx, paragraphs, maxWidth, scaleFactor) {
|
|
141580
141983
|
const lines = [];
|
|
141581
|
-
for (const
|
|
141582
|
-
const
|
|
141984
|
+
for (const paragraph of paragraphs) {
|
|
141985
|
+
const para = paragraph.segments;
|
|
141986
|
+
const paraAlign = para[0]?.style.align ?? paragraph.style.align;
|
|
141583
141987
|
let currentLine = [];
|
|
141584
141988
|
let lineWidth = 0;
|
|
141585
141989
|
let lineHeight = 0;
|
|
141990
|
+
let fallbackHeight = (para[0]?.style.fontSize ?? paragraph.style.fontSize ?? DEFAULT_FONT_SIZE) * scaleFactor * 1.2;
|
|
141991
|
+
const flushLine = () => {
|
|
141992
|
+
while (currentLine.length > 0 && /^\s+$/.test(currentLine[currentLine.length - 1].text)) {
|
|
141993
|
+
lineWidth -= currentLine.pop().measuredWidth;
|
|
141994
|
+
}
|
|
141995
|
+
lines.push({
|
|
141996
|
+
runs: currentLine,
|
|
141997
|
+
width: lineWidth,
|
|
141998
|
+
height: lineHeight || fallbackHeight,
|
|
141999
|
+
align: paraAlign
|
|
142000
|
+
});
|
|
142001
|
+
currentLine = [];
|
|
142002
|
+
lineWidth = 0;
|
|
142003
|
+
lineHeight = 0;
|
|
142004
|
+
};
|
|
141586
142005
|
for (const seg of para) {
|
|
141587
142006
|
ctx.font = buildFont(seg.style, scaleFactor);
|
|
141588
142007
|
const fontSize = (seg.style.fontSize ?? DEFAULT_FONT_SIZE) * scaleFactor;
|
|
141589
142008
|
const segHeight = fontSize * 1.2;
|
|
141590
|
-
|
|
142009
|
+
fallbackHeight = segHeight;
|
|
142010
|
+
if (seg.isLineBreak) {
|
|
142011
|
+
flushLine();
|
|
142012
|
+
continue;
|
|
142013
|
+
}
|
|
142014
|
+
const tokens = seg.text.split(/(\r\n|\r|\n)|(?<=\s)(?=\S)|(?<=\S)(?=\s)/);
|
|
141591
142015
|
for (const raw of tokens) {
|
|
141592
142016
|
if (!raw) {
|
|
141593
142017
|
continue;
|
|
141594
142018
|
}
|
|
142019
|
+
if (/^(\r\n|\r|\n)$/.test(raw)) {
|
|
142020
|
+
flushLine();
|
|
142021
|
+
continue;
|
|
142022
|
+
}
|
|
141595
142023
|
if (/^\s+$/.test(raw)) {
|
|
141596
142024
|
if (currentLine.length > 0) {
|
|
141597
142025
|
const spaceW = ctx.measureText(raw).width;
|
|
@@ -141607,19 +142035,7 @@ function layoutParagraphs(ctx, paragraphs, maxWidth, scaleFactor) {
|
|
|
141607
142035
|
const word = raw;
|
|
141608
142036
|
const wordW = ctx.measureText(word).width;
|
|
141609
142037
|
if (lineWidth + wordW > maxWidth && currentLine.length > 0) {
|
|
141610
|
-
|
|
141611
|
-
const removed = currentLine.pop();
|
|
141612
|
-
lineWidth -= removed.measuredWidth;
|
|
141613
|
-
}
|
|
141614
|
-
lines.push({
|
|
141615
|
-
runs: currentLine,
|
|
141616
|
-
width: lineWidth,
|
|
141617
|
-
height: lineHeight,
|
|
141618
|
-
align: paraAlign
|
|
141619
|
-
});
|
|
141620
|
-
currentLine = [];
|
|
141621
|
-
lineWidth = 0;
|
|
141622
|
-
lineHeight = 0;
|
|
142038
|
+
flushLine();
|
|
141623
142039
|
}
|
|
141624
142040
|
currentLine.push({
|
|
141625
142041
|
text: word,
|
|
@@ -141630,14 +142046,7 @@ function layoutParagraphs(ctx, paragraphs, maxWidth, scaleFactor) {
|
|
|
141630
142046
|
lineHeight = Math.max(lineHeight, segHeight);
|
|
141631
142047
|
}
|
|
141632
142048
|
}
|
|
141633
|
-
|
|
141634
|
-
lines.push({
|
|
141635
|
-
runs: currentLine,
|
|
141636
|
-
width: lineWidth,
|
|
141637
|
-
height: lineHeight,
|
|
141638
|
-
align: paraAlign
|
|
141639
|
-
});
|
|
141640
|
-
}
|
|
142049
|
+
flushLine();
|
|
141641
142050
|
}
|
|
141642
142051
|
return lines;
|
|
141643
142052
|
}
|