ooxml-core 1.1.0 → 1.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +18 -18
- package/dist/{PptxHandler-75LOVF7I.mjs → PptxHandler-VQQS4VS6.mjs} +3 -3
- package/dist/automation/index.cjs +7567 -4401
- package/dist/automation/index.mjs +7567 -4401
- package/dist/chart/bar-cluster-geometry.d.ts +6 -0
- package/dist/chart/bar-cluster-geometry.d.ts.map +1 -1
- package/dist/chart/color-palettes.d.ts +2 -2
- package/dist/chart/color-palettes.d.ts.map +1 -1
- package/dist/chart/data-cache.d.ts +6 -0
- package/dist/chart/data-cache.d.ts.map +1 -0
- package/dist/chart/gradient-coincident-stops.d.ts +17 -0
- package/dist/chart/gradient-coincident-stops.d.ts.map +1 -0
- package/dist/chart/gradient-definition.d.ts +3 -3
- package/dist/chart/gradient-definition.d.ts.map +1 -1
- package/dist/chart/index.cjs +3069 -140
- package/dist/chart/index.d.ts +7 -0
- package/dist/chart/index.d.ts.map +1 -1
- package/dist/chart/index.mjs +3048 -141
- package/dist/chart/model-chrome.d.ts +39 -0
- package/dist/chart/model-chrome.d.ts.map +1 -0
- package/dist/chart/model-series.d.ts +189 -0
- package/dist/chart/model-series.d.ts.map +1 -0
- package/dist/chart/model.d.ts +202 -0
- package/dist/chart/model.d.ts.map +1 -0
- package/dist/chart/parse-chrome.d.ts +16 -0
- package/dist/chart/parse-chrome.d.ts.map +1 -0
- package/dist/chart/parse-plot.d.ts +11 -0
- package/dist/chart/parse-plot.d.ts.map +1 -0
- package/dist/chart/parse-series.d.ts +8 -0
- package/dist/chart/parse-series.d.ts.map +1 -0
- package/dist/chart/parse-space.d.ts +8 -0
- package/dist/chart/parse-space.d.ts.map +1 -0
- package/dist/chart/parse-text.d.ts +12 -0
- package/dist/chart/parse-text.d.ts.map +1 -0
- package/dist/chart/parse-util.d.ts +42 -0
- package/dist/chart/parse-util.d.ts.map +1 -0
- package/dist/{xlsx/layout → chart/render}/chart-appearance.d.ts +4 -4
- package/dist/chart/render/chart-appearance.d.ts.map +1 -0
- package/dist/chart/render/chart-colors.d.ts +9 -0
- package/dist/chart/render/chart-colors.d.ts.map +1 -0
- package/dist/chart/render/chart-scale.d.ts.map +1 -0
- package/dist/chart/render/chart-spacing.d.ts +6 -0
- package/dist/chart/render/chart-spacing.d.ts.map +1 -0
- package/dist/{xlsx/layout → chart/render}/chart-svg-appearance.d.ts +1 -1
- package/dist/chart/render/chart-svg-appearance.d.ts.map +1 -0
- package/dist/chart/render/chart-svg-bars.d.ts.map +1 -0
- package/dist/chart/render/chart-svg-cartesian.d.ts.map +1 -0
- package/dist/chart/render/chart-svg-legend.d.ts.map +1 -0
- package/dist/chart/render/chart-svg-radial.d.ts.map +1 -0
- package/dist/chart/render/chart-svg-text-metrics.d.ts.map +1 -0
- package/dist/chart/render/chart-svg-title-text.d.ts.map +1 -0
- package/dist/chart/render/chart-svg-util.d.ts.map +1 -0
- package/dist/chart/render/chart-svg.d.ts.map +1 -0
- package/dist/chart/render/chart-title-text.d.ts +14 -0
- package/dist/chart/render/chart-title-text.d.ts.map +1 -0
- package/dist/chart/render/chart-value-axis.d.ts +6 -0
- package/dist/chart/render/chart-value-axis.d.ts.map +1 -0
- package/dist/chart/render/chart-view.d.ts +71 -0
- package/dist/chart/render/chart-view.d.ts.map +1 -0
- package/dist/chart/render/index.d.ts +9 -0
- package/dist/chart/render/index.d.ts.map +1 -0
- package/dist/chart/render/render-space.d.ts +34 -0
- package/dist/chart/render/render-space.d.ts.map +1 -0
- package/dist/chart/render/summary-from-space.d.ts +15 -0
- package/dist/chart/render/summary-from-space.d.ts.map +1 -0
- package/dist/chart/render/summary.d.ts +51 -0
- package/dist/chart/render/summary.d.ts.map +1 -0
- package/dist/chart/render/theme-palette.d.ts +8 -0
- package/dist/chart/render/theme-palette.d.ts.map +1 -0
- package/dist/chart/style-definition.d.ts +7 -7
- package/dist/chart/style-definition.d.ts.map +1 -1
- package/dist/chart/write-axes.d.ts +5 -0
- package/dist/chart/write-axes.d.ts.map +1 -0
- package/dist/chart/write-chrome.d.ts +9 -0
- package/dist/chart/write-chrome.d.ts.map +1 -0
- package/dist/chart/write-plot.d.ts +7 -0
- package/dist/chart/write-plot.d.ts.map +1 -0
- package/dist/chart/write-series.d.ts +7 -0
- package/dist/chart/write-series.d.ts.map +1 -0
- package/dist/chart/write-shape.d.ts +21 -0
- package/dist/chart/write-shape.d.ts.map +1 -0
- package/dist/chart/write-space.d.ts +15 -0
- package/dist/chart/write-space.d.ts.map +1 -0
- package/dist/chart/write-text-body.d.ts +6 -0
- package/dist/chart/write-text-body.d.ts.map +1 -0
- package/dist/chart/write-text.d.ts +15 -0
- package/dist/chart/write-text.d.ts.map +1 -0
- package/dist/chart/write-util.d.ts +24 -0
- package/dist/chart/write-util.d.ts.map +1 -0
- package/dist/chart/xml-fragment.d.ts +13 -0
- package/dist/chart/xml-fragment.d.ts.map +1 -0
- package/dist/{chunk-HUBK4EOT.mjs → chunk-3IT6ZD7K.mjs} +2 -0
- package/dist/{chunk-TS3E27NK.mjs → chunk-3UMDVJRN.mjs} +12 -1
- package/dist/{chunk-P22OKTRK.mjs → chunk-54S5A5PZ.mjs} +208 -159
- package/dist/{chunk-OMGH6IKY.mjs → chunk-5U27IVB7.mjs} +42 -5
- package/dist/{chunk-RFX7AJDZ.mjs → chunk-5VLNF4OX.mjs} +2 -2
- package/dist/{chunk-OJI3N5AY.cjs → chunk-FRUB573B.cjs} +2 -0
- package/dist/{chunk-75LA7H3F.mjs → chunk-V2BIGIH4.mjs} +27504 -27464
- package/dist/{chunk-Q27H4HFS.mjs → chunk-XBNSBDNT.mjs} +1 -1
- package/dist/{chunk-2C72N64G.cjs → chunk-XROY25LN.cjs} +12 -0
- package/dist/{chunk-LA7D6ZYQ.mjs → chunk-XSFHGZFH.mjs} +3579 -2083
- package/dist/collab/index.cjs +1 -0
- package/dist/collab/index.mjs +1 -0
- package/dist/collab/transport-provider.d.ts.map +1 -1
- package/dist/color/hex-rgb.d.ts +5 -0
- package/dist/color/hex-rgb.d.ts.map +1 -0
- package/dist/color/index.cjs +12 -0
- package/dist/color/index.d.ts +1 -0
- package/dist/color/index.d.ts.map +1 -1
- package/dist/color/index.mjs +11 -1
- package/dist/diagram/engine/alg-composite.d.ts +18 -0
- package/dist/diagram/engine/alg-composite.d.ts.map +1 -0
- package/dist/diagram/engine/alg-connector.d.ts +17 -0
- package/dist/diagram/engine/alg-connector.d.ts.map +1 -0
- package/dist/diagram/engine/alg-cycle.d.ts +28 -0
- package/dist/diagram/engine/alg-cycle.d.ts.map +1 -0
- package/dist/diagram/engine/alg-hier.d.ts +33 -0
- package/dist/diagram/engine/alg-hier.d.ts.map +1 -0
- package/dist/diagram/engine/alg-linear.d.ts +24 -0
- package/dist/diagram/engine/alg-linear.d.ts.map +1 -0
- package/dist/diagram/engine/alg-pyra.d.ts +117 -0
- package/dist/diagram/engine/alg-pyra.d.ts.map +1 -0
- package/dist/diagram/engine/alg-snake.d.ts +21 -0
- package/dist/diagram/engine/alg-snake.d.ts.map +1 -0
- package/dist/diagram/engine/axis.d.ts +24 -0
- package/dist/diagram/engine/axis.d.ts.map +1 -0
- package/dist/diagram/engine/conditions.d.ts +12 -0
- package/dist/diagram/engine/conditions.d.ts.map +1 -0
- package/dist/diagram/engine/connector-shape.d.ts +25 -0
- package/dist/diagram/engine/connector-shape.d.ts.map +1 -0
- package/dist/diagram/engine/connector-size.d.ts +30 -0
- package/dist/diagram/engine/connector-size.d.ts.map +1 -0
- package/dist/diagram/engine/constraint-eval.d.ts +37 -0
- package/dist/diagram/engine/constraint-eval.d.ts.map +1 -0
- package/dist/diagram/engine/constraint-fill-idiom.d.ts +61 -0
- package/dist/diagram/engine/constraint-fill-idiom.d.ts.map +1 -0
- package/dist/diagram/engine/constraint-units.d.ts +35 -0
- package/dist/diagram/engine/constraint-units.d.ts.map +1 -0
- package/dist/diagram/engine/data-points.d.ts +48 -0
- package/dist/diagram/engine/data-points.d.ts.map +1 -0
- package/dist/diagram/engine/engine-context.d.ts +21 -0
- package/dist/diagram/engine/engine-context.d.ts.map +1 -0
- package/dist/diagram/engine/engine-first-allowlist.d.ts +31 -0
- package/dist/diagram/engine/engine-first-allowlist.d.ts.map +1 -0
- package/dist/diagram/engine/engine-fonts.d.ts +26 -0
- package/dist/diagram/engine/engine-fonts.d.ts.map +1 -0
- package/dist/diagram/engine/engine-node.d.ts +72 -0
- package/dist/diagram/engine/engine-node.d.ts.map +1 -0
- package/dist/diagram/engine/engine-to-result.d.ts +43 -0
- package/dist/diagram/engine/engine-to-result.d.ts.map +1 -0
- package/dist/diagram/engine/engine.d.ts +18 -0
- package/dist/diagram/engine/engine.d.ts.map +1 -0
- package/dist/diagram/engine/font-groups.d.ts +33 -0
- package/dist/diagram/engine/font-groups.d.ts.map +1 -0
- package/dist/diagram/engine/font-length.d.ts +26 -0
- package/dist/diagram/engine/font-length.d.ts.map +1 -0
- package/dist/diagram/engine/font-search.d.ts +38 -0
- package/dist/diagram/engine/font-search.d.ts.map +1 -0
- package/dist/diagram/engine/hier-assistants.d.ts +47 -0
- package/dist/diagram/engine/hier-assistants.d.ts.map +1 -0
- package/dist/diagram/engine/hier-hang.d.ts +28 -0
- package/dist/diagram/engine/hier-hang.d.ts.map +1 -0
- package/dist/diagram/engine/hier-measure.d.ts +33 -0
- package/dist/diagram/engine/hier-measure.d.ts.map +1 -0
- package/dist/diagram/engine/hier-node-size.d.ts +23 -0
- package/dist/diagram/engine/hier-node-size.d.ts.map +1 -0
- package/dist/diagram/engine/hier-shape.d.ts +31 -0
- package/dist/diagram/engine/hier-shape.d.ts.map +1 -0
- package/dist/diagram/engine/index.d.ts +6 -0
- package/dist/diagram/engine/index.d.ts.map +1 -0
- package/dist/diagram/engine/layout-def-parse.d.ts +13 -0
- package/dist/diagram/engine/layout-def-parse.d.ts.map +1 -0
- package/dist/diagram/engine/layout-def-types.d.ts +118 -0
- package/dist/diagram/engine/layout-def-types.d.ts.map +1 -0
- package/dist/diagram/engine/layout-driver.d.ts +41 -0
- package/dist/diagram/engine/layout-driver.d.ts.map +1 -0
- package/dist/diagram/engine/layout-font.d.ts +27 -0
- package/dist/diagram/engine/layout-font.d.ts.map +1 -0
- package/dist/diagram/engine/move-with-merge.d.ts +49 -0
- package/dist/diagram/engine/move-with-merge.d.ts.map +1 -0
- package/dist/diagram/engine/node-text.d.ts +20 -0
- package/dist/diagram/engine/node-text.d.ts.map +1 -0
- package/dist/diagram/engine/ordered-xml.d.ts +30 -0
- package/dist/diagram/engine/ordered-xml.d.ts.map +1 -0
- package/dist/diagram/engine/preferred-size.d.ts +28 -0
- package/dist/diagram/engine/preferred-size.d.ts.map +1 -0
- package/dist/diagram/engine/pres-tree.d.ts +58 -0
- package/dist/diagram/engine/pres-tree.d.ts.map +1 -0
- package/dist/diagram/engine/registry.d.ts +7 -0
- package/dist/diagram/engine/registry.d.ts.map +1 -0
- package/dist/diagram/engine/render-filter.d.ts +43 -0
- package/dist/diagram/engine/render-filter.d.ts.map +1 -0
- package/dist/diagram/engine/shape-adjust.d.ts +16 -0
- package/dist/diagram/engine/shape-adjust.d.ts.map +1 -0
- package/dist/diagram/engine/shape-transform.d.ts +14 -0
- package/dist/diagram/engine/shape-transform.d.ts.map +1 -0
- package/dist/diagram/engine/snake-rule-fit.d.ts +34 -0
- package/dist/diagram/engine/snake-rule-fit.d.ts.map +1 -0
- package/dist/diagram/engine/style-label.d.ts +24 -0
- package/dist/diagram/engine/style-label.d.ts.map +1 -0
- package/dist/diagram/engine/text-fit.d.ts +61 -0
- package/dist/diagram/engine/text-fit.d.ts.map +1 -0
- package/dist/diagram/engine/text-grow.d.ts +33 -0
- package/dist/diagram/engine/text-grow.d.ts.map +1 -0
- package/dist/diagram/engine/text-measure.d.ts +77 -0
- package/dist/diagram/engine/text-measure.d.ts.map +1 -0
- package/dist/diagram/hierarchy/index.d.ts +5 -0
- package/dist/diagram/hierarchy/index.d.ts.map +1 -0
- package/dist/diagram/hierarchy/smartart-hierarchy-axis-pitch.d.ts +65 -0
- package/dist/diagram/hierarchy/smartart-hierarchy-axis-pitch.d.ts.map +1 -0
- package/dist/diagram/hierarchy/smartart-hierarchy-axis-swap-orientation.d.ts +68 -0
- package/dist/diagram/hierarchy/smartart-hierarchy-axis-swap-orientation.d.ts.map +1 -0
- package/dist/diagram/hierarchy/smartart-hierarchy-branch-mode.d.ts +54 -0
- package/dist/diagram/hierarchy/smartart-hierarchy-branch-mode.d.ts.map +1 -0
- package/dist/diagram/hierarchy/smartart-hierarchy-cascade.d.ts +58 -0
- package/dist/diagram/hierarchy/smartart-hierarchy-cascade.d.ts.map +1 -0
- package/dist/diagram/hierarchy/smartart-hierarchy-centered-fan-axis.d.ts +63 -0
- package/dist/diagram/hierarchy/smartart-hierarchy-centered-fan-axis.d.ts.map +1 -0
- package/dist/diagram/hierarchy/smartart-hierarchy-child-order.d.ts +41 -0
- package/dist/diagram/hierarchy/smartart-hierarchy-child-order.d.ts.map +1 -0
- package/dist/diagram/hierarchy/smartart-hierarchy-composite-child.d.ts +129 -0
- package/dist/diagram/hierarchy/smartart-hierarchy-composite-child.d.ts.map +1 -0
- package/dist/diagram/hierarchy/smartart-hierarchy-constraint-lookup.d.ts +76 -0
- package/dist/diagram/hierarchy/smartart-hierarchy-constraint-lookup.d.ts.map +1 -0
- package/dist/diagram/hierarchy/smartart-hierarchy-corner-plan.d.ts +49 -0
- package/dist/diagram/hierarchy/smartart-hierarchy-corner-plan.d.ts.map +1 -0
- package/dist/diagram/hierarchy/smartart-hierarchy-dispatch-lindir.d.ts +58 -0
- package/dist/diagram/hierarchy/smartart-hierarchy-dispatch-lindir.d.ts.map +1 -0
- package/dist/diagram/hierarchy/smartart-hierarchy-fan-aware-width.d.ts +48 -0
- package/dist/diagram/hierarchy/smartart-hierarchy-fan-aware-width.d.ts.map +1 -0
- package/dist/diagram/hierarchy/smartart-hierarchy-fan.d.ts +97 -0
- package/dist/diagram/hierarchy/smartart-hierarchy-fan.d.ts.map +1 -0
- package/dist/diagram/hierarchy/smartart-hierarchy-fanned-hang-geometry.d.ts +42 -0
- package/dist/diagram/hierarchy/smartart-hierarchy-fanned-hang-geometry.d.ts.map +1 -0
- package/dist/diagram/hierarchy/smartart-hierarchy-fanned-hang.d.ts +74 -0
- package/dist/diagram/hierarchy/smartart-hierarchy-fanned-hang.d.ts.map +1 -0
- package/dist/diagram/hierarchy/smartart-hierarchy-fit-item-box.d.ts +111 -0
- package/dist/diagram/hierarchy/smartart-hierarchy-fit-item-box.d.ts.map +1 -0
- package/dist/diagram/hierarchy/smartart-hierarchy-fold-depth.d.ts +44 -0
- package/dist/diagram/hierarchy/smartart-hierarchy-fold-depth.d.ts.map +1 -0
- package/dist/diagram/hierarchy/smartart-hierarchy-generation-gap.d.ts +60 -0
- package/dist/diagram/hierarchy/smartart-hierarchy-generation-gap.d.ts.map +1 -0
- package/dist/diagram/hierarchy/smartart-hierarchy-generation-templates.d.ts +106 -0
- package/dist/diagram/hierarchy/smartart-hierarchy-generation-templates.d.ts.map +1 -0
- package/dist/diagram/hierarchy/smartart-hierarchy-hang-depth.d.ts +133 -0
- package/dist/diagram/hierarchy/smartart-hierarchy-hang-depth.d.ts.map +1 -0
- package/dist/diagram/hierarchy/smartart-hierarchy-hang-dispatch.d.ts +28 -0
- package/dist/diagram/hierarchy/smartart-hierarchy-hang-dispatch.d.ts.map +1 -0
- package/dist/diagram/hierarchy/smartart-hierarchy-hanging-arrange.d.ts +28 -0
- package/dist/diagram/hierarchy/smartart-hierarchy-hanging-arrange.d.ts.map +1 -0
- package/dist/diagram/hierarchy/smartart-hierarchy-hanging-box.d.ts +86 -0
- package/dist/diagram/hierarchy/smartart-hierarchy-hanging-box.d.ts.map +1 -0
- package/dist/diagram/hierarchy/smartart-hierarchy-hanging-fold.d.ts +36 -0
- package/dist/diagram/hierarchy/smartart-hierarchy-hanging-fold.d.ts.map +1 -0
- package/dist/diagram/hierarchy/smartart-hierarchy-hanging.d.ts +118 -0
- package/dist/diagram/hierarchy/smartart-hierarchy-hanging.d.ts.map +1 -0
- package/dist/diagram/hierarchy/smartart-hierarchy-item-template.d.ts +64 -0
- package/dist/diagram/hierarchy/smartart-hierarchy-item-template.d.ts.map +1 -0
- package/dist/diagram/hierarchy/smartart-hierarchy-orgchart-tree.d.ts +53 -0
- package/dist/diagram/hierarchy/smartart-hierarchy-orgchart-tree.d.ts.map +1 -0
- package/dist/diagram/hierarchy/smartart-hierarchy-orientation-resolve.d.ts +36 -0
- package/dist/diagram/hierarchy/smartart-hierarchy-orientation-resolve.d.ts.map +1 -0
- package/dist/diagram/hierarchy/smartart-hierarchy-orientation-types.d.ts +81 -0
- package/dist/diagram/hierarchy/smartart-hierarchy-orientation-types.d.ts.map +1 -0
- package/dist/diagram/hierarchy/smartart-hierarchy-orientation.d.ts +78 -0
- package/dist/diagram/hierarchy/smartart-hierarchy-orientation.d.ts.map +1 -0
- package/dist/diagram/hierarchy/smartart-hierarchy-pitch.d.ts +140 -0
- package/dist/diagram/hierarchy/smartart-hierarchy-pitch.d.ts.map +1 -0
- package/dist/diagram/hierarchy/smartart-hierarchy-shared.d.ts +131 -0
- package/dist/diagram/hierarchy/smartart-hierarchy-shared.d.ts.map +1 -0
- package/dist/diagram/hierarchy/smartart-hierarchy-standard-options.d.ts +91 -0
- package/dist/diagram/hierarchy/smartart-hierarchy-standard-options.d.ts.map +1 -0
- package/dist/diagram/hierarchy/smartart-hierarchy-standard-rows.d.ts +21 -0
- package/dist/diagram/hierarchy/smartart-hierarchy-standard-rows.d.ts.map +1 -0
- package/dist/diagram/hierarchy/smartart-hierarchy-standard.d.ts +36 -0
- package/dist/diagram/hierarchy/smartart-hierarchy-standard.d.ts.map +1 -0
- package/dist/diagram/hierarchy/smartart-hierarchy-tailed-placer.d.ts +20 -0
- package/dist/diagram/hierarchy/smartart-hierarchy-tailed-placer.d.ts.map +1 -0
- package/dist/diagram/hierarchy/smartart-hierarchy-tailed-transpose.d.ts +50 -0
- package/dist/diagram/hierarchy/smartart-hierarchy-tailed-transpose.d.ts.map +1 -0
- package/dist/diagram/hierarchy/smartart-hierarchy-transpose.d.ts +23 -0
- package/dist/diagram/hierarchy/smartart-hierarchy-transpose.d.ts.map +1 -0
- package/dist/diagram/hierarchy/smartart-hierarchy-transposed-orientation.d.ts +22 -0
- package/dist/diagram/hierarchy/smartart-hierarchy-transposed-orientation.d.ts.map +1 -0
- package/dist/diagram/hierarchy/smartart-hierarchy-wrapped-groups.d.ts +93 -0
- package/dist/diagram/hierarchy/smartart-hierarchy-wrapped-groups.d.ts.map +1 -0
- package/dist/diagram/hierarchy/smartart-layout-interpreter-hierarchy.d.ts +49 -0
- package/dist/diagram/hierarchy/smartart-layout-interpreter-hierarchy.d.ts.map +1 -0
- package/dist/diagram/index.cjs +22537 -80
- package/dist/diagram/index.d.ts +4 -0
- package/dist/diagram/index.d.ts.map +1 -1
- package/dist/diagram/index.mjs +22453 -81
- package/dist/diagram/layout/index.d.ts +38 -0
- package/dist/diagram/layout/index.d.ts.map +1 -0
- package/dist/diagram/layout/smartart-choose-xml.d.ts +32 -0
- package/dist/diagram/layout/smartart-choose-xml.d.ts.map +1 -0
- package/dist/diagram/layout/smartart-constraint-branch-index.d.ts +49 -0
- package/dist/diagram/layout/smartart-constraint-branch-index.d.ts.map +1 -0
- package/dist/diagram/layout/smartart-constraint-declared-by.d.ts +64 -0
- package/dist/diagram/layout/smartart-constraint-declared-by.d.ts.map +1 -0
- package/dist/diagram/layout/smartart-constraint-ratio-fallback.d.ts +18 -0
- package/dist/diagram/layout/smartart-constraint-ratio-fallback.d.ts.map +1 -0
- package/dist/diagram/layout/smartart-constraint-resolve.d.ts +24 -0
- package/dist/diagram/layout/smartart-constraint-resolve.d.ts.map +1 -0
- package/dist/diagram/layout/smartart-constraint-rules.d.ts +26 -0
- package/dist/diagram/layout/smartart-constraint-rules.d.ts.map +1 -0
- package/dist/diagram/layout/smartart-constraint-sibling-roles.d.ts +100 -0
- package/dist/diagram/layout/smartart-constraint-sibling-roles.d.ts.map +1 -0
- package/dist/diagram/layout/smartart-constraint-solver.d.ts +133 -0
- package/dist/diagram/layout/smartart-constraint-solver.d.ts.map +1 -0
- package/dist/diagram/layout/smartart-constraint-values.d.ts +5 -0
- package/dist/diagram/layout/smartart-constraint-values.d.ts.map +1 -0
- package/dist/diagram/layout/smartart-font-table.d.ts +14 -0
- package/dist/diagram/layout/smartart-font-table.d.ts.map +1 -0
- package/dist/diagram/layout/smartart-interpreter-fold-text.d.ts +75 -0
- package/dist/diagram/layout/smartart-interpreter-fold-text.d.ts.map +1 -0
- package/dist/diagram/layout/smartart-layout-control-flow.d.ts +25 -0
- package/dist/diagram/layout/smartart-layout-control-flow.d.ts.map +1 -0
- package/dist/diagram/layout/smartart-layout-interpreter-arranged-selection.d.ts +56 -0
- package/dist/diagram/layout/smartart-layout-interpreter-arranged-selection.d.ts.map +1 -0
- package/dist/diagram/layout/smartart-layout-interpreter-arrangement-kind.d.ts +37 -0
- package/dist/diagram/layout/smartart-layout-interpreter-arrangement-kind.d.ts.map +1 -0
- package/dist/diagram/layout/smartart-layout-interpreter-aux.d.ts +66 -0
- package/dist/diagram/layout/smartart-layout-interpreter-aux.d.ts.map +1 -0
- package/dist/diagram/layout/smartart-layout-interpreter-axis-count.d.ts +128 -0
- package/dist/diagram/layout/smartart-layout-interpreter-axis-count.d.ts.map +1 -0
- package/dist/diagram/layout/smartart-layout-interpreter-axis-depth.d.ts +73 -0
- package/dist/diagram/layout/smartart-layout-interpreter-axis-depth.d.ts.map +1 -0
- package/dist/diagram/layout/smartart-layout-interpreter-axis-hop.d.ts +48 -0
- package/dist/diagram/layout/smartart-layout-interpreter-axis-hop.d.ts.map +1 -0
- package/dist/diagram/layout/smartart-layout-interpreter-axis-range.d.ts +19 -0
- package/dist/diagram/layout/smartart-layout-interpreter-axis-range.d.ts.map +1 -0
- package/dist/diagram/layout/smartart-layout-interpreter-choose-algorithm.d.ts +60 -0
- package/dist/diagram/layout/smartart-layout-interpreter-choose-algorithm.d.ts.map +1 -0
- package/dist/diagram/layout/smartart-layout-interpreter-choose-branch.d.ts +36 -0
- package/dist/diagram/layout/smartart-layout-interpreter-choose-branch.d.ts.map +1 -0
- package/dist/diagram/layout/smartart-layout-interpreter-choose-composite.d.ts +42 -0
- package/dist/diagram/layout/smartart-layout-interpreter-choose-composite.d.ts.map +1 -0
- package/dist/diagram/layout/smartart-layout-interpreter-choose-depth.d.ts +102 -0
- package/dist/diagram/layout/smartart-layout-interpreter-choose-depth.d.ts.map +1 -0
- package/dist/diagram/layout/smartart-layout-interpreter-choose-resolve.d.ts +32 -0
- package/dist/diagram/layout/smartart-layout-interpreter-choose-resolve.d.ts.map +1 -0
- package/dist/diagram/layout/smartart-layout-interpreter-composite-alternative.d.ts +33 -0
- package/dist/diagram/layout/smartart-layout-interpreter-composite-alternative.d.ts.map +1 -0
- package/dist/diagram/layout/smartart-layout-interpreter-composite-anchor.d.ts +95 -0
- package/dist/diagram/layout/smartart-layout-interpreter-composite-anchor.d.ts.map +1 -0
- package/dist/diagram/layout/smartart-layout-interpreter-composite-aspect.d.ts +84 -0
- package/dist/diagram/layout/smartart-layout-interpreter-composite-aspect.d.ts.map +1 -0
- package/dist/diagram/layout/smartart-layout-interpreter-composite-candidates.d.ts +60 -0
- package/dist/diagram/layout/smartart-layout-interpreter-composite-candidates.d.ts.map +1 -0
- package/dist/diagram/layout/smartart-layout-interpreter-composite-children.d.ts +86 -0
- package/dist/diagram/layout/smartart-layout-interpreter-composite-children.d.ts.map +1 -0
- package/dist/diagram/layout/smartart-layout-interpreter-composite-choose-groups.d.ts +44 -0
- package/dist/diagram/layout/smartart-layout-interpreter-composite-choose-groups.d.ts.map +1 -0
- package/dist/diagram/layout/smartart-layout-interpreter-composite-choose.d.ts +109 -0
- package/dist/diagram/layout/smartart-layout-interpreter-composite-choose.d.ts.map +1 -0
- package/dist/diagram/layout/smartart-layout-interpreter-composite-detect.d.ts +182 -0
- package/dist/diagram/layout/smartart-layout-interpreter-composite-detect.d.ts.map +1 -0
- package/dist/diagram/layout/smartart-layout-interpreter-composite-fontfit.d.ts +60 -0
- package/dist/diagram/layout/smartart-layout-interpreter-composite-fontfit.d.ts.map +1 -0
- package/dist/diagram/layout/smartart-layout-interpreter-composite-foreach.d.ts +36 -0
- package/dist/diagram/layout/smartart-layout-interpreter-composite-foreach.d.ts.map +1 -0
- package/dist/diagram/layout/smartart-layout-interpreter-composite-group-slots.d.ts +92 -0
- package/dist/diagram/layout/smartart-layout-interpreter-composite-group-slots.d.ts.map +1 -0
- package/dist/diagram/layout/smartart-layout-interpreter-composite-iteration.d.ts +45 -0
- package/dist/diagram/layout/smartart-layout-interpreter-composite-iteration.d.ts.map +1 -0
- package/dist/diagram/layout/smartart-layout-interpreter-composite-nested-cycle.d.ts +57 -0
- package/dist/diagram/layout/smartart-layout-interpreter-composite-nested-cycle.d.ts.map +1 -0
- package/dist/diagram/layout/smartart-layout-interpreter-composite-order-fallback.d.ts +24 -0
- package/dist/diagram/layout/smartart-layout-interpreter-composite-order-fallback.d.ts.map +1 -0
- package/dist/diagram/layout/smartart-layout-interpreter-composite-order.d.ts +41 -0
- package/dist/diagram/layout/smartart-layout-interpreter-composite-order.d.ts.map +1 -0
- package/dist/diagram/layout/smartart-layout-interpreter-composite-pairs.d.ts +34 -0
- package/dist/diagram/layout/smartart-layout-interpreter-composite-pairs.d.ts.map +1 -0
- package/dist/diagram/layout/smartart-layout-interpreter-composite-render.d.ts +29 -0
- package/dist/diagram/layout/smartart-layout-interpreter-composite-render.d.ts.map +1 -0
- package/dist/diagram/layout/smartart-layout-interpreter-composite-ring.d.ts +40 -0
- package/dist/diagram/layout/smartart-layout-interpreter-composite-ring.d.ts.map +1 -0
- package/dist/diagram/layout/smartart-layout-interpreter-composite-slot-dim.d.ts +22 -0
- package/dist/diagram/layout/smartart-layout-interpreter-composite-slot-dim.d.ts.map +1 -0
- package/dist/diagram/layout/smartart-layout-interpreter-composite-slots.d.ts +69 -0
- package/dist/diagram/layout/smartart-layout-interpreter-composite-slots.d.ts.map +1 -0
- package/dist/diagram/layout/smartart-layout-interpreter-composite.d.ts +56 -0
- package/dist/diagram/layout/smartart-layout-interpreter-composite.d.ts.map +1 -0
- package/dist/diagram/layout/smartart-layout-interpreter-conn-path.d.ts +42 -0
- package/dist/diagram/layout/smartart-layout-interpreter-conn-path.d.ts.map +1 -0
- package/dist/diagram/layout/smartart-layout-interpreter-connector-order.d.ts +23 -0
- package/dist/diagram/layout/smartart-layout-interpreter-connector-order.d.ts.map +1 -0
- package/dist/diagram/layout/smartart-layout-interpreter-constraints.d.ts +28 -0
- package/dist/diagram/layout/smartart-layout-interpreter-constraints.d.ts.map +1 -0
- package/dist/diagram/layout/smartart-layout-interpreter-custom.d.ts +31 -0
- package/dist/diagram/layout/smartart-layout-interpreter-custom.d.ts.map +1 -0
- package/dist/diagram/layout/smartart-layout-interpreter-cycle-boxes.d.ts +36 -0
- package/dist/diagram/layout/smartart-layout-interpreter-cycle-boxes.d.ts.map +1 -0
- package/dist/diagram/layout/smartart-layout-interpreter-cycle-connectors.d.ts +21 -0
- package/dist/diagram/layout/smartart-layout-interpreter-cycle-connectors.d.ts.map +1 -0
- package/dist/diagram/layout/smartart-layout-interpreter-cycle-constraints.d.ts +116 -0
- package/dist/diagram/layout/smartart-layout-interpreter-cycle-constraints.d.ts.map +1 -0
- package/dist/diagram/layout/smartart-layout-interpreter-cycle-extension.d.ts +110 -0
- package/dist/diagram/layout/smartart-layout-interpreter-cycle-extension.d.ts.map +1 -0
- package/dist/diagram/layout/smartart-layout-interpreter-cycle-fontfit.d.ts +50 -0
- package/dist/diagram/layout/smartart-layout-interpreter-cycle-fontfit.d.ts.map +1 -0
- package/dist/diagram/layout/smartart-layout-interpreter-cycle-hub-detect.d.ts +66 -0
- package/dist/diagram/layout/smartart-layout-interpreter-cycle-hub-detect.d.ts.map +1 -0
- package/dist/diagram/layout/smartart-layout-interpreter-cycle-hub-ratio-usersize.d.ts +81 -0
- package/dist/diagram/layout/smartart-layout-interpreter-cycle-hub-ratio-usersize.d.ts.map +1 -0
- package/dist/diagram/layout/smartart-layout-interpreter-cycle-hub-ratio.d.ts +109 -0
- package/dist/diagram/layout/smartart-layout-interpreter-cycle-hub-ratio.d.ts.map +1 -0
- package/dist/diagram/layout/smartart-layout-interpreter-cycle-item-aspect.d.ts +121 -0
- package/dist/diagram/layout/smartart-layout-interpreter-cycle-item-aspect.d.ts.map +1 -0
- package/dist/diagram/layout/smartart-layout-interpreter-cycle-item-node.d.ts +57 -0
- package/dist/diagram/layout/smartart-layout-interpreter-cycle-item-node.d.ts.map +1 -0
- package/dist/diagram/layout/smartart-layout-interpreter-cycle-ring-bulge.d.ts +34 -0
- package/dist/diagram/layout/smartart-layout-interpreter-cycle-ring-bulge.d.ts.map +1 -0
- package/dist/diagram/layout/smartart-layout-interpreter-cycle-ring-item.d.ts +39 -0
- package/dist/diagram/layout/smartart-layout-interpreter-cycle-ring-item.d.ts.map +1 -0
- package/dist/diagram/layout/smartart-layout-interpreter-cycle-ring-nested-hub.d.ts +22 -0
- package/dist/diagram/layout/smartart-layout-interpreter-cycle-ring-nested-hub.d.ts.map +1 -0
- package/dist/diagram/layout/smartart-layout-interpreter-cycle-ring-offset.d.ts +43 -0
- package/dist/diagram/layout/smartart-layout-interpreter-cycle-ring-offset.d.ts.map +1 -0
- package/dist/diagram/layout/smartart-layout-interpreter-cycle-ring.d.ts +76 -0
- package/dist/diagram/layout/smartart-layout-interpreter-cycle-ring.d.ts.map +1 -0
- package/dist/diagram/layout/smartart-layout-interpreter-cycle-sibtrans.d.ts +40 -0
- package/dist/diagram/layout/smartart-layout-interpreter-cycle-sibtrans.d.ts.map +1 -0
- package/dist/diagram/layout/smartart-layout-interpreter-cycle.d.ts +69 -0
- package/dist/diagram/layout/smartart-layout-interpreter-cycle.d.ts.map +1 -0
- package/dist/diagram/layout/smartart-layout-interpreter-dispatch.d.ts +18 -0
- package/dist/diagram/layout/smartart-layout-interpreter-dispatch.d.ts.map +1 -0
- package/dist/diagram/layout/smartart-layout-interpreter-flow-direction.d.ts +29 -0
- package/dist/diagram/layout/smartart-layout-interpreter-flow-direction.d.ts.map +1 -0
- package/dist/diagram/layout/smartart-layout-interpreter-flow.d.ts +49 -0
- package/dist/diagram/layout/smartart-layout-interpreter-flow.d.ts.map +1 -0
- package/dist/diagram/layout/smartart-layout-interpreter-hierarchy-descendant.d.ts +60 -0
- package/dist/diagram/layout/smartart-layout-interpreter-hierarchy-descendant.d.ts.map +1 -0
- package/dist/diagram/layout/smartart-layout-interpreter-hierarchy-fontfit.d.ts +45 -0
- package/dist/diagram/layout/smartart-layout-interpreter-hierarchy-fontfit.d.ts.map +1 -0
- package/dist/diagram/layout/smartart-layout-interpreter-hub-detect.d.ts +26 -0
- package/dist/diagram/layout/smartart-layout-interpreter-hub-detect.d.ts.map +1 -0
- package/dist/diagram/layout/smartart-layout-interpreter-hub.d.ts +62 -0
- package/dist/diagram/layout/smartart-layout-interpreter-hub.d.ts.map +1 -0
- package/dist/diagram/layout/smartart-layout-interpreter-item-role-compound.d.ts +36 -0
- package/dist/diagram/layout/smartart-layout-interpreter-item-role-compound.d.ts.map +1 -0
- package/dist/diagram/layout/smartart-layout-interpreter-item-role-orientation.d.ts +80 -0
- package/dist/diagram/layout/smartart-layout-interpreter-item-role-orientation.d.ts.map +1 -0
- package/dist/diagram/layout/smartart-layout-interpreter-item-role-shared.d.ts +102 -0
- package/dist/diagram/layout/smartart-layout-interpreter-item-role-shared.d.ts.map +1 -0
- package/dist/diagram/layout/smartart-layout-interpreter-item-role-stack-columns.d.ts +23 -0
- package/dist/diagram/layout/smartart-layout-interpreter-item-role-stack-columns.d.ts.map +1 -0
- package/dist/diagram/layout/smartart-layout-interpreter-item-role-stack-fields.d.ts +77 -0
- package/dist/diagram/layout/smartart-layout-interpreter-item-role-stack-fields.d.ts.map +1 -0
- package/dist/diagram/layout/smartart-layout-interpreter-item-role-stack-rect.d.ts +20 -0
- package/dist/diagram/layout/smartart-layout-interpreter-item-role-stack-rect.d.ts.map +1 -0
- package/dist/diagram/layout/smartart-layout-interpreter-item-role-stack.d.ts +53 -0
- package/dist/diagram/layout/smartart-layout-interpreter-item-role-stack.d.ts.map +1 -0
- package/dist/diagram/layout/smartart-layout-interpreter-item-role-transition.d.ts +50 -0
- package/dist/diagram/layout/smartart-layout-interpreter-item-role-transition.d.ts.map +1 -0
- package/dist/diagram/layout/smartart-layout-interpreter-item-roles-recursive.d.ts +87 -0
- package/dist/diagram/layout/smartart-layout-interpreter-item-roles-recursive.d.ts.map +1 -0
- package/dist/diagram/layout/smartart-layout-interpreter-item-roles-unwrap.d.ts +57 -0
- package/dist/diagram/layout/smartart-layout-interpreter-item-roles-unwrap.d.ts.map +1 -0
- package/dist/diagram/layout/smartart-layout-interpreter-item-roles.d.ts +109 -0
- package/dist/diagram/layout/smartart-layout-interpreter-item-roles.d.ts.map +1 -0
- package/dist/diagram/layout/smartart-layout-interpreter-linear-content-size.d.ts +42 -0
- package/dist/diagram/layout/smartart-layout-interpreter-linear-content-size.d.ts.map +1 -0
- package/dist/diagram/layout/smartart-layout-interpreter-linear-item-aspect.d.ts +94 -0
- package/dist/diagram/layout/smartart-layout-interpreter-linear-item-aspect.d.ts.map +1 -0
- package/dist/diagram/layout/smartart-layout-interpreter-linear-main-axis.d.ts +17 -0
- package/dist/diagram/layout/smartart-layout-interpreter-linear-main-axis.d.ts.map +1 -0
- package/dist/diagram/layout/smartart-layout-interpreter-linear-shared.d.ts +21 -0
- package/dist/diagram/layout/smartart-layout-interpreter-linear-shared.d.ts.map +1 -0
- package/dist/diagram/layout/smartart-layout-interpreter-linear-table.d.ts +76 -0
- package/dist/diagram/layout/smartart-layout-interpreter-linear-table.d.ts.map +1 -0
- package/dist/diagram/layout/smartart-layout-interpreter-linear.d.ts +20 -0
- package/dist/diagram/layout/smartart-layout-interpreter-linear.d.ts.map +1 -0
- package/dist/diagram/layout/smartart-layout-interpreter-model.d.ts +77 -0
- package/dist/diagram/layout/smartart-layout-interpreter-model.d.ts.map +1 -0
- package/dist/diagram/layout/smartart-layout-interpreter-named-rules.d.ts +93 -0
- package/dist/diagram/layout/smartart-layout-interpreter-named-rules.d.ts.map +1 -0
- package/dist/diagram/layout/smartart-layout-interpreter-position-family.d.ts +58 -0
- package/dist/diagram/layout/smartart-layout-interpreter-position-family.d.ts.map +1 -0
- package/dist/diagram/layout/smartart-layout-interpreter-preset-node.d.ts +61 -0
- package/dist/diagram/layout/smartart-layout-interpreter-preset-node.d.ts.map +1 -0
- package/dist/diagram/layout/smartart-layout-interpreter-presof-choose.d.ts +29 -0
- package/dist/diagram/layout/smartart-layout-interpreter-presof-choose.d.ts.map +1 -0
- package/dist/diagram/layout/smartart-layout-interpreter-pyramid-bands.d.ts +41 -0
- package/dist/diagram/layout/smartart-layout-interpreter-pyramid-bands.d.ts.map +1 -0
- package/dist/diagram/layout/smartart-layout-interpreter-pyramid.d.ts +100 -0
- package/dist/diagram/layout/smartart-layout-interpreter-pyramid.d.ts.map +1 -0
- package/dist/diagram/layout/smartart-layout-interpreter-render.d.ts +86 -0
- package/dist/diagram/layout/smartart-layout-interpreter-render.d.ts.map +1 -0
- package/dist/diagram/layout/smartart-layout-interpreter-snake.d.ts +18 -0
- package/dist/diagram/layout/smartart-layout-interpreter-snake.d.ts.map +1 -0
- package/dist/diagram/layout/smartart-layout-interpreter-tree-location.d.ts +28 -0
- package/dist/diagram/layout/smartart-layout-interpreter-tree-location.d.ts.map +1 -0
- package/dist/diagram/layout/smartart-layout-interpreter-when-numeric.d.ts +15 -0
- package/dist/diagram/layout/smartart-layout-interpreter-when-numeric.d.ts.map +1 -0
- package/dist/diagram/layout/smartart-layout-interpreter-when-var.d.ts +12 -0
- package/dist/diagram/layout/smartart-layout-interpreter-when-var.d.ts.map +1 -0
- package/dist/diagram/layout/smartart-layout-interpreter-when.d.ts +69 -0
- package/dist/diagram/layout/smartart-layout-interpreter-when.d.ts.map +1 -0
- package/dist/diagram/layout/smartart-layout-interpreter.d.ts +80 -0
- package/dist/diagram/layout/smartart-layout-interpreter.d.ts.map +1 -0
- package/dist/diagram/layout/smartart-layout-item-font-role.d.ts +80 -0
- package/dist/diagram/layout/smartart-layout-item-font-role.d.ts.map +1 -0
- package/dist/diagram/layout/smartart-layout-item-font-size.d.ts +129 -0
- package/dist/diagram/layout/smartart-layout-item-font-size.d.ts.map +1 -0
- package/dist/diagram/layout/smartart-layout-item-font-tier-fit.d.ts +70 -0
- package/dist/diagram/layout/smartart-layout-item-font-tier-fit.d.ts.map +1 -0
- package/dist/diagram/layout/smartart-layout-item-font-tier.d.ts +139 -0
- package/dist/diagram/layout/smartart-layout-item-font-tier.d.ts.map +1 -0
- package/dist/diagram/layout/smartart-layout-item-tx-anchor.d.ts +105 -0
- package/dist/diagram/layout/smartart-layout-item-tx-anchor.d.ts.map +1 -0
- package/dist/diagram/layout/smartart-layout-shape-polygon.d.ts +17 -0
- package/dist/diagram/layout/smartart-layout-shape-polygon.d.ts.map +1 -0
- package/dist/diagram/layout/smartart-layout-shape-preset.d.ts +127 -0
- package/dist/diagram/layout/smartart-layout-shape-preset.d.ts.map +1 -0
- package/dist/diagram/layout/smartart-layout-snake-grid.d.ts +43 -0
- package/dist/diagram/layout/smartart-layout-snake-grid.d.ts.map +1 -0
- package/dist/diagram/layout/smartart-layout-style-helpers.d.ts +84 -0
- package/dist/diagram/layout/smartart-layout-style-helpers.d.ts.map +1 -0
- package/dist/diagram/layout/smartart-layout-types.d.ts +253 -0
- package/dist/diagram/layout/smartart-layout-types.d.ts.map +1 -0
- package/dist/diagram/layout/smartart-line-pitch.d.ts +29 -0
- package/dist/diagram/layout/smartart-line-pitch.d.ts.map +1 -0
- package/dist/diagram/layout/smartart-node-role-colors.d.ts +30 -0
- package/dist/diagram/layout/smartart-node-role-colors.d.ts.map +1 -0
- package/dist/diagram/layout/smartart-node-tree-axis.d.ts +91 -0
- package/dist/diagram/layout/smartart-node-tree-axis.d.ts.map +1 -0
- package/dist/diagram/layout/smartart-text-wrap-fit.d.ts +84 -0
- package/dist/diagram/layout/smartart-text-wrap-fit.d.ts.map +1 -0
- package/dist/diagram/layout/smartart-tree.d.ts +33 -0
- package/dist/diagram/layout/smartart-tree.d.ts.map +1 -0
- package/dist/diagram/model/constraint-rules.d.ts +31 -0
- package/dist/diagram/model/constraint-rules.d.ts.map +1 -0
- package/dist/diagram/model/data.d.ts +109 -0
- package/dist/diagram/model/data.d.ts.map +1 -0
- package/dist/diagram/model/index.d.ts +7 -0
- package/dist/diagram/model/index.d.ts.map +1 -0
- package/dist/diagram/model/layout-definition.d.ts +276 -0
- package/dist/diagram/model/layout-definition.d.ts.map +1 -0
- package/dist/diagram/model/layout-primitives.d.ts +82 -0
- package/dist/diagram/model/layout-primitives.d.ts.map +1 -0
- package/dist/diagram/model/node.d.ts +194 -0
- package/dist/diagram/model/node.d.ts.map +1 -0
- package/dist/diagram/model/style-definition.d.ts +131 -0
- package/dist/diagram/model/style-definition.d.ts.map +1 -0
- package/dist/docx/chart-paint.d.ts +14 -0
- package/dist/docx/chart-paint.d.ts.map +1 -0
- package/dist/docx/chart.d.ts +43 -0
- package/dist/docx/chart.d.ts.map +1 -0
- package/dist/docx/drawing.d.ts.map +1 -1
- package/dist/docx/embedded.cjs +1393 -326
- package/dist/docx/embedded.mjs +1393 -326
- package/dist/docx/index.cjs +4044 -683
- package/dist/docx/index.d.ts +2 -0
- package/dist/docx/index.d.ts.map +1 -1
- package/dist/docx/index.mjs +4040 -684
- package/dist/docx/inline-model.d.ts +3 -0
- package/dist/docx/inline-model.d.ts.map +1 -1
- package/dist/docx/layout/adapter.d.ts.map +1 -1
- package/dist/docx/layout/index.cjs +2674 -88
- package/dist/docx/layout/index.mjs +2675 -89
- package/dist/docx/layout/input.d.ts +5 -0
- package/dist/docx/layout/input.d.ts.map +1 -1
- package/dist/docx/load/index.cjs +1616 -549
- package/dist/docx/load/index.mjs +1616 -549
- package/dist/docx/parse.d.ts.map +1 -1
- package/dist/docx/ui/chart-spec.d.ts +10 -0
- package/dist/docx/ui/chart-spec.d.ts.map +1 -0
- package/dist/docx/ui/index.cjs +2602 -186
- 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 +2601 -188
- package/dist/docx/ui/inline-content-schema.d.ts.map +1 -1
- package/dist/docx/ui/run-adapter.d.ts.map +1 -1
- package/dist/drawingml/write-line.d.ts +7 -0
- package/dist/drawingml/write-line.d.ts.map +1 -0
- package/dist/geometry/ooxml-arc.d.ts +31 -0
- package/dist/geometry/ooxml-arc.d.ts.map +1 -0
- package/dist/geometry/preset-shape-evaluator.d.ts +73 -0
- package/dist/geometry/preset-shape-evaluator.d.ts.map +1 -0
- package/dist/index.cjs +34839 -18368
- package/dist/index.mjs +34835 -18368
- package/dist/opc/embedded-packages.d.ts +11 -0
- package/dist/opc/embedded-packages.d.ts.map +1 -0
- package/dist/opc/index.cjs +365 -70
- package/dist/opc/index.d.ts +1 -0
- package/dist/opc/index.d.ts.map +1 -1
- package/dist/opc/index.mjs +353 -71
- package/dist/opc/properties/app.d.ts +9 -3
- package/dist/opc/properties/app.d.ts.map +1 -1
- package/dist/opc/properties/core.d.ts +5 -1
- package/dist/opc/properties/core.d.ts.map +1 -1
- package/dist/opc/properties/custom.d.ts +19 -0
- package/dist/opc/properties/custom.d.ts.map +1 -1
- package/dist/opc/properties/index.d.ts +6 -3
- package/dist/opc/properties/index.d.ts.map +1 -1
- package/dist/opc/properties/patch.d.ts +38 -0
- package/dist/opc/properties/patch.d.ts.map +1 -0
- package/dist/opc/properties/title-groups.d.ts +30 -0
- package/dist/opc/properties/title-groups.d.ts.map +1 -0
- package/dist/opc/properties/types.d.ts +15 -0
- package/dist/opc/properties/types.d.ts.map +1 -1
- package/dist/pptx/automation/index.cjs +9049 -7167
- package/dist/pptx/automation/index.d.ts +4 -4
- package/dist/pptx/automation/index.mjs +6 -6
- package/dist/pptx/chunks/{index-BYkdcS8J.d.ts → index-EZJZ7USt.d.ts} +907 -962
- package/dist/pptx/chunks/index-EZJZ7USt.d.ts.map +1 -0
- package/dist/pptx/chunks/{index-BHqL5KXH.d.ts → index-JNv7AJx5.d.ts} +163 -210
- package/dist/pptx/chunks/index-JNv7AJx5.d.ts.map +1 -0
- package/dist/pptx/chunks/{smart-art-CO2jmJFf.d.ts → smart-art-Q2kZQtHh.d.ts} +436 -374
- package/dist/pptx/chunks/smart-art-Q2kZQtHh.d.ts.map +1 -0
- package/dist/pptx/chunks/{text-operations-DEJ7alZR.d.ts → text-operations-DtCxXrMh.d.ts} +55 -4
- package/dist/pptx/chunks/text-operations-DtCxXrMh.d.ts.map +1 -0
- package/dist/pptx/cli/index.cjs +8728 -6846
- package/dist/pptx/cli/index.d.ts +1 -1
- package/dist/pptx/cli/index.mjs +5 -5
- package/dist/pptx/converter/index.cjs +7124 -7136
- package/dist/pptx/converter/index.d.ts +1 -1
- package/dist/pptx/converter/index.mjs +3 -3
- package/dist/pptx/editor/render/table-cell-edit.cjs +7 -3
- package/dist/pptx/editor/render/table-cell-edit.d.ts +16 -1
- package/dist/pptx/editor/render/table-cell-edit.d.ts.map +1 -1
- package/dist/pptx/editor/render/table-cell-edit.mjs +1 -1
- package/dist/pptx/editor/render/table-cell-merge.cjs +3 -3
- package/dist/pptx/editor/render/table-cell-merge.mjs +1 -1
- package/dist/pptx/editor/render/table-data-grid-ops.cjs +7 -7
- package/dist/pptx/editor/render/table-data-grid-ops.mjs +2 -2
- package/dist/pptx/editor/render/table-layout.cjs +6 -6
- package/dist/pptx/editor/render/table-layout.d.ts.map +1 -1
- package/dist/pptx/editor/render/table-layout.mjs +1 -1
- package/dist/pptx/editor/render/table-merge.cjs +5 -5
- package/dist/pptx/editor/render/table-merge.mjs +1 -1
- package/dist/pptx/index.cjs +9300 -7249
- package/dist/pptx/index.d.ts +5 -5
- package/dist/pptx/index.mjs +6 -6
- package/dist/pptx/smartart-layouts/index.cjs +135 -106
- package/dist/pptx/smartart-layouts/index.d.ts +1 -1
- package/dist/pptx/smartart-layouts/index.mjs +1 -1
- package/dist/teams/content.d.ts.map +1 -1
- package/dist/teams/index.cjs +3931 -2077
- package/dist/teams/index.d.ts +1 -0
- package/dist/teams/index.d.ts.map +1 -1
- package/dist/teams/index.mjs +3930 -2077
- package/dist/teams/server-file-storage.d.ts +11 -0
- package/dist/teams/server-file-storage.d.ts.map +1 -0
- package/dist/teams/store.d.ts +2 -0
- package/dist/teams/store.d.ts.map +1 -1
- package/dist/teams/stored-file.d.ts.map +1 -1
- package/dist/{xlsx/layout/font-family.d.ts → text/css-font-family.d.ts} +1 -1
- package/dist/text/css-font-family.d.ts.map +1 -0
- package/dist/text/font-metrics/font-advance-widths-aptos-display.generated.d.ts +10 -0
- package/dist/text/font-metrics/font-advance-widths-aptos-display.generated.d.ts.map +1 -0
- package/dist/text/font-metrics/font-advance-widths-aptos.generated.d.ts +10 -0
- package/dist/text/font-metrics/font-advance-widths-aptos.generated.d.ts.map +1 -0
- package/dist/text/font-metrics/font-advance-widths-arial.generated.d.ts +10 -0
- package/dist/text/font-metrics/font-advance-widths-arial.generated.d.ts.map +1 -0
- package/dist/text/font-metrics/font-advance-widths-calibri-light.generated.d.ts +10 -0
- package/dist/text/font-metrics/font-advance-widths-calibri-light.generated.d.ts.map +1 -0
- package/dist/text/font-metrics/font-advance-widths-calibri.generated.d.ts +10 -0
- package/dist/text/font-metrics/font-advance-widths-calibri.generated.d.ts.map +1 -0
- package/dist/text/font-metrics/font-advance-widths-segoe-ui.generated.d.ts +10 -0
- package/dist/text/font-metrics/font-advance-widths-segoe-ui.generated.d.ts.map +1 -0
- package/dist/text/font-metrics/font-advance-widths-times-new-roman.generated.d.ts +10 -0
- package/dist/text/font-metrics/font-advance-widths-times-new-roman.generated.d.ts.map +1 -0
- package/dist/text/font-metrics/font-advance-widths.generated.d.ts +48 -0
- package/dist/text/font-metrics/font-advance-widths.generated.d.ts.map +1 -0
- package/dist/text/font-metrics/font-kerning.d.ts +19 -0
- package/dist/text/font-metrics/font-kerning.d.ts.map +1 -0
- package/dist/visio/index.cjs +645 -119
- package/dist/visio/index.mjs +645 -119
- package/dist/visio/theme-color.d.ts +13 -3
- package/dist/visio/theme-color.d.ts.map +1 -1
- package/dist/visio/theme-resolve.d.ts +2 -1
- package/dist/visio/theme-resolve.d.ts.map +1 -1
- package/dist/visio/theme.d.ts +5 -2
- package/dist/visio/theme.d.ts.map +1 -1
- package/dist/xlsx/collab/adapter.d.ts +18 -0
- package/dist/xlsx/collab/adapter.d.ts.map +1 -0
- package/dist/xlsx/collab/apply.d.ts +8 -0
- package/dist/xlsx/collab/apply.d.ts.map +1 -0
- package/dist/xlsx/collab/bind.d.ts +34 -0
- package/dist/xlsx/collab/bind.d.ts.map +1 -0
- package/dist/xlsx/collab/codec.d.ts +35 -0
- package/dist/xlsx/collab/codec.d.ts.map +1 -0
- package/dist/xlsx/collab/dirty.d.ts +23 -0
- package/dist/xlsx/collab/dirty.d.ts.map +1 -0
- package/dist/xlsx/collab/index.cjs +1245 -0
- package/dist/xlsx/collab/index.d.ts +10 -0
- package/dist/xlsx/collab/index.d.ts.map +1 -0
- package/dist/xlsx/collab/index.mjs +1207 -0
- package/dist/xlsx/collab/lines.d.ts +22 -0
- package/dist/xlsx/collab/lines.d.ts.map +1 -0
- package/dist/xlsx/collab/names.d.ts +16 -0
- package/dist/xlsx/collab/names.d.ts.map +1 -0
- package/dist/xlsx/collab/presence.d.ts +31 -0
- package/dist/xlsx/collab/presence.d.ts.map +1 -0
- package/dist/xlsx/collab/schema.d.ts +30 -0
- package/dist/xlsx/collab/schema.d.ts.map +1 -0
- package/dist/xlsx/collab/sheets.d.ts +34 -0
- package/dist/xlsx/collab/sheets.d.ts.map +1 -0
- package/dist/xlsx/collab/styles.d.ts +26 -0
- package/dist/xlsx/collab/styles.d.ts.map +1 -0
- package/dist/xlsx/collab/write.d.ts +14 -0
- package/dist/xlsx/collab/write.d.ts.map +1 -0
- package/dist/xlsx/edit/chart-colors.d.ts +2 -2
- package/dist/xlsx/edit/chart-colors.d.ts.map +1 -1
- package/dist/xlsx/edit/chart-element-fill.d.ts +3 -3
- package/dist/xlsx/edit/chart-element-fill.d.ts.map +1 -1
- package/dist/xlsx/edit/chart-series-fill.d.ts +2 -2
- package/dist/xlsx/edit/chart-series-fill.d.ts.map +1 -1
- package/dist/xlsx/edit/chart-series-gradient.d.ts +3 -3
- package/dist/xlsx/edit/chart-series-gradient.d.ts.map +1 -1
- package/dist/xlsx/edit/chart-series-target.d.ts +15 -0
- package/dist/xlsx/edit/chart-series-target.d.ts.map +1 -0
- package/dist/xlsx/edit/chart-series-transparency.d.ts +2 -2
- package/dist/xlsx/edit/chart-series-transparency.d.ts.map +1 -1
- package/dist/xlsx/edit/context.d.ts +3 -1
- package/dist/xlsx/edit/context.d.ts.map +1 -1
- package/dist/xlsx/edit/external.d.ts +28 -0
- package/dist/xlsx/edit/external.d.ts.map +1 -0
- package/dist/xlsx/edit/history.d.ts +18 -0
- package/dist/xlsx/edit/history.d.ts.map +1 -1
- package/dist/xlsx/edit/index.d.ts +1 -0
- package/dist/xlsx/edit/index.d.ts.map +1 -1
- package/dist/xlsx/edit/session-calc.d.ts +32 -3
- package/dist/xlsx/edit/session-calc.d.ts.map +1 -1
- package/dist/xlsx/edit/session.d.ts.map +1 -1
- package/dist/xlsx/edit/sheets.d.ts.map +1 -1
- package/dist/xlsx/edit/types.d.ts +37 -4
- package/dist/xlsx/edit/types.d.ts.map +1 -1
- package/dist/xlsx/formula/engine-core.d.ts.map +1 -1
- package/dist/xlsx/formula/engine-host.d.ts +6 -2
- package/dist/xlsx/formula/engine-host.d.ts.map +1 -1
- package/dist/xlsx/formula/engine-prepare.d.ts +33 -0
- package/dist/xlsx/formula/engine-prepare.d.ts.map +1 -0
- package/dist/xlsx/formula/engine-structure.d.ts +40 -0
- package/dist/xlsx/formula/engine-structure.d.ts.map +1 -0
- package/dist/xlsx/formula/engine-types.d.ts +26 -0
- package/dist/xlsx/formula/engine-types.d.ts.map +1 -1
- package/dist/xlsx/formula/engine.d.ts.map +1 -1
- package/dist/xlsx/formula/formula-shape.d.ts +28 -0
- package/dist/xlsx/formula/formula-shape.d.ts.map +1 -0
- package/dist/xlsx/formula/graph-index.d.ts +3 -1
- package/dist/xlsx/formula/graph-index.d.ts.map +1 -1
- package/dist/xlsx/formula/graph.d.ts +5 -0
- package/dist/xlsx/formula/graph.d.ts.map +1 -1
- package/dist/xlsx/formula/lexemes.d.ts +6 -0
- package/dist/xlsx/formula/lexemes.d.ts.map +1 -1
- package/dist/xlsx/formula/parse-cache.d.ts +9 -0
- package/dist/xlsx/formula/parse-cache.d.ts.map +1 -0
- package/dist/xlsx/formula/parser.d.ts +3 -0
- package/dist/xlsx/formula/parser.d.ts.map +1 -1
- package/dist/xlsx/formula/ref-text.d.ts +14 -0
- package/dist/xlsx/formula/ref-text.d.ts.map +1 -0
- package/dist/xlsx/formula/references.d.ts.map +1 -1
- package/dist/xlsx/formula/shift-formula.d.ts +19 -0
- package/dist/xlsx/formula/shift-formula.d.ts.map +1 -0
- package/dist/xlsx/formula/shift-graph.d.ts +42 -0
- package/dist/xlsx/formula/shift-graph.d.ts.map +1 -0
- package/dist/xlsx/formula/tokenizer.d.ts.map +1 -1
- package/dist/xlsx/formula/transform.d.ts +2 -23
- package/dist/xlsx/formula/transform.d.ts.map +1 -1
- package/dist/xlsx/index.cjs +5620 -2680
- package/dist/xlsx/index.mjs +5609 -2681
- package/dist/xlsx/layout/cell-view.d.ts.map +1 -1
- package/dist/xlsx/layout/chart-view.d.ts +3 -54
- package/dist/xlsx/layout/chart-view.d.ts.map +1 -1
- package/dist/xlsx/layout/colors.d.ts +1 -4
- package/dist/xlsx/layout/colors.d.ts.map +1 -1
- package/dist/xlsx/layout/index.d.ts +8 -5
- package/dist/xlsx/layout/index.d.ts.map +1 -1
- package/dist/xlsx/layout/remote-selections.d.ts +40 -0
- package/dist/xlsx/layout/remote-selections.d.ts.map +1 -0
- package/dist/xlsx/layout/sheet-queries.d.ts +7 -0
- package/dist/xlsx/layout/sheet-queries.d.ts.map +1 -1
- package/dist/xlsx/layout/sparkline-data.d.ts +19 -0
- package/dist/xlsx/layout/sparkline-data.d.ts.map +1 -0
- package/dist/xlsx/layout/sparkline-view.d.ts +52 -0
- package/dist/xlsx/layout/sparkline-view.d.ts.map +1 -0
- package/dist/xlsx/layout/tint.d.ts +3 -12
- package/dist/xlsx/layout/tint.d.ts.map +1 -1
- package/dist/xlsx/layout/types.d.ts +3 -0
- package/dist/xlsx/layout/types.d.ts.map +1 -1
- package/dist/xlsx/load/index.cjs +3124 -1312
- package/dist/xlsx/load/index.mjs +3124 -1312
- package/dist/xlsx/model-sparklines.d.ts +52 -0
- package/dist/xlsx/model-sparklines.d.ts.map +1 -0
- package/dist/xlsx/model.d.ts +10 -47
- package/dist/xlsx/model.d.ts.map +1 -1
- package/dist/xlsx/read/chart.d.ts +1 -4
- package/dist/xlsx/read/chart.d.ts.map +1 -1
- package/dist/xlsx/read/index.d.ts +1 -0
- package/dist/xlsx/read/index.d.ts.map +1 -1
- package/dist/xlsx/read/sheet-data-source.d.ts +10 -0
- package/dist/xlsx/read/sheet-data-source.d.ts.map +1 -0
- package/dist/xlsx/read/sparklines.d.ts +12 -0
- package/dist/xlsx/read/sparklines.d.ts.map +1 -0
- package/dist/xlsx/read/worksheet.d.ts.map +1 -1
- package/dist/xlsx/ui/commands/i18n/navigation.d.ts.map +1 -1
- package/dist/xlsx/ui/context.d.ts +15 -1
- package/dist/xlsx/ui/context.d.ts.map +1 -1
- package/dist/xlsx/ui/grid/cell-items.d.ts.map +1 -1
- package/dist/xlsx/ui/grid/cell-paint.d.ts +1 -1
- package/dist/xlsx/ui/grid/cell-paint.d.ts.map +1 -1
- package/dist/xlsx/ui/grid/view-cache.d.ts.map +1 -1
- package/dist/xlsx/ui/index.cjs +2165 -866
- package/dist/xlsx/ui/index.mjs +2165 -867
- package/dist/xlsx/ui/locales/de/collab.d.ts +2 -0
- package/dist/xlsx/ui/locales/de/collab.d.ts.map +1 -0
- package/dist/xlsx/ui/locales/de/index.d.ts.map +1 -1
- package/dist/xlsx/ui/locales/en/collab.d.ts +2 -0
- package/dist/xlsx/ui/locales/en/collab.d.ts.map +1 -0
- package/dist/xlsx/ui/locales/en/index.d.ts.map +1 -1
- package/dist/xlsx/ui/locales/es/collab.d.ts +2 -0
- package/dist/xlsx/ui/locales/es/collab.d.ts.map +1 -0
- package/dist/xlsx/ui/locales/es/index.d.ts.map +1 -1
- package/dist/xlsx/ui/locales/fr/collab.d.ts +2 -0
- package/dist/xlsx/ui/locales/fr/collab.d.ts.map +1 -0
- package/dist/xlsx/ui/locales/fr/index.d.ts.map +1 -1
- package/dist/xlsx/ui/locales/zh-CN/collab.d.ts +2 -0
- package/dist/xlsx/ui/locales/zh-CN/collab.d.ts.map +1 -0
- package/dist/xlsx/ui/locales/zh-CN/index.d.ts.map +1 -1
- package/dist/xlsx/ui/ribbon/icon-paths.d.ts.map +1 -1
- package/dist/xlsx/write/chart-colors.d.ts +3 -0
- package/dist/xlsx/write/chart-colors.d.ts.map +1 -1
- package/dist/xlsx/write/chart-space.d.ts +5 -0
- package/dist/xlsx/write/chart-space.d.ts.map +1 -0
- package/dist/xlsx/write/chart-title.d.ts +4 -1
- package/dist/xlsx/write/chart-title.d.ts.map +1 -1
- package/dist/xlsx/write/chart.d.ts +4 -1
- package/dist/xlsx/write/chart.d.ts.map +1 -1
- package/dist/xml/index.cjs +162 -0
- package/dist/xml/index.d.ts +1 -0
- package/dist/xml/index.d.ts.map +1 -1
- package/dist/xml/index.mjs +161 -1
- package/dist/xml/lite.d.ts +30 -0
- package/dist/xml/lite.d.ts.map +1 -0
- package/package.json +6 -1
- package/dist/pptx/chunks/index-BHqL5KXH.d.ts.map +0 -1
- package/dist/pptx/chunks/index-BYkdcS8J.d.ts.map +0 -1
- package/dist/pptx/chunks/smart-art-CO2jmJFf.d.ts.map +0 -1
- package/dist/pptx/chunks/text-operations-DEJ7alZR.d.ts.map +0 -1
- package/dist/xlsx/layout/chart-appearance.d.ts.map +0 -1
- package/dist/xlsx/layout/chart-colors.d.ts +0 -9
- package/dist/xlsx/layout/chart-colors.d.ts.map +0 -1
- package/dist/xlsx/layout/chart-scale.d.ts.map +0 -1
- package/dist/xlsx/layout/chart-spacing.d.ts +0 -6
- package/dist/xlsx/layout/chart-spacing.d.ts.map +0 -1
- package/dist/xlsx/layout/chart-svg-appearance.d.ts.map +0 -1
- package/dist/xlsx/layout/chart-svg-bars.d.ts.map +0 -1
- package/dist/xlsx/layout/chart-svg-cartesian.d.ts.map +0 -1
- package/dist/xlsx/layout/chart-svg-legend.d.ts.map +0 -1
- package/dist/xlsx/layout/chart-svg-radial.d.ts.map +0 -1
- package/dist/xlsx/layout/chart-svg-text-metrics.d.ts.map +0 -1
- package/dist/xlsx/layout/chart-svg-title-text.d.ts.map +0 -1
- package/dist/xlsx/layout/chart-svg-util.d.ts.map +0 -1
- package/dist/xlsx/layout/chart-svg.d.ts.map +0 -1
- package/dist/xlsx/layout/chart-title-text.d.ts +0 -14
- package/dist/xlsx/layout/chart-title-text.d.ts.map +0 -1
- package/dist/xlsx/layout/font-family.d.ts.map +0 -1
- /package/dist/{xlsx/layout → chart/render}/chart-scale.d.ts +0 -0
- /package/dist/{xlsx/layout → chart/render}/chart-svg-bars.d.ts +0 -0
- /package/dist/{xlsx/layout → chart/render}/chart-svg-cartesian.d.ts +0 -0
- /package/dist/{xlsx/layout → chart/render}/chart-svg-legend.d.ts +0 -0
- /package/dist/{xlsx/layout → chart/render}/chart-svg-radial.d.ts +0 -0
- /package/dist/{xlsx/layout → chart/render}/chart-svg-text-metrics.d.ts +0 -0
- /package/dist/{xlsx/layout → chart/render}/chart-svg-title-text.d.ts +0 -0
- /package/dist/{xlsx/layout → chart/render}/chart-svg-util.d.ts +0 -0
- /package/dist/{xlsx/layout → chart/render}/chart-svg.d.ts +0 -0
package/dist/xlsx/ui/index.mjs
CHANGED
|
@@ -103,31 +103,31 @@ function quoteSheetName(name) {
|
|
|
103
103
|
}
|
|
104
104
|
|
|
105
105
|
// xlsx/address-r1c1.ts
|
|
106
|
-
var dimension = (
|
|
107
|
-
if (!
|
|
108
|
-
if (
|
|
109
|
-
const offset2 = Number(
|
|
106
|
+
var dimension = (text2, base, size) => {
|
|
107
|
+
if (!text2) return base;
|
|
108
|
+
if (text2.startsWith("[")) {
|
|
109
|
+
const offset2 = Number(text2.slice(1, -1));
|
|
110
110
|
if (Math.abs(offset2) >= size) return void 0;
|
|
111
111
|
return ((base + offset2) % size + size) % size;
|
|
112
112
|
}
|
|
113
|
-
const at = Number(
|
|
113
|
+
const at = Number(text2) - 1;
|
|
114
114
|
return at >= 0 && at < size ? at : void 0;
|
|
115
115
|
};
|
|
116
|
-
function corner(
|
|
117
|
-
const cell = /^R(\[[+-]?\d+\]|\d+)?C(\[[+-]?\d+\]|\d+)?$/i.exec(
|
|
116
|
+
function corner(text2, base) {
|
|
117
|
+
const cell = /^R(\[[+-]?\d+\]|\d+)?C(\[[+-]?\d+\]|\d+)?$/i.exec(text2);
|
|
118
118
|
if (cell) {
|
|
119
119
|
const row2 = dimension(cell[1], base.row, MAX_ROW + 1);
|
|
120
120
|
const col = dimension(cell[2], base.col, MAX_COL + 1);
|
|
121
121
|
if (row2 === void 0 || col === void 0) return void 0;
|
|
122
122
|
return { kind: "cell", range: { start: { row: row2, col }, end: { row: row2, col } } };
|
|
123
123
|
}
|
|
124
|
-
const rowMatch = /^R(\[[+-]?\d+\]|\d+)?$/i.exec(
|
|
124
|
+
const rowMatch = /^R(\[[+-]?\d+\]|\d+)?$/i.exec(text2);
|
|
125
125
|
if (rowMatch) {
|
|
126
126
|
const row2 = dimension(rowMatch[1], base.row, MAX_ROW + 1);
|
|
127
127
|
if (row2 === void 0) return void 0;
|
|
128
128
|
return { kind: "row", range: { start: { row: row2, col: 0 }, end: { row: row2, col: MAX_COL } } };
|
|
129
129
|
}
|
|
130
|
-
const colMatch = /^C(\[[+-]?\d+\]|\d+)?$/i.exec(
|
|
130
|
+
const colMatch = /^C(\[[+-]?\d+\]|\d+)?$/i.exec(text2);
|
|
131
131
|
if (colMatch) {
|
|
132
132
|
const col = dimension(colMatch[1], base.col, MAX_COL + 1);
|
|
133
133
|
if (col === void 0) return void 0;
|
|
@@ -135,10 +135,10 @@ function corner(text, base) {
|
|
|
135
135
|
}
|
|
136
136
|
return void 0;
|
|
137
137
|
}
|
|
138
|
-
function parseR1C1Range(
|
|
138
|
+
function parseR1C1Range(text2, base) {
|
|
139
139
|
if (!Number.isInteger(base.row) || !Number.isInteger(base.col) || base.row < 0 || base.row > MAX_ROW || base.col < 0 || base.col > MAX_COL)
|
|
140
140
|
return void 0;
|
|
141
|
-
const parts =
|
|
141
|
+
const parts = text2.trim().split(":");
|
|
142
142
|
if (parts.length > 2) return void 0;
|
|
143
143
|
const a = corner(parts[0] ?? "", base);
|
|
144
144
|
const b = parts.length === 1 ? a : corner(parts[1] ?? "", base);
|
|
@@ -323,27 +323,27 @@ function styleAt(workbook, styleId) {
|
|
|
323
323
|
}
|
|
324
324
|
function internStyle(workbook, style2) {
|
|
325
325
|
const key = styleKey(style2);
|
|
326
|
-
const
|
|
327
|
-
const known =
|
|
326
|
+
const cache3 = styleCache(workbook);
|
|
327
|
+
const known = cache3.get(key);
|
|
328
328
|
if (known !== void 0 && workbook.styles[known] && styleKey(workbook.styles[known]) === key)
|
|
329
329
|
return known;
|
|
330
330
|
const index2 = workbook.styles.findIndex((candidate) => styleKey(candidate) === key);
|
|
331
331
|
if (index2 >= 0) {
|
|
332
|
-
|
|
332
|
+
cache3.set(key, index2);
|
|
333
333
|
return index2;
|
|
334
334
|
}
|
|
335
335
|
workbook.styles.push(style2);
|
|
336
|
-
|
|
336
|
+
cache3.set(key, workbook.styles.length - 1);
|
|
337
337
|
return workbook.styles.length - 1;
|
|
338
338
|
}
|
|
339
339
|
var caches = /* @__PURE__ */ new WeakMap();
|
|
340
340
|
function styleCache(workbook) {
|
|
341
|
-
let
|
|
342
|
-
if (!
|
|
343
|
-
|
|
344
|
-
caches.set(workbook,
|
|
341
|
+
let cache3 = caches.get(workbook);
|
|
342
|
+
if (!cache3) {
|
|
343
|
+
cache3 = /* @__PURE__ */ new Map();
|
|
344
|
+
caches.set(workbook, cache3);
|
|
345
345
|
}
|
|
346
|
-
return
|
|
346
|
+
return cache3;
|
|
347
347
|
}
|
|
348
348
|
function compact(value2) {
|
|
349
349
|
const out = {};
|
|
@@ -669,15 +669,15 @@ function isElapsedOnly(tokens) {
|
|
|
669
669
|
}
|
|
670
670
|
function renderElapsedOnly(serial, tokens) {
|
|
671
671
|
const seconds = Math.round(Math.abs(serial) * 86400);
|
|
672
|
-
let
|
|
672
|
+
let text2 = "";
|
|
673
673
|
for (const tok of tokens) {
|
|
674
|
-
if (tok.t === "lit")
|
|
674
|
+
if (tok.t === "lit") text2 += tok.v;
|
|
675
675
|
else if (tok.t === "elapsed") {
|
|
676
676
|
const amount = tok.unit === "h" ? Math.floor(seconds / 3600) : tok.unit === "m" ? Math.floor(seconds / 60) : seconds;
|
|
677
|
-
|
|
677
|
+
text2 += String(amount).padStart(tok.width, "0");
|
|
678
678
|
}
|
|
679
679
|
}
|
|
680
|
-
return
|
|
680
|
+
return text2;
|
|
681
681
|
}
|
|
682
682
|
function renderDate(serial, tokens, date1904) {
|
|
683
683
|
if (!(serial >= 0) || serial >= MAX_DATE_SERIAL + 1) return void 0;
|
|
@@ -686,21 +686,21 @@ function renderDate(serial, tokens, date1904) {
|
|
|
686
686
|
if (p.year > 9999) return void 0;
|
|
687
687
|
const twelve = tokens.some((t) => t.t === "ampm");
|
|
688
688
|
const hour12 = p.hours % 12 === 0 ? 12 : p.hours % 12;
|
|
689
|
-
let
|
|
689
|
+
let text2 = "";
|
|
690
690
|
for (const tok of tokens) {
|
|
691
|
-
if (tok.t === "lit")
|
|
691
|
+
if (tok.t === "lit") text2 += tok.v;
|
|
692
692
|
else if (tok.t === "ampm") {
|
|
693
693
|
const pm = p.hours >= 12;
|
|
694
|
-
|
|
694
|
+
text2 += tok.kind === "AM/PM" ? pm ? "PM" : "AM" : tok.kind === "A/P" ? pm ? "P" : "A" : pm ? "p" : "a";
|
|
695
695
|
} else if (tok.t === "subsec") {
|
|
696
696
|
const digits2 = String(p.subsec).padStart(precision, "0");
|
|
697
|
-
|
|
697
|
+
text2 += `.${digits2.slice(0, tok.digits).padEnd(tok.digits, "0")}`;
|
|
698
698
|
} else if (tok.t === "elapsed") {
|
|
699
699
|
const amount = tok.unit === "h" ? Math.floor(p.totalSeconds / 3600) : tok.unit === "m" ? Math.floor(p.totalSeconds / 60) : p.totalSeconds;
|
|
700
|
-
|
|
701
|
-
} else if (tok.t === "date")
|
|
700
|
+
text2 += String(amount).padStart(tok.width, "0");
|
|
701
|
+
} else if (tok.t === "date") text2 += datePart(tok.part, p, twelve ? hour12 : p.hours);
|
|
702
702
|
}
|
|
703
|
-
return
|
|
703
|
+
return text2;
|
|
704
704
|
}
|
|
705
705
|
function datePart(part, p, hour) {
|
|
706
706
|
switch (part) {
|
|
@@ -939,25 +939,25 @@ function renderFraction(value2, plan) {
|
|
|
939
939
|
const dropSeparator = hideFraction || hasInt && intText === "" && numHash;
|
|
940
940
|
const lastInt = plan.tokens.reduce((last, t, i2) => t.r === "int" ? i2 : last, -1);
|
|
941
941
|
const firstNum = plan.tokens.findIndex((t) => t.r === "num");
|
|
942
|
-
let
|
|
942
|
+
let text2 = "";
|
|
943
943
|
let intDone = false;
|
|
944
944
|
plan.tokens.forEach((tok, i2) => {
|
|
945
945
|
if (tok.r === "lit") {
|
|
946
|
-
if (!(dropSeparator && i2 > lastInt && i2 < firstNum))
|
|
946
|
+
if (!(dropSeparator && i2 > lastInt && i2 < firstNum)) text2 += tok.v;
|
|
947
947
|
} else if (tok.r === "int") {
|
|
948
|
-
if (!intDone)
|
|
948
|
+
if (!intDone) text2 += intText;
|
|
949
949
|
intDone = true;
|
|
950
950
|
} else if (hideFraction) ; else if (blank) {
|
|
951
|
-
if (tok.r === "num")
|
|
952
|
-
else if (tok.r === "slash")
|
|
953
|
-
else
|
|
951
|
+
if (tok.r === "num") text2 += " ";
|
|
952
|
+
else if (tok.r === "slash") text2 += " ";
|
|
953
|
+
else text2 += " ".repeat(plan.fixedDenominator ? plan.denWidth : 1);
|
|
954
954
|
} else if (tok.r === "num") {
|
|
955
|
-
if (tok.index === 0)
|
|
956
|
-
} else if (tok.r === "slash")
|
|
957
|
-
else if (plan.fixedDenominator)
|
|
958
|
-
else if (tok.index === 0)
|
|
955
|
+
if (tok.index === 0) text2 += padLeft(String(n), plan.numDigits);
|
|
956
|
+
} else if (tok.r === "slash") text2 += "/";
|
|
957
|
+
else if (plan.fixedDenominator) text2 += String(d);
|
|
958
|
+
else if (tok.index === 0) text2 += padRight(String(d), plan.denDigits);
|
|
959
959
|
});
|
|
960
|
-
return { text, zero };
|
|
960
|
+
return { text: text2, zero };
|
|
961
961
|
}
|
|
962
962
|
|
|
963
963
|
// xlsx/numfmt/decimal.ts
|
|
@@ -1162,18 +1162,18 @@ function renderNumber(value2, plan) {
|
|
|
1162
1162
|
} else rounded = roundDecimals(v, plan.fracDigits.length);
|
|
1163
1163
|
const ints = plan.exponent && isZero(rounded) ? plan.intDigits.map(() => "0") : placeIntegers(integerPart(rounded), plan.intDigits, plan.grouping);
|
|
1164
1164
|
const fracs = placeFraction(fractionPart(rounded, plan.fracDigits.length), plan.fracDigits);
|
|
1165
|
-
let
|
|
1165
|
+
let text2 = "";
|
|
1166
1166
|
for (const tok of plan.tokens) {
|
|
1167
|
-
if (tok.r === "lit")
|
|
1168
|
-
else if (tok.r === "int")
|
|
1169
|
-
else if (tok.r === "frac")
|
|
1170
|
-
else if (tok.r === "point")
|
|
1167
|
+
if (tok.r === "lit") text2 += tok.v;
|
|
1168
|
+
else if (tok.r === "int") text2 += ints[tok.index] ?? "";
|
|
1169
|
+
else if (tok.r === "frac") text2 += fracs[tok.index] ?? "";
|
|
1170
|
+
else if (tok.r === "point") text2 += ".";
|
|
1171
1171
|
else if (plan.exponent) {
|
|
1172
1172
|
const sign2 = exp2 < 0 ? "-" : plan.exponent.plus ? "+" : "";
|
|
1173
|
-
|
|
1173
|
+
text2 += `E${sign2}${String(Math.abs(exp2)).padStart(plan.exponent.digits, "0")}`;
|
|
1174
1174
|
}
|
|
1175
1175
|
}
|
|
1176
|
-
return { text, zero: isZero(rounded) };
|
|
1176
|
+
return { text: text2, zero: isZero(rounded) };
|
|
1177
1177
|
}
|
|
1178
1178
|
|
|
1179
1179
|
// xlsx/numfmt/tokenizer.ts
|
|
@@ -1464,14 +1464,14 @@ function compileFormat(format) {
|
|
|
1464
1464
|
const code = format.trim() === "" ? "General" : format;
|
|
1465
1465
|
const sections = splitSections(code).slice(0, 4).map(compileSection);
|
|
1466
1466
|
let numeric2;
|
|
1467
|
-
let
|
|
1467
|
+
let text2;
|
|
1468
1468
|
const last = sections[sections.length - 1];
|
|
1469
1469
|
if (sections.length === 4) {
|
|
1470
1470
|
numeric2 = sections.slice(0, 3);
|
|
1471
|
-
|
|
1471
|
+
text2 = sections[3];
|
|
1472
1472
|
} else if (last && last.kind === "text") {
|
|
1473
1473
|
numeric2 = sections.slice(0, -1);
|
|
1474
|
-
|
|
1474
|
+
text2 = last;
|
|
1475
1475
|
} else numeric2 = sections;
|
|
1476
1476
|
if (numeric2.length === 0) numeric2 = [generalSection()];
|
|
1477
1477
|
const conditional = numeric2.some((s) => s.condition !== void 0);
|
|
@@ -1481,7 +1481,7 @@ function compileFormat(format) {
|
|
|
1481
1481
|
conditional,
|
|
1482
1482
|
isDate: numeric2.some((s) => s.kind === "date")
|
|
1483
1483
|
};
|
|
1484
|
-
if (
|
|
1484
|
+
if (text2) compiled.text = text2;
|
|
1485
1485
|
if (cache.size >= CACHE_LIMIT) cache.clear();
|
|
1486
1486
|
cache.set(format, compiled);
|
|
1487
1487
|
return compiled;
|
|
@@ -1555,16 +1555,16 @@ function generalDigits(v, width) {
|
|
|
1555
1555
|
}
|
|
1556
1556
|
function formatGeneral(value2, width = GENERAL_WIDTH) {
|
|
1557
1557
|
if (!Number.isFinite(value2)) return "#NUM!";
|
|
1558
|
-
const
|
|
1558
|
+
const text2 = generalDigits(
|
|
1559
1559
|
toDigits(value2),
|
|
1560
1560
|
Math.max(1, Math.min(GENERAL_WIDTH, Math.floor(width)))
|
|
1561
1561
|
);
|
|
1562
|
-
return value2 < 0 &&
|
|
1562
|
+
return value2 < 0 && text2 !== "0" ? `-${text2}` : text2;
|
|
1563
1563
|
}
|
|
1564
1564
|
|
|
1565
1565
|
// xlsx/numfmt/format.ts
|
|
1566
1566
|
var OVERFLOW_TEXT = "########";
|
|
1567
|
-
var result = (
|
|
1567
|
+
var result = (text2, section) => section?.color ? { text: text2, color: section.color } : { text: text2 };
|
|
1568
1568
|
function tokenSource(tok) {
|
|
1569
1569
|
switch (tok.t) {
|
|
1570
1570
|
case "lit":
|
|
@@ -1597,21 +1597,21 @@ function tokenSource(tok) {
|
|
|
1597
1597
|
return "";
|
|
1598
1598
|
}
|
|
1599
1599
|
}
|
|
1600
|
-
function formatText(
|
|
1601
|
-
if (!section) return { text };
|
|
1600
|
+
function formatText(text2, section) {
|
|
1601
|
+
if (!section) return { text: text2 };
|
|
1602
1602
|
let out = "";
|
|
1603
|
-
for (const tok of section.tokens) out += tok.t === "text" ?
|
|
1603
|
+
for (const tok of section.tokens) out += tok.t === "text" ? text2 : tokenSource(tok);
|
|
1604
1604
|
return result(out, section);
|
|
1605
1605
|
}
|
|
1606
1606
|
function renderAbs(v, section, generalWidth) {
|
|
1607
1607
|
if (section.fraction) return renderFraction(v, section.fraction);
|
|
1608
1608
|
if (section.number) return renderNumber(v, section.number);
|
|
1609
1609
|
const general = formatGeneral(Math.abs(v), generalWidth);
|
|
1610
|
-
let
|
|
1610
|
+
let text2 = "";
|
|
1611
1611
|
for (const tok of section.tokens) {
|
|
1612
|
-
|
|
1612
|
+
text2 += tok.t === "general" || tok.t === "text" ? general : tokenSource(tok);
|
|
1613
1613
|
}
|
|
1614
|
-
return { text, zero: general === "0" };
|
|
1614
|
+
return { text: text2, zero: general === "0" };
|
|
1615
1615
|
}
|
|
1616
1616
|
function hashFill(options) {
|
|
1617
1617
|
const width = options.width ?? 0;
|
|
@@ -1621,7 +1621,7 @@ function hashFill(options) {
|
|
|
1621
1621
|
function fitNumber(value2, format, options) {
|
|
1622
1622
|
const date1904 = options.date1904 ?? false;
|
|
1623
1623
|
const width = options.width ?? 0;
|
|
1624
|
-
const fits = (
|
|
1624
|
+
const fits = (text2) => (options.measure ? options.measure(text2) : text2.length) <= width;
|
|
1625
1625
|
const first2 = formatNumber(value2, format, date1904);
|
|
1626
1626
|
if (fits(first2.text) || first2.text === OVERFLOW_TEXT) return first2;
|
|
1627
1627
|
const choice = chooseSection(compileFormat(format), value2);
|
|
@@ -1644,15 +1644,15 @@ function formatNumber(value2, format, date1904, generalWidth) {
|
|
|
1644
1644
|
if (section.kind === "date") {
|
|
1645
1645
|
const serial = abs2 ? Math.abs(value2) : value2;
|
|
1646
1646
|
if (isElapsedOnly(section.tokens)) {
|
|
1647
|
-
const
|
|
1648
|
-
return result(serial < 0 ? `-${
|
|
1647
|
+
const text4 = renderElapsedOnly(serial, section.tokens);
|
|
1648
|
+
return result(serial < 0 ? `-${text4}` : text4, section);
|
|
1649
1649
|
}
|
|
1650
|
-
const
|
|
1651
|
-
return
|
|
1650
|
+
const text3 = renderDate(serial, section.tokens, date1904);
|
|
1651
|
+
return text3 === void 0 ? { text: OVERFLOW_TEXT } : result(text3, section);
|
|
1652
1652
|
}
|
|
1653
|
-
const { text, zero } = renderAbs(value2, section, generalWidth);
|
|
1653
|
+
const { text: text2, zero } = renderAbs(value2, section, generalWidth);
|
|
1654
1654
|
const minus = value2 < 0 && !abs2 && !zero;
|
|
1655
|
-
return result(minus ? `-${
|
|
1655
|
+
return result(minus ? `-${text2}` : text2, section);
|
|
1656
1656
|
}
|
|
1657
1657
|
function formatValue(value2, format, options = {}) {
|
|
1658
1658
|
if (value2 === null) return { text: "" };
|
|
@@ -1689,9 +1689,9 @@ function monthFromName(name) {
|
|
|
1689
1689
|
);
|
|
1690
1690
|
return index2 < 0 ? void 0 : index2 + 1;
|
|
1691
1691
|
}
|
|
1692
|
-
function fullYear(
|
|
1693
|
-
const y = Number(
|
|
1694
|
-
if (
|
|
1692
|
+
function fullYear(text2) {
|
|
1693
|
+
const y = Number(text2);
|
|
1694
|
+
if (text2.length > 2) return y;
|
|
1695
1695
|
return y < 30 ? 2e3 + y : 1900 + y;
|
|
1696
1696
|
}
|
|
1697
1697
|
function serialOf(year, month, day, date1904) {
|
|
@@ -1705,8 +1705,8 @@ function serialOf(year, month, day, date1904) {
|
|
|
1705
1705
|
return serial < minimum ? void 0 : serial;
|
|
1706
1706
|
}
|
|
1707
1707
|
var TIME_RE = /^(\d{1,5}):(\d{1,2})(?::(\d{1,2}))?(?:\.(\d+))?\s*(am|pm|a|p)?$/i;
|
|
1708
|
-
function parseTime(
|
|
1709
|
-
const m = TIME_RE.exec(
|
|
1708
|
+
function parseTime(text2) {
|
|
1709
|
+
const m = TIME_RE.exec(text2);
|
|
1710
1710
|
if (!m) return void 0;
|
|
1711
1711
|
const [, a = "0", b = "0", c, frac, ampm] = m;
|
|
1712
1712
|
let hours = Number(a);
|
|
@@ -1733,11 +1733,11 @@ function parseTime(text) {
|
|
|
1733
1733
|
return { fraction: (hours * 3600 + minutes * 60 + seconds) / 86400, format };
|
|
1734
1734
|
}
|
|
1735
1735
|
var currentYear = () => (/* @__PURE__ */ new Date()).getFullYear();
|
|
1736
|
-
function parseDay(
|
|
1737
|
-
let m = /^(\d{4})[-/](\d{1,2})[-/](\d{1,2})$/.exec(
|
|
1736
|
+
function parseDay(text2) {
|
|
1737
|
+
let m = /^(\d{4})[-/](\d{1,2})[-/](\d{1,2})$/.exec(text2);
|
|
1738
1738
|
if (m)
|
|
1739
1739
|
return { year: Number(m[1]), month: Number(m[2]), day: Number(m[3]), format: "yyyy-mm-dd" };
|
|
1740
|
-
m = /^(\d{1,2})([-/])(\d{1,2})\2(\d{2}|\d{4})$/.exec(
|
|
1740
|
+
m = /^(\d{1,2})([-/])(\d{1,2})\2(\d{2}|\d{4})$/.exec(text2);
|
|
1741
1741
|
if (m)
|
|
1742
1742
|
return {
|
|
1743
1743
|
year: fullYear(m[4] ?? ""),
|
|
@@ -1745,9 +1745,9 @@ function parseDay(text) {
|
|
|
1745
1745
|
day: Number(m[3]),
|
|
1746
1746
|
format: "m/d/yyyy"
|
|
1747
1747
|
};
|
|
1748
|
-
m = /^(\d{1,2})\/(\d{1,2})$/.exec(
|
|
1748
|
+
m = /^(\d{1,2})\/(\d{1,2})$/.exec(text2);
|
|
1749
1749
|
if (m) return { year: currentYear(), month: Number(m[1]), day: Number(m[2]), format: "d-mmm" };
|
|
1750
|
-
m = /^(\d{1,2})[- ]([a-z]+)\.?(?:[- ,]+(\d{2}|\d{4}))?$/i.exec(
|
|
1750
|
+
m = /^(\d{1,2})[- ]([a-z]+)\.?(?:[- ,]+(\d{2}|\d{4}))?$/i.exec(text2);
|
|
1751
1751
|
if (m) {
|
|
1752
1752
|
const month = monthFromName(m[2] ?? "");
|
|
1753
1753
|
if (!month) return void 0;
|
|
@@ -1755,12 +1755,12 @@ function parseDay(text) {
|
|
|
1755
1755
|
return { year: currentYear(), month, day: Number(m[1]), format: "d-mmm" };
|
|
1756
1756
|
return { year: fullYear(m[3]), month, day: Number(m[1]), format: "d-mmm-yy" };
|
|
1757
1757
|
}
|
|
1758
|
-
m = /^([a-z]+)\.?[- ](\d{1,2}),?[- ](\d{4})$/i.exec(
|
|
1758
|
+
m = /^([a-z]+)\.?[- ](\d{1,2}),?[- ](\d{4})$/i.exec(text2);
|
|
1759
1759
|
if (m) {
|
|
1760
1760
|
const month = monthFromName(m[1] ?? "");
|
|
1761
1761
|
return month ? { year: Number(m[3]), month, day: Number(m[2]), format: "d-mmm-yy" } : void 0;
|
|
1762
1762
|
}
|
|
1763
|
-
m = /^([a-z]{3,})[- ]?(\d{1,2})$/i.exec(
|
|
1763
|
+
m = /^([a-z]{3,})[- ]?(\d{1,2})$/i.exec(text2);
|
|
1764
1764
|
if (m) {
|
|
1765
1765
|
const month = monthFromName(m[1] ?? "");
|
|
1766
1766
|
if (!month) return void 0;
|
|
@@ -1770,19 +1770,19 @@ function parseDay(text) {
|
|
|
1770
1770
|
return { year, month, day: n, format: "d-mmm" };
|
|
1771
1771
|
return { year: fullYear(m[2] ?? ""), month, day: 1, format: "mmm-yy" };
|
|
1772
1772
|
}
|
|
1773
|
-
m = /^([a-z]+)\.?[- ](\d{4})$/i.exec(
|
|
1773
|
+
m = /^([a-z]+)\.?[- ](\d{4})$/i.exec(text2);
|
|
1774
1774
|
if (m) {
|
|
1775
1775
|
const month = monthFromName(m[1] ?? "");
|
|
1776
1776
|
return month ? { year: Number(m[2]), month, day: 1, format: "mmm-yy" } : void 0;
|
|
1777
1777
|
}
|
|
1778
1778
|
return void 0;
|
|
1779
1779
|
}
|
|
1780
|
-
function parseDateTimeInput(
|
|
1781
|
-
const time = parseTime(
|
|
1780
|
+
function parseDateTimeInput(text2, date1904) {
|
|
1781
|
+
const time = parseTime(text2);
|
|
1782
1782
|
if (time) return { value: time.fraction, numFmt: time.format };
|
|
1783
|
-
const tail = /(?:\s{1,8}|T)(\d{1,2}:\d{1,2}(?::\d{1,2})?(?:\s{0,8}(?:am|pm|a|p))?)$/i.exec(
|
|
1784
|
-
const split = tail && tail.index > 0 ? [tail[0],
|
|
1785
|
-
const dayText = split ? split[1] ?? "" :
|
|
1783
|
+
const tail = /(?:\s{1,8}|T)(\d{1,2}:\d{1,2}(?::\d{1,2})?(?:\s{0,8}(?:am|pm|a|p))?)$/i.exec(text2);
|
|
1784
|
+
const split = tail && tail.index > 0 ? [tail[0], text2.slice(0, tail.index), tail[1]] : null;
|
|
1785
|
+
const dayText = split ? split[1] ?? "" : text2;
|
|
1786
1786
|
const day = parseDay(dayText);
|
|
1787
1787
|
if (!day) return void 0;
|
|
1788
1788
|
const serial = serialOf(day.year, day.month, day.day, date1904);
|
|
@@ -1801,8 +1801,8 @@ function currencyFormat(symbol2, decimals2) {
|
|
|
1801
1801
|
if (symbol2 === "$") return `$${body2}_);[Red]($${body2})`;
|
|
1802
1802
|
return `${symbol2}${body2}`;
|
|
1803
1803
|
}
|
|
1804
|
-
function parseNumberInput(
|
|
1805
|
-
let s =
|
|
1804
|
+
function parseNumberInput(text2) {
|
|
1805
|
+
let s = text2.trim();
|
|
1806
1806
|
let negative = false;
|
|
1807
1807
|
let parenthesized = false;
|
|
1808
1808
|
if (s.startsWith("(") && s.endsWith(")")) {
|
|
@@ -1859,8 +1859,8 @@ function parseNumberInput(text) {
|
|
|
1859
1859
|
if (grouped) return { value: value2, numFmt: decimals2 ? "#,##0.00" : "#,##0" };
|
|
1860
1860
|
return { value: value2 };
|
|
1861
1861
|
}
|
|
1862
|
-
function parseFractionInput(
|
|
1863
|
-
const m = /^([-+]?)(\d+)\s+(\d+)\/(\d+)$/.exec(
|
|
1862
|
+
function parseFractionInput(text2) {
|
|
1863
|
+
const m = /^([-+]?)(\d+)\s+(\d+)\/(\d+)$/.exec(text2.trim());
|
|
1864
1864
|
if (!m) return void 0;
|
|
1865
1865
|
const den = Number(m[4]);
|
|
1866
1866
|
const num2 = Number(m[3]);
|
|
@@ -1871,27 +1871,27 @@ function parseFractionInput(text) {
|
|
|
1871
1871
|
numFmt: den < 10 ? "# ?/?" : "# ??/??"
|
|
1872
1872
|
};
|
|
1873
1873
|
}
|
|
1874
|
-
function parseCellInput(
|
|
1875
|
-
if (
|
|
1876
|
-
if (
|
|
1877
|
-
if (
|
|
1878
|
-
const trimmed =
|
|
1879
|
-
if (trimmed === "") return { value:
|
|
1874
|
+
function parseCellInput(text2, options = {}) {
|
|
1875
|
+
if (text2 === "") return { value: null };
|
|
1876
|
+
if (text2.startsWith("=") && text2.length > 1) return { value: null, formula: text2.slice(1) };
|
|
1877
|
+
if (text2.startsWith("'")) return { value: text2.slice(1) };
|
|
1878
|
+
const trimmed = text2.trim();
|
|
1879
|
+
if (trimmed === "") return { value: text2 };
|
|
1880
1880
|
const upper2 = trimmed.toUpperCase();
|
|
1881
|
-
if (trimmed ===
|
|
1881
|
+
if (trimmed === text2) {
|
|
1882
1882
|
if (upper2 === "TRUE" || upper2 === "FALSE") return { value: upper2 === "TRUE" };
|
|
1883
1883
|
if (isErrorCode(upper2)) return { value: cellError(upper2) };
|
|
1884
1884
|
}
|
|
1885
1885
|
const parsed = parseNumberInput(trimmed) ?? parseFractionInput(trimmed) ?? parseDateTimeInput(trimmed, options.date1904 ?? false);
|
|
1886
|
-
if (!parsed) return { value:
|
|
1886
|
+
if (!parsed) return { value: text2 };
|
|
1887
1887
|
return parsed.numFmt ? { value: parsed.value, numFmt: parsed.numFmt } : { value: parsed.value };
|
|
1888
1888
|
}
|
|
1889
1889
|
|
|
1890
1890
|
// xlsx/numfmt/decimals.ts
|
|
1891
1891
|
function fromGeneral(delta, sample) {
|
|
1892
|
-
const
|
|
1893
|
-
const sci = /^(\d)(?:\.(\d+))?E/.exec(
|
|
1894
|
-
const shown = sci ? sci[2]?.length ?? 0 : /\.(\d+)/.exec(
|
|
1892
|
+
const text2 = typeof sample === "number" ? formatGeneral(Math.abs(sample)) : "";
|
|
1893
|
+
const sci = /^(\d)(?:\.(\d+))?E/.exec(text2);
|
|
1894
|
+
const shown = sci ? sci[2]?.length ?? 0 : /\.(\d+)/.exec(text2)?.[1]?.length ?? 0;
|
|
1895
1895
|
const next = Math.max(0, shown + delta);
|
|
1896
1896
|
const body2 = next ? `0.${"0".repeat(next)}` : "0";
|
|
1897
1897
|
return sci ? `${body2}E+00` : body2;
|
|
@@ -1965,15 +1965,15 @@ var SPECIALS = {
|
|
|
1965
1965
|
"#totals": "#Totals",
|
|
1966
1966
|
"#this row": "#This Row"
|
|
1967
1967
|
};
|
|
1968
|
-
var unescape = (
|
|
1969
|
-
function splitItems(
|
|
1968
|
+
var unescape = (text2) => text2.replace(/'(.)/g, "$1");
|
|
1969
|
+
function splitItems(text2) {
|
|
1970
1970
|
const items = [];
|
|
1971
1971
|
let depth = 0;
|
|
1972
1972
|
let current = "";
|
|
1973
|
-
for (let i2 = 0; i2 <
|
|
1974
|
-
const ch =
|
|
1973
|
+
for (let i2 = 0; i2 < text2.length; i2++) {
|
|
1974
|
+
const ch = text2[i2] ?? "";
|
|
1975
1975
|
if (ch === "'") {
|
|
1976
|
-
current += ch + (
|
|
1976
|
+
current += ch + (text2[i2 + 1] ?? "");
|
|
1977
1977
|
i2++;
|
|
1978
1978
|
continue;
|
|
1979
1979
|
}
|
|
@@ -1990,9 +1990,9 @@ function splitItems(text) {
|
|
|
1990
1990
|
return items;
|
|
1991
1991
|
}
|
|
1992
1992
|
var strip = (item) => item.startsWith("[") && item.endsWith("]") ? item.slice(1, -1) : item;
|
|
1993
|
-
function parseStructured(
|
|
1994
|
-
const open =
|
|
1995
|
-
const inner2 =
|
|
1993
|
+
function parseStructured(text2, tableName) {
|
|
1994
|
+
const open = text2.indexOf("[");
|
|
1995
|
+
const inner2 = text2.slice(open + 1, -1);
|
|
1996
1996
|
const out = { specials: [] };
|
|
1997
1997
|
if (tableName) out.table = tableName;
|
|
1998
1998
|
const addColumns = (spec2) => {
|
|
@@ -2017,7 +2017,7 @@ function parseStructured(text, tableName) {
|
|
|
2017
2017
|
out.specials.push(special);
|
|
2018
2018
|
return;
|
|
2019
2019
|
}
|
|
2020
|
-
if (out.column !== void 0) throw new FormulaError(`Invalid structured reference ${
|
|
2020
|
+
if (out.column !== void 0) throw new FormulaError(`Invalid structured reference ${text2}`);
|
|
2021
2021
|
addColumns(item);
|
|
2022
2022
|
};
|
|
2023
2023
|
if (!inner2.includes("[")) {
|
|
@@ -2036,13 +2036,28 @@ function parseStructured(text, tableName) {
|
|
|
2036
2036
|
|
|
2037
2037
|
// xlsx/formula/lexemes.ts
|
|
2038
2038
|
var ERRORS_BY_LENGTH = [...ERROR_CODES].sort((a, b) => b.length - a.length);
|
|
2039
|
-
var NAME_START = /[A-Za-z_\\\u00A1-\uFFFF]/;
|
|
2040
|
-
var NAME_CHAR = /[A-Za-z0-9_.?\\\u00A1-\uFFFF]/;
|
|
2041
2039
|
var NAME_RE = /^[A-Za-z_\\\u00A1-\uFFFF][A-Za-z0-9_.?\\\u00A1-\uFFFF]*/;
|
|
2042
2040
|
var CELL_RE = /^(\$?)([A-Za-z]{1,3})(\$?)(\d{1,7})/;
|
|
2043
2041
|
var COLS_RE = /^(\$?)([A-Za-z]{1,3}):(\$?)([A-Za-z]{1,3})/;
|
|
2044
2042
|
var ROWS_RE = /^(\$?)(\d{1,7}):(\$?)(\d{1,7})/;
|
|
2045
|
-
var NUMBER_RE2 = /^(?:\d
|
|
2043
|
+
var NUMBER_RE2 = /^(?:\d+(?:\.\d*)?|\.\d+)(?:[eE][+-]?\d+)?/;
|
|
2044
|
+
var sticky = (re) => new RegExp(re.source.replace(/^\^/, ""), "y");
|
|
2045
|
+
var CELL_AT = sticky(CELL_RE);
|
|
2046
|
+
var COLS_AT = sticky(COLS_RE);
|
|
2047
|
+
var ROWS_AT = sticky(ROWS_RE);
|
|
2048
|
+
var NAME_AT = sticky(NAME_RE);
|
|
2049
|
+
var NUMBER_AT = sticky(NUMBER_RE2);
|
|
2050
|
+
function matchAt(re, source, at) {
|
|
2051
|
+
re.lastIndex = at;
|
|
2052
|
+
return re.exec(source);
|
|
2053
|
+
}
|
|
2054
|
+
var isDigitAt = (source, at) => isDigitCode(source.charCodeAt(at));
|
|
2055
|
+
function rangeStartAt(source, at, accept, max) {
|
|
2056
|
+
let i2 = source[at] === "$" ? at + 1 : at;
|
|
2057
|
+
const from = i2;
|
|
2058
|
+
while (i2 - from <= max && accept(source.charCodeAt(i2))) i2++;
|
|
2059
|
+
return i2 > from && i2 - from <= max && source[i2] === ":";
|
|
2060
|
+
}
|
|
2046
2061
|
var OPERATORS = [
|
|
2047
2062
|
"<=",
|
|
2048
2063
|
">=",
|
|
@@ -2060,7 +2075,12 @@ var OPERATORS = [
|
|
|
2060
2075
|
":",
|
|
2061
2076
|
"@"
|
|
2062
2077
|
];
|
|
2063
|
-
var
|
|
2078
|
+
var isLetterCode = (code) => code >= 65 && code <= 90 || code >= 97 && code <= 122;
|
|
2079
|
+
var isDigitCode = (code) => code >= 48 && code <= 57;
|
|
2080
|
+
var isNameStartCode = (code) => isLetterCode(code) || code === 95 || code === 92 || code >= 161;
|
|
2081
|
+
var isNameCharCode = (code) => isNameStartCode(code) || isDigitCode(code) || code === 46 || code === 63;
|
|
2082
|
+
var isSheetCharCode = (code) => isLetterCode(code) || isDigitCode(code) || code === 95 || code === 46 || code >= 161;
|
|
2083
|
+
var isNameChar = (ch) => ch !== void 0 && ch !== "" && isNameCharCode(ch.charCodeAt(0));
|
|
2064
2084
|
function matchError(source, at) {
|
|
2065
2085
|
const upper2 = source.slice(at, at + 14).toUpperCase();
|
|
2066
2086
|
return ERRORS_BY_LENGTH.find((code) => upper2.startsWith(code));
|
|
@@ -2076,14 +2096,13 @@ var boundary = (source, end) => {
|
|
|
2076
2096
|
return !isNameChar(next) && next !== "(" && next !== "!" && next !== "[";
|
|
2077
2097
|
};
|
|
2078
2098
|
function readReference(source, at) {
|
|
2079
|
-
const
|
|
2080
|
-
const cell = CELL_RE.exec(rest);
|
|
2099
|
+
const cell = matchAt(CELL_AT, source, at);
|
|
2081
2100
|
if (cell) {
|
|
2082
2101
|
const start = corner2(cell[1] ?? "", cell[2] ?? "", cell[3] ?? "", cell[4] ?? "");
|
|
2083
2102
|
let length = cell[0].length;
|
|
2084
2103
|
if (start) {
|
|
2085
|
-
if (
|
|
2086
|
-
const second =
|
|
2104
|
+
if (source[at + length] === ":") {
|
|
2105
|
+
const second = matchAt(CELL_AT, source, at + length + 1);
|
|
2087
2106
|
if (second) {
|
|
2088
2107
|
const end = corner2(second[1] ?? "", second[2] ?? "", second[3] ?? "", second[4] ?? "");
|
|
2089
2108
|
const total2 = length + 1 + second[0].length;
|
|
@@ -2097,8 +2116,8 @@ function readReference(source, at) {
|
|
|
2097
2116
|
}
|
|
2098
2117
|
length = 0;
|
|
2099
2118
|
}
|
|
2100
|
-
const cols =
|
|
2101
|
-
if (cols && boundary(source, at + cols[0].length) &&
|
|
2119
|
+
const cols = rangeStartAt(source, at, isLetterCode, 3) ? matchAt(COLS_AT, source, at) : null;
|
|
2120
|
+
if (cols && boundary(source, at + cols[0].length) && !isDigitAt(source, at + cols[0].length)) {
|
|
2102
2121
|
const c1 = columnIndex(cols[2] ?? "");
|
|
2103
2122
|
const c2 = columnIndex(cols[4] ?? "");
|
|
2104
2123
|
if (c1 >= 0 && c1 <= MAX_COL && c2 >= 0 && c2 <= MAX_COL) {
|
|
@@ -2112,7 +2131,7 @@ function readReference(source, at) {
|
|
|
2112
2131
|
};
|
|
2113
2132
|
}
|
|
2114
2133
|
}
|
|
2115
|
-
const rows2 =
|
|
2134
|
+
const rows2 = rangeStartAt(source, at, isDigitCode, 7) ? matchAt(ROWS_AT, source, at) : null;
|
|
2116
2135
|
if (rows2 && boundary(source, at + rows2[0].length) && source[at + rows2[0].length] !== ".") {
|
|
2117
2136
|
const r1 = Number(rows2[2]) - 1;
|
|
2118
2137
|
const r2 = Number(rows2[4]) - 1;
|
|
@@ -2165,8 +2184,8 @@ function readBrackets(source, at) {
|
|
|
2165
2184
|
}
|
|
2166
2185
|
throw new FormulaError("Unterminated structured reference", at);
|
|
2167
2186
|
}
|
|
2168
|
-
function splitSheets(
|
|
2169
|
-
let rest =
|
|
2187
|
+
function splitSheets(text2) {
|
|
2188
|
+
let rest = text2;
|
|
2170
2189
|
let book;
|
|
2171
2190
|
const bookMatch = /^\[([^\]]*)\]/.exec(rest);
|
|
2172
2191
|
if (bookMatch) {
|
|
@@ -2181,6 +2200,7 @@ function splitSheets(text) {
|
|
|
2181
2200
|
if (book !== void 0) out.book = book;
|
|
2182
2201
|
return out;
|
|
2183
2202
|
}
|
|
2203
|
+
var PREFIX_AT = /(\[\d+\])?([A-Za-z0-9_.\u00A1-\uFFFF]+)(?::([A-Za-z0-9_.\u00A1-\uFFFF]+))?!/y;
|
|
2184
2204
|
function readPrefix(source, at) {
|
|
2185
2205
|
const ch = source[at];
|
|
2186
2206
|
if (ch === "'") {
|
|
@@ -2189,19 +2209,27 @@ function readPrefix(source, at) {
|
|
|
2189
2209
|
const length = quoted.length + 1;
|
|
2190
2210
|
return { prefix: { text: source.slice(at, at + length), ...splitSheets(quoted.name) }, length };
|
|
2191
2211
|
}
|
|
2192
|
-
|
|
2193
|
-
|
|
2194
|
-
|
|
2212
|
+
let i2 = at;
|
|
2213
|
+
if (ch === "[") {
|
|
2214
|
+
i2++;
|
|
2215
|
+
while (isDigitCode(source.charCodeAt(i2))) i2++;
|
|
2216
|
+
if (i2 === at + 1 || source[i2] !== "]") return void 0;
|
|
2217
|
+
i2++;
|
|
2218
|
+
}
|
|
2219
|
+
while (i2 < source.length && isSheetCharCode(source.charCodeAt(i2))) i2++;
|
|
2220
|
+
if (source[i2] !== "!" && source[i2] !== ":") return void 0;
|
|
2221
|
+
const m = matchAt(PREFIX_AT, source, at);
|
|
2195
2222
|
if (!m) return void 0;
|
|
2196
2223
|
if (!m[1] && /^\d/.test(m[2] ?? "") && !m[3]) return void 0;
|
|
2197
2224
|
const raw = m[0].slice(0, -1);
|
|
2198
2225
|
return { prefix: { text: m[0], ...splitSheets(raw) }, length: m[0].length };
|
|
2199
2226
|
}
|
|
2200
|
-
function numberLiteral(
|
|
2201
|
-
|
|
2227
|
+
function numberLiteral(text2) {
|
|
2228
|
+
if (text2.length <= 15) return Number(text2);
|
|
2229
|
+
const [mantissa = "", exponent] = text2.toLowerCase().split("e");
|
|
2202
2230
|
const digits2 = mantissa.replace(".", "");
|
|
2203
2231
|
const firstSignificant = digits2.search(/[1-9]/);
|
|
2204
|
-
if (firstSignificant < 0 || digits2.length - firstSignificant <= 15) return Number(
|
|
2232
|
+
if (firstSignificant < 0 || digits2.length - firstSignificant <= 15) return Number(text2);
|
|
2205
2233
|
const point = mantissa.includes(".") ? mantissa.indexOf(".") : mantissa.length;
|
|
2206
2234
|
const kept = digits2.slice(0, firstSignificant + 15);
|
|
2207
2235
|
const truncated = kept.length >= point ? `${kept.slice(0, point)}.${kept.slice(point)}` : kept + "0".repeat(point - kept.length);
|
|
@@ -2209,6 +2237,17 @@ function numberLiteral(text) {
|
|
|
2209
2237
|
}
|
|
2210
2238
|
|
|
2211
2239
|
// xlsx/formula/tokenizer.ts
|
|
2240
|
+
var SINGLE = {
|
|
2241
|
+
"(": "open",
|
|
2242
|
+
")": "close",
|
|
2243
|
+
",": "comma",
|
|
2244
|
+
";": "semicolon",
|
|
2245
|
+
"{": "lbrace",
|
|
2246
|
+
"}": "rbrace"
|
|
2247
|
+
};
|
|
2248
|
+
var BOOK_INDEX = /\[\d+\]/y;
|
|
2249
|
+
var isSpace = (code) => code === 32 || code === 9 || code === 13 || code === 10;
|
|
2250
|
+
var isDigit3 = (code) => code >= 48 && code <= 57;
|
|
2212
2251
|
function tokenize(formula) {
|
|
2213
2252
|
const source = formula;
|
|
2214
2253
|
const tokens = [];
|
|
@@ -2220,61 +2259,55 @@ function tokenize(formula) {
|
|
|
2220
2259
|
};
|
|
2221
2260
|
while (i2 < source.length) {
|
|
2222
2261
|
const ch = source[i2] ?? "";
|
|
2262
|
+
const code = source.charCodeAt(i2);
|
|
2223
2263
|
const start = i2;
|
|
2224
|
-
if (
|
|
2225
|
-
|
|
2226
|
-
|
|
2264
|
+
if (isSpace(code)) {
|
|
2265
|
+
let j = i2 + 1;
|
|
2266
|
+
while (j < source.length && isSpace(source.charCodeAt(j))) j++;
|
|
2267
|
+
push3({ kind: "ws", text: source.slice(i2, j), start });
|
|
2227
2268
|
continue;
|
|
2228
2269
|
}
|
|
2229
2270
|
if (ch === '"') {
|
|
2230
2271
|
let j = i2 + 1;
|
|
2231
2272
|
let value2 = "";
|
|
2232
2273
|
for (; ; ) {
|
|
2233
|
-
|
|
2234
|
-
if (
|
|
2235
|
-
|
|
2236
|
-
|
|
2237
|
-
|
|
2238
|
-
|
|
2239
|
-
|
|
2240
|
-
break;
|
|
2274
|
+
const quote = source.indexOf('"', j);
|
|
2275
|
+
if (quote < 0) throw new FormulaError("Unterminated string", start);
|
|
2276
|
+
value2 += source.slice(j, quote);
|
|
2277
|
+
if (source[quote + 1] === '"') {
|
|
2278
|
+
value2 += '"';
|
|
2279
|
+
j = quote + 2;
|
|
2280
|
+
continue;
|
|
2241
2281
|
}
|
|
2242
|
-
|
|
2243
|
-
|
|
2282
|
+
j = quote;
|
|
2283
|
+
break;
|
|
2244
2284
|
}
|
|
2245
2285
|
push3({ kind: "string", text: source.slice(start, j + 1), start, value: value2 });
|
|
2246
2286
|
continue;
|
|
2247
2287
|
}
|
|
2248
2288
|
if (ch === "#") {
|
|
2249
|
-
const
|
|
2250
|
-
if (!
|
|
2289
|
+
const code2 = matchError(source, i2);
|
|
2290
|
+
if (!code2) throw new FormulaError(`Unexpected '#'`, start);
|
|
2251
2291
|
push3({
|
|
2252
|
-
kind:
|
|
2253
|
-
text: source.slice(i2, i2 +
|
|
2292
|
+
kind: code2 === "#REF!" ? "ref" : "error",
|
|
2293
|
+
text: source.slice(i2, i2 + code2.length),
|
|
2254
2294
|
start,
|
|
2255
|
-
value:
|
|
2295
|
+
value: code2
|
|
2256
2296
|
});
|
|
2257
2297
|
continue;
|
|
2258
2298
|
}
|
|
2259
|
-
const
|
|
2260
|
-
"(": "open",
|
|
2261
|
-
")": "close",
|
|
2262
|
-
",": "comma",
|
|
2263
|
-
";": "semicolon",
|
|
2264
|
-
"{": "lbrace",
|
|
2265
|
-
"}": "rbrace"
|
|
2266
|
-
};
|
|
2267
|
-
const kind = single[ch];
|
|
2299
|
+
const kind = SINGLE[ch];
|
|
2268
2300
|
if (kind) {
|
|
2269
2301
|
push3({ kind, text: ch, start });
|
|
2270
2302
|
continue;
|
|
2271
2303
|
}
|
|
2272
|
-
if (ch === "[" &&
|
|
2304
|
+
if (ch === "[" && !matchAt(BOOK_INDEX, source, i2)) {
|
|
2273
2305
|
const length = readBrackets(source, i2);
|
|
2274
2306
|
push3({ kind: "structured", text: source.slice(i2, i2 + length), start, value: "" });
|
|
2275
2307
|
continue;
|
|
2276
2308
|
}
|
|
2277
|
-
const
|
|
2309
|
+
const nameStart = isNameStartCode(code);
|
|
2310
|
+
const prefixed = ch === "'" || ch === "[" || nameStart || isDigit3(code);
|
|
2278
2311
|
if (prefixed) {
|
|
2279
2312
|
const prefix = readPrefix(source, i2);
|
|
2280
2313
|
if (prefix) {
|
|
@@ -2283,14 +2316,15 @@ function tokenize(formula) {
|
|
|
2283
2316
|
}
|
|
2284
2317
|
if (ch === "'" || ch === "[") throw new FormulaError("Malformed sheet reference", start);
|
|
2285
2318
|
}
|
|
2286
|
-
|
|
2319
|
+
const numeric2 = isDigit3(code) || ch === ".";
|
|
2320
|
+
if (numeric2 || ch === "$" || nameStart) {
|
|
2287
2321
|
const ref = readReference(source, i2);
|
|
2288
2322
|
if (ref) {
|
|
2289
2323
|
push3(refToken(source, start, i2 + ref.length, ref.ref, void 0));
|
|
2290
2324
|
continue;
|
|
2291
2325
|
}
|
|
2292
|
-
if (
|
|
2293
|
-
const m =
|
|
2326
|
+
if (numeric2) {
|
|
2327
|
+
const m = matchAt(NUMBER_AT, source, i2);
|
|
2294
2328
|
if (!m) throw new FormulaError(`Unexpected '${ch}'`, start);
|
|
2295
2329
|
push3({ kind: "number", text: m[0], start, value: numberLiteral(m[0]) });
|
|
2296
2330
|
continue;
|
|
@@ -2327,11 +2361,12 @@ function readAfterPrefix(source, at, start, prefix) {
|
|
|
2327
2361
|
}
|
|
2328
2362
|
const ref = readReference(source, at);
|
|
2329
2363
|
if (ref) return refToken(source, start, at + ref.length, ref.ref, prefix);
|
|
2330
|
-
if (
|
|
2364
|
+
if (at < source.length && isNameStartCode(source.charCodeAt(at)))
|
|
2365
|
+
return readName(source, at, start, prefix);
|
|
2331
2366
|
throw new FormulaError("Invalid reference after sheet name", at);
|
|
2332
2367
|
}
|
|
2333
2368
|
function readName(source, at, start, prefix) {
|
|
2334
|
-
const m =
|
|
2369
|
+
const m = matchAt(NAME_AT, source, at);
|
|
2335
2370
|
if (!m) throw new FormulaError("Invalid name", at);
|
|
2336
2371
|
const name = m[0];
|
|
2337
2372
|
let end = at + name.length;
|
|
@@ -2377,7 +2412,9 @@ var PREC_INTERSECT = 9;
|
|
|
2377
2412
|
var PREC_RANGE = 10;
|
|
2378
2413
|
var OPERAND_START = /* @__PURE__ */ new Set(["ref", "name", "func", "open", "structured"]);
|
|
2379
2414
|
function parseFormula(formula) {
|
|
2380
|
-
|
|
2415
|
+
return parseTokens(tokenize(formula));
|
|
2416
|
+
}
|
|
2417
|
+
function parseTokens(all2) {
|
|
2381
2418
|
const tokens = [];
|
|
2382
2419
|
const wsBefore = [];
|
|
2383
2420
|
let sawWs = false;
|
|
@@ -2662,6 +2699,222 @@ function localDateToSerial(date, date1904 = date1904Mode) {
|
|
|
2662
2699
|
return base + (utc - dayStart) / DAY_MS;
|
|
2663
2700
|
}
|
|
2664
2701
|
|
|
2702
|
+
// xlsx/formula/area-index.ts
|
|
2703
|
+
var BUCKET_WIDTH = 64;
|
|
2704
|
+
var CHUNK_SHIFT = 6;
|
|
2705
|
+
var CHUNKS = 64;
|
|
2706
|
+
function push(map, key, value2) {
|
|
2707
|
+
const list = map.get(key);
|
|
2708
|
+
if (list) list.push(value2);
|
|
2709
|
+
else map.set(key, [value2]);
|
|
2710
|
+
}
|
|
2711
|
+
function inner(map, sheet) {
|
|
2712
|
+
let found = map.get(sheet);
|
|
2713
|
+
if (!found) map.set(sheet, found = /* @__PURE__ */ new Map());
|
|
2714
|
+
return found;
|
|
2715
|
+
}
|
|
2716
|
+
var AreaIndex = class {
|
|
2717
|
+
cells = /* @__PURE__ */ new Map();
|
|
2718
|
+
chunked = /* @__PURE__ */ new Map();
|
|
2719
|
+
tall = /* @__PURE__ */ new Map();
|
|
2720
|
+
wide = /* @__PURE__ */ new Map();
|
|
2721
|
+
add(area, node) {
|
|
2722
|
+
const { start, end } = area.range;
|
|
2723
|
+
if (start.row === end.row && end.col - start.col + 1 <= BUCKET_WIDTH) {
|
|
2724
|
+
const cells = inner(this.cells, area.sheet);
|
|
2725
|
+
for (let col = start.col; col <= end.col; col++) push(cells, cellKey(start.row, col), node);
|
|
2726
|
+
return;
|
|
2727
|
+
}
|
|
2728
|
+
const entry = { range: area.range, node };
|
|
2729
|
+
if (end.col - start.col + 1 > BUCKET_WIDTH) {
|
|
2730
|
+
const list = this.wide.get(area.sheet);
|
|
2731
|
+
if (list) list.push(entry);
|
|
2732
|
+
else this.wide.set(area.sheet, [entry]);
|
|
2733
|
+
return;
|
|
2734
|
+
}
|
|
2735
|
+
const first2 = start.row >> CHUNK_SHIFT;
|
|
2736
|
+
const last = end.row >> CHUNK_SHIFT;
|
|
2737
|
+
if (last - first2 + 1 > CHUNKS) {
|
|
2738
|
+
const cols2 = inner(this.tall, area.sheet);
|
|
2739
|
+
for (let c = start.col; c <= end.col; c++) push(cols2, c, entry);
|
|
2740
|
+
return;
|
|
2741
|
+
}
|
|
2742
|
+
const cols = inner(this.chunked, area.sheet);
|
|
2743
|
+
for (let c = start.col; c <= end.col; c++) {
|
|
2744
|
+
let chunks = cols.get(c);
|
|
2745
|
+
if (!chunks) cols.set(c, chunks = /* @__PURE__ */ new Map());
|
|
2746
|
+
for (let k = first2; k <= last; k++) push(chunks, k, entry);
|
|
2747
|
+
}
|
|
2748
|
+
}
|
|
2749
|
+
/** Items whose areas intersect `range` on `sheet` (each once). */
|
|
2750
|
+
dependents(sheet, range2, out) {
|
|
2751
|
+
const found = out instanceof Set ? out : /* @__PURE__ */ new Set();
|
|
2752
|
+
this.collect(sheet, range2, found);
|
|
2753
|
+
if (Array.isArray(out)) for (const node of found) out.push(node);
|
|
2754
|
+
}
|
|
2755
|
+
collect(sheet, range2, out) {
|
|
2756
|
+
const { start, end } = range2;
|
|
2757
|
+
const check3 = (list) => {
|
|
2758
|
+
if (list) {
|
|
2759
|
+
for (const entry of list) if (rangesIntersect(entry.range, range2)) out.add(entry.node);
|
|
2760
|
+
}
|
|
2761
|
+
};
|
|
2762
|
+
const cells = this.cells.get(sheet);
|
|
2763
|
+
if (cells) {
|
|
2764
|
+
const size = (end.row - start.row + 1) * (end.col - start.col + 1);
|
|
2765
|
+
if (size <= 4096) {
|
|
2766
|
+
for (let r = start.row; r <= end.row; r++) {
|
|
2767
|
+
for (let c = start.col; c <= end.col; c++) {
|
|
2768
|
+
const list = cells.get(cellKey(r, c));
|
|
2769
|
+
if (list) for (const node of list) out.add(node);
|
|
2770
|
+
}
|
|
2771
|
+
}
|
|
2772
|
+
} else {
|
|
2773
|
+
for (const [key, list] of cells) {
|
|
2774
|
+
const { row: row2, col } = keyToAddress(key);
|
|
2775
|
+
if (row2 >= start.row && row2 <= end.row && col >= start.col && col <= end.col)
|
|
2776
|
+
for (const node of list) out.add(node);
|
|
2777
|
+
}
|
|
2778
|
+
}
|
|
2779
|
+
}
|
|
2780
|
+
const columns = (map, visit2) => {
|
|
2781
|
+
if (!map) return;
|
|
2782
|
+
if (end.col - start.col + 1 <= map.size) {
|
|
2783
|
+
for (let c = start.col; c <= end.col; c++) if (map.has(c)) visit2(c);
|
|
2784
|
+
} else for (const c of map.keys()) if (c >= start.col && c <= end.col) visit2(c);
|
|
2785
|
+
};
|
|
2786
|
+
const chunked = this.chunked.get(sheet);
|
|
2787
|
+
const first2 = start.row >> CHUNK_SHIFT;
|
|
2788
|
+
const last = end.row >> CHUNK_SHIFT;
|
|
2789
|
+
columns(chunked, (c) => {
|
|
2790
|
+
const chunks = chunked?.get(c);
|
|
2791
|
+
if (last - first2 + 1 <= chunks.size) {
|
|
2792
|
+
for (let k = first2; k <= last; k++) check3(chunks.get(k));
|
|
2793
|
+
} else for (const [k, list] of chunks) if (k >= first2 && k <= last) check3(list);
|
|
2794
|
+
});
|
|
2795
|
+
const tall = this.tall.get(sheet);
|
|
2796
|
+
columns(tall, (c) => check3(tall?.get(c)));
|
|
2797
|
+
check3(this.wide.get(sheet));
|
|
2798
|
+
}
|
|
2799
|
+
};
|
|
2800
|
+
|
|
2801
|
+
// xlsx/formula/graph-index.ts
|
|
2802
|
+
var ColumnIndex = class {
|
|
2803
|
+
sheets = /* @__PURE__ */ new Map();
|
|
2804
|
+
constructor(nodes) {
|
|
2805
|
+
for (const node of nodes) {
|
|
2806
|
+
let cols = this.sheets.get(node.sheet);
|
|
2807
|
+
if (!cols) this.sheets.set(node.sheet, cols = /* @__PURE__ */ new Map());
|
|
2808
|
+
let list = cols.get(node.col);
|
|
2809
|
+
if (!list) cols.set(node.col, list = []);
|
|
2810
|
+
list.push(node);
|
|
2811
|
+
}
|
|
2812
|
+
for (const cols of this.sheets.values())
|
|
2813
|
+
for (const list of cols.values()) list.sort((a, b) => a.row - b.row);
|
|
2814
|
+
}
|
|
2815
|
+
nodesIn(area, out) {
|
|
2816
|
+
const cols = this.sheets.get(area.sheet);
|
|
2817
|
+
if (!cols) return;
|
|
2818
|
+
const { start, end } = area.range;
|
|
2819
|
+
const width = end.col - start.col + 1;
|
|
2820
|
+
const scan2 = (list) => {
|
|
2821
|
+
let lo = 0;
|
|
2822
|
+
let hi = list.length;
|
|
2823
|
+
while (lo < hi) {
|
|
2824
|
+
const mid = lo + hi >> 1;
|
|
2825
|
+
if (list[mid].row < start.row) lo = mid + 1;
|
|
2826
|
+
else hi = mid;
|
|
2827
|
+
}
|
|
2828
|
+
for (let i2 = lo; i2 < list.length; i2++) {
|
|
2829
|
+
const node = list[i2];
|
|
2830
|
+
if (node.row > end.row) break;
|
|
2831
|
+
out.push(node);
|
|
2832
|
+
}
|
|
2833
|
+
};
|
|
2834
|
+
if (width <= cols.size) {
|
|
2835
|
+
for (let c = start.col; c <= end.col; c++) {
|
|
2836
|
+
const list = cols.get(c);
|
|
2837
|
+
if (list) scan2(list);
|
|
2838
|
+
}
|
|
2839
|
+
} else {
|
|
2840
|
+
for (const [c, list] of cols) if (c >= start.col && c <= end.col) scan2(list);
|
|
2841
|
+
}
|
|
2842
|
+
}
|
|
2843
|
+
};
|
|
2844
|
+
var ReverseIndex = class extends AreaIndex {
|
|
2845
|
+
constructor(nodes = []) {
|
|
2846
|
+
super();
|
|
2847
|
+
for (const node of nodes) this.addNode(node);
|
|
2848
|
+
}
|
|
2849
|
+
/** Indexes one more formula's precedents. */
|
|
2850
|
+
addNode(node) {
|
|
2851
|
+
for (const dep of node.deps) this.add(dep, node);
|
|
2852
|
+
for (const dep of node.dynamicDeps) this.add(dep, node);
|
|
2853
|
+
}
|
|
2854
|
+
};
|
|
2855
|
+
|
|
2856
|
+
// xlsx/formula/engine-prepare.ts
|
|
2857
|
+
var CHECK_EVERY = 32;
|
|
2858
|
+
var GraphPreparation = class {
|
|
2859
|
+
constructor(workbook, create) {
|
|
2860
|
+
this.workbook = workbook;
|
|
2861
|
+
this.create = create;
|
|
2862
|
+
}
|
|
2863
|
+
workbook;
|
|
2864
|
+
create;
|
|
2865
|
+
reverse = new ReverseIndex();
|
|
2866
|
+
formulas = { dynamic: [], unvalued: [] };
|
|
2867
|
+
sheet = 0;
|
|
2868
|
+
rows;
|
|
2869
|
+
row = 0;
|
|
2870
|
+
cells;
|
|
2871
|
+
finished = false;
|
|
2872
|
+
/**
|
|
2873
|
+
* Adds formulas to the graph until `timeRemaining` (milliseconds, as an idle deadline reports
|
|
2874
|
+
* them) reaches zero, or until every formula is in. Returns true when the graph is complete.
|
|
2875
|
+
*/
|
|
2876
|
+
run(timeRemaining) {
|
|
2877
|
+
let visited = 0;
|
|
2878
|
+
while (!this.finished) {
|
|
2879
|
+
const cells = this.cells ?? this.nextRow();
|
|
2880
|
+
if (!cells) continue;
|
|
2881
|
+
const next = cells.next();
|
|
2882
|
+
if (next.done) {
|
|
2883
|
+
this.cells = void 0;
|
|
2884
|
+
continue;
|
|
2885
|
+
}
|
|
2886
|
+
const [col, cell] = next.value;
|
|
2887
|
+
if (cell.formula) this.add(this.create(this.sheet, this.row, col, cell), cell);
|
|
2888
|
+
if (timeRemaining && ++visited % CHECK_EVERY === 0 && timeRemaining() <= 0) break;
|
|
2889
|
+
}
|
|
2890
|
+
return this.finished;
|
|
2891
|
+
}
|
|
2892
|
+
add(node, cell) {
|
|
2893
|
+
this.reverse.addNode(node);
|
|
2894
|
+
if (!node.legacy && !node.arrayRange) this.formulas.dynamic.push(node);
|
|
2895
|
+
if (cell.value === null && !node.keepCached) this.formulas.unvalued.push(node);
|
|
2896
|
+
}
|
|
2897
|
+
/** Moves to the next stored row (and sheet), or marks the walk finished. */
|
|
2898
|
+
nextRow() {
|
|
2899
|
+
for (; ; ) {
|
|
2900
|
+
const sheet = this.workbook.sheets[this.sheet];
|
|
2901
|
+
if (!sheet) {
|
|
2902
|
+
this.finished = true;
|
|
2903
|
+
return void 0;
|
|
2904
|
+
}
|
|
2905
|
+
this.rows ??= sheet.rows.entries();
|
|
2906
|
+
const next = this.rows.next();
|
|
2907
|
+
if (!next.done) {
|
|
2908
|
+
this.row = next.value[0];
|
|
2909
|
+
this.cells = next.value[1].entries();
|
|
2910
|
+
return this.cells;
|
|
2911
|
+
}
|
|
2912
|
+
this.rows = void 0;
|
|
2913
|
+
this.sheet++;
|
|
2914
|
+
}
|
|
2915
|
+
}
|
|
2916
|
+
};
|
|
2917
|
+
|
|
2665
2918
|
// xlsx/formula/text-number.ts
|
|
2666
2919
|
var MONTHS2 = [
|
|
2667
2920
|
"jan",
|
|
@@ -2687,8 +2940,8 @@ function monthFromName2(name) {
|
|
|
2687
2940
|
}
|
|
2688
2941
|
var NUMBER_RE3 = /^(\d+(?:,\d{3,})+|\d*)(\.\d*)?(?:e([+-]?\d+))?$/i;
|
|
2689
2942
|
var TIME_RE2 = /^(\d{1,4})(?::(\d+))?(?::(\d+(?:\.\d*)?))?(?:\s+(am|pm|a|p))?$/i;
|
|
2690
|
-
function parsePlainNumber(
|
|
2691
|
-
const match2 = NUMBER_RE3.exec(
|
|
2943
|
+
function parsePlainNumber(text2) {
|
|
2944
|
+
const match2 = NUMBER_RE3.exec(text2);
|
|
2692
2945
|
if (!match2) return void 0;
|
|
2693
2946
|
const int2 = (match2[1] ?? "").replace(/,/g, "");
|
|
2694
2947
|
const frac = match2[2] ?? "";
|
|
@@ -2696,8 +2949,8 @@ function parsePlainNumber(text) {
|
|
|
2696
2949
|
const value2 = Number(`${int2 || "0"}${frac === "." ? "" : frac}${match2[3] ? `e${match2[3]}` : ""}`);
|
|
2697
2950
|
return Number.isFinite(value2) ? value2 : void 0;
|
|
2698
2951
|
}
|
|
2699
|
-
function parseTime2(
|
|
2700
|
-
const match2 = TIME_RE2.exec(
|
|
2952
|
+
function parseTime2(text2) {
|
|
2953
|
+
const match2 = TIME_RE2.exec(text2);
|
|
2701
2954
|
if (!match2) return void 0;
|
|
2702
2955
|
let hours = Number(match2[1]);
|
|
2703
2956
|
const minutes = Number(match2[2] ?? 0);
|
|
@@ -2720,28 +2973,28 @@ function serialOrUndefined(year, month, day) {
|
|
|
2720
2973
|
}
|
|
2721
2974
|
return ymdToSerial(year, month, day, currentDate1904());
|
|
2722
2975
|
}
|
|
2723
|
-
var fullYear2 = (
|
|
2724
|
-
const year = Number(
|
|
2725
|
-
if (
|
|
2976
|
+
var fullYear2 = (text2) => {
|
|
2977
|
+
const year = Number(text2);
|
|
2978
|
+
if (text2.length > 2) return year;
|
|
2726
2979
|
return year < 30 ? 2e3 + year : 1900 + year;
|
|
2727
2980
|
};
|
|
2728
|
-
function parseDate(
|
|
2981
|
+
function parseDate(text2) {
|
|
2729
2982
|
const thisYear = (/* @__PURE__ */ new Date()).getFullYear();
|
|
2730
|
-
let m = /^(\d{4})[-/](\d{1,2})[-/](\d{1,2})$/.exec(
|
|
2983
|
+
let m = /^(\d{4})[-/](\d{1,2})[-/](\d{1,2})$/.exec(text2);
|
|
2731
2984
|
if (m) return serialOrUndefined(Number(m[1]), Number(m[2]), Number(m[3]));
|
|
2732
|
-
m = /^(\d{1,2})\/(\d{1,2})(?:\/(\d{2}|\d{4}))?$/.exec(
|
|
2985
|
+
m = /^(\d{1,2})\/(\d{1,2})(?:\/(\d{2}|\d{4}))?$/.exec(text2);
|
|
2733
2986
|
if (m) return serialOrUndefined(m[3] ? fullYear2(m[3]) : thisYear, Number(m[1]), Number(m[2]));
|
|
2734
|
-
m = /^(\d{1,2})[-\s]([a-z]+)\.?(?:[-\s,]+(\d{2}|\d{4}))?$/i.exec(
|
|
2987
|
+
m = /^(\d{1,2})[-\s]([a-z]+)\.?(?:[-\s,]+(\d{2}|\d{4}))?$/i.exec(text2);
|
|
2735
2988
|
if (m) {
|
|
2736
2989
|
const month = monthFromName2(m[2] ?? "");
|
|
2737
2990
|
if (month) return serialOrUndefined(m[3] ? fullYear2(m[3]) : thisYear, month, Number(m[1]));
|
|
2738
2991
|
}
|
|
2739
|
-
m = /^([a-z]+)\.?[-\s](\d{1,2})(?:,?\s*(\d{4}))?$/i.exec(
|
|
2992
|
+
m = /^([a-z]+)\.?[-\s](\d{1,2})(?:,?\s*(\d{4}))?$/i.exec(text2);
|
|
2740
2993
|
if (m) {
|
|
2741
2994
|
const month = monthFromName2(m[1] ?? "");
|
|
2742
2995
|
if (month) return serialOrUndefined(m[3] ? Number(m[3]) : thisYear, month, Number(m[2]));
|
|
2743
2996
|
}
|
|
2744
|
-
m = /^([a-z]+)\.?[-\s](\d{4})$/i.exec(
|
|
2997
|
+
m = /^([a-z]+)\.?[-\s](\d{4})$/i.exec(text2);
|
|
2745
2998
|
if (m) {
|
|
2746
2999
|
const month = monthFromName2(m[1] ?? "");
|
|
2747
3000
|
if (month) return serialOrUndefined(Number(m[2]), month, 1);
|
|
@@ -2749,43 +3002,43 @@ function parseDate(text) {
|
|
|
2749
3002
|
return void 0;
|
|
2750
3003
|
}
|
|
2751
3004
|
function parseNumberText(input) {
|
|
2752
|
-
let
|
|
2753
|
-
if (
|
|
3005
|
+
let text2 = input.trim();
|
|
3006
|
+
if (text2 === "") return void 0;
|
|
2754
3007
|
let scale2 = 1;
|
|
2755
|
-
if (
|
|
3008
|
+
if (text2.endsWith("%")) {
|
|
2756
3009
|
scale2 = 0.01;
|
|
2757
|
-
|
|
3010
|
+
text2 = text2.slice(0, -1).trimEnd();
|
|
2758
3011
|
}
|
|
2759
3012
|
let sign2 = 1;
|
|
2760
|
-
if (
|
|
3013
|
+
if (text2.startsWith("(") && text2.endsWith(")")) {
|
|
2761
3014
|
sign2 = -1;
|
|
2762
|
-
|
|
3015
|
+
text2 = text2.slice(1, -1).trim();
|
|
2763
3016
|
}
|
|
2764
|
-
const signed = /^([+-]?)\s*\$?\s*([+-]?)\s*/.exec(
|
|
3017
|
+
const signed = /^([+-]?)\s*\$?\s*([+-]?)\s*/.exec(text2);
|
|
2765
3018
|
const signText = `${signed?.[1] ?? ""}${signed?.[2] ?? ""}`;
|
|
2766
3019
|
if (signText.length <= 1) {
|
|
2767
|
-
const body2 =
|
|
3020
|
+
const body2 = text2.slice(signed?.[0].length ?? 0);
|
|
2768
3021
|
const plain2 = parsePlainNumber(body2);
|
|
2769
3022
|
if (plain2 !== void 0) return (signText === "-" ? -1 : 1) * sign2 * plain2 * scale2;
|
|
2770
3023
|
}
|
|
2771
3024
|
if (scale2 !== 1 || sign2 !== 1) return void 0;
|
|
2772
|
-
const fraction = /^([+-]?)(?:(\d+)\s+)?(\d+)\/(\d+)$/.exec(
|
|
3025
|
+
const fraction = /^([+-]?)(?:(\d+)\s+)?(\d+)\/(\d+)$/.exec(text2);
|
|
2773
3026
|
if (fraction && fraction[2] !== void 0) {
|
|
2774
3027
|
const den = Number(fraction[4]);
|
|
2775
3028
|
if (den === 0) return void 0;
|
|
2776
3029
|
const value2 = Number(fraction[2]) + Number(fraction[3]) / den;
|
|
2777
3030
|
return fraction[1] === "-" ? -value2 : value2;
|
|
2778
3031
|
}
|
|
2779
|
-
const time = parseTime2(
|
|
3032
|
+
const time = parseTime2(text2);
|
|
2780
3033
|
if (time !== void 0) return time;
|
|
2781
|
-
const date = parseDate(
|
|
3034
|
+
const date = parseDate(text2);
|
|
2782
3035
|
if (date !== void 0) return date;
|
|
2783
|
-
const space =
|
|
3036
|
+
const space = text2.lastIndexOf(" ");
|
|
2784
3037
|
if (space > 0) {
|
|
2785
|
-
const datePart2 = parseDate(
|
|
2786
|
-
const timePart = parseTime2(
|
|
3038
|
+
const datePart2 = parseDate(text2.slice(0, space).trim());
|
|
3039
|
+
const timePart = parseTime2(text2.slice(space + 1).trim());
|
|
2787
3040
|
if (datePart2 !== void 0 && timePart !== void 0) return datePart2 + timePart;
|
|
2788
|
-
const amPm = /^(.*\S)\s+(\S+\s*(?:am|pm))$/i.exec(
|
|
3041
|
+
const amPm = /^(.*\S)\s+(\S+\s*(?:am|pm))$/i.exec(text2);
|
|
2789
3042
|
if (amPm) {
|
|
2790
3043
|
const d = parseDate(amPm[1] ?? "");
|
|
2791
3044
|
const t = parseTime2(amPm[2] ?? "");
|
|
@@ -3109,8 +3362,8 @@ function wildcardRegex(pattern) {
|
|
|
3109
3362
|
}
|
|
3110
3363
|
return new RegExp(`^${source}$`, "i");
|
|
3111
3364
|
}
|
|
3112
|
-
var escapeRegex = (
|
|
3113
|
-
var hasWildcards = (
|
|
3365
|
+
var escapeRegex = (text2) => text2.replace(/[.*+?^${}()|[\]\\/]/g, "\\$&");
|
|
3366
|
+
var hasWildcards = (text2) => /[*?~]/.test(text2);
|
|
3114
3367
|
function makeCriteria(criteria) {
|
|
3115
3368
|
if (isError(criteria)) return (value2) => isError(value2) && value2.error === criteria.error;
|
|
3116
3369
|
if (typeof criteria === "number") {
|
|
@@ -4362,22 +4615,22 @@ var NUMBER = String.raw`(?:\d+\.?\d*|\.\d+)(?:[eE][+-]?\d+)?`;
|
|
|
4362
4615
|
var REAL_ONLY = new RegExp(`^([+-]?${NUMBER})$`);
|
|
4363
4616
|
var IMAGINARY_ONLY = new RegExp(`^([+-]?(?:${NUMBER})?)([ij])$`);
|
|
4364
4617
|
var BOTH = new RegExp(`^([+-]?${NUMBER})([+-])((?:${NUMBER})?)([ij])$`);
|
|
4365
|
-
var coefficient = (
|
|
4618
|
+
var coefficient = (text2) => text2 === "" || text2 === "+" ? 1 : text2 === "-" ? -1 : Number(text2);
|
|
4366
4619
|
function parseComplex(value2) {
|
|
4367
4620
|
if (isError(value2)) fail(value2);
|
|
4368
4621
|
if (typeof value2 === "number") return { re: value2, im: 0, suffix: "i" };
|
|
4369
|
-
const
|
|
4370
|
-
if (
|
|
4371
|
-
const real = REAL_ONLY.exec(
|
|
4622
|
+
const text2 = toText(value2);
|
|
4623
|
+
if (text2 === "") return { re: 0, im: 0, suffix: "i" };
|
|
4624
|
+
const real = REAL_ONLY.exec(text2);
|
|
4372
4625
|
if (real) return { re: Number(real[1]), im: 0, suffix: "i" };
|
|
4373
|
-
const imaginary = IMAGINARY_ONLY.exec(
|
|
4626
|
+
const imaginary = IMAGINARY_ONLY.exec(text2);
|
|
4374
4627
|
if (imaginary)
|
|
4375
4628
|
return {
|
|
4376
4629
|
re: 0,
|
|
4377
4630
|
im: coefficient(imaginary[1] ?? ""),
|
|
4378
4631
|
suffix: imaginary[2] === "j" ? "j" : "i"
|
|
4379
4632
|
};
|
|
4380
|
-
const both = BOTH.exec(
|
|
4633
|
+
const both = BOTH.exec(text2);
|
|
4381
4634
|
if (!both) return fail(ERR.NUM);
|
|
4382
4635
|
const sign2 = both[2] === "-" ? -1 : 1;
|
|
4383
4636
|
return {
|
|
@@ -4387,9 +4640,9 @@ function parseComplex(value2) {
|
|
|
4387
4640
|
};
|
|
4388
4641
|
}
|
|
4389
4642
|
function digits(n) {
|
|
4390
|
-
const
|
|
4391
|
-
const match2 = /^(-?[\d.]+)e([+-])(\d+)$/.exec(
|
|
4392
|
-
return match2 ? `${match2[1]}E${match2[2]}${(match2[3] ?? "").padStart(2, "0")}` :
|
|
4643
|
+
const text2 = Number(n.toPrecision(15)).toString();
|
|
4644
|
+
const match2 = /^(-?[\d.]+)e([+-])(\d+)$/.exec(text2);
|
|
4645
|
+
return match2 ? `${match2[1]}E${match2[2]}${(match2[3] ?? "").padStart(2, "0")}` : text2;
|
|
4393
4646
|
}
|
|
4394
4647
|
function formatComplex({ re, im, suffix }) {
|
|
4395
4648
|
const r = Math.abs(re) < 1e-15 * Math.max(1, Math.abs(im)) ? 0 : re;
|
|
@@ -4741,15 +4994,15 @@ var C7 = "Engineering";
|
|
|
4741
4994
|
var BASES = { BIN: 2, OCT: 8, DEC: 10, HEX: 16 };
|
|
4742
4995
|
var BITS = { BIN: 10, OCT: 30, DEC: 0, HEX: 40 };
|
|
4743
4996
|
function parseBase(value2, base) {
|
|
4744
|
-
const
|
|
4997
|
+
const text2 = toText(scalar(value2)).trim().toUpperCase();
|
|
4745
4998
|
if (base === "DEC") return Math.trunc(num(value2));
|
|
4746
4999
|
const radix = BASES[base];
|
|
4747
5000
|
const digits2 = radix === 2 ? /^[01]{1,10}$/ : radix === 8 ? /^[0-7]{1,10}$/ : /^[0-9A-F]{1,10}$/;
|
|
4748
|
-
if (
|
|
4749
|
-
if (!digits2.test(
|
|
4750
|
-
let n = parseInt(
|
|
5001
|
+
if (text2 === "") return 0;
|
|
5002
|
+
if (!digits2.test(text2)) fail(ERR.NUM);
|
|
5003
|
+
let n = parseInt(text2, radix);
|
|
4751
5004
|
const bits = BITS[base];
|
|
4752
|
-
if (
|
|
5005
|
+
if (text2.length === 10 && n >= Math.pow(2, bits - 1)) n -= Math.pow(2, bits);
|
|
4753
5006
|
return n;
|
|
4754
5007
|
}
|
|
4755
5008
|
function formatBase(n, base, places) {
|
|
@@ -4758,10 +5011,10 @@ function formatBase(n, base, places) {
|
|
|
4758
5011
|
const limit2 = Math.pow(2, bits - 1);
|
|
4759
5012
|
if (n < -limit2 || n >= limit2) fail(ERR.NUM);
|
|
4760
5013
|
if (n < 0) return (Math.pow(2, bits) + n).toString(radix).toUpperCase();
|
|
4761
|
-
const
|
|
4762
|
-
if (places === void 0) return
|
|
4763
|
-
if (places <
|
|
4764
|
-
return
|
|
5014
|
+
const text2 = n.toString(radix).toUpperCase();
|
|
5015
|
+
if (places === void 0) return text2;
|
|
5016
|
+
if (places < text2.length || places > 10) fail(ERR.NUM);
|
|
5017
|
+
return text2.padStart(Math.trunc(places), "0");
|
|
4765
5018
|
}
|
|
4766
5019
|
var conversions = [];
|
|
4767
5020
|
for (const from of Object.keys(BASES)) {
|
|
@@ -4896,9 +5149,9 @@ var ENGINEERING_FUNCTIONS = [
|
|
|
4896
5149
|
1,
|
|
4897
5150
|
1,
|
|
4898
5151
|
(args) => {
|
|
4899
|
-
const
|
|
4900
|
-
const negative =
|
|
4901
|
-
const body2 = negative ?
|
|
5152
|
+
const text2 = str(args[0]).trim().toUpperCase();
|
|
5153
|
+
const negative = text2.startsWith("-");
|
|
5154
|
+
const body2 = negative ? text2.slice(1) : text2;
|
|
4902
5155
|
if (!/^[MDCLXVI]*$/.test(body2)) fail(ERR.VALUE);
|
|
4903
5156
|
const value2 = { M: 1e3, D: 500, C: 100, L: 50, X: 10, V: 5, I: 1 };
|
|
4904
5157
|
let total2 = 0;
|
|
@@ -4932,11 +5185,11 @@ var ENGINEERING_FUNCTIONS = [
|
|
|
4932
5185
|
2,
|
|
4933
5186
|
2,
|
|
4934
5187
|
(args) => {
|
|
4935
|
-
const
|
|
5188
|
+
const text2 = str(args[0]).trim().toLowerCase();
|
|
4936
5189
|
const radix = Math.trunc(num(args[1]));
|
|
4937
5190
|
if (radix < 2 || radix > 36) fail(ERR.NUM);
|
|
4938
5191
|
let total2 = 0;
|
|
4939
|
-
for (const ch of
|
|
5192
|
+
for (const ch of text2) {
|
|
4940
5193
|
const d = parseInt(ch, 36);
|
|
4941
5194
|
if (Number.isNaN(d) || d >= radix) fail(ERR.NUM);
|
|
4942
5195
|
total2 = total2 * radix + d;
|
|
@@ -4973,14 +5226,14 @@ function couponFacts(settlement, maturity, frequency2, basis, ctx) {
|
|
|
4973
5226
|
const daysToNext = basis === 0 ? daysInPeriod - daysSincePrevious : basis === 4 ? days360(s, next, true, ctx) : next - s;
|
|
4974
5227
|
return { previous, next, count: count2, daysSincePrevious, daysInPeriod, daysToNext };
|
|
4975
5228
|
}
|
|
4976
|
-
var security = (name, description,
|
|
5229
|
+
var security = (name, description, pick3) => spec(
|
|
4977
5230
|
name,
|
|
4978
5231
|
C8,
|
|
4979
5232
|
`${name}(settlement, maturity, frequency, [basis])`,
|
|
4980
5233
|
description,
|
|
4981
5234
|
3,
|
|
4982
5235
|
4,
|
|
4983
|
-
(args, ctx) =>
|
|
5236
|
+
(args, ctx) => pick3(
|
|
4984
5237
|
couponFacts(
|
|
4985
5238
|
serialArg(args[0]),
|
|
4986
5239
|
serialArg(args[1]),
|
|
@@ -5796,8 +6049,10 @@ var FINANCIAL_FUNCTIONS = [
|
|
|
5796
6049
|
|
|
5797
6050
|
// xlsx/formula/references.ts
|
|
5798
6051
|
function sheetIndex(host, name) {
|
|
6052
|
+
const sheets = host.workbook.sheets;
|
|
6053
|
+
for (let i2 = 0; i2 < sheets.length; i2++) if (sheets[i2]?.name === name) return i2;
|
|
5799
6054
|
const lower2 = name.toLowerCase();
|
|
5800
|
-
return
|
|
6055
|
+
return sheets.findIndex((sheet) => sheet.name.toLowerCase() === lower2);
|
|
5801
6056
|
}
|
|
5802
6057
|
function prefixSheets(host, prefix, current) {
|
|
5803
6058
|
if (!prefix) return [current];
|
|
@@ -6857,15 +7112,15 @@ function offset(args) {
|
|
|
6857
7112
|
{ sheet: area.sheet, range: { start: { row: r1, col: c1 }, end: { row: r2, col: c2 } } }
|
|
6858
7113
|
]);
|
|
6859
7114
|
}
|
|
6860
|
-
function parseR1C1(
|
|
6861
|
-
const bang =
|
|
7115
|
+
function parseR1C1(text2, ctx) {
|
|
7116
|
+
const bang = text2.lastIndexOf("!");
|
|
6862
7117
|
let sheet = ctx.sheet;
|
|
6863
|
-
let body2 =
|
|
7118
|
+
let body2 = text2;
|
|
6864
7119
|
if (bang >= 0) {
|
|
6865
|
-
const name =
|
|
7120
|
+
const name = text2.slice(0, bang).replace(/^'(.*)'$/, "$1").replace(/''/g, "'");
|
|
6866
7121
|
sheet = sheetIndex(ctx.frame.host, name);
|
|
6867
7122
|
if (sheet < 0) return void 0;
|
|
6868
|
-
body2 =
|
|
7123
|
+
body2 = text2.slice(bang + 1);
|
|
6869
7124
|
}
|
|
6870
7125
|
const range2 = parseR1C1Range(body2, { row: ctx.row, col: ctx.col });
|
|
6871
7126
|
if (!range2) return void 0;
|
|
@@ -6928,9 +7183,9 @@ var REFERENCE_FUNCTIONS = [
|
|
|
6928
7183
|
1,
|
|
6929
7184
|
2,
|
|
6930
7185
|
(args, ctx) => {
|
|
6931
|
-
const
|
|
7186
|
+
const text2 = str(args[0]).trim();
|
|
6932
7187
|
const a1 = args.length > 1 ? bool(args[1]) : true;
|
|
6933
|
-
const ref = a1 ? ctx.parseReference(
|
|
7188
|
+
const ref = a1 ? ctx.parseReference(text2) : parseR1C1(text2, ctx);
|
|
6934
7189
|
return ref ?? ERR.REF;
|
|
6935
7190
|
},
|
|
6936
7191
|
void 0,
|
|
@@ -7301,13 +7556,13 @@ var numberKey = (n) => `n${round15(n)}`;
|
|
|
7301
7556
|
function equalityKey(criteria) {
|
|
7302
7557
|
if (typeof criteria === "number") return numberKey(criteria);
|
|
7303
7558
|
if (typeof criteria !== "string") return void 0;
|
|
7304
|
-
const
|
|
7305
|
-
if (/^(<|>)/.test(
|
|
7559
|
+
const text2 = criteria.startsWith("=") ? criteria.slice(1) : criteria;
|
|
7560
|
+
if (/^(<|>)/.test(text2) || text2 === "" || hasWildcards(text2) || text2.startsWith("#"))
|
|
7306
7561
|
return void 0;
|
|
7307
|
-
const upper2 =
|
|
7562
|
+
const upper2 = text2.toUpperCase();
|
|
7308
7563
|
if (upper2 === "TRUE" || upper2 === "FALSE") return void 0;
|
|
7309
|
-
const n = parseNumberText(
|
|
7310
|
-
return n !== void 0 ? numberKey(n) : `s${
|
|
7564
|
+
const n = parseNumberText(text2);
|
|
7565
|
+
return n !== void 0 ? numberKey(n) : `s${text2.toLowerCase()}`;
|
|
7311
7566
|
}
|
|
7312
7567
|
function valueKeys(value2, out) {
|
|
7313
7568
|
out.length = 0;
|
|
@@ -7367,9 +7622,9 @@ function readBlock(ctx, area, rows2, cols) {
|
|
|
7367
7622
|
if (host.readBlock) return host.readBlock(area.sheet, range2);
|
|
7368
7623
|
return Matrix.build(rows2, cols, (r, c) => ctx.readCell(area.sheet, row2 + r, col + c));
|
|
7369
7624
|
}
|
|
7370
|
-
function shapedMatrices(ctx, values2,
|
|
7625
|
+
function shapedMatrices(ctx, values2, sameShape2) {
|
|
7371
7626
|
let { rows: rows2, cols } = shapeOf(values2[0] ?? null);
|
|
7372
|
-
if (
|
|
7627
|
+
if (sameShape2) {
|
|
7373
7628
|
for (const value2 of values2) {
|
|
7374
7629
|
const shape2 = shapeOf(value2);
|
|
7375
7630
|
if (shape2.rows !== rows2 || shape2.cols !== cols) fail(ERR.VALUE);
|
|
@@ -7395,12 +7650,12 @@ function shapedMatrices(ctx, values2, sameShape) {
|
|
|
7395
7650
|
});
|
|
7396
7651
|
return { matrices, total: total2, block: rows2 * cols };
|
|
7397
7652
|
}
|
|
7398
|
-
function matchingCells(ctx, pairs, target2,
|
|
7653
|
+
function matchingCells(ctx, pairs, target2, sameShape2) {
|
|
7399
7654
|
const ranges = pairs.map((p) => p.range);
|
|
7400
7655
|
const { matrices, total: total2, block } = shapedMatrices(
|
|
7401
7656
|
ctx,
|
|
7402
7657
|
target2 === void 0 ? ranges : [...ranges, target2],
|
|
7403
|
-
|
|
7658
|
+
sameShape2
|
|
7404
7659
|
);
|
|
7405
7660
|
const tests = pairs.map((p) => makeCriteria(scalar(p.criteria)));
|
|
7406
7661
|
const values2 = matrices[matrices.length - 1];
|
|
@@ -7439,7 +7694,7 @@ function indexedCandidates(pairs, matrices) {
|
|
|
7439
7694
|
}
|
|
7440
7695
|
return void 0;
|
|
7441
7696
|
}
|
|
7442
|
-
var matchingValues = (ctx, pairs, target2,
|
|
7697
|
+
var matchingValues = (ctx, pairs, target2, sameShape2) => matchingCells(ctx, pairs, target2, sameShape2).values;
|
|
7443
7698
|
function criteriaPairs(args, from) {
|
|
7444
7699
|
if ((args.length - from) % 2 !== 0) fail(ERR.VALUE);
|
|
7445
7700
|
const pairs = [];
|
|
@@ -10413,12 +10668,12 @@ function fixed(value2, decimals2, commas) {
|
|
|
10413
10668
|
const d = Math.trunc(decimals2);
|
|
10414
10669
|
const rounded = roundTo(value2, d, "half");
|
|
10415
10670
|
const abs2 = Math.abs(rounded);
|
|
10416
|
-
let
|
|
10671
|
+
let text2 = abs2.toFixed(Math.max(0, Math.min(d, 99)));
|
|
10417
10672
|
if (commas) {
|
|
10418
|
-
const [int2 = "", frac] =
|
|
10419
|
-
|
|
10673
|
+
const [int2 = "", frac] = text2.split(".");
|
|
10674
|
+
text2 = int2.replace(/\B(?=(\d{3})+(?!\d))/g, ",") + (frac !== void 0 ? `.${frac}` : "");
|
|
10420
10675
|
}
|
|
10421
|
-
return rounded < 0 ? `-${
|
|
10676
|
+
return rounded < 0 ? `-${text2}` : text2;
|
|
10422
10677
|
}
|
|
10423
10678
|
var TEXT_CONVERT = [
|
|
10424
10679
|
spec(
|
|
@@ -10454,19 +10709,19 @@ var TEXT_CONVERT = [
|
|
|
10454
10709
|
(args) => {
|
|
10455
10710
|
const decimal = (args.length > 1 ? str(args[1]) : ".").charAt(0) || ".";
|
|
10456
10711
|
const group = (args.length > 2 ? str(args[2]) : ",").charAt(0) || ",";
|
|
10457
|
-
let
|
|
10458
|
-
if (
|
|
10712
|
+
let text2 = str(args[0]).replace(/\s+/g, "");
|
|
10713
|
+
if (text2 === "") return 0;
|
|
10459
10714
|
let percent = 0;
|
|
10460
|
-
while (
|
|
10715
|
+
while (text2.endsWith("%")) {
|
|
10461
10716
|
percent++;
|
|
10462
|
-
|
|
10717
|
+
text2 = text2.slice(0, -1);
|
|
10463
10718
|
}
|
|
10464
|
-
const decimalAt =
|
|
10465
|
-
if (decimalAt >= 0 &&
|
|
10466
|
-
|
|
10467
|
-
if (decimal !== ".")
|
|
10468
|
-
const value2 = Number(
|
|
10469
|
-
if (!/^[+-]?(\d+\.?\d*|\.\d+)(e[+-]?\d+)?$/i.test(
|
|
10719
|
+
const decimalAt = text2.indexOf(decimal);
|
|
10720
|
+
if (decimalAt >= 0 && text2.slice(decimalAt + 1).includes(group)) fail(ERR.VALUE);
|
|
10721
|
+
text2 = text2.split(group).join("");
|
|
10722
|
+
if (decimal !== ".") text2 = text2.replace(decimal, ".");
|
|
10723
|
+
const value2 = Number(text2);
|
|
10724
|
+
if (!/^[+-]?(\d+\.?\d*|\.\d+)(e[+-]?\d+)?$/i.test(text2) || !Number.isFinite(value2))
|
|
10470
10725
|
fail(ERR.VALUE);
|
|
10471
10726
|
return value2 / Math.pow(100, percent);
|
|
10472
10727
|
}
|
|
@@ -10489,8 +10744,8 @@ var TEXT_CONVERT = [
|
|
|
10489
10744
|
2,
|
|
10490
10745
|
(args) => {
|
|
10491
10746
|
const value2 = num(args[0]);
|
|
10492
|
-
const
|
|
10493
|
-
return value2 < 0 &&
|
|
10747
|
+
const text2 = fixed(Math.abs(value2), optNum(args, 1, 2), true);
|
|
10748
|
+
return value2 < 0 && text2.replace(/[0.,]/g, "") !== "" ? `($${text2})` : `$${text2}`;
|
|
10494
10749
|
}
|
|
10495
10750
|
),
|
|
10496
10751
|
spec("CHAR", C33, "CHAR(number)", "The character for a code (Windows-1252).", 1, 1, (args) => {
|
|
@@ -10499,9 +10754,9 @@ var TEXT_CONVERT = [
|
|
|
10499
10754
|
return String.fromCharCode(CP1252[n] ?? n);
|
|
10500
10755
|
}),
|
|
10501
10756
|
spec("CODE", C33, "CODE(text)", "The code of the first character (Windows-1252).", 1, 1, (args) => {
|
|
10502
|
-
const
|
|
10503
|
-
if (
|
|
10504
|
-
const code =
|
|
10757
|
+
const text2 = str(args[0]);
|
|
10758
|
+
if (text2 === "") fail(ERR.VALUE);
|
|
10759
|
+
const code = text2.charCodeAt(0);
|
|
10505
10760
|
return CP1252_REVERSE.get(code) ?? (code <= 255 ? code : 63);
|
|
10506
10761
|
}),
|
|
10507
10762
|
spec("UNICHAR", C33, "UNICHAR(number)", "The Unicode character for a code point.", 1, 1, (args) => {
|
|
@@ -10510,9 +10765,9 @@ var TEXT_CONVERT = [
|
|
|
10510
10765
|
return String.fromCodePoint(n);
|
|
10511
10766
|
}),
|
|
10512
10767
|
spec("UNICODE", C33, "UNICODE(text)", "The code point of the first character.", 1, 1, (args) => {
|
|
10513
|
-
const
|
|
10514
|
-
if (
|
|
10515
|
-
return
|
|
10768
|
+
const text2 = str(args[0]);
|
|
10769
|
+
if (text2 === "") fail(ERR.VALUE);
|
|
10770
|
+
return text2.codePointAt(0) ?? fail(ERR.VALUE);
|
|
10516
10771
|
}),
|
|
10517
10772
|
spec("T", C33, "T(value)", "The text of a value, or empty text.", 1, 1, (args) => {
|
|
10518
10773
|
const v = scalar(args[0]);
|
|
@@ -10536,37 +10791,37 @@ function lowerChar(ch, before, after) {
|
|
|
10536
10791
|
const points = [...low];
|
|
10537
10792
|
return points.length === 1 ? low : points[0] ?? ch;
|
|
10538
10793
|
}
|
|
10539
|
-
function mapChars(
|
|
10540
|
-
const chars = [...
|
|
10794
|
+
function mapChars(text2, fn) {
|
|
10795
|
+
const chars = [...text2];
|
|
10541
10796
|
let out = "";
|
|
10542
10797
|
for (let i2 = 0; i2 < chars.length; i2++) out += fn(chars[i2], i2, chars);
|
|
10543
10798
|
return out;
|
|
10544
10799
|
}
|
|
10545
|
-
var upper = (
|
|
10546
|
-
var lower = (
|
|
10547
|
-
var proper = (
|
|
10800
|
+
var upper = (text2) => mapChars(text2, upperChar);
|
|
10801
|
+
var lower = (text2) => mapChars(text2, (ch, i2, all2) => lowerChar(ch, all2[i2 - 1], all2[i2 + 1]));
|
|
10802
|
+
var proper = (text2) => mapChars(text2, (ch, i2, all2) => {
|
|
10548
10803
|
if (!isLetter(ch)) return ch;
|
|
10549
10804
|
const before = all2[i2 - 1];
|
|
10550
10805
|
return before !== void 0 && isLetter(before) ? lowerChar(ch, before, all2[i2 + 1]) : upperChar(ch);
|
|
10551
10806
|
});
|
|
10552
10807
|
var isHigh = (code) => code >= 55296 && code <= 56319;
|
|
10553
10808
|
var isLow = (code) => code >= 56320 && code <= 57343;
|
|
10554
|
-
function left(
|
|
10555
|
-
let end = Math.min(n,
|
|
10556
|
-
if (end > 0 && end <
|
|
10557
|
-
return
|
|
10809
|
+
function left(text2, n) {
|
|
10810
|
+
let end = Math.min(n, text2.length);
|
|
10811
|
+
if (end > 0 && end < text2.length && isHigh(text2.charCodeAt(end - 1))) end++;
|
|
10812
|
+
return text2.slice(0, end);
|
|
10558
10813
|
}
|
|
10559
|
-
function right(
|
|
10814
|
+
function right(text2, n) {
|
|
10560
10815
|
if (n <= 0) return "";
|
|
10561
|
-
let start = Math.max(0,
|
|
10562
|
-
if (start > 0 && isLow(
|
|
10563
|
-
return
|
|
10816
|
+
let start = Math.max(0, text2.length - n);
|
|
10817
|
+
if (start > 0 && isLow(text2.charCodeAt(start))) start--;
|
|
10818
|
+
return text2.slice(start);
|
|
10564
10819
|
}
|
|
10565
10820
|
|
|
10566
10821
|
// xlsx/formula/functions/text.ts
|
|
10567
10822
|
var C34 = "Text";
|
|
10568
10823
|
var MAX_TEXT = 32767;
|
|
10569
|
-
var limit = (
|
|
10824
|
+
var limit = (text2) => text2.length > MAX_TEXT ? fail(ERR.VALUE) : text2;
|
|
10570
10825
|
function find(args, insensitive) {
|
|
10571
10826
|
const needle = str(args[0]);
|
|
10572
10827
|
const haystack = str(args[1]);
|
|
@@ -10731,19 +10986,19 @@ var TEXT_FUNCTIONS = [
|
|
|
10731
10986
|
3,
|
|
10732
10987
|
4,
|
|
10733
10988
|
(args) => {
|
|
10734
|
-
const
|
|
10989
|
+
const text2 = str(args[0]);
|
|
10735
10990
|
const oldText = str(args[1]);
|
|
10736
10991
|
const newText = str(args[2]);
|
|
10737
|
-
if (oldText === "") return
|
|
10738
|
-
if (args.length < 4) return limit(
|
|
10992
|
+
if (oldText === "") return text2;
|
|
10993
|
+
if (args.length < 4) return limit(text2.split(oldText).join(newText));
|
|
10739
10994
|
const instance = Math.trunc(num(args[3]));
|
|
10740
10995
|
if (instance < 1) fail(ERR.VALUE);
|
|
10741
10996
|
let at = -1;
|
|
10742
10997
|
for (let i2 = 0; i2 < instance; i2++) {
|
|
10743
|
-
at =
|
|
10744
|
-
if (at < 0) return
|
|
10998
|
+
at = text2.indexOf(oldText, at + 1);
|
|
10999
|
+
if (at < 0) return text2;
|
|
10745
11000
|
}
|
|
10746
|
-
return limit(
|
|
11001
|
+
return limit(text2.slice(0, at) + newText + text2.slice(at + oldText.length));
|
|
10747
11002
|
}
|
|
10748
11003
|
),
|
|
10749
11004
|
...["REPLACE", "REPLACEB"].map(
|
|
@@ -10755,11 +11010,11 @@ var TEXT_FUNCTIONS = [
|
|
|
10755
11010
|
4,
|
|
10756
11011
|
4,
|
|
10757
11012
|
(args) => {
|
|
10758
|
-
const
|
|
11013
|
+
const text2 = str(args[0]);
|
|
10759
11014
|
const start = Math.trunc(num(args[1]));
|
|
10760
11015
|
const n = Math.trunc(num(args[2]));
|
|
10761
11016
|
if (start < 1 || n < 0) fail(ERR.VALUE);
|
|
10762
|
-
return limit(
|
|
11017
|
+
return limit(text2.slice(0, start - 1) + str(args[3]) + text2.slice(start - 1 + n));
|
|
10763
11018
|
}
|
|
10764
11019
|
)
|
|
10765
11020
|
),
|
|
@@ -10787,9 +11042,9 @@ var TEXT_FUNCTIONS = [
|
|
|
10787
11042
|
),
|
|
10788
11043
|
spec("REPT", C34, "REPT(text, number_times)", "Repeats a text.", 2, 2, (args) => {
|
|
10789
11044
|
const n = Math.trunc(num(args[1]));
|
|
10790
|
-
const
|
|
10791
|
-
if (n < 0 ||
|
|
10792
|
-
return
|
|
11045
|
+
const text2 = str(args[0]);
|
|
11046
|
+
if (n < 0 || text2.length * n > MAX_TEXT) fail(ERR.VALUE);
|
|
11047
|
+
return text2.repeat(n);
|
|
10793
11048
|
}),
|
|
10794
11049
|
spec(
|
|
10795
11050
|
"EXACT",
|
|
@@ -10813,8 +11068,8 @@ function compile(pattern, caseMode2, global) {
|
|
|
10813
11068
|
}
|
|
10814
11069
|
}
|
|
10815
11070
|
var caseMode = (args, index2) => optNum(args, index2, 0);
|
|
10816
|
-
function encodeUrl(
|
|
10817
|
-
return encodeURIComponent(
|
|
11071
|
+
function encodeUrl(text2) {
|
|
11072
|
+
return encodeURIComponent(text2).replace(
|
|
10818
11073
|
/[!'()*]/g,
|
|
10819
11074
|
(c) => `%${c.charCodeAt(0).toString(16).toUpperCase()}`
|
|
10820
11075
|
);
|
|
@@ -10859,15 +11114,15 @@ var TEXT_REGEX_FUNCTIONS = [
|
|
|
10859
11114
|
3,
|
|
10860
11115
|
5,
|
|
10861
11116
|
(args) => {
|
|
10862
|
-
const
|
|
11117
|
+
const text2 = str(args[0]);
|
|
10863
11118
|
const regex = compile(str(args[1]), caseMode(args, 4), true);
|
|
10864
11119
|
const replacement = str(args[2]);
|
|
10865
11120
|
const occurrence = args.length > 3 && args[3] !== null ? int(args[3]) : 0;
|
|
10866
|
-
if (occurrence === 0) return
|
|
10867
|
-
const matches2 = [...
|
|
11121
|
+
if (occurrence === 0) return text2.replace(regex, replacement);
|
|
11122
|
+
const matches2 = [...text2.matchAll(regex)];
|
|
10868
11123
|
const picked = occurrence > 0 ? matches2[occurrence - 1] : matches2.at(occurrence);
|
|
10869
|
-
if (!picked || picked.index === void 0) return
|
|
10870
|
-
return
|
|
11124
|
+
if (!picked || picked.index === void 0) return text2;
|
|
11125
|
+
return text2.slice(0, picked.index) + picked[0].replace(new RegExp(regex.source, regex.flags.replace("g", "")), replacement) + text2.slice(picked.index + picked[0].length);
|
|
10871
11126
|
}
|
|
10872
11127
|
)
|
|
10873
11128
|
];
|
|
@@ -10881,8 +11136,8 @@ function delimitersOf(ctx, value2) {
|
|
|
10881
11136
|
return toText(v);
|
|
10882
11137
|
});
|
|
10883
11138
|
}
|
|
10884
|
-
function occurrences(
|
|
10885
|
-
const hay = insensitive ?
|
|
11139
|
+
function occurrences(text2, delimiters, insensitive) {
|
|
11140
|
+
const hay = insensitive ? text2.toLowerCase() : text2;
|
|
10886
11141
|
const needles = delimiters.map((d) => insensitive ? d.toLowerCase() : d);
|
|
10887
11142
|
const out = [];
|
|
10888
11143
|
let i2 = 0;
|
|
@@ -10902,35 +11157,35 @@ function occurrences(text, delimiters, insensitive) {
|
|
|
10902
11157
|
return out;
|
|
10903
11158
|
}
|
|
10904
11159
|
function textAround(args, ctx, before) {
|
|
10905
|
-
const
|
|
11160
|
+
const text2 = str(args[0]);
|
|
10906
11161
|
const delimiters = delimitersOf(ctx, args[1]);
|
|
10907
11162
|
const instance = Math.trunc(optNum(args, 2, 1));
|
|
10908
11163
|
const insensitive = optNum(args, 3, 0) === 1;
|
|
10909
11164
|
const matchEnd = optBool(args, 4, false);
|
|
10910
11165
|
const notFound = args.length > 5 ? scalar(args[5]) ?? ERR.NA : ERR.NA;
|
|
10911
|
-
if (instance === 0 || Math.abs(instance) >
|
|
11166
|
+
if (instance === 0 || Math.abs(instance) > text2.length + 1) fail(ERR.VALUE);
|
|
10912
11167
|
if (delimiters.length === 0 || delimiters.every((d) => d === "")) {
|
|
10913
|
-
return before ? instance > 0 ? "" :
|
|
11168
|
+
return before ? instance > 0 ? "" : text2 : instance > 0 ? text2 : "";
|
|
10914
11169
|
}
|
|
10915
|
-
const found = occurrences(
|
|
11170
|
+
const found = occurrences(text2, delimiters, insensitive);
|
|
10916
11171
|
if (matchEnd) {
|
|
10917
|
-
if (instance > 0) found.push({ at:
|
|
11172
|
+
if (instance > 0) found.push({ at: text2.length, length: 0 });
|
|
10918
11173
|
else found.unshift({ at: 0, length: 0 });
|
|
10919
11174
|
}
|
|
10920
11175
|
const index2 = instance > 0 ? instance - 1 : found.length + instance;
|
|
10921
11176
|
const hit = found[index2];
|
|
10922
11177
|
if (!hit || index2 < 0) return notFound;
|
|
10923
|
-
return before ?
|
|
11178
|
+
return before ? text2.slice(0, hit.at) : text2.slice(hit.at + hit.length);
|
|
10924
11179
|
}
|
|
10925
|
-
function splitText(
|
|
10926
|
-
if (delimiters.length === 0) return [
|
|
11180
|
+
function splitText(text2, delimiters, insensitive, ignoreEmpty) {
|
|
11181
|
+
if (delimiters.length === 0) return [text2];
|
|
10927
11182
|
const parts = [];
|
|
10928
11183
|
let last = 0;
|
|
10929
|
-
for (const hit of occurrences(
|
|
10930
|
-
parts.push(
|
|
11184
|
+
for (const hit of occurrences(text2, delimiters, insensitive)) {
|
|
11185
|
+
parts.push(text2.slice(last, hit.at));
|
|
10931
11186
|
last = hit.at + hit.length;
|
|
10932
11187
|
}
|
|
10933
|
-
parts.push(
|
|
11188
|
+
parts.push(text2.slice(last));
|
|
10934
11189
|
return ignoreEmpty ? parts.filter((p) => p !== "") : parts;
|
|
10935
11190
|
}
|
|
10936
11191
|
function valueToText(value2, strict) {
|
|
@@ -10968,14 +11223,14 @@ var TEXT_EXTRA_FUNCTIONS = [
|
|
|
10968
11223
|
2,
|
|
10969
11224
|
6,
|
|
10970
11225
|
(args, ctx) => {
|
|
10971
|
-
const
|
|
11226
|
+
const text2 = str(ctx.toScalar(args[0] ?? null));
|
|
10972
11227
|
const colDelims = delimitersOf(ctx, args[1]);
|
|
10973
11228
|
const rowDelims = delimitersOf(ctx, args[2]);
|
|
10974
11229
|
const ignoreEmpty = args.length > 3 && args[3] !== null && Boolean(scalar(ctx.toScalar(args[3] ?? null)));
|
|
10975
11230
|
const insensitive = args.length > 4 && optNum([ctx.toScalar(args[4] ?? null)], 0, 0) === 1;
|
|
10976
11231
|
const pad4 = args.length > 5 ? ctx.toScalar(args[5] ?? null) : ERR.NA;
|
|
10977
11232
|
if (colDelims.length === 0 && rowDelims.length === 0) fail(ERR.VALUE);
|
|
10978
|
-
const rows2 = splitText(
|
|
11233
|
+
const rows2 = splitText(text2, rowDelims, insensitive, ignoreEmpty).map(
|
|
10979
11234
|
(line2) => splitText(line2, colDelims, insensitive, ignoreEmpty)
|
|
10980
11235
|
);
|
|
10981
11236
|
const width = rows2.reduce((w, r) => Math.max(w, r.length), 0);
|
|
@@ -11169,10 +11424,10 @@ function createContext(frame) {
|
|
|
11169
11424
|
scope ? { ...frame, scope, root: void 0 } : { ...frame, root: void 0 }
|
|
11170
11425
|
),
|
|
11171
11426
|
callLambda: (fn, args) => invokeLambda(fn, args, frame),
|
|
11172
|
-
parseReference(
|
|
11427
|
+
parseReference(text2) {
|
|
11173
11428
|
let ast;
|
|
11174
11429
|
try {
|
|
11175
|
-
ast = parseFormula(
|
|
11430
|
+
ast = parseFormula(text2.trim());
|
|
11176
11431
|
} catch (e) {
|
|
11177
11432
|
if (e instanceof FormulaError) return void 0;
|
|
11178
11433
|
throw e;
|
|
@@ -11333,7 +11588,7 @@ var REFERENCE_ARGUMENT = /* @__PURE__ */ new Set([
|
|
|
11333
11588
|
"AREAS",
|
|
11334
11589
|
"ISREF"
|
|
11335
11590
|
]);
|
|
11336
|
-
var
|
|
11591
|
+
var push2 = (c, area) => {
|
|
11337
11592
|
(c.dynamic > 0 ? c.dynamicDeps : c.deps).push(area);
|
|
11338
11593
|
};
|
|
11339
11594
|
function spans(areas) {
|
|
@@ -11359,7 +11614,7 @@ function visit(node, c) {
|
|
|
11359
11614
|
if (!sheets) return;
|
|
11360
11615
|
const range2 = specRange(node.ref);
|
|
11361
11616
|
const target2 = node.spill ? { start: range2.start, end: { ...range2.start } } : range2;
|
|
11362
|
-
for (const sheet of sheets)
|
|
11617
|
+
for (const sheet of sheets) push2(c, { sheet, range: target2 });
|
|
11363
11618
|
return;
|
|
11364
11619
|
}
|
|
11365
11620
|
case "name": {
|
|
@@ -11433,7 +11688,7 @@ function visitBinary(node, c) {
|
|
|
11433
11688
|
const list = c.dynamic > 0 ? c.dynamicDeps : c.deps;
|
|
11434
11689
|
const l = list[list.length - 2];
|
|
11435
11690
|
const r = list[list.length - 1];
|
|
11436
|
-
if (l && r && l.sheet === r.sheet)
|
|
11691
|
+
if (l && r && l.sheet === r.sheet) push2(c, spans([l, r])[0]);
|
|
11437
11692
|
continue;
|
|
11438
11693
|
}
|
|
11439
11694
|
const mentioned = [...c.deps.slice(staticStart), ...c.dynamicDeps.slice(dynamicStart)];
|
|
@@ -11449,7 +11704,7 @@ function addStructured(ref, c) {
|
|
|
11449
11704
|
sheet: c.sheet,
|
|
11450
11705
|
row: c.row,
|
|
11451
11706
|
col: c.col});
|
|
11452
|
-
if (value2 instanceof RefValue) for (const area of value2.areas)
|
|
11707
|
+
if (value2 instanceof RefValue) for (const area of value2.areas) push2(c, area);
|
|
11453
11708
|
}
|
|
11454
11709
|
function analyze(ast, host, sheet, row2, col) {
|
|
11455
11710
|
const c = {
|
|
@@ -11473,155 +11728,191 @@ function analyze(ast, host, sheet, row2, col) {
|
|
|
11473
11728
|
};
|
|
11474
11729
|
}
|
|
11475
11730
|
|
|
11476
|
-
// xlsx/formula/
|
|
11477
|
-
var
|
|
11478
|
-
|
|
11479
|
-
|
|
11480
|
-
|
|
11481
|
-
|
|
11482
|
-
|
|
11483
|
-
|
|
11731
|
+
// xlsx/formula/formula-shape.ts
|
|
11732
|
+
var isDigit4 = (code) => code >= 48 && code <= 57;
|
|
11733
|
+
function formulaShape(formula) {
|
|
11734
|
+
const starts = [];
|
|
11735
|
+
const ends = [];
|
|
11736
|
+
let hash = 2166136261;
|
|
11737
|
+
for (let i2 = 0; i2 < formula.length; i2++) {
|
|
11738
|
+
let code = formula.charCodeAt(i2);
|
|
11739
|
+
if (isDigit4(code)) {
|
|
11740
|
+
let j = i2 + 1;
|
|
11741
|
+
while (j < formula.length && isDigit4(formula.charCodeAt(j))) j++;
|
|
11742
|
+
starts.push(i2);
|
|
11743
|
+
ends.push(j);
|
|
11744
|
+
i2 = j - 1;
|
|
11745
|
+
code = 0;
|
|
11746
|
+
}
|
|
11747
|
+
hash = Math.imul(hash ^ code, 16777619);
|
|
11748
|
+
}
|
|
11749
|
+
return { hash: hash >>> 0, starts, ends };
|
|
11484
11750
|
}
|
|
11485
|
-
function
|
|
11486
|
-
let
|
|
11487
|
-
|
|
11488
|
-
return
|
|
11751
|
+
function sameText(a, from, b, at, length) {
|
|
11752
|
+
for (let k = 0; k < length; k++)
|
|
11753
|
+
if (a.charCodeAt(from + k) !== b.charCodeAt(at + k)) return false;
|
|
11754
|
+
return true;
|
|
11489
11755
|
}
|
|
11490
|
-
|
|
11491
|
-
|
|
11492
|
-
|
|
11493
|
-
|
|
11494
|
-
|
|
11495
|
-
|
|
11496
|
-
const
|
|
11497
|
-
|
|
11498
|
-
|
|
11499
|
-
|
|
11500
|
-
|
|
11756
|
+
function sameShape(a, as, b, bs) {
|
|
11757
|
+
const runs = as.starts.length;
|
|
11758
|
+
if (runs !== bs.starts.length) return false;
|
|
11759
|
+
let fromA = 0;
|
|
11760
|
+
let fromB = 0;
|
|
11761
|
+
for (let i2 = 0; i2 <= runs; i2++) {
|
|
11762
|
+
const toA = i2 < runs ? as.starts[i2] : a.length;
|
|
11763
|
+
const toB = i2 < runs ? bs.starts[i2] : b.length;
|
|
11764
|
+
if (toA - fromA !== toB - fromB || !sameText(a, fromA, b, fromB, toA - fromA)) return false;
|
|
11765
|
+
fromA = as.ends[i2] ?? 0;
|
|
11766
|
+
fromB = bs.ends[i2] ?? 0;
|
|
11767
|
+
}
|
|
11768
|
+
return true;
|
|
11769
|
+
}
|
|
11770
|
+
function makeTemplate(formula, shape2) {
|
|
11771
|
+
let tokens;
|
|
11772
|
+
let ast;
|
|
11773
|
+
try {
|
|
11774
|
+
tokens = tokenize(formula);
|
|
11775
|
+
ast = parseTokens(tokens);
|
|
11776
|
+
} catch (e) {
|
|
11777
|
+
if (e instanceof RangeError) return new FormulaError(e.message, -1, "#VALUE!");
|
|
11778
|
+
if (e instanceof FormulaError) return e;
|
|
11779
|
+
throw e;
|
|
11780
|
+
}
|
|
11781
|
+
const { starts } = shape2;
|
|
11782
|
+
const slotted = starts.map(() => false);
|
|
11783
|
+
const refs = /* @__PURE__ */ new Map();
|
|
11784
|
+
let run = 0;
|
|
11785
|
+
for (const token of tokens) {
|
|
11786
|
+
const end = token.start + token.text.length;
|
|
11787
|
+
const first2 = run;
|
|
11788
|
+
while (run < starts.length && starts[run] < end) run++;
|
|
11789
|
+
const ref = token.kind === "ref" ? token.ref : void 0;
|
|
11790
|
+
if (!ref || ref.kind === "cols") continue;
|
|
11791
|
+
const count2 = ref.kind === "cell" ? 1 : 2;
|
|
11792
|
+
if (run - first2 < count2) continue;
|
|
11793
|
+
const at = run - count2;
|
|
11794
|
+
const indexes2 = count2 === 1 ? [at] : [at, at + 1];
|
|
11795
|
+
if (indexes2.some((i2) => formula.charCodeAt(starts[i2]) === 48)) continue;
|
|
11796
|
+
for (const i2 of indexes2) slotted[i2] = true;
|
|
11797
|
+
refs.set(ref, count2 === 1 ? { start: at } : { start: at, end: at + 1 });
|
|
11798
|
+
}
|
|
11799
|
+
return { formula, shape: shape2, ast, slotted, refs };
|
|
11800
|
+
}
|
|
11801
|
+
function rowsFor(t, formula, shape2) {
|
|
11802
|
+
if (!sameShape(t.formula, t.shape, formula, shape2)) return void 0;
|
|
11803
|
+
const rows2 = [];
|
|
11804
|
+
for (let i2 = 0; i2 < shape2.starts.length; i2++) {
|
|
11805
|
+
const start = shape2.starts[i2];
|
|
11806
|
+
const length = shape2.ends[i2] - start;
|
|
11807
|
+
if (!t.slotted[i2]) {
|
|
11808
|
+
const own = t.shape.starts[i2];
|
|
11809
|
+
if (t.shape.ends[i2] - own !== length) return void 0;
|
|
11810
|
+
if (!sameText(t.formula, own, formula, start, length)) return void 0;
|
|
11811
|
+
rows2.push(-1);
|
|
11812
|
+
continue;
|
|
11501
11813
|
}
|
|
11502
|
-
|
|
11503
|
-
|
|
11504
|
-
|
|
11505
|
-
|
|
11506
|
-
|
|
11507
|
-
|
|
11814
|
+
if (length > 7 || formula.charCodeAt(start) === 48) return void 0;
|
|
11815
|
+
let row2 = 0;
|
|
11816
|
+
for (let k = start; k < start + length; k++) row2 = row2 * 10 + formula.charCodeAt(k) - 48;
|
|
11817
|
+
if (row2 < 1 || row2 > MAX_ROW + 1) return void 0;
|
|
11818
|
+
rows2.push(row2 - 1);
|
|
11819
|
+
}
|
|
11820
|
+
return rows2;
|
|
11821
|
+
}
|
|
11822
|
+
function shiftSpec(spec2, slots, rows2) {
|
|
11823
|
+
const startRow = rows2[slots.start];
|
|
11824
|
+
const endRow = slots.end === void 0 ? startRow : rows2[slots.end];
|
|
11825
|
+
if (startRow === spec2.start.row && endRow === spec2.end.row) return spec2;
|
|
11826
|
+
const { start: from, end: to } = spec2;
|
|
11827
|
+
const start = { row: startRow, col: from.col, rowAbs: from.rowAbs, colAbs: from.colAbs };
|
|
11828
|
+
if (slots.end === void 0) return { kind: spec2.kind, start, end: start };
|
|
11829
|
+
const end = { row: endRow, col: to.col, rowAbs: to.rowAbs, colAbs: to.colAbs };
|
|
11830
|
+
return { kind: spec2.kind, start, end };
|
|
11831
|
+
}
|
|
11832
|
+
function copyTree(node, t, rows2) {
|
|
11833
|
+
switch (node.type) {
|
|
11834
|
+
case "ref": {
|
|
11835
|
+
const slots = node.ref ? t.refs.get(node.ref) : void 0;
|
|
11836
|
+
if (!slots || !node.ref) return node;
|
|
11837
|
+
const ref = shiftSpec(node.ref, slots, rows2);
|
|
11838
|
+
if (ref === node.ref) return node;
|
|
11839
|
+
const copy2 = { type: "ref" };
|
|
11840
|
+
if (node.prefix) copy2.prefix = node.prefix;
|
|
11841
|
+
copy2.ref = ref;
|
|
11842
|
+
if (node.spill) copy2.spill = true;
|
|
11843
|
+
return copy2;
|
|
11508
11844
|
}
|
|
11509
|
-
|
|
11510
|
-
|
|
11511
|
-
|
|
11512
|
-
|
|
11513
|
-
|
|
11514
|
-
return;
|
|
11845
|
+
case "unary":
|
|
11846
|
+
case "percent": {
|
|
11847
|
+
const operand4 = copyTree(node.operand, t, rows2);
|
|
11848
|
+
if (operand4 === node.operand) return node;
|
|
11849
|
+
return node.type === "unary" ? { type: "unary", op: node.op, operand: operand4 } : { type: "percent", operand: operand4 };
|
|
11515
11850
|
}
|
|
11516
|
-
|
|
11517
|
-
|
|
11518
|
-
|
|
11519
|
-
if (
|
|
11520
|
-
|
|
11851
|
+
case "binary": {
|
|
11852
|
+
const left2 = copyTree(node.left, t, rows2);
|
|
11853
|
+
const right2 = copyTree(node.right, t, rows2);
|
|
11854
|
+
if (left2 === node.left && right2 === node.right) return node;
|
|
11855
|
+
return { type: "binary", op: node.op, left: left2, right: right2 };
|
|
11856
|
+
}
|
|
11857
|
+
case "call": {
|
|
11858
|
+
const args = copyAll(node.args, t, rows2);
|
|
11859
|
+
if (args === node.args) return node;
|
|
11860
|
+
return { type: "call", name: node.name, rawName: node.rawName, args };
|
|
11861
|
+
}
|
|
11862
|
+
case "invoke": {
|
|
11863
|
+
const callee = copyTree(node.callee, t, rows2);
|
|
11864
|
+
const args = copyAll(node.args, t, rows2);
|
|
11865
|
+
if (callee === node.callee && args === node.args) return node;
|
|
11866
|
+
return { type: "invoke", callee, args };
|
|
11521
11867
|
}
|
|
11868
|
+
default:
|
|
11869
|
+
return node;
|
|
11522
11870
|
}
|
|
11523
|
-
|
|
11524
|
-
|
|
11525
|
-
|
|
11526
|
-
|
|
11527
|
-
|
|
11871
|
+
}
|
|
11872
|
+
function copyAll(nodes, t, rows2) {
|
|
11873
|
+
let out;
|
|
11874
|
+
for (let i2 = 0; i2 < nodes.length; i2++) {
|
|
11875
|
+
const node = nodes[i2];
|
|
11876
|
+
const copy2 = copyTree(node, t, rows2);
|
|
11877
|
+
if (copy2 !== node && !out) out = nodes.slice(0, i2);
|
|
11878
|
+
out?.push(copy2);
|
|
11879
|
+
}
|
|
11880
|
+
return out ?? nodes;
|
|
11881
|
+
}
|
|
11882
|
+
function fromTemplate(t, formula, shape2) {
|
|
11883
|
+
const rows2 = rowsFor(t, formula, shape2);
|
|
11884
|
+
return rows2 ? copyTree(t.ast, t, rows2) : void 0;
|
|
11885
|
+
}
|
|
11886
|
+
|
|
11887
|
+
// xlsx/formula/parse-cache.ts
|
|
11888
|
+
var MAX_TEMPLATE_LENGTH = 2048;
|
|
11889
|
+
var MAX_ENTRIES = 1e5;
|
|
11890
|
+
var MAX_TEMPLATES = 1e4;
|
|
11891
|
+
var NO_RUNS = { hash: 0, starts: [], ends: [] };
|
|
11892
|
+
var treeOf = (made) => "ast" in made ? made.ast : made;
|
|
11893
|
+
var ParseCache = class {
|
|
11894
|
+
byText = /* @__PURE__ */ new Map();
|
|
11895
|
+
templates = /* @__PURE__ */ new Map();
|
|
11896
|
+
parse(formula) {
|
|
11897
|
+
let ast = this.byText.get(formula);
|
|
11898
|
+
if (ast) return ast;
|
|
11899
|
+
ast = this.parseNew(formula);
|
|
11900
|
+
if (this.byText.size > MAX_ENTRIES) this.byText.clear();
|
|
11901
|
+
this.byText.set(formula, ast);
|
|
11902
|
+
return ast;
|
|
11528
11903
|
}
|
|
11529
|
-
|
|
11530
|
-
|
|
11531
|
-
const
|
|
11532
|
-
|
|
11533
|
-
|
|
11534
|
-
|
|
11535
|
-
|
|
11536
|
-
|
|
11537
|
-
|
|
11538
|
-
|
|
11539
|
-
if (size <= 4096) {
|
|
11540
|
-
for (let r = start.row; r <= end.row; r++) {
|
|
11541
|
-
for (let c = start.col; c <= end.col; c++) {
|
|
11542
|
-
const list = cells.get(cellKey(r, c));
|
|
11543
|
-
if (list) for (const node of list) out.add(node);
|
|
11544
|
-
}
|
|
11545
|
-
}
|
|
11546
|
-
} else {
|
|
11547
|
-
for (const [key, list] of cells) {
|
|
11548
|
-
const { row: row2, col } = keyToAddress(key);
|
|
11549
|
-
if (row2 >= start.row && row2 <= end.row && col >= start.col && col <= end.col)
|
|
11550
|
-
for (const node of list) out.add(node);
|
|
11551
|
-
}
|
|
11552
|
-
}
|
|
11553
|
-
}
|
|
11554
|
-
const columns = (map, visit2) => {
|
|
11555
|
-
if (!map) return;
|
|
11556
|
-
if (end.col - start.col + 1 <= map.size) {
|
|
11557
|
-
for (let c = start.col; c <= end.col; c++) if (map.has(c)) visit2(c);
|
|
11558
|
-
} else for (const c of map.keys()) if (c >= start.col && c <= end.col) visit2(c);
|
|
11559
|
-
};
|
|
11560
|
-
const chunked = this.chunked.get(sheet);
|
|
11561
|
-
const first2 = start.row >> CHUNK_SHIFT;
|
|
11562
|
-
const last = end.row >> CHUNK_SHIFT;
|
|
11563
|
-
columns(chunked, (c) => {
|
|
11564
|
-
const chunks = chunked?.get(c);
|
|
11565
|
-
if (last - first2 + 1 <= chunks.size) {
|
|
11566
|
-
for (let k = first2; k <= last; k++) check3(chunks.get(k));
|
|
11567
|
-
} else for (const [k, list] of chunks) if (k >= first2 && k <= last) check3(list);
|
|
11568
|
-
});
|
|
11569
|
-
const tall = this.tall.get(sheet);
|
|
11570
|
-
columns(tall, (c) => check3(tall?.get(c)));
|
|
11571
|
-
check3(this.wide.get(sheet));
|
|
11572
|
-
}
|
|
11573
|
-
};
|
|
11574
|
-
|
|
11575
|
-
// xlsx/formula/graph-index.ts
|
|
11576
|
-
var ColumnIndex = class {
|
|
11577
|
-
sheets = /* @__PURE__ */ new Map();
|
|
11578
|
-
constructor(nodes) {
|
|
11579
|
-
for (const node of nodes) {
|
|
11580
|
-
let cols = this.sheets.get(node.sheet);
|
|
11581
|
-
if (!cols) this.sheets.set(node.sheet, cols = /* @__PURE__ */ new Map());
|
|
11582
|
-
let list = cols.get(node.col);
|
|
11583
|
-
if (!list) cols.set(node.col, list = []);
|
|
11584
|
-
list.push(node);
|
|
11585
|
-
}
|
|
11586
|
-
for (const cols of this.sheets.values())
|
|
11587
|
-
for (const list of cols.values()) list.sort((a, b) => a.row - b.row);
|
|
11588
|
-
}
|
|
11589
|
-
nodesIn(area, out) {
|
|
11590
|
-
const cols = this.sheets.get(area.sheet);
|
|
11591
|
-
if (!cols) return;
|
|
11592
|
-
const { start, end } = area.range;
|
|
11593
|
-
const width = end.col - start.col + 1;
|
|
11594
|
-
const scan2 = (list) => {
|
|
11595
|
-
let lo = 0;
|
|
11596
|
-
let hi = list.length;
|
|
11597
|
-
while (lo < hi) {
|
|
11598
|
-
const mid = lo + hi >> 1;
|
|
11599
|
-
if (list[mid].row < start.row) lo = mid + 1;
|
|
11600
|
-
else hi = mid;
|
|
11601
|
-
}
|
|
11602
|
-
for (let i2 = lo; i2 < list.length; i2++) {
|
|
11603
|
-
const node = list[i2];
|
|
11604
|
-
if (node.row > end.row) break;
|
|
11605
|
-
out.push(node);
|
|
11606
|
-
}
|
|
11607
|
-
};
|
|
11608
|
-
if (width <= cols.size) {
|
|
11609
|
-
for (let c = start.col; c <= end.col; c++) {
|
|
11610
|
-
const list = cols.get(c);
|
|
11611
|
-
if (list) scan2(list);
|
|
11612
|
-
}
|
|
11613
|
-
} else {
|
|
11614
|
-
for (const [c, list] of cols) if (c >= start.col && c <= end.col) scan2(list);
|
|
11615
|
-
}
|
|
11616
|
-
}
|
|
11617
|
-
};
|
|
11618
|
-
var ReverseIndex = class extends AreaIndex {
|
|
11619
|
-
constructor(nodes) {
|
|
11620
|
-
super();
|
|
11621
|
-
for (const node of nodes) {
|
|
11622
|
-
for (const dep of node.deps) this.add(dep, node);
|
|
11623
|
-
for (const dep of node.dynamicDeps) this.add(dep, node);
|
|
11904
|
+
parseNew(formula) {
|
|
11905
|
+
if (formula.length > MAX_TEMPLATE_LENGTH) return treeOf(makeTemplate(formula, NO_RUNS));
|
|
11906
|
+
const shape2 = formulaShape(formula);
|
|
11907
|
+
const template = this.templates.get(shape2.hash);
|
|
11908
|
+
const reused = template && fromTemplate(template, formula, shape2);
|
|
11909
|
+
if (reused) return reused;
|
|
11910
|
+
const made = makeTemplate(formula, shape2);
|
|
11911
|
+
if (!template && "ast" in made) {
|
|
11912
|
+
if (this.templates.size > MAX_TEMPLATES) this.templates.clear();
|
|
11913
|
+
this.templates.set(shape2.hash, made);
|
|
11624
11914
|
}
|
|
11915
|
+
return treeOf(made);
|
|
11625
11916
|
}
|
|
11626
11917
|
};
|
|
11627
11918
|
|
|
@@ -11761,7 +12052,7 @@ var EngineHost = class {
|
|
|
11761
12052
|
options;
|
|
11762
12053
|
nodes = /* @__PURE__ */ new Map();
|
|
11763
12054
|
footprints = /* @__PURE__ */ new Set();
|
|
11764
|
-
|
|
12055
|
+
parsed = new ParseCache();
|
|
11765
12056
|
boundsCache = /* @__PURE__ */ new Map();
|
|
11766
12057
|
inProgress = /* @__PURE__ */ new Set();
|
|
11767
12058
|
cycles = /* @__PURE__ */ new Set();
|
|
@@ -11785,6 +12076,8 @@ var EngineHost = class {
|
|
|
11785
12076
|
evaluations = 0;
|
|
11786
12077
|
built = false;
|
|
11787
12078
|
needsFull = false;
|
|
12079
|
+
/** No recalculation has run since the workbook was opened: stored values may stand. */
|
|
12080
|
+
fresh = true;
|
|
11788
12081
|
// ---- EvalHost ----
|
|
11789
12082
|
readCell(sheet, row2, col) {
|
|
11790
12083
|
const cell = this.workbook.sheets[sheet]?.rows.get(row2)?.get(col);
|
|
@@ -11873,19 +12166,7 @@ var EngineHost = class {
|
|
|
11873
12166
|
return this.workbook.sheets[sheet]?.rows.get(row2)?.get(col)?.formula;
|
|
11874
12167
|
}
|
|
11875
12168
|
parse(formula) {
|
|
11876
|
-
|
|
11877
|
-
if (!ast) {
|
|
11878
|
-
try {
|
|
11879
|
-
ast = parseFormula(formula);
|
|
11880
|
-
} catch (e) {
|
|
11881
|
-
if (e instanceof RangeError) ast = new FormulaError(e.message, -1, "#VALUE!");
|
|
11882
|
-
else if (!(e instanceof FormulaError)) throw e;
|
|
11883
|
-
else ast = e;
|
|
11884
|
-
}
|
|
11885
|
-
if (this.astCache.size > 1e5) this.astCache.clear();
|
|
11886
|
-
this.astCache.set(formula, ast);
|
|
11887
|
-
}
|
|
11888
|
-
return ast;
|
|
12169
|
+
return this.parsed.parse(formula);
|
|
11889
12170
|
}
|
|
11890
12171
|
now() {
|
|
11891
12172
|
return this.options.now ? this.options.now() : /* @__PURE__ */ new Date();
|
|
@@ -11894,20 +12175,6 @@ var EngineHost = class {
|
|
|
11894
12175
|
return this.options.random ? this.options.random() : Math.random();
|
|
11895
12176
|
}
|
|
11896
12177
|
// ---- graph ----
|
|
11897
|
-
build() {
|
|
11898
|
-
this.nodes.clear();
|
|
11899
|
-
this.footprints.clear();
|
|
11900
|
-
this.footprintIndex = void 0;
|
|
11901
|
-
this.workbook.sheets.forEach((sheet, s) => {
|
|
11902
|
-
for (const [row2, cells] of sheet.rows) {
|
|
11903
|
-
for (const [col, cell] of cells) {
|
|
11904
|
-
if (cell.formula) this.createNode(s, row2, col, cell, true);
|
|
11905
|
-
}
|
|
11906
|
-
}
|
|
11907
|
-
});
|
|
11908
|
-
this.built = true;
|
|
11909
|
-
this.graphChanged();
|
|
11910
|
-
}
|
|
11911
12178
|
createNode(sheet, row2, col, cell, initial) {
|
|
11912
12179
|
const formula = cell.formula ?? "";
|
|
11913
12180
|
const parsed = this.parse(formula);
|
|
@@ -11936,6 +12203,14 @@ var EngineHost = class {
|
|
|
11936
12203
|
map.set(cellKey(row2, col), node);
|
|
11937
12204
|
return node;
|
|
11938
12205
|
}
|
|
12206
|
+
/** Parses a node's text again after a structural edit rewrote it (see `FormulaNode.stale`). */
|
|
12207
|
+
refreshAst(node) {
|
|
12208
|
+
const parsed = this.parse(node.formula);
|
|
12209
|
+
delete node.stale;
|
|
12210
|
+
delete node.parseError;
|
|
12211
|
+
node.ast = parsed instanceof FormulaError ? void 0 : parsed;
|
|
12212
|
+
if (parsed instanceof FormulaError && parsed.code) node.parseError = err(parsed.code);
|
|
12213
|
+
}
|
|
11939
12214
|
removeNode(node, changed) {
|
|
11940
12215
|
const sheet = this.workbook.sheets[node.sheet];
|
|
11941
12216
|
if (node.spill && sheet) {
|
|
@@ -12366,6 +12641,7 @@ var EngineCore = class extends EngineHost {
|
|
|
12366
12641
|
return { host: this, sheet, row: row2, col, scope: void 0, depth: 0, root, legacy };
|
|
12367
12642
|
}
|
|
12368
12643
|
evaluateFormula(node) {
|
|
12644
|
+
if (node.stale) this.refreshAst(node);
|
|
12369
12645
|
if (!node.ast) return node.parseError ?? ERR.NAME;
|
|
12370
12646
|
const ast = node.ast;
|
|
12371
12647
|
const frame = this.frameFor(node.sheet, node.row, node.col, ast, node.legacy);
|
|
@@ -12383,22 +12659,371 @@ var EngineCore = class extends EngineHost {
|
|
|
12383
12659
|
}
|
|
12384
12660
|
};
|
|
12385
12661
|
|
|
12662
|
+
// xlsx/formula/shift-graph.ts
|
|
12663
|
+
var POSITIONAL = /* @__PURE__ */ new Set(["ROW", "COLUMN"]);
|
|
12664
|
+
var DESCRIPTIVE = /* @__PURE__ */ new Set(["FORMULATEXT", "CELL", "SHEET"]);
|
|
12665
|
+
var traitsCache = /* @__PURE__ */ new WeakMap();
|
|
12666
|
+
function astTraits(ast) {
|
|
12667
|
+
const cached = traitsCache.get(ast);
|
|
12668
|
+
if (cached) return cached;
|
|
12669
|
+
const sheets = /* @__PURE__ */ new Set();
|
|
12670
|
+
const traits = { complex: false, opaque: false, positional: false, descriptive: false, sheets };
|
|
12671
|
+
const stack2 = [ast];
|
|
12672
|
+
while (stack2.length) {
|
|
12673
|
+
const node = stack2.pop();
|
|
12674
|
+
switch (node.type) {
|
|
12675
|
+
case "ref":
|
|
12676
|
+
if (node.prefix) {
|
|
12677
|
+
sheets.add(node.prefix.sheet.toLowerCase());
|
|
12678
|
+
if (node.prefix.sheet2 !== void 0) {
|
|
12679
|
+
sheets.add(node.prefix.sheet2.toLowerCase());
|
|
12680
|
+
traits.complex = true;
|
|
12681
|
+
}
|
|
12682
|
+
}
|
|
12683
|
+
break;
|
|
12684
|
+
case "name":
|
|
12685
|
+
if (node.prefix) sheets.add(node.prefix.sheet.toLowerCase());
|
|
12686
|
+
traits.complex = true;
|
|
12687
|
+
break;
|
|
12688
|
+
case "structured":
|
|
12689
|
+
traits.complex = true;
|
|
12690
|
+
break;
|
|
12691
|
+
case "unary":
|
|
12692
|
+
case "percent":
|
|
12693
|
+
stack2.push(node.operand);
|
|
12694
|
+
break;
|
|
12695
|
+
case "binary":
|
|
12696
|
+
stack2.push(node.left, node.right);
|
|
12697
|
+
break;
|
|
12698
|
+
case "call":
|
|
12699
|
+
if (POSITIONAL.has(node.name)) traits.positional = true;
|
|
12700
|
+
if (DESCRIPTIVE.has(node.name)) traits.descriptive = true;
|
|
12701
|
+
if (!getFunction(node.name)) traits.complex = traits.opaque = true;
|
|
12702
|
+
stack2.push(...node.args);
|
|
12703
|
+
break;
|
|
12704
|
+
case "invoke":
|
|
12705
|
+
stack2.push(node.callee, ...node.args);
|
|
12706
|
+
break;
|
|
12707
|
+
}
|
|
12708
|
+
}
|
|
12709
|
+
traitsCache.set(ast, traits);
|
|
12710
|
+
return traits;
|
|
12711
|
+
}
|
|
12712
|
+
function intervalDelta(a, b, shift2) {
|
|
12713
|
+
const { at, count: count2 } = shift2;
|
|
12714
|
+
if (count2 > 0) {
|
|
12715
|
+
if (b < at) return 0;
|
|
12716
|
+
if (a < at) return void 0;
|
|
12717
|
+
return b + count2 > (shift2.axis === "row" ? MAX_ROW : MAX_COL) ? void 0 : count2;
|
|
12718
|
+
}
|
|
12719
|
+
const last = at - count2 - 1;
|
|
12720
|
+
if (b < at) return 0;
|
|
12721
|
+
if (a > last) return count2;
|
|
12722
|
+
return void 0;
|
|
12723
|
+
}
|
|
12724
|
+
function areaDelta(area, sheet, shift2) {
|
|
12725
|
+
if (area.sheet !== sheet) return 0;
|
|
12726
|
+
const { start, end } = area.range;
|
|
12727
|
+
return shift2.axis === "row" ? intervalDelta(start.row, end.row, shift2) : intervalDelta(start.col, end.col, shift2);
|
|
12728
|
+
}
|
|
12729
|
+
function movedRange(range2, axis, delta) {
|
|
12730
|
+
if (delta === 0) return range2;
|
|
12731
|
+
return axis === "row" ? {
|
|
12732
|
+
start: { row: range2.start.row + delta, col: range2.start.col },
|
|
12733
|
+
end: { row: range2.end.row + delta, col: range2.end.col }
|
|
12734
|
+
} : {
|
|
12735
|
+
start: { row: range2.start.row, col: range2.start.col + delta },
|
|
12736
|
+
end: { row: range2.end.row, col: range2.end.col + delta }
|
|
12737
|
+
};
|
|
12738
|
+
}
|
|
12739
|
+
function reachesEdit(areas, sheet, shift2) {
|
|
12740
|
+
for (const area of areas) {
|
|
12741
|
+
if (area.sheet !== sheet) continue;
|
|
12742
|
+
if ((shift2.axis === "row" ? area.range.end.row : area.range.end.col) >= shift2.at) return true;
|
|
12743
|
+
}
|
|
12744
|
+
return false;
|
|
12745
|
+
}
|
|
12746
|
+
function intersectionMoves(area, delta, pos, nodeDelta, axis) {
|
|
12747
|
+
if (delta === nodeDelta) return false;
|
|
12748
|
+
const { start, end } = area.range;
|
|
12749
|
+
const a = axis === "row" ? start.row : start.col;
|
|
12750
|
+
const b = axis === "row" ? end.row : end.col;
|
|
12751
|
+
if (a === b) return false;
|
|
12752
|
+
return pos >= a && pos <= b || pos + nodeDelta >= a + delta && pos + nodeDelta <= b + delta;
|
|
12753
|
+
}
|
|
12754
|
+
|
|
12755
|
+
// xlsx/formula/engine-structure.ts
|
|
12756
|
+
var sameAreas = (a, b) => a.length === b.length && a.every((x, i2) => {
|
|
12757
|
+
const y = b[i2];
|
|
12758
|
+
return x.sheet === y.sheet && sameRange(x.range, y.range);
|
|
12759
|
+
});
|
|
12760
|
+
var EngineStructure = class extends EngineCore {
|
|
12761
|
+
/** Formulas a structural edit left to recalculate (with their dependents) on the next pass. */
|
|
12762
|
+
structuralSeeds = /* @__PURE__ */ new Set();
|
|
12763
|
+
/** Whether the graph describes the workbook as it was before the edit just reported. */
|
|
12764
|
+
graphReady() {
|
|
12765
|
+
return this.built && !this.needsFull;
|
|
12766
|
+
}
|
|
12767
|
+
/** Parses a node's current text again and recomputes its precedents. */
|
|
12768
|
+
reanalyze(node) {
|
|
12769
|
+
const parsed = this.parse(node.formula);
|
|
12770
|
+
delete node.stale;
|
|
12771
|
+
delete node.parseError;
|
|
12772
|
+
if (parsed instanceof FormulaError) {
|
|
12773
|
+
node.ast = void 0;
|
|
12774
|
+
if (parsed.code) node.parseError = err(parsed.code);
|
|
12775
|
+
node.deps = [];
|
|
12776
|
+
node.dynamicDeps = [];
|
|
12777
|
+
return;
|
|
12778
|
+
}
|
|
12779
|
+
node.ast = parsed;
|
|
12780
|
+
const found = analyze(parsed, this, node.sheet, node.row, node.col);
|
|
12781
|
+
node.deps = found.deps;
|
|
12782
|
+
node.dynamicDeps = found.dynamicDeps;
|
|
12783
|
+
node.volatile = found.volatile;
|
|
12784
|
+
node.unsupported = found.unsupported;
|
|
12785
|
+
}
|
|
12786
|
+
/**
|
|
12787
|
+
* Moves the graph for rows or columns inserted or deleted on `sheet`, after the workbook was
|
|
12788
|
+
* changed (cells moved, formulas rewritten). Spills on the sheet, array formulas the edit cuts
|
|
12789
|
+
* and anything unexpected fall back to a rebuild on the next recalculation.
|
|
12790
|
+
*/
|
|
12791
|
+
shiftCells(sheet, shift2) {
|
|
12792
|
+
if (!this.graphReady() || !this.shiftable(sheet, shift2)) {
|
|
12793
|
+
this.invalidate();
|
|
12794
|
+
return;
|
|
12795
|
+
}
|
|
12796
|
+
const ws = this.workbook.sheets[sheet];
|
|
12797
|
+
const own = this.nodes.get(sheet);
|
|
12798
|
+
if (!ws) return;
|
|
12799
|
+
const moved = /* @__PURE__ */ new Map();
|
|
12800
|
+
if (own) {
|
|
12801
|
+
const next = /* @__PURE__ */ new Map();
|
|
12802
|
+
for (const node of own.values()) {
|
|
12803
|
+
const pos = shift2.axis === "row" ? node.row : node.col;
|
|
12804
|
+
const delta = intervalDelta(pos, pos, shift2);
|
|
12805
|
+
if (delta === void 0) {
|
|
12806
|
+
this.dropNode(node);
|
|
12807
|
+
continue;
|
|
12808
|
+
}
|
|
12809
|
+
if (delta !== 0) {
|
|
12810
|
+
moved.set(node, delta);
|
|
12811
|
+
if (shift2.axis === "row") node.row += delta;
|
|
12812
|
+
else node.col += delta;
|
|
12813
|
+
}
|
|
12814
|
+
next.set(cellKey(node.row, node.col), node);
|
|
12815
|
+
}
|
|
12816
|
+
this.nodes.set(sheet, next);
|
|
12817
|
+
}
|
|
12818
|
+
for (const map of this.nodes.values())
|
|
12819
|
+
for (const node of map.values()) {
|
|
12820
|
+
if (!this.shiftNode(node, sheet, shift2, moved.get(node) ?? 0)) {
|
|
12821
|
+
this.invalidate();
|
|
12822
|
+
return;
|
|
12823
|
+
}
|
|
12824
|
+
}
|
|
12825
|
+
this.boundsCache.clear();
|
|
12826
|
+
this.graphChanged();
|
|
12827
|
+
}
|
|
12828
|
+
/** No spill or stale spilled value on the sheet, and no array formula the edit cuts. */
|
|
12829
|
+
shiftable(sheet, shift2) {
|
|
12830
|
+
for (const node of this.footprints) {
|
|
12831
|
+
if (node.sheet !== sheet) continue;
|
|
12832
|
+
if (node.spill || node.blockedSpill) return false;
|
|
12833
|
+
if (node.arrayRange && areaDelta({ sheet, range: node.arrayRange }, sheet, shift2) === void 0)
|
|
12834
|
+
return false;
|
|
12835
|
+
}
|
|
12836
|
+
const ws = this.workbook.sheets[sheet];
|
|
12837
|
+
let spilled = false;
|
|
12838
|
+
ws?.rows.forEach((cells) => {
|
|
12839
|
+
if (!spilled) cells.forEach((cell) => spilled ||= isSpilledCell(cell));
|
|
12840
|
+
});
|
|
12841
|
+
return !spilled;
|
|
12842
|
+
}
|
|
12843
|
+
dropNode(node) {
|
|
12844
|
+
this.structuralSeeds.delete(node);
|
|
12845
|
+
this.cycles.delete(node);
|
|
12846
|
+
this.footprints.delete(node);
|
|
12847
|
+
}
|
|
12848
|
+
/** Updates one formula for the edit; false when the graph cannot follow it. */
|
|
12849
|
+
shiftNode(node, sheet, shift2, nodeDelta) {
|
|
12850
|
+
const cell = this.workbook.sheets[node.sheet]?.rows.get(node.row)?.get(node.col);
|
|
12851
|
+
if (cell?.formula === void 0) return false;
|
|
12852
|
+
if (node.arrayRange) {
|
|
12853
|
+
const delta = areaDelta({ sheet: node.sheet, range: node.arrayRange }, sheet, shift2);
|
|
12854
|
+
if (delta === void 0) return false;
|
|
12855
|
+
node.arrayRange = movedRange(node.arrayRange, shift2.axis, delta);
|
|
12856
|
+
if (!cell.arrayRange || !sameRange(node.arrayRange, normalizeRange(cell.arrayRange)))
|
|
12857
|
+
return false;
|
|
12858
|
+
}
|
|
12859
|
+
const changed = cell.formula !== node.formula;
|
|
12860
|
+
const traits = node.ast && astTraits(node.ast);
|
|
12861
|
+
const reached = reachesEdit(node.deps, sheet, shift2) || reachesEdit(node.dynamicDeps, sheet, shift2);
|
|
12862
|
+
if (!changed && !reached && nodeDelta === 0 && !traits?.descriptive && !traits?.opaque)
|
|
12863
|
+
return true;
|
|
12864
|
+
if (traits?.complex) {
|
|
12865
|
+
node.formula = cell.formula;
|
|
12866
|
+
this.reanalyze(node);
|
|
12867
|
+
this.structuralSeeds.add(node);
|
|
12868
|
+
return true;
|
|
12869
|
+
}
|
|
12870
|
+
const pos = shift2.axis === "row" ? node.row - nodeDelta : node.col - nodeDelta;
|
|
12871
|
+
const moves = { seed: !!traits?.descriptive, moved: false, cut: false };
|
|
12872
|
+
const deps = this.moveAreas(node.deps, sheet, shift2, pos, nodeDelta, moves);
|
|
12873
|
+
const dynamicDeps = this.moveAreas(node.dynamicDeps, sheet, shift2, pos, nodeDelta, moves);
|
|
12874
|
+
const { cut, moved: anyMoved } = moves;
|
|
12875
|
+
let seed = moves.seed;
|
|
12876
|
+
if (cut || changed !== anyMoved) {
|
|
12877
|
+
node.formula = cell.formula;
|
|
12878
|
+
this.reanalyze(node);
|
|
12879
|
+
this.structuralSeeds.add(node);
|
|
12880
|
+
return true;
|
|
12881
|
+
}
|
|
12882
|
+
if (traits?.positional && (anyMoved || nodeDelta !== 0)) seed = true;
|
|
12883
|
+
node.deps = deps;
|
|
12884
|
+
node.dynamicDeps = dynamicDeps;
|
|
12885
|
+
if (changed) {
|
|
12886
|
+
node.formula = cell.formula;
|
|
12887
|
+
node.stale = true;
|
|
12888
|
+
}
|
|
12889
|
+
if (seed) this.structuralSeeds.add(node);
|
|
12890
|
+
return true;
|
|
12891
|
+
}
|
|
12892
|
+
/**
|
|
12893
|
+
* Areas moved for the edit (the same list when none moves). Records in `moves` whether one
|
|
12894
|
+
* moved, one was cut (deleted, widened, pushed off the grid) and whether implicit intersection
|
|
12895
|
+
* with one can now pick another cell.
|
|
12896
|
+
*/
|
|
12897
|
+
moveAreas(list, sheet, shift2, pos, nodeDelta, moves) {
|
|
12898
|
+
let out;
|
|
12899
|
+
for (let i2 = 0; i2 < list.length; i2++) {
|
|
12900
|
+
const area = list[i2];
|
|
12901
|
+
const delta = areaDelta(area, sheet, shift2);
|
|
12902
|
+
if (delta === void 0) {
|
|
12903
|
+
moves.cut = true;
|
|
12904
|
+
continue;
|
|
12905
|
+
}
|
|
12906
|
+
if (intersectionMoves(area, delta, pos, nodeDelta, shift2.axis)) moves.seed = true;
|
|
12907
|
+
if (delta === 0) continue;
|
|
12908
|
+
moves.moved = true;
|
|
12909
|
+
out ??= list.slice();
|
|
12910
|
+
out[i2] = { sheet: area.sheet, range: movedRange(area.range, shift2.axis, delta) };
|
|
12911
|
+
}
|
|
12912
|
+
return out ?? list;
|
|
12913
|
+
}
|
|
12914
|
+
/**
|
|
12915
|
+
* Follows a sheet rename (`from` to `to`, formulas already rewritten): precedents are kept by
|
|
12916
|
+
* sheet index, so only rewritten formulas need their text parsed again, and only formulas that
|
|
12917
|
+
* name the new sheet without having been rewritten (previously unresolved), describe sheets
|
|
12918
|
+
* (CELL, SHEET, FORMULATEXT) or read defined names whose areas changed are recalculated.
|
|
12919
|
+
*/
|
|
12920
|
+
renameSheet(from, to) {
|
|
12921
|
+
if (!this.graphReady()) {
|
|
12922
|
+
this.invalidate();
|
|
12923
|
+
return;
|
|
12924
|
+
}
|
|
12925
|
+
const target2 = to.toLowerCase();
|
|
12926
|
+
let depsChanged = false;
|
|
12927
|
+
for (const map of this.nodes.values())
|
|
12928
|
+
for (const node of map.values()) {
|
|
12929
|
+
const cell = this.workbook.sheets[node.sheet]?.rows.get(node.row)?.get(node.col);
|
|
12930
|
+
if (cell?.formula === void 0) {
|
|
12931
|
+
this.invalidate();
|
|
12932
|
+
return;
|
|
12933
|
+
}
|
|
12934
|
+
const changed = cell.formula !== node.formula;
|
|
12935
|
+
const traits = node.ast && astTraits(node.ast);
|
|
12936
|
+
node.formula = cell.formula;
|
|
12937
|
+
if (traits?.complex || !changed && traits?.sheets.has(target2)) {
|
|
12938
|
+
const deps = node.deps;
|
|
12939
|
+
const dynamicDeps = node.dynamicDeps;
|
|
12940
|
+
this.reanalyze(node);
|
|
12941
|
+
const same4 = sameAreas(deps, node.deps) && sameAreas(dynamicDeps, node.dynamicDeps);
|
|
12942
|
+
if (!same4) depsChanged = true;
|
|
12943
|
+
if (!same4 || !traits?.complex) this.structuralSeeds.add(node);
|
|
12944
|
+
} else if (changed) node.stale = true;
|
|
12945
|
+
if (traits?.descriptive || traits?.opaque) this.structuralSeeds.add(node);
|
|
12946
|
+
}
|
|
12947
|
+
if (depsChanged) this.graphChanged();
|
|
12948
|
+
}
|
|
12949
|
+
/** Takes the formulas queued by structural edits. */
|
|
12950
|
+
takeStructuralSeeds(into) {
|
|
12951
|
+
for (const node of this.structuralSeeds)
|
|
12952
|
+
if (this.nodes.get(node.sheet)?.get(cellKey(node.row, node.col)) === node) into.add(node);
|
|
12953
|
+
this.structuralSeeds.clear();
|
|
12954
|
+
}
|
|
12955
|
+
};
|
|
12956
|
+
|
|
12386
12957
|
// xlsx/formula/engine.ts
|
|
12387
|
-
var Engine = class extends
|
|
12958
|
+
var Engine = class extends EngineStructure {
|
|
12959
|
+
preparation;
|
|
12960
|
+
/** The prepared formulas the first recalculation checks (see `trustsStoredValues`). */
|
|
12961
|
+
prepared;
|
|
12962
|
+
// ---- the graph ----
|
|
12963
|
+
prepare(timeRemaining) {
|
|
12964
|
+
if (this.built || this.needsFull) return true;
|
|
12965
|
+
this.preparation ??= this.startPreparation();
|
|
12966
|
+
if (!this.preparation.run(timeRemaining)) return false;
|
|
12967
|
+
this.finishPreparation(this.preparation);
|
|
12968
|
+
return true;
|
|
12969
|
+
}
|
|
12970
|
+
discardPreparation() {
|
|
12971
|
+
if (!this.fresh || this.needsFull) return;
|
|
12972
|
+
this.preparation = void 0;
|
|
12973
|
+
this.prepared = void 0;
|
|
12974
|
+
this.structuralSeeds.clear();
|
|
12975
|
+
this.nodes.clear();
|
|
12976
|
+
this.footprints.clear();
|
|
12977
|
+
this.graphChanged();
|
|
12978
|
+
this.built = false;
|
|
12979
|
+
}
|
|
12980
|
+
/** Completes the graph, continuing a preparation that is under way. */
|
|
12981
|
+
build() {
|
|
12982
|
+
const preparation = this.preparation ?? this.startPreparation();
|
|
12983
|
+
preparation.run();
|
|
12984
|
+
this.finishPreparation(preparation);
|
|
12985
|
+
}
|
|
12986
|
+
startPreparation() {
|
|
12987
|
+
this.nodes.clear();
|
|
12988
|
+
this.footprints.clear();
|
|
12989
|
+
this.footprintIndex = void 0;
|
|
12990
|
+
this.prepared = void 0;
|
|
12991
|
+
return new GraphPreparation(
|
|
12992
|
+
this.workbook,
|
|
12993
|
+
(s, row2, col, cell) => this.createNode(s, row2, col, cell, true)
|
|
12994
|
+
);
|
|
12995
|
+
}
|
|
12996
|
+
finishPreparation(preparation) {
|
|
12997
|
+
this.preparation = void 0;
|
|
12998
|
+
this.built = true;
|
|
12999
|
+
this.graphChanged();
|
|
13000
|
+
this.reverseIndex = preparation.reverse;
|
|
13001
|
+
this.prepared = preparation.formulas;
|
|
13002
|
+
}
|
|
12388
13003
|
// ---- recalculation ----
|
|
12389
13004
|
recalculateAll() {
|
|
13005
|
+
this.fresh = false;
|
|
13006
|
+
this.prepared = void 0;
|
|
12390
13007
|
if (this.needsFull) this.releaseAllSpills();
|
|
12391
13008
|
if (!this.built || this.needsFull) this.build();
|
|
12392
13009
|
this.needsFull = false;
|
|
13010
|
+
this.structuralSeeds.clear();
|
|
12393
13011
|
this.cycles = /* @__PURE__ */ new Set();
|
|
12394
13012
|
this.run(new Set(this.allNodes()), true);
|
|
12395
13013
|
}
|
|
12396
13014
|
recalculateFrom(changes) {
|
|
12397
|
-
|
|
13015
|
+
const seeds = /* @__PURE__ */ new Set();
|
|
13016
|
+
if (this.fresh && !this.needsFull) {
|
|
13017
|
+
this.fresh = false;
|
|
13018
|
+
if (!this.built) this.build();
|
|
13019
|
+
if (!this.trustsStoredValues(changes, seeds)) {
|
|
13020
|
+
this.recalculateAll();
|
|
13021
|
+
return;
|
|
13022
|
+
}
|
|
13023
|
+
} else if (!this.built || this.needsFull) {
|
|
12398
13024
|
this.recalculateAll();
|
|
12399
13025
|
return;
|
|
12400
13026
|
}
|
|
12401
|
-
const seeds = /* @__PURE__ */ new Set();
|
|
12402
13027
|
const changed = [];
|
|
12403
13028
|
let structural = false;
|
|
12404
13029
|
for (const change of changes) {
|
|
@@ -12434,11 +13059,33 @@ var Engine = class extends EngineCore {
|
|
|
12434
13059
|
}
|
|
12435
13060
|
}
|
|
12436
13061
|
if (structural) this.graphChanged();
|
|
13062
|
+
this.takeStructuralSeeds(seeds);
|
|
12437
13063
|
const reverse = this.reverse();
|
|
12438
13064
|
for (const area of changed) reverse.dependents(area.sheet, area.range, seeds);
|
|
12439
13065
|
for (const node of this.allNodes()) if (node.volatile) seeds.add(node);
|
|
12440
13066
|
this.run(seeds, false);
|
|
12441
13067
|
}
|
|
13068
|
+
/**
|
|
13069
|
+
* Whether the stored results can stand for a fresh graph: apart from the changed cells, every
|
|
13070
|
+
* formula has legacy or CSE array semantics (none can spill). Collects the formulas stored
|
|
13071
|
+
* without a value into `missing`.
|
|
13072
|
+
*/
|
|
13073
|
+
trustsStoredValues(changes, missing) {
|
|
13074
|
+
const prepared = this.prepared;
|
|
13075
|
+
this.prepared = void 0;
|
|
13076
|
+
if (!prepared) return false;
|
|
13077
|
+
const changed = new Set(changes.map((c) => `${c.sheet}:${cellKey(c.row, c.col)}`));
|
|
13078
|
+
const current = (node) => this.nodes.get(node.sheet)?.get(cellKey(node.row, node.col)) === node;
|
|
13079
|
+
for (const node of prepared.dynamic) {
|
|
13080
|
+
if (current(node) && !changed.has(`${node.sheet}:${cellKey(node.row, node.col)}`))
|
|
13081
|
+
return false;
|
|
13082
|
+
}
|
|
13083
|
+
for (const node of prepared.unvalued) {
|
|
13084
|
+
const cell = this.workbook.sheets[node.sheet]?.rows.get(node.row)?.get(node.col);
|
|
13085
|
+
if (current(node) && cell && cell.value === null) missing.add(node);
|
|
13086
|
+
}
|
|
13087
|
+
return true;
|
|
13088
|
+
}
|
|
12442
13089
|
/**
|
|
12443
13090
|
* Whether a spilled cell is still part of its anchor's live spill, so a change reported for it
|
|
12444
13091
|
* is a user overwrite. A cell whose anchor is blocked (or gone) keeps its marker: it was
|
|
@@ -12449,7 +13096,10 @@ var Engine = class extends EngineCore {
|
|
|
12449
13096
|
return !!anchor?.spill && rangeHas(anchor.spill, row2, col);
|
|
12450
13097
|
}
|
|
12451
13098
|
invalidate() {
|
|
13099
|
+
this.structuralSeeds.clear();
|
|
12452
13100
|
this.releaseAllSpills();
|
|
13101
|
+
this.preparation = void 0;
|
|
13102
|
+
this.prepared = void 0;
|
|
12453
13103
|
this.nodes.clear();
|
|
12454
13104
|
this.footprints.clear();
|
|
12455
13105
|
this.graphChanged();
|
|
@@ -12494,7 +13144,7 @@ function createCalcEngine(workbook, options = {}) {
|
|
|
12494
13144
|
return new Engine(workbook, options);
|
|
12495
13145
|
}
|
|
12496
13146
|
|
|
12497
|
-
// xlsx/formula/
|
|
13147
|
+
// xlsx/formula/ref-text.ts
|
|
12498
13148
|
function safeTokens(formula) {
|
|
12499
13149
|
try {
|
|
12500
13150
|
return tokenize(formula);
|
|
@@ -12513,50 +13163,26 @@ function formatRefSpec(spec2) {
|
|
|
12513
13163
|
if (spec2.kind === "cell") return a;
|
|
12514
13164
|
return `${a}:${cornerText(spec2.end, spec2.kind)}`;
|
|
12515
13165
|
}
|
|
12516
|
-
function
|
|
13166
|
+
function rewriteRef(token, ref) {
|
|
12517
13167
|
const prefix = token.prefix?.text ?? "";
|
|
12518
13168
|
if (!ref) return `${prefix}#REF!`;
|
|
12519
13169
|
return `${prefix}${formatRefSpec(ref)}${token.spill ? "#" : ""}`;
|
|
12520
13170
|
}
|
|
12521
13171
|
var sameSpec = (a, b) => a.kind === b.kind && a.start.row === b.start.row && a.start.col === b.start.col && a.end.row === b.end.row && a.end.col === b.end.col;
|
|
12522
|
-
|
|
12523
|
-
|
|
12524
|
-
|
|
12525
|
-
|
|
12526
|
-
|
|
12527
|
-
|
|
12528
|
-
const move = (c) => {
|
|
12529
|
-
const row2 = spec2.kind === "cols" || c.rowAbs ? c.row : c.row + dRow;
|
|
12530
|
-
const col = spec2.kind === "rows" || c.colAbs ? c.col : c.col + dCol;
|
|
12531
|
-
if (row2 < 0 || row2 > MAX_ROW || col < 0 || col > MAX_COL) return void 0;
|
|
12532
|
-
return { ...c, row: row2, col };
|
|
12533
|
-
};
|
|
12534
|
-
const start = move(spec2.start);
|
|
12535
|
-
const end = move(spec2.end);
|
|
12536
|
-
const next = start && end ? { kind: spec2.kind, start, end } : void 0;
|
|
12537
|
-
if (next && sameSpec(next, spec2)) continue;
|
|
12538
|
-
token.text = rewrite(token, next);
|
|
12539
|
-
}
|
|
12540
|
-
return joinTokens(tokens);
|
|
13172
|
+
var needsQuote = (name) => !/^[A-Za-z_¡-][A-Za-z0-9_.¡-]*$/.test(name) || /^[A-Za-z]{1,3}\d+$/.test(name) || /^(?:R\d*C?\d*|C\d*)$/i.test(name) || /^(?:TRUE|FALSE)$/i.test(name);
|
|
13173
|
+
function prefixText(prefix) {
|
|
13174
|
+
const sheets = prefix.sheet2 !== void 0 ? `${prefix.sheet}:${prefix.sheet2}` : prefix.sheet;
|
|
13175
|
+
const book = prefix.book !== void 0 ? `[${prefix.book}]` : "";
|
|
13176
|
+
const quote = needsQuote(prefix.sheet) || prefix.sheet2 !== void 0 && needsQuote(prefix.sheet2);
|
|
13177
|
+
return quote ? `'${(book + sheets).replace(/'/g, "''")}'!` : `${book}${sheets}!`;
|
|
12541
13178
|
}
|
|
12542
|
-
|
|
12543
|
-
|
|
12544
|
-
|
|
12545
|
-
|
|
12546
|
-
|
|
12547
|
-
|
|
12548
|
-
|
|
12549
|
-
const na2 = a >= at ? a + count2 : a;
|
|
12550
|
-
const nb2 = b >= at ? b + count2 : b;
|
|
12551
|
-
if (nb2 > max) return na2 > max ? void 0 : [na2, max];
|
|
12552
|
-
return [na2, nb2];
|
|
12553
|
-
}
|
|
12554
|
-
const n = -count2;
|
|
12555
|
-
const last = at + n - 1;
|
|
12556
|
-
if (a >= at && b <= last) return void 0;
|
|
12557
|
-
const na = a < at ? a : a <= last ? at : a - n;
|
|
12558
|
-
const nb = b < at ? b : b <= last ? at - 1 : b - n;
|
|
12559
|
-
return [na, nb];
|
|
13179
|
+
|
|
13180
|
+
// xlsx/formula/shift-formula.ts
|
|
13181
|
+
var templates = /* @__PURE__ */ new Map();
|
|
13182
|
+
var MAX_TEMPLATES2 = 2e5;
|
|
13183
|
+
function remember(text2, template) {
|
|
13184
|
+
if (templates.size >= MAX_TEMPLATES2) templates.clear();
|
|
13185
|
+
templates.set(text2, template);
|
|
12560
13186
|
}
|
|
12561
13187
|
function mergeSpacedAreas(tokens) {
|
|
12562
13188
|
const out = [];
|
|
@@ -12570,10 +13196,10 @@ function mergeSpacedAreas(tokens) {
|
|
|
12570
13196
|
const colon = tokens[j];
|
|
12571
13197
|
const last = tokens[k];
|
|
12572
13198
|
if (plainCell(first2) && colon?.kind === "op" && colon.text === ":" && plainCell(last) && !last?.prefix && k > i2 + 2 && first2.ref && last?.ref) {
|
|
12573
|
-
const
|
|
13199
|
+
const text2 = tokens.slice(i2, k + 1).map((t) => t.text).join("");
|
|
12574
13200
|
out.push({
|
|
12575
13201
|
...first2,
|
|
12576
|
-
text,
|
|
13202
|
+
text: text2,
|
|
12577
13203
|
ref: { kind: "area", start: first2.ref.start, end: last.ref.start }
|
|
12578
13204
|
});
|
|
12579
13205
|
i2 = k;
|
|
@@ -12583,63 +13209,145 @@ function mergeSpacedAreas(tokens) {
|
|
|
12583
13209
|
}
|
|
12584
13210
|
return out;
|
|
12585
13211
|
}
|
|
12586
|
-
function
|
|
12587
|
-
|
|
13212
|
+
function templateOf(formula) {
|
|
13213
|
+
const cached = templates.get(formula);
|
|
13214
|
+
if (cached !== void 0) return cached;
|
|
12588
13215
|
const raw = safeTokens(formula);
|
|
12589
|
-
|
|
12590
|
-
|
|
12591
|
-
|
|
12592
|
-
|
|
12593
|
-
|
|
12594
|
-
|
|
12595
|
-
|
|
12596
|
-
|
|
12597
|
-
|
|
12598
|
-
|
|
12599
|
-
|
|
12600
|
-
|
|
12601
|
-
|
|
12602
|
-
|
|
12603
|
-
|
|
12604
|
-
|
|
12605
|
-
|
|
12606
|
-
|
|
12607
|
-
|
|
12608
|
-
|
|
12609
|
-
|
|
12610
|
-
|
|
12611
|
-
|
|
12612
|
-
|
|
12613
|
-
|
|
12614
|
-
|
|
12615
|
-
|
|
12616
|
-
|
|
13216
|
+
let template = null;
|
|
13217
|
+
if (raw) {
|
|
13218
|
+
template = [];
|
|
13219
|
+
let literal2 = "";
|
|
13220
|
+
for (const token of mergeSpacedAreas(raw)) {
|
|
13221
|
+
if (token.kind !== "ref" && !(token.kind === "name" && token.prefix)) {
|
|
13222
|
+
literal2 += token.text;
|
|
13223
|
+
continue;
|
|
13224
|
+
}
|
|
13225
|
+
if (literal2) template.push(literal2);
|
|
13226
|
+
literal2 = "";
|
|
13227
|
+
const part = { kind: token.kind, text: token.text };
|
|
13228
|
+
if (token.prefix) {
|
|
13229
|
+
part.prefix = token.prefix;
|
|
13230
|
+
if (token.prefix.book === void 0) part.sheet = token.prefix.sheet.toLowerCase();
|
|
13231
|
+
}
|
|
13232
|
+
if (token.ref) part.ref = token.ref;
|
|
13233
|
+
if (token.spill) part.spill = true;
|
|
13234
|
+
template.push(part);
|
|
13235
|
+
}
|
|
13236
|
+
if (literal2) template.push(literal2);
|
|
13237
|
+
}
|
|
13238
|
+
remember(formula, template);
|
|
13239
|
+
return template;
|
|
13240
|
+
}
|
|
13241
|
+
function rewriteTemplate(formula, rewrite) {
|
|
13242
|
+
const template = templateOf(formula);
|
|
13243
|
+
if (!template) return formula;
|
|
13244
|
+
let next;
|
|
13245
|
+
for (let i2 = 0; i2 < template.length; i2++) {
|
|
13246
|
+
const part = template[i2];
|
|
13247
|
+
if (typeof part === "string") continue;
|
|
13248
|
+
const changed = rewrite(part);
|
|
13249
|
+
if (!changed) continue;
|
|
13250
|
+
next ??= template.slice();
|
|
13251
|
+
next[i2] = changed;
|
|
13252
|
+
}
|
|
13253
|
+
if (!next) return formula;
|
|
13254
|
+
const text2 = next.map((part) => typeof part === "string" ? part : part.text).join("");
|
|
13255
|
+
remember(text2, next);
|
|
13256
|
+
return text2;
|
|
13257
|
+
}
|
|
13258
|
+
function shiftInterval(a, b, at, count2, max) {
|
|
13259
|
+
if (count2 > 0) {
|
|
13260
|
+
const na2 = a >= at ? a + count2 : a;
|
|
13261
|
+
const nb2 = b >= at ? b + count2 : b;
|
|
13262
|
+
if (nb2 > max) return na2 > max ? void 0 : [na2, max];
|
|
13263
|
+
return [na2, nb2];
|
|
12617
13264
|
}
|
|
12618
|
-
|
|
13265
|
+
const n = -count2;
|
|
13266
|
+
const last = at + n - 1;
|
|
13267
|
+
if (a >= at && b <= last) return void 0;
|
|
13268
|
+
const na = a < at ? a : a <= last ? at : a - n;
|
|
13269
|
+
const nb = b < at ? b : b <= last ? at - 1 : b - n;
|
|
13270
|
+
return [na, nb];
|
|
12619
13271
|
}
|
|
12620
|
-
|
|
12621
|
-
|
|
12622
|
-
|
|
12623
|
-
const
|
|
12624
|
-
const
|
|
12625
|
-
|
|
13272
|
+
function shiftRef(ref, spec2) {
|
|
13273
|
+
const isRow = spec2.axis === "row";
|
|
13274
|
+
if (isRow && ref.kind === "cols" || !isRow && ref.kind === "rows") return ref;
|
|
13275
|
+
const startFirst = isRow ? ref.start.row <= ref.end.row : ref.start.col <= ref.end.col;
|
|
13276
|
+
const lo = startFirst ? ref.start : ref.end;
|
|
13277
|
+
const hi = startFirst ? ref.end : ref.start;
|
|
13278
|
+
const shifted2 = shiftInterval(
|
|
13279
|
+
isRow ? lo.row : lo.col,
|
|
13280
|
+
isRow ? hi.row : hi.col,
|
|
13281
|
+
spec2.at,
|
|
13282
|
+
spec2.count,
|
|
13283
|
+
isRow ? MAX_ROW : MAX_COL
|
|
13284
|
+
);
|
|
13285
|
+
if (!shifted2) return void 0;
|
|
13286
|
+
const [a, b] = shifted2;
|
|
13287
|
+
const nlo = isRow ? { ...lo, row: a } : { ...lo, col: a };
|
|
13288
|
+
const nhi = isRow ? { ...hi, row: b } : { ...hi, col: b };
|
|
13289
|
+
const next = {
|
|
13290
|
+
kind: ref.kind,
|
|
13291
|
+
start: startFirst ? nlo : nhi,
|
|
13292
|
+
end: startFirst ? nhi : nlo
|
|
13293
|
+
};
|
|
13294
|
+
if (ref.kind === "cell") next.end = next.start;
|
|
13295
|
+
return sameSpec(next, ref) ? ref : next;
|
|
13296
|
+
}
|
|
13297
|
+
function shiftFormula(formula, formulaSheet, spec2) {
|
|
13298
|
+
if (spec2.count === 0) return formula;
|
|
13299
|
+
const sheet = spec2.sheet.toLowerCase();
|
|
13300
|
+
const own = formulaSheet.toLowerCase() === sheet;
|
|
13301
|
+
return rewriteTemplate(formula, (part) => {
|
|
13302
|
+
if (part.kind !== "ref" || !part.ref || (part.prefix ? part.sheet !== sheet : !own))
|
|
13303
|
+
return void 0;
|
|
13304
|
+
const next = shiftRef(part.ref, spec2);
|
|
13305
|
+
if (next === part.ref) return void 0;
|
|
13306
|
+
const out = { kind: "ref", text: rewriteRef(part, next) };
|
|
13307
|
+
if (part.prefix) out.prefix = part.prefix;
|
|
13308
|
+
if (part.sheet !== void 0) out.sheet = part.sheet;
|
|
13309
|
+
if (next) out.ref = next;
|
|
13310
|
+
if (part.spill) out.spill = true;
|
|
13311
|
+
return out;
|
|
13312
|
+
});
|
|
12626
13313
|
}
|
|
12627
13314
|
function renameSheetInFormula(formula, oldName, newName) {
|
|
12628
|
-
const tokens = safeTokens(formula);
|
|
12629
|
-
if (!tokens) return formula;
|
|
12630
13315
|
const lower2 = oldName.toLowerCase();
|
|
12631
|
-
|
|
12632
|
-
const prefix =
|
|
12633
|
-
if (!prefix ||
|
|
12634
|
-
const first2 =
|
|
13316
|
+
return rewriteTemplate(formula, (part) => {
|
|
13317
|
+
const prefix = part.prefix;
|
|
13318
|
+
if (!prefix || part.sheet === void 0) return void 0;
|
|
13319
|
+
const first2 = part.sheet === lower2;
|
|
12635
13320
|
const second = prefix.sheet2?.toLowerCase() === lower2;
|
|
12636
|
-
if (!first2 && !second)
|
|
13321
|
+
if (!first2 && !second) return void 0;
|
|
12637
13322
|
const renamed = { ...prefix, sheet: first2 ? newName : prefix.sheet };
|
|
12638
13323
|
if (prefix.sheet2 !== void 0) renamed.sheet2 = second ? newName : prefix.sheet2;
|
|
12639
|
-
const
|
|
12640
|
-
|
|
12641
|
-
|
|
12642
|
-
|
|
13324
|
+
const text2 = prefixText(renamed);
|
|
13325
|
+
renamed.text = text2;
|
|
13326
|
+
const out = { ...part, text: text2 + part.text.slice(prefix.text.length) };
|
|
13327
|
+
out.prefix = renamed;
|
|
13328
|
+
out.sheet = renamed.sheet.toLowerCase();
|
|
13329
|
+
return out;
|
|
13330
|
+
});
|
|
13331
|
+
}
|
|
13332
|
+
|
|
13333
|
+
// xlsx/formula/transform.ts
|
|
13334
|
+
function translateFormula(formula, dRow, dCol) {
|
|
13335
|
+
const tokens = safeTokens(formula);
|
|
13336
|
+
if (!tokens) return formula;
|
|
13337
|
+
for (const token of tokens) {
|
|
13338
|
+
if (token.kind !== "ref" || !token.ref) continue;
|
|
13339
|
+
const spec2 = token.ref;
|
|
13340
|
+
const move = (c) => {
|
|
13341
|
+
const row2 = spec2.kind === "cols" || c.rowAbs ? c.row : c.row + dRow;
|
|
13342
|
+
const col = spec2.kind === "rows" || c.colAbs ? c.col : c.col + dCol;
|
|
13343
|
+
if (row2 < 0 || row2 > MAX_ROW || col < 0 || col > MAX_COL) return void 0;
|
|
13344
|
+
return { ...c, row: row2, col };
|
|
13345
|
+
};
|
|
13346
|
+
const start = move(spec2.start);
|
|
13347
|
+
const end = move(spec2.end);
|
|
13348
|
+
const next = start && end ? { kind: spec2.kind, start, end } : void 0;
|
|
13349
|
+
if (next && sameSpec(next, spec2)) continue;
|
|
13350
|
+
token.text = rewriteRef(token, next);
|
|
12643
13351
|
}
|
|
12644
13352
|
return joinTokens(tokens);
|
|
12645
13353
|
}
|
|
@@ -12938,6 +13646,16 @@ function parseColor(element2, palette) {
|
|
|
12938
13646
|
return Object.keys(color).length ? color : void 0;
|
|
12939
13647
|
}
|
|
12940
13648
|
|
|
13649
|
+
// color/hex-rgb.ts
|
|
13650
|
+
function parseArgbHex(hex2) {
|
|
13651
|
+
const clean2 = hex2.replace(/^#/, "");
|
|
13652
|
+
const rgb2 = clean2.length === 8 ? clean2.slice(2) : clean2;
|
|
13653
|
+
if (!/^[0-9a-fA-F]{6}$/.test(rgb2)) return void 0;
|
|
13654
|
+
return [0, 2, 4].map((i2) => parseInt(rgb2.slice(i2, i2 + 2), 16));
|
|
13655
|
+
}
|
|
13656
|
+
var clamp255 = (v) => Math.max(0, Math.min(255, v));
|
|
13657
|
+
var rgbToUpperHex = (rgb2) => `#${rgb2.map((v) => clamp255(Math.round(v)).toString(16).padStart(2, "0")).join("").toUpperCase()}`;
|
|
13658
|
+
|
|
12941
13659
|
// xlsx/read/sheet-props.ts
|
|
12942
13660
|
function parseSqref(sqref) {
|
|
12943
13661
|
if (!sqref) return [];
|
|
@@ -12953,13 +13671,13 @@ function dataBarLengths(rule, node) {
|
|
|
12953
13671
|
maxLength: rule.maxLength ?? numAttr(bar, "maxLength") ?? 90
|
|
12954
13672
|
};
|
|
12955
13673
|
}
|
|
12956
|
-
function rewriteConditionalExtension(rule,
|
|
13674
|
+
function rewriteConditionalExtension(rule, rewrite) {
|
|
12957
13675
|
if (!rule.extensionXml) return;
|
|
12958
13676
|
const doc = parseXml(rule.extensionXml);
|
|
12959
13677
|
let changed = false;
|
|
12960
13678
|
for (const formula of descendants(doc.documentElement, "f", XM)) {
|
|
12961
13679
|
const before = formula.textContent ?? "";
|
|
12962
|
-
const next =
|
|
13680
|
+
const next = rewrite(before);
|
|
12963
13681
|
if (before !== next) {
|
|
12964
13682
|
formula.textContent = next;
|
|
12965
13683
|
changed = true;
|
|
@@ -12968,6 +13686,104 @@ function rewriteConditionalExtension(rule, rewrite2) {
|
|
|
12968
13686
|
if (changed) rule.extensionXml = buildXml(doc);
|
|
12969
13687
|
}
|
|
12970
13688
|
|
|
13689
|
+
// xlsx/read/sparklines.ts
|
|
13690
|
+
var XM2 = "http://schemas.microsoft.com/office/excel/2006/main";
|
|
13691
|
+
var TYPES = ["line", "column", "stacked"];
|
|
13692
|
+
var EMPTY = ["gap", "zero", "span"];
|
|
13693
|
+
var AXES = ["individual", "group", "custom"];
|
|
13694
|
+
var COLORS = [
|
|
13695
|
+
"colorSeries",
|
|
13696
|
+
"colorNegative",
|
|
13697
|
+
"colorAxis",
|
|
13698
|
+
"colorMarkers",
|
|
13699
|
+
"colorFirst",
|
|
13700
|
+
"colorLast",
|
|
13701
|
+
"colorHigh",
|
|
13702
|
+
"colorLow"
|
|
13703
|
+
];
|
|
13704
|
+
function pick2(value2, allowed, fallback) {
|
|
13705
|
+
return allowed.includes(value2) ? value2 : fallback;
|
|
13706
|
+
}
|
|
13707
|
+
var text = (element2) => {
|
|
13708
|
+
const value2 = element2?.textContent?.trim();
|
|
13709
|
+
return value2 ? value2 : void 0;
|
|
13710
|
+
};
|
|
13711
|
+
function readSparklineGroup(node) {
|
|
13712
|
+
const attr = (name) => node.hasAttribute(name) ? node.getAttribute(name) : null;
|
|
13713
|
+
const group = {
|
|
13714
|
+
type: pick2(attr("type"), TYPES, "line"),
|
|
13715
|
+
lineWeight: numAttr(node, "lineWeight") ?? 0.75,
|
|
13716
|
+
dateAxis: boolAttr(node, "dateAxis", false),
|
|
13717
|
+
markers: boolAttr(node, "markers", false),
|
|
13718
|
+
high: boolAttr(node, "high", false),
|
|
13719
|
+
low: boolAttr(node, "low", false),
|
|
13720
|
+
first: boolAttr(node, "first", false),
|
|
13721
|
+
last: boolAttr(node, "last", false),
|
|
13722
|
+
negative: boolAttr(node, "negative", false),
|
|
13723
|
+
displayEmptyCellsAs: pick2(attr("displayEmptyCellsAs"), EMPTY, "zero"),
|
|
13724
|
+
displayXAxis: boolAttr(node, "displayXAxis", false),
|
|
13725
|
+
displayHidden: boolAttr(node, "displayHidden", false),
|
|
13726
|
+
rightToLeft: boolAttr(node, "rightToLeft", false),
|
|
13727
|
+
minAxisType: pick2(attr("minAxisType"), AXES, "individual"),
|
|
13728
|
+
maxAxisType: pick2(attr("maxAxisType"), AXES, "individual"),
|
|
13729
|
+
sparklines: []
|
|
13730
|
+
};
|
|
13731
|
+
const manualMin = numAttr(node, "manualMin");
|
|
13732
|
+
const manualMax = numAttr(node, "manualMax");
|
|
13733
|
+
if (manualMin !== void 0) group.manualMin = manualMin;
|
|
13734
|
+
if (manualMax !== void 0) group.manualMax = manualMax;
|
|
13735
|
+
for (const name of COLORS) {
|
|
13736
|
+
const color = parseColor(first(node, name, NS.x14));
|
|
13737
|
+
if (color) group[name] = color;
|
|
13738
|
+
}
|
|
13739
|
+
const dates = text(first(node, "f", XM2));
|
|
13740
|
+
if (dates) group.dateFormula = dates;
|
|
13741
|
+
for (const line2 of children(first(node, "sparklines", NS.x14) ?? node, "sparkline", NS.x14)) {
|
|
13742
|
+
const host = parseRange(text(first(line2, "sqref", XM2)) ?? "");
|
|
13743
|
+
if (!host) continue;
|
|
13744
|
+
const formula = text(first(line2, "f", XM2));
|
|
13745
|
+
group.sparklines.push(formula ? { formula, host } : { host });
|
|
13746
|
+
}
|
|
13747
|
+
return group;
|
|
13748
|
+
}
|
|
13749
|
+
function readSparklineGroups(extLst) {
|
|
13750
|
+
const groups = [];
|
|
13751
|
+
for (const xml of extLst) {
|
|
13752
|
+
if (!xml.includes("sparklineGroup")) continue;
|
|
13753
|
+
let root;
|
|
13754
|
+
try {
|
|
13755
|
+
root = parseXml(xml).documentElement;
|
|
13756
|
+
} catch {
|
|
13757
|
+
continue;
|
|
13758
|
+
}
|
|
13759
|
+
for (const node of descendants(root, "sparklineGroup", NS.x14))
|
|
13760
|
+
groups.push(readSparklineGroup(node));
|
|
13761
|
+
}
|
|
13762
|
+
return groups;
|
|
13763
|
+
}
|
|
13764
|
+
var cache2 = /* @__PURE__ */ new WeakMap();
|
|
13765
|
+
function sheetSparklineGroups(sheet) {
|
|
13766
|
+
const source = sheet.preserved.get("extLst") ?? [];
|
|
13767
|
+
const hit = cache2.get(sheet);
|
|
13768
|
+
if (hit && hit.source.length === source.length && hit.source.every((xml, i2) => xml === source[i2]))
|
|
13769
|
+
return hit.groups;
|
|
13770
|
+
const groups = readSparklineGroups(source);
|
|
13771
|
+
cache2.set(sheet, { source: [...source], groups });
|
|
13772
|
+
return groups;
|
|
13773
|
+
}
|
|
13774
|
+
|
|
13775
|
+
// chart/bar-cluster-geometry.ts
|
|
13776
|
+
function assertBarClusterOptions(options) {
|
|
13777
|
+
for (const [field, min, max] of [
|
|
13778
|
+
["barGapWidth", 0, 500],
|
|
13779
|
+
["barOverlap", -100, 100]
|
|
13780
|
+
]) {
|
|
13781
|
+
const value2 = options[field];
|
|
13782
|
+
if (value2 !== void 0 && (!Number.isInteger(value2) || value2 < min || value2 > max))
|
|
13783
|
+
throw new RangeError(`${field} must be an integer from ${min} to ${max}`);
|
|
13784
|
+
}
|
|
13785
|
+
}
|
|
13786
|
+
|
|
12971
13787
|
// chart/color-palettes.ts
|
|
12972
13788
|
var COLORFUL_VARIATIONS = [
|
|
12973
13789
|
{},
|
|
@@ -13153,24 +13969,19 @@ function hueToRgb(n1, n2, hue) {
|
|
|
13153
13969
|
return n1 + idiv((n2 - n1) * (idiv(HLSMAX * 2, 3) - h2) + idiv(HLSMAX, 12), sixth);
|
|
13154
13970
|
return n1;
|
|
13155
13971
|
}
|
|
13156
|
-
var
|
|
13972
|
+
var clamp2552 = (v) => Math.max(0, Math.min(255, v));
|
|
13157
13973
|
function hls240ToRgb({ h: h2, l, s }) {
|
|
13158
13974
|
if (s === 0) {
|
|
13159
|
-
const v =
|
|
13975
|
+
const v = clamp2552(Math.round(l * RGBMAX / HLSMAX));
|
|
13160
13976
|
return [v, v, v];
|
|
13161
13977
|
}
|
|
13162
13978
|
const m2 = l <= HLSMAX / 2 ? idiv(l * (HLSMAX + s) + idiv(HLSMAX, 2), HLSMAX) : l + s - idiv(l * s + idiv(HLSMAX, 2), HLSMAX);
|
|
13163
13979
|
const m1 = 2 * l - m2;
|
|
13164
|
-
const channel = (hue) =>
|
|
13980
|
+
const channel = (hue) => clamp2552(idiv(hueToRgb(m1, m2, hue) * RGBMAX + idiv(HLSMAX, 2), HLSMAX));
|
|
13165
13981
|
return [channel(h2 + idiv(HLSMAX, 3)), channel(h2), channel(h2 - idiv(HLSMAX, 3))];
|
|
13166
13982
|
}
|
|
13167
|
-
|
|
13168
|
-
|
|
13169
|
-
const rgb2 = clean2.length === 8 ? clean2.slice(2) : clean2;
|
|
13170
|
-
if (!/^[0-9a-fA-F]{6}$/.test(rgb2)) return void 0;
|
|
13171
|
-
return [0, 2, 4].map((i2) => parseInt(rgb2.slice(i2, i2 + 2), 16));
|
|
13172
|
-
}
|
|
13173
|
-
var toHexColor = (rgb2) => `#${rgb2.map((v) => clamp255(Math.round(v)).toString(16).padStart(2, "0")).join("").toUpperCase()}`;
|
|
13983
|
+
var parseHex = parseArgbHex;
|
|
13984
|
+
var toHexColor = rgbToUpperHex;
|
|
13174
13985
|
function applyTint(hex2, tint) {
|
|
13175
13986
|
const rgb2 = parseHex(hex2) ?? [0, 0, 0];
|
|
13176
13987
|
if (!tint) return toHexColor(rgb2);
|
|
@@ -13180,6 +13991,40 @@ function applyTint(hex2, tint) {
|
|
|
13180
13991
|
return toHexColor(hls240ToRgb({ ...hls, l: Math.max(0, Math.min(HLSMAX, l)) }));
|
|
13181
13992
|
}
|
|
13182
13993
|
|
|
13994
|
+
// chart/render/theme-palette.ts
|
|
13995
|
+
var THEME_SLOTS = [
|
|
13996
|
+
"lt1",
|
|
13997
|
+
"dk1",
|
|
13998
|
+
"lt2",
|
|
13999
|
+
"dk2",
|
|
14000
|
+
"accent1",
|
|
14001
|
+
"accent2",
|
|
14002
|
+
"accent3",
|
|
14003
|
+
"accent4",
|
|
14004
|
+
"accent5",
|
|
14005
|
+
"accent6",
|
|
14006
|
+
"hlink",
|
|
14007
|
+
"folHlink"
|
|
14008
|
+
];
|
|
14009
|
+
var DEFAULT_THEME_COLORS = [
|
|
14010
|
+
"FFFFFF",
|
|
14011
|
+
"000000",
|
|
14012
|
+
"E7E6E6",
|
|
14013
|
+
"44546A",
|
|
14014
|
+
"4472C4",
|
|
14015
|
+
"ED7D31",
|
|
14016
|
+
"A5A5A5",
|
|
14017
|
+
"FFC000",
|
|
14018
|
+
"5B9BD5",
|
|
14019
|
+
"70AD47",
|
|
14020
|
+
"0563C1",
|
|
14021
|
+
"954F72"
|
|
14022
|
+
];
|
|
14023
|
+
function themeColor(theme2, index2) {
|
|
14024
|
+
const hex2 = theme2.colors[index2] ?? DEFAULT_THEME_COLORS[index2];
|
|
14025
|
+
return hex2 && parseArgbHex(hex2) ? hex2.replace(/^#/, "") : void 0;
|
|
14026
|
+
}
|
|
14027
|
+
|
|
13183
14028
|
// xlsx/layout/colors.ts
|
|
13184
14029
|
var INDEXED_COLORS = [
|
|
13185
14030
|
"000000",
|
|
@@ -13249,38 +14094,6 @@ var INDEXED_COLORS = [
|
|
|
13249
14094
|
"000000",
|
|
13250
14095
|
"FFFFFF"
|
|
13251
14096
|
];
|
|
13252
|
-
var THEME_SLOTS = [
|
|
13253
|
-
"lt1",
|
|
13254
|
-
"dk1",
|
|
13255
|
-
"lt2",
|
|
13256
|
-
"dk2",
|
|
13257
|
-
"accent1",
|
|
13258
|
-
"accent2",
|
|
13259
|
-
"accent3",
|
|
13260
|
-
"accent4",
|
|
13261
|
-
"accent5",
|
|
13262
|
-
"accent6",
|
|
13263
|
-
"hlink",
|
|
13264
|
-
"folHlink"
|
|
13265
|
-
];
|
|
13266
|
-
var FALLBACK_THEME = [
|
|
13267
|
-
"FFFFFF",
|
|
13268
|
-
"000000",
|
|
13269
|
-
"E7E6E6",
|
|
13270
|
-
"44546A",
|
|
13271
|
-
"4472C4",
|
|
13272
|
-
"ED7D31",
|
|
13273
|
-
"A5A5A5",
|
|
13274
|
-
"FFC000",
|
|
13275
|
-
"5B9BD5",
|
|
13276
|
-
"70AD47",
|
|
13277
|
-
"0563C1",
|
|
13278
|
-
"954F72"
|
|
13279
|
-
];
|
|
13280
|
-
function themeColor(theme2, index2) {
|
|
13281
|
-
const hex2 = theme2.colors[index2] ?? FALLBACK_THEME[index2];
|
|
13282
|
-
return hex2 && parseHex(hex2) ? hex2.replace(/^#/, "") : void 0;
|
|
13283
|
-
}
|
|
13284
14097
|
function resolveColor(color, theme2, fallback, indexed = INDEXED_COLORS) {
|
|
13285
14098
|
if (!color) return fallback;
|
|
13286
14099
|
let base;
|
|
@@ -13303,18 +14116,6 @@ function mixColors(a, b, t, rounding = "nearest") {
|
|
|
13303
14116
|
);
|
|
13304
14117
|
}
|
|
13305
14118
|
|
|
13306
|
-
// chart/bar-cluster-geometry.ts
|
|
13307
|
-
function assertBarClusterOptions(options) {
|
|
13308
|
-
for (const [field, min, max] of [
|
|
13309
|
-
["barGapWidth", 0, 500],
|
|
13310
|
-
["barOverlap", -100, 100]
|
|
13311
|
-
]) {
|
|
13312
|
-
const value2 = options[field];
|
|
13313
|
-
if (value2 !== void 0 && (!Number.isInteger(value2) || value2 < min || value2 > max))
|
|
13314
|
-
throw new RangeError(`${field} must be an integer from ${min} to ${max}`);
|
|
13315
|
-
}
|
|
13316
|
-
}
|
|
13317
|
-
|
|
13318
14119
|
// xlsx/edit/range-math.ts
|
|
13319
14120
|
var axisMax = (axis) => axis === "row" ? MAX_ROW : MAX_COL;
|
|
13320
14121
|
function shiftSpan(start, end, shift2) {
|
|
@@ -13523,8 +14324,8 @@ function syncTableHeader(ctx, sheet, row2, col) {
|
|
|
13523
14324
|
if (!table2) return;
|
|
13524
14325
|
const column = table2.columns[col - table2.range.start.col];
|
|
13525
14326
|
if (!column) return;
|
|
13526
|
-
const
|
|
13527
|
-
if (
|
|
14327
|
+
const text2 = displayText(ctx.workbook, getCell(sheet, row2, col)).trim();
|
|
14328
|
+
if (text2) column.name = text2;
|
|
13528
14329
|
}
|
|
13529
14330
|
function writeScopes(sheet, index2, range2, parts = []) {
|
|
13530
14331
|
const r = normalizeRange(range2);
|
|
@@ -13539,11 +14340,11 @@ function writeScopes(sheet, index2, range2, parts = []) {
|
|
|
13539
14340
|
if (all2.length) scopes.push({ kind: "parts", sheet: index2, parts: all2 });
|
|
13540
14341
|
return scopes;
|
|
13541
14342
|
}
|
|
13542
|
-
function writeInput(ctx, sheet, row2, col,
|
|
14343
|
+
function writeInput(ctx, sheet, row2, col, text2) {
|
|
13543
14344
|
const { workbook } = ctx;
|
|
13544
14345
|
const existing = getCell(sheet, row2, col);
|
|
13545
14346
|
const format = styleAt(workbook, existing?.styleId ?? baseStyleId(sheet, row2, col)).numFmt;
|
|
13546
|
-
if (
|
|
14347
|
+
if (text2 === "") {
|
|
13547
14348
|
if (existing) clearContents(existing);
|
|
13548
14349
|
pruneCell(sheet, row2, col);
|
|
13549
14350
|
return;
|
|
@@ -13551,10 +14352,10 @@ function writeInput(ctx, sheet, row2, col, text) {
|
|
|
13551
14352
|
const cell = ensureCell(sheet, row2, col);
|
|
13552
14353
|
clearContents(cell);
|
|
13553
14354
|
if (format === "@") {
|
|
13554
|
-
cell.value =
|
|
14355
|
+
cell.value = text2;
|
|
13555
14356
|
return;
|
|
13556
14357
|
}
|
|
13557
|
-
const parsed = parseCellInput(
|
|
14358
|
+
const parsed = parseCellInput(text2, { date1904: workbook.date1904 });
|
|
13558
14359
|
if (parsed.formula !== void 0) cell.formula = parsed.formula;
|
|
13559
14360
|
else cell.value = parsed.value;
|
|
13560
14361
|
if (parsed.numFmt && format === "General")
|
|
@@ -13580,7 +14381,7 @@ function clearContents(cell) {
|
|
|
13580
14381
|
delete cell.legacyFormula;
|
|
13581
14382
|
delete cell.spillAnchor;
|
|
13582
14383
|
}
|
|
13583
|
-
function setCellInput(ctx, s, row2, col,
|
|
14384
|
+
function setCellInput(ctx, s, row2, col, text2) {
|
|
13584
14385
|
const sheet = sheetAt(ctx.workbook, s);
|
|
13585
14386
|
const range2 = cellRange(row2, col);
|
|
13586
14387
|
ctx.run(
|
|
@@ -13588,7 +14389,7 @@ function setCellInput(ctx, s, row2, col, text) {
|
|
|
13588
14389
|
"cells",
|
|
13589
14390
|
writeScopes(sheet, s, range2),
|
|
13590
14391
|
() => {
|
|
13591
|
-
writeInput(ctx, sheet, row2, col,
|
|
14392
|
+
writeInput(ctx, sheet, row2, col, text2);
|
|
13592
14393
|
syncTableHeader(ctx, sheet, row2, col);
|
|
13593
14394
|
},
|
|
13594
14395
|
{ sheet: s, ranges: [range2] }
|
|
@@ -13656,10 +14457,10 @@ function clearRange(ctx, s, range2, what) {
|
|
|
13656
14457
|
);
|
|
13657
14458
|
}
|
|
13658
14459
|
function clearIn(ctx, sheet, r, what) {
|
|
13659
|
-
const
|
|
13660
|
-
forEachCellInRange(sheet, r, (_cell, row2, col) =>
|
|
14460
|
+
const positions2 = [];
|
|
14461
|
+
forEachCellInRange(sheet, r, (_cell, row2, col) => positions2.push([row2, col]));
|
|
13661
14462
|
if (what === "contents" || what === "all" || what === "formats") {
|
|
13662
|
-
for (const [row2, col] of
|
|
14463
|
+
for (const [row2, col] of positions2) {
|
|
13663
14464
|
const cell = getCell(sheet, row2, col);
|
|
13664
14465
|
if (!cell) continue;
|
|
13665
14466
|
if (what === "all") deleteCell(sheet, row2, col);
|
|
@@ -13670,7 +14471,7 @@ function clearIn(ctx, sheet, r, what) {
|
|
|
13670
14471
|
}
|
|
13671
14472
|
}
|
|
13672
14473
|
if (what === "contents")
|
|
13673
|
-
for (const [row2, col] of
|
|
14474
|
+
for (const [row2, col] of positions2) syncTableHeader(ctx, sheet, row2, col);
|
|
13674
14475
|
}
|
|
13675
14476
|
if (what === "all" || what === "formats") {
|
|
13676
14477
|
sheet.merges = sheet.merges.filter((m) => !rangesIntersect(m, r));
|
|
@@ -13877,8 +14678,8 @@ var LISTS = [
|
|
|
13877
14678
|
"December"
|
|
13878
14679
|
]
|
|
13879
14680
|
];
|
|
13880
|
-
function listMatch(
|
|
13881
|
-
const lower2 =
|
|
14681
|
+
function listMatch(text2) {
|
|
14682
|
+
const lower2 = text2.toLowerCase();
|
|
13882
14683
|
for (const list of LISTS) {
|
|
13883
14684
|
const index2 = list.findIndex((item) => item.toLowerCase() === lower2);
|
|
13884
14685
|
if (index2 >= 0) return { list, index: index2 };
|
|
@@ -13903,14 +14704,14 @@ function linearTrend(values2) {
|
|
|
13903
14704
|
const slope = den ? num2 / den : 0;
|
|
13904
14705
|
return (k) => Number((meanY + slope * (k - meanX)).toPrecision(15));
|
|
13905
14706
|
}
|
|
13906
|
-
var
|
|
13907
|
-
function matchTextNumber(
|
|
13908
|
-
let end =
|
|
13909
|
-
while (end > 0 && !
|
|
14707
|
+
var isDigit5 = (ch) => ch !== void 0 && ch >= "0" && ch <= "9";
|
|
14708
|
+
function matchTextNumber(text2) {
|
|
14709
|
+
let end = text2.length;
|
|
14710
|
+
while (end > 0 && !isDigit5(text2[end - 1])) end--;
|
|
13910
14711
|
if (end === 0) return null;
|
|
13911
14712
|
let start = end;
|
|
13912
|
-
while (start > 0 &&
|
|
13913
|
-
return [
|
|
14713
|
+
while (start > 0 && isDigit5(text2[start - 1])) start--;
|
|
14714
|
+
return [text2, text2.slice(0, start), text2.slice(start, end), text2.slice(end)];
|
|
13914
14715
|
}
|
|
13915
14716
|
var QUARTER = /^(q|qtr|quarter)(\s?)([1-4])$/i;
|
|
13916
14717
|
function textSeries(texts) {
|
|
@@ -14092,10 +14893,10 @@ function removeValidationArea(rules, area) {
|
|
|
14092
14893
|
}
|
|
14093
14894
|
|
|
14094
14895
|
// xlsx/edit/conditional-formulas.ts
|
|
14095
|
-
function rewriteConditionalRule(rule,
|
|
14896
|
+
function rewriteConditionalRule(rule, rewrite) {
|
|
14096
14897
|
const safe2 = (formula) => {
|
|
14097
14898
|
try {
|
|
14098
|
-
return
|
|
14899
|
+
return rewrite(formula);
|
|
14099
14900
|
} catch {
|
|
14100
14901
|
return formula;
|
|
14101
14902
|
}
|
|
@@ -14315,26 +15116,26 @@ function pasteConditionalFormats(sheet, dest, cells, transpose2, skipBlanks, cut
|
|
|
14315
15116
|
}
|
|
14316
15117
|
|
|
14317
15118
|
// xlsx/edit/annotations.ts
|
|
14318
|
-
function setComment(ctx, s, at,
|
|
15119
|
+
function setComment(ctx, s, at, text2, author) {
|
|
14319
15120
|
const sheet = sheetAt(ctx.workbook, s);
|
|
14320
15121
|
const index2 = sheet.comments.findIndex(
|
|
14321
15122
|
(c) => c.address.row === at.row && c.address.col === at.col
|
|
14322
15123
|
);
|
|
14323
|
-
if (index2 < 0 &&
|
|
15124
|
+
if (index2 < 0 && text2 === void 0) return;
|
|
14324
15125
|
ctx.run(
|
|
14325
|
-
|
|
15126
|
+
text2 === void 0 ? "Delete comment" : index2 < 0 ? "New comment" : "Edit comment",
|
|
14326
15127
|
"annotations",
|
|
14327
15128
|
[{ kind: "sheet", sheet: s }],
|
|
14328
15129
|
() => {
|
|
14329
|
-
if (
|
|
15130
|
+
if (text2 === void 0) {
|
|
14330
15131
|
sheet.comments.splice(index2, 1);
|
|
14331
15132
|
return;
|
|
14332
15133
|
}
|
|
14333
15134
|
const existing = sheet.comments[index2];
|
|
14334
15135
|
if (existing) {
|
|
14335
|
-
existing.text =
|
|
15136
|
+
existing.text = text2;
|
|
14336
15137
|
existing.author = author;
|
|
14337
|
-
} else sheet.comments.push({ address: { row: at.row, col: at.col }, author, text });
|
|
15138
|
+
} else sheet.comments.push({ address: { row: at.row, col: at.col }, author, text: text2 });
|
|
14338
15139
|
},
|
|
14339
15140
|
{ sheet: s, ranges: [{ start: at, end: at }] }
|
|
14340
15141
|
);
|
|
@@ -14523,7 +15324,7 @@ function setBorders(ctx, s, range2, preset, edge = { style: "thin" }) {
|
|
|
14523
15324
|
}
|
|
14524
15325
|
|
|
14525
15326
|
// xlsx/edit/shift-preserved.ts
|
|
14526
|
-
var
|
|
15327
|
+
var XM3 = "http://schemas.microsoft.com/office/excel/2006/main";
|
|
14527
15328
|
function descendants2(root, ns, local) {
|
|
14528
15329
|
return Array.from(root.getElementsByTagNameNS(ns, local));
|
|
14529
15330
|
}
|
|
@@ -14583,14 +15384,14 @@ function removeUpwards(node, root) {
|
|
|
14583
15384
|
}
|
|
14584
15385
|
function shiftSqrefs(root, moveRange) {
|
|
14585
15386
|
let changed = false;
|
|
14586
|
-
for (const sqref of descendants2(root,
|
|
15387
|
+
for (const sqref of descendants2(root, XM3, "sqref")) {
|
|
14587
15388
|
const old = sqref.textContent ?? "";
|
|
14588
15389
|
const ranges = parseSqref(old).map(moveRange).filter((r) => !!r);
|
|
14589
|
-
const
|
|
14590
|
-
if (
|
|
15390
|
+
const text2 = ranges.map(formatRange).join(" ");
|
|
15391
|
+
if (text2 === old.trim()) continue;
|
|
14591
15392
|
changed = true;
|
|
14592
15393
|
const owner = sqref.parentNode;
|
|
14593
|
-
if (ranges.length) sqref.textContent =
|
|
15394
|
+
if (ranges.length) sqref.textContent = text2;
|
|
14594
15395
|
else if (owner) removeUpwards(owner, root);
|
|
14595
15396
|
}
|
|
14596
15397
|
if (!changed) return "same";
|
|
@@ -14614,21 +15415,21 @@ function shiftPreservedXml(sheet, shift2, moveRange, banded) {
|
|
|
14614
15415
|
(xml) => xml.includes("sqref")
|
|
14615
15416
|
);
|
|
14616
15417
|
}
|
|
14617
|
-
function rewritePreservedFormulas(sheet,
|
|
15418
|
+
function rewritePreservedFormulas(sheet, rewrite) {
|
|
14618
15419
|
editEntries(
|
|
14619
15420
|
sheet,
|
|
14620
15421
|
"extLst",
|
|
14621
15422
|
(root) => {
|
|
14622
15423
|
let changed = false;
|
|
14623
|
-
for (const f6 of descendants2(root,
|
|
14624
|
-
const
|
|
14625
|
-
let next =
|
|
15424
|
+
for (const f6 of descendants2(root, XM3, "f")) {
|
|
15425
|
+
const text2 = f6.textContent ?? "";
|
|
15426
|
+
let next = text2;
|
|
14626
15427
|
try {
|
|
14627
|
-
next =
|
|
15428
|
+
next = rewrite(text2, sheet.name);
|
|
14628
15429
|
} catch {
|
|
14629
|
-
next =
|
|
15430
|
+
next = text2;
|
|
14630
15431
|
}
|
|
14631
|
-
if (next ===
|
|
15432
|
+
if (next === text2) continue;
|
|
14632
15433
|
f6.textContent = next;
|
|
14633
15434
|
changed = true;
|
|
14634
15435
|
}
|
|
@@ -14639,46 +15440,46 @@ function rewritePreservedFormulas(sheet, rewrite2) {
|
|
|
14639
15440
|
}
|
|
14640
15441
|
|
|
14641
15442
|
// xlsx/edit/shift-formulas.ts
|
|
14642
|
-
function safe(
|
|
15443
|
+
function safe(rewrite, formula, formulaSheet) {
|
|
14643
15444
|
try {
|
|
14644
|
-
return
|
|
15445
|
+
return rewrite(formula, formulaSheet);
|
|
14645
15446
|
} catch {
|
|
14646
15447
|
return formula;
|
|
14647
15448
|
}
|
|
14648
15449
|
}
|
|
14649
|
-
function rewriteFormulas(workbook,
|
|
14650
|
-
for (const sheet of workbook.sheets) rewriteSheetFormulas(sheet,
|
|
15450
|
+
function rewriteFormulas(workbook, rewrite) {
|
|
15451
|
+
for (const sheet of workbook.sheets) rewriteSheetFormulas(sheet, rewrite);
|
|
14651
15452
|
for (const definedName of workbook.definedNames) {
|
|
14652
15453
|
const local = definedName.localSheet === void 0 ? void 0 : workbook.sheets[definedName.localSheet];
|
|
14653
|
-
definedName.formula = safe(
|
|
15454
|
+
definedName.formula = safe(rewrite, definedName.formula, local?.name ?? "");
|
|
14654
15455
|
}
|
|
14655
15456
|
}
|
|
14656
|
-
function rewriteSheetFormulas(sheet,
|
|
14657
|
-
rewritePreservedFormulas(sheet,
|
|
15457
|
+
function rewriteSheetFormulas(sheet, rewrite) {
|
|
15458
|
+
rewritePreservedFormulas(sheet, rewrite);
|
|
14658
15459
|
{
|
|
14659
15460
|
const name = sheet.name;
|
|
14660
15461
|
for (const table2 of sheet.tables)
|
|
14661
15462
|
for (const column of table2.columns)
|
|
14662
15463
|
if (column.calculatedColumnFormula !== void 0)
|
|
14663
|
-
column.calculatedColumnFormula = safe(
|
|
15464
|
+
column.calculatedColumnFormula = safe(rewrite, column.calculatedColumnFormula, name);
|
|
14664
15465
|
for (const cells of sheet.rows.values())
|
|
14665
15466
|
for (const cell of cells.values())
|
|
14666
|
-
if (cell.formula !== void 0) cell.formula = safe(
|
|
15467
|
+
if (cell.formula !== void 0) cell.formula = safe(rewrite, cell.formula, name);
|
|
14667
15468
|
for (const cf of sheet.conditionalFormats)
|
|
14668
|
-
for (const rule of cf.rules) rewriteConditionalRule(rule, (f6) =>
|
|
15469
|
+
for (const rule of cf.rules) rewriteConditionalRule(rule, (f6) => rewrite(f6, name));
|
|
14669
15470
|
for (const dv of sheet.dataValidations) {
|
|
14670
|
-
if (dv.formula1 !== void 0) dv.formula1 = safe(
|
|
14671
|
-
if (dv.formula2 !== void 0) dv.formula2 = safe(
|
|
15471
|
+
if (dv.formula1 !== void 0) dv.formula1 = safe(rewrite, dv.formula1, name);
|
|
15472
|
+
if (dv.formula2 !== void 0) dv.formula2 = safe(rewrite, dv.formula2, name);
|
|
14672
15473
|
}
|
|
14673
15474
|
for (const link of sheet.hyperlinks)
|
|
14674
15475
|
if (link.location && /![A-Za-z$]/.test(link.location))
|
|
14675
|
-
link.location = safe(
|
|
15476
|
+
link.location = safe(rewrite, link.location, name);
|
|
14676
15477
|
for (const drawing of sheet.drawings) {
|
|
14677
15478
|
if (drawing.kind !== "chart") continue;
|
|
14678
15479
|
for (const series of drawing.series) {
|
|
14679
|
-
if (series.nameRef) series.nameRef = safe(
|
|
14680
|
-
if (series.categoriesRef) series.categoriesRef = safe(
|
|
14681
|
-
if (series.valuesRef) series.valuesRef = safe(
|
|
15480
|
+
if (series.nameRef) series.nameRef = safe(rewrite, series.nameRef, name);
|
|
15481
|
+
if (series.categoriesRef) series.categoriesRef = safe(rewrite, series.categoriesRef, name);
|
|
15482
|
+
if (series.valuesRef) series.valuesRef = safe(rewrite, series.valuesRef, name);
|
|
14682
15483
|
}
|
|
14683
15484
|
}
|
|
14684
15485
|
}
|
|
@@ -14865,7 +15666,7 @@ function shiftAxis(ctx, s, axis, at, count2, insert) {
|
|
|
14865
15666
|
applyAxisShift(ctx, sheet, shift2);
|
|
14866
15667
|
if (insert) inheritFormats(sheet, axis, at, count2);
|
|
14867
15668
|
},
|
|
14868
|
-
{ sheet: s, structural: true }
|
|
15669
|
+
{ sheet: s, structural: true, calc: { kind: "shift", sheet: s, shift: shift2 } }
|
|
14869
15670
|
);
|
|
14870
15671
|
}
|
|
14871
15672
|
var insertRows = (ctx, s, at, count2) => shiftAxis(ctx, s, "row", at, count2, true);
|
|
@@ -14979,7 +15780,7 @@ function pasteHyperlinks(sheet, dest, cells, transpose2, skipBlanks, cutLocation
|
|
|
14979
15780
|
}
|
|
14980
15781
|
|
|
14981
15782
|
// xlsx/edit/clipboard-html.ts
|
|
14982
|
-
var escapeHtml = (
|
|
15783
|
+
var escapeHtml = (text2) => text2.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">").replace(/"/g, """);
|
|
14983
15784
|
function cssColor(color, theme2) {
|
|
14984
15785
|
if (!color || color.auto) return void 0;
|
|
14985
15786
|
if (color.rgb) return `#${color.rgb.slice(-6)}`;
|
|
@@ -15044,12 +15845,12 @@ function toHtml(cells, theme2) {
|
|
|
15044
15845
|
if (cell && typeof cell.value === "number") attrs.push(`x:num="${cell.value}"`);
|
|
15045
15846
|
const css = cssFor(cell?.style, theme2);
|
|
15046
15847
|
if (css) attrs.push(`style="${escapeHtml(css)}"`);
|
|
15047
|
-
let
|
|
15848
|
+
let text2 = escapeHtml(cell?.text ?? "").replace(/\n/g, "<br>");
|
|
15048
15849
|
const link = links.get(`${r},${c}`);
|
|
15049
15850
|
const href = htmlHref(link);
|
|
15050
15851
|
if (href)
|
|
15051
|
-
|
|
15052
|
-
tds.push(`<td${attrs.length ? ` ${attrs.join(" ")}` : ""}>${
|
|
15852
|
+
text2 = `<a href="${escapeHtml(href)}"${link?.tooltip ? ` title="${escapeHtml(link.tooltip)}"` : ""}>${text2}</a>`;
|
|
15853
|
+
tds.push(`<td${attrs.length ? ` ${attrs.join(" ")}` : ""}>${text2}</td>`);
|
|
15053
15854
|
}
|
|
15054
15855
|
rows2.push(`<tr>${tds.join("")}</tr>`);
|
|
15055
15856
|
}
|
|
@@ -15077,8 +15878,8 @@ var NAMED_COLORS2 = {
|
|
|
15077
15878
|
aqua: "00FFFF",
|
|
15078
15879
|
fuchsia: "FF00FF"
|
|
15079
15880
|
};
|
|
15080
|
-
function parseCssColor(
|
|
15081
|
-
const value2 =
|
|
15881
|
+
function parseCssColor(text2) {
|
|
15882
|
+
const value2 = text2.trim().toLowerCase();
|
|
15082
15883
|
const hex2 = /^#([0-9a-f]{3}|[0-9a-f]{6})$/.exec(value2)?.[1];
|
|
15083
15884
|
if (hex2)
|
|
15084
15885
|
return {
|
|
@@ -15100,33 +15901,33 @@ var ENTITIES = {
|
|
|
15100
15901
|
apos: "'",
|
|
15101
15902
|
nbsp: " "
|
|
15102
15903
|
};
|
|
15103
|
-
function decodeEntities(
|
|
15104
|
-
return
|
|
15904
|
+
function decodeEntities(text2) {
|
|
15905
|
+
return text2.replace(/&(#x[0-9a-f]+|#\d+|[a-z]+);/gi, (whole, name) => {
|
|
15105
15906
|
if (name.startsWith("#x") || name.startsWith("#X"))
|
|
15106
15907
|
return String.fromCodePoint(parseInt(name.slice(2), 16));
|
|
15107
15908
|
if (name.startsWith("#")) return String.fromCodePoint(Number(name.slice(1)));
|
|
15108
15909
|
return ENTITIES[name.toLowerCase()] ?? whole;
|
|
15109
15910
|
});
|
|
15110
15911
|
}
|
|
15111
|
-
function parseAttributes(
|
|
15912
|
+
function parseAttributes(text2) {
|
|
15112
15913
|
const attrs = /* @__PURE__ */ new Map();
|
|
15113
|
-
for (const m of
|
|
15914
|
+
for (const m of text2.matchAll(
|
|
15114
15915
|
/([\w:-]{1,64})\s{0,16}=\s{0,16}(?:"([^"]*)"|'([^']*)'|([^\s>]+))/g
|
|
15115
15916
|
))
|
|
15116
15917
|
attrs.set((m[1] ?? "").toLowerCase(), decodeEntities(m[2] ?? m[3] ?? m[4] ?? ""));
|
|
15117
15918
|
return attrs;
|
|
15118
15919
|
}
|
|
15119
|
-
function parseCss(
|
|
15920
|
+
function parseCss(text2) {
|
|
15120
15921
|
const out = /* @__PURE__ */ new Map();
|
|
15121
|
-
for (const decl of
|
|
15922
|
+
for (const decl of text2.split(";")) {
|
|
15122
15923
|
const colon = decl.indexOf(":");
|
|
15123
15924
|
if (colon < 0) continue;
|
|
15124
15925
|
out.set(decl.slice(0, colon).trim().toLowerCase(), decl.slice(colon + 1).trim());
|
|
15125
15926
|
}
|
|
15126
15927
|
return out;
|
|
15127
15928
|
}
|
|
15128
|
-
function decodeNumberFormat(
|
|
15129
|
-
return
|
|
15929
|
+
function decodeNumberFormat(text2) {
|
|
15930
|
+
return text2.replace(/^["']|["']$/g, "").replace(/\\([0-9A-Fa-f]{4})/g, (_m, hex2) => String.fromCharCode(parseInt(hex2, 16))).replace(/\\(.)/g, "$1");
|
|
15130
15931
|
}
|
|
15131
15932
|
var H_ALIGN = {
|
|
15132
15933
|
left: "left",
|
|
@@ -15167,26 +15968,26 @@ function stylePatchFromCss(css, inner2) {
|
|
|
15167
15968
|
if (numFmt) patch.numFmt = decodeNumberFormat(numFmt);
|
|
15168
15969
|
return patch;
|
|
15169
15970
|
}
|
|
15170
|
-
function removeComments(
|
|
15971
|
+
function removeComments(text2) {
|
|
15171
15972
|
let out = "";
|
|
15172
15973
|
let from = 0;
|
|
15173
15974
|
for (; ; ) {
|
|
15174
|
-
const open =
|
|
15175
|
-
const close = open < 0 ? -1 :
|
|
15176
|
-
if (close < 0) return out +
|
|
15177
|
-
out +=
|
|
15975
|
+
const open = text2.indexOf("<!--", from);
|
|
15976
|
+
const close = open < 0 ? -1 : text2.indexOf("-->", open + 4);
|
|
15977
|
+
if (close < 0) return out + text2.slice(from);
|
|
15978
|
+
out += text2.slice(from, open);
|
|
15178
15979
|
from = close + 3;
|
|
15179
15980
|
}
|
|
15180
15981
|
}
|
|
15181
|
-
function removeTags(
|
|
15982
|
+
function removeTags(text2) {
|
|
15182
15983
|
let out = "";
|
|
15183
15984
|
let i2 = 0;
|
|
15184
|
-
while (i2 <
|
|
15185
|
-
const ch =
|
|
15985
|
+
while (i2 < text2.length) {
|
|
15986
|
+
const ch = text2[i2];
|
|
15186
15987
|
if (ch === "<") {
|
|
15187
15988
|
let j = i2 + 1;
|
|
15188
|
-
while (j <
|
|
15189
|
-
if (
|
|
15989
|
+
while (j < text2.length && text2[j] !== "<" && text2[j] !== ">") j++;
|
|
15990
|
+
if (text2[j] === ">") {
|
|
15190
15991
|
i2 = j + 1;
|
|
15191
15992
|
continue;
|
|
15192
15993
|
}
|
|
@@ -15198,15 +15999,15 @@ function removeTags(text) {
|
|
|
15198
15999
|
}
|
|
15199
16000
|
function stripTags(markup) {
|
|
15200
16001
|
let previous;
|
|
15201
|
-
let
|
|
16002
|
+
let text2 = markup;
|
|
15202
16003
|
do {
|
|
15203
|
-
previous =
|
|
15204
|
-
|
|
15205
|
-
} while (
|
|
15206
|
-
return removeAll(
|
|
16004
|
+
previous = text2;
|
|
16005
|
+
text2 = removeTags(removeComments(text2));
|
|
16006
|
+
} while (text2 !== previous);
|
|
16007
|
+
return removeAll(text2, ["<!--", "-->"]);
|
|
15207
16008
|
}
|
|
15208
|
-
function removeAll(
|
|
15209
|
-
let current =
|
|
16009
|
+
function removeAll(text2, tokens) {
|
|
16010
|
+
let current = text2;
|
|
15210
16011
|
let previous;
|
|
15211
16012
|
do {
|
|
15212
16013
|
previous = current;
|
|
@@ -15248,8 +16049,8 @@ function parseHtmlTable(html, base) {
|
|
|
15248
16049
|
for (const [k, v] of parseCss(attrs.get("style") ?? "")) css.set(k, v);
|
|
15249
16050
|
const patch = stylePatchFromCss(css, inner2);
|
|
15250
16051
|
if (td[1]?.toLowerCase() === "h") patch.font = { bold: true, ...patch.font };
|
|
15251
|
-
const
|
|
15252
|
-
row2[c] =
|
|
16052
|
+
const text2 = cellText(inner2);
|
|
16053
|
+
row2[c] = text2 === "" && !Object.keys(patch).length ? null : toCell(text2, attrs, patch, base);
|
|
15253
16054
|
const rowSpan = Math.max(1, Number(attrs.get("rowspan") ?? 1) || 1);
|
|
15254
16055
|
const colSpan = Math.max(1, Number(attrs.get("colspan") ?? 1) || 1);
|
|
15255
16056
|
const anchor = /<a\b([^>]*)>/i.exec(inner2);
|
|
@@ -15281,35 +16082,35 @@ function parseHtmlTable(html, base) {
|
|
|
15281
16082
|
);
|
|
15282
16083
|
return rows2 && cols ? { rows: rows2, cols, data, merges, hyperlinks } : void 0;
|
|
15283
16084
|
}
|
|
15284
|
-
function toCell(
|
|
15285
|
-
let value2 =
|
|
16085
|
+
function toCell(text2, attrs, patch, base) {
|
|
16086
|
+
let value2 = text2;
|
|
15286
16087
|
const num2 = attrs.get("x:num");
|
|
15287
16088
|
if (num2 !== void 0 && num2 !== "" && Number.isFinite(Number(num2))) value2 = Number(num2);
|
|
15288
|
-
else if (attrs.has("x:bool")) value2 =
|
|
15289
|
-
else if (patch.numFmt !== "@" &&
|
|
15290
|
-
const parsed = parseCellInput(
|
|
16089
|
+
else if (attrs.has("x:bool")) value2 = text2.toUpperCase() === "TRUE";
|
|
16090
|
+
else if (patch.numFmt !== "@" && text2 !== "") {
|
|
16091
|
+
const parsed = parseCellInput(text2);
|
|
15291
16092
|
if (parsed.formula === void 0) value2 = parsed.value;
|
|
15292
16093
|
if (!patch.numFmt && parsed.numFmt && typeof value2 === "number") patch.numFmt = parsed.numFmt;
|
|
15293
16094
|
}
|
|
15294
|
-
return { value: value2, text, style: patchStyle(base, patch) };
|
|
16095
|
+
return { value: value2, text: text2, style: patchStyle(base, patch) };
|
|
15295
16096
|
}
|
|
15296
16097
|
|
|
15297
16098
|
// xlsx/edit/clipboard-text.ts
|
|
15298
|
-
function quoteField(
|
|
15299
|
-
return /[\t\r\n"]/.test(
|
|
16099
|
+
function quoteField(text2) {
|
|
16100
|
+
return /[\t\r\n"]/.test(text2) ? `"${text2.replace(/"/g, '""')}"` : text2;
|
|
15300
16101
|
}
|
|
15301
16102
|
function toTsv(rows2) {
|
|
15302
16103
|
if (!rows2.length) return "";
|
|
15303
16104
|
return rows2.map((row2) => row2.map(quoteField).join(" ")).join("\r\n") + "\r\n";
|
|
15304
16105
|
}
|
|
15305
|
-
function parseTsv(
|
|
16106
|
+
function parseTsv(text2) {
|
|
15306
16107
|
const rows2 = [];
|
|
15307
16108
|
let row2 = [];
|
|
15308
16109
|
let field = "";
|
|
15309
16110
|
let i2 = 0;
|
|
15310
16111
|
let atFieldStart = true;
|
|
15311
|
-
const body2 =
|
|
15312
|
-
if (body2 === "") return
|
|
16112
|
+
const body2 = text2.replace(/\r\n?/g, "\n").replace(/\n$/, "");
|
|
16113
|
+
if (body2 === "") return text2 === "" ? [] : [[""]];
|
|
15313
16114
|
while (i2 < body2.length) {
|
|
15314
16115
|
const ch = body2[i2] ?? "";
|
|
15315
16116
|
if (atFieldStart && ch === '"') {
|
|
@@ -15344,10 +16145,10 @@ function parseTsv(text) {
|
|
|
15344
16145
|
for (const r of rows2) while (r.length < width) r.push("");
|
|
15345
16146
|
return rows2;
|
|
15346
16147
|
}
|
|
15347
|
-
function findClosingQuote(
|
|
15348
|
-
for (let i2 = from; i2 <
|
|
15349
|
-
if (
|
|
15350
|
-
if (
|
|
16148
|
+
function findClosingQuote(text2, from) {
|
|
16149
|
+
for (let i2 = from; i2 < text2.length; i2++) {
|
|
16150
|
+
if (text2[i2] !== '"') continue;
|
|
16151
|
+
if (text2[i2 + 1] === '"') {
|
|
15351
16152
|
i2++;
|
|
15352
16153
|
continue;
|
|
15353
16154
|
}
|
|
@@ -15624,12 +16425,12 @@ function copyRange(workbook, s, range2) {
|
|
|
15624
16425
|
cells
|
|
15625
16426
|
};
|
|
15626
16427
|
}
|
|
15627
|
-
function cellsFromText(workbook,
|
|
15628
|
-
if (/<table\b/i.test(
|
|
15629
|
-
const parsed = parseHtmlTable(
|
|
16428
|
+
function cellsFromText(workbook, text2) {
|
|
16429
|
+
if (/<table\b/i.test(text2)) {
|
|
16430
|
+
const parsed = parseHtmlTable(text2, styleAt(workbook, 0));
|
|
15630
16431
|
if (parsed) return parsed;
|
|
15631
16432
|
}
|
|
15632
|
-
const grid6 = parseTsv(
|
|
16433
|
+
const grid6 = parseTsv(text2);
|
|
15633
16434
|
const data = grid6.map(
|
|
15634
16435
|
(line2) => line2.map((field) => {
|
|
15635
16436
|
if (field === "") return null;
|
|
@@ -15824,13 +16625,32 @@ function pasteSelection(ctx, sheet, selection, payload, request) {
|
|
|
15824
16625
|
);
|
|
15825
16626
|
}
|
|
15826
16627
|
|
|
16628
|
+
// xlsx/edit/external.ts
|
|
16629
|
+
function applyExternal(host, apply) {
|
|
16630
|
+
if (host.busy()) throw new Error("Cannot apply an external change inside an edit");
|
|
16631
|
+
const change = apply();
|
|
16632
|
+
if (!change) return false;
|
|
16633
|
+
const structural = change.structural ?? false;
|
|
16634
|
+
host.calculator.afterExternal(structural, change.cells ?? []);
|
|
16635
|
+
const out = {
|
|
16636
|
+
kind: change.kind ?? "remote",
|
|
16637
|
+
label: change.label,
|
|
16638
|
+
structural,
|
|
16639
|
+
external: true
|
|
16640
|
+
};
|
|
16641
|
+
if (change.sheet !== void 0) out.sheet = change.sheet;
|
|
16642
|
+
if (change.ranges?.length) out.ranges = change.ranges;
|
|
16643
|
+
host.emit(out);
|
|
16644
|
+
return true;
|
|
16645
|
+
}
|
|
16646
|
+
|
|
15827
16647
|
// xlsx/edit/dimensions.ts
|
|
15828
16648
|
var MDW = 7;
|
|
15829
16649
|
var MAX_WIDTH = 255;
|
|
15830
16650
|
var MAX_HEIGHT = 409;
|
|
15831
|
-
function estimateWidth(
|
|
16651
|
+
function estimateWidth(text2, style2) {
|
|
15832
16652
|
const scale2 = (style2.font.size ?? 11) / 11;
|
|
15833
|
-
const longest = Math.max(...
|
|
16653
|
+
const longest = Math.max(...text2.split("\n").map((line2) => line2.length));
|
|
15834
16654
|
return longest * MDW * scale2 * (style2.font.bold ? 1.1 : 1);
|
|
15835
16655
|
}
|
|
15836
16656
|
var pixelsToWidth = (px) => Math.round((px + 5) / MDW * 256) / 256;
|
|
@@ -15839,9 +16659,9 @@ function fitColumnWidth(ctx, sheet, col, measure2) {
|
|
|
15839
16659
|
for (const [row2, cells] of sheet.rows) {
|
|
15840
16660
|
const cell = cells.get(col);
|
|
15841
16661
|
if (!cell || sheet.rowInfo.get(row2)?.hidden) continue;
|
|
15842
|
-
const
|
|
15843
|
-
if (!
|
|
15844
|
-
widest = Math.max(widest, measure2(
|
|
16662
|
+
const text2 = displayText(ctx.workbook, cell);
|
|
16663
|
+
if (!text2) continue;
|
|
16664
|
+
widest = Math.max(widest, measure2(text2, styleAt(ctx.workbook, cell.styleId)));
|
|
15845
16665
|
}
|
|
15846
16666
|
return widest < 0 ? void 0 : Math.min(MAX_WIDTH, pixelsToWidth(widest));
|
|
15847
16667
|
}
|
|
@@ -16092,8 +16912,8 @@ function applyFilter(ctx, sheet, filter2) {
|
|
|
16092
16912
|
for (let row2 = range2.start.row + 1; row2 <= range2.end.row; row2++) {
|
|
16093
16913
|
const visible = (filter2.columns ?? []).every((fc) => {
|
|
16094
16914
|
if (!fc.values && !fc.blank) return true;
|
|
16095
|
-
const
|
|
16096
|
-
return
|
|
16915
|
+
const text2 = displayText(ctx.workbook, getCell(sheet, row2, range2.start.col + fc.offset));
|
|
16916
|
+
return text2 === "" ? !!fc.blank : (fc.values ?? []).includes(text2);
|
|
16097
16917
|
});
|
|
16098
16918
|
const info = { ...sheet.rowInfo.get(row2) };
|
|
16099
16919
|
if (visible) delete info.hidden;
|
|
@@ -16192,11 +17012,11 @@ function formulaBarText(workbook, cell, options = {}) {
|
|
|
16192
17012
|
styleAt(workbook, cell.styleId).numFmt || "General",
|
|
16193
17013
|
workbook.date1904
|
|
16194
17014
|
);
|
|
16195
|
-
const
|
|
16196
|
-
if (
|
|
16197
|
-
const parsed = parseCellInput(
|
|
16198
|
-
const literal2 = parsed.formula === void 0 && parsed.value ===
|
|
16199
|
-
return literal2 ?
|
|
17015
|
+
const text2 = cell.richText?.length ? cell.richText.map((run) => run.text).join("") : value2;
|
|
17016
|
+
if (text2 === "" || options.quote === false) return text2;
|
|
17017
|
+
const parsed = parseCellInput(text2, { date1904: workbook.date1904 });
|
|
17018
|
+
const literal2 = parsed.formula === void 0 && parsed.value === text2;
|
|
17019
|
+
return literal2 ? text2 : `'${text2}`;
|
|
16200
17020
|
}
|
|
16201
17021
|
|
|
16202
17022
|
// xlsx/edit/find.ts
|
|
@@ -16215,7 +17035,7 @@ function queryPattern(query, global = false) {
|
|
|
16215
17035
|
if (query.wholeCell) source = `^(?:${source})$`;
|
|
16216
17036
|
return new RegExp(source, `${query.matchCase ? "" : "i"}${global ? "g" : ""}`);
|
|
16217
17037
|
}
|
|
16218
|
-
var escapeRegex2 = (
|
|
17038
|
+
var escapeRegex2 = (text2) => text2.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
16219
17039
|
function searchText(workbook, query, sheet, row2, col) {
|
|
16220
17040
|
const ws = workbook.sheets[sheet];
|
|
16221
17041
|
if (!ws) return "";
|
|
@@ -16232,25 +17052,25 @@ function findAll(workbook, query) {
|
|
|
16232
17052
|
for (const s of indices) {
|
|
16233
17053
|
const sheet = workbook.sheets[s];
|
|
16234
17054
|
if (!sheet) continue;
|
|
16235
|
-
const
|
|
17055
|
+
const positions2 = [];
|
|
16236
17056
|
if (query.lookIn === "comments")
|
|
16237
|
-
for (const c of sheet.comments)
|
|
16238
|
-
else forEachCell(sheet, (_cell, row2, col) =>
|
|
16239
|
-
if (query.order === "columns")
|
|
16240
|
-
else
|
|
16241
|
-
for (const [row2, col] of
|
|
17057
|
+
for (const c of sheet.comments) positions2.push([c.address.row, c.address.col]);
|
|
17058
|
+
else forEachCell(sheet, (_cell, row2, col) => positions2.push([row2, col]));
|
|
17059
|
+
if (query.order === "columns") positions2.sort((a, b) => a[1] - b[1] || a[0] - b[0]);
|
|
17060
|
+
else positions2.sort((a, b) => a[0] - b[0] || a[1] - b[1]);
|
|
17061
|
+
for (const [row2, col] of positions2) {
|
|
16242
17062
|
if (query.range && query.sheet !== void 0 && !rangeContains(query.range, { row: row2, col }))
|
|
16243
17063
|
continue;
|
|
16244
|
-
const
|
|
16245
|
-
if (
|
|
17064
|
+
const text2 = searchText(workbook, query, s, row2, col);
|
|
17065
|
+
if (text2 && pattern.test(text2)) matches2.push({ sheet: s, row: row2, col, text: text2 });
|
|
16246
17066
|
}
|
|
16247
17067
|
}
|
|
16248
17068
|
return matches2;
|
|
16249
17069
|
}
|
|
16250
|
-
function replaceText(
|
|
17070
|
+
function replaceText(text2, query, replacement) {
|
|
16251
17071
|
const pattern = queryPattern(query, true);
|
|
16252
|
-
if (!pattern) return
|
|
16253
|
-
return
|
|
17072
|
+
if (!pattern) return text2;
|
|
17073
|
+
return text2.replace(pattern, (match2) => match2 === "" ? "" : replacement);
|
|
16254
17074
|
}
|
|
16255
17075
|
var isSpilledAt = (workbook, at) => {
|
|
16256
17076
|
const sheet = workbook.sheets[at.sheet];
|
|
@@ -16309,10 +17129,10 @@ function replaceOne(ctx, query, replacement, at) {
|
|
|
16309
17129
|
const q = replaceQuery(query);
|
|
16310
17130
|
if (q.lookIn !== "comments" && isSpilledAt(ctx.workbook, at)) return false;
|
|
16311
17131
|
const pattern = queryPattern(q);
|
|
16312
|
-
const
|
|
16313
|
-
if (!pattern || !
|
|
16314
|
-
const match2 = { ...at, text };
|
|
16315
|
-
if (replaceText(
|
|
17132
|
+
const text2 = searchText(ctx.workbook, q, at.sheet, at.row, at.col);
|
|
17133
|
+
if (!pattern || !text2 || !pattern.test(text2)) return false;
|
|
17134
|
+
const match2 = { ...at, text: text2 };
|
|
17135
|
+
if (replaceText(text2, q, replacement) === text2) return false;
|
|
16316
17136
|
ctx.run(
|
|
16317
17137
|
"Replace",
|
|
16318
17138
|
"cells",
|
|
@@ -16660,6 +17480,14 @@ function setCalcMode(ctx, mode) {
|
|
|
16660
17480
|
|
|
16661
17481
|
// xlsx/edit/session-calc.ts
|
|
16662
17482
|
var isStructural = (step) => step.structural || step.entries.some((entry) => entry.before.kind !== "cells");
|
|
17483
|
+
function hintFor(step, mode) {
|
|
17484
|
+
const hint = step.calc;
|
|
17485
|
+
if (!hint) return void 0;
|
|
17486
|
+
if (hint.kind === "rename")
|
|
17487
|
+
return mode === "undo" ? { kind: "rename", from: hint.to, to: hint.from } : hint;
|
|
17488
|
+
return mode === "undo" ? void 0 : hint;
|
|
17489
|
+
}
|
|
17490
|
+
var settingsOf = (workbook) => `${workbook.iterate ? `${workbook.iterate.count}:${workbook.iterate.delta}` : ""}|${workbook.date1904}`;
|
|
16663
17491
|
var SessionCalculator = class {
|
|
16664
17492
|
constructor(workbook, calc, enabled) {
|
|
16665
17493
|
this.workbook = workbook;
|
|
@@ -16669,31 +17497,113 @@ var SessionCalculator = class {
|
|
|
16669
17497
|
workbook;
|
|
16670
17498
|
calc;
|
|
16671
17499
|
enabled;
|
|
16672
|
-
/** Structural edits
|
|
17500
|
+
/** Structural edits the engine could not follow leave the dependency graph stale (manual mode). */
|
|
16673
17501
|
staleGraph = false;
|
|
17502
|
+
/** Cells changed in manual mode since the last calculation. */
|
|
17503
|
+
dirty = [];
|
|
17504
|
+
/** The settings at the last calculation; undefined before the first. */
|
|
17505
|
+
calculated;
|
|
16674
17506
|
/** Recalculates after an applied, undone or redone step (failures become warnings). */
|
|
16675
|
-
afterStep(step) {
|
|
16676
|
-
if (!this.enabled)
|
|
17507
|
+
afterStep(step, mode = "apply") {
|
|
17508
|
+
if (!this.enabled) {
|
|
17509
|
+
this.calc.discardPreparation();
|
|
17510
|
+
return;
|
|
17511
|
+
}
|
|
17512
|
+
const structural = isStructural(step);
|
|
17513
|
+
const hint = structural ? hintFor(step, mode) : void 0;
|
|
16677
17514
|
if (calcModeOf(this.workbook) === "manual") {
|
|
16678
|
-
if (
|
|
17515
|
+
if (hint && !this.staleGraph && !this.dirty.length) {
|
|
17516
|
+
this.guard(() => this.follow(hint));
|
|
17517
|
+
return;
|
|
17518
|
+
}
|
|
17519
|
+
this.calc.discardPreparation();
|
|
17520
|
+
if (structural) this.staleGraph = true;
|
|
17521
|
+
else this.dirty.push(...touchedCells(step));
|
|
17522
|
+
return;
|
|
17523
|
+
}
|
|
17524
|
+
if (hint && !this.staleGraph) {
|
|
17525
|
+
this.guard(() => {
|
|
17526
|
+
this.follow(hint);
|
|
17527
|
+
this.calc.recalculateFrom(touchedCells(step));
|
|
17528
|
+
this.calculated = settingsOf(this.workbook);
|
|
17529
|
+
});
|
|
17530
|
+
return;
|
|
17531
|
+
}
|
|
17532
|
+
this.recalc(structural, () => touchedCells(step));
|
|
17533
|
+
}
|
|
17534
|
+
/** Recalculates after a change applied outside the history (a collaborator's edit). */
|
|
17535
|
+
afterExternal(structural, cells) {
|
|
17536
|
+
if (!this.enabled || calcModeOf(this.workbook) === "manual") {
|
|
17537
|
+
this.calc.discardPreparation();
|
|
17538
|
+
if (!this.enabled) return;
|
|
17539
|
+
if (structural) this.staleGraph = true;
|
|
17540
|
+
else this.dirty.push(...cells);
|
|
16679
17541
|
return;
|
|
16680
17542
|
}
|
|
17543
|
+
this.recalc(structural, () => cells);
|
|
17544
|
+
}
|
|
17545
|
+
follow(hint) {
|
|
17546
|
+
if (hint.kind === "shift") this.calc.shiftCells(hint.sheet, hint.shift);
|
|
17547
|
+
else this.calc.renameSheet(hint.from, hint.to);
|
|
17548
|
+
}
|
|
17549
|
+
guard(run) {
|
|
16681
17550
|
try {
|
|
16682
|
-
|
|
16683
|
-
else {
|
|
16684
|
-
const changed = touchedCells(step);
|
|
16685
|
-
if (changed.length) this.calc.recalculateFrom(changed);
|
|
16686
|
-
}
|
|
17551
|
+
run();
|
|
16687
17552
|
} catch (error) {
|
|
16688
17553
|
const message = `Recalculation failed: ${error instanceof Error ? error.message : String(error)}`;
|
|
16689
17554
|
if (!this.workbook.warnings.includes(message)) this.workbook.warnings.push(message);
|
|
16690
17555
|
}
|
|
16691
17556
|
}
|
|
16692
|
-
/**
|
|
17557
|
+
/** Builds the dependency graph ahead of the first edit (see `EditSession.prepareCalculation`). */
|
|
17558
|
+
prepare(timeRemaining) {
|
|
17559
|
+
if (!this.enabled || calcModeOf(this.workbook) === "manual" || this.staleGraph) return true;
|
|
17560
|
+
try {
|
|
17561
|
+
return this.calc.prepare(timeRemaining);
|
|
17562
|
+
} catch {
|
|
17563
|
+
this.calc.discardPreparation();
|
|
17564
|
+
return true;
|
|
17565
|
+
}
|
|
17566
|
+
}
|
|
17567
|
+
/**
|
|
17568
|
+
* Before a structural edit the graph can follow in place: finishes a graph being prepared (or
|
|
17569
|
+
* builds it) while it still matches the workbook, so the edit moves it instead of rebuilding.
|
|
17570
|
+
*/
|
|
17571
|
+
beforeStructural() {
|
|
17572
|
+
if (!this.enabled || calcModeOf(this.workbook) === "manual" || this.staleGraph) return;
|
|
17573
|
+
this.prepare();
|
|
17574
|
+
}
|
|
17575
|
+
recalc(structural, cells) {
|
|
17576
|
+
this.guard(() => {
|
|
17577
|
+
if (this.staleGraph || structural) this.full();
|
|
17578
|
+
else {
|
|
17579
|
+
const changed = cells();
|
|
17580
|
+
if (changed.length) this.calc.recalculateFrom(changed);
|
|
17581
|
+
this.calculated = settingsOf(this.workbook);
|
|
17582
|
+
}
|
|
17583
|
+
});
|
|
17584
|
+
}
|
|
17585
|
+
/** Rebuilds the dependency graph and recalculates every formula (Ctrl+Alt+F9). */
|
|
16693
17586
|
full() {
|
|
16694
17587
|
this.staleGraph = false;
|
|
17588
|
+
this.dirty = [];
|
|
16695
17589
|
this.calc.invalidate();
|
|
16696
17590
|
this.calc.recalculateAll();
|
|
17591
|
+
this.calculated = settingsOf(this.workbook);
|
|
17592
|
+
}
|
|
17593
|
+
/**
|
|
17594
|
+
* Calculate Now (F9): the cells changed since the last calculation, the formulas structural
|
|
17595
|
+
* edits queued, their dependents and the volatile functions. Everything when `full`, before
|
|
17596
|
+
* the session's first calculation, after the iteration settings changed or while the graph
|
|
17597
|
+
* is stale.
|
|
17598
|
+
*/
|
|
17599
|
+
now(full) {
|
|
17600
|
+
if (full || this.staleGraph || this.calculated !== settingsOf(this.workbook)) {
|
|
17601
|
+
this.full();
|
|
17602
|
+
return;
|
|
17603
|
+
}
|
|
17604
|
+
const changed = this.dirty;
|
|
17605
|
+
this.dirty = [];
|
|
17606
|
+
this.calc.recalculateFrom(changed);
|
|
16697
17607
|
}
|
|
16698
17608
|
/**
|
|
16699
17609
|
* Recalculates one sheet's formulas and their dependents (Shift+F9); after structural edits
|
|
@@ -17014,8 +17924,8 @@ function nextTableName(workbook) {
|
|
|
17014
17924
|
}
|
|
17015
17925
|
function uniqueHeaders(texts) {
|
|
17016
17926
|
const used = /* @__PURE__ */ new Set();
|
|
17017
|
-
return texts.map((
|
|
17018
|
-
let base =
|
|
17927
|
+
return texts.map((text2, i2) => {
|
|
17928
|
+
let base = text2.trim() || `Column${i2 + 1}`;
|
|
17019
17929
|
if (!used.has(base.toLowerCase())) {
|
|
17020
17930
|
used.add(base.toLowerCase());
|
|
17021
17931
|
return base;
|
|
@@ -17490,8 +18400,8 @@ function normalizeDigestAlgorithmName(name) {
|
|
|
17490
18400
|
// digest/base64.ts
|
|
17491
18401
|
var ALPHABET = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
|
|
17492
18402
|
var VALUES = new Map([...ALPHABET].map((char, index2) => [char, index2]));
|
|
17493
|
-
function decodeBase64(
|
|
17494
|
-
const compact3 =
|
|
18403
|
+
function decodeBase64(text2) {
|
|
18404
|
+
const compact3 = text2.replace(/\s+/g, "");
|
|
17495
18405
|
const body2 = compact3.replace(/={1,2}$/, "");
|
|
17496
18406
|
if (body2.length % 4 === 1) return void 0;
|
|
17497
18407
|
if (compact3.length !== body2.length && compact3.length % 4 !== 0) return void 0;
|
|
@@ -19500,6 +20410,222 @@ function bordersView(border, theme2) {
|
|
|
19500
20410
|
return out;
|
|
19501
20411
|
}
|
|
19502
20412
|
|
|
20413
|
+
// xlsx/layout/sparkline-view.ts
|
|
20414
|
+
var DEFAULTS = {
|
|
20415
|
+
colorSeries: "#376092",
|
|
20416
|
+
colorNegative: "#D00000",
|
|
20417
|
+
colorAxis: "#000000",
|
|
20418
|
+
colorMarkers: "#D00000",
|
|
20419
|
+
colorFirst: "#D00000",
|
|
20420
|
+
colorLast: "#D00000",
|
|
20421
|
+
colorHigh: "#D00000",
|
|
20422
|
+
colorLow: "#D00000"
|
|
20423
|
+
};
|
|
20424
|
+
var COLUMN_GAP = 0.2;
|
|
20425
|
+
function extent(values2) {
|
|
20426
|
+
let min = Infinity;
|
|
20427
|
+
let max = -Infinity;
|
|
20428
|
+
for (const v of values2) {
|
|
20429
|
+
if (v === null) continue;
|
|
20430
|
+
if (v < min) min = v;
|
|
20431
|
+
if (v > max) max = v;
|
|
20432
|
+
}
|
|
20433
|
+
return min <= max ? { min, max } : void 0;
|
|
20434
|
+
}
|
|
20435
|
+
function sparklineValues(group, values2) {
|
|
20436
|
+
return group.displayEmptyCellsAs === "zero" ? values2.map((v) => v ?? 0) : [...values2];
|
|
20437
|
+
}
|
|
20438
|
+
function sparklineScale(group, all2, index2) {
|
|
20439
|
+
const own = extent(sparklineValues(group, all2[index2]?.values ?? []));
|
|
20440
|
+
const needsGroup = group.minAxisType === "group" || group.maxAxisType === "group";
|
|
20441
|
+
const shared = needsGroup ? extent(all2.flatMap((data) => sparklineValues(group, data.values))) : void 0;
|
|
20442
|
+
const end = (type, manual, key) => {
|
|
20443
|
+
if (type === "custom" && manual !== void 0) return manual;
|
|
20444
|
+
if (type === "group" && shared) return shared[key];
|
|
20445
|
+
return own?.[key];
|
|
20446
|
+
};
|
|
20447
|
+
const min = end(group.minAxisType, group.manualMin, "min");
|
|
20448
|
+
const max = end(group.maxAxisType, group.manualMax, "max");
|
|
20449
|
+
return min === void 0 || max === void 0 ? void 0 : { min, max };
|
|
20450
|
+
}
|
|
20451
|
+
function positions(group, data, n) {
|
|
20452
|
+
const dates = data.dates;
|
|
20453
|
+
if (group.dateAxis && dates && dates.length === n) {
|
|
20454
|
+
const span4 = extent(dates);
|
|
20455
|
+
if (span4) {
|
|
20456
|
+
const width = span4.max - span4.min;
|
|
20457
|
+
return dates.map((d) => d === null ? null : width ? (d - span4.min) / width : 0.5);
|
|
20458
|
+
}
|
|
20459
|
+
}
|
|
20460
|
+
return Array.from({ length: n }, (_, i2) => n === 1 ? 0.5 : i2 / (n - 1));
|
|
20461
|
+
}
|
|
20462
|
+
function pointFacts(values2) {
|
|
20463
|
+
const numbers3 = values2.filter((x) => x !== null);
|
|
20464
|
+
let last = values2.length - 1;
|
|
20465
|
+
while (last >= 0 && values2[last] === null) last--;
|
|
20466
|
+
return {
|
|
20467
|
+
high: Math.max(...numbers3),
|
|
20468
|
+
low: Math.min(...numbers3),
|
|
20469
|
+
first: values2.findIndex((x) => x !== null),
|
|
20470
|
+
last
|
|
20471
|
+
};
|
|
20472
|
+
}
|
|
20473
|
+
function pointColor(group, v, i2, facts, colors, markers) {
|
|
20474
|
+
let color = markers && group.markers ? colors.colorMarkers : void 0;
|
|
20475
|
+
if (group.negative && v < 0) color = colors.colorNegative;
|
|
20476
|
+
if (group.high && v === facts.high) color = colors.colorHigh;
|
|
20477
|
+
if (group.low && v === facts.low) color = colors.colorLow;
|
|
20478
|
+
if (group.first && i2 === facts.first) color = colors.colorFirst;
|
|
20479
|
+
if (group.last && i2 === facts.last) color = colors.colorLast;
|
|
20480
|
+
return color;
|
|
20481
|
+
}
|
|
20482
|
+
function resolveColors(group, theme2) {
|
|
20483
|
+
const out = { ...DEFAULTS };
|
|
20484
|
+
for (const key of Object.keys(DEFAULTS)) {
|
|
20485
|
+
const color = group[key];
|
|
20486
|
+
out[key] = resolveColor(color, theme2, DEFAULTS[key]) ?? DEFAULTS[key];
|
|
20487
|
+
}
|
|
20488
|
+
return out;
|
|
20489
|
+
}
|
|
20490
|
+
function sparklineView(group, data, scale2, theme2) {
|
|
20491
|
+
const colors = resolveColors(group, theme2);
|
|
20492
|
+
const view = {
|
|
20493
|
+
type: group.type,
|
|
20494
|
+
color: colors.colorSeries,
|
|
20495
|
+
lineWeightPt: group.lineWeight,
|
|
20496
|
+
lines: [],
|
|
20497
|
+
markers: [],
|
|
20498
|
+
columns: []
|
|
20499
|
+
};
|
|
20500
|
+
const values2 = sparklineValues(group, data.values);
|
|
20501
|
+
const n = values2.length;
|
|
20502
|
+
if (!n || !scale2) return view;
|
|
20503
|
+
const facts = pointFacts(values2);
|
|
20504
|
+
const xs = positions(group, data, n);
|
|
20505
|
+
const flip = (x) => group.rightToLeft ? 1 - x : x;
|
|
20506
|
+
const range2 = scale2.max - scale2.min;
|
|
20507
|
+
const yOf = (v) => range2 ? Math.max(0, Math.min(1, (scale2.max - v) / range2)) : 0.5;
|
|
20508
|
+
if (group.type === "line") {
|
|
20509
|
+
let segment = [];
|
|
20510
|
+
values2.forEach((v, i2) => {
|
|
20511
|
+
const x = xs[i2];
|
|
20512
|
+
if (v === null || x === null || x === void 0) {
|
|
20513
|
+
if (group.displayEmptyCellsAs === "gap" && segment.length) {
|
|
20514
|
+
view.lines.push(segment);
|
|
20515
|
+
segment = [];
|
|
20516
|
+
}
|
|
20517
|
+
return;
|
|
20518
|
+
}
|
|
20519
|
+
const point = { x: flip(x), y: yOf(v) };
|
|
20520
|
+
segment.push(point);
|
|
20521
|
+
const color = pointColor(group, v, i2, facts, colors, true);
|
|
20522
|
+
if (color) view.markers.push({ ...point, color });
|
|
20523
|
+
});
|
|
20524
|
+
if (segment.length) view.lines.push(segment);
|
|
20525
|
+
} else {
|
|
20526
|
+
const slot = 1 / n;
|
|
20527
|
+
const w = slot * (1 - COLUMN_GAP);
|
|
20528
|
+
const base = yOf(Math.max(scale2.min, Math.min(scale2.max, 0)));
|
|
20529
|
+
values2.forEach((v, i2) => {
|
|
20530
|
+
const position = xs[i2];
|
|
20531
|
+
if (v === null || position === null || position === void 0) return;
|
|
20532
|
+
if (v === 0) return;
|
|
20533
|
+
let top;
|
|
20534
|
+
let bottom;
|
|
20535
|
+
if (group.type === "stacked") [top, bottom] = v > 0 ? [0, 0.5] : [0.5, 1];
|
|
20536
|
+
else if (!range2) [top, bottom] = [0, 1];
|
|
20537
|
+
else [top, bottom] = [Math.min(base, yOf(v)), Math.max(base, yOf(v))];
|
|
20538
|
+
const centre = flip(slot / 2 + position * (1 - slot));
|
|
20539
|
+
const color = pointColor(group, v, i2, facts, colors, false) ?? view.color;
|
|
20540
|
+
view.columns.push({ x: centre - w / 2, y: top, w, h: bottom - top, color });
|
|
20541
|
+
});
|
|
20542
|
+
}
|
|
20543
|
+
if (group.type === "stacked") {
|
|
20544
|
+
if (group.displayXAxis) view.axis = { y: 0.5, color: colors.colorAxis };
|
|
20545
|
+
} else if (group.displayXAxis && range2 && scale2.min <= 0 && scale2.max >= 0)
|
|
20546
|
+
view.axis = { y: yOf(0), color: colors.colorAxis };
|
|
20547
|
+
return view;
|
|
20548
|
+
}
|
|
20549
|
+
|
|
20550
|
+
// xlsx/layout/sparkline-data.ts
|
|
20551
|
+
var MAX_POINTS = 1e4;
|
|
20552
|
+
var hostIndex = /* @__PURE__ */ new WeakMap();
|
|
20553
|
+
function hosts(sheet) {
|
|
20554
|
+
const groups = sheetSparklineGroups(sheet);
|
|
20555
|
+
let index2 = hostIndex.get(groups);
|
|
20556
|
+
if (!index2) {
|
|
20557
|
+
index2 = /* @__PURE__ */ new Map();
|
|
20558
|
+
for (const group of groups)
|
|
20559
|
+
group.sparklines.forEach((line2, i2) => {
|
|
20560
|
+
const key = cellKey(line2.host.start.row, line2.host.start.col);
|
|
20561
|
+
if (!index2.has(key)) index2.set(key, { group, index: i2 });
|
|
20562
|
+
});
|
|
20563
|
+
hostIndex.set(groups, index2);
|
|
20564
|
+
}
|
|
20565
|
+
return index2;
|
|
20566
|
+
}
|
|
20567
|
+
function hasSparklineAt(sheet, row2, col) {
|
|
20568
|
+
return hosts(sheet).has(cellKey(row2, col));
|
|
20569
|
+
}
|
|
20570
|
+
function resolveSparklineRange(workbook, sheet, formula) {
|
|
20571
|
+
const ref = formula.trim().replace(/^=/, "");
|
|
20572
|
+
const bang = ref.lastIndexOf("!");
|
|
20573
|
+
let target2 = sheet;
|
|
20574
|
+
if (bang >= 0) {
|
|
20575
|
+
const raw = ref.slice(0, bang);
|
|
20576
|
+
const name = /^'.*'$/.test(raw) ? raw.slice(1, -1).replace(/''/g, "'") : raw;
|
|
20577
|
+
target2 = sheetByName(workbook, name);
|
|
20578
|
+
}
|
|
20579
|
+
const range2 = parseRange(ref.slice(bang + 1).replace(/\$/g, ""));
|
|
20580
|
+
return target2 && range2 ? { sheet: target2, range: normalizeRange(range2) } : void 0;
|
|
20581
|
+
}
|
|
20582
|
+
var rowHidden = (sheet, row2) => sheet.rowInfo.get(row2)?.hidden === true;
|
|
20583
|
+
var colHidden = (sheet, col) => sheet.columns.some((c) => c.hidden === true && col >= c.min && col <= c.max);
|
|
20584
|
+
function readSparklineValues(sheet, range2, displayHidden) {
|
|
20585
|
+
let endRow = range2.end.row;
|
|
20586
|
+
if (endRow - range2.start.row >= MAX_POINTS) {
|
|
20587
|
+
let lastRow = range2.start.row;
|
|
20588
|
+
for (const row2 of sheet.rows.keys()) if (row2 > lastRow) lastRow = row2;
|
|
20589
|
+
endRow = Math.min(endRow, lastRow);
|
|
20590
|
+
}
|
|
20591
|
+
const out = [];
|
|
20592
|
+
for (let row2 = range2.start.row; row2 <= endRow && out.length < MAX_POINTS; row2++) {
|
|
20593
|
+
if (!displayHidden && rowHidden(sheet, row2)) continue;
|
|
20594
|
+
for (let col = range2.start.col; col <= range2.end.col && out.length < MAX_POINTS; col++) {
|
|
20595
|
+
if (!displayHidden && colHidden(sheet, col)) continue;
|
|
20596
|
+
const value2 = getCell(sheet, row2, col)?.value;
|
|
20597
|
+
out.push(typeof value2 === "number" && Number.isFinite(value2) ? value2 : null);
|
|
20598
|
+
}
|
|
20599
|
+
}
|
|
20600
|
+
return out;
|
|
20601
|
+
}
|
|
20602
|
+
function groupData(workbook, sheet, group) {
|
|
20603
|
+
const dateRange = group.dateAxis && group.dateFormula;
|
|
20604
|
+
const dates = dateRange ? resolveSparklineRange(workbook, sheet, dateRange) : void 0;
|
|
20605
|
+
const dateValues = dates ? readSparklineValues(dates.sheet, dates.range, group.displayHidden) : void 0;
|
|
20606
|
+
return group.sparklines.map((line2) => {
|
|
20607
|
+
const source = line2.formula ? resolveSparklineRange(workbook, sheet, line2.formula) : void 0;
|
|
20608
|
+
const values2 = source ? readSparklineValues(source.sheet, source.range, group.displayHidden) : [];
|
|
20609
|
+
return dateValues ? { values: values2, dates: dateValues } : { values: values2 };
|
|
20610
|
+
});
|
|
20611
|
+
}
|
|
20612
|
+
function sparklineViewAt(workbook, sheetIndex2, row2, col) {
|
|
20613
|
+
const sheet = workbook.sheets[sheetIndex2];
|
|
20614
|
+
if (!sheet) return void 0;
|
|
20615
|
+
const entry = hosts(sheet).get(cellKey(row2, col));
|
|
20616
|
+
if (!entry) return void 0;
|
|
20617
|
+
const { group, index: index2 } = entry;
|
|
20618
|
+
const needsGroup = group.minAxisType === "group" || group.maxAxisType === "group";
|
|
20619
|
+
const data = needsGroup ? groupData(workbook, sheet, group) : groupData(workbook, sheet, { ...group, sparklines: [group.sparklines[index2]] });
|
|
20620
|
+
const at = needsGroup ? index2 : 0;
|
|
20621
|
+
return sparklineView(
|
|
20622
|
+
group,
|
|
20623
|
+
data[at] ?? { values: [] },
|
|
20624
|
+
sparklineScale(group, data, at),
|
|
20625
|
+
workbook.theme
|
|
20626
|
+
);
|
|
20627
|
+
}
|
|
20628
|
+
|
|
19503
20629
|
// xlsx/layout/units.ts
|
|
19504
20630
|
var DEFAULT_MAX_DIGIT_WIDTH = 7;
|
|
19505
20631
|
var DEFAULT_BASE_COL_WIDTH = 8;
|
|
@@ -19603,6 +20729,8 @@ function cellView(workbook, sheetIndex2, row2, col, cf, options = {}) {
|
|
|
19603
20729
|
if (fill) view.fill = fill;
|
|
19604
20730
|
if (conditional?.dataBar) view.dataBar = conditional.dataBar;
|
|
19605
20731
|
if (conditional?.icon) view.icon = conditional.icon;
|
|
20732
|
+
const sparkline = sparklineViewAt(workbook, sheetIndex2, row2, col);
|
|
20733
|
+
if (sparkline) view.sparkline = sparkline;
|
|
19606
20734
|
const link = sheet.hyperlinks.find((h2) => rangeContains(h2.range, { row: row2, col }));
|
|
19607
20735
|
if (link) {
|
|
19608
20736
|
view.hasHyperlink = true;
|
|
@@ -19809,9 +20937,9 @@ function lineHeightPoints(sizePt) {
|
|
|
19809
20937
|
}
|
|
19810
20938
|
return Math.max(0.75, Math.ceil(height / 0.75 - 1e-9) * 0.75);
|
|
19811
20939
|
}
|
|
19812
|
-
function wrappedLineCount(
|
|
20940
|
+
function wrappedLineCount(text2, width, measure2) {
|
|
19813
20941
|
let lines = 0;
|
|
19814
|
-
for (const paragraph of
|
|
20942
|
+
for (const paragraph of text2.split(/\r?\n/)) {
|
|
19815
20943
|
lines++;
|
|
19816
20944
|
if (width <= 0) continue;
|
|
19817
20945
|
let current = "";
|
|
@@ -19852,13 +20980,13 @@ function autoFitRowHeight(workbook, sheetIndex2, row2, measure2) {
|
|
|
19852
20980
|
let lines = 1;
|
|
19853
20981
|
if (view.wrap) {
|
|
19854
20982
|
const width = metrics.colWidth(col) - COLUMN_PADDING_PX - 1 - view.indentPx;
|
|
19855
|
-
lines = wrappedLineCount(view.text, width, (
|
|
20983
|
+
lines = wrappedLineCount(view.text, width, (text2) => measure2(text2, view.font));
|
|
19856
20984
|
}
|
|
19857
20985
|
tallest = Math.max(tallest, lines * lineHeightPoints(sizePt));
|
|
19858
20986
|
}
|
|
19859
20987
|
return tallest > 0 ? tallest : sheet.defaultRowHeight;
|
|
19860
20988
|
}
|
|
19861
|
-
var approximateMeasure = (
|
|
20989
|
+
var approximateMeasure = (text2, font) => text2.length * font.sizePx * (font.bold ? 0.58 : 0.53);
|
|
19862
20990
|
|
|
19863
20991
|
// xlsx/edit/row-autofit.ts
|
|
19864
20992
|
var MAX_HEIGHT2 = 409;
|
|
@@ -19984,12 +21112,12 @@ function renameSheet(ctx, index2, name) {
|
|
|
19984
21112
|
ctx.run(
|
|
19985
21113
|
"Rename sheet",
|
|
19986
21114
|
"sheets",
|
|
19987
|
-
[{ kind: "
|
|
21115
|
+
[{ kind: "refs" }],
|
|
19988
21116
|
() => {
|
|
19989
21117
|
rewriteFormulas(workbook, (formula) => renameSheetInFormula(formula, old, name));
|
|
19990
21118
|
sheet.name = name;
|
|
19991
21119
|
},
|
|
19992
|
-
{ sheet: index2, structural: true }
|
|
21120
|
+
{ sheet: index2, structural: true, calc: { kind: "rename", from: old, to: name } }
|
|
19993
21121
|
);
|
|
19994
21122
|
}
|
|
19995
21123
|
function moveSheet(ctx, from, to) {
|
|
@@ -20121,19 +21249,19 @@ function setTabColor(ctx, index2, color) {
|
|
|
20121
21249
|
|
|
20122
21250
|
// xlsx/edit/validation-list.ts
|
|
20123
21251
|
function listSource(workbook, sheet, formula, evaluate, at, depth = 0) {
|
|
20124
|
-
const
|
|
20125
|
-
const literal2 = /^"((?:[^"]|"")*)"$/.exec(
|
|
21252
|
+
const text2 = formula.replace(/^=/, "").trim();
|
|
21253
|
+
const literal2 = /^"((?:[^"]|"")*)"$/.exec(text2);
|
|
20126
21254
|
if (literal2)
|
|
20127
21255
|
return (literal2[1] ?? "").replace(/""/g, '"').split(",").map((s) => s.trim()).filter((s) => s !== "").map((s) => ({ text: s, value: parseCellInput(s, { date1904: workbook.date1904 }).value }));
|
|
20128
21256
|
const named2 = workbook.definedNames.find(
|
|
20129
|
-
(n) => n.name.toLowerCase() ===
|
|
21257
|
+
(n) => n.name.toLowerCase() === text2.toLowerCase() && (n.localSheet === void 0 || n.localSheet === sheet)
|
|
20130
21258
|
);
|
|
20131
21259
|
if (named2 && depth < 4)
|
|
20132
21260
|
return listSource(workbook, sheet, named2.formula, evaluate, at, depth + 1);
|
|
20133
|
-
const ref = /^(?:'((?:[^']|'')+)'|([^'!]+))!(.+)$/.exec(
|
|
21261
|
+
const ref = /^(?:'((?:[^']|'')+)'|([^'!]+))!(.+)$/.exec(text2);
|
|
20134
21262
|
const sheetName = ref ? ref[1]?.replace(/''/g, "'") ?? ref[2] : void 0;
|
|
20135
21263
|
const target2 = sheetName ? sheetByName(workbook, sheetName) : workbook.sheets[sheet];
|
|
20136
|
-
const range2 = parseRange((ref ? ref[3] ?? "" :
|
|
21264
|
+
const range2 = parseRange((ref ? ref[3] ?? "" : text2).replace(/\$/g, ""));
|
|
20137
21265
|
if (target2 && range2) {
|
|
20138
21266
|
const out = [];
|
|
20139
21267
|
forEachCellInRange(target2, range2, (cell) => {
|
|
@@ -20144,7 +21272,7 @@ function listSource(workbook, sheet, formula, evaluate, at, depth = 0) {
|
|
|
20144
21272
|
}
|
|
20145
21273
|
if (!evaluate) return void 0;
|
|
20146
21274
|
try {
|
|
20147
|
-
const value2 = evaluate(
|
|
21275
|
+
const value2 = evaluate(text2, at);
|
|
20148
21276
|
return value2 === null ? [] : [{ text: rawText(value2), value: value2 }];
|
|
20149
21277
|
} catch {
|
|
20150
21278
|
return void 0;
|
|
@@ -20183,12 +21311,12 @@ function validationAt(workbook, sheet, row2, col) {
|
|
|
20183
21311
|
}
|
|
20184
21312
|
function operand3(formula, evaluate, at) {
|
|
20185
21313
|
if (formula === void 0) return void 0;
|
|
20186
|
-
const
|
|
20187
|
-
if (
|
|
20188
|
-
const quoted = /^"((?:[^"]|"")*)"$/.exec(
|
|
21314
|
+
const text2 = formula.replace(/^=/, "").trim();
|
|
21315
|
+
if (text2 !== "" && Number.isFinite(Number(text2))) return Number(text2);
|
|
21316
|
+
const quoted = /^"((?:[^"]|"")*)"$/.exec(text2);
|
|
20189
21317
|
if (quoted) return (quoted[1] ?? "").replace(/""/g, '"');
|
|
20190
21318
|
try {
|
|
20191
|
-
return evaluate(
|
|
21319
|
+
return evaluate(text2, at);
|
|
20192
21320
|
} catch {
|
|
20193
21321
|
return void 0;
|
|
20194
21322
|
}
|
|
@@ -20230,8 +21358,8 @@ function relativeTo(dv, formula, at) {
|
|
|
20230
21358
|
const dRow = at.row - top;
|
|
20231
21359
|
const dCol = at.col - left2;
|
|
20232
21360
|
if (dRow === 0 && dCol === 0) return formula;
|
|
20233
|
-
const
|
|
20234
|
-
return translateFormula(
|
|
21361
|
+
const text2 = formula.replace(/^=/, "");
|
|
21362
|
+
return translateFormula(text2, dRow, dCol);
|
|
20235
21363
|
}
|
|
20236
21364
|
function withProposedValue(workbook, at, value2, fn) {
|
|
20237
21365
|
const sheet = workbook.sheets[at.sheet];
|
|
@@ -20365,13 +21493,12 @@ function createEditSession(workbook, options = {}) {
|
|
|
20365
21493
|
for (const listener of [...listeners2]) listener(change);
|
|
20366
21494
|
};
|
|
20367
21495
|
const calculator = new SessionCalculator(workbook, calc, autoRecalc);
|
|
20368
|
-
const recalc = (step) => calculator.afterStep(step);
|
|
20369
|
-
const begin = (label2, kind, info) =>
|
|
20370
|
-
step
|
|
20371
|
-
|
|
20372
|
-
sheet: info.sheet,
|
|
20373
|
-
|
|
20374
|
-
});
|
|
21496
|
+
const recalc = (step, mode = "apply") => calculator.afterStep(step, mode);
|
|
21497
|
+
const begin = (label2, kind, info) => {
|
|
21498
|
+
const step = { label: label2, entries: [], structural: info.structural ?? false };
|
|
21499
|
+
if (info.calc) step.calc = info.calc;
|
|
21500
|
+
return { step, kind, sheet: info.sheet, ranges: [...info.ranges ?? []] };
|
|
21501
|
+
};
|
|
20375
21502
|
const finish = (current) => {
|
|
20376
21503
|
if (!current.step.entries.length) return;
|
|
20377
21504
|
history.push(current.step);
|
|
@@ -20396,10 +21523,12 @@ function createEditSession(workbook, options = {}) {
|
|
|
20396
21523
|
const outer = !open;
|
|
20397
21524
|
const current = open ?? begin(label2, kind, info);
|
|
20398
21525
|
if (!outer) {
|
|
21526
|
+
delete current.step.calc;
|
|
20399
21527
|
if (info.structural) current.step.structural = true;
|
|
20400
21528
|
if (current.sheet === void 0 && info.sheet !== void 0) current.sheet = info.sheet;
|
|
20401
21529
|
current.ranges.push(...info.ranges ?? []);
|
|
20402
21530
|
}
|
|
21531
|
+
if (outer && info.calc) calculator.beforeStructural();
|
|
20403
21532
|
open = current;
|
|
20404
21533
|
const mark = current.step.entries.length;
|
|
20405
21534
|
const befores = scopes.map((scope) => captureScope(workbook, scope));
|
|
@@ -20447,14 +21576,14 @@ function createEditSession(workbook, options = {}) {
|
|
|
20447
21576
|
if (open) throw new Error(`Cannot ${kind} inside a batch`);
|
|
20448
21577
|
const step = kind === "undo" ? history.undo(workbook) : history.redo(workbook);
|
|
20449
21578
|
if (!step) return false;
|
|
20450
|
-
recalc(step);
|
|
21579
|
+
recalc(step, kind);
|
|
20451
21580
|
emit({ kind, label: step.label, structural: step.structural });
|
|
20452
21581
|
return true;
|
|
20453
21582
|
};
|
|
20454
21583
|
return {
|
|
20455
21584
|
workbook,
|
|
20456
21585
|
calc,
|
|
20457
|
-
setCellInput: (s, r, c,
|
|
21586
|
+
setCellInput: (s, r, c, text2) => setCellInput(ctx, s, r, c, text2),
|
|
20458
21587
|
setCellValue: (s, r, c, value2) => setCellValue(ctx, s, r, c, value2),
|
|
20459
21588
|
setRangeValues: (s, at, rows2) => setRangeValues(ctx, s, at, rows2),
|
|
20460
21589
|
clearRange: (s, range2, what) => clearRange(ctx, s, range2, what),
|
|
@@ -20487,7 +21616,7 @@ function createEditSession(workbook, options = {}) {
|
|
|
20487
21616
|
setSheetState: (i2, state) => setSheetState(ctx, i2, state),
|
|
20488
21617
|
setTabColor: (i2, color) => setTabColor(ctx, i2, color),
|
|
20489
21618
|
setFreeze: (s, freeze) => setFreeze(ctx, s, freeze),
|
|
20490
|
-
setComment: (s, at,
|
|
21619
|
+
setComment: (s, at, text2, author) => setComment(ctx, s, at, text2, author),
|
|
20491
21620
|
setHyperlink: (s, range2, link) => setHyperlink(ctx, s, range2, link),
|
|
20492
21621
|
addConditionalFormat: (s, cf) => addConditionalFormat(ctx, s, cf),
|
|
20493
21622
|
clearConditionalFormats: (s, range2) => clearConditionalFormats(ctx, s, range2),
|
|
@@ -20526,10 +21655,11 @@ function createEditSession(workbook, options = {}) {
|
|
|
20526
21655
|
setDocumentProperties: (patch) => setDocumentProperties(ctx, patch),
|
|
20527
21656
|
setAutoRecalc: (enabled) => setCalcMode(ctx, enabled ? "auto" : "manual"),
|
|
20528
21657
|
autoRecalc: () => autoRecalc && calcModeOf(workbook) === "auto",
|
|
20529
|
-
calculateNow() {
|
|
20530
|
-
calculator.full
|
|
21658
|
+
calculateNow(options2) {
|
|
21659
|
+
calculator.now(options2?.full ?? false);
|
|
20531
21660
|
emit({ kind: "cells", label: "Calculate now", structural: false });
|
|
20532
21661
|
},
|
|
21662
|
+
prepareCalculation: (opts) => calculator.prepare(opts?.timeRemaining),
|
|
20533
21663
|
calculateSheet(s) {
|
|
20534
21664
|
calculator.sheet(s);
|
|
20535
21665
|
emit({ kind: "cells", label: "Calculate sheet", sheet: s, structural: false });
|
|
@@ -20564,18 +21694,19 @@ function createEditSession(workbook, options = {}) {
|
|
|
20564
21694
|
onChange(listener) {
|
|
20565
21695
|
listeners2.add(listener);
|
|
20566
21696
|
return () => listeners2.delete(listener);
|
|
20567
|
-
}
|
|
21697
|
+
},
|
|
21698
|
+
applyExternal: (apply) => applyExternal({ calculator, emit, busy: () => !!open }, apply)
|
|
20568
21699
|
};
|
|
20569
21700
|
}
|
|
20570
21701
|
|
|
20571
21702
|
// xlsx/layout/cf-helpers.ts
|
|
20572
21703
|
function literal(formula) {
|
|
20573
|
-
const
|
|
20574
|
-
if (/^[+-]?(\d+\.?\d*|\.\d+)(e[+-]?\d+)?$/i.test(
|
|
20575
|
-
const quoted = /^"((?:[^"]|"")*)"$/.exec(
|
|
21704
|
+
const text2 = formula.trim();
|
|
21705
|
+
if (/^[+-]?(\d+\.?\d*|\.\d+)(e[+-]?\d+)?$/i.test(text2)) return Number(text2);
|
|
21706
|
+
const quoted = /^"((?:[^"]|"")*)"$/.exec(text2);
|
|
20576
21707
|
if (quoted) return (quoted[1] ?? "").replace(/""/g, '"');
|
|
20577
|
-
if (/^TRUE$/i.test(
|
|
20578
|
-
if (/^FALSE$/i.test(
|
|
21708
|
+
if (/^TRUE$/i.test(text2)) return true;
|
|
21709
|
+
if (/^FALSE$/i.test(text2)) return false;
|
|
20579
21710
|
return void 0;
|
|
20580
21711
|
}
|
|
20581
21712
|
function localTodaySerial(date1904) {
|
|
@@ -20922,12 +22053,12 @@ function createConditionalFormatEvaluator(workbook, sheetIndex2, evaluate, optio
|
|
|
20922
22053
|
case "beginsWith":
|
|
20923
22054
|
case "endsWith": {
|
|
20924
22055
|
if (isCellError(value2)) return false;
|
|
20925
|
-
const
|
|
22056
|
+
const text2 = valueText(value2).toLowerCase();
|
|
20926
22057
|
const needle = rule.text.toLowerCase();
|
|
20927
|
-
if (rule.type === "containsText") return
|
|
20928
|
-
if (rule.type === "notContainsText") return !
|
|
20929
|
-
if (rule.type === "beginsWith") return
|
|
20930
|
-
return
|
|
22058
|
+
if (rule.type === "containsText") return text2.includes(needle);
|
|
22059
|
+
if (rule.type === "notContainsText") return !text2.includes(needle);
|
|
22060
|
+
if (rule.type === "beginsWith") return text2.startsWith(needle);
|
|
22061
|
+
return text2.endsWith(needle);
|
|
20931
22062
|
}
|
|
20932
22063
|
case "timePeriod":
|
|
20933
22064
|
return typeof value2 === "number" && inTimePeriod(rule.timePeriod, value2, today(), workbook.date1904);
|
|
@@ -21058,7 +22189,7 @@ function overflowExtent(sheet, metrics, row2, col, textWidth, hAlign, maxSpan =
|
|
|
21058
22189
|
return result2();
|
|
21059
22190
|
}
|
|
21060
22191
|
|
|
21061
|
-
//
|
|
22192
|
+
// text/css-font-family.ts
|
|
21062
22193
|
var FALLBACKS = {
|
|
21063
22194
|
calibri: '"Calibri", "Carlito", "Segoe UI", Arial, sans-serif',
|
|
21064
22195
|
"calibri light": '"Calibri Light", "Calibri", "Carlito", "Segoe UI", Arial, sans-serif',
|
|
@@ -21459,7 +22590,7 @@ function styleCssFont(style2) {
|
|
|
21459
22590
|
}
|
|
21460
22591
|
function measure(ctx) {
|
|
21461
22592
|
const grid6 = ctx.grid();
|
|
21462
|
-
return grid6 ? (
|
|
22593
|
+
return grid6 ? (text2, style2) => grid6.measureText(text2, styleCssFont(style2)) : void 0;
|
|
21463
22594
|
}
|
|
21464
22595
|
var UNSET = void 0;
|
|
21465
22596
|
|
|
@@ -21838,19 +22969,19 @@ function mergeMessageModules(modules) {
|
|
|
21838
22969
|
for (const value2 of Object.values(module)) {
|
|
21839
22970
|
if (!value2 || typeof value2 !== "object" || Array.isArray(value2)) continue;
|
|
21840
22971
|
const entries = Object.entries(value2);
|
|
21841
|
-
if (!entries.every(([,
|
|
21842
|
-
for (const [key,
|
|
22972
|
+
if (!entries.every(([, text2]) => typeof text2 === "string")) continue;
|
|
22973
|
+
for (const [key, text2] of entries) merged[key] = text2;
|
|
21843
22974
|
}
|
|
21844
22975
|
}
|
|
21845
22976
|
return merged;
|
|
21846
22977
|
}
|
|
21847
22978
|
|
|
21848
22979
|
// i18n/translator.ts
|
|
21849
|
-
var
|
|
22980
|
+
var SINGLE2 = /\{(\w+)\}/g;
|
|
21850
22981
|
var DOUBLE = /\{\{\s*(\w+)\s*\}\}/g;
|
|
21851
22982
|
function interpolate(template, params, placeholder = "single") {
|
|
21852
22983
|
if (!params) return template;
|
|
21853
|
-
const pattern = placeholder === "double" ? DOUBLE :
|
|
22984
|
+
const pattern = placeholder === "double" ? DOUBLE : SINGLE2;
|
|
21854
22985
|
return template.replace(
|
|
21855
22986
|
pattern,
|
|
21856
22987
|
(match2, name) => Object.prototype.hasOwnProperty.call(params, name) && params[name] !== void 0 ? String(params[name]) : match2
|
|
@@ -21859,15 +22990,45 @@ function interpolate(template, params, placeholder = "single") {
|
|
|
21859
22990
|
function createTranslator(messages, fallbacks = [], options = {}) {
|
|
21860
22991
|
const placeholder = options.placeholder ?? "single";
|
|
21861
22992
|
return (key, params) => {
|
|
21862
|
-
let
|
|
21863
|
-
for (let i2 = 0;
|
|
21864
|
-
return interpolate(
|
|
22993
|
+
let text2 = messages?.[key];
|
|
22994
|
+
for (let i2 = 0; text2 === void 0 && i2 < fallbacks.length; i2++) text2 = fallbacks[i2]?.[key];
|
|
22995
|
+
return interpolate(text2 ?? options.missing?.(key) ?? key, params, placeholder);
|
|
21865
22996
|
};
|
|
21866
22997
|
}
|
|
21867
22998
|
|
|
21868
22999
|
// xlsx/ui/locales/merge.ts
|
|
21869
23000
|
var mergeStringModules = mergeMessageModules;
|
|
21870
23001
|
|
|
23002
|
+
// xlsx/ui/locales/de/collab.ts
|
|
23003
|
+
var collab_exports = {};
|
|
23004
|
+
__export(collab_exports, {
|
|
23005
|
+
collab: () => collab
|
|
23006
|
+
});
|
|
23007
|
+
var collab = {
|
|
23008
|
+
Share: "Freigeben",
|
|
23009
|
+
"Session name": "Sitzungsname",
|
|
23010
|
+
"Start sharing": "Freigabe starten",
|
|
23011
|
+
"Stop sharing": "Freigabe beenden",
|
|
23012
|
+
"People in this session": "Personen in dieser Sitzung",
|
|
23013
|
+
"Session: {room}": "Sitzung: {room}",
|
|
23014
|
+
"Not sharing.": "Keine Freigabe aktiv.",
|
|
23015
|
+
"Connecting...": "Verbindung wird hergestellt...",
|
|
23016
|
+
"Connected.": "Verbunden.",
|
|
23017
|
+
"Joining the session...": "Sitzung wird beigetreten...",
|
|
23018
|
+
"Disconnected. Changes are kept and sent when the connection returns.": "Getrennt. \xC4nderungen bleiben erhalten und werden gesendet, sobald die Verbindung zur\xFCck ist.",
|
|
23019
|
+
"The connection failed. Changes are kept and sent when the connection returns.": "Die Verbindung ist fehlgeschlagen. \xC4nderungen bleiben erhalten und werden gesendet, sobald die Verbindung zur\xFCck ist.",
|
|
23020
|
+
"Edit this workbook together with other people. Everyone who joins the same session sees changes as they are made.": "Bearbeiten Sie diese Arbeitsmappe gemeinsam mit anderen. Alle, die derselben Sitzung beitreten, sehen \xC4nderungen sofort.",
|
|
23021
|
+
"Cell values, formulas, formats, sheets, rows, columns, merges and names are shared. Charts, pictures, comments, conditional formats, data validation, tables and page setup stay in this window.": "Zellwerte, Formeln, Formate, Bl\xE4tter, Zeilen, Spalten, verbundene Zellen und Namen werden geteilt. Diagramme, Bilder, Kommentare, bedingte Formatierungen, Daten\xFCberpr\xFCfung, Tabellen und Seiteneinrichtung bleiben in diesem Fenster.",
|
|
23022
|
+
"Without a server set by the page, a session connects only windows and tabs of this browser. Nothing is uploaded.": "Ohne einen von der Seite festgelegten Server verbindet eine Sitzung nur Fenster und Tabs dieses Browsers. Es wird nichts hochgeladen.",
|
|
23023
|
+
"Reconnected. Changes made while offline were sent.": "Wieder verbunden. Offline vorgenommene \xC4nderungen wurden gesendet.",
|
|
23024
|
+
"Connection lost. Keep working; your changes are sent when it returns.": "Verbindung verloren. Arbeiten Sie weiter; Ihre \xC4nderungen werden gesendet, sobald sie zur\xFCck ist.",
|
|
23025
|
+
"Sharing stopped because another workbook was opened.": "Die Freigabe wurde beendet, weil eine andere Arbeitsmappe ge\xF6ffnet wurde.",
|
|
23026
|
+
"Open or create a workbook before sharing it.": "\xD6ffnen oder erstellen Sie eine Arbeitsmappe, bevor Sie sie freigeben.",
|
|
23027
|
+
"Use 1 to 128 letters, digits, hyphens or underscores for the room name.": "Verwenden Sie f\xFCr den Sitzungsnamen 1 bis 128 Buchstaben, Ziffern, Bindestriche oder Unterstriche.",
|
|
23028
|
+
"This browser cannot share between windows; pass a server URL.": "Dieser Browser kann nicht zwischen Fenstern teilen; geben Sie eine Server-URL an.",
|
|
23029
|
+
"Stop the current collaboration session first.": "Beenden Sie zuerst die aktuelle Zusammenarbeitssitzung."
|
|
23030
|
+
};
|
|
23031
|
+
|
|
21871
23032
|
// xlsx/ui/locales/de/commands.ts
|
|
21872
23033
|
var commands_exports = {};
|
|
21873
23034
|
__export(commands_exports, {
|
|
@@ -23437,11 +24598,17 @@ var NAVIGATION_STRINGS = {
|
|
|
23437
24598
|
Hyperlinks: ["Liens hypertexte", "Hyperlinks", "Hiperv\xEDnculos", "\u8D85\u94FE\u63A5"],
|
|
23438
24599
|
"Sort and filter": ["Tri et filtre", "Sortieren und Filtern", "Ordenar y filtrar", "\u6392\u5E8F\u548C\u7B5B\u9009"],
|
|
23439
24600
|
"Freeze panes": ["Figer les volets", "Fenster fixieren", "Inmovilizar paneles", "\u51BB\u7ED3\u7A97\u683C"],
|
|
23440
|
-
"Pivot tables
|
|
23441
|
-
"Tableaux crois\xE9s dynamiques
|
|
23442
|
-
"PivotTables
|
|
23443
|
-
"Tablas din\xE1micas
|
|
23444
|
-
"\u6570\u636E\u900F\u89C6\u8868
|
|
24601
|
+
"Pivot tables (kept in the file but not shown)": [
|
|
24602
|
+
"Tableaux crois\xE9s dynamiques (conserv\xE9s dans le fichier mais non affich\xE9s)",
|
|
24603
|
+
"PivotTables (in der Datei erhalten, aber nicht angezeigt)",
|
|
24604
|
+
"Tablas din\xE1micas (se conservan en el archivo, pero no se muestran)",
|
|
24605
|
+
"\u6570\u636E\u900F\u89C6\u8868(\u4FDD\u7559\u5728\u6587\u4EF6\u4E2D\u4F46\u4E0D\u663E\u793A)"
|
|
24606
|
+
],
|
|
24607
|
+
"Creating or editing sparklines (existing ones are shown)": [
|
|
24608
|
+
"Cr\xE9ation ou modification de graphiques sparkline (ceux existants sont affich\xE9s)",
|
|
24609
|
+
"Sparklines erstellen oder bearbeiten (vorhandene werden angezeigt)",
|
|
24610
|
+
"Crear o editar minigr\xE1ficos (los existentes se muestran)",
|
|
24611
|
+
"\u521B\u5EFA\u6216\u7F16\u8F91\u8FF7\u4F60\u56FE(\u73B0\u6709\u8FF7\u4F60\u56FE\u4F1A\u663E\u793A)"
|
|
23445
24612
|
],
|
|
23446
24613
|
"Show Formulas": ["Afficher les formules", "Formeln anzeigen", "Mostrar f\xF3rmulas", "\u663E\u793A\u516C\u5F0F"],
|
|
23447
24614
|
"Manual calculation": ["Calcul manuel", "Manuelle Berechnung", "C\xE1lculo manual", "\u624B\u52A8\u8BA1\u7B97"],
|
|
@@ -25940,7 +27107,7 @@ var shell = {
|
|
|
25940
27107
|
"Inspect Workbook": "Arbeitsmappe pr\xFCfen",
|
|
25941
27108
|
"Compatibility notes": "Kompatibilit\xE4tshinweise",
|
|
25942
27109
|
"No compatibility notes for this workbook.": "Keine Kompatibilit\xE4tshinweise f\xFCr diese Arbeitsmappe.",
|
|
25943
|
-
"Charts are shown but not edited; pivot tables,
|
|
27110
|
+
"Charts and sparklines are shown but not edited; pivot tables, macros and other unsupported parts are kept in the file but not shown.": "Diagramme und Sparklines werden angezeigt, aber nicht bearbeitet; PivotTables, Makros und andere nicht unterst\xFCtzte Teile bleiben in der Datei erhalten, werden aber nicht angezeigt.",
|
|
25944
27111
|
"This workbook was opened from an Excel 97-2003 file (.xls). Save writes an Excel Workbook (.xlsx); the original .xls file is not changed.": "Diese Arbeitsmappe wurde aus einer Excel 97-2003-Datei (.xls) ge\xF6ffnet. Beim Speichern entsteht eine Excel-Arbeitsmappe (.xlsx); die urspr\xFCngliche .xls-Datei bleibt unver\xE4ndert.",
|
|
25945
27112
|
"This workbook was opened from a CSV file, which keeps values only. Save writes an Excel Workbook (.xlsx); use Export to write CSV.": "Diese Arbeitsmappe wurde aus einer CSV-Datei ge\xF6ffnet, die nur Werte enth\xE4lt. Beim Speichern entsteht eine Excel-Arbeitsmappe (.xlsx); verwenden Sie Exportieren, um CSV zu schreiben.",
|
|
25946
27113
|
"Macros are kept in the file but do not run in this editor.": "Makros bleiben in der Datei erhalten, werden in diesem Editor aber nicht ausgef\xFChrt.",
|
|
@@ -26057,11 +27224,42 @@ var shell = {
|
|
|
26057
27224
|
|
|
26058
27225
|
// xlsx/ui/locales/de/index.ts
|
|
26059
27226
|
var de = mergeStringModules({
|
|
27227
|
+
"./collab.ts": collab_exports,
|
|
26060
27228
|
"./commands.ts": commands_exports,
|
|
26061
27229
|
"./grid.ts": grid_exports,
|
|
26062
27230
|
"./shell.ts": shell_exports
|
|
26063
27231
|
});
|
|
26064
27232
|
|
|
27233
|
+
// xlsx/ui/locales/en/collab.ts
|
|
27234
|
+
var collab_exports2 = {};
|
|
27235
|
+
__export(collab_exports2, {
|
|
27236
|
+
collab: () => collab2
|
|
27237
|
+
});
|
|
27238
|
+
var collab2 = {
|
|
27239
|
+
Share: "Share",
|
|
27240
|
+
"Session name": "Session name",
|
|
27241
|
+
"Start sharing": "Start sharing",
|
|
27242
|
+
"Stop sharing": "Stop sharing",
|
|
27243
|
+
"People in this session": "People in this session",
|
|
27244
|
+
"Session: {room}": "Session: {room}",
|
|
27245
|
+
"Not sharing.": "Not sharing.",
|
|
27246
|
+
"Connecting...": "Connecting...",
|
|
27247
|
+
"Connected.": "Connected.",
|
|
27248
|
+
"Joining the session...": "Joining the session...",
|
|
27249
|
+
"Disconnected. Changes are kept and sent when the connection returns.": "Disconnected. Changes are kept and sent when the connection returns.",
|
|
27250
|
+
"The connection failed. Changes are kept and sent when the connection returns.": "The connection failed. Changes are kept and sent when the connection returns.",
|
|
27251
|
+
"Edit this workbook together with other people. Everyone who joins the same session sees changes as they are made.": "Edit this workbook together with other people. Everyone who joins the same session sees changes as they are made.",
|
|
27252
|
+
"Cell values, formulas, formats, sheets, rows, columns, merges and names are shared. Charts, pictures, comments, conditional formats, data validation, tables and page setup stay in this window.": "Cell values, formulas, formats, sheets, rows, columns, merges and names are shared. Charts, pictures, comments, conditional formats, data validation, tables and page setup stay in this window.",
|
|
27253
|
+
"Without a server set by the page, a session connects only windows and tabs of this browser. Nothing is uploaded.": "Without a server set by the page, a session connects only windows and tabs of this browser. Nothing is uploaded.",
|
|
27254
|
+
"Reconnected. Changes made while offline were sent.": "Reconnected. Changes made while offline were sent.",
|
|
27255
|
+
"Connection lost. Keep working; your changes are sent when it returns.": "Connection lost. Keep working; your changes are sent when it returns.",
|
|
27256
|
+
"Sharing stopped because another workbook was opened.": "Sharing stopped because another workbook was opened.",
|
|
27257
|
+
"Open or create a workbook before sharing it.": "Open or create a workbook before sharing it.",
|
|
27258
|
+
"Use 1 to 128 letters, digits, hyphens or underscores for the room name.": "Use 1 to 128 letters, digits, hyphens or underscores for the room name.",
|
|
27259
|
+
"This browser cannot share between windows; pass a server URL.": "This browser cannot share between windows; pass a server URL.",
|
|
27260
|
+
"Stop the current collaboration session first.": "Stop the current collaboration session first."
|
|
27261
|
+
};
|
|
27262
|
+
|
|
26065
27263
|
// xlsx/ui/locales/en/commands.ts
|
|
26066
27264
|
var commands_exports2 = {};
|
|
26067
27265
|
__export(commands_exports2, {
|
|
@@ -26294,7 +27492,7 @@ var shell2 = {
|
|
|
26294
27492
|
"Inspect Workbook": "Inspect Workbook",
|
|
26295
27493
|
"Compatibility notes": "Compatibility notes",
|
|
26296
27494
|
"No compatibility notes for this workbook.": "No compatibility notes for this workbook.",
|
|
26297
|
-
"Charts are shown but not edited; pivot tables,
|
|
27495
|
+
"Charts and sparklines are shown but not edited; pivot tables, macros and other unsupported parts are kept in the file but not shown.": "Charts and sparklines are shown but not edited; pivot tables, macros and other unsupported parts are kept in the file but not shown.",
|
|
26298
27496
|
"This workbook was opened from an Excel 97-2003 file (.xls). Save writes an Excel Workbook (.xlsx); the original .xls file is not changed.": "This workbook was opened from an Excel 97-2003 file (.xls). Save writes an Excel Workbook (.xlsx); the original .xls file is not changed.",
|
|
26299
27497
|
"This workbook was opened from a CSV file, which keeps values only. Save writes an Excel Workbook (.xlsx); use Export to write CSV.": "This workbook was opened from a CSV file, which keeps values only. Save writes an Excel Workbook (.xlsx); use Export to write CSV.",
|
|
26300
27498
|
"Macros are kept in the file but do not run in this editor.": "Macros are kept in the file but do not run in this editor.",
|
|
@@ -26411,11 +27609,42 @@ var shell2 = {
|
|
|
26411
27609
|
|
|
26412
27610
|
// xlsx/ui/locales/en/index.ts
|
|
26413
27611
|
var en = mergeStringModules({
|
|
27612
|
+
"./collab.ts": collab_exports2,
|
|
26414
27613
|
"./commands.ts": commands_exports2,
|
|
26415
27614
|
"./grid.ts": grid_exports2,
|
|
26416
27615
|
"./shell.ts": shell_exports2
|
|
26417
27616
|
});
|
|
26418
27617
|
|
|
27618
|
+
// xlsx/ui/locales/es/collab.ts
|
|
27619
|
+
var collab_exports3 = {};
|
|
27620
|
+
__export(collab_exports3, {
|
|
27621
|
+
collab: () => collab3
|
|
27622
|
+
});
|
|
27623
|
+
var collab3 = {
|
|
27624
|
+
Share: "Compartir",
|
|
27625
|
+
"Session name": "Nombre de la sesi\xF3n",
|
|
27626
|
+
"Start sharing": "Empezar a compartir",
|
|
27627
|
+
"Stop sharing": "Dejar de compartir",
|
|
27628
|
+
"People in this session": "Personas en esta sesi\xF3n",
|
|
27629
|
+
"Session: {room}": "Sesi\xF3n: {room}",
|
|
27630
|
+
"Not sharing.": "No se est\xE1 compartiendo.",
|
|
27631
|
+
"Connecting...": "Conectando...",
|
|
27632
|
+
"Connected.": "Conectado.",
|
|
27633
|
+
"Joining the session...": "Uni\xE9ndose a la sesi\xF3n...",
|
|
27634
|
+
"Disconnected. Changes are kept and sent when the connection returns.": "Desconectado. Los cambios se conservan y se env\xEDan cuando vuelva la conexi\xF3n.",
|
|
27635
|
+
"The connection failed. Changes are kept and sent when the connection returns.": "La conexi\xF3n fall\xF3. Los cambios se conservan y se env\xEDan cuando vuelva la conexi\xF3n.",
|
|
27636
|
+
"Edit this workbook together with other people. Everyone who joins the same session sees changes as they are made.": "Edite este libro junto con otras personas. Todos los que se unan a la misma sesi\xF3n ver\xE1n los cambios a medida que se hacen.",
|
|
27637
|
+
"Cell values, formulas, formats, sheets, rows, columns, merges and names are shared. Charts, pictures, comments, conditional formats, data validation, tables and page setup stay in this window.": "Se comparten los valores, f\xF3rmulas, formatos, hojas, filas, columnas, celdas combinadas y nombres. Los gr\xE1ficos, im\xE1genes, comentarios, formatos condicionales, validaci\xF3n de datos, tablas y la configuraci\xF3n de p\xE1gina permanecen en esta ventana.",
|
|
27638
|
+
"Without a server set by the page, a session connects only windows and tabs of this browser. Nothing is uploaded.": "Sin un servidor definido por la p\xE1gina, una sesi\xF3n solo conecta ventanas y pesta\xF1as de este navegador. No se sube nada.",
|
|
27639
|
+
"Reconnected. Changes made while offline were sent.": "Reconectado. Se enviaron los cambios hechos sin conexi\xF3n.",
|
|
27640
|
+
"Connection lost. Keep working; your changes are sent when it returns.": "Se perdi\xF3 la conexi\xF3n. Siga trabajando; sus cambios se enviar\xE1n cuando vuelva.",
|
|
27641
|
+
"Sharing stopped because another workbook was opened.": "Se dej\xF3 de compartir porque se abri\xF3 otro libro.",
|
|
27642
|
+
"Open or create a workbook before sharing it.": "Abra o cree un libro antes de compartirlo.",
|
|
27643
|
+
"Use 1 to 128 letters, digits, hyphens or underscores for the room name.": "Use de 1 a 128 letras, d\xEDgitos, guiones o guiones bajos para el nombre de la sesi\xF3n.",
|
|
27644
|
+
"This browser cannot share between windows; pass a server URL.": "Este navegador no puede compartir entre ventanas; indique la URL de un servidor.",
|
|
27645
|
+
"Stop the current collaboration session first.": "Detenga primero la sesi\xF3n de colaboraci\xF3n actual."
|
|
27646
|
+
};
|
|
27647
|
+
|
|
26419
27648
|
// xlsx/ui/locales/es/commands.ts
|
|
26420
27649
|
var commands_exports3 = {};
|
|
26421
27650
|
__export(commands_exports3, {
|
|
@@ -26648,7 +27877,7 @@ var shell3 = {
|
|
|
26648
27877
|
"Inspect Workbook": "Inspeccionar libro",
|
|
26649
27878
|
"Compatibility notes": "Notas de compatibilidad",
|
|
26650
27879
|
"No compatibility notes for this workbook.": "No hay notas de compatibilidad para este libro.",
|
|
26651
|
-
"Charts are shown but not edited; pivot tables,
|
|
27880
|
+
"Charts and sparklines are shown but not edited; pivot tables, macros and other unsupported parts are kept in the file but not shown.": "Los gr\xE1ficos y minigr\xE1ficos se muestran pero no se editan; las tablas din\xE1micas, macros y otras partes no compatibles se conservan en el archivo pero no se muestran.",
|
|
26652
27881
|
"This workbook was opened from an Excel 97-2003 file (.xls). Save writes an Excel Workbook (.xlsx); the original .xls file is not changed.": "Este libro se abri\xF3 desde un archivo de Excel 97-2003 (.xls). Al guardar se escribe un libro de Excel (.xlsx); el archivo .xls original no se modifica.",
|
|
26653
27882
|
"This workbook was opened from a CSV file, which keeps values only. Save writes an Excel Workbook (.xlsx); use Export to write CSV.": "Este libro se abri\xF3 desde un archivo CSV, que solo conserva valores. Al guardar se escribe un libro de Excel (.xlsx); use Exportar para escribir CSV.",
|
|
26654
27883
|
"Macros are kept in the file but do not run in this editor.": "Las macros se conservan en el archivo pero no se ejecutan en este editor.",
|
|
@@ -26765,11 +27994,42 @@ var shell3 = {
|
|
|
26765
27994
|
|
|
26766
27995
|
// xlsx/ui/locales/es/index.ts
|
|
26767
27996
|
var es = mergeStringModules({
|
|
27997
|
+
"./collab.ts": collab_exports3,
|
|
26768
27998
|
"./commands.ts": commands_exports3,
|
|
26769
27999
|
"./grid.ts": grid_exports3,
|
|
26770
28000
|
"./shell.ts": shell_exports3
|
|
26771
28001
|
});
|
|
26772
28002
|
|
|
28003
|
+
// xlsx/ui/locales/fr/collab.ts
|
|
28004
|
+
var collab_exports4 = {};
|
|
28005
|
+
__export(collab_exports4, {
|
|
28006
|
+
collab: () => collab4
|
|
28007
|
+
});
|
|
28008
|
+
var collab4 = {
|
|
28009
|
+
Share: "Partager",
|
|
28010
|
+
"Session name": "Nom de la session",
|
|
28011
|
+
"Start sharing": "Commencer le partage",
|
|
28012
|
+
"Stop sharing": "Arr\xEAter le partage",
|
|
28013
|
+
"People in this session": "Personnes dans cette session",
|
|
28014
|
+
"Session: {room}": "Session : {room}",
|
|
28015
|
+
"Not sharing.": "Aucun partage en cours.",
|
|
28016
|
+
"Connecting...": "Connexion...",
|
|
28017
|
+
"Connected.": "Connect\xE9.",
|
|
28018
|
+
"Joining the session...": "Connexion \xE0 la session...",
|
|
28019
|
+
"Disconnected. Changes are kept and sent when the connection returns.": "D\xE9connect\xE9. Les modifications sont conserv\xE9es et envoy\xE9es au retour de la connexion.",
|
|
28020
|
+
"The connection failed. Changes are kept and sent when the connection returns.": "La connexion a \xE9chou\xE9. Les modifications sont conserv\xE9es et envoy\xE9es au retour de la connexion.",
|
|
28021
|
+
"Edit this workbook together with other people. Everyone who joins the same session sees changes as they are made.": "Modifiez ce classeur avec d'autres personnes. Toutes les personnes qui rejoignent la m\xEAme session voient les modifications au fur et \xE0 mesure.",
|
|
28022
|
+
"Cell values, formulas, formats, sheets, rows, columns, merges and names are shared. Charts, pictures, comments, conditional formats, data validation, tables and page setup stay in this window.": "Les valeurs, formules, formats, feuilles, lignes, colonnes, fusions et noms sont partag\xE9s. Les graphiques, images, commentaires, mises en forme conditionnelles, validations des donn\xE9es, tableaux et la mise en page restent dans cette fen\xEAtre.",
|
|
28023
|
+
"Without a server set by the page, a session connects only windows and tabs of this browser. Nothing is uploaded.": "Sans serveur d\xE9fini par la page, une session ne relie que les fen\xEAtres et onglets de ce navigateur. Rien n'est t\xE9l\xE9vers\xE9.",
|
|
28024
|
+
"Reconnected. Changes made while offline were sent.": "Reconnect\xE9. Les modifications faites hors connexion ont \xE9t\xE9 envoy\xE9es.",
|
|
28025
|
+
"Connection lost. Keep working; your changes are sent when it returns.": "Connexion perdue. Continuez \xE0 travailler ; vos modifications seront envoy\xE9es \xE0 son retour.",
|
|
28026
|
+
"Sharing stopped because another workbook was opened.": "Le partage s'est arr\xEAt\xE9 car un autre classeur a \xE9t\xE9 ouvert.",
|
|
28027
|
+
"Open or create a workbook before sharing it.": "Ouvrez ou cr\xE9ez un classeur avant de le partager.",
|
|
28028
|
+
"Use 1 to 128 letters, digits, hyphens or underscores for the room name.": "Utilisez de 1 \xE0 128 lettres, chiffres, traits d'union ou traits de soulignement pour le nom de la session.",
|
|
28029
|
+
"This browser cannot share between windows; pass a server URL.": "Ce navigateur ne peut pas partager entre fen\xEAtres ; indiquez l'URL d'un serveur.",
|
|
28030
|
+
"Stop the current collaboration session first.": "Arr\xEAtez d'abord la session de collaboration en cours."
|
|
28031
|
+
};
|
|
28032
|
+
|
|
26773
28033
|
// xlsx/ui/locales/fr/commands.ts
|
|
26774
28034
|
var commands_exports4 = {};
|
|
26775
28035
|
__export(commands_exports4, {
|
|
@@ -27002,7 +28262,7 @@ var shell4 = {
|
|
|
27002
28262
|
"Inspect Workbook": "Inspecter le classeur",
|
|
27003
28263
|
"Compatibility notes": "Notes de compatibilit\xE9",
|
|
27004
28264
|
"No compatibility notes for this workbook.": "Aucune note de compatibilit\xE9 pour ce classeur.",
|
|
27005
|
-
"Charts are shown but not edited; pivot tables,
|
|
28265
|
+
"Charts and sparklines are shown but not edited; pivot tables, macros and other unsupported parts are kept in the file but not shown.": "Les graphiques et graphiques sparkline sont affich\xE9s mais non modifiables ; les tableaux crois\xE9s dynamiques, macros et autres \xE9l\xE9ments non pris en charge sont conserv\xE9s dans le fichier mais pas affich\xE9s.",
|
|
27006
28266
|
"This workbook was opened from an Excel 97-2003 file (.xls). Save writes an Excel Workbook (.xlsx); the original .xls file is not changed.": "Ce classeur a \xE9t\xE9 ouvert \xE0 partir d'un fichier Excel 97-2003 (.xls). L'enregistrement cr\xE9e un classeur Excel (.xlsx) ; le fichier .xls d'origine n'est pas modifi\xE9.",
|
|
27007
28267
|
"This workbook was opened from a CSV file, which keeps values only. Save writes an Excel Workbook (.xlsx); use Export to write CSV.": "Ce classeur a \xE9t\xE9 ouvert \xE0 partir d'un fichier CSV, qui ne conserve que les valeurs. L'enregistrement cr\xE9e un classeur Excel (.xlsx) ; utilisez Exporter pour \xE9crire un CSV.",
|
|
27008
28268
|
"Macros are kept in the file but do not run in this editor.": "Les macros sont conserv\xE9es dans le fichier mais ne s'ex\xE9cutent pas dans cet \xE9diteur.",
|
|
@@ -27119,11 +28379,42 @@ var shell4 = {
|
|
|
27119
28379
|
|
|
27120
28380
|
// xlsx/ui/locales/fr/index.ts
|
|
27121
28381
|
var fr = mergeStringModules({
|
|
28382
|
+
"./collab.ts": collab_exports4,
|
|
27122
28383
|
"./commands.ts": commands_exports4,
|
|
27123
28384
|
"./grid.ts": grid_exports4,
|
|
27124
28385
|
"./shell.ts": shell_exports4
|
|
27125
28386
|
});
|
|
27126
28387
|
|
|
28388
|
+
// xlsx/ui/locales/zh-CN/collab.ts
|
|
28389
|
+
var collab_exports5 = {};
|
|
28390
|
+
__export(collab_exports5, {
|
|
28391
|
+
collab: () => collab5
|
|
28392
|
+
});
|
|
28393
|
+
var collab5 = {
|
|
28394
|
+
Share: "\u5171\u4EAB",
|
|
28395
|
+
"Session name": "\u4F1A\u8BDD\u540D\u79F0",
|
|
28396
|
+
"Start sharing": "\u5F00\u59CB\u5171\u4EAB",
|
|
28397
|
+
"Stop sharing": "\u505C\u6B62\u5171\u4EAB",
|
|
28398
|
+
"People in this session": "\u6B64\u4F1A\u8BDD\u4E2D\u7684\u4EBA\u5458",
|
|
28399
|
+
"Session: {room}": "\u4F1A\u8BDD\uFF1A{room}",
|
|
28400
|
+
"Not sharing.": "\u672A\u5728\u5171\u4EAB\u3002",
|
|
28401
|
+
"Connecting...": "\u6B63\u5728\u8FDE\u63A5...",
|
|
28402
|
+
"Connected.": "\u5DF2\u8FDE\u63A5\u3002",
|
|
28403
|
+
"Joining the session...": "\u6B63\u5728\u52A0\u5165\u4F1A\u8BDD...",
|
|
28404
|
+
"Disconnected. Changes are kept and sent when the connection returns.": "\u5DF2\u65AD\u5F00\u8FDE\u63A5\u3002\u66F4\u6539\u4F1A\u88AB\u4FDD\u7559\uFF0C\u5E76\u5728\u8FDE\u63A5\u6062\u590D\u540E\u53D1\u9001\u3002",
|
|
28405
|
+
"The connection failed. Changes are kept and sent when the connection returns.": "\u8FDE\u63A5\u5931\u8D25\u3002\u66F4\u6539\u4F1A\u88AB\u4FDD\u7559\uFF0C\u5E76\u5728\u8FDE\u63A5\u6062\u590D\u540E\u53D1\u9001\u3002",
|
|
28406
|
+
"Edit this workbook together with other people. Everyone who joins the same session sees changes as they are made.": "\u4E0E\u4ED6\u4EBA\u4E00\u8D77\u7F16\u8F91\u6B64\u5DE5\u4F5C\u7C3F\u3002\u52A0\u5165\u540C\u4E00\u4F1A\u8BDD\u7684\u6BCF\u4E2A\u4EBA\u90FD\u4F1A\u5B9E\u65F6\u770B\u5230\u66F4\u6539\u3002",
|
|
28407
|
+
"Cell values, formulas, formats, sheets, rows, columns, merges and names are shared. Charts, pictures, comments, conditional formats, data validation, tables and page setup stay in this window.": "\u5355\u5143\u683C\u503C\u3001\u516C\u5F0F\u3001\u683C\u5F0F\u3001\u5DE5\u4F5C\u8868\u3001\u884C\u3001\u5217\u3001\u5408\u5E76\u5355\u5143\u683C\u548C\u540D\u79F0\u4F1A\u88AB\u5171\u4EAB\u3002\u56FE\u8868\u3001\u56FE\u7247\u3001\u6279\u6CE8\u3001\u6761\u4EF6\u683C\u5F0F\u3001\u6570\u636E\u9A8C\u8BC1\u3001\u8868\u683C\u548C\u9875\u9762\u8BBE\u7F6E\u4EC5\u4FDD\u7559\u5728\u6B64\u7A97\u53E3\u4E2D\u3002",
|
|
28408
|
+
"Without a server set by the page, a session connects only windows and tabs of this browser. Nothing is uploaded.": "\u5982\u679C\u9875\u9762\u672A\u8BBE\u7F6E\u670D\u52A1\u5668\uFF0C\u4F1A\u8BDD\u53EA\u8FDE\u63A5\u6B64\u6D4F\u89C8\u5668\u4E2D\u7684\u7A97\u53E3\u548C\u6807\u7B7E\u9875\u3002\u4E0D\u4F1A\u4E0A\u4F20\u4EFB\u4F55\u5185\u5BB9\u3002",
|
|
28409
|
+
"Reconnected. Changes made while offline were sent.": "\u5DF2\u91CD\u65B0\u8FDE\u63A5\u3002\u79BB\u7EBF\u65F6\u6240\u505A\u7684\u66F4\u6539\u5DF2\u53D1\u9001\u3002",
|
|
28410
|
+
"Connection lost. Keep working; your changes are sent when it returns.": "\u8FDE\u63A5\u5DF2\u65AD\u5F00\u3002\u8BF7\u7EE7\u7EED\u5DE5\u4F5C\uFF0C\u8FDE\u63A5\u6062\u590D\u540E\u4F1A\u53D1\u9001\u60A8\u7684\u66F4\u6539\u3002",
|
|
28411
|
+
"Sharing stopped because another workbook was opened.": "\u7531\u4E8E\u6253\u5F00\u4E86\u53E6\u4E00\u4E2A\u5DE5\u4F5C\u7C3F\uFF0C\u5171\u4EAB\u5DF2\u505C\u6B62\u3002",
|
|
28412
|
+
"Open or create a workbook before sharing it.": "\u8BF7\u5148\u6253\u5F00\u6216\u521B\u5EFA\u5DE5\u4F5C\u7C3F\uFF0C\u7136\u540E\u518D\u5171\u4EAB\u3002",
|
|
28413
|
+
"Use 1 to 128 letters, digits, hyphens or underscores for the room name.": "\u4F1A\u8BDD\u540D\u79F0\u8BF7\u4F7F\u7528 1 \u5230 128 \u4E2A\u5B57\u6BCD\u3001\u6570\u5B57\u3001\u8FDE\u5B57\u7B26\u6216\u4E0B\u5212\u7EBF\u3002",
|
|
28414
|
+
"This browser cannot share between windows; pass a server URL.": "\u6B64\u6D4F\u89C8\u5668\u65E0\u6CD5\u5728\u7A97\u53E3\u4E4B\u95F4\u5171\u4EAB\uFF1B\u8BF7\u63D0\u4F9B\u670D\u52A1\u5668 URL\u3002",
|
|
28415
|
+
"Stop the current collaboration session first.": "\u8BF7\u5148\u505C\u6B62\u5F53\u524D\u534F\u4F5C\u4F1A\u8BDD\u3002"
|
|
28416
|
+
};
|
|
28417
|
+
|
|
27127
28418
|
// xlsx/ui/locales/zh-CN/commands.ts
|
|
27128
28419
|
var commands_exports5 = {};
|
|
27129
28420
|
__export(commands_exports5, {
|
|
@@ -27356,7 +28647,7 @@ var shell5 = {
|
|
|
27356
28647
|
"Inspect Workbook": "\u68C0\u67E5\u5DE5\u4F5C\u7C3F",
|
|
27357
28648
|
"Compatibility notes": "\u517C\u5BB9\u6027\u8BF4\u660E",
|
|
27358
28649
|
"No compatibility notes for this workbook.": "\u6B64\u5DE5\u4F5C\u7C3F\u6CA1\u6709\u517C\u5BB9\u6027\u8BF4\u660E\u3002",
|
|
27359
|
-
"Charts are shown but not edited; pivot tables,
|
|
28650
|
+
"Charts and sparklines are shown but not edited; pivot tables, macros and other unsupported parts are kept in the file but not shown.": "\u56FE\u8868\u548C\u8FF7\u4F60\u56FE\u4EC5\u663E\u793A\uFF0C\u4E0D\u53EF\u7F16\u8F91\uFF1B\u6570\u636E\u900F\u89C6\u8868\u3001\u5B8F\u548C\u5176\u4ED6\u4E0D\u652F\u6301\u7684\u90E8\u5206\u4F1A\u4FDD\u7559\u5728\u6587\u4EF6\u4E2D\uFF0C\u4F46\u4E0D\u663E\u793A\u3002",
|
|
27360
28651
|
"This workbook was opened from an Excel 97-2003 file (.xls). Save writes an Excel Workbook (.xlsx); the original .xls file is not changed.": "\u6B64\u5DE5\u4F5C\u7C3F\u662F\u4ECE Excel 97-2003 \u6587\u4EF6 (.xls) \u6253\u5F00\u7684\u3002\u4FDD\u5B58\u65F6\u4F1A\u5199\u5165 Excel \u5DE5\u4F5C\u7C3F (.xlsx)\uFF1B\u539F\u59CB .xls \u6587\u4EF6\u4E0D\u4F1A\u66F4\u6539\u3002",
|
|
27361
28652
|
"This workbook was opened from a CSV file, which keeps values only. Save writes an Excel Workbook (.xlsx); use Export to write CSV.": "\u6B64\u5DE5\u4F5C\u7C3F\u662F\u4ECE\u4EC5\u4FDD\u7559\u503C\u7684 CSV \u6587\u4EF6\u6253\u5F00\u7684\u3002\u4FDD\u5B58\u65F6\u4F1A\u5199\u5165 Excel \u5DE5\u4F5C\u7C3F (.xlsx)\uFF1B\u4F7F\u7528\u201C\u5BFC\u51FA\u201D\u5199\u5165 CSV\u3002",
|
|
27362
28653
|
"Macros are kept in the file but do not run in this editor.": "\u5B8F\u4F1A\u4FDD\u7559\u5728\u6587\u4EF6\u4E2D\uFF0C\u4F46\u4E0D\u4F1A\u5728\u6B64\u7F16\u8F91\u5668\u4E2D\u8FD0\u884C\u3002",
|
|
@@ -27473,6 +28764,7 @@ var shell5 = {
|
|
|
27473
28764
|
|
|
27474
28765
|
// xlsx/ui/locales/zh-CN/index.ts
|
|
27475
28766
|
var zhCN = mergeStringModules({
|
|
28767
|
+
"./collab.ts": collab_exports5,
|
|
27476
28768
|
"./commands.ts": commands_exports5,
|
|
27477
28769
|
"./grid.ts": grid_exports5,
|
|
27478
28770
|
"./shell.ts": shell_exports5
|
|
@@ -27490,8 +28782,8 @@ var STRINGS = {
|
|
|
27490
28782
|
function normalizeEditorLocale(value2) {
|
|
27491
28783
|
return normalizeLocale(value2, EDITOR_LOCALES, "en");
|
|
27492
28784
|
}
|
|
27493
|
-
function fillTemplate(
|
|
27494
|
-
return interpolate(
|
|
28785
|
+
function fillTemplate(text2, vars) {
|
|
28786
|
+
return interpolate(text2, vars);
|
|
27495
28787
|
}
|
|
27496
28788
|
function translate(locale, key, vars) {
|
|
27497
28789
|
return createTranslator(STRINGS[locale], [STRINGS.en])(key, vars);
|
|
@@ -27508,8 +28800,8 @@ function formatNumber2(locale, value2, digits2 = 10) {
|
|
|
27508
28800
|
}
|
|
27509
28801
|
function sheetBaseName(t) {
|
|
27510
28802
|
const key = "sheet.default-name";
|
|
27511
|
-
const
|
|
27512
|
-
return
|
|
28803
|
+
const text2 = t(key);
|
|
28804
|
+
return text2 && text2 !== key ? text2 : "Sheet";
|
|
27513
28805
|
}
|
|
27514
28806
|
|
|
27515
28807
|
// xlsx/ui/commands/cells.ts
|
|
@@ -29269,6 +30561,11 @@ function tabMenu(state, actions) {
|
|
|
29269
30561
|
);
|
|
29270
30562
|
}
|
|
29271
30563
|
|
|
30564
|
+
// xlsx/ui/context.ts
|
|
30565
|
+
function historyOf(ctx) {
|
|
30566
|
+
return ctx.history ? ctx.history() : ctx.session();
|
|
30567
|
+
}
|
|
30568
|
+
|
|
29272
30569
|
// xlsx/ui/dialogs.ts
|
|
29273
30570
|
function createDialogRegistry(context, onError) {
|
|
29274
30571
|
const openers = /* @__PURE__ */ new Map();
|
|
@@ -29524,8 +30821,8 @@ var DirtyState = class {
|
|
|
29524
30821
|
};
|
|
29525
30822
|
|
|
29526
30823
|
// xlsx/ui/formula-bar/name-resolve.ts
|
|
29527
|
-
function parseSheetReference(workbook, activeSheet,
|
|
29528
|
-
const ref =
|
|
30824
|
+
function parseSheetReference(workbook, activeSheet, text2) {
|
|
30825
|
+
const ref = text2.trim().replace(/^=/, "");
|
|
29529
30826
|
const bang = ref.lastIndexOf("!");
|
|
29530
30827
|
let sheet = activeSheet;
|
|
29531
30828
|
if (bang >= 0) {
|
|
@@ -29543,8 +30840,8 @@ function findDefinedName2(workbook, sheet, name) {
|
|
|
29543
30840
|
const matches2 = workbook.definedNames.filter((d) => d.name.toLowerCase() === lower2);
|
|
29544
30841
|
return matches2.find((d) => d.localSheet === sheet) ?? matches2.find((d) => d.localSheet === void 0);
|
|
29545
30842
|
}
|
|
29546
|
-
function resolveNameBox(workbook, activeSheet,
|
|
29547
|
-
const input =
|
|
30843
|
+
function resolveNameBox(workbook, activeSheet, text2) {
|
|
30844
|
+
const input = text2.trim();
|
|
29548
30845
|
if (!input) return { kind: "invalid" };
|
|
29549
30846
|
const ref = parseSheetReference(workbook, activeSheet, input);
|
|
29550
30847
|
if (ref) return { kind: "go", ...ref };
|
|
@@ -29655,10 +30952,10 @@ function textAlign(hAlign) {
|
|
|
29655
30952
|
if (hAlign === "justify" || hAlign === "distributed") return "justify";
|
|
29656
30953
|
return "left";
|
|
29657
30954
|
}
|
|
29658
|
-
function repeatToFill(
|
|
29659
|
-
if (!
|
|
30955
|
+
function repeatToFill(text2, textWidth, cellWidth) {
|
|
30956
|
+
if (!text2 || textWidth <= 0) return text2;
|
|
29660
30957
|
const times = Math.max(1, Math.floor(cellWidth / textWidth));
|
|
29661
|
-
return
|
|
30958
|
+
return text2.repeat(Math.min(times, 500));
|
|
29662
30959
|
}
|
|
29663
30960
|
function hashes(cellInnerWidth, hashWidth) {
|
|
29664
30961
|
const n = Math.max(1, Math.floor(cellInnerWidth / Math.max(1, hashWidth)));
|
|
@@ -29668,9 +30965,9 @@ function hashes(cellInnerWidth, hashWidth) {
|
|
|
29668
30965
|
// xlsx/ui/grid/cell-items.ts
|
|
29669
30966
|
var PADDING = 2;
|
|
29670
30967
|
function isBlankView(view) {
|
|
29671
|
-
return view.text === "" && !view.fill && !hasBorders(view.borders) && !view.dataBar && !view.icon && !view.hasComment;
|
|
30968
|
+
return view.text === "" && !view.fill && !hasBorders(view.borders) && !view.dataBar && !view.icon && !view.sparkline && !view.hasComment;
|
|
29672
30969
|
}
|
|
29673
|
-
function textWidthOf(input, view,
|
|
30970
|
+
function textWidthOf(input, view, text2) {
|
|
29674
30971
|
if (view.rich?.length)
|
|
29675
30972
|
return view.rich.reduce(
|
|
29676
30973
|
(sum2, run) => sum2 + input.measure(run.text, cssFont(run.font, input.zoom)),
|
|
@@ -29678,7 +30975,7 @@ function textWidthOf(input, view, text) {
|
|
|
29678
30975
|
);
|
|
29679
30976
|
const font = cssFont(view.font, input.zoom);
|
|
29680
30977
|
let widest = 0;
|
|
29681
|
-
for (const line2 of
|
|
30978
|
+
for (const line2 of text2.split("\n")) widest = Math.max(widest, input.measure(line2, font));
|
|
29682
30979
|
return widest;
|
|
29683
30980
|
}
|
|
29684
30981
|
function makeItem(input, row2, col, view, merge2) {
|
|
@@ -29721,7 +31018,7 @@ function makeItem(input, row2, col, view, merge2) {
|
|
|
29721
31018
|
return item;
|
|
29722
31019
|
}
|
|
29723
31020
|
if (view.overflow && !merge2 && measured > inner2) {
|
|
29724
|
-
const
|
|
31021
|
+
const extent2 = overflowExtent(
|
|
29725
31022
|
input.sheet,
|
|
29726
31023
|
metrics,
|
|
29727
31024
|
row2,
|
|
@@ -29729,9 +31026,9 @@ function makeItem(input, row2, col, view, merge2) {
|
|
|
29729
31026
|
measured + 2 * PADDING,
|
|
29730
31027
|
view.hAlign
|
|
29731
31028
|
);
|
|
29732
|
-
item.textLeft =
|
|
29733
|
-
item.textWidth =
|
|
29734
|
-
item.overflowing =
|
|
31029
|
+
item.textLeft = extent2.left - x;
|
|
31030
|
+
item.textWidth = extent2.right - extent2.left;
|
|
31031
|
+
item.overflowing = extent2.startCol !== col || extent2.endCol !== col;
|
|
29735
31032
|
}
|
|
29736
31033
|
return item;
|
|
29737
31034
|
}
|
|
@@ -29840,9 +31137,9 @@ function createEditBridge() {
|
|
|
29840
31137
|
return () => listeners2.delete(listener);
|
|
29841
31138
|
},
|
|
29842
31139
|
begin: (options = {}) => driver?.begin(options) ?? false,
|
|
29843
|
-
update(
|
|
31140
|
+
update(text2, caret, source) {
|
|
29844
31141
|
if (!state.editing) return;
|
|
29845
|
-
state = { ...state, text, caret, source };
|
|
31142
|
+
state = { ...state, text: text2, caret, source };
|
|
29846
31143
|
driver?.changed(source);
|
|
29847
31144
|
emit(source);
|
|
29848
31145
|
},
|
|
@@ -30207,18 +31504,18 @@ function activeRef(selection) {
|
|
|
30207
31504
|
return formatAddress(selection.active);
|
|
30208
31505
|
}
|
|
30209
31506
|
function parseSelectionRef(ref, workbook) {
|
|
30210
|
-
let
|
|
31507
|
+
let text2 = ref.trim();
|
|
30211
31508
|
let sheet;
|
|
30212
|
-
const bang =
|
|
31509
|
+
const bang = text2.lastIndexOf("!");
|
|
30213
31510
|
if (bang > 0) {
|
|
30214
|
-
const name =
|
|
31511
|
+
const name = text2.slice(0, bang).replace(/^'(.*)'$/, "$1").replace(/''/g, "'");
|
|
30215
31512
|
const index2 = workbook?.sheets.findIndex((item) => item.name.toLowerCase() === name.toLowerCase()) ?? -1;
|
|
30216
31513
|
if (index2 < 0) return void 0;
|
|
30217
31514
|
sheet = index2;
|
|
30218
|
-
|
|
31515
|
+
text2 = text2.slice(bang + 1);
|
|
30219
31516
|
}
|
|
30220
31517
|
const ranges = [];
|
|
30221
|
-
for (const part of
|
|
31518
|
+
for (const part of text2.split(",")) {
|
|
30222
31519
|
const range2 = parseRange(part.trim());
|
|
30223
31520
|
if (!range2) return void 0;
|
|
30224
31521
|
ranges.push(range2);
|
|
@@ -30384,7 +31681,7 @@ var CellViewCache = class {
|
|
|
30384
31681
|
let result2 = null;
|
|
30385
31682
|
if (workbook && sheet) {
|
|
30386
31683
|
const stored = getCell(sheet, row2, col);
|
|
30387
|
-
const plain2 = !stored && effectiveStyleId(sheet, row2, col) === 0 && !cfCovers(sheet, row2, col);
|
|
31684
|
+
const plain2 = !stored && effectiveStyleId(sheet, row2, col) === 0 && !cfCovers(sheet, row2, col) && !hasSparklineAt(sheet, row2, col);
|
|
30388
31685
|
if (!plain2) {
|
|
30389
31686
|
const view = cellView(workbook, this.#source.sheetIndex(), row2, col, this.#evaluator());
|
|
30390
31687
|
result2 = isBlankView(view) ? null : view;
|
|
@@ -30447,6 +31744,7 @@ var ICON_PATHS = {
|
|
|
30447
31744
|
link: "M10 14a4 4 0 0 0 5.7 0l3-3a4 4 0 0 0-5.7-5.7l-1 1 M14 10a4 4 0 0 0-5.7 0l-3 3a4 4 0 0 0 5.7 5.7l1-1",
|
|
30448
31745
|
comment: "M4 5h16v11H10l-4 4v-4H4z M8 9h8 M8 12h5",
|
|
30449
31746
|
comments: "M3 4h13v9H9l-3 3v-3H3z M9 17h6l3 3v-3h3V8h-3",
|
|
31747
|
+
share: "M14 4l6 6-6 6M20 10h-8a8 8 0 0 0-8 8",
|
|
30450
31748
|
deleteComment: "M4 5h16v11H10l-4 4v-4H4z M9 8.5l5 5 M14 8.5l-5 5",
|
|
30451
31749
|
previous: "M6 14l6-6 6 6",
|
|
30452
31750
|
next: "M6 10l6 6 6-6",
|
|
@@ -30897,4 +32195,4 @@ function applyThemeColors(host, previous, colors) {
|
|
|
30897
32195
|
return Object.keys(vars);
|
|
30898
32196
|
}
|
|
30899
32197
|
|
|
30900
|
-
export { ACCOUNTING_FORMATS, ALL_RANGE, AUTOSUM_FUNCTIONS, BORDER_PRESETS, CATEGORIES, COLOR_SCALES, COMMAND_TABLES, CORE_FEATURE_STRINGS, CellViewCache, DATA_BAR_COLORS, DATE_CODES, DEFAULT_OPTIONS, DirtyState, EDITOR_LOCALES, EDITOR_THEME_MODES, FONT_NAMES, FONT_SIZES, FORMAT_CELLS_STRINGS, FRACTION_CODES, FUNCTION_MENUS, GridGeometry, HIGHLIGHT_STYLES, ICON_ACCENTS, ICON_PATHS, ICON_SETS, MARGIN_PRESETS, MESSAGE_STRINGS, MORE_FUNCTION_CATEGORIES, NAVIGATION_STRINGS, ORIENTATIONS, PAPER_SIZES, QUADRANTS, RIBBON_HOME_STRINGS, RIBBON_TAB_STRINGS, RULES_STRINGS, SHEET_ICONS, SPECIAL_CODES, STRINGS, SYMBOLS, SheetSelections, TABLE_STYLES, TEMPLATES, THEME_KEYS, TIME_CODES, TOOLS_STRINGS, UNSET, absoluteReference, activeChart, activeRef, activeStyle, activeTable, addRange, alignItems, alignmentCommands, applyThemeColors, autoSumRange, buildChart, buildCode, buildItems, cellCommands, cellMenu, cellRange3 as cellRange, cellStyleItems, clampAddress, clipState, clipboardCommands, colSelected, colorScaleRule, colsOf, colsRange, columnHeaderHeight, columnHeaderMenu, commandStrings, contextualCommands, createCommandRegistry, createDialogRegistry, createEditBridge, createSelectionModel, createTemplateWorkbook, cssFont, cssFontFamily, darkTheme, dataBarRule, dataCommands, detectCategory, diagonalSvg, dxfCss, edgeCss, editBridge, editChart, editing, editingCommands, evaluateRef, expandForMerges, extendSelection, fillPaint, fillSource, fillTemplate, findDefinedName2 as findDefinedName, findSpecial, fitNumber2 as fitNumber, fontCommands, formatNumber2 as formatNumber, formulaCommands, functionsIn, guessHeader, hasBorders, hasWorkbook, hashes, helpTab, icon, iconCount, iconSetRule, iconSvg, iconThresholds, initialSelection, insertFunctionCall, installFormatPainter, isBlankView, isMenuSeparator, isSingleCell, isTabHidden, isWholeCols, isWholeRows2 as isWholeRows, justify, lightTheme, measure, moveWithinSelection, movingEnd, nameForRange, negativeCodes, normalizeEditorLocale, normalizeThemeMode, noteFunctionUse, numberCommands, numberFormatOptions, onRibbonTabsChange, pageLayoutCommands, parseBorderArg, parseSelectionRef, parseSheetReference, pasteWith, patternImage, pickColor, rangeRef, recentFunctions, refresh, regionOf, registerRibbonTabs, repeatToFill, resetRibbonTabs, resolveNameBox, reviewTab, ribbonTabs, rowHeaderMenu, rowHeaderWidth, rowSelected, rowsOf, rowsRange, scrollToReveal, searchCommands, selectCell, selectSpecial, selectTab, selectionCellCount, selectionRef, setTabHidden, sheetBaseName, sheetLocked, sortCommands, span3 as span, spanRange, stepFontSize, structureLocked, style, styleCssFont, tabButton, tabMenu, tableAt, tableStyleColor, tableStylePreview, target, textAlign, textDecoration, themePaletteItems, themeToCssVars, translate, translator, viewTab, viewing, wholeColumns, wholeRows, withTarget };
|
|
32198
|
+
export { ACCOUNTING_FORMATS, ALL_RANGE, AUTOSUM_FUNCTIONS, BORDER_PRESETS, CATEGORIES, COLOR_SCALES, COMMAND_TABLES, CORE_FEATURE_STRINGS, CellViewCache, DATA_BAR_COLORS, DATE_CODES, DEFAULT_OPTIONS, DirtyState, EDITOR_LOCALES, EDITOR_THEME_MODES, FONT_NAMES, FONT_SIZES, FORMAT_CELLS_STRINGS, FRACTION_CODES, FUNCTION_MENUS, GridGeometry, HIGHLIGHT_STYLES, ICON_ACCENTS, ICON_PATHS, ICON_SETS, MARGIN_PRESETS, MESSAGE_STRINGS, MORE_FUNCTION_CATEGORIES, NAVIGATION_STRINGS, ORIENTATIONS, PAPER_SIZES, QUADRANTS, RIBBON_HOME_STRINGS, RIBBON_TAB_STRINGS, RULES_STRINGS, SHEET_ICONS, SPECIAL_CODES, STRINGS, SYMBOLS, SheetSelections, TABLE_STYLES, TEMPLATES, THEME_KEYS, TIME_CODES, TOOLS_STRINGS, UNSET, absoluteReference, activeChart, activeRef, activeStyle, activeTable, addRange, alignItems, alignmentCommands, applyThemeColors, autoSumRange, buildChart, buildCode, buildItems, cellCommands, cellMenu, cellRange3 as cellRange, cellStyleItems, clampAddress, clipState, clipboardCommands, colSelected, colorScaleRule, colsOf, colsRange, columnHeaderHeight, columnHeaderMenu, commandStrings, contextualCommands, createCommandRegistry, createDialogRegistry, createEditBridge, createSelectionModel, createTemplateWorkbook, cssFont, cssFontFamily, darkTheme, dataBarRule, dataCommands, detectCategory, diagonalSvg, dxfCss, edgeCss, editBridge, editChart, editing, editingCommands, evaluateRef, expandForMerges, extendSelection, fillPaint, fillSource, fillTemplate, findDefinedName2 as findDefinedName, findSpecial, fitNumber2 as fitNumber, fontCommands, formatNumber2 as formatNumber, formulaCommands, functionsIn, guessHeader, hasBorders, hasWorkbook, hashes, helpTab, historyOf, icon, iconCount, iconSetRule, iconSvg, iconThresholds, initialSelection, insertFunctionCall, installFormatPainter, isBlankView, isMenuSeparator, isSingleCell, isTabHidden, isWholeCols, isWholeRows2 as isWholeRows, justify, lightTheme, measure, moveWithinSelection, movingEnd, nameForRange, negativeCodes, normalizeEditorLocale, normalizeThemeMode, noteFunctionUse, numberCommands, numberFormatOptions, onRibbonTabsChange, pageLayoutCommands, parseBorderArg, parseSelectionRef, parseSheetReference, pasteWith, patternImage, pickColor, rangeRef, recentFunctions, refresh, regionOf, registerRibbonTabs, repeatToFill, resetRibbonTabs, resolveNameBox, reviewTab, ribbonTabs, rowHeaderMenu, rowHeaderWidth, rowSelected, rowsOf, rowsRange, scrollToReveal, searchCommands, selectCell, selectSpecial, selectTab, selectionCellCount, selectionRef, setTabHidden, sheetBaseName, sheetLocked, sortCommands, span3 as span, spanRange, stepFontSize, structureLocked, style, styleCssFont, tabButton, tabMenu, tableAt, tableStyleColor, tableStylePreview, target, textAlign, textDecoration, themePaletteItems, themeToCssVars, translate, translator, viewTab, viewing, wholeColumns, wholeRows, withTarget };
|