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
|
@@ -39165,6 +39165,13 @@ function parseContentTypes(xml) {
|
|
|
39165
39165
|
}
|
|
39166
39166
|
return { defaults, overrides };
|
|
39167
39167
|
}
|
|
39168
|
+
function contentTypeForPart(types, partName) {
|
|
39169
|
+
const overridePath = partName.startsWith("/") ? partName : `/${partName}`;
|
|
39170
|
+
const override = types.overrides.get(overridePath);
|
|
39171
|
+
if (override) return override;
|
|
39172
|
+
const extension = partName.split(".").pop()?.toLowerCase();
|
|
39173
|
+
return extension ? types.defaults.get(extension) : void 0;
|
|
39174
|
+
}
|
|
39168
39175
|
var init_content_types = __esm({
|
|
39169
39176
|
"opc/content-types.ts"() {
|
|
39170
39177
|
init_xml2();
|
|
@@ -39204,10 +39211,13 @@ function relativePartTarget(basePart, targetPart) {
|
|
|
39204
39211
|
}
|
|
39205
39212
|
async function clonePartGraph(options) {
|
|
39206
39213
|
const { zip, sourcePart, targetPart, shouldClone } = options;
|
|
39207
|
-
const
|
|
39208
|
-
const
|
|
39214
|
+
const sourceZip = options.sourceZip ?? zip;
|
|
39215
|
+
const copies = options.copies ?? /* @__PURE__ */ new Map();
|
|
39216
|
+
copies.set(sourcePart, targetPart);
|
|
39217
|
+
const types = parseContentTypes(await sourceZip.file("[Content_Types].xml")?.async("string"));
|
|
39209
39218
|
const reserved = new Set(Object.keys(zip.files));
|
|
39210
39219
|
reserved.add(targetPart);
|
|
39220
|
+
for (const target of copies.values()) reserved.add(target);
|
|
39211
39221
|
const allocate = (source) => {
|
|
39212
39222
|
const match = /^(?<stem>.*?)(?:\d+)?(?<extension>\.[^/.]+)$/u.exec(source);
|
|
39213
39223
|
const stem = match?.groups?.stem ?? source;
|
|
@@ -39219,9 +39229,9 @@ async function clonePartGraph(options) {
|
|
|
39219
39229
|
return path2;
|
|
39220
39230
|
};
|
|
39221
39231
|
const copyRelationships = async (source, destination) => {
|
|
39222
|
-
const contentType = types
|
|
39232
|
+
const contentType = contentTypeForPart(types, source);
|
|
39223
39233
|
if (contentType) await ensureContentTypeOverride(zip, destination, contentType);
|
|
39224
|
-
const xml = await
|
|
39234
|
+
const xml = await sourceZip.file(relationshipsPartFor(source))?.async("string");
|
|
39225
39235
|
if (!xml) return;
|
|
39226
39236
|
const relationships2 = parseRelationships(xml);
|
|
39227
39237
|
for (const relationship of relationships2.values()) {
|
|
@@ -39229,7 +39239,7 @@ async function clonePartGraph(options) {
|
|
|
39229
39239
|
const originalTarget = resolvePartPath(source, relationship.target);
|
|
39230
39240
|
let newTarget = copies.get(originalTarget);
|
|
39231
39241
|
if (!newTarget && shouldClone(relationship, originalTarget)) {
|
|
39232
|
-
const file =
|
|
39242
|
+
const file = sourceZip.file(originalTarget);
|
|
39233
39243
|
if (!file) throw new Error(`Cannot clone missing package part: ${originalTarget}`);
|
|
39234
39244
|
newTarget = allocate(originalTarget);
|
|
39235
39245
|
copies.set(originalTarget, newTarget);
|
|
@@ -61136,7 +61146,13 @@ var init_PptxSlideNotesPartUpdater = __esm({
|
|
|
61136
61146
|
init.slideNotesRelationshipType,
|
|
61137
61147
|
`../notesSlides/${fileName}`
|
|
61138
61148
|
);
|
|
61139
|
-
|
|
61149
|
+
const notesXmlObject = this.buildNotesSlide(init.slide, strict);
|
|
61150
|
+
init.updateNotesXmlText(
|
|
61151
|
+
notesXmlObject,
|
|
61152
|
+
init.slide.notes ?? init.slide.notesSegments?.map((segment) => segment.text).join("") ?? "",
|
|
61153
|
+
init.slide.notesSegments
|
|
61154
|
+
);
|
|
61155
|
+
init.zip.file(notesPath, init.xmlBuilder.build(notesXmlObject));
|
|
61140
61156
|
init.zip.file(
|
|
61141
61157
|
`ppt/notesSlides/_rels/${fileName}.rels`,
|
|
61142
61158
|
init.xmlBuilder.build({
|
|
@@ -93669,6 +93685,341 @@ var init_header_footer_parts = __esm({
|
|
|
93669
93685
|
}
|
|
93670
93686
|
});
|
|
93671
93687
|
|
|
93688
|
+
// pptx/core/utils/chart-xlsx-write-validation.ts
|
|
93689
|
+
function unsupported(reason) {
|
|
93690
|
+
throw new Error(`Chart label replacement requires direct literal workbook cells: ${reason}.`);
|
|
93691
|
+
}
|
|
93692
|
+
async function validateAtomicChartWorkbookWrites(zip, parser, paths, writes, requireCurrentValues = false) {
|
|
93693
|
+
const relationships2 = xmlChild(
|
|
93694
|
+
parser.parse(
|
|
93695
|
+
await zip.file("xl/_rels/workbook.xml.rels")?.async("string") ?? ""
|
|
93696
|
+
),
|
|
93697
|
+
"Relationships"
|
|
93698
|
+
);
|
|
93699
|
+
for (const rel of xmlChildren(relationships2, "Relationship")) {
|
|
93700
|
+
if (xmlAttr(rel, "TargetMode") === "External") {
|
|
93701
|
+
unsupported("external worksheet relationships are not supported");
|
|
93702
|
+
}
|
|
93703
|
+
}
|
|
93704
|
+
const sheets = /* @__PURE__ */ new Map();
|
|
93705
|
+
const cellsByPath = /* @__PURE__ */ new Map();
|
|
93706
|
+
for (const path2 of new Set(paths.values())) {
|
|
93707
|
+
const file = zip.file(path2);
|
|
93708
|
+
if (!file) {
|
|
93709
|
+
unsupported("a referenced worksheet is missing");
|
|
93710
|
+
}
|
|
93711
|
+
let tree;
|
|
93712
|
+
try {
|
|
93713
|
+
tree = parser.parse(await file.async("string"));
|
|
93714
|
+
} catch {
|
|
93715
|
+
unsupported("a worksheet cannot be parsed");
|
|
93716
|
+
}
|
|
93717
|
+
const data = xmlChild(xmlChild(tree, "worksheet"), "sheetData");
|
|
93718
|
+
if (!data) {
|
|
93719
|
+
unsupported("a worksheet has no cell data");
|
|
93720
|
+
}
|
|
93721
|
+
if (Object.keys(data).some((key2) => key2.includes(":"))) {
|
|
93722
|
+
unsupported("prefixed worksheet cell nodes are not supported");
|
|
93723
|
+
}
|
|
93724
|
+
const cells2 = /* @__PURE__ */ new Map();
|
|
93725
|
+
for (const row of xmlChildren(data, "row")) {
|
|
93726
|
+
if (Object.keys(row).some((key2) => key2.includes(":"))) {
|
|
93727
|
+
unsupported("prefixed worksheet cell nodes are not supported");
|
|
93728
|
+
}
|
|
93729
|
+
for (const cell of xmlChildren(row, "c")) {
|
|
93730
|
+
const ref = xmlAttr(cell, "r");
|
|
93731
|
+
if (!ref || cells2.has(ref)) {
|
|
93732
|
+
unsupported("duplicate or unidentified worksheet cells are not supported");
|
|
93733
|
+
}
|
|
93734
|
+
cells2.set(ref, cell);
|
|
93735
|
+
if (Object.keys(cell).some((key2) => key2 === "f" || key2.endsWith(":f"))) {
|
|
93736
|
+
unsupported("formula-dependent workbooks are not supported");
|
|
93737
|
+
}
|
|
93738
|
+
}
|
|
93739
|
+
}
|
|
93740
|
+
sheets.set(path2, data);
|
|
93741
|
+
cellsByPath.set(path2, cells2);
|
|
93742
|
+
}
|
|
93743
|
+
const sharedFile = zip.file("xl/sharedStrings.xml");
|
|
93744
|
+
const shared = sharedFile ? xmlChildren(
|
|
93745
|
+
xmlChild(parser.parse(await sharedFile.async("string")), "sst"),
|
|
93746
|
+
"si"
|
|
93747
|
+
) : [];
|
|
93748
|
+
const destinations = /* @__PURE__ */ new Map();
|
|
93749
|
+
for (const write of writes) {
|
|
93750
|
+
const range = parseChartFormulaRange(write.formula);
|
|
93751
|
+
if (!range || /[\[\]:!]/u.test(range.sheetName)) {
|
|
93752
|
+
unsupported("a range is not a direct local reference");
|
|
93753
|
+
}
|
|
93754
|
+
if ([range.start, range.end].some(
|
|
93755
|
+
(cell) => cell.row < 0 || cell.row >= 1048576 || cell.col < 0 || cell.col >= 16384
|
|
93756
|
+
)) {
|
|
93757
|
+
unsupported("a source cell lies outside the worksheet limits");
|
|
93758
|
+
}
|
|
93759
|
+
const addresses = expandRangeAddresses(range, write.values.length);
|
|
93760
|
+
const path2 = paths.get(range.sheetName.toLowerCase());
|
|
93761
|
+
const data = path2 ? sheets.get(path2) : void 0;
|
|
93762
|
+
if (!addresses || !path2 || !data) {
|
|
93763
|
+
unsupported("a source range cannot be resolved");
|
|
93764
|
+
}
|
|
93765
|
+
for (const [index, address] of addresses.entries()) {
|
|
93766
|
+
const value = write.values[index];
|
|
93767
|
+
const key2 = `${path2}!${address}`;
|
|
93768
|
+
const prior = destinations.get(key2);
|
|
93769
|
+
if (prior && (prior.value !== value || prior.numeric !== write.isNumeric)) {
|
|
93770
|
+
unsupported("overlapping source ranges request conflicting values");
|
|
93771
|
+
}
|
|
93772
|
+
destinations.set(key2, { value, numeric: write.isNumeric });
|
|
93773
|
+
const cell = cellsByPath.get(path2)?.get(address);
|
|
93774
|
+
if (!cell) {
|
|
93775
|
+
unsupported("a source cell is missing");
|
|
93776
|
+
}
|
|
93777
|
+
const type = xmlAttr(cell, "t") ?? "n";
|
|
93778
|
+
const text2 = type === "s" ? shared[Number(xmlText(cell.v))] : xmlChild(cell, "is");
|
|
93779
|
+
if (text2 && Object.keys(text2).some((node) => !node.startsWith("@_") && node !== "t" && node !== "#text")) {
|
|
93780
|
+
unsupported("rich worksheet strings require source-workbook editing");
|
|
93781
|
+
}
|
|
93782
|
+
if (requireCurrentValues) {
|
|
93783
|
+
const current = text2 ? xmlText(text2.t) : xmlText(cell.v);
|
|
93784
|
+
const equal = write.isNumeric ? current !== void 0 && Number(current) === Number(value) : current === value;
|
|
93785
|
+
if (!equal) {
|
|
93786
|
+
unsupported("the workbook and chart caches disagree");
|
|
93787
|
+
}
|
|
93788
|
+
}
|
|
93789
|
+
if (write.isNumeric && !Number.isFinite(Number(value))) {
|
|
93790
|
+
unsupported("a numeric cache value is not finite");
|
|
93791
|
+
}
|
|
93792
|
+
if (!["n", "s", "inlineStr", "str"].includes(type)) {
|
|
93793
|
+
unsupported("a source cell has an unsupported value type");
|
|
93794
|
+
}
|
|
93795
|
+
}
|
|
93796
|
+
}
|
|
93797
|
+
}
|
|
93798
|
+
var init_chart_xlsx_write_validation = __esm({
|
|
93799
|
+
"pptx/core/utils/chart-xlsx-write-validation.ts"() {
|
|
93800
|
+
init_chart_xlsx_cellref();
|
|
93801
|
+
init_xml_access();
|
|
93802
|
+
}
|
|
93803
|
+
});
|
|
93804
|
+
function collectChartWorkbookWrite(xmlLookupService, container2, isNumeric2, values) {
|
|
93805
|
+
if (!container2) {
|
|
93806
|
+
return void 0;
|
|
93807
|
+
}
|
|
93808
|
+
const refNode = xmlLookupService.getChildByLocalName(container2, isNumeric2 ? "numRef" : "strRef");
|
|
93809
|
+
const formula = refNode ? xmlLookupService.getScalarChildByLocalName(refNode, "f") : void 0;
|
|
93810
|
+
return formula ? { formula, isNumeric: isNumeric2, values } : void 0;
|
|
93811
|
+
}
|
|
93812
|
+
function createSpreadsheetXmlParser2() {
|
|
93813
|
+
return new fastXmlParser.XMLParser({
|
|
93814
|
+
ignoreAttributes: false,
|
|
93815
|
+
attributeNamePrefix: "@_",
|
|
93816
|
+
trimValues: false,
|
|
93817
|
+
parseTagValue: false,
|
|
93818
|
+
tagValueProcessor: (tagName, tagValue) => preservesSpreadsheetXmlWhitespace(tagName) ? tagValue : tagValue.trim()
|
|
93819
|
+
});
|
|
93820
|
+
}
|
|
93821
|
+
function createSpreadsheetXmlBuilder2() {
|
|
93822
|
+
return new fastXmlParser.XMLBuilder({
|
|
93823
|
+
ignoreAttributes: false,
|
|
93824
|
+
attributeNamePrefix: "@_",
|
|
93825
|
+
suppressBooleanAttributes: false,
|
|
93826
|
+
format: false
|
|
93827
|
+
});
|
|
93828
|
+
}
|
|
93829
|
+
async function resolveWorksheetPathsByName(xlsxZip, parser) {
|
|
93830
|
+
const result = /* @__PURE__ */ new Map();
|
|
93831
|
+
const workbookFile = xlsxZip.file("xl/workbook.xml");
|
|
93832
|
+
const relsFile = xlsxZip.file("xl/_rels/workbook.xml.rels");
|
|
93833
|
+
if (!workbookFile || !relsFile) {
|
|
93834
|
+
return result;
|
|
93835
|
+
}
|
|
93836
|
+
try {
|
|
93837
|
+
const workbookTree = parser.parse(await workbookFile.async("string"));
|
|
93838
|
+
const relsTree = parser.parse(await relsFile.async("string"));
|
|
93839
|
+
const targetByRelId = /* @__PURE__ */ new Map();
|
|
93840
|
+
const relationships2 = xmlChild(relsTree, "Relationships");
|
|
93841
|
+
for (const rel of xmlChildren(relationships2, "Relationship")) {
|
|
93842
|
+
const id = xmlAttr(rel, "Id");
|
|
93843
|
+
const target = xmlAttr(rel, "Target");
|
|
93844
|
+
if (id && target) {
|
|
93845
|
+
targetByRelId.set(id, target);
|
|
93846
|
+
}
|
|
93847
|
+
}
|
|
93848
|
+
const workbookRoot = xmlChild(workbookTree, "workbook");
|
|
93849
|
+
const sheets = xmlChild(workbookRoot, "sheets");
|
|
93850
|
+
for (const sheet of xmlChildren(sheets, "sheet")) {
|
|
93851
|
+
const name = xmlAttr(sheet, "name");
|
|
93852
|
+
const relId = xmlAttr(sheet, "r:id") ?? xmlAttr(sheet, "id");
|
|
93853
|
+
const target = relId ? targetByRelId.get(relId) : void 0;
|
|
93854
|
+
if (name && target) {
|
|
93855
|
+
result.set(name.toLowerCase(), resolveWorkbookPartPath(target));
|
|
93856
|
+
}
|
|
93857
|
+
}
|
|
93858
|
+
} catch {
|
|
93859
|
+
}
|
|
93860
|
+
return result;
|
|
93861
|
+
}
|
|
93862
|
+
function resolveWorkbookPartPath(target) {
|
|
93863
|
+
return target.startsWith("/") ? target.slice(1) : `xl/${target}`;
|
|
93864
|
+
}
|
|
93865
|
+
async function writeChartWorkbookUpdates(xlsxBytes, writes, options = {}) {
|
|
93866
|
+
if (writes.length === 0) {
|
|
93867
|
+
return { unresolved: 0 };
|
|
93868
|
+
}
|
|
93869
|
+
let xlsxZip;
|
|
93870
|
+
try {
|
|
93871
|
+
xlsxZip = await JSZip3__default.default.loadAsync(xlsxBytes);
|
|
93872
|
+
} catch {
|
|
93873
|
+
if (options.atomic) {
|
|
93874
|
+
throw new Error("Chart label replacement requires a readable embedded workbook.");
|
|
93875
|
+
}
|
|
93876
|
+
return { unresolved: writes.length };
|
|
93877
|
+
}
|
|
93878
|
+
const parser = createSpreadsheetXmlParser2();
|
|
93879
|
+
const sheetPathByName = await resolveWorksheetPathsByName(xlsxZip, parser);
|
|
93880
|
+
if (options.atomic) {
|
|
93881
|
+
await validateAtomicChartWorkbookWrites(
|
|
93882
|
+
xlsxZip,
|
|
93883
|
+
parser,
|
|
93884
|
+
sheetPathByName,
|
|
93885
|
+
writes,
|
|
93886
|
+
options.requireCurrentValues ?? false
|
|
93887
|
+
);
|
|
93888
|
+
}
|
|
93889
|
+
const writesBySheetPath = /* @__PURE__ */ new Map();
|
|
93890
|
+
let unresolved = 0;
|
|
93891
|
+
for (const write of writes) {
|
|
93892
|
+
const range = parseChartFormulaRange(write.formula);
|
|
93893
|
+
const sheetPath = range ? sheetPathByName.get(range.sheetName.toLowerCase()) : void 0;
|
|
93894
|
+
const refs = range ? expandRangeAddresses(range, write.values.length) : void 0;
|
|
93895
|
+
if (!range || !sheetPath || !refs) {
|
|
93896
|
+
unresolved += 1;
|
|
93897
|
+
continue;
|
|
93898
|
+
}
|
|
93899
|
+
const bucket = writesBySheetPath.get(sheetPath) ?? [];
|
|
93900
|
+
bucket.push({ refs, values: write.values, isNumeric: write.isNumeric });
|
|
93901
|
+
writesBySheetPath.set(sheetPath, bucket);
|
|
93902
|
+
}
|
|
93903
|
+
const builder3 = createSpreadsheetXmlBuilder2();
|
|
93904
|
+
let changedAny = false;
|
|
93905
|
+
for (const [sheetPath, resolvedWrites] of writesBySheetPath) {
|
|
93906
|
+
const sheetFile = xlsxZip.file(sheetPath);
|
|
93907
|
+
if (!sheetFile) {
|
|
93908
|
+
unresolved += resolvedWrites.length;
|
|
93909
|
+
continue;
|
|
93910
|
+
}
|
|
93911
|
+
try {
|
|
93912
|
+
const sheetTree = parser.parse(await sheetFile.async("string"));
|
|
93913
|
+
const cellWrites = resolvedWrites.flatMap(
|
|
93914
|
+
({ refs, values, isNumeric: isNumeric2 }) => refs.map((ref, i2) => ({ ref, isNumeric: isNumeric2, value: values[i2] }))
|
|
93915
|
+
);
|
|
93916
|
+
if (applyCellWritesToWorksheet(sheetTree, cellWrites)) {
|
|
93917
|
+
xlsxZip.file(sheetPath, builder3.build(sheetTree));
|
|
93918
|
+
changedAny = true;
|
|
93919
|
+
}
|
|
93920
|
+
} catch {
|
|
93921
|
+
unresolved += resolvedWrites.length;
|
|
93922
|
+
}
|
|
93923
|
+
}
|
|
93924
|
+
if (options.atomic && unresolved > 0) {
|
|
93925
|
+
throw new Error("Chart label replacement could not update every source range.");
|
|
93926
|
+
}
|
|
93927
|
+
if (!changedAny) {
|
|
93928
|
+
return { unresolved };
|
|
93929
|
+
}
|
|
93930
|
+
const bytes = await xlsxZip.generateAsync({
|
|
93931
|
+
type: "uint8array",
|
|
93932
|
+
compression: "DEFLATE",
|
|
93933
|
+
compressionOptions: { level: 6 }
|
|
93934
|
+
});
|
|
93935
|
+
return { bytes, unresolved };
|
|
93936
|
+
}
|
|
93937
|
+
var init_chart_xlsx_writer = __esm({
|
|
93938
|
+
"pptx/core/utils/chart-xlsx-writer.ts"() {
|
|
93939
|
+
init_chart_xlsx_cellref();
|
|
93940
|
+
init_chart_xlsx_write_validation();
|
|
93941
|
+
init_chart_xlsx_sheet_cells();
|
|
93942
|
+
init_xml_access();
|
|
93943
|
+
init_xml_whitespace();
|
|
93944
|
+
}
|
|
93945
|
+
});
|
|
93946
|
+
function formulaCount(value) {
|
|
93947
|
+
if (!value || typeof value !== "object") return 0;
|
|
93948
|
+
if (Array.isArray(value)) return value.reduce((total, item) => total + formulaCount(item), 0);
|
|
93949
|
+
return Object.entries(value).reduce(
|
|
93950
|
+
(total, [key2, child30]) => total + (key2 === "f" || key2.endsWith(":f") ? 1 : formulaCount(child30)),
|
|
93951
|
+
0
|
|
93952
|
+
);
|
|
93953
|
+
}
|
|
93954
|
+
async function chartLabelsHaveEditableSources(xml, zip, chartSpace, seriesNodes, series, categories, external, chartPartPath, resolve) {
|
|
93955
|
+
if (!chartSpace || seriesNodes.length !== series.length || !categories.length || external?.isExternal)
|
|
93956
|
+
return false;
|
|
93957
|
+
if (formulaCount(chartSpace) !== seriesNodes.reduce((sum, node) => sum + formulaCount(node), 0))
|
|
93958
|
+
return false;
|
|
93959
|
+
const writes = [];
|
|
93960
|
+
const labelOwners = /* @__PURE__ */ new Map();
|
|
93961
|
+
for (const [index, node] of seriesNodes.entries()) {
|
|
93962
|
+
const entry2 = series[index];
|
|
93963
|
+
for (const [name, numeric, values] of [
|
|
93964
|
+
["tx", false, [entry2.name]],
|
|
93965
|
+
["cat", false, [...categories]],
|
|
93966
|
+
["val", true, entry2.values.map(String)]
|
|
93967
|
+
]) {
|
|
93968
|
+
const container2 = xml.getChildByLocalName(node, name);
|
|
93969
|
+
if (!container2) return false;
|
|
93970
|
+
const write = collectChartWorkbookWrite(xml, container2, numeric, [...values]);
|
|
93971
|
+
if (write) {
|
|
93972
|
+
writes.push(write);
|
|
93973
|
+
if (!numeric) {
|
|
93974
|
+
const range = parseChartFormulaRange(write.formula);
|
|
93975
|
+
const addresses = range ? expandRangeAddresses(range, values.length) : void 0;
|
|
93976
|
+
if (!range || !addresses) return false;
|
|
93977
|
+
for (const [point2, address] of addresses.entries()) {
|
|
93978
|
+
const key2 = `${range.sheetName.toLowerCase()}!${address}`;
|
|
93979
|
+
const owner = name === "tx" ? `series:${index}` : `category:${point2}`;
|
|
93980
|
+
if (labelOwners.has(key2) && labelOwners.get(key2) !== owner) return false;
|
|
93981
|
+
labelOwners.set(key2, owner);
|
|
93982
|
+
}
|
|
93983
|
+
}
|
|
93984
|
+
} else if (external || !xml.getChildByLocalName(container2, numeric ? "numLit" : "strLit") && !(name === "tx" && xml.getScalarChildByLocalName(container2, "v") !== void 0))
|
|
93985
|
+
return false;
|
|
93986
|
+
}
|
|
93987
|
+
}
|
|
93988
|
+
if (formulaCount(chartSpace) !== writes.length) return false;
|
|
93989
|
+
if (!external) return writes.length === 0;
|
|
93990
|
+
if (!external.targetPath || !external.embeddedWorkbookData) return false;
|
|
93991
|
+
const target = resolve(chartPartPath, external.targetPath);
|
|
93992
|
+
let references = 0;
|
|
93993
|
+
const parser = new fastXmlParser.XMLParser({ ignoreAttributes: false, attributeNamePrefix: "@_" });
|
|
93994
|
+
try {
|
|
93995
|
+
for (const path2 of Object.keys(zip.files)) {
|
|
93996
|
+
if (!path2.endsWith(".rels") || !path2.includes("/_rels/")) continue;
|
|
93997
|
+
const source = path2.replace("/_rels/", "/").slice(0, -5);
|
|
93998
|
+
const tree = parser.parse(await zip.file(path2).async("string"));
|
|
93999
|
+
for (const rel of xmlChildren(xmlChild(tree, "Relationships"), "Relationship")) {
|
|
94000
|
+
const relationshipTarget2 = xmlAttr(rel, "Target");
|
|
94001
|
+
if (relationshipTarget2 && xmlAttr(rel, "TargetMode") !== "External" && resolve(source, relationshipTarget2) === target)
|
|
94002
|
+
references++;
|
|
94003
|
+
}
|
|
94004
|
+
}
|
|
94005
|
+
if (references !== 1) return false;
|
|
94006
|
+
await writeChartWorkbookUpdates(external.embeddedWorkbookData, writes, {
|
|
94007
|
+
atomic: true,
|
|
94008
|
+
requireCurrentValues: true
|
|
94009
|
+
});
|
|
94010
|
+
return true;
|
|
94011
|
+
} catch {
|
|
94012
|
+
return false;
|
|
94013
|
+
}
|
|
94014
|
+
}
|
|
94015
|
+
var init_chart_label_source = __esm({
|
|
94016
|
+
"pptx/core/utils/chart-label-source.ts"() {
|
|
94017
|
+
init_chart_xlsx_writer();
|
|
94018
|
+
init_xml_access();
|
|
94019
|
+
init_chart_xlsx_cellref();
|
|
94020
|
+
}
|
|
94021
|
+
});
|
|
94022
|
+
|
|
93672
94023
|
// pptx/core/utils/chart-band-fmts.ts
|
|
93673
94024
|
function safeUnsignedInt2(val) {
|
|
93674
94025
|
const n = Number(val);
|
|
@@ -107769,6 +108120,18 @@ var init_tag_package = __esm({
|
|
|
107769
108120
|
}
|
|
107770
108121
|
});
|
|
107771
108122
|
|
|
108123
|
+
// pptx/core/utils/chart-workbook-data-signature.ts
|
|
108124
|
+
function chartWorkbookDataSignature(data) {
|
|
108125
|
+
return JSON.stringify({
|
|
108126
|
+
categories: data.dateCategories?.values ?? data.categories,
|
|
108127
|
+
series: data.series.map((series) => ({ name: series.name, values: series.values }))
|
|
108128
|
+
});
|
|
108129
|
+
}
|
|
108130
|
+
var init_chart_workbook_data_signature = __esm({
|
|
108131
|
+
"pptx/core/utils/chart-workbook-data-signature.ts"() {
|
|
108132
|
+
}
|
|
108133
|
+
});
|
|
108134
|
+
|
|
107772
108135
|
// pptx/core/utils/chart-axis-deleted.ts
|
|
107773
108136
|
function authoredDeleted(node) {
|
|
107774
108137
|
if (node === void 0) {
|
|
@@ -108856,6 +109219,33 @@ var init_chart_title_run_alignment = __esm({
|
|
|
108856
109219
|
}
|
|
108857
109220
|
});
|
|
108858
109221
|
|
|
109222
|
+
// pptx/core/utils/chart-title-text-edit.ts
|
|
109223
|
+
function patchChartTitleRunText(title, runs, local) {
|
|
109224
|
+
const tx = title[findKey7(title, "tx", local) ?? ""];
|
|
109225
|
+
const rich = tx?.[findKey7(tx, "rich", local) ?? ""];
|
|
109226
|
+
const raw = rich?.[findKey7(rich, "p", local) ?? ""];
|
|
109227
|
+
const paragraphs = Array.isArray(raw) ? raw : raw ? [raw] : [];
|
|
109228
|
+
if (paragraphs.length !== 1) return false;
|
|
109229
|
+
const paragraph = paragraphs[0];
|
|
109230
|
+
if (findKey7(paragraph, "br", local) || findKey7(paragraph, "fld", local)) return false;
|
|
109231
|
+
const rawRuns = paragraph[findKey7(paragraph, "r", local) ?? ""];
|
|
109232
|
+
const original = Array.isArray(rawRuns) ? rawRuns : rawRuns ? [rawRuns] : [];
|
|
109233
|
+
if (original.length !== runs.length) return false;
|
|
109234
|
+
const keys = original.map((run) => findKey7(run, "t", local));
|
|
109235
|
+
if (keys.some((key2) => !key2)) return false;
|
|
109236
|
+
for (const [index, value] of original.entries()) {
|
|
109237
|
+
const run = value, key2 = keys[index];
|
|
109238
|
+
const text2 = run[key2];
|
|
109239
|
+
run[key2] = text2 && typeof text2 === "object" && !Array.isArray(text2) ? { ...text2, "#text": runs[index].text } : runs[index].text;
|
|
109240
|
+
}
|
|
109241
|
+
return true;
|
|
109242
|
+
}
|
|
109243
|
+
var init_chart_title_text_edit = __esm({
|
|
109244
|
+
"pptx/core/utils/chart-title-text-edit.ts"() {
|
|
109245
|
+
init_chart_title_xml_ops();
|
|
109246
|
+
}
|
|
109247
|
+
});
|
|
109248
|
+
|
|
108859
109249
|
// pptx/core/utils/chart-title-serializer.ts
|
|
108860
109250
|
function applyChartTitleToXml(chartRoot, model, getLocalName2, options = { prefix: "c" }) {
|
|
108861
109251
|
const { prefix } = options;
|
|
@@ -108881,11 +109271,18 @@ function applyChartTitleToXml(chartRoot, model, getLocalName2, options = { prefi
|
|
|
108881
109271
|
runs = realignOrCollapseTitleRuns(staleRuns, model.title);
|
|
108882
109272
|
}
|
|
108883
109273
|
let titleNode = existingKey ? chartRoot[existingKey] : void 0;
|
|
109274
|
+
const textOnlyStylesMatch = Boolean(
|
|
109275
|
+
runs && model.titleTextOnlyStyles?.length === runs.length && runs.every(
|
|
109276
|
+
(run, index) => ["bold", "italic", "fontSize", "color"].every(
|
|
109277
|
+
(key2) => run[key2] === model.titleTextOnlyStyles[index][key2]
|
|
109278
|
+
)
|
|
109279
|
+
)
|
|
109280
|
+
);
|
|
108884
109281
|
if (runs && titleNode && typeof titleNode === "object") {
|
|
108885
109282
|
const existingTexts = [];
|
|
108886
109283
|
collectAllText(titleNode, getLocalName2, existingTexts);
|
|
108887
109284
|
const newTexts = runs.map((run) => run.text);
|
|
108888
|
-
if (existingTexts.length === newTexts.length && existingTexts.every((text2, index) => text2 === newTexts[index])) {
|
|
109285
|
+
if ((!model.titleTextOnly || textOnlyStylesMatch) && existingTexts.length === newTexts.length && existingTexts.every((text2, index) => text2 === newTexts[index])) {
|
|
108889
109286
|
runs = void 0;
|
|
108890
109287
|
}
|
|
108891
109288
|
}
|
|
@@ -108897,6 +109294,12 @@ function applyChartTitleToXml(chartRoot, model, getLocalName2, options = { prefi
|
|
|
108897
109294
|
insertAt2(chartRoot, 0, `${prefix}:title`, titleNode);
|
|
108898
109295
|
}
|
|
108899
109296
|
} else if (runs) {
|
|
109297
|
+
if (model.titleTextOnly && textOnlyStylesMatch) {
|
|
109298
|
+
if (!patchChartTitleRunText(titleNode, runs, getLocalName2))
|
|
109299
|
+
throw new Error("This chart title cannot be replaced without changing its text source");
|
|
109300
|
+
if (prefix === "c") setAutoTitleDeleted(chartRoot, false, getLocalName2);
|
|
109301
|
+
return true;
|
|
109302
|
+
}
|
|
108900
109303
|
const txKey = findKey7(titleNode, "tx", getLocalName2);
|
|
108901
109304
|
if (txKey) {
|
|
108902
109305
|
titleNode[txKey] = buildTitleTextFromRuns(prefix, runs);
|
|
@@ -108920,6 +109323,7 @@ var init_chart_title_serializer = __esm({
|
|
|
108920
109323
|
"pptx/core/utils/chart-title-serializer.ts"() {
|
|
108921
109324
|
init_chart_title_node_builder();
|
|
108922
109325
|
init_chart_title_run_alignment();
|
|
109326
|
+
init_chart_title_text_edit();
|
|
108923
109327
|
init_chart_title_xml_ops();
|
|
108924
109328
|
}
|
|
108925
109329
|
});
|
|
@@ -109081,131 +109485,6 @@ var init_chart_title_style_serializer = __esm({
|
|
|
109081
109485
|
};
|
|
109082
109486
|
}
|
|
109083
109487
|
});
|
|
109084
|
-
function collectChartWorkbookWrite(xmlLookupService, container2, isNumeric2, values) {
|
|
109085
|
-
if (!container2) {
|
|
109086
|
-
return void 0;
|
|
109087
|
-
}
|
|
109088
|
-
const refNode = xmlLookupService.getChildByLocalName(container2, isNumeric2 ? "numRef" : "strRef");
|
|
109089
|
-
const formula = refNode ? xmlLookupService.getScalarChildByLocalName(refNode, "f") : void 0;
|
|
109090
|
-
return formula ? { formula, isNumeric: isNumeric2, values } : void 0;
|
|
109091
|
-
}
|
|
109092
|
-
function createSpreadsheetXmlParser2() {
|
|
109093
|
-
return new fastXmlParser.XMLParser({
|
|
109094
|
-
ignoreAttributes: false,
|
|
109095
|
-
attributeNamePrefix: "@_",
|
|
109096
|
-
trimValues: false,
|
|
109097
|
-
tagValueProcessor: (tagName, tagValue) => preservesSpreadsheetXmlWhitespace(tagName) ? tagValue : tagValue.trim()
|
|
109098
|
-
});
|
|
109099
|
-
}
|
|
109100
|
-
function createSpreadsheetXmlBuilder2() {
|
|
109101
|
-
return new fastXmlParser.XMLBuilder({
|
|
109102
|
-
ignoreAttributes: false,
|
|
109103
|
-
attributeNamePrefix: "@_",
|
|
109104
|
-
suppressBooleanAttributes: false,
|
|
109105
|
-
format: false
|
|
109106
|
-
});
|
|
109107
|
-
}
|
|
109108
|
-
async function resolveWorksheetPathsByName(xlsxZip, parser) {
|
|
109109
|
-
const result = /* @__PURE__ */ new Map();
|
|
109110
|
-
const workbookFile = xlsxZip.file("xl/workbook.xml");
|
|
109111
|
-
const relsFile = xlsxZip.file("xl/_rels/workbook.xml.rels");
|
|
109112
|
-
if (!workbookFile || !relsFile) {
|
|
109113
|
-
return result;
|
|
109114
|
-
}
|
|
109115
|
-
try {
|
|
109116
|
-
const workbookTree = parser.parse(await workbookFile.async("string"));
|
|
109117
|
-
const relsTree = parser.parse(await relsFile.async("string"));
|
|
109118
|
-
const targetByRelId = /* @__PURE__ */ new Map();
|
|
109119
|
-
const relationships2 = xmlChild(relsTree, "Relationships");
|
|
109120
|
-
for (const rel of xmlChildren(relationships2, "Relationship")) {
|
|
109121
|
-
const id = xmlAttr(rel, "Id");
|
|
109122
|
-
const target = xmlAttr(rel, "Target");
|
|
109123
|
-
if (id && target) {
|
|
109124
|
-
targetByRelId.set(id, target);
|
|
109125
|
-
}
|
|
109126
|
-
}
|
|
109127
|
-
const workbookRoot = xmlChild(workbookTree, "workbook");
|
|
109128
|
-
const sheets = xmlChild(workbookRoot, "sheets");
|
|
109129
|
-
for (const sheet of xmlChildren(sheets, "sheet")) {
|
|
109130
|
-
const name = xmlAttr(sheet, "name");
|
|
109131
|
-
const relId = xmlAttr(sheet, "r:id") ?? xmlAttr(sheet, "id");
|
|
109132
|
-
const target = relId ? targetByRelId.get(relId) : void 0;
|
|
109133
|
-
if (name && target) {
|
|
109134
|
-
result.set(name.toLowerCase(), resolveWorkbookPartPath(target));
|
|
109135
|
-
}
|
|
109136
|
-
}
|
|
109137
|
-
} catch {
|
|
109138
|
-
}
|
|
109139
|
-
return result;
|
|
109140
|
-
}
|
|
109141
|
-
function resolveWorkbookPartPath(target) {
|
|
109142
|
-
return target.startsWith("/") ? target.slice(1) : `xl/${target}`;
|
|
109143
|
-
}
|
|
109144
|
-
async function writeChartWorkbookUpdates(xlsxBytes, writes) {
|
|
109145
|
-
if (writes.length === 0) {
|
|
109146
|
-
return { unresolved: 0 };
|
|
109147
|
-
}
|
|
109148
|
-
let xlsxZip;
|
|
109149
|
-
try {
|
|
109150
|
-
xlsxZip = await JSZip3__default.default.loadAsync(xlsxBytes);
|
|
109151
|
-
} catch {
|
|
109152
|
-
return { unresolved: writes.length };
|
|
109153
|
-
}
|
|
109154
|
-
const parser = createSpreadsheetXmlParser2();
|
|
109155
|
-
const sheetPathByName = await resolveWorksheetPathsByName(xlsxZip, parser);
|
|
109156
|
-
const writesBySheetPath = /* @__PURE__ */ new Map();
|
|
109157
|
-
let unresolved = 0;
|
|
109158
|
-
for (const write of writes) {
|
|
109159
|
-
const range = parseChartFormulaRange(write.formula);
|
|
109160
|
-
const sheetPath = range ? sheetPathByName.get(range.sheetName.toLowerCase()) : void 0;
|
|
109161
|
-
const refs = range ? expandRangeAddresses(range, write.values.length) : void 0;
|
|
109162
|
-
if (!range || !sheetPath || !refs) {
|
|
109163
|
-
unresolved += 1;
|
|
109164
|
-
continue;
|
|
109165
|
-
}
|
|
109166
|
-
const bucket = writesBySheetPath.get(sheetPath) ?? [];
|
|
109167
|
-
bucket.push({ refs, values: write.values, isNumeric: write.isNumeric });
|
|
109168
|
-
writesBySheetPath.set(sheetPath, bucket);
|
|
109169
|
-
}
|
|
109170
|
-
const builder3 = createSpreadsheetXmlBuilder2();
|
|
109171
|
-
let changedAny = false;
|
|
109172
|
-
for (const [sheetPath, resolvedWrites] of writesBySheetPath) {
|
|
109173
|
-
const sheetFile = xlsxZip.file(sheetPath);
|
|
109174
|
-
if (!sheetFile) {
|
|
109175
|
-
unresolved += resolvedWrites.length;
|
|
109176
|
-
continue;
|
|
109177
|
-
}
|
|
109178
|
-
try {
|
|
109179
|
-
const sheetTree = parser.parse(await sheetFile.async("string"));
|
|
109180
|
-
const cellWrites = resolvedWrites.flatMap(
|
|
109181
|
-
({ refs, values, isNumeric: isNumeric2 }) => refs.map((ref, i2) => ({ ref, isNumeric: isNumeric2, value: values[i2] }))
|
|
109182
|
-
);
|
|
109183
|
-
if (applyCellWritesToWorksheet(sheetTree, cellWrites)) {
|
|
109184
|
-
xlsxZip.file(sheetPath, builder3.build(sheetTree));
|
|
109185
|
-
changedAny = true;
|
|
109186
|
-
}
|
|
109187
|
-
} catch {
|
|
109188
|
-
unresolved += resolvedWrites.length;
|
|
109189
|
-
}
|
|
109190
|
-
}
|
|
109191
|
-
if (!changedAny) {
|
|
109192
|
-
return { unresolved };
|
|
109193
|
-
}
|
|
109194
|
-
const bytes = await xlsxZip.generateAsync({
|
|
109195
|
-
type: "uint8array",
|
|
109196
|
-
compression: "DEFLATE",
|
|
109197
|
-
compressionOptions: { level: 6 }
|
|
109198
|
-
});
|
|
109199
|
-
return { bytes, unresolved };
|
|
109200
|
-
}
|
|
109201
|
-
var init_chart_xlsx_writer = __esm({
|
|
109202
|
-
"pptx/core/utils/chart-xlsx-writer.ts"() {
|
|
109203
|
-
init_chart_xlsx_cellref();
|
|
109204
|
-
init_chart_xlsx_sheet_cells();
|
|
109205
|
-
init_xml_access();
|
|
109206
|
-
init_xml_whitespace();
|
|
109207
|
-
}
|
|
109208
|
-
});
|
|
109209
109488
|
|
|
109210
109489
|
// pptx/core/core/runtime/chart-cx-update-data.ts
|
|
109211
109490
|
function findKey31(node, localName28, getLocalName2) {
|
|
@@ -109541,13 +109820,19 @@ var init_chart_cx_update = __esm({
|
|
|
109541
109820
|
});
|
|
109542
109821
|
|
|
109543
109822
|
// pptx/core/core/runtime/chart-external-workbook-save.ts
|
|
109544
|
-
async function saveChartExternalWorkbookUpdates(deps, chartPartPath, slidePath, externalData, writes) {
|
|
109823
|
+
async function saveChartExternalWorkbookUpdates(deps, chartPartPath, slidePath, externalData, writes, atomic = false) {
|
|
109824
|
+
if (atomic && externalData && (!externalData.targetPath || externalData.isExternal)) {
|
|
109825
|
+
throw new Error("Chart label replacement cannot update an external or missing workbook.");
|
|
109826
|
+
}
|
|
109545
109827
|
if (writes.length === 0 || !externalData?.targetPath) {
|
|
109546
|
-
return;
|
|
109828
|
+
return writes.length === 0;
|
|
109547
109829
|
}
|
|
109548
109830
|
const embeddingPath = deps.resolveImagePath(chartPartPath, externalData.targetPath);
|
|
109549
109831
|
const looksEmbedded = embeddingPath.includes("embeddings/") && /\.xlsx$/iu.test(embeddingPath);
|
|
109550
|
-
if (!looksEmbedded) {
|
|
109832
|
+
if (!looksEmbedded || externalData.isExternal) {
|
|
109833
|
+
if (atomic) {
|
|
109834
|
+
throw new Error("Chart label replacement requires an embedded .xlsx workbook.");
|
|
109835
|
+
}
|
|
109551
109836
|
deps.reportWarning({
|
|
109552
109837
|
code: "CHART_EXTERNAL_DATA_WRITEBACK_UNSUPPORTED",
|
|
109553
109838
|
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.",
|
|
@@ -109556,10 +109841,13 @@ async function saveChartExternalWorkbookUpdates(deps, chartPartPath, slidePath,
|
|
|
109556
109841
|
slideId: slidePath,
|
|
109557
109842
|
xmlPath: chartPartPath
|
|
109558
109843
|
});
|
|
109559
|
-
return;
|
|
109844
|
+
return false;
|
|
109560
109845
|
}
|
|
109561
109846
|
const xlsxFile = deps.zip.file(embeddingPath);
|
|
109562
109847
|
if (!xlsxFile) {
|
|
109848
|
+
if (atomic) {
|
|
109849
|
+
throw new Error("Chart label replacement workbook is missing.");
|
|
109850
|
+
}
|
|
109563
109851
|
deps.reportWarning({
|
|
109564
109852
|
code: "CHART_EMBEDDED_WORKBOOK_MISSING",
|
|
109565
109853
|
message: "Chart data changes were saved to the cached values only: the referenced embedded workbook was not found in the package.",
|
|
@@ -109568,12 +109856,15 @@ async function saveChartExternalWorkbookUpdates(deps, chartPartPath, slidePath,
|
|
|
109568
109856
|
slideId: slidePath,
|
|
109569
109857
|
xmlPath: embeddingPath
|
|
109570
109858
|
});
|
|
109571
|
-
return;
|
|
109859
|
+
return false;
|
|
109572
109860
|
}
|
|
109573
109861
|
let xlsxBytes;
|
|
109574
109862
|
try {
|
|
109575
109863
|
xlsxBytes = await xlsxFile.async("uint8array");
|
|
109576
109864
|
} catch {
|
|
109865
|
+
if (atomic) {
|
|
109866
|
+
throw new Error("Chart label replacement workbook cannot be read.");
|
|
109867
|
+
}
|
|
109577
109868
|
deps.reportWarning({
|
|
109578
109869
|
code: "CHART_EMBEDDED_WORKBOOK_UNREADABLE",
|
|
109579
109870
|
message: "Chart data changes were saved to the cached values only: the referenced embedded workbook could not be read.",
|
|
@@ -109582,9 +109873,9 @@ async function saveChartExternalWorkbookUpdates(deps, chartPartPath, slidePath,
|
|
|
109582
109873
|
slideId: slidePath,
|
|
109583
109874
|
xmlPath: embeddingPath
|
|
109584
109875
|
});
|
|
109585
|
-
return;
|
|
109876
|
+
return false;
|
|
109586
109877
|
}
|
|
109587
|
-
const result = await writeChartWorkbookUpdates(xlsxBytes, writes);
|
|
109878
|
+
const result = await writeChartWorkbookUpdates(xlsxBytes, writes, { atomic });
|
|
109588
109879
|
if (result.bytes) {
|
|
109589
109880
|
deps.zip.file(embeddingPath, result.bytes);
|
|
109590
109881
|
}
|
|
@@ -109598,6 +109889,7 @@ async function saveChartExternalWorkbookUpdates(deps, chartPartPath, slidePath,
|
|
|
109598
109889
|
xmlPath: embeddingPath
|
|
109599
109890
|
});
|
|
109600
109891
|
}
|
|
109892
|
+
return result.unresolved === 0;
|
|
109601
109893
|
}
|
|
109602
109894
|
var init_chart_external_workbook_save = __esm({
|
|
109603
109895
|
"pptx/core/core/runtime/chart-external-workbook-save.ts"() {
|
|
@@ -113052,7 +113344,7 @@ var init_PptxHandlerRuntimeState = __esm({
|
|
|
113052
113344
|
*/
|
|
113053
113345
|
savedSlideFingerprints = /* @__PURE__ */ new Map();
|
|
113054
113346
|
/**
|
|
113055
|
-
* `chartData`
|
|
113347
|
+
* `chartData` as parsed or last serialized into the current ZIP,
|
|
113056
113348
|
* serialized to JSON and keyed by `chartPartPath`. The save pipeline used
|
|
113057
113349
|
* to re-serialize EVERY chart part on any slide rewrite regardless of
|
|
113058
113350
|
* whether the chart itself was touched, which materializes the load-time
|
|
@@ -113065,6 +113357,10 @@ var init_PptxHandlerRuntimeState = __esm({
|
|
|
113065
113357
|
* untouched chart part pass through byte-for-byte instead.
|
|
113066
113358
|
*/
|
|
113067
113359
|
chartDataBaselines = /* @__PURE__ */ new Map();
|
|
113360
|
+
/** Pending chart requests also retain warned workbook writes for later retry. */
|
|
113361
|
+
pendingChartUpdates;
|
|
113362
|
+
/** Last fully reconciled workbook data plus whether a write-back needs retry. */
|
|
113363
|
+
chartWorkbookDataBaselines = /* @__PURE__ */ new Map();
|
|
113068
113364
|
/** Per-slide relationship maps: slide path -> (rId -> target path). */
|
|
113069
113365
|
slideRelsMap = /* @__PURE__ */ new Map();
|
|
113070
113366
|
/** Tracks relationship IDs with TargetMode="External" per slide/part path. */
|
|
@@ -121073,6 +121369,7 @@ var init_table_tblpr_save = __esm({
|
|
|
121073
121369
|
var CHART_DATA_DISPLAY_OPTIONS_EXT_URI, PptxHandlerRuntime24;
|
|
121074
121370
|
var init_PptxHandlerRuntimeSaveDataSerialization = __esm({
|
|
121075
121371
|
"pptx/core/core/runtime/PptxHandlerRuntimeSaveDataSerialization.ts"() {
|
|
121372
|
+
init_chart_workbook_data_signature();
|
|
121076
121373
|
init_chart_axis_dispunits_serializer();
|
|
121077
121374
|
init_chart_axis_gridlines_serializer();
|
|
121078
121375
|
init_chart_axis_label_formatting();
|
|
@@ -121210,8 +121507,6 @@ var init_PptxHandlerRuntimeSaveDataSerialization = __esm({
|
|
|
121210
121507
|
console.warn("Failed to serialize table data:", e);
|
|
121211
121508
|
}
|
|
121212
121509
|
}
|
|
121213
|
-
/** Pending chart data updates to process in the async save method. */
|
|
121214
|
-
pendingChartUpdates;
|
|
121215
121510
|
/**
|
|
121216
121511
|
* Record `chartData` as parsed, straight off `enrichChartData`, as this
|
|
121217
121512
|
* chart's load-time baseline. See {@link chartDataBaselines}.
|
|
@@ -121221,6 +121516,10 @@ var init_PptxHandlerRuntimeSaveDataSerialization = __esm({
|
|
|
121221
121516
|
return;
|
|
121222
121517
|
}
|
|
121223
121518
|
this.chartDataBaselines.set(chartData.chartPartPath, JSON.stringify(chartData));
|
|
121519
|
+
this.chartWorkbookDataBaselines.set(chartData.chartPartPath, {
|
|
121520
|
+
signature: chartWorkbookDataSignature(chartData),
|
|
121521
|
+
pending: false
|
|
121522
|
+
});
|
|
121224
121523
|
}
|
|
121225
121524
|
/**
|
|
121226
121525
|
* Collect chart data for deferred async processing during save.
|
|
@@ -121237,12 +121536,28 @@ var init_PptxHandlerRuntimeSaveDataSerialization = __esm({
|
|
|
121237
121536
|
/**
|
|
121238
121537
|
* Process all pending chart data updates (called from the async save method).
|
|
121239
121538
|
*/
|
|
121240
|
-
async processPendingChartUpdates() {
|
|
121539
|
+
async processPendingChartUpdates(slides) {
|
|
121241
121540
|
if (!this.pendingChartUpdates || this.pendingChartUpdates.length === 0) {
|
|
121242
121541
|
return;
|
|
121243
121542
|
}
|
|
121543
|
+
if (slides) {
|
|
121544
|
+
const current = /* @__PURE__ */ new Map();
|
|
121545
|
+
const visit = (elements3, slidePath) => {
|
|
121546
|
+
for (const element of elements3) {
|
|
121547
|
+
if (element.type === "group") visit(element.children, slidePath);
|
|
121548
|
+
else if (element.type === "chart" && element.chartData?.chartPartPath) {
|
|
121549
|
+
current.set(element.chartData.chartPartPath, {
|
|
121550
|
+
chartData: element.chartData,
|
|
121551
|
+
slidePath
|
|
121552
|
+
});
|
|
121553
|
+
}
|
|
121554
|
+
}
|
|
121555
|
+
};
|
|
121556
|
+
for (const slide of slides) visit(slide.elements, slide.id);
|
|
121557
|
+
this.pendingChartUpdates = [...current.values()];
|
|
121558
|
+
}
|
|
121244
121559
|
for (const { chartData, slidePath } of this.pendingChartUpdates) {
|
|
121245
|
-
if (chartData.chartPartPath && this.chartDataBaselines.get(chartData.chartPartPath) === JSON.stringify(chartData)) {
|
|
121560
|
+
if (chartData.chartPartPath && !this.chartWorkbookDataBaselines.get(chartData.chartPartPath)?.pending && this.chartDataBaselines.get(chartData.chartPartPath) === JSON.stringify(chartData)) {
|
|
121246
121561
|
continue;
|
|
121247
121562
|
}
|
|
121248
121563
|
if (chartData.colorPalette && chartData.colorStylePartPath) {
|
|
@@ -121661,7 +121976,9 @@ var init_PptxHandlerRuntimeSaveDataSerialization = __esm({
|
|
|
121661
121976
|
{
|
|
121662
121977
|
title: chartData.title,
|
|
121663
121978
|
hasTitle: chartData.style?.hasTitle,
|
|
121664
|
-
titleRuns: chartData.titleRuns
|
|
121979
|
+
titleRuns: chartData.titleRuns,
|
|
121980
|
+
titleTextOnly: chartData.titleTextOnly,
|
|
121981
|
+
titleTextOnlyStyles: chartData.titleTextOnlyStyles
|
|
121665
121982
|
},
|
|
121666
121983
|
(key2) => this.compatibilityService.getXmlLocalName(key2)
|
|
121667
121984
|
);
|
|
@@ -121853,23 +122170,41 @@ var init_PptxHandlerRuntimeSaveDataSerialization = __esm({
|
|
|
121853
122170
|
}
|
|
121854
122171
|
}
|
|
121855
122172
|
await this.syncChartUserShapesToXml(chartSpace, chartData, chartPartPath);
|
|
122173
|
+
const serializedBaseline = this.chartDataBaselines.get(chartPartPath);
|
|
122174
|
+
const signature = chartWorkbookDataSignature(chartData);
|
|
122175
|
+
const workbookBaseline = this.chartWorkbookDataBaselines.get(chartPartPath);
|
|
122176
|
+
const previousSignature = workbookBaseline?.signature ?? (serializedBaseline ? chartWorkbookDataSignature(JSON.parse(serializedBaseline)) : void 0);
|
|
122177
|
+
const workbookDataChanged = workbookBaseline?.pending || signature !== previousSignature;
|
|
122178
|
+
if (workbookDataChanged) {
|
|
122179
|
+
const complete = await saveChartExternalWorkbookUpdates(
|
|
122180
|
+
{
|
|
122181
|
+
zip: this.zip,
|
|
122182
|
+
resolveImagePath: (basePath, target) => this.resolveImagePath(basePath, target),
|
|
122183
|
+
reportWarning: (warning) => this.compatibilityService.reportWarning(warning)
|
|
122184
|
+
},
|
|
122185
|
+
chartPartPath,
|
|
122186
|
+
slidePath,
|
|
122187
|
+
chartData.externalData,
|
|
122188
|
+
workbookWrites,
|
|
122189
|
+
chartData.dataLabelTextOnly ?? false
|
|
122190
|
+
);
|
|
122191
|
+
this.chartWorkbookDataBaselines.set(chartPartPath, {
|
|
122192
|
+
signature: complete ? signature : previousSignature ?? signature,
|
|
122193
|
+
pending: !complete
|
|
122194
|
+
});
|
|
122195
|
+
}
|
|
121856
122196
|
this.zip.file(chartPartPath, this.builder.build(chartXmlData));
|
|
121857
|
-
|
|
121858
|
-
{
|
|
121859
|
-
zip: this.zip,
|
|
121860
|
-
resolveImagePath: (basePath, target) => this.resolveImagePath(basePath, target),
|
|
121861
|
-
reportWarning: (warning) => this.compatibilityService.reportWarning(warning)
|
|
121862
|
-
},
|
|
121863
|
-
chartPartPath,
|
|
121864
|
-
slidePath,
|
|
121865
|
-
chartData.externalData,
|
|
121866
|
-
workbookWrites
|
|
121867
|
-
);
|
|
122197
|
+
this.chartDataBaselines.set(chartPartPath, JSON.stringify(chartData));
|
|
121868
122198
|
} catch (e) {
|
|
122199
|
+
if (chartData.dataLabelTextOnly) {
|
|
122200
|
+
throw e;
|
|
122201
|
+
}
|
|
121869
122202
|
console.warn(`[pptx-save] Failed to serialize chart data for ${chartPartPath}:`, e);
|
|
121870
122203
|
}
|
|
121871
122204
|
}
|
|
121872
|
-
this.pendingChartUpdates =
|
|
122205
|
+
this.pendingChartUpdates = this.pendingChartUpdates.filter(
|
|
122206
|
+
({ chartData }) => chartData.chartPartPath && this.chartWorkbookDataBaselines.get(chartData.chartPartPath)?.pending
|
|
122207
|
+
);
|
|
121873
122208
|
}
|
|
121874
122209
|
/**
|
|
121875
122210
|
* Route a chart save that the 2006 `c:*Chart` update loop cannot handle:
|
|
@@ -130073,22 +130408,44 @@ function drawingNamespace(strict) {
|
|
|
130073
130408
|
var NOTES_MASTER_CONTENT_TYPE, PptxHandlerRuntime50;
|
|
130074
130409
|
var init_PptxHandlerRuntimeSaveNotesInfrastructure = __esm({
|
|
130075
130410
|
"pptx/core/core/runtime/PptxHandlerRuntimeSaveNotesInfrastructure.ts"() {
|
|
130411
|
+
init_relationships();
|
|
130076
130412
|
init_PptxHandlerRuntimeSaveViewProperties();
|
|
130077
130413
|
NOTES_MASTER_CONTENT_TYPE = "application/vnd.openxmlformats-officedocument.presentationml.notesMaster+xml";
|
|
130078
130414
|
PptxHandlerRuntime50 = class extends PptxHandlerRuntime49 {
|
|
130079
130415
|
/** Ensure authored notes have the global notes-master OPC infrastructure. */
|
|
130080
130416
|
async ensureNotesMasterForAuthoredNotes(slides, constants) {
|
|
130081
130417
|
const needsNotes = slides.some(
|
|
130082
|
-
(slide) => slide.notes
|
|
130418
|
+
(slide) => Boolean(slide.notes) || Boolean(slide.notesSegments?.some((segment) => segment.text))
|
|
130083
130419
|
);
|
|
130084
130420
|
if (!needsNotes || Object.keys(this.zip.files).some(
|
|
130085
130421
|
(path2) => /^ppt\/notesMasters\/notesMaster\d+\.xml$/u.test(path2)
|
|
130086
130422
|
)) {
|
|
130087
130423
|
return;
|
|
130088
130424
|
}
|
|
130425
|
+
const relsPath2 = "ppt/_rels/presentation.xml.rels";
|
|
130426
|
+
const relsXml = await this.zip.file(relsPath2)?.async("string");
|
|
130427
|
+
if (!relsXml || !this.presentationData) return;
|
|
130428
|
+
if (Array.from(parseRelationships(relsXml).values()).some(
|
|
130429
|
+
(relationship) => relationship.type.endsWith("/notesMaster") && relationship.mode !== "External" && this.zip.file(resolvePartPath("ppt/presentation.xml", relationship.target))
|
|
130430
|
+
))
|
|
130431
|
+
return;
|
|
130089
130432
|
const strict = constants.conformance === "strict";
|
|
130090
130433
|
const masterPath = "ppt/notesMasters/notesMaster1.xml";
|
|
130091
|
-
const
|
|
130434
|
+
const sourceThemePath = Object.keys(this.zip.files).find((path2) => /^ppt\/theme\/theme\d+\.xml$/u.test(path2)) ?? "ppt/theme/theme1.xml";
|
|
130435
|
+
let themeIndex = 1;
|
|
130436
|
+
while (this.zip.file(`ppt/theme/theme${themeIndex}.xml`)) themeIndex += 1;
|
|
130437
|
+
const themePath = `ppt/theme/theme${themeIndex}.xml`;
|
|
130438
|
+
const themeBytes = await this.zip.file(sourceThemePath)?.async("uint8array");
|
|
130439
|
+
const theme = themeBytes ?? this.buildThemeXml(themePath, void 0);
|
|
130440
|
+
if (!theme) throw new Error("Cannot create a notes theme from the presentation state");
|
|
130441
|
+
this.zip.file(themePath, theme);
|
|
130442
|
+
const themeRelationships = await this.zip.file(`ppt/theme/_rels/${sourceThemePath.slice(sourceThemePath.lastIndexOf("/") + 1)}.rels`)?.async("uint8array");
|
|
130443
|
+
if (themeRelationships)
|
|
130444
|
+
this.zip.file(`ppt/theme/_rels/theme${themeIndex}.xml.rels`, themeRelationships);
|
|
130445
|
+
await this.addContentTypeOverride(
|
|
130446
|
+
`/${themePath}`,
|
|
130447
|
+
"application/vnd.openxmlformats-officedocument.theme+xml"
|
|
130448
|
+
);
|
|
130092
130449
|
this.zip.file(masterPath, this.builder.build(this.buildDefaultNotesMaster(strict)));
|
|
130093
130450
|
this.zip.file(
|
|
130094
130451
|
"ppt/notesMasters/_rels/notesMaster1.xml.rels",
|
|
@@ -130103,11 +130460,6 @@ var init_PptxHandlerRuntimeSaveNotesInfrastructure = __esm({
|
|
|
130103
130460
|
}
|
|
130104
130461
|
})
|
|
130105
130462
|
);
|
|
130106
|
-
const relsPath2 = "ppt/_rels/presentation.xml.rels";
|
|
130107
|
-
const relsXml = await this.zip.file(relsPath2)?.async("string");
|
|
130108
|
-
if (!relsXml || !this.presentationData) {
|
|
130109
|
-
return;
|
|
130110
|
-
}
|
|
130111
130463
|
const relsData = this.parser.parse(relsXml);
|
|
130112
130464
|
const relsRoot = relsData["Relationships"] ?? {};
|
|
130113
130465
|
const relationships2 = asArray7(relsRoot["Relationship"]);
|
|
@@ -130842,7 +131194,7 @@ var init_PptxHandlerRuntimeSavePipeline = __esm({
|
|
|
130842
131194
|
saveSession,
|
|
130843
131195
|
saveConstants
|
|
130844
131196
|
);
|
|
130845
|
-
await this.processPendingChartUpdates();
|
|
131197
|
+
await this.processPendingChartUpdates(slides);
|
|
130846
131198
|
await this.ensureChartPartContentTypes();
|
|
130847
131199
|
await this.ensureOleEmbeddingContentTypes();
|
|
130848
131200
|
await this.processPendingOleContentUpdates();
|
|
@@ -140853,6 +141205,7 @@ var init_PptxHandlerRuntimeChartExternalData = __esm({
|
|
|
140853
141205
|
);
|
|
140854
141206
|
const autoUpdateAttr = externalDataNode["@_autoUpdate"];
|
|
140855
141207
|
const autoUpdate = autoUpdateNode?.["@_val"] === "1" || autoUpdateNode?.["@_val"] === "true" || autoUpdateAttr === "1" || autoUpdateAttr === "true" || false;
|
|
141208
|
+
let isExternal = false;
|
|
140856
141209
|
let targetPath;
|
|
140857
141210
|
try {
|
|
140858
141211
|
const chartDir = chartPartPath.substring(0, chartPartPath.lastIndexOf("/") + 1);
|
|
@@ -140867,6 +141220,7 @@ var init_PptxHandlerRuntimeChartExternalData = __esm({
|
|
|
140867
141220
|
for (const rel of rels) {
|
|
140868
141221
|
if (String(rel?.["@_Id"] || "") === relId) {
|
|
140869
141222
|
targetPath = String(rel?.["@_Target"] || "").trim() || void 0;
|
|
141223
|
+
isExternal = String(rel?.["@_TargetMode"] || "") === "External";
|
|
140870
141224
|
break;
|
|
140871
141225
|
}
|
|
140872
141226
|
}
|
|
@@ -140875,7 +141229,7 @@ var init_PptxHandlerRuntimeChartExternalData = __esm({
|
|
|
140875
141229
|
} catch {
|
|
140876
141230
|
}
|
|
140877
141231
|
let embeddedWorkbookData;
|
|
140878
|
-
if (targetPath) {
|
|
141232
|
+
if (targetPath && !isExternal) {
|
|
140879
141233
|
try {
|
|
140880
141234
|
const embeddingPath = this.resolveImagePath(chartPartPath, targetPath);
|
|
140881
141235
|
if (embeddingPath.includes("embeddings/") && embeddingPath.endsWith(".xlsx")) {
|
|
@@ -140889,6 +141243,7 @@ var init_PptxHandlerRuntimeChartExternalData = __esm({
|
|
|
140889
141243
|
}
|
|
140890
141244
|
return {
|
|
140891
141245
|
relId,
|
|
141246
|
+
...isExternal ? { isExternal: true } : {},
|
|
140892
141247
|
targetPath,
|
|
140893
141248
|
autoUpdate,
|
|
140894
141249
|
...embeddedWorkbookData ? { embeddedWorkbookData } : {}
|
|
@@ -141259,6 +141614,8 @@ var init_PptxHandlerRuntimeChartExParsing = __esm({
|
|
|
141259
141614
|
...result.categoryLevels ? { categoryLevels: result.categoryLevels } : {},
|
|
141260
141615
|
series: result.series,
|
|
141261
141616
|
title: cxTitleText,
|
|
141617
|
+
titleTextEditable: false,
|
|
141618
|
+
dataLabelTextEditable: false,
|
|
141262
141619
|
style: chartStyle2,
|
|
141263
141620
|
chartPartPath,
|
|
141264
141621
|
chartRelationshipId,
|
|
@@ -141282,6 +141639,7 @@ var init_PptxHandlerRuntimeChartExParsing = __esm({
|
|
|
141282
141639
|
var PptxHandlerRuntime95;
|
|
141283
141640
|
var init_PptxHandlerRuntimeChartParsing = __esm({
|
|
141284
141641
|
"pptx/core/core/runtime/PptxHandlerRuntimeChartParsing.ts"() {
|
|
141642
|
+
init_chart_label_source();
|
|
141285
141643
|
init_chart_advanced_parser();
|
|
141286
141644
|
init_chart_axis_parser();
|
|
141287
141645
|
init_chart_band_fmts();
|
|
@@ -141472,12 +141830,34 @@ var init_PptxHandlerRuntimeChartParsing = __esm({
|
|
|
141472
141830
|
colorAdapter
|
|
141473
141831
|
);
|
|
141474
141832
|
const style = chartStyleFromNeutral(neutral, this.extractChartStyle(chartSpace, chartRoot));
|
|
141833
|
+
const titleTx = reader2.xml.getChildByLocalName(
|
|
141834
|
+
reader2.xml.getChildByLocalName(chartRoot, "title"),
|
|
141835
|
+
"tx"
|
|
141836
|
+
);
|
|
141837
|
+
const titleRich = reader2.xml.getChildByLocalName(titleTx, "rich");
|
|
141838
|
+
const titleParagraphs = reader2.xml.getChildrenArrayByLocalName(titleRich, "p");
|
|
141839
|
+
const titleTextEditable = Boolean(
|
|
141840
|
+
titleRuns?.length && titleParagraphs.length === 1 && !Object.keys(titleParagraphs[0] ?? {}).some(
|
|
141841
|
+
(key2) => ["br", "fld"].includes(reader2.localName(key2))
|
|
141842
|
+
)
|
|
141843
|
+
);
|
|
141475
141844
|
const groupOptions = groupOptionsFromNeutral(groups[0]?.group, chartType);
|
|
141476
141845
|
const linesAndChrome = this.readChartLinesAndChrome(neutral, tree, groups, reader2);
|
|
141477
141846
|
const facts = await this.readChartPartFacts(chartSpace, chartRoot, chartPartPath);
|
|
141478
141847
|
const workbook = facts.embeddedWorkbookData;
|
|
141479
141848
|
const dateCategories = rawDateCategories ? { ...rawDateCategories, date1904: neutral.date1904 ?? workbook?.date1904 ?? false } : void 0;
|
|
141480
141849
|
const filled = applyEmbeddedWorkbookFallback(chartType, categories, built.series, workbook);
|
|
141850
|
+
const dataLabelTextEditable = !categoryLevels && !dateCategories && await chartLabelsHaveEditableSources(
|
|
141851
|
+
reader2.xml,
|
|
141852
|
+
this.zip,
|
|
141853
|
+
chartSpace,
|
|
141854
|
+
built.seriesNodes,
|
|
141855
|
+
filled.series,
|
|
141856
|
+
filled.categories,
|
|
141857
|
+
facts.externalData,
|
|
141858
|
+
chartPartPath,
|
|
141859
|
+
this.resolveImagePath.bind(this)
|
|
141860
|
+
);
|
|
141481
141861
|
const hasPicture = filled.series.some(
|
|
141482
141862
|
(entry2) => entry2.picture || entry2.impliedPicture || entry2.dataPoints?.some((point2) => point2.picture || point2.impliedPicture)
|
|
141483
141863
|
);
|
|
@@ -141510,6 +141890,14 @@ var init_PptxHandlerRuntimeChartParsing = __esm({
|
|
|
141510
141890
|
...built.filtered,
|
|
141511
141891
|
title: neutralTitleText(neutral.title),
|
|
141512
141892
|
...titleRuns ? { titleRuns } : {},
|
|
141893
|
+
titleTextEditable,
|
|
141894
|
+
dataLabelTextEditable,
|
|
141895
|
+
...dataLabelTextEditable ? {
|
|
141896
|
+
dataLabelSourceShape: {
|
|
141897
|
+
categoryCount: filled.categories.length,
|
|
141898
|
+
seriesValueCounts: filled.series.map((series) => series.values.length)
|
|
141899
|
+
}
|
|
141900
|
+
} : {},
|
|
141513
141901
|
style,
|
|
141514
141902
|
grouping: groupOptions.grouping,
|
|
141515
141903
|
...groupOptions,
|
|
@@ -142007,6 +142395,8 @@ var init_PptxHandlerRuntimeLoadSession = __esm({
|
|
|
142007
142395
|
this.slideMap.clear();
|
|
142008
142396
|
this.savedSlideFingerprints.clear();
|
|
142009
142397
|
this.chartDataBaselines.clear();
|
|
142398
|
+
this.chartWorkbookDataBaselines.clear();
|
|
142399
|
+
this.pendingChartUpdates = void 0;
|
|
142010
142400
|
this.layoutCache.clear();
|
|
142011
142401
|
this.masterCache.clear();
|
|
142012
142402
|
this.templateElementBaselines.reset();
|
|
@@ -142496,6 +142886,8 @@ var init_PptxHandlerRuntimeLoadPipeline = __esm({
|
|
|
142496
142886
|
this.slideMap.clear();
|
|
142497
142887
|
this.savedSlideFingerprints.clear();
|
|
142498
142888
|
this.chartDataBaselines.clear();
|
|
142889
|
+
this.chartWorkbookDataBaselines.clear();
|
|
142890
|
+
this.pendingChartUpdates = void 0;
|
|
142499
142891
|
this.slideRelsMap.clear();
|
|
142500
142892
|
this.externalRelsMap.clear();
|
|
142501
142893
|
this.layoutCache.clear();
|
|
@@ -146841,11 +147233,16 @@ function duplicateSlide(slide, newSlideNumber) {
|
|
|
146841
147233
|
cloned.elements = cloned.elements.map(reassignElementId);
|
|
146842
147234
|
if (cloned.animations && cloned.animations.length > 0) {
|
|
146843
147235
|
const idMap = /* @__PURE__ */ new Map();
|
|
146844
|
-
|
|
146845
|
-
|
|
146846
|
-
|
|
146847
|
-
|
|
146848
|
-
|
|
147236
|
+
const mapElements = (originals, copies) => {
|
|
147237
|
+
originals.forEach((original, index) => {
|
|
147238
|
+
const copy = copies[index];
|
|
147239
|
+
if (!copy) return;
|
|
147240
|
+
idMap.set(original.id, copy.id);
|
|
147241
|
+
if (original.type === "group" && copy.type === "group")
|
|
147242
|
+
mapElements(original.children, copy.children);
|
|
147243
|
+
});
|
|
147244
|
+
};
|
|
147245
|
+
mapElements(slide.elements, cloned.elements);
|
|
146849
147246
|
cloned.animations = cloned.animations.map((anim) => ({
|
|
146850
147247
|
...anim,
|
|
146851
147248
|
elementId: idMap.get(anim.elementId) ?? anim.elementId
|
|
@@ -149680,15 +150077,26 @@ init_font_substitution();
|
|
|
149680
150077
|
var DEFAULT_FONT_SIZE = 18;
|
|
149681
150078
|
var FALLBACK_PAD_FACTOR = 0.06;
|
|
149682
150079
|
function drawTextSegments(ctx, segments, bodyStyle, w, h2, scaleFactor = 1) {
|
|
149683
|
-
const padL = bodyStyle?.bodyInsetLeft ? bodyStyle.bodyInsetLeft * scaleFactor : Math.round(w * FALLBACK_PAD_FACTOR);
|
|
149684
|
-
const padR = bodyStyle?.bodyInsetRight ? bodyStyle.bodyInsetRight * scaleFactor : Math.round(w * FALLBACK_PAD_FACTOR);
|
|
149685
|
-
const padT = bodyStyle?.bodyInsetTop ? bodyStyle.bodyInsetTop * scaleFactor : Math.round(h2 * FALLBACK_PAD_FACTOR);
|
|
149686
|
-
const padB = bodyStyle?.bodyInsetBottom ? bodyStyle.bodyInsetBottom * scaleFactor : Math.round(h2 * FALLBACK_PAD_FACTOR);
|
|
150080
|
+
const padL = bodyStyle?.bodyInsetLeft !== void 0 ? bodyStyle.bodyInsetLeft * scaleFactor : Math.round(w * FALLBACK_PAD_FACTOR);
|
|
150081
|
+
const padR = bodyStyle?.bodyInsetRight !== void 0 ? bodyStyle.bodyInsetRight * scaleFactor : Math.round(w * FALLBACK_PAD_FACTOR);
|
|
150082
|
+
const padT = bodyStyle?.bodyInsetTop !== void 0 ? bodyStyle.bodyInsetTop * scaleFactor : Math.round(h2 * FALLBACK_PAD_FACTOR);
|
|
150083
|
+
const padB = bodyStyle?.bodyInsetBottom !== void 0 ? bodyStyle.bodyInsetBottom * scaleFactor : Math.round(h2 * FALLBACK_PAD_FACTOR);
|
|
149687
150084
|
const maxWidth = w - padL - padR;
|
|
149688
150085
|
if (maxWidth <= 0) {
|
|
149689
150086
|
return;
|
|
149690
150087
|
}
|
|
149691
|
-
const paragraphs = splitIntoParagraphs(
|
|
150088
|
+
const paragraphs = splitIntoParagraphs(
|
|
150089
|
+
segments.map((segment) => ({
|
|
150090
|
+
...segment,
|
|
150091
|
+
style: {
|
|
150092
|
+
...bodyStyle,
|
|
150093
|
+
...Object.fromEntries(
|
|
150094
|
+
Object.entries(segment.style).filter(([, value]) => value !== void 0)
|
|
150095
|
+
)
|
|
150096
|
+
}
|
|
150097
|
+
})),
|
|
150098
|
+
bodyStyle
|
|
150099
|
+
);
|
|
149692
150100
|
const lines = layoutParagraphs(ctx, paragraphs, maxWidth, scaleFactor);
|
|
149693
150101
|
if (lines.length === 0) {
|
|
149694
150102
|
return;
|
|
@@ -149724,33 +150132,58 @@ function drawTextSegments(ctx, segments, bodyStyle, w, h2, scaleFactor = 1) {
|
|
|
149724
150132
|
y += line2.height * 0.3;
|
|
149725
150133
|
}
|
|
149726
150134
|
}
|
|
149727
|
-
function splitIntoParagraphs(segments) {
|
|
149728
|
-
const paragraphs = [[]];
|
|
150135
|
+
function splitIntoParagraphs(segments, bodyStyle) {
|
|
150136
|
+
const paragraphs = [{ segments: [], style: bodyStyle ?? {} }];
|
|
149729
150137
|
for (const seg of segments) {
|
|
149730
|
-
if (seg.isParagraphBreak) {
|
|
149731
|
-
paragraphs.push([]);
|
|
149732
|
-
} else if (seg.text) {
|
|
149733
|
-
paragraphs[paragraphs.length - 1].push(seg);
|
|
150138
|
+
if (seg.isParagraphBreak || seg.text === "\n" && !seg.isLineBreak) {
|
|
150139
|
+
paragraphs.push({ segments: [], style: seg.style });
|
|
150140
|
+
} else if (seg.text || seg.isLineBreak) {
|
|
150141
|
+
paragraphs[paragraphs.length - 1].segments.push(seg);
|
|
149734
150142
|
}
|
|
149735
150143
|
}
|
|
149736
|
-
return paragraphs
|
|
150144
|
+
return paragraphs;
|
|
149737
150145
|
}
|
|
149738
150146
|
function layoutParagraphs(ctx, paragraphs, maxWidth, scaleFactor) {
|
|
149739
150147
|
const lines = [];
|
|
149740
|
-
for (const
|
|
149741
|
-
const
|
|
150148
|
+
for (const paragraph of paragraphs) {
|
|
150149
|
+
const para = paragraph.segments;
|
|
150150
|
+
const paraAlign = para[0]?.style.align ?? paragraph.style.align;
|
|
149742
150151
|
let currentLine = [];
|
|
149743
150152
|
let lineWidth = 0;
|
|
149744
150153
|
let lineHeight = 0;
|
|
150154
|
+
let fallbackHeight = (para[0]?.style.fontSize ?? paragraph.style.fontSize ?? DEFAULT_FONT_SIZE) * scaleFactor * 1.2;
|
|
150155
|
+
const flushLine = () => {
|
|
150156
|
+
while (currentLine.length > 0 && /^\s+$/.test(currentLine[currentLine.length - 1].text)) {
|
|
150157
|
+
lineWidth -= currentLine.pop().measuredWidth;
|
|
150158
|
+
}
|
|
150159
|
+
lines.push({
|
|
150160
|
+
runs: currentLine,
|
|
150161
|
+
width: lineWidth,
|
|
150162
|
+
height: lineHeight || fallbackHeight,
|
|
150163
|
+
align: paraAlign
|
|
150164
|
+
});
|
|
150165
|
+
currentLine = [];
|
|
150166
|
+
lineWidth = 0;
|
|
150167
|
+
lineHeight = 0;
|
|
150168
|
+
};
|
|
149745
150169
|
for (const seg of para) {
|
|
149746
150170
|
ctx.font = buildFont(seg.style, scaleFactor);
|
|
149747
150171
|
const fontSize = (seg.style.fontSize ?? DEFAULT_FONT_SIZE) * scaleFactor;
|
|
149748
150172
|
const segHeight = fontSize * 1.2;
|
|
149749
|
-
|
|
150173
|
+
fallbackHeight = segHeight;
|
|
150174
|
+
if (seg.isLineBreak) {
|
|
150175
|
+
flushLine();
|
|
150176
|
+
continue;
|
|
150177
|
+
}
|
|
150178
|
+
const tokens = seg.text.split(/(\r\n|\r|\n)|(?<=\s)(?=\S)|(?<=\S)(?=\s)/);
|
|
149750
150179
|
for (const raw of tokens) {
|
|
149751
150180
|
if (!raw) {
|
|
149752
150181
|
continue;
|
|
149753
150182
|
}
|
|
150183
|
+
if (/^(\r\n|\r|\n)$/.test(raw)) {
|
|
150184
|
+
flushLine();
|
|
150185
|
+
continue;
|
|
150186
|
+
}
|
|
149754
150187
|
if (/^\s+$/.test(raw)) {
|
|
149755
150188
|
if (currentLine.length > 0) {
|
|
149756
150189
|
const spaceW = ctx.measureText(raw).width;
|
|
@@ -149766,19 +150199,7 @@ function layoutParagraphs(ctx, paragraphs, maxWidth, scaleFactor) {
|
|
|
149766
150199
|
const word = raw;
|
|
149767
150200
|
const wordW = ctx.measureText(word).width;
|
|
149768
150201
|
if (lineWidth + wordW > maxWidth && currentLine.length > 0) {
|
|
149769
|
-
|
|
149770
|
-
const removed = currentLine.pop();
|
|
149771
|
-
lineWidth -= removed.measuredWidth;
|
|
149772
|
-
}
|
|
149773
|
-
lines.push({
|
|
149774
|
-
runs: currentLine,
|
|
149775
|
-
width: lineWidth,
|
|
149776
|
-
height: lineHeight,
|
|
149777
|
-
align: paraAlign
|
|
149778
|
-
});
|
|
149779
|
-
currentLine = [];
|
|
149780
|
-
lineWidth = 0;
|
|
149781
|
-
lineHeight = 0;
|
|
150202
|
+
flushLine();
|
|
149782
150203
|
}
|
|
149783
150204
|
currentLine.push({
|
|
149784
150205
|
text: word,
|
|
@@ -149789,14 +150210,7 @@ function layoutParagraphs(ctx, paragraphs, maxWidth, scaleFactor) {
|
|
|
149789
150210
|
lineHeight = Math.max(lineHeight, segHeight);
|
|
149790
150211
|
}
|
|
149791
150212
|
}
|
|
149792
|
-
|
|
149793
|
-
lines.push({
|
|
149794
|
-
runs: currentLine,
|
|
149795
|
-
width: lineWidth,
|
|
149796
|
-
height: lineHeight,
|
|
149797
|
-
align: paraAlign
|
|
149798
|
-
});
|
|
149799
|
-
}
|
|
150213
|
+
flushLine();
|
|
149800
150214
|
}
|
|
149801
150215
|
return lines;
|
|
149802
150216
|
}
|