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.cjs
CHANGED
|
@@ -105,31 +105,31 @@ function quoteSheetName(name) {
|
|
|
105
105
|
}
|
|
106
106
|
|
|
107
107
|
// xlsx/address-r1c1.ts
|
|
108
|
-
var dimension = (
|
|
109
|
-
if (!
|
|
110
|
-
if (
|
|
111
|
-
const offset2 = Number(
|
|
108
|
+
var dimension = (text2, base, size) => {
|
|
109
|
+
if (!text2) return base;
|
|
110
|
+
if (text2.startsWith("[")) {
|
|
111
|
+
const offset2 = Number(text2.slice(1, -1));
|
|
112
112
|
if (Math.abs(offset2) >= size) return void 0;
|
|
113
113
|
return ((base + offset2) % size + size) % size;
|
|
114
114
|
}
|
|
115
|
-
const at = Number(
|
|
115
|
+
const at = Number(text2) - 1;
|
|
116
116
|
return at >= 0 && at < size ? at : void 0;
|
|
117
117
|
};
|
|
118
|
-
function corner(
|
|
119
|
-
const cell = /^R(\[[+-]?\d+\]|\d+)?C(\[[+-]?\d+\]|\d+)?$/i.exec(
|
|
118
|
+
function corner(text2, base) {
|
|
119
|
+
const cell = /^R(\[[+-]?\d+\]|\d+)?C(\[[+-]?\d+\]|\d+)?$/i.exec(text2);
|
|
120
120
|
if (cell) {
|
|
121
121
|
const row2 = dimension(cell[1], base.row, MAX_ROW + 1);
|
|
122
122
|
const col = dimension(cell[2], base.col, MAX_COL + 1);
|
|
123
123
|
if (row2 === void 0 || col === void 0) return void 0;
|
|
124
124
|
return { kind: "cell", range: { start: { row: row2, col }, end: { row: row2, col } } };
|
|
125
125
|
}
|
|
126
|
-
const rowMatch = /^R(\[[+-]?\d+\]|\d+)?$/i.exec(
|
|
126
|
+
const rowMatch = /^R(\[[+-]?\d+\]|\d+)?$/i.exec(text2);
|
|
127
127
|
if (rowMatch) {
|
|
128
128
|
const row2 = dimension(rowMatch[1], base.row, MAX_ROW + 1);
|
|
129
129
|
if (row2 === void 0) return void 0;
|
|
130
130
|
return { kind: "row", range: { start: { row: row2, col: 0 }, end: { row: row2, col: MAX_COL } } };
|
|
131
131
|
}
|
|
132
|
-
const colMatch = /^C(\[[+-]?\d+\]|\d+)?$/i.exec(
|
|
132
|
+
const colMatch = /^C(\[[+-]?\d+\]|\d+)?$/i.exec(text2);
|
|
133
133
|
if (colMatch) {
|
|
134
134
|
const col = dimension(colMatch[1], base.col, MAX_COL + 1);
|
|
135
135
|
if (col === void 0) return void 0;
|
|
@@ -137,10 +137,10 @@ function corner(text, base) {
|
|
|
137
137
|
}
|
|
138
138
|
return void 0;
|
|
139
139
|
}
|
|
140
|
-
function parseR1C1Range(
|
|
140
|
+
function parseR1C1Range(text2, base) {
|
|
141
141
|
if (!Number.isInteger(base.row) || !Number.isInteger(base.col) || base.row < 0 || base.row > MAX_ROW || base.col < 0 || base.col > MAX_COL)
|
|
142
142
|
return void 0;
|
|
143
|
-
const parts =
|
|
143
|
+
const parts = text2.trim().split(":");
|
|
144
144
|
if (parts.length > 2) return void 0;
|
|
145
145
|
const a = corner(parts[0] ?? "", base);
|
|
146
146
|
const b = parts.length === 1 ? a : corner(parts[1] ?? "", base);
|
|
@@ -325,27 +325,27 @@ function styleAt(workbook, styleId) {
|
|
|
325
325
|
}
|
|
326
326
|
function internStyle(workbook, style2) {
|
|
327
327
|
const key = styleKey(style2);
|
|
328
|
-
const
|
|
329
|
-
const known =
|
|
328
|
+
const cache3 = styleCache(workbook);
|
|
329
|
+
const known = cache3.get(key);
|
|
330
330
|
if (known !== void 0 && workbook.styles[known] && styleKey(workbook.styles[known]) === key)
|
|
331
331
|
return known;
|
|
332
332
|
const index2 = workbook.styles.findIndex((candidate) => styleKey(candidate) === key);
|
|
333
333
|
if (index2 >= 0) {
|
|
334
|
-
|
|
334
|
+
cache3.set(key, index2);
|
|
335
335
|
return index2;
|
|
336
336
|
}
|
|
337
337
|
workbook.styles.push(style2);
|
|
338
|
-
|
|
338
|
+
cache3.set(key, workbook.styles.length - 1);
|
|
339
339
|
return workbook.styles.length - 1;
|
|
340
340
|
}
|
|
341
341
|
var caches = /* @__PURE__ */ new WeakMap();
|
|
342
342
|
function styleCache(workbook) {
|
|
343
|
-
let
|
|
344
|
-
if (!
|
|
345
|
-
|
|
346
|
-
caches.set(workbook,
|
|
343
|
+
let cache3 = caches.get(workbook);
|
|
344
|
+
if (!cache3) {
|
|
345
|
+
cache3 = /* @__PURE__ */ new Map();
|
|
346
|
+
caches.set(workbook, cache3);
|
|
347
347
|
}
|
|
348
|
-
return
|
|
348
|
+
return cache3;
|
|
349
349
|
}
|
|
350
350
|
function compact(value2) {
|
|
351
351
|
const out = {};
|
|
@@ -671,15 +671,15 @@ function isElapsedOnly(tokens) {
|
|
|
671
671
|
}
|
|
672
672
|
function renderElapsedOnly(serial, tokens) {
|
|
673
673
|
const seconds = Math.round(Math.abs(serial) * 86400);
|
|
674
|
-
let
|
|
674
|
+
let text2 = "";
|
|
675
675
|
for (const tok of tokens) {
|
|
676
|
-
if (tok.t === "lit")
|
|
676
|
+
if (tok.t === "lit") text2 += tok.v;
|
|
677
677
|
else if (tok.t === "elapsed") {
|
|
678
678
|
const amount = tok.unit === "h" ? Math.floor(seconds / 3600) : tok.unit === "m" ? Math.floor(seconds / 60) : seconds;
|
|
679
|
-
|
|
679
|
+
text2 += String(amount).padStart(tok.width, "0");
|
|
680
680
|
}
|
|
681
681
|
}
|
|
682
|
-
return
|
|
682
|
+
return text2;
|
|
683
683
|
}
|
|
684
684
|
function renderDate(serial, tokens, date1904) {
|
|
685
685
|
if (!(serial >= 0) || serial >= MAX_DATE_SERIAL + 1) return void 0;
|
|
@@ -688,21 +688,21 @@ function renderDate(serial, tokens, date1904) {
|
|
|
688
688
|
if (p.year > 9999) return void 0;
|
|
689
689
|
const twelve = tokens.some((t) => t.t === "ampm");
|
|
690
690
|
const hour12 = p.hours % 12 === 0 ? 12 : p.hours % 12;
|
|
691
|
-
let
|
|
691
|
+
let text2 = "";
|
|
692
692
|
for (const tok of tokens) {
|
|
693
|
-
if (tok.t === "lit")
|
|
693
|
+
if (tok.t === "lit") text2 += tok.v;
|
|
694
694
|
else if (tok.t === "ampm") {
|
|
695
695
|
const pm = p.hours >= 12;
|
|
696
|
-
|
|
696
|
+
text2 += tok.kind === "AM/PM" ? pm ? "PM" : "AM" : tok.kind === "A/P" ? pm ? "P" : "A" : pm ? "p" : "a";
|
|
697
697
|
} else if (tok.t === "subsec") {
|
|
698
698
|
const digits2 = String(p.subsec).padStart(precision, "0");
|
|
699
|
-
|
|
699
|
+
text2 += `.${digits2.slice(0, tok.digits).padEnd(tok.digits, "0")}`;
|
|
700
700
|
} else if (tok.t === "elapsed") {
|
|
701
701
|
const amount = tok.unit === "h" ? Math.floor(p.totalSeconds / 3600) : tok.unit === "m" ? Math.floor(p.totalSeconds / 60) : p.totalSeconds;
|
|
702
|
-
|
|
703
|
-
} else if (tok.t === "date")
|
|
702
|
+
text2 += String(amount).padStart(tok.width, "0");
|
|
703
|
+
} else if (tok.t === "date") text2 += datePart(tok.part, p, twelve ? hour12 : p.hours);
|
|
704
704
|
}
|
|
705
|
-
return
|
|
705
|
+
return text2;
|
|
706
706
|
}
|
|
707
707
|
function datePart(part, p, hour) {
|
|
708
708
|
switch (part) {
|
|
@@ -941,25 +941,25 @@ function renderFraction(value2, plan) {
|
|
|
941
941
|
const dropSeparator = hideFraction || hasInt && intText === "" && numHash;
|
|
942
942
|
const lastInt = plan.tokens.reduce((last, t, i2) => t.r === "int" ? i2 : last, -1);
|
|
943
943
|
const firstNum = plan.tokens.findIndex((t) => t.r === "num");
|
|
944
|
-
let
|
|
944
|
+
let text2 = "";
|
|
945
945
|
let intDone = false;
|
|
946
946
|
plan.tokens.forEach((tok, i2) => {
|
|
947
947
|
if (tok.r === "lit") {
|
|
948
|
-
if (!(dropSeparator && i2 > lastInt && i2 < firstNum))
|
|
948
|
+
if (!(dropSeparator && i2 > lastInt && i2 < firstNum)) text2 += tok.v;
|
|
949
949
|
} else if (tok.r === "int") {
|
|
950
|
-
if (!intDone)
|
|
950
|
+
if (!intDone) text2 += intText;
|
|
951
951
|
intDone = true;
|
|
952
952
|
} else if (hideFraction) ; else if (blank) {
|
|
953
|
-
if (tok.r === "num")
|
|
954
|
-
else if (tok.r === "slash")
|
|
955
|
-
else
|
|
953
|
+
if (tok.r === "num") text2 += " ";
|
|
954
|
+
else if (tok.r === "slash") text2 += " ";
|
|
955
|
+
else text2 += " ".repeat(plan.fixedDenominator ? plan.denWidth : 1);
|
|
956
956
|
} else if (tok.r === "num") {
|
|
957
|
-
if (tok.index === 0)
|
|
958
|
-
} else if (tok.r === "slash")
|
|
959
|
-
else if (plan.fixedDenominator)
|
|
960
|
-
else if (tok.index === 0)
|
|
957
|
+
if (tok.index === 0) text2 += padLeft(String(n), plan.numDigits);
|
|
958
|
+
} else if (tok.r === "slash") text2 += "/";
|
|
959
|
+
else if (plan.fixedDenominator) text2 += String(d);
|
|
960
|
+
else if (tok.index === 0) text2 += padRight(String(d), plan.denDigits);
|
|
961
961
|
});
|
|
962
|
-
return { text, zero };
|
|
962
|
+
return { text: text2, zero };
|
|
963
963
|
}
|
|
964
964
|
|
|
965
965
|
// xlsx/numfmt/decimal.ts
|
|
@@ -1164,18 +1164,18 @@ function renderNumber(value2, plan) {
|
|
|
1164
1164
|
} else rounded = roundDecimals(v, plan.fracDigits.length);
|
|
1165
1165
|
const ints = plan.exponent && isZero(rounded) ? plan.intDigits.map(() => "0") : placeIntegers(integerPart(rounded), plan.intDigits, plan.grouping);
|
|
1166
1166
|
const fracs = placeFraction(fractionPart(rounded, plan.fracDigits.length), plan.fracDigits);
|
|
1167
|
-
let
|
|
1167
|
+
let text2 = "";
|
|
1168
1168
|
for (const tok of plan.tokens) {
|
|
1169
|
-
if (tok.r === "lit")
|
|
1170
|
-
else if (tok.r === "int")
|
|
1171
|
-
else if (tok.r === "frac")
|
|
1172
|
-
else if (tok.r === "point")
|
|
1169
|
+
if (tok.r === "lit") text2 += tok.v;
|
|
1170
|
+
else if (tok.r === "int") text2 += ints[tok.index] ?? "";
|
|
1171
|
+
else if (tok.r === "frac") text2 += fracs[tok.index] ?? "";
|
|
1172
|
+
else if (tok.r === "point") text2 += ".";
|
|
1173
1173
|
else if (plan.exponent) {
|
|
1174
1174
|
const sign2 = exp2 < 0 ? "-" : plan.exponent.plus ? "+" : "";
|
|
1175
|
-
|
|
1175
|
+
text2 += `E${sign2}${String(Math.abs(exp2)).padStart(plan.exponent.digits, "0")}`;
|
|
1176
1176
|
}
|
|
1177
1177
|
}
|
|
1178
|
-
return { text, zero: isZero(rounded) };
|
|
1178
|
+
return { text: text2, zero: isZero(rounded) };
|
|
1179
1179
|
}
|
|
1180
1180
|
|
|
1181
1181
|
// xlsx/numfmt/tokenizer.ts
|
|
@@ -1466,14 +1466,14 @@ function compileFormat(format) {
|
|
|
1466
1466
|
const code = format.trim() === "" ? "General" : format;
|
|
1467
1467
|
const sections = splitSections(code).slice(0, 4).map(compileSection);
|
|
1468
1468
|
let numeric2;
|
|
1469
|
-
let
|
|
1469
|
+
let text2;
|
|
1470
1470
|
const last = sections[sections.length - 1];
|
|
1471
1471
|
if (sections.length === 4) {
|
|
1472
1472
|
numeric2 = sections.slice(0, 3);
|
|
1473
|
-
|
|
1473
|
+
text2 = sections[3];
|
|
1474
1474
|
} else if (last && last.kind === "text") {
|
|
1475
1475
|
numeric2 = sections.slice(0, -1);
|
|
1476
|
-
|
|
1476
|
+
text2 = last;
|
|
1477
1477
|
} else numeric2 = sections;
|
|
1478
1478
|
if (numeric2.length === 0) numeric2 = [generalSection()];
|
|
1479
1479
|
const conditional = numeric2.some((s) => s.condition !== void 0);
|
|
@@ -1483,7 +1483,7 @@ function compileFormat(format) {
|
|
|
1483
1483
|
conditional,
|
|
1484
1484
|
isDate: numeric2.some((s) => s.kind === "date")
|
|
1485
1485
|
};
|
|
1486
|
-
if (
|
|
1486
|
+
if (text2) compiled.text = text2;
|
|
1487
1487
|
if (cache.size >= CACHE_LIMIT) cache.clear();
|
|
1488
1488
|
cache.set(format, compiled);
|
|
1489
1489
|
return compiled;
|
|
@@ -1557,16 +1557,16 @@ function generalDigits(v, width) {
|
|
|
1557
1557
|
}
|
|
1558
1558
|
function formatGeneral(value2, width = GENERAL_WIDTH) {
|
|
1559
1559
|
if (!Number.isFinite(value2)) return "#NUM!";
|
|
1560
|
-
const
|
|
1560
|
+
const text2 = generalDigits(
|
|
1561
1561
|
toDigits(value2),
|
|
1562
1562
|
Math.max(1, Math.min(GENERAL_WIDTH, Math.floor(width)))
|
|
1563
1563
|
);
|
|
1564
|
-
return value2 < 0 &&
|
|
1564
|
+
return value2 < 0 && text2 !== "0" ? `-${text2}` : text2;
|
|
1565
1565
|
}
|
|
1566
1566
|
|
|
1567
1567
|
// xlsx/numfmt/format.ts
|
|
1568
1568
|
var OVERFLOW_TEXT = "########";
|
|
1569
|
-
var result = (
|
|
1569
|
+
var result = (text2, section) => section?.color ? { text: text2, color: section.color } : { text: text2 };
|
|
1570
1570
|
function tokenSource(tok) {
|
|
1571
1571
|
switch (tok.t) {
|
|
1572
1572
|
case "lit":
|
|
@@ -1599,21 +1599,21 @@ function tokenSource(tok) {
|
|
|
1599
1599
|
return "";
|
|
1600
1600
|
}
|
|
1601
1601
|
}
|
|
1602
|
-
function formatText(
|
|
1603
|
-
if (!section) return { text };
|
|
1602
|
+
function formatText(text2, section) {
|
|
1603
|
+
if (!section) return { text: text2 };
|
|
1604
1604
|
let out = "";
|
|
1605
|
-
for (const tok of section.tokens) out += tok.t === "text" ?
|
|
1605
|
+
for (const tok of section.tokens) out += tok.t === "text" ? text2 : tokenSource(tok);
|
|
1606
1606
|
return result(out, section);
|
|
1607
1607
|
}
|
|
1608
1608
|
function renderAbs(v, section, generalWidth) {
|
|
1609
1609
|
if (section.fraction) return renderFraction(v, section.fraction);
|
|
1610
1610
|
if (section.number) return renderNumber(v, section.number);
|
|
1611
1611
|
const general = formatGeneral(Math.abs(v), generalWidth);
|
|
1612
|
-
let
|
|
1612
|
+
let text2 = "";
|
|
1613
1613
|
for (const tok of section.tokens) {
|
|
1614
|
-
|
|
1614
|
+
text2 += tok.t === "general" || tok.t === "text" ? general : tokenSource(tok);
|
|
1615
1615
|
}
|
|
1616
|
-
return { text, zero: general === "0" };
|
|
1616
|
+
return { text: text2, zero: general === "0" };
|
|
1617
1617
|
}
|
|
1618
1618
|
function hashFill(options) {
|
|
1619
1619
|
const width = options.width ?? 0;
|
|
@@ -1623,7 +1623,7 @@ function hashFill(options) {
|
|
|
1623
1623
|
function fitNumber(value2, format, options) {
|
|
1624
1624
|
const date1904 = options.date1904 ?? false;
|
|
1625
1625
|
const width = options.width ?? 0;
|
|
1626
|
-
const fits = (
|
|
1626
|
+
const fits = (text2) => (options.measure ? options.measure(text2) : text2.length) <= width;
|
|
1627
1627
|
const first2 = formatNumber(value2, format, date1904);
|
|
1628
1628
|
if (fits(first2.text) || first2.text === OVERFLOW_TEXT) return first2;
|
|
1629
1629
|
const choice = chooseSection(compileFormat(format), value2);
|
|
@@ -1646,15 +1646,15 @@ function formatNumber(value2, format, date1904, generalWidth) {
|
|
|
1646
1646
|
if (section.kind === "date") {
|
|
1647
1647
|
const serial = abs2 ? Math.abs(value2) : value2;
|
|
1648
1648
|
if (isElapsedOnly(section.tokens)) {
|
|
1649
|
-
const
|
|
1650
|
-
return result(serial < 0 ? `-${
|
|
1649
|
+
const text4 = renderElapsedOnly(serial, section.tokens);
|
|
1650
|
+
return result(serial < 0 ? `-${text4}` : text4, section);
|
|
1651
1651
|
}
|
|
1652
|
-
const
|
|
1653
|
-
return
|
|
1652
|
+
const text3 = renderDate(serial, section.tokens, date1904);
|
|
1653
|
+
return text3 === void 0 ? { text: OVERFLOW_TEXT } : result(text3, section);
|
|
1654
1654
|
}
|
|
1655
|
-
const { text, zero } = renderAbs(value2, section, generalWidth);
|
|
1655
|
+
const { text: text2, zero } = renderAbs(value2, section, generalWidth);
|
|
1656
1656
|
const minus = value2 < 0 && !abs2 && !zero;
|
|
1657
|
-
return result(minus ? `-${
|
|
1657
|
+
return result(minus ? `-${text2}` : text2, section);
|
|
1658
1658
|
}
|
|
1659
1659
|
function formatValue(value2, format, options = {}) {
|
|
1660
1660
|
if (value2 === null) return { text: "" };
|
|
@@ -1691,9 +1691,9 @@ function monthFromName(name) {
|
|
|
1691
1691
|
);
|
|
1692
1692
|
return index2 < 0 ? void 0 : index2 + 1;
|
|
1693
1693
|
}
|
|
1694
|
-
function fullYear(
|
|
1695
|
-
const y = Number(
|
|
1696
|
-
if (
|
|
1694
|
+
function fullYear(text2) {
|
|
1695
|
+
const y = Number(text2);
|
|
1696
|
+
if (text2.length > 2) return y;
|
|
1697
1697
|
return y < 30 ? 2e3 + y : 1900 + y;
|
|
1698
1698
|
}
|
|
1699
1699
|
function serialOf(year, month, day, date1904) {
|
|
@@ -1707,8 +1707,8 @@ function serialOf(year, month, day, date1904) {
|
|
|
1707
1707
|
return serial < minimum ? void 0 : serial;
|
|
1708
1708
|
}
|
|
1709
1709
|
var TIME_RE = /^(\d{1,5}):(\d{1,2})(?::(\d{1,2}))?(?:\.(\d+))?\s*(am|pm|a|p)?$/i;
|
|
1710
|
-
function parseTime(
|
|
1711
|
-
const m = TIME_RE.exec(
|
|
1710
|
+
function parseTime(text2) {
|
|
1711
|
+
const m = TIME_RE.exec(text2);
|
|
1712
1712
|
if (!m) return void 0;
|
|
1713
1713
|
const [, a = "0", b = "0", c, frac, ampm] = m;
|
|
1714
1714
|
let hours = Number(a);
|
|
@@ -1735,11 +1735,11 @@ function parseTime(text) {
|
|
|
1735
1735
|
return { fraction: (hours * 3600 + minutes * 60 + seconds) / 86400, format };
|
|
1736
1736
|
}
|
|
1737
1737
|
var currentYear = () => (/* @__PURE__ */ new Date()).getFullYear();
|
|
1738
|
-
function parseDay(
|
|
1739
|
-
let m = /^(\d{4})[-/](\d{1,2})[-/](\d{1,2})$/.exec(
|
|
1738
|
+
function parseDay(text2) {
|
|
1739
|
+
let m = /^(\d{4})[-/](\d{1,2})[-/](\d{1,2})$/.exec(text2);
|
|
1740
1740
|
if (m)
|
|
1741
1741
|
return { year: Number(m[1]), month: Number(m[2]), day: Number(m[3]), format: "yyyy-mm-dd" };
|
|
1742
|
-
m = /^(\d{1,2})([-/])(\d{1,2})\2(\d{2}|\d{4})$/.exec(
|
|
1742
|
+
m = /^(\d{1,2})([-/])(\d{1,2})\2(\d{2}|\d{4})$/.exec(text2);
|
|
1743
1743
|
if (m)
|
|
1744
1744
|
return {
|
|
1745
1745
|
year: fullYear(m[4] ?? ""),
|
|
@@ -1747,9 +1747,9 @@ function parseDay(text) {
|
|
|
1747
1747
|
day: Number(m[3]),
|
|
1748
1748
|
format: "m/d/yyyy"
|
|
1749
1749
|
};
|
|
1750
|
-
m = /^(\d{1,2})\/(\d{1,2})$/.exec(
|
|
1750
|
+
m = /^(\d{1,2})\/(\d{1,2})$/.exec(text2);
|
|
1751
1751
|
if (m) return { year: currentYear(), month: Number(m[1]), day: Number(m[2]), format: "d-mmm" };
|
|
1752
|
-
m = /^(\d{1,2})[- ]([a-z]+)\.?(?:[- ,]+(\d{2}|\d{4}))?$/i.exec(
|
|
1752
|
+
m = /^(\d{1,2})[- ]([a-z]+)\.?(?:[- ,]+(\d{2}|\d{4}))?$/i.exec(text2);
|
|
1753
1753
|
if (m) {
|
|
1754
1754
|
const month = monthFromName(m[2] ?? "");
|
|
1755
1755
|
if (!month) return void 0;
|
|
@@ -1757,12 +1757,12 @@ function parseDay(text) {
|
|
|
1757
1757
|
return { year: currentYear(), month, day: Number(m[1]), format: "d-mmm" };
|
|
1758
1758
|
return { year: fullYear(m[3]), month, day: Number(m[1]), format: "d-mmm-yy" };
|
|
1759
1759
|
}
|
|
1760
|
-
m = /^([a-z]+)\.?[- ](\d{1,2}),?[- ](\d{4})$/i.exec(
|
|
1760
|
+
m = /^([a-z]+)\.?[- ](\d{1,2}),?[- ](\d{4})$/i.exec(text2);
|
|
1761
1761
|
if (m) {
|
|
1762
1762
|
const month = monthFromName(m[1] ?? "");
|
|
1763
1763
|
return month ? { year: Number(m[3]), month, day: Number(m[2]), format: "d-mmm-yy" } : void 0;
|
|
1764
1764
|
}
|
|
1765
|
-
m = /^([a-z]{3,})[- ]?(\d{1,2})$/i.exec(
|
|
1765
|
+
m = /^([a-z]{3,})[- ]?(\d{1,2})$/i.exec(text2);
|
|
1766
1766
|
if (m) {
|
|
1767
1767
|
const month = monthFromName(m[1] ?? "");
|
|
1768
1768
|
if (!month) return void 0;
|
|
@@ -1772,19 +1772,19 @@ function parseDay(text) {
|
|
|
1772
1772
|
return { year, month, day: n, format: "d-mmm" };
|
|
1773
1773
|
return { year: fullYear(m[2] ?? ""), month, day: 1, format: "mmm-yy" };
|
|
1774
1774
|
}
|
|
1775
|
-
m = /^([a-z]+)\.?[- ](\d{4})$/i.exec(
|
|
1775
|
+
m = /^([a-z]+)\.?[- ](\d{4})$/i.exec(text2);
|
|
1776
1776
|
if (m) {
|
|
1777
1777
|
const month = monthFromName(m[1] ?? "");
|
|
1778
1778
|
return month ? { year: Number(m[2]), month, day: 1, format: "mmm-yy" } : void 0;
|
|
1779
1779
|
}
|
|
1780
1780
|
return void 0;
|
|
1781
1781
|
}
|
|
1782
|
-
function parseDateTimeInput(
|
|
1783
|
-
const time = parseTime(
|
|
1782
|
+
function parseDateTimeInput(text2, date1904) {
|
|
1783
|
+
const time = parseTime(text2);
|
|
1784
1784
|
if (time) return { value: time.fraction, numFmt: time.format };
|
|
1785
|
-
const tail = /(?:\s{1,8}|T)(\d{1,2}:\d{1,2}(?::\d{1,2})?(?:\s{0,8}(?:am|pm|a|p))?)$/i.exec(
|
|
1786
|
-
const split = tail && tail.index > 0 ? [tail[0],
|
|
1787
|
-
const dayText = split ? split[1] ?? "" :
|
|
1785
|
+
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);
|
|
1786
|
+
const split = tail && tail.index > 0 ? [tail[0], text2.slice(0, tail.index), tail[1]] : null;
|
|
1787
|
+
const dayText = split ? split[1] ?? "" : text2;
|
|
1788
1788
|
const day = parseDay(dayText);
|
|
1789
1789
|
if (!day) return void 0;
|
|
1790
1790
|
const serial = serialOf(day.year, day.month, day.day, date1904);
|
|
@@ -1803,8 +1803,8 @@ function currencyFormat(symbol2, decimals2) {
|
|
|
1803
1803
|
if (symbol2 === "$") return `$${body2}_);[Red]($${body2})`;
|
|
1804
1804
|
return `${symbol2}${body2}`;
|
|
1805
1805
|
}
|
|
1806
|
-
function parseNumberInput(
|
|
1807
|
-
let s =
|
|
1806
|
+
function parseNumberInput(text2) {
|
|
1807
|
+
let s = text2.trim();
|
|
1808
1808
|
let negative = false;
|
|
1809
1809
|
let parenthesized = false;
|
|
1810
1810
|
if (s.startsWith("(") && s.endsWith(")")) {
|
|
@@ -1861,8 +1861,8 @@ function parseNumberInput(text) {
|
|
|
1861
1861
|
if (grouped) return { value: value2, numFmt: decimals2 ? "#,##0.00" : "#,##0" };
|
|
1862
1862
|
return { value: value2 };
|
|
1863
1863
|
}
|
|
1864
|
-
function parseFractionInput(
|
|
1865
|
-
const m = /^([-+]?)(\d+)\s+(\d+)\/(\d+)$/.exec(
|
|
1864
|
+
function parseFractionInput(text2) {
|
|
1865
|
+
const m = /^([-+]?)(\d+)\s+(\d+)\/(\d+)$/.exec(text2.trim());
|
|
1866
1866
|
if (!m) return void 0;
|
|
1867
1867
|
const den = Number(m[4]);
|
|
1868
1868
|
const num2 = Number(m[3]);
|
|
@@ -1873,27 +1873,27 @@ function parseFractionInput(text) {
|
|
|
1873
1873
|
numFmt: den < 10 ? "# ?/?" : "# ??/??"
|
|
1874
1874
|
};
|
|
1875
1875
|
}
|
|
1876
|
-
function parseCellInput(
|
|
1877
|
-
if (
|
|
1878
|
-
if (
|
|
1879
|
-
if (
|
|
1880
|
-
const trimmed =
|
|
1881
|
-
if (trimmed === "") return { value:
|
|
1876
|
+
function parseCellInput(text2, options = {}) {
|
|
1877
|
+
if (text2 === "") return { value: null };
|
|
1878
|
+
if (text2.startsWith("=") && text2.length > 1) return { value: null, formula: text2.slice(1) };
|
|
1879
|
+
if (text2.startsWith("'")) return { value: text2.slice(1) };
|
|
1880
|
+
const trimmed = text2.trim();
|
|
1881
|
+
if (trimmed === "") return { value: text2 };
|
|
1882
1882
|
const upper2 = trimmed.toUpperCase();
|
|
1883
|
-
if (trimmed ===
|
|
1883
|
+
if (trimmed === text2) {
|
|
1884
1884
|
if (upper2 === "TRUE" || upper2 === "FALSE") return { value: upper2 === "TRUE" };
|
|
1885
1885
|
if (isErrorCode(upper2)) return { value: cellError(upper2) };
|
|
1886
1886
|
}
|
|
1887
1887
|
const parsed = parseNumberInput(trimmed) ?? parseFractionInput(trimmed) ?? parseDateTimeInput(trimmed, options.date1904 ?? false);
|
|
1888
|
-
if (!parsed) return { value:
|
|
1888
|
+
if (!parsed) return { value: text2 };
|
|
1889
1889
|
return parsed.numFmt ? { value: parsed.value, numFmt: parsed.numFmt } : { value: parsed.value };
|
|
1890
1890
|
}
|
|
1891
1891
|
|
|
1892
1892
|
// xlsx/numfmt/decimals.ts
|
|
1893
1893
|
function fromGeneral(delta, sample) {
|
|
1894
|
-
const
|
|
1895
|
-
const sci = /^(\d)(?:\.(\d+))?E/.exec(
|
|
1896
|
-
const shown = sci ? sci[2]?.length ?? 0 : /\.(\d+)/.exec(
|
|
1894
|
+
const text2 = typeof sample === "number" ? formatGeneral(Math.abs(sample)) : "";
|
|
1895
|
+
const sci = /^(\d)(?:\.(\d+))?E/.exec(text2);
|
|
1896
|
+
const shown = sci ? sci[2]?.length ?? 0 : /\.(\d+)/.exec(text2)?.[1]?.length ?? 0;
|
|
1897
1897
|
const next = Math.max(0, shown + delta);
|
|
1898
1898
|
const body2 = next ? `0.${"0".repeat(next)}` : "0";
|
|
1899
1899
|
return sci ? `${body2}E+00` : body2;
|
|
@@ -1967,15 +1967,15 @@ var SPECIALS = {
|
|
|
1967
1967
|
"#totals": "#Totals",
|
|
1968
1968
|
"#this row": "#This Row"
|
|
1969
1969
|
};
|
|
1970
|
-
var unescape = (
|
|
1971
|
-
function splitItems(
|
|
1970
|
+
var unescape = (text2) => text2.replace(/'(.)/g, "$1");
|
|
1971
|
+
function splitItems(text2) {
|
|
1972
1972
|
const items = [];
|
|
1973
1973
|
let depth = 0;
|
|
1974
1974
|
let current = "";
|
|
1975
|
-
for (let i2 = 0; i2 <
|
|
1976
|
-
const ch =
|
|
1975
|
+
for (let i2 = 0; i2 < text2.length; i2++) {
|
|
1976
|
+
const ch = text2[i2] ?? "";
|
|
1977
1977
|
if (ch === "'") {
|
|
1978
|
-
current += ch + (
|
|
1978
|
+
current += ch + (text2[i2 + 1] ?? "");
|
|
1979
1979
|
i2++;
|
|
1980
1980
|
continue;
|
|
1981
1981
|
}
|
|
@@ -1992,9 +1992,9 @@ function splitItems(text) {
|
|
|
1992
1992
|
return items;
|
|
1993
1993
|
}
|
|
1994
1994
|
var strip = (item) => item.startsWith("[") && item.endsWith("]") ? item.slice(1, -1) : item;
|
|
1995
|
-
function parseStructured(
|
|
1996
|
-
const open =
|
|
1997
|
-
const inner2 =
|
|
1995
|
+
function parseStructured(text2, tableName) {
|
|
1996
|
+
const open = text2.indexOf("[");
|
|
1997
|
+
const inner2 = text2.slice(open + 1, -1);
|
|
1998
1998
|
const out = { specials: [] };
|
|
1999
1999
|
if (tableName) out.table = tableName;
|
|
2000
2000
|
const addColumns = (spec2) => {
|
|
@@ -2019,7 +2019,7 @@ function parseStructured(text, tableName) {
|
|
|
2019
2019
|
out.specials.push(special);
|
|
2020
2020
|
return;
|
|
2021
2021
|
}
|
|
2022
|
-
if (out.column !== void 0) throw new FormulaError(`Invalid structured reference ${
|
|
2022
|
+
if (out.column !== void 0) throw new FormulaError(`Invalid structured reference ${text2}`);
|
|
2023
2023
|
addColumns(item);
|
|
2024
2024
|
};
|
|
2025
2025
|
if (!inner2.includes("[")) {
|
|
@@ -2038,13 +2038,28 @@ function parseStructured(text, tableName) {
|
|
|
2038
2038
|
|
|
2039
2039
|
// xlsx/formula/lexemes.ts
|
|
2040
2040
|
var ERRORS_BY_LENGTH = [...ERROR_CODES].sort((a, b) => b.length - a.length);
|
|
2041
|
-
var NAME_START = /[A-Za-z_\\\u00A1-\uFFFF]/;
|
|
2042
|
-
var NAME_CHAR = /[A-Za-z0-9_.?\\\u00A1-\uFFFF]/;
|
|
2043
2041
|
var NAME_RE = /^[A-Za-z_\\\u00A1-\uFFFF][A-Za-z0-9_.?\\\u00A1-\uFFFF]*/;
|
|
2044
2042
|
var CELL_RE = /^(\$?)([A-Za-z]{1,3})(\$?)(\d{1,7})/;
|
|
2045
2043
|
var COLS_RE = /^(\$?)([A-Za-z]{1,3}):(\$?)([A-Za-z]{1,3})/;
|
|
2046
2044
|
var ROWS_RE = /^(\$?)(\d{1,7}):(\$?)(\d{1,7})/;
|
|
2047
|
-
var NUMBER_RE2 = /^(?:\d
|
|
2045
|
+
var NUMBER_RE2 = /^(?:\d+(?:\.\d*)?|\.\d+)(?:[eE][+-]?\d+)?/;
|
|
2046
|
+
var sticky = (re) => new RegExp(re.source.replace(/^\^/, ""), "y");
|
|
2047
|
+
var CELL_AT = sticky(CELL_RE);
|
|
2048
|
+
var COLS_AT = sticky(COLS_RE);
|
|
2049
|
+
var ROWS_AT = sticky(ROWS_RE);
|
|
2050
|
+
var NAME_AT = sticky(NAME_RE);
|
|
2051
|
+
var NUMBER_AT = sticky(NUMBER_RE2);
|
|
2052
|
+
function matchAt(re, source, at) {
|
|
2053
|
+
re.lastIndex = at;
|
|
2054
|
+
return re.exec(source);
|
|
2055
|
+
}
|
|
2056
|
+
var isDigitAt = (source, at) => isDigitCode(source.charCodeAt(at));
|
|
2057
|
+
function rangeStartAt(source, at, accept, max) {
|
|
2058
|
+
let i2 = source[at] === "$" ? at + 1 : at;
|
|
2059
|
+
const from = i2;
|
|
2060
|
+
while (i2 - from <= max && accept(source.charCodeAt(i2))) i2++;
|
|
2061
|
+
return i2 > from && i2 - from <= max && source[i2] === ":";
|
|
2062
|
+
}
|
|
2048
2063
|
var OPERATORS = [
|
|
2049
2064
|
"<=",
|
|
2050
2065
|
">=",
|
|
@@ -2062,7 +2077,12 @@ var OPERATORS = [
|
|
|
2062
2077
|
":",
|
|
2063
2078
|
"@"
|
|
2064
2079
|
];
|
|
2065
|
-
var
|
|
2080
|
+
var isLetterCode = (code) => code >= 65 && code <= 90 || code >= 97 && code <= 122;
|
|
2081
|
+
var isDigitCode = (code) => code >= 48 && code <= 57;
|
|
2082
|
+
var isNameStartCode = (code) => isLetterCode(code) || code === 95 || code === 92 || code >= 161;
|
|
2083
|
+
var isNameCharCode = (code) => isNameStartCode(code) || isDigitCode(code) || code === 46 || code === 63;
|
|
2084
|
+
var isSheetCharCode = (code) => isLetterCode(code) || isDigitCode(code) || code === 95 || code === 46 || code >= 161;
|
|
2085
|
+
var isNameChar = (ch) => ch !== void 0 && ch !== "" && isNameCharCode(ch.charCodeAt(0));
|
|
2066
2086
|
function matchError(source, at) {
|
|
2067
2087
|
const upper2 = source.slice(at, at + 14).toUpperCase();
|
|
2068
2088
|
return ERRORS_BY_LENGTH.find((code) => upper2.startsWith(code));
|
|
@@ -2078,14 +2098,13 @@ var boundary = (source, end) => {
|
|
|
2078
2098
|
return !isNameChar(next) && next !== "(" && next !== "!" && next !== "[";
|
|
2079
2099
|
};
|
|
2080
2100
|
function readReference(source, at) {
|
|
2081
|
-
const
|
|
2082
|
-
const cell = CELL_RE.exec(rest);
|
|
2101
|
+
const cell = matchAt(CELL_AT, source, at);
|
|
2083
2102
|
if (cell) {
|
|
2084
2103
|
const start = corner2(cell[1] ?? "", cell[2] ?? "", cell[3] ?? "", cell[4] ?? "");
|
|
2085
2104
|
let length = cell[0].length;
|
|
2086
2105
|
if (start) {
|
|
2087
|
-
if (
|
|
2088
|
-
const second =
|
|
2106
|
+
if (source[at + length] === ":") {
|
|
2107
|
+
const second = matchAt(CELL_AT, source, at + length + 1);
|
|
2089
2108
|
if (second) {
|
|
2090
2109
|
const end = corner2(second[1] ?? "", second[2] ?? "", second[3] ?? "", second[4] ?? "");
|
|
2091
2110
|
const total2 = length + 1 + second[0].length;
|
|
@@ -2099,8 +2118,8 @@ function readReference(source, at) {
|
|
|
2099
2118
|
}
|
|
2100
2119
|
length = 0;
|
|
2101
2120
|
}
|
|
2102
|
-
const cols =
|
|
2103
|
-
if (cols && boundary(source, at + cols[0].length) &&
|
|
2121
|
+
const cols = rangeStartAt(source, at, isLetterCode, 3) ? matchAt(COLS_AT, source, at) : null;
|
|
2122
|
+
if (cols && boundary(source, at + cols[0].length) && !isDigitAt(source, at + cols[0].length)) {
|
|
2104
2123
|
const c1 = columnIndex(cols[2] ?? "");
|
|
2105
2124
|
const c2 = columnIndex(cols[4] ?? "");
|
|
2106
2125
|
if (c1 >= 0 && c1 <= MAX_COL && c2 >= 0 && c2 <= MAX_COL) {
|
|
@@ -2114,7 +2133,7 @@ function readReference(source, at) {
|
|
|
2114
2133
|
};
|
|
2115
2134
|
}
|
|
2116
2135
|
}
|
|
2117
|
-
const rows2 =
|
|
2136
|
+
const rows2 = rangeStartAt(source, at, isDigitCode, 7) ? matchAt(ROWS_AT, source, at) : null;
|
|
2118
2137
|
if (rows2 && boundary(source, at + rows2[0].length) && source[at + rows2[0].length] !== ".") {
|
|
2119
2138
|
const r1 = Number(rows2[2]) - 1;
|
|
2120
2139
|
const r2 = Number(rows2[4]) - 1;
|
|
@@ -2167,8 +2186,8 @@ function readBrackets(source, at) {
|
|
|
2167
2186
|
}
|
|
2168
2187
|
throw new FormulaError("Unterminated structured reference", at);
|
|
2169
2188
|
}
|
|
2170
|
-
function splitSheets(
|
|
2171
|
-
let rest =
|
|
2189
|
+
function splitSheets(text2) {
|
|
2190
|
+
let rest = text2;
|
|
2172
2191
|
let book;
|
|
2173
2192
|
const bookMatch = /^\[([^\]]*)\]/.exec(rest);
|
|
2174
2193
|
if (bookMatch) {
|
|
@@ -2183,6 +2202,7 @@ function splitSheets(text) {
|
|
|
2183
2202
|
if (book !== void 0) out.book = book;
|
|
2184
2203
|
return out;
|
|
2185
2204
|
}
|
|
2205
|
+
var PREFIX_AT = /(\[\d+\])?([A-Za-z0-9_.\u00A1-\uFFFF]+)(?::([A-Za-z0-9_.\u00A1-\uFFFF]+))?!/y;
|
|
2186
2206
|
function readPrefix(source, at) {
|
|
2187
2207
|
const ch = source[at];
|
|
2188
2208
|
if (ch === "'") {
|
|
@@ -2191,19 +2211,27 @@ function readPrefix(source, at) {
|
|
|
2191
2211
|
const length = quoted.length + 1;
|
|
2192
2212
|
return { prefix: { text: source.slice(at, at + length), ...splitSheets(quoted.name) }, length };
|
|
2193
2213
|
}
|
|
2194
|
-
|
|
2195
|
-
|
|
2196
|
-
|
|
2214
|
+
let i2 = at;
|
|
2215
|
+
if (ch === "[") {
|
|
2216
|
+
i2++;
|
|
2217
|
+
while (isDigitCode(source.charCodeAt(i2))) i2++;
|
|
2218
|
+
if (i2 === at + 1 || source[i2] !== "]") return void 0;
|
|
2219
|
+
i2++;
|
|
2220
|
+
}
|
|
2221
|
+
while (i2 < source.length && isSheetCharCode(source.charCodeAt(i2))) i2++;
|
|
2222
|
+
if (source[i2] !== "!" && source[i2] !== ":") return void 0;
|
|
2223
|
+
const m = matchAt(PREFIX_AT, source, at);
|
|
2197
2224
|
if (!m) return void 0;
|
|
2198
2225
|
if (!m[1] && /^\d/.test(m[2] ?? "") && !m[3]) return void 0;
|
|
2199
2226
|
const raw = m[0].slice(0, -1);
|
|
2200
2227
|
return { prefix: { text: m[0], ...splitSheets(raw) }, length: m[0].length };
|
|
2201
2228
|
}
|
|
2202
|
-
function numberLiteral(
|
|
2203
|
-
|
|
2229
|
+
function numberLiteral(text2) {
|
|
2230
|
+
if (text2.length <= 15) return Number(text2);
|
|
2231
|
+
const [mantissa = "", exponent] = text2.toLowerCase().split("e");
|
|
2204
2232
|
const digits2 = mantissa.replace(".", "");
|
|
2205
2233
|
const firstSignificant = digits2.search(/[1-9]/);
|
|
2206
|
-
if (firstSignificant < 0 || digits2.length - firstSignificant <= 15) return Number(
|
|
2234
|
+
if (firstSignificant < 0 || digits2.length - firstSignificant <= 15) return Number(text2);
|
|
2207
2235
|
const point = mantissa.includes(".") ? mantissa.indexOf(".") : mantissa.length;
|
|
2208
2236
|
const kept = digits2.slice(0, firstSignificant + 15);
|
|
2209
2237
|
const truncated = kept.length >= point ? `${kept.slice(0, point)}.${kept.slice(point)}` : kept + "0".repeat(point - kept.length);
|
|
@@ -2211,6 +2239,17 @@ function numberLiteral(text) {
|
|
|
2211
2239
|
}
|
|
2212
2240
|
|
|
2213
2241
|
// xlsx/formula/tokenizer.ts
|
|
2242
|
+
var SINGLE = {
|
|
2243
|
+
"(": "open",
|
|
2244
|
+
")": "close",
|
|
2245
|
+
",": "comma",
|
|
2246
|
+
";": "semicolon",
|
|
2247
|
+
"{": "lbrace",
|
|
2248
|
+
"}": "rbrace"
|
|
2249
|
+
};
|
|
2250
|
+
var BOOK_INDEX = /\[\d+\]/y;
|
|
2251
|
+
var isSpace = (code) => code === 32 || code === 9 || code === 13 || code === 10;
|
|
2252
|
+
var isDigit3 = (code) => code >= 48 && code <= 57;
|
|
2214
2253
|
function tokenize(formula) {
|
|
2215
2254
|
const source = formula;
|
|
2216
2255
|
const tokens = [];
|
|
@@ -2222,61 +2261,55 @@ function tokenize(formula) {
|
|
|
2222
2261
|
};
|
|
2223
2262
|
while (i2 < source.length) {
|
|
2224
2263
|
const ch = source[i2] ?? "";
|
|
2264
|
+
const code = source.charCodeAt(i2);
|
|
2225
2265
|
const start = i2;
|
|
2226
|
-
if (
|
|
2227
|
-
|
|
2228
|
-
|
|
2266
|
+
if (isSpace(code)) {
|
|
2267
|
+
let j = i2 + 1;
|
|
2268
|
+
while (j < source.length && isSpace(source.charCodeAt(j))) j++;
|
|
2269
|
+
push3({ kind: "ws", text: source.slice(i2, j), start });
|
|
2229
2270
|
continue;
|
|
2230
2271
|
}
|
|
2231
2272
|
if (ch === '"') {
|
|
2232
2273
|
let j = i2 + 1;
|
|
2233
2274
|
let value2 = "";
|
|
2234
2275
|
for (; ; ) {
|
|
2235
|
-
|
|
2236
|
-
if (
|
|
2237
|
-
|
|
2238
|
-
|
|
2239
|
-
|
|
2240
|
-
|
|
2241
|
-
|
|
2242
|
-
break;
|
|
2276
|
+
const quote = source.indexOf('"', j);
|
|
2277
|
+
if (quote < 0) throw new FormulaError("Unterminated string", start);
|
|
2278
|
+
value2 += source.slice(j, quote);
|
|
2279
|
+
if (source[quote + 1] === '"') {
|
|
2280
|
+
value2 += '"';
|
|
2281
|
+
j = quote + 2;
|
|
2282
|
+
continue;
|
|
2243
2283
|
}
|
|
2244
|
-
|
|
2245
|
-
|
|
2284
|
+
j = quote;
|
|
2285
|
+
break;
|
|
2246
2286
|
}
|
|
2247
2287
|
push3({ kind: "string", text: source.slice(start, j + 1), start, value: value2 });
|
|
2248
2288
|
continue;
|
|
2249
2289
|
}
|
|
2250
2290
|
if (ch === "#") {
|
|
2251
|
-
const
|
|
2252
|
-
if (!
|
|
2291
|
+
const code2 = matchError(source, i2);
|
|
2292
|
+
if (!code2) throw new FormulaError(`Unexpected '#'`, start);
|
|
2253
2293
|
push3({
|
|
2254
|
-
kind:
|
|
2255
|
-
text: source.slice(i2, i2 +
|
|
2294
|
+
kind: code2 === "#REF!" ? "ref" : "error",
|
|
2295
|
+
text: source.slice(i2, i2 + code2.length),
|
|
2256
2296
|
start,
|
|
2257
|
-
value:
|
|
2297
|
+
value: code2
|
|
2258
2298
|
});
|
|
2259
2299
|
continue;
|
|
2260
2300
|
}
|
|
2261
|
-
const
|
|
2262
|
-
"(": "open",
|
|
2263
|
-
")": "close",
|
|
2264
|
-
",": "comma",
|
|
2265
|
-
";": "semicolon",
|
|
2266
|
-
"{": "lbrace",
|
|
2267
|
-
"}": "rbrace"
|
|
2268
|
-
};
|
|
2269
|
-
const kind = single[ch];
|
|
2301
|
+
const kind = SINGLE[ch];
|
|
2270
2302
|
if (kind) {
|
|
2271
2303
|
push3({ kind, text: ch, start });
|
|
2272
2304
|
continue;
|
|
2273
2305
|
}
|
|
2274
|
-
if (ch === "[" &&
|
|
2306
|
+
if (ch === "[" && !matchAt(BOOK_INDEX, source, i2)) {
|
|
2275
2307
|
const length = readBrackets(source, i2);
|
|
2276
2308
|
push3({ kind: "structured", text: source.slice(i2, i2 + length), start, value: "" });
|
|
2277
2309
|
continue;
|
|
2278
2310
|
}
|
|
2279
|
-
const
|
|
2311
|
+
const nameStart = isNameStartCode(code);
|
|
2312
|
+
const prefixed = ch === "'" || ch === "[" || nameStart || isDigit3(code);
|
|
2280
2313
|
if (prefixed) {
|
|
2281
2314
|
const prefix = readPrefix(source, i2);
|
|
2282
2315
|
if (prefix) {
|
|
@@ -2285,14 +2318,15 @@ function tokenize(formula) {
|
|
|
2285
2318
|
}
|
|
2286
2319
|
if (ch === "'" || ch === "[") throw new FormulaError("Malformed sheet reference", start);
|
|
2287
2320
|
}
|
|
2288
|
-
|
|
2321
|
+
const numeric2 = isDigit3(code) || ch === ".";
|
|
2322
|
+
if (numeric2 || ch === "$" || nameStart) {
|
|
2289
2323
|
const ref = readReference(source, i2);
|
|
2290
2324
|
if (ref) {
|
|
2291
2325
|
push3(refToken(source, start, i2 + ref.length, ref.ref, void 0));
|
|
2292
2326
|
continue;
|
|
2293
2327
|
}
|
|
2294
|
-
if (
|
|
2295
|
-
const m =
|
|
2328
|
+
if (numeric2) {
|
|
2329
|
+
const m = matchAt(NUMBER_AT, source, i2);
|
|
2296
2330
|
if (!m) throw new FormulaError(`Unexpected '${ch}'`, start);
|
|
2297
2331
|
push3({ kind: "number", text: m[0], start, value: numberLiteral(m[0]) });
|
|
2298
2332
|
continue;
|
|
@@ -2329,11 +2363,12 @@ function readAfterPrefix(source, at, start, prefix) {
|
|
|
2329
2363
|
}
|
|
2330
2364
|
const ref = readReference(source, at);
|
|
2331
2365
|
if (ref) return refToken(source, start, at + ref.length, ref.ref, prefix);
|
|
2332
|
-
if (
|
|
2366
|
+
if (at < source.length && isNameStartCode(source.charCodeAt(at)))
|
|
2367
|
+
return readName(source, at, start, prefix);
|
|
2333
2368
|
throw new FormulaError("Invalid reference after sheet name", at);
|
|
2334
2369
|
}
|
|
2335
2370
|
function readName(source, at, start, prefix) {
|
|
2336
|
-
const m =
|
|
2371
|
+
const m = matchAt(NAME_AT, source, at);
|
|
2337
2372
|
if (!m) throw new FormulaError("Invalid name", at);
|
|
2338
2373
|
const name = m[0];
|
|
2339
2374
|
let end = at + name.length;
|
|
@@ -2379,7 +2414,9 @@ var PREC_INTERSECT = 9;
|
|
|
2379
2414
|
var PREC_RANGE = 10;
|
|
2380
2415
|
var OPERAND_START = /* @__PURE__ */ new Set(["ref", "name", "func", "open", "structured"]);
|
|
2381
2416
|
function parseFormula(formula) {
|
|
2382
|
-
|
|
2417
|
+
return parseTokens(tokenize(formula));
|
|
2418
|
+
}
|
|
2419
|
+
function parseTokens(all2) {
|
|
2383
2420
|
const tokens = [];
|
|
2384
2421
|
const wsBefore = [];
|
|
2385
2422
|
let sawWs = false;
|
|
@@ -2664,6 +2701,222 @@ function localDateToSerial(date, date1904 = date1904Mode) {
|
|
|
2664
2701
|
return base + (utc - dayStart) / DAY_MS;
|
|
2665
2702
|
}
|
|
2666
2703
|
|
|
2704
|
+
// xlsx/formula/area-index.ts
|
|
2705
|
+
var BUCKET_WIDTH = 64;
|
|
2706
|
+
var CHUNK_SHIFT = 6;
|
|
2707
|
+
var CHUNKS = 64;
|
|
2708
|
+
function push(map, key, value2) {
|
|
2709
|
+
const list = map.get(key);
|
|
2710
|
+
if (list) list.push(value2);
|
|
2711
|
+
else map.set(key, [value2]);
|
|
2712
|
+
}
|
|
2713
|
+
function inner(map, sheet) {
|
|
2714
|
+
let found = map.get(sheet);
|
|
2715
|
+
if (!found) map.set(sheet, found = /* @__PURE__ */ new Map());
|
|
2716
|
+
return found;
|
|
2717
|
+
}
|
|
2718
|
+
var AreaIndex = class {
|
|
2719
|
+
cells = /* @__PURE__ */ new Map();
|
|
2720
|
+
chunked = /* @__PURE__ */ new Map();
|
|
2721
|
+
tall = /* @__PURE__ */ new Map();
|
|
2722
|
+
wide = /* @__PURE__ */ new Map();
|
|
2723
|
+
add(area, node) {
|
|
2724
|
+
const { start, end } = area.range;
|
|
2725
|
+
if (start.row === end.row && end.col - start.col + 1 <= BUCKET_WIDTH) {
|
|
2726
|
+
const cells = inner(this.cells, area.sheet);
|
|
2727
|
+
for (let col = start.col; col <= end.col; col++) push(cells, cellKey(start.row, col), node);
|
|
2728
|
+
return;
|
|
2729
|
+
}
|
|
2730
|
+
const entry = { range: area.range, node };
|
|
2731
|
+
if (end.col - start.col + 1 > BUCKET_WIDTH) {
|
|
2732
|
+
const list = this.wide.get(area.sheet);
|
|
2733
|
+
if (list) list.push(entry);
|
|
2734
|
+
else this.wide.set(area.sheet, [entry]);
|
|
2735
|
+
return;
|
|
2736
|
+
}
|
|
2737
|
+
const first2 = start.row >> CHUNK_SHIFT;
|
|
2738
|
+
const last = end.row >> CHUNK_SHIFT;
|
|
2739
|
+
if (last - first2 + 1 > CHUNKS) {
|
|
2740
|
+
const cols2 = inner(this.tall, area.sheet);
|
|
2741
|
+
for (let c = start.col; c <= end.col; c++) push(cols2, c, entry);
|
|
2742
|
+
return;
|
|
2743
|
+
}
|
|
2744
|
+
const cols = inner(this.chunked, area.sheet);
|
|
2745
|
+
for (let c = start.col; c <= end.col; c++) {
|
|
2746
|
+
let chunks = cols.get(c);
|
|
2747
|
+
if (!chunks) cols.set(c, chunks = /* @__PURE__ */ new Map());
|
|
2748
|
+
for (let k = first2; k <= last; k++) push(chunks, k, entry);
|
|
2749
|
+
}
|
|
2750
|
+
}
|
|
2751
|
+
/** Items whose areas intersect `range` on `sheet` (each once). */
|
|
2752
|
+
dependents(sheet, range2, out) {
|
|
2753
|
+
const found = out instanceof Set ? out : /* @__PURE__ */ new Set();
|
|
2754
|
+
this.collect(sheet, range2, found);
|
|
2755
|
+
if (Array.isArray(out)) for (const node of found) out.push(node);
|
|
2756
|
+
}
|
|
2757
|
+
collect(sheet, range2, out) {
|
|
2758
|
+
const { start, end } = range2;
|
|
2759
|
+
const check3 = (list) => {
|
|
2760
|
+
if (list) {
|
|
2761
|
+
for (const entry of list) if (rangesIntersect(entry.range, range2)) out.add(entry.node);
|
|
2762
|
+
}
|
|
2763
|
+
};
|
|
2764
|
+
const cells = this.cells.get(sheet);
|
|
2765
|
+
if (cells) {
|
|
2766
|
+
const size = (end.row - start.row + 1) * (end.col - start.col + 1);
|
|
2767
|
+
if (size <= 4096) {
|
|
2768
|
+
for (let r = start.row; r <= end.row; r++) {
|
|
2769
|
+
for (let c = start.col; c <= end.col; c++) {
|
|
2770
|
+
const list = cells.get(cellKey(r, c));
|
|
2771
|
+
if (list) for (const node of list) out.add(node);
|
|
2772
|
+
}
|
|
2773
|
+
}
|
|
2774
|
+
} else {
|
|
2775
|
+
for (const [key, list] of cells) {
|
|
2776
|
+
const { row: row2, col } = keyToAddress(key);
|
|
2777
|
+
if (row2 >= start.row && row2 <= end.row && col >= start.col && col <= end.col)
|
|
2778
|
+
for (const node of list) out.add(node);
|
|
2779
|
+
}
|
|
2780
|
+
}
|
|
2781
|
+
}
|
|
2782
|
+
const columns = (map, visit2) => {
|
|
2783
|
+
if (!map) return;
|
|
2784
|
+
if (end.col - start.col + 1 <= map.size) {
|
|
2785
|
+
for (let c = start.col; c <= end.col; c++) if (map.has(c)) visit2(c);
|
|
2786
|
+
} else for (const c of map.keys()) if (c >= start.col && c <= end.col) visit2(c);
|
|
2787
|
+
};
|
|
2788
|
+
const chunked = this.chunked.get(sheet);
|
|
2789
|
+
const first2 = start.row >> CHUNK_SHIFT;
|
|
2790
|
+
const last = end.row >> CHUNK_SHIFT;
|
|
2791
|
+
columns(chunked, (c) => {
|
|
2792
|
+
const chunks = chunked?.get(c);
|
|
2793
|
+
if (last - first2 + 1 <= chunks.size) {
|
|
2794
|
+
for (let k = first2; k <= last; k++) check3(chunks.get(k));
|
|
2795
|
+
} else for (const [k, list] of chunks) if (k >= first2 && k <= last) check3(list);
|
|
2796
|
+
});
|
|
2797
|
+
const tall = this.tall.get(sheet);
|
|
2798
|
+
columns(tall, (c) => check3(tall?.get(c)));
|
|
2799
|
+
check3(this.wide.get(sheet));
|
|
2800
|
+
}
|
|
2801
|
+
};
|
|
2802
|
+
|
|
2803
|
+
// xlsx/formula/graph-index.ts
|
|
2804
|
+
var ColumnIndex = class {
|
|
2805
|
+
sheets = /* @__PURE__ */ new Map();
|
|
2806
|
+
constructor(nodes) {
|
|
2807
|
+
for (const node of nodes) {
|
|
2808
|
+
let cols = this.sheets.get(node.sheet);
|
|
2809
|
+
if (!cols) this.sheets.set(node.sheet, cols = /* @__PURE__ */ new Map());
|
|
2810
|
+
let list = cols.get(node.col);
|
|
2811
|
+
if (!list) cols.set(node.col, list = []);
|
|
2812
|
+
list.push(node);
|
|
2813
|
+
}
|
|
2814
|
+
for (const cols of this.sheets.values())
|
|
2815
|
+
for (const list of cols.values()) list.sort((a, b) => a.row - b.row);
|
|
2816
|
+
}
|
|
2817
|
+
nodesIn(area, out) {
|
|
2818
|
+
const cols = this.sheets.get(area.sheet);
|
|
2819
|
+
if (!cols) return;
|
|
2820
|
+
const { start, end } = area.range;
|
|
2821
|
+
const width = end.col - start.col + 1;
|
|
2822
|
+
const scan2 = (list) => {
|
|
2823
|
+
let lo = 0;
|
|
2824
|
+
let hi = list.length;
|
|
2825
|
+
while (lo < hi) {
|
|
2826
|
+
const mid = lo + hi >> 1;
|
|
2827
|
+
if (list[mid].row < start.row) lo = mid + 1;
|
|
2828
|
+
else hi = mid;
|
|
2829
|
+
}
|
|
2830
|
+
for (let i2 = lo; i2 < list.length; i2++) {
|
|
2831
|
+
const node = list[i2];
|
|
2832
|
+
if (node.row > end.row) break;
|
|
2833
|
+
out.push(node);
|
|
2834
|
+
}
|
|
2835
|
+
};
|
|
2836
|
+
if (width <= cols.size) {
|
|
2837
|
+
for (let c = start.col; c <= end.col; c++) {
|
|
2838
|
+
const list = cols.get(c);
|
|
2839
|
+
if (list) scan2(list);
|
|
2840
|
+
}
|
|
2841
|
+
} else {
|
|
2842
|
+
for (const [c, list] of cols) if (c >= start.col && c <= end.col) scan2(list);
|
|
2843
|
+
}
|
|
2844
|
+
}
|
|
2845
|
+
};
|
|
2846
|
+
var ReverseIndex = class extends AreaIndex {
|
|
2847
|
+
constructor(nodes = []) {
|
|
2848
|
+
super();
|
|
2849
|
+
for (const node of nodes) this.addNode(node);
|
|
2850
|
+
}
|
|
2851
|
+
/** Indexes one more formula's precedents. */
|
|
2852
|
+
addNode(node) {
|
|
2853
|
+
for (const dep of node.deps) this.add(dep, node);
|
|
2854
|
+
for (const dep of node.dynamicDeps) this.add(dep, node);
|
|
2855
|
+
}
|
|
2856
|
+
};
|
|
2857
|
+
|
|
2858
|
+
// xlsx/formula/engine-prepare.ts
|
|
2859
|
+
var CHECK_EVERY = 32;
|
|
2860
|
+
var GraphPreparation = class {
|
|
2861
|
+
constructor(workbook, create) {
|
|
2862
|
+
this.workbook = workbook;
|
|
2863
|
+
this.create = create;
|
|
2864
|
+
}
|
|
2865
|
+
workbook;
|
|
2866
|
+
create;
|
|
2867
|
+
reverse = new ReverseIndex();
|
|
2868
|
+
formulas = { dynamic: [], unvalued: [] };
|
|
2869
|
+
sheet = 0;
|
|
2870
|
+
rows;
|
|
2871
|
+
row = 0;
|
|
2872
|
+
cells;
|
|
2873
|
+
finished = false;
|
|
2874
|
+
/**
|
|
2875
|
+
* Adds formulas to the graph until `timeRemaining` (milliseconds, as an idle deadline reports
|
|
2876
|
+
* them) reaches zero, or until every formula is in. Returns true when the graph is complete.
|
|
2877
|
+
*/
|
|
2878
|
+
run(timeRemaining) {
|
|
2879
|
+
let visited = 0;
|
|
2880
|
+
while (!this.finished) {
|
|
2881
|
+
const cells = this.cells ?? this.nextRow();
|
|
2882
|
+
if (!cells) continue;
|
|
2883
|
+
const next = cells.next();
|
|
2884
|
+
if (next.done) {
|
|
2885
|
+
this.cells = void 0;
|
|
2886
|
+
continue;
|
|
2887
|
+
}
|
|
2888
|
+
const [col, cell] = next.value;
|
|
2889
|
+
if (cell.formula) this.add(this.create(this.sheet, this.row, col, cell), cell);
|
|
2890
|
+
if (timeRemaining && ++visited % CHECK_EVERY === 0 && timeRemaining() <= 0) break;
|
|
2891
|
+
}
|
|
2892
|
+
return this.finished;
|
|
2893
|
+
}
|
|
2894
|
+
add(node, cell) {
|
|
2895
|
+
this.reverse.addNode(node);
|
|
2896
|
+
if (!node.legacy && !node.arrayRange) this.formulas.dynamic.push(node);
|
|
2897
|
+
if (cell.value === null && !node.keepCached) this.formulas.unvalued.push(node);
|
|
2898
|
+
}
|
|
2899
|
+
/** Moves to the next stored row (and sheet), or marks the walk finished. */
|
|
2900
|
+
nextRow() {
|
|
2901
|
+
for (; ; ) {
|
|
2902
|
+
const sheet = this.workbook.sheets[this.sheet];
|
|
2903
|
+
if (!sheet) {
|
|
2904
|
+
this.finished = true;
|
|
2905
|
+
return void 0;
|
|
2906
|
+
}
|
|
2907
|
+
this.rows ??= sheet.rows.entries();
|
|
2908
|
+
const next = this.rows.next();
|
|
2909
|
+
if (!next.done) {
|
|
2910
|
+
this.row = next.value[0];
|
|
2911
|
+
this.cells = next.value[1].entries();
|
|
2912
|
+
return this.cells;
|
|
2913
|
+
}
|
|
2914
|
+
this.rows = void 0;
|
|
2915
|
+
this.sheet++;
|
|
2916
|
+
}
|
|
2917
|
+
}
|
|
2918
|
+
};
|
|
2919
|
+
|
|
2667
2920
|
// xlsx/formula/text-number.ts
|
|
2668
2921
|
var MONTHS2 = [
|
|
2669
2922
|
"jan",
|
|
@@ -2689,8 +2942,8 @@ function monthFromName2(name) {
|
|
|
2689
2942
|
}
|
|
2690
2943
|
var NUMBER_RE3 = /^(\d+(?:,\d{3,})+|\d*)(\.\d*)?(?:e([+-]?\d+))?$/i;
|
|
2691
2944
|
var TIME_RE2 = /^(\d{1,4})(?::(\d+))?(?::(\d+(?:\.\d*)?))?(?:\s+(am|pm|a|p))?$/i;
|
|
2692
|
-
function parsePlainNumber(
|
|
2693
|
-
const match2 = NUMBER_RE3.exec(
|
|
2945
|
+
function parsePlainNumber(text2) {
|
|
2946
|
+
const match2 = NUMBER_RE3.exec(text2);
|
|
2694
2947
|
if (!match2) return void 0;
|
|
2695
2948
|
const int2 = (match2[1] ?? "").replace(/,/g, "");
|
|
2696
2949
|
const frac = match2[2] ?? "";
|
|
@@ -2698,8 +2951,8 @@ function parsePlainNumber(text) {
|
|
|
2698
2951
|
const value2 = Number(`${int2 || "0"}${frac === "." ? "" : frac}${match2[3] ? `e${match2[3]}` : ""}`);
|
|
2699
2952
|
return Number.isFinite(value2) ? value2 : void 0;
|
|
2700
2953
|
}
|
|
2701
|
-
function parseTime2(
|
|
2702
|
-
const match2 = TIME_RE2.exec(
|
|
2954
|
+
function parseTime2(text2) {
|
|
2955
|
+
const match2 = TIME_RE2.exec(text2);
|
|
2703
2956
|
if (!match2) return void 0;
|
|
2704
2957
|
let hours = Number(match2[1]);
|
|
2705
2958
|
const minutes = Number(match2[2] ?? 0);
|
|
@@ -2722,28 +2975,28 @@ function serialOrUndefined(year, month, day) {
|
|
|
2722
2975
|
}
|
|
2723
2976
|
return ymdToSerial(year, month, day, currentDate1904());
|
|
2724
2977
|
}
|
|
2725
|
-
var fullYear2 = (
|
|
2726
|
-
const year = Number(
|
|
2727
|
-
if (
|
|
2978
|
+
var fullYear2 = (text2) => {
|
|
2979
|
+
const year = Number(text2);
|
|
2980
|
+
if (text2.length > 2) return year;
|
|
2728
2981
|
return year < 30 ? 2e3 + year : 1900 + year;
|
|
2729
2982
|
};
|
|
2730
|
-
function parseDate(
|
|
2983
|
+
function parseDate(text2) {
|
|
2731
2984
|
const thisYear = (/* @__PURE__ */ new Date()).getFullYear();
|
|
2732
|
-
let m = /^(\d{4})[-/](\d{1,2})[-/](\d{1,2})$/.exec(
|
|
2985
|
+
let m = /^(\d{4})[-/](\d{1,2})[-/](\d{1,2})$/.exec(text2);
|
|
2733
2986
|
if (m) return serialOrUndefined(Number(m[1]), Number(m[2]), Number(m[3]));
|
|
2734
|
-
m = /^(\d{1,2})\/(\d{1,2})(?:\/(\d{2}|\d{4}))?$/.exec(
|
|
2987
|
+
m = /^(\d{1,2})\/(\d{1,2})(?:\/(\d{2}|\d{4}))?$/.exec(text2);
|
|
2735
2988
|
if (m) return serialOrUndefined(m[3] ? fullYear2(m[3]) : thisYear, Number(m[1]), Number(m[2]));
|
|
2736
|
-
m = /^(\d{1,2})[-\s]([a-z]+)\.?(?:[-\s,]+(\d{2}|\d{4}))?$/i.exec(
|
|
2989
|
+
m = /^(\d{1,2})[-\s]([a-z]+)\.?(?:[-\s,]+(\d{2}|\d{4}))?$/i.exec(text2);
|
|
2737
2990
|
if (m) {
|
|
2738
2991
|
const month = monthFromName2(m[2] ?? "");
|
|
2739
2992
|
if (month) return serialOrUndefined(m[3] ? fullYear2(m[3]) : thisYear, month, Number(m[1]));
|
|
2740
2993
|
}
|
|
2741
|
-
m = /^([a-z]+)\.?[-\s](\d{1,2})(?:,?\s*(\d{4}))?$/i.exec(
|
|
2994
|
+
m = /^([a-z]+)\.?[-\s](\d{1,2})(?:,?\s*(\d{4}))?$/i.exec(text2);
|
|
2742
2995
|
if (m) {
|
|
2743
2996
|
const month = monthFromName2(m[1] ?? "");
|
|
2744
2997
|
if (month) return serialOrUndefined(m[3] ? Number(m[3]) : thisYear, month, Number(m[2]));
|
|
2745
2998
|
}
|
|
2746
|
-
m = /^([a-z]+)\.?[-\s](\d{4})$/i.exec(
|
|
2999
|
+
m = /^([a-z]+)\.?[-\s](\d{4})$/i.exec(text2);
|
|
2747
3000
|
if (m) {
|
|
2748
3001
|
const month = monthFromName2(m[1] ?? "");
|
|
2749
3002
|
if (month) return serialOrUndefined(Number(m[2]), month, 1);
|
|
@@ -2751,43 +3004,43 @@ function parseDate(text) {
|
|
|
2751
3004
|
return void 0;
|
|
2752
3005
|
}
|
|
2753
3006
|
function parseNumberText(input) {
|
|
2754
|
-
let
|
|
2755
|
-
if (
|
|
3007
|
+
let text2 = input.trim();
|
|
3008
|
+
if (text2 === "") return void 0;
|
|
2756
3009
|
let scale2 = 1;
|
|
2757
|
-
if (
|
|
3010
|
+
if (text2.endsWith("%")) {
|
|
2758
3011
|
scale2 = 0.01;
|
|
2759
|
-
|
|
3012
|
+
text2 = text2.slice(0, -1).trimEnd();
|
|
2760
3013
|
}
|
|
2761
3014
|
let sign2 = 1;
|
|
2762
|
-
if (
|
|
3015
|
+
if (text2.startsWith("(") && text2.endsWith(")")) {
|
|
2763
3016
|
sign2 = -1;
|
|
2764
|
-
|
|
3017
|
+
text2 = text2.slice(1, -1).trim();
|
|
2765
3018
|
}
|
|
2766
|
-
const signed = /^([+-]?)\s*\$?\s*([+-]?)\s*/.exec(
|
|
3019
|
+
const signed = /^([+-]?)\s*\$?\s*([+-]?)\s*/.exec(text2);
|
|
2767
3020
|
const signText = `${signed?.[1] ?? ""}${signed?.[2] ?? ""}`;
|
|
2768
3021
|
if (signText.length <= 1) {
|
|
2769
|
-
const body2 =
|
|
3022
|
+
const body2 = text2.slice(signed?.[0].length ?? 0);
|
|
2770
3023
|
const plain2 = parsePlainNumber(body2);
|
|
2771
3024
|
if (plain2 !== void 0) return (signText === "-" ? -1 : 1) * sign2 * plain2 * scale2;
|
|
2772
3025
|
}
|
|
2773
3026
|
if (scale2 !== 1 || sign2 !== 1) return void 0;
|
|
2774
|
-
const fraction = /^([+-]?)(?:(\d+)\s+)?(\d+)\/(\d+)$/.exec(
|
|
3027
|
+
const fraction = /^([+-]?)(?:(\d+)\s+)?(\d+)\/(\d+)$/.exec(text2);
|
|
2775
3028
|
if (fraction && fraction[2] !== void 0) {
|
|
2776
3029
|
const den = Number(fraction[4]);
|
|
2777
3030
|
if (den === 0) return void 0;
|
|
2778
3031
|
const value2 = Number(fraction[2]) + Number(fraction[3]) / den;
|
|
2779
3032
|
return fraction[1] === "-" ? -value2 : value2;
|
|
2780
3033
|
}
|
|
2781
|
-
const time = parseTime2(
|
|
3034
|
+
const time = parseTime2(text2);
|
|
2782
3035
|
if (time !== void 0) return time;
|
|
2783
|
-
const date = parseDate(
|
|
3036
|
+
const date = parseDate(text2);
|
|
2784
3037
|
if (date !== void 0) return date;
|
|
2785
|
-
const space =
|
|
3038
|
+
const space = text2.lastIndexOf(" ");
|
|
2786
3039
|
if (space > 0) {
|
|
2787
|
-
const datePart2 = parseDate(
|
|
2788
|
-
const timePart = parseTime2(
|
|
3040
|
+
const datePart2 = parseDate(text2.slice(0, space).trim());
|
|
3041
|
+
const timePart = parseTime2(text2.slice(space + 1).trim());
|
|
2789
3042
|
if (datePart2 !== void 0 && timePart !== void 0) return datePart2 + timePart;
|
|
2790
|
-
const amPm = /^(.*\S)\s+(\S+\s*(?:am|pm))$/i.exec(
|
|
3043
|
+
const amPm = /^(.*\S)\s+(\S+\s*(?:am|pm))$/i.exec(text2);
|
|
2791
3044
|
if (amPm) {
|
|
2792
3045
|
const d = parseDate(amPm[1] ?? "");
|
|
2793
3046
|
const t = parseTime2(amPm[2] ?? "");
|
|
@@ -3111,8 +3364,8 @@ function wildcardRegex(pattern) {
|
|
|
3111
3364
|
}
|
|
3112
3365
|
return new RegExp(`^${source}$`, "i");
|
|
3113
3366
|
}
|
|
3114
|
-
var escapeRegex = (
|
|
3115
|
-
var hasWildcards = (
|
|
3367
|
+
var escapeRegex = (text2) => text2.replace(/[.*+?^${}()|[\]\\/]/g, "\\$&");
|
|
3368
|
+
var hasWildcards = (text2) => /[*?~]/.test(text2);
|
|
3116
3369
|
function makeCriteria(criteria) {
|
|
3117
3370
|
if (isError(criteria)) return (value2) => isError(value2) && value2.error === criteria.error;
|
|
3118
3371
|
if (typeof criteria === "number") {
|
|
@@ -4364,22 +4617,22 @@ var NUMBER = String.raw`(?:\d+\.?\d*|\.\d+)(?:[eE][+-]?\d+)?`;
|
|
|
4364
4617
|
var REAL_ONLY = new RegExp(`^([+-]?${NUMBER})$`);
|
|
4365
4618
|
var IMAGINARY_ONLY = new RegExp(`^([+-]?(?:${NUMBER})?)([ij])$`);
|
|
4366
4619
|
var BOTH = new RegExp(`^([+-]?${NUMBER})([+-])((?:${NUMBER})?)([ij])$`);
|
|
4367
|
-
var coefficient = (
|
|
4620
|
+
var coefficient = (text2) => text2 === "" || text2 === "+" ? 1 : text2 === "-" ? -1 : Number(text2);
|
|
4368
4621
|
function parseComplex(value2) {
|
|
4369
4622
|
if (isError(value2)) fail(value2);
|
|
4370
4623
|
if (typeof value2 === "number") return { re: value2, im: 0, suffix: "i" };
|
|
4371
|
-
const
|
|
4372
|
-
if (
|
|
4373
|
-
const real = REAL_ONLY.exec(
|
|
4624
|
+
const text2 = toText(value2);
|
|
4625
|
+
if (text2 === "") return { re: 0, im: 0, suffix: "i" };
|
|
4626
|
+
const real = REAL_ONLY.exec(text2);
|
|
4374
4627
|
if (real) return { re: Number(real[1]), im: 0, suffix: "i" };
|
|
4375
|
-
const imaginary = IMAGINARY_ONLY.exec(
|
|
4628
|
+
const imaginary = IMAGINARY_ONLY.exec(text2);
|
|
4376
4629
|
if (imaginary)
|
|
4377
4630
|
return {
|
|
4378
4631
|
re: 0,
|
|
4379
4632
|
im: coefficient(imaginary[1] ?? ""),
|
|
4380
4633
|
suffix: imaginary[2] === "j" ? "j" : "i"
|
|
4381
4634
|
};
|
|
4382
|
-
const both = BOTH.exec(
|
|
4635
|
+
const both = BOTH.exec(text2);
|
|
4383
4636
|
if (!both) return fail(ERR.NUM);
|
|
4384
4637
|
const sign2 = both[2] === "-" ? -1 : 1;
|
|
4385
4638
|
return {
|
|
@@ -4389,9 +4642,9 @@ function parseComplex(value2) {
|
|
|
4389
4642
|
};
|
|
4390
4643
|
}
|
|
4391
4644
|
function digits(n) {
|
|
4392
|
-
const
|
|
4393
|
-
const match2 = /^(-?[\d.]+)e([+-])(\d+)$/.exec(
|
|
4394
|
-
return match2 ? `${match2[1]}E${match2[2]}${(match2[3] ?? "").padStart(2, "0")}` :
|
|
4645
|
+
const text2 = Number(n.toPrecision(15)).toString();
|
|
4646
|
+
const match2 = /^(-?[\d.]+)e([+-])(\d+)$/.exec(text2);
|
|
4647
|
+
return match2 ? `${match2[1]}E${match2[2]}${(match2[3] ?? "").padStart(2, "0")}` : text2;
|
|
4395
4648
|
}
|
|
4396
4649
|
function formatComplex({ re, im, suffix }) {
|
|
4397
4650
|
const r = Math.abs(re) < 1e-15 * Math.max(1, Math.abs(im)) ? 0 : re;
|
|
@@ -4743,15 +4996,15 @@ var C7 = "Engineering";
|
|
|
4743
4996
|
var BASES = { BIN: 2, OCT: 8, DEC: 10, HEX: 16 };
|
|
4744
4997
|
var BITS = { BIN: 10, OCT: 30, DEC: 0, HEX: 40 };
|
|
4745
4998
|
function parseBase(value2, base) {
|
|
4746
|
-
const
|
|
4999
|
+
const text2 = toText(scalar(value2)).trim().toUpperCase();
|
|
4747
5000
|
if (base === "DEC") return Math.trunc(num(value2));
|
|
4748
5001
|
const radix = BASES[base];
|
|
4749
5002
|
const digits2 = radix === 2 ? /^[01]{1,10}$/ : radix === 8 ? /^[0-7]{1,10}$/ : /^[0-9A-F]{1,10}$/;
|
|
4750
|
-
if (
|
|
4751
|
-
if (!digits2.test(
|
|
4752
|
-
let n = parseInt(
|
|
5003
|
+
if (text2 === "") return 0;
|
|
5004
|
+
if (!digits2.test(text2)) fail(ERR.NUM);
|
|
5005
|
+
let n = parseInt(text2, radix);
|
|
4753
5006
|
const bits = BITS[base];
|
|
4754
|
-
if (
|
|
5007
|
+
if (text2.length === 10 && n >= Math.pow(2, bits - 1)) n -= Math.pow(2, bits);
|
|
4755
5008
|
return n;
|
|
4756
5009
|
}
|
|
4757
5010
|
function formatBase(n, base, places) {
|
|
@@ -4760,10 +5013,10 @@ function formatBase(n, base, places) {
|
|
|
4760
5013
|
const limit2 = Math.pow(2, bits - 1);
|
|
4761
5014
|
if (n < -limit2 || n >= limit2) fail(ERR.NUM);
|
|
4762
5015
|
if (n < 0) return (Math.pow(2, bits) + n).toString(radix).toUpperCase();
|
|
4763
|
-
const
|
|
4764
|
-
if (places === void 0) return
|
|
4765
|
-
if (places <
|
|
4766
|
-
return
|
|
5016
|
+
const text2 = n.toString(radix).toUpperCase();
|
|
5017
|
+
if (places === void 0) return text2;
|
|
5018
|
+
if (places < text2.length || places > 10) fail(ERR.NUM);
|
|
5019
|
+
return text2.padStart(Math.trunc(places), "0");
|
|
4767
5020
|
}
|
|
4768
5021
|
var conversions = [];
|
|
4769
5022
|
for (const from of Object.keys(BASES)) {
|
|
@@ -4898,9 +5151,9 @@ var ENGINEERING_FUNCTIONS = [
|
|
|
4898
5151
|
1,
|
|
4899
5152
|
1,
|
|
4900
5153
|
(args) => {
|
|
4901
|
-
const
|
|
4902
|
-
const negative =
|
|
4903
|
-
const body2 = negative ?
|
|
5154
|
+
const text2 = str(args[0]).trim().toUpperCase();
|
|
5155
|
+
const negative = text2.startsWith("-");
|
|
5156
|
+
const body2 = negative ? text2.slice(1) : text2;
|
|
4904
5157
|
if (!/^[MDCLXVI]*$/.test(body2)) fail(ERR.VALUE);
|
|
4905
5158
|
const value2 = { M: 1e3, D: 500, C: 100, L: 50, X: 10, V: 5, I: 1 };
|
|
4906
5159
|
let total2 = 0;
|
|
@@ -4934,11 +5187,11 @@ var ENGINEERING_FUNCTIONS = [
|
|
|
4934
5187
|
2,
|
|
4935
5188
|
2,
|
|
4936
5189
|
(args) => {
|
|
4937
|
-
const
|
|
5190
|
+
const text2 = str(args[0]).trim().toLowerCase();
|
|
4938
5191
|
const radix = Math.trunc(num(args[1]));
|
|
4939
5192
|
if (radix < 2 || radix > 36) fail(ERR.NUM);
|
|
4940
5193
|
let total2 = 0;
|
|
4941
|
-
for (const ch of
|
|
5194
|
+
for (const ch of text2) {
|
|
4942
5195
|
const d = parseInt(ch, 36);
|
|
4943
5196
|
if (Number.isNaN(d) || d >= radix) fail(ERR.NUM);
|
|
4944
5197
|
total2 = total2 * radix + d;
|
|
@@ -4975,14 +5228,14 @@ function couponFacts(settlement, maturity, frequency2, basis, ctx) {
|
|
|
4975
5228
|
const daysToNext = basis === 0 ? daysInPeriod - daysSincePrevious : basis === 4 ? days360(s, next, true, ctx) : next - s;
|
|
4976
5229
|
return { previous, next, count: count2, daysSincePrevious, daysInPeriod, daysToNext };
|
|
4977
5230
|
}
|
|
4978
|
-
var security = (name, description,
|
|
5231
|
+
var security = (name, description, pick3) => spec(
|
|
4979
5232
|
name,
|
|
4980
5233
|
C8,
|
|
4981
5234
|
`${name}(settlement, maturity, frequency, [basis])`,
|
|
4982
5235
|
description,
|
|
4983
5236
|
3,
|
|
4984
5237
|
4,
|
|
4985
|
-
(args, ctx) =>
|
|
5238
|
+
(args, ctx) => pick3(
|
|
4986
5239
|
couponFacts(
|
|
4987
5240
|
serialArg(args[0]),
|
|
4988
5241
|
serialArg(args[1]),
|
|
@@ -5798,8 +6051,10 @@ var FINANCIAL_FUNCTIONS = [
|
|
|
5798
6051
|
|
|
5799
6052
|
// xlsx/formula/references.ts
|
|
5800
6053
|
function sheetIndex(host, name) {
|
|
6054
|
+
const sheets = host.workbook.sheets;
|
|
6055
|
+
for (let i2 = 0; i2 < sheets.length; i2++) if (sheets[i2]?.name === name) return i2;
|
|
5801
6056
|
const lower2 = name.toLowerCase();
|
|
5802
|
-
return
|
|
6057
|
+
return sheets.findIndex((sheet) => sheet.name.toLowerCase() === lower2);
|
|
5803
6058
|
}
|
|
5804
6059
|
function prefixSheets(host, prefix, current) {
|
|
5805
6060
|
if (!prefix) return [current];
|
|
@@ -6859,15 +7114,15 @@ function offset(args) {
|
|
|
6859
7114
|
{ sheet: area.sheet, range: { start: { row: r1, col: c1 }, end: { row: r2, col: c2 } } }
|
|
6860
7115
|
]);
|
|
6861
7116
|
}
|
|
6862
|
-
function parseR1C1(
|
|
6863
|
-
const bang =
|
|
7117
|
+
function parseR1C1(text2, ctx) {
|
|
7118
|
+
const bang = text2.lastIndexOf("!");
|
|
6864
7119
|
let sheet = ctx.sheet;
|
|
6865
|
-
let body2 =
|
|
7120
|
+
let body2 = text2;
|
|
6866
7121
|
if (bang >= 0) {
|
|
6867
|
-
const name =
|
|
7122
|
+
const name = text2.slice(0, bang).replace(/^'(.*)'$/, "$1").replace(/''/g, "'");
|
|
6868
7123
|
sheet = sheetIndex(ctx.frame.host, name);
|
|
6869
7124
|
if (sheet < 0) return void 0;
|
|
6870
|
-
body2 =
|
|
7125
|
+
body2 = text2.slice(bang + 1);
|
|
6871
7126
|
}
|
|
6872
7127
|
const range2 = parseR1C1Range(body2, { row: ctx.row, col: ctx.col });
|
|
6873
7128
|
if (!range2) return void 0;
|
|
@@ -6930,9 +7185,9 @@ var REFERENCE_FUNCTIONS = [
|
|
|
6930
7185
|
1,
|
|
6931
7186
|
2,
|
|
6932
7187
|
(args, ctx) => {
|
|
6933
|
-
const
|
|
7188
|
+
const text2 = str(args[0]).trim();
|
|
6934
7189
|
const a1 = args.length > 1 ? bool(args[1]) : true;
|
|
6935
|
-
const ref = a1 ? ctx.parseReference(
|
|
7190
|
+
const ref = a1 ? ctx.parseReference(text2) : parseR1C1(text2, ctx);
|
|
6936
7191
|
return ref ?? ERR.REF;
|
|
6937
7192
|
},
|
|
6938
7193
|
void 0,
|
|
@@ -7303,13 +7558,13 @@ var numberKey = (n) => `n${round15(n)}`;
|
|
|
7303
7558
|
function equalityKey(criteria) {
|
|
7304
7559
|
if (typeof criteria === "number") return numberKey(criteria);
|
|
7305
7560
|
if (typeof criteria !== "string") return void 0;
|
|
7306
|
-
const
|
|
7307
|
-
if (/^(<|>)/.test(
|
|
7561
|
+
const text2 = criteria.startsWith("=") ? criteria.slice(1) : criteria;
|
|
7562
|
+
if (/^(<|>)/.test(text2) || text2 === "" || hasWildcards(text2) || text2.startsWith("#"))
|
|
7308
7563
|
return void 0;
|
|
7309
|
-
const upper2 =
|
|
7564
|
+
const upper2 = text2.toUpperCase();
|
|
7310
7565
|
if (upper2 === "TRUE" || upper2 === "FALSE") return void 0;
|
|
7311
|
-
const n = parseNumberText(
|
|
7312
|
-
return n !== void 0 ? numberKey(n) : `s${
|
|
7566
|
+
const n = parseNumberText(text2);
|
|
7567
|
+
return n !== void 0 ? numberKey(n) : `s${text2.toLowerCase()}`;
|
|
7313
7568
|
}
|
|
7314
7569
|
function valueKeys(value2, out) {
|
|
7315
7570
|
out.length = 0;
|
|
@@ -7369,9 +7624,9 @@ function readBlock(ctx, area, rows2, cols) {
|
|
|
7369
7624
|
if (host.readBlock) return host.readBlock(area.sheet, range2);
|
|
7370
7625
|
return Matrix.build(rows2, cols, (r, c) => ctx.readCell(area.sheet, row2 + r, col + c));
|
|
7371
7626
|
}
|
|
7372
|
-
function shapedMatrices(ctx, values2,
|
|
7627
|
+
function shapedMatrices(ctx, values2, sameShape2) {
|
|
7373
7628
|
let { rows: rows2, cols } = shapeOf(values2[0] ?? null);
|
|
7374
|
-
if (
|
|
7629
|
+
if (sameShape2) {
|
|
7375
7630
|
for (const value2 of values2) {
|
|
7376
7631
|
const shape2 = shapeOf(value2);
|
|
7377
7632
|
if (shape2.rows !== rows2 || shape2.cols !== cols) fail(ERR.VALUE);
|
|
@@ -7397,12 +7652,12 @@ function shapedMatrices(ctx, values2, sameShape) {
|
|
|
7397
7652
|
});
|
|
7398
7653
|
return { matrices, total: total2, block: rows2 * cols };
|
|
7399
7654
|
}
|
|
7400
|
-
function matchingCells(ctx, pairs, target2,
|
|
7655
|
+
function matchingCells(ctx, pairs, target2, sameShape2) {
|
|
7401
7656
|
const ranges = pairs.map((p) => p.range);
|
|
7402
7657
|
const { matrices, total: total2, block } = shapedMatrices(
|
|
7403
7658
|
ctx,
|
|
7404
7659
|
target2 === void 0 ? ranges : [...ranges, target2],
|
|
7405
|
-
|
|
7660
|
+
sameShape2
|
|
7406
7661
|
);
|
|
7407
7662
|
const tests = pairs.map((p) => makeCriteria(scalar(p.criteria)));
|
|
7408
7663
|
const values2 = matrices[matrices.length - 1];
|
|
@@ -7441,7 +7696,7 @@ function indexedCandidates(pairs, matrices) {
|
|
|
7441
7696
|
}
|
|
7442
7697
|
return void 0;
|
|
7443
7698
|
}
|
|
7444
|
-
var matchingValues = (ctx, pairs, target2,
|
|
7699
|
+
var matchingValues = (ctx, pairs, target2, sameShape2) => matchingCells(ctx, pairs, target2, sameShape2).values;
|
|
7445
7700
|
function criteriaPairs(args, from) {
|
|
7446
7701
|
if ((args.length - from) % 2 !== 0) fail(ERR.VALUE);
|
|
7447
7702
|
const pairs = [];
|
|
@@ -10415,12 +10670,12 @@ function fixed(value2, decimals2, commas) {
|
|
|
10415
10670
|
const d = Math.trunc(decimals2);
|
|
10416
10671
|
const rounded = roundTo(value2, d, "half");
|
|
10417
10672
|
const abs2 = Math.abs(rounded);
|
|
10418
|
-
let
|
|
10673
|
+
let text2 = abs2.toFixed(Math.max(0, Math.min(d, 99)));
|
|
10419
10674
|
if (commas) {
|
|
10420
|
-
const [int2 = "", frac] =
|
|
10421
|
-
|
|
10675
|
+
const [int2 = "", frac] = text2.split(".");
|
|
10676
|
+
text2 = int2.replace(/\B(?=(\d{3})+(?!\d))/g, ",") + (frac !== void 0 ? `.${frac}` : "");
|
|
10422
10677
|
}
|
|
10423
|
-
return rounded < 0 ? `-${
|
|
10678
|
+
return rounded < 0 ? `-${text2}` : text2;
|
|
10424
10679
|
}
|
|
10425
10680
|
var TEXT_CONVERT = [
|
|
10426
10681
|
spec(
|
|
@@ -10456,19 +10711,19 @@ var TEXT_CONVERT = [
|
|
|
10456
10711
|
(args) => {
|
|
10457
10712
|
const decimal = (args.length > 1 ? str(args[1]) : ".").charAt(0) || ".";
|
|
10458
10713
|
const group = (args.length > 2 ? str(args[2]) : ",").charAt(0) || ",";
|
|
10459
|
-
let
|
|
10460
|
-
if (
|
|
10714
|
+
let text2 = str(args[0]).replace(/\s+/g, "");
|
|
10715
|
+
if (text2 === "") return 0;
|
|
10461
10716
|
let percent = 0;
|
|
10462
|
-
while (
|
|
10717
|
+
while (text2.endsWith("%")) {
|
|
10463
10718
|
percent++;
|
|
10464
|
-
|
|
10719
|
+
text2 = text2.slice(0, -1);
|
|
10465
10720
|
}
|
|
10466
|
-
const decimalAt =
|
|
10467
|
-
if (decimalAt >= 0 &&
|
|
10468
|
-
|
|
10469
|
-
if (decimal !== ".")
|
|
10470
|
-
const value2 = Number(
|
|
10471
|
-
if (!/^[+-]?(\d+\.?\d*|\.\d+)(e[+-]?\d+)?$/i.test(
|
|
10721
|
+
const decimalAt = text2.indexOf(decimal);
|
|
10722
|
+
if (decimalAt >= 0 && text2.slice(decimalAt + 1).includes(group)) fail(ERR.VALUE);
|
|
10723
|
+
text2 = text2.split(group).join("");
|
|
10724
|
+
if (decimal !== ".") text2 = text2.replace(decimal, ".");
|
|
10725
|
+
const value2 = Number(text2);
|
|
10726
|
+
if (!/^[+-]?(\d+\.?\d*|\.\d+)(e[+-]?\d+)?$/i.test(text2) || !Number.isFinite(value2))
|
|
10472
10727
|
fail(ERR.VALUE);
|
|
10473
10728
|
return value2 / Math.pow(100, percent);
|
|
10474
10729
|
}
|
|
@@ -10491,8 +10746,8 @@ var TEXT_CONVERT = [
|
|
|
10491
10746
|
2,
|
|
10492
10747
|
(args) => {
|
|
10493
10748
|
const value2 = num(args[0]);
|
|
10494
|
-
const
|
|
10495
|
-
return value2 < 0 &&
|
|
10749
|
+
const text2 = fixed(Math.abs(value2), optNum(args, 1, 2), true);
|
|
10750
|
+
return value2 < 0 && text2.replace(/[0.,]/g, "") !== "" ? `($${text2})` : `$${text2}`;
|
|
10496
10751
|
}
|
|
10497
10752
|
),
|
|
10498
10753
|
spec("CHAR", C33, "CHAR(number)", "The character for a code (Windows-1252).", 1, 1, (args) => {
|
|
@@ -10501,9 +10756,9 @@ var TEXT_CONVERT = [
|
|
|
10501
10756
|
return String.fromCharCode(CP1252[n] ?? n);
|
|
10502
10757
|
}),
|
|
10503
10758
|
spec("CODE", C33, "CODE(text)", "The code of the first character (Windows-1252).", 1, 1, (args) => {
|
|
10504
|
-
const
|
|
10505
|
-
if (
|
|
10506
|
-
const code =
|
|
10759
|
+
const text2 = str(args[0]);
|
|
10760
|
+
if (text2 === "") fail(ERR.VALUE);
|
|
10761
|
+
const code = text2.charCodeAt(0);
|
|
10507
10762
|
return CP1252_REVERSE.get(code) ?? (code <= 255 ? code : 63);
|
|
10508
10763
|
}),
|
|
10509
10764
|
spec("UNICHAR", C33, "UNICHAR(number)", "The Unicode character for a code point.", 1, 1, (args) => {
|
|
@@ -10512,9 +10767,9 @@ var TEXT_CONVERT = [
|
|
|
10512
10767
|
return String.fromCodePoint(n);
|
|
10513
10768
|
}),
|
|
10514
10769
|
spec("UNICODE", C33, "UNICODE(text)", "The code point of the first character.", 1, 1, (args) => {
|
|
10515
|
-
const
|
|
10516
|
-
if (
|
|
10517
|
-
return
|
|
10770
|
+
const text2 = str(args[0]);
|
|
10771
|
+
if (text2 === "") fail(ERR.VALUE);
|
|
10772
|
+
return text2.codePointAt(0) ?? fail(ERR.VALUE);
|
|
10518
10773
|
}),
|
|
10519
10774
|
spec("T", C33, "T(value)", "The text of a value, or empty text.", 1, 1, (args) => {
|
|
10520
10775
|
const v = scalar(args[0]);
|
|
@@ -10538,37 +10793,37 @@ function lowerChar(ch, before, after) {
|
|
|
10538
10793
|
const points = [...low];
|
|
10539
10794
|
return points.length === 1 ? low : points[0] ?? ch;
|
|
10540
10795
|
}
|
|
10541
|
-
function mapChars(
|
|
10542
|
-
const chars = [...
|
|
10796
|
+
function mapChars(text2, fn) {
|
|
10797
|
+
const chars = [...text2];
|
|
10543
10798
|
let out = "";
|
|
10544
10799
|
for (let i2 = 0; i2 < chars.length; i2++) out += fn(chars[i2], i2, chars);
|
|
10545
10800
|
return out;
|
|
10546
10801
|
}
|
|
10547
|
-
var upper = (
|
|
10548
|
-
var lower = (
|
|
10549
|
-
var proper = (
|
|
10802
|
+
var upper = (text2) => mapChars(text2, upperChar);
|
|
10803
|
+
var lower = (text2) => mapChars(text2, (ch, i2, all2) => lowerChar(ch, all2[i2 - 1], all2[i2 + 1]));
|
|
10804
|
+
var proper = (text2) => mapChars(text2, (ch, i2, all2) => {
|
|
10550
10805
|
if (!isLetter(ch)) return ch;
|
|
10551
10806
|
const before = all2[i2 - 1];
|
|
10552
10807
|
return before !== void 0 && isLetter(before) ? lowerChar(ch, before, all2[i2 + 1]) : upperChar(ch);
|
|
10553
10808
|
});
|
|
10554
10809
|
var isHigh = (code) => code >= 55296 && code <= 56319;
|
|
10555
10810
|
var isLow = (code) => code >= 56320 && code <= 57343;
|
|
10556
|
-
function left(
|
|
10557
|
-
let end = Math.min(n,
|
|
10558
|
-
if (end > 0 && end <
|
|
10559
|
-
return
|
|
10811
|
+
function left(text2, n) {
|
|
10812
|
+
let end = Math.min(n, text2.length);
|
|
10813
|
+
if (end > 0 && end < text2.length && isHigh(text2.charCodeAt(end - 1))) end++;
|
|
10814
|
+
return text2.slice(0, end);
|
|
10560
10815
|
}
|
|
10561
|
-
function right(
|
|
10816
|
+
function right(text2, n) {
|
|
10562
10817
|
if (n <= 0) return "";
|
|
10563
|
-
let start = Math.max(0,
|
|
10564
|
-
if (start > 0 && isLow(
|
|
10565
|
-
return
|
|
10818
|
+
let start = Math.max(0, text2.length - n);
|
|
10819
|
+
if (start > 0 && isLow(text2.charCodeAt(start))) start--;
|
|
10820
|
+
return text2.slice(start);
|
|
10566
10821
|
}
|
|
10567
10822
|
|
|
10568
10823
|
// xlsx/formula/functions/text.ts
|
|
10569
10824
|
var C34 = "Text";
|
|
10570
10825
|
var MAX_TEXT = 32767;
|
|
10571
|
-
var limit = (
|
|
10826
|
+
var limit = (text2) => text2.length > MAX_TEXT ? fail(ERR.VALUE) : text2;
|
|
10572
10827
|
function find(args, insensitive) {
|
|
10573
10828
|
const needle = str(args[0]);
|
|
10574
10829
|
const haystack = str(args[1]);
|
|
@@ -10733,19 +10988,19 @@ var TEXT_FUNCTIONS = [
|
|
|
10733
10988
|
3,
|
|
10734
10989
|
4,
|
|
10735
10990
|
(args) => {
|
|
10736
|
-
const
|
|
10991
|
+
const text2 = str(args[0]);
|
|
10737
10992
|
const oldText = str(args[1]);
|
|
10738
10993
|
const newText = str(args[2]);
|
|
10739
|
-
if (oldText === "") return
|
|
10740
|
-
if (args.length < 4) return limit(
|
|
10994
|
+
if (oldText === "") return text2;
|
|
10995
|
+
if (args.length < 4) return limit(text2.split(oldText).join(newText));
|
|
10741
10996
|
const instance = Math.trunc(num(args[3]));
|
|
10742
10997
|
if (instance < 1) fail(ERR.VALUE);
|
|
10743
10998
|
let at = -1;
|
|
10744
10999
|
for (let i2 = 0; i2 < instance; i2++) {
|
|
10745
|
-
at =
|
|
10746
|
-
if (at < 0) return
|
|
11000
|
+
at = text2.indexOf(oldText, at + 1);
|
|
11001
|
+
if (at < 0) return text2;
|
|
10747
11002
|
}
|
|
10748
|
-
return limit(
|
|
11003
|
+
return limit(text2.slice(0, at) + newText + text2.slice(at + oldText.length));
|
|
10749
11004
|
}
|
|
10750
11005
|
),
|
|
10751
11006
|
...["REPLACE", "REPLACEB"].map(
|
|
@@ -10757,11 +11012,11 @@ var TEXT_FUNCTIONS = [
|
|
|
10757
11012
|
4,
|
|
10758
11013
|
4,
|
|
10759
11014
|
(args) => {
|
|
10760
|
-
const
|
|
11015
|
+
const text2 = str(args[0]);
|
|
10761
11016
|
const start = Math.trunc(num(args[1]));
|
|
10762
11017
|
const n = Math.trunc(num(args[2]));
|
|
10763
11018
|
if (start < 1 || n < 0) fail(ERR.VALUE);
|
|
10764
|
-
return limit(
|
|
11019
|
+
return limit(text2.slice(0, start - 1) + str(args[3]) + text2.slice(start - 1 + n));
|
|
10765
11020
|
}
|
|
10766
11021
|
)
|
|
10767
11022
|
),
|
|
@@ -10789,9 +11044,9 @@ var TEXT_FUNCTIONS = [
|
|
|
10789
11044
|
),
|
|
10790
11045
|
spec("REPT", C34, "REPT(text, number_times)", "Repeats a text.", 2, 2, (args) => {
|
|
10791
11046
|
const n = Math.trunc(num(args[1]));
|
|
10792
|
-
const
|
|
10793
|
-
if (n < 0 ||
|
|
10794
|
-
return
|
|
11047
|
+
const text2 = str(args[0]);
|
|
11048
|
+
if (n < 0 || text2.length * n > MAX_TEXT) fail(ERR.VALUE);
|
|
11049
|
+
return text2.repeat(n);
|
|
10795
11050
|
}),
|
|
10796
11051
|
spec(
|
|
10797
11052
|
"EXACT",
|
|
@@ -10815,8 +11070,8 @@ function compile(pattern, caseMode2, global) {
|
|
|
10815
11070
|
}
|
|
10816
11071
|
}
|
|
10817
11072
|
var caseMode = (args, index2) => optNum(args, index2, 0);
|
|
10818
|
-
function encodeUrl(
|
|
10819
|
-
return encodeURIComponent(
|
|
11073
|
+
function encodeUrl(text2) {
|
|
11074
|
+
return encodeURIComponent(text2).replace(
|
|
10820
11075
|
/[!'()*]/g,
|
|
10821
11076
|
(c) => `%${c.charCodeAt(0).toString(16).toUpperCase()}`
|
|
10822
11077
|
);
|
|
@@ -10861,15 +11116,15 @@ var TEXT_REGEX_FUNCTIONS = [
|
|
|
10861
11116
|
3,
|
|
10862
11117
|
5,
|
|
10863
11118
|
(args) => {
|
|
10864
|
-
const
|
|
11119
|
+
const text2 = str(args[0]);
|
|
10865
11120
|
const regex = compile(str(args[1]), caseMode(args, 4), true);
|
|
10866
11121
|
const replacement = str(args[2]);
|
|
10867
11122
|
const occurrence = args.length > 3 && args[3] !== null ? int(args[3]) : 0;
|
|
10868
|
-
if (occurrence === 0) return
|
|
10869
|
-
const matches2 = [...
|
|
11123
|
+
if (occurrence === 0) return text2.replace(regex, replacement);
|
|
11124
|
+
const matches2 = [...text2.matchAll(regex)];
|
|
10870
11125
|
const picked = occurrence > 0 ? matches2[occurrence - 1] : matches2.at(occurrence);
|
|
10871
|
-
if (!picked || picked.index === void 0) return
|
|
10872
|
-
return
|
|
11126
|
+
if (!picked || picked.index === void 0) return text2;
|
|
11127
|
+
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);
|
|
10873
11128
|
}
|
|
10874
11129
|
)
|
|
10875
11130
|
];
|
|
@@ -10883,8 +11138,8 @@ function delimitersOf(ctx, value2) {
|
|
|
10883
11138
|
return toText(v);
|
|
10884
11139
|
});
|
|
10885
11140
|
}
|
|
10886
|
-
function occurrences(
|
|
10887
|
-
const hay = insensitive ?
|
|
11141
|
+
function occurrences(text2, delimiters, insensitive) {
|
|
11142
|
+
const hay = insensitive ? text2.toLowerCase() : text2;
|
|
10888
11143
|
const needles = delimiters.map((d) => insensitive ? d.toLowerCase() : d);
|
|
10889
11144
|
const out = [];
|
|
10890
11145
|
let i2 = 0;
|
|
@@ -10904,35 +11159,35 @@ function occurrences(text, delimiters, insensitive) {
|
|
|
10904
11159
|
return out;
|
|
10905
11160
|
}
|
|
10906
11161
|
function textAround(args, ctx, before) {
|
|
10907
|
-
const
|
|
11162
|
+
const text2 = str(args[0]);
|
|
10908
11163
|
const delimiters = delimitersOf(ctx, args[1]);
|
|
10909
11164
|
const instance = Math.trunc(optNum(args, 2, 1));
|
|
10910
11165
|
const insensitive = optNum(args, 3, 0) === 1;
|
|
10911
11166
|
const matchEnd = optBool(args, 4, false);
|
|
10912
11167
|
const notFound = args.length > 5 ? scalar(args[5]) ?? ERR.NA : ERR.NA;
|
|
10913
|
-
if (instance === 0 || Math.abs(instance) >
|
|
11168
|
+
if (instance === 0 || Math.abs(instance) > text2.length + 1) fail(ERR.VALUE);
|
|
10914
11169
|
if (delimiters.length === 0 || delimiters.every((d) => d === "")) {
|
|
10915
|
-
return before ? instance > 0 ? "" :
|
|
11170
|
+
return before ? instance > 0 ? "" : text2 : instance > 0 ? text2 : "";
|
|
10916
11171
|
}
|
|
10917
|
-
const found = occurrences(
|
|
11172
|
+
const found = occurrences(text2, delimiters, insensitive);
|
|
10918
11173
|
if (matchEnd) {
|
|
10919
|
-
if (instance > 0) found.push({ at:
|
|
11174
|
+
if (instance > 0) found.push({ at: text2.length, length: 0 });
|
|
10920
11175
|
else found.unshift({ at: 0, length: 0 });
|
|
10921
11176
|
}
|
|
10922
11177
|
const index2 = instance > 0 ? instance - 1 : found.length + instance;
|
|
10923
11178
|
const hit = found[index2];
|
|
10924
11179
|
if (!hit || index2 < 0) return notFound;
|
|
10925
|
-
return before ?
|
|
11180
|
+
return before ? text2.slice(0, hit.at) : text2.slice(hit.at + hit.length);
|
|
10926
11181
|
}
|
|
10927
|
-
function splitText(
|
|
10928
|
-
if (delimiters.length === 0) return [
|
|
11182
|
+
function splitText(text2, delimiters, insensitive, ignoreEmpty) {
|
|
11183
|
+
if (delimiters.length === 0) return [text2];
|
|
10929
11184
|
const parts = [];
|
|
10930
11185
|
let last = 0;
|
|
10931
|
-
for (const hit of occurrences(
|
|
10932
|
-
parts.push(
|
|
11186
|
+
for (const hit of occurrences(text2, delimiters, insensitive)) {
|
|
11187
|
+
parts.push(text2.slice(last, hit.at));
|
|
10933
11188
|
last = hit.at + hit.length;
|
|
10934
11189
|
}
|
|
10935
|
-
parts.push(
|
|
11190
|
+
parts.push(text2.slice(last));
|
|
10936
11191
|
return ignoreEmpty ? parts.filter((p) => p !== "") : parts;
|
|
10937
11192
|
}
|
|
10938
11193
|
function valueToText(value2, strict) {
|
|
@@ -10970,14 +11225,14 @@ var TEXT_EXTRA_FUNCTIONS = [
|
|
|
10970
11225
|
2,
|
|
10971
11226
|
6,
|
|
10972
11227
|
(args, ctx) => {
|
|
10973
|
-
const
|
|
11228
|
+
const text2 = str(ctx.toScalar(args[0] ?? null));
|
|
10974
11229
|
const colDelims = delimitersOf(ctx, args[1]);
|
|
10975
11230
|
const rowDelims = delimitersOf(ctx, args[2]);
|
|
10976
11231
|
const ignoreEmpty = args.length > 3 && args[3] !== null && Boolean(scalar(ctx.toScalar(args[3] ?? null)));
|
|
10977
11232
|
const insensitive = args.length > 4 && optNum([ctx.toScalar(args[4] ?? null)], 0, 0) === 1;
|
|
10978
11233
|
const pad4 = args.length > 5 ? ctx.toScalar(args[5] ?? null) : ERR.NA;
|
|
10979
11234
|
if (colDelims.length === 0 && rowDelims.length === 0) fail(ERR.VALUE);
|
|
10980
|
-
const rows2 = splitText(
|
|
11235
|
+
const rows2 = splitText(text2, rowDelims, insensitive, ignoreEmpty).map(
|
|
10981
11236
|
(line2) => splitText(line2, colDelims, insensitive, ignoreEmpty)
|
|
10982
11237
|
);
|
|
10983
11238
|
const width = rows2.reduce((w, r) => Math.max(w, r.length), 0);
|
|
@@ -11171,10 +11426,10 @@ function createContext(frame) {
|
|
|
11171
11426
|
scope ? { ...frame, scope, root: void 0 } : { ...frame, root: void 0 }
|
|
11172
11427
|
),
|
|
11173
11428
|
callLambda: (fn, args) => invokeLambda(fn, args, frame),
|
|
11174
|
-
parseReference(
|
|
11429
|
+
parseReference(text2) {
|
|
11175
11430
|
let ast;
|
|
11176
11431
|
try {
|
|
11177
|
-
ast = parseFormula(
|
|
11432
|
+
ast = parseFormula(text2.trim());
|
|
11178
11433
|
} catch (e) {
|
|
11179
11434
|
if (e instanceof FormulaError) return void 0;
|
|
11180
11435
|
throw e;
|
|
@@ -11335,7 +11590,7 @@ var REFERENCE_ARGUMENT = /* @__PURE__ */ new Set([
|
|
|
11335
11590
|
"AREAS",
|
|
11336
11591
|
"ISREF"
|
|
11337
11592
|
]);
|
|
11338
|
-
var
|
|
11593
|
+
var push2 = (c, area) => {
|
|
11339
11594
|
(c.dynamic > 0 ? c.dynamicDeps : c.deps).push(area);
|
|
11340
11595
|
};
|
|
11341
11596
|
function spans(areas) {
|
|
@@ -11361,7 +11616,7 @@ function visit(node, c) {
|
|
|
11361
11616
|
if (!sheets) return;
|
|
11362
11617
|
const range2 = specRange(node.ref);
|
|
11363
11618
|
const target2 = node.spill ? { start: range2.start, end: { ...range2.start } } : range2;
|
|
11364
|
-
for (const sheet of sheets)
|
|
11619
|
+
for (const sheet of sheets) push2(c, { sheet, range: target2 });
|
|
11365
11620
|
return;
|
|
11366
11621
|
}
|
|
11367
11622
|
case "name": {
|
|
@@ -11435,7 +11690,7 @@ function visitBinary(node, c) {
|
|
|
11435
11690
|
const list = c.dynamic > 0 ? c.dynamicDeps : c.deps;
|
|
11436
11691
|
const l = list[list.length - 2];
|
|
11437
11692
|
const r = list[list.length - 1];
|
|
11438
|
-
if (l && r && l.sheet === r.sheet)
|
|
11693
|
+
if (l && r && l.sheet === r.sheet) push2(c, spans([l, r])[0]);
|
|
11439
11694
|
continue;
|
|
11440
11695
|
}
|
|
11441
11696
|
const mentioned = [...c.deps.slice(staticStart), ...c.dynamicDeps.slice(dynamicStart)];
|
|
@@ -11451,7 +11706,7 @@ function addStructured(ref, c) {
|
|
|
11451
11706
|
sheet: c.sheet,
|
|
11452
11707
|
row: c.row,
|
|
11453
11708
|
col: c.col});
|
|
11454
|
-
if (value2 instanceof RefValue) for (const area of value2.areas)
|
|
11709
|
+
if (value2 instanceof RefValue) for (const area of value2.areas) push2(c, area);
|
|
11455
11710
|
}
|
|
11456
11711
|
function analyze(ast, host, sheet, row2, col) {
|
|
11457
11712
|
const c = {
|
|
@@ -11475,155 +11730,191 @@ function analyze(ast, host, sheet, row2, col) {
|
|
|
11475
11730
|
};
|
|
11476
11731
|
}
|
|
11477
11732
|
|
|
11478
|
-
// xlsx/formula/
|
|
11479
|
-
var
|
|
11480
|
-
|
|
11481
|
-
|
|
11482
|
-
|
|
11483
|
-
|
|
11484
|
-
|
|
11485
|
-
|
|
11733
|
+
// xlsx/formula/formula-shape.ts
|
|
11734
|
+
var isDigit4 = (code) => code >= 48 && code <= 57;
|
|
11735
|
+
function formulaShape(formula) {
|
|
11736
|
+
const starts = [];
|
|
11737
|
+
const ends = [];
|
|
11738
|
+
let hash = 2166136261;
|
|
11739
|
+
for (let i2 = 0; i2 < formula.length; i2++) {
|
|
11740
|
+
let code = formula.charCodeAt(i2);
|
|
11741
|
+
if (isDigit4(code)) {
|
|
11742
|
+
let j = i2 + 1;
|
|
11743
|
+
while (j < formula.length && isDigit4(formula.charCodeAt(j))) j++;
|
|
11744
|
+
starts.push(i2);
|
|
11745
|
+
ends.push(j);
|
|
11746
|
+
i2 = j - 1;
|
|
11747
|
+
code = 0;
|
|
11748
|
+
}
|
|
11749
|
+
hash = Math.imul(hash ^ code, 16777619);
|
|
11750
|
+
}
|
|
11751
|
+
return { hash: hash >>> 0, starts, ends };
|
|
11486
11752
|
}
|
|
11487
|
-
function
|
|
11488
|
-
let
|
|
11489
|
-
|
|
11490
|
-
return
|
|
11753
|
+
function sameText(a, from, b, at, length) {
|
|
11754
|
+
for (let k = 0; k < length; k++)
|
|
11755
|
+
if (a.charCodeAt(from + k) !== b.charCodeAt(at + k)) return false;
|
|
11756
|
+
return true;
|
|
11491
11757
|
}
|
|
11492
|
-
|
|
11493
|
-
|
|
11494
|
-
|
|
11495
|
-
|
|
11496
|
-
|
|
11497
|
-
|
|
11498
|
-
const
|
|
11499
|
-
|
|
11500
|
-
|
|
11501
|
-
|
|
11502
|
-
|
|
11758
|
+
function sameShape(a, as, b, bs) {
|
|
11759
|
+
const runs = as.starts.length;
|
|
11760
|
+
if (runs !== bs.starts.length) return false;
|
|
11761
|
+
let fromA = 0;
|
|
11762
|
+
let fromB = 0;
|
|
11763
|
+
for (let i2 = 0; i2 <= runs; i2++) {
|
|
11764
|
+
const toA = i2 < runs ? as.starts[i2] : a.length;
|
|
11765
|
+
const toB = i2 < runs ? bs.starts[i2] : b.length;
|
|
11766
|
+
if (toA - fromA !== toB - fromB || !sameText(a, fromA, b, fromB, toA - fromA)) return false;
|
|
11767
|
+
fromA = as.ends[i2] ?? 0;
|
|
11768
|
+
fromB = bs.ends[i2] ?? 0;
|
|
11769
|
+
}
|
|
11770
|
+
return true;
|
|
11771
|
+
}
|
|
11772
|
+
function makeTemplate(formula, shape2) {
|
|
11773
|
+
let tokens;
|
|
11774
|
+
let ast;
|
|
11775
|
+
try {
|
|
11776
|
+
tokens = tokenize(formula);
|
|
11777
|
+
ast = parseTokens(tokens);
|
|
11778
|
+
} catch (e) {
|
|
11779
|
+
if (e instanceof RangeError) return new FormulaError(e.message, -1, "#VALUE!");
|
|
11780
|
+
if (e instanceof FormulaError) return e;
|
|
11781
|
+
throw e;
|
|
11782
|
+
}
|
|
11783
|
+
const { starts } = shape2;
|
|
11784
|
+
const slotted = starts.map(() => false);
|
|
11785
|
+
const refs = /* @__PURE__ */ new Map();
|
|
11786
|
+
let run = 0;
|
|
11787
|
+
for (const token of tokens) {
|
|
11788
|
+
const end = token.start + token.text.length;
|
|
11789
|
+
const first2 = run;
|
|
11790
|
+
while (run < starts.length && starts[run] < end) run++;
|
|
11791
|
+
const ref = token.kind === "ref" ? token.ref : void 0;
|
|
11792
|
+
if (!ref || ref.kind === "cols") continue;
|
|
11793
|
+
const count2 = ref.kind === "cell" ? 1 : 2;
|
|
11794
|
+
if (run - first2 < count2) continue;
|
|
11795
|
+
const at = run - count2;
|
|
11796
|
+
const indexes2 = count2 === 1 ? [at] : [at, at + 1];
|
|
11797
|
+
if (indexes2.some((i2) => formula.charCodeAt(starts[i2]) === 48)) continue;
|
|
11798
|
+
for (const i2 of indexes2) slotted[i2] = true;
|
|
11799
|
+
refs.set(ref, count2 === 1 ? { start: at } : { start: at, end: at + 1 });
|
|
11800
|
+
}
|
|
11801
|
+
return { formula, shape: shape2, ast, slotted, refs };
|
|
11802
|
+
}
|
|
11803
|
+
function rowsFor(t, formula, shape2) {
|
|
11804
|
+
if (!sameShape(t.formula, t.shape, formula, shape2)) return void 0;
|
|
11805
|
+
const rows2 = [];
|
|
11806
|
+
for (let i2 = 0; i2 < shape2.starts.length; i2++) {
|
|
11807
|
+
const start = shape2.starts[i2];
|
|
11808
|
+
const length = shape2.ends[i2] - start;
|
|
11809
|
+
if (!t.slotted[i2]) {
|
|
11810
|
+
const own = t.shape.starts[i2];
|
|
11811
|
+
if (t.shape.ends[i2] - own !== length) return void 0;
|
|
11812
|
+
if (!sameText(t.formula, own, formula, start, length)) return void 0;
|
|
11813
|
+
rows2.push(-1);
|
|
11814
|
+
continue;
|
|
11503
11815
|
}
|
|
11504
|
-
|
|
11505
|
-
|
|
11506
|
-
|
|
11507
|
-
|
|
11508
|
-
|
|
11509
|
-
|
|
11816
|
+
if (length > 7 || formula.charCodeAt(start) === 48) return void 0;
|
|
11817
|
+
let row2 = 0;
|
|
11818
|
+
for (let k = start; k < start + length; k++) row2 = row2 * 10 + formula.charCodeAt(k) - 48;
|
|
11819
|
+
if (row2 < 1 || row2 > MAX_ROW + 1) return void 0;
|
|
11820
|
+
rows2.push(row2 - 1);
|
|
11821
|
+
}
|
|
11822
|
+
return rows2;
|
|
11823
|
+
}
|
|
11824
|
+
function shiftSpec(spec2, slots, rows2) {
|
|
11825
|
+
const startRow = rows2[slots.start];
|
|
11826
|
+
const endRow = slots.end === void 0 ? startRow : rows2[slots.end];
|
|
11827
|
+
if (startRow === spec2.start.row && endRow === spec2.end.row) return spec2;
|
|
11828
|
+
const { start: from, end: to } = spec2;
|
|
11829
|
+
const start = { row: startRow, col: from.col, rowAbs: from.rowAbs, colAbs: from.colAbs };
|
|
11830
|
+
if (slots.end === void 0) return { kind: spec2.kind, start, end: start };
|
|
11831
|
+
const end = { row: endRow, col: to.col, rowAbs: to.rowAbs, colAbs: to.colAbs };
|
|
11832
|
+
return { kind: spec2.kind, start, end };
|
|
11833
|
+
}
|
|
11834
|
+
function copyTree(node, t, rows2) {
|
|
11835
|
+
switch (node.type) {
|
|
11836
|
+
case "ref": {
|
|
11837
|
+
const slots = node.ref ? t.refs.get(node.ref) : void 0;
|
|
11838
|
+
if (!slots || !node.ref) return node;
|
|
11839
|
+
const ref = shiftSpec(node.ref, slots, rows2);
|
|
11840
|
+
if (ref === node.ref) return node;
|
|
11841
|
+
const copy2 = { type: "ref" };
|
|
11842
|
+
if (node.prefix) copy2.prefix = node.prefix;
|
|
11843
|
+
copy2.ref = ref;
|
|
11844
|
+
if (node.spill) copy2.spill = true;
|
|
11845
|
+
return copy2;
|
|
11510
11846
|
}
|
|
11511
|
-
|
|
11512
|
-
|
|
11513
|
-
|
|
11514
|
-
|
|
11515
|
-
|
|
11516
|
-
return;
|
|
11847
|
+
case "unary":
|
|
11848
|
+
case "percent": {
|
|
11849
|
+
const operand4 = copyTree(node.operand, t, rows2);
|
|
11850
|
+
if (operand4 === node.operand) return node;
|
|
11851
|
+
return node.type === "unary" ? { type: "unary", op: node.op, operand: operand4 } : { type: "percent", operand: operand4 };
|
|
11517
11852
|
}
|
|
11518
|
-
|
|
11519
|
-
|
|
11520
|
-
|
|
11521
|
-
if (
|
|
11522
|
-
|
|
11853
|
+
case "binary": {
|
|
11854
|
+
const left2 = copyTree(node.left, t, rows2);
|
|
11855
|
+
const right2 = copyTree(node.right, t, rows2);
|
|
11856
|
+
if (left2 === node.left && right2 === node.right) return node;
|
|
11857
|
+
return { type: "binary", op: node.op, left: left2, right: right2 };
|
|
11858
|
+
}
|
|
11859
|
+
case "call": {
|
|
11860
|
+
const args = copyAll(node.args, t, rows2);
|
|
11861
|
+
if (args === node.args) return node;
|
|
11862
|
+
return { type: "call", name: node.name, rawName: node.rawName, args };
|
|
11863
|
+
}
|
|
11864
|
+
case "invoke": {
|
|
11865
|
+
const callee = copyTree(node.callee, t, rows2);
|
|
11866
|
+
const args = copyAll(node.args, t, rows2);
|
|
11867
|
+
if (callee === node.callee && args === node.args) return node;
|
|
11868
|
+
return { type: "invoke", callee, args };
|
|
11523
11869
|
}
|
|
11870
|
+
default:
|
|
11871
|
+
return node;
|
|
11524
11872
|
}
|
|
11525
|
-
|
|
11526
|
-
|
|
11527
|
-
|
|
11528
|
-
|
|
11529
|
-
|
|
11873
|
+
}
|
|
11874
|
+
function copyAll(nodes, t, rows2) {
|
|
11875
|
+
let out;
|
|
11876
|
+
for (let i2 = 0; i2 < nodes.length; i2++) {
|
|
11877
|
+
const node = nodes[i2];
|
|
11878
|
+
const copy2 = copyTree(node, t, rows2);
|
|
11879
|
+
if (copy2 !== node && !out) out = nodes.slice(0, i2);
|
|
11880
|
+
out?.push(copy2);
|
|
11881
|
+
}
|
|
11882
|
+
return out ?? nodes;
|
|
11883
|
+
}
|
|
11884
|
+
function fromTemplate(t, formula, shape2) {
|
|
11885
|
+
const rows2 = rowsFor(t, formula, shape2);
|
|
11886
|
+
return rows2 ? copyTree(t.ast, t, rows2) : void 0;
|
|
11887
|
+
}
|
|
11888
|
+
|
|
11889
|
+
// xlsx/formula/parse-cache.ts
|
|
11890
|
+
var MAX_TEMPLATE_LENGTH = 2048;
|
|
11891
|
+
var MAX_ENTRIES = 1e5;
|
|
11892
|
+
var MAX_TEMPLATES = 1e4;
|
|
11893
|
+
var NO_RUNS = { hash: 0, starts: [], ends: [] };
|
|
11894
|
+
var treeOf = (made) => "ast" in made ? made.ast : made;
|
|
11895
|
+
var ParseCache = class {
|
|
11896
|
+
byText = /* @__PURE__ */ new Map();
|
|
11897
|
+
templates = /* @__PURE__ */ new Map();
|
|
11898
|
+
parse(formula) {
|
|
11899
|
+
let ast = this.byText.get(formula);
|
|
11900
|
+
if (ast) return ast;
|
|
11901
|
+
ast = this.parseNew(formula);
|
|
11902
|
+
if (this.byText.size > MAX_ENTRIES) this.byText.clear();
|
|
11903
|
+
this.byText.set(formula, ast);
|
|
11904
|
+
return ast;
|
|
11530
11905
|
}
|
|
11531
|
-
|
|
11532
|
-
|
|
11533
|
-
const
|
|
11534
|
-
|
|
11535
|
-
|
|
11536
|
-
|
|
11537
|
-
|
|
11538
|
-
|
|
11539
|
-
|
|
11540
|
-
|
|
11541
|
-
if (size <= 4096) {
|
|
11542
|
-
for (let r = start.row; r <= end.row; r++) {
|
|
11543
|
-
for (let c = start.col; c <= end.col; c++) {
|
|
11544
|
-
const list = cells.get(cellKey(r, c));
|
|
11545
|
-
if (list) for (const node of list) out.add(node);
|
|
11546
|
-
}
|
|
11547
|
-
}
|
|
11548
|
-
} else {
|
|
11549
|
-
for (const [key, list] of cells) {
|
|
11550
|
-
const { row: row2, col } = keyToAddress(key);
|
|
11551
|
-
if (row2 >= start.row && row2 <= end.row && col >= start.col && col <= end.col)
|
|
11552
|
-
for (const node of list) out.add(node);
|
|
11553
|
-
}
|
|
11554
|
-
}
|
|
11555
|
-
}
|
|
11556
|
-
const columns = (map, visit2) => {
|
|
11557
|
-
if (!map) return;
|
|
11558
|
-
if (end.col - start.col + 1 <= map.size) {
|
|
11559
|
-
for (let c = start.col; c <= end.col; c++) if (map.has(c)) visit2(c);
|
|
11560
|
-
} else for (const c of map.keys()) if (c >= start.col && c <= end.col) visit2(c);
|
|
11561
|
-
};
|
|
11562
|
-
const chunked = this.chunked.get(sheet);
|
|
11563
|
-
const first2 = start.row >> CHUNK_SHIFT;
|
|
11564
|
-
const last = end.row >> CHUNK_SHIFT;
|
|
11565
|
-
columns(chunked, (c) => {
|
|
11566
|
-
const chunks = chunked?.get(c);
|
|
11567
|
-
if (last - first2 + 1 <= chunks.size) {
|
|
11568
|
-
for (let k = first2; k <= last; k++) check3(chunks.get(k));
|
|
11569
|
-
} else for (const [k, list] of chunks) if (k >= first2 && k <= last) check3(list);
|
|
11570
|
-
});
|
|
11571
|
-
const tall = this.tall.get(sheet);
|
|
11572
|
-
columns(tall, (c) => check3(tall?.get(c)));
|
|
11573
|
-
check3(this.wide.get(sheet));
|
|
11574
|
-
}
|
|
11575
|
-
};
|
|
11576
|
-
|
|
11577
|
-
// xlsx/formula/graph-index.ts
|
|
11578
|
-
var ColumnIndex = class {
|
|
11579
|
-
sheets = /* @__PURE__ */ new Map();
|
|
11580
|
-
constructor(nodes) {
|
|
11581
|
-
for (const node of nodes) {
|
|
11582
|
-
let cols = this.sheets.get(node.sheet);
|
|
11583
|
-
if (!cols) this.sheets.set(node.sheet, cols = /* @__PURE__ */ new Map());
|
|
11584
|
-
let list = cols.get(node.col);
|
|
11585
|
-
if (!list) cols.set(node.col, list = []);
|
|
11586
|
-
list.push(node);
|
|
11587
|
-
}
|
|
11588
|
-
for (const cols of this.sheets.values())
|
|
11589
|
-
for (const list of cols.values()) list.sort((a, b) => a.row - b.row);
|
|
11590
|
-
}
|
|
11591
|
-
nodesIn(area, out) {
|
|
11592
|
-
const cols = this.sheets.get(area.sheet);
|
|
11593
|
-
if (!cols) return;
|
|
11594
|
-
const { start, end } = area.range;
|
|
11595
|
-
const width = end.col - start.col + 1;
|
|
11596
|
-
const scan2 = (list) => {
|
|
11597
|
-
let lo = 0;
|
|
11598
|
-
let hi = list.length;
|
|
11599
|
-
while (lo < hi) {
|
|
11600
|
-
const mid = lo + hi >> 1;
|
|
11601
|
-
if (list[mid].row < start.row) lo = mid + 1;
|
|
11602
|
-
else hi = mid;
|
|
11603
|
-
}
|
|
11604
|
-
for (let i2 = lo; i2 < list.length; i2++) {
|
|
11605
|
-
const node = list[i2];
|
|
11606
|
-
if (node.row > end.row) break;
|
|
11607
|
-
out.push(node);
|
|
11608
|
-
}
|
|
11609
|
-
};
|
|
11610
|
-
if (width <= cols.size) {
|
|
11611
|
-
for (let c = start.col; c <= end.col; c++) {
|
|
11612
|
-
const list = cols.get(c);
|
|
11613
|
-
if (list) scan2(list);
|
|
11614
|
-
}
|
|
11615
|
-
} else {
|
|
11616
|
-
for (const [c, list] of cols) if (c >= start.col && c <= end.col) scan2(list);
|
|
11617
|
-
}
|
|
11618
|
-
}
|
|
11619
|
-
};
|
|
11620
|
-
var ReverseIndex = class extends AreaIndex {
|
|
11621
|
-
constructor(nodes) {
|
|
11622
|
-
super();
|
|
11623
|
-
for (const node of nodes) {
|
|
11624
|
-
for (const dep of node.deps) this.add(dep, node);
|
|
11625
|
-
for (const dep of node.dynamicDeps) this.add(dep, node);
|
|
11906
|
+
parseNew(formula) {
|
|
11907
|
+
if (formula.length > MAX_TEMPLATE_LENGTH) return treeOf(makeTemplate(formula, NO_RUNS));
|
|
11908
|
+
const shape2 = formulaShape(formula);
|
|
11909
|
+
const template = this.templates.get(shape2.hash);
|
|
11910
|
+
const reused = template && fromTemplate(template, formula, shape2);
|
|
11911
|
+
if (reused) return reused;
|
|
11912
|
+
const made = makeTemplate(formula, shape2);
|
|
11913
|
+
if (!template && "ast" in made) {
|
|
11914
|
+
if (this.templates.size > MAX_TEMPLATES) this.templates.clear();
|
|
11915
|
+
this.templates.set(shape2.hash, made);
|
|
11626
11916
|
}
|
|
11917
|
+
return treeOf(made);
|
|
11627
11918
|
}
|
|
11628
11919
|
};
|
|
11629
11920
|
|
|
@@ -11763,7 +12054,7 @@ var EngineHost = class {
|
|
|
11763
12054
|
options;
|
|
11764
12055
|
nodes = /* @__PURE__ */ new Map();
|
|
11765
12056
|
footprints = /* @__PURE__ */ new Set();
|
|
11766
|
-
|
|
12057
|
+
parsed = new ParseCache();
|
|
11767
12058
|
boundsCache = /* @__PURE__ */ new Map();
|
|
11768
12059
|
inProgress = /* @__PURE__ */ new Set();
|
|
11769
12060
|
cycles = /* @__PURE__ */ new Set();
|
|
@@ -11787,6 +12078,8 @@ var EngineHost = class {
|
|
|
11787
12078
|
evaluations = 0;
|
|
11788
12079
|
built = false;
|
|
11789
12080
|
needsFull = false;
|
|
12081
|
+
/** No recalculation has run since the workbook was opened: stored values may stand. */
|
|
12082
|
+
fresh = true;
|
|
11790
12083
|
// ---- EvalHost ----
|
|
11791
12084
|
readCell(sheet, row2, col) {
|
|
11792
12085
|
const cell = this.workbook.sheets[sheet]?.rows.get(row2)?.get(col);
|
|
@@ -11875,19 +12168,7 @@ var EngineHost = class {
|
|
|
11875
12168
|
return this.workbook.sheets[sheet]?.rows.get(row2)?.get(col)?.formula;
|
|
11876
12169
|
}
|
|
11877
12170
|
parse(formula) {
|
|
11878
|
-
|
|
11879
|
-
if (!ast) {
|
|
11880
|
-
try {
|
|
11881
|
-
ast = parseFormula(formula);
|
|
11882
|
-
} catch (e) {
|
|
11883
|
-
if (e instanceof RangeError) ast = new FormulaError(e.message, -1, "#VALUE!");
|
|
11884
|
-
else if (!(e instanceof FormulaError)) throw e;
|
|
11885
|
-
else ast = e;
|
|
11886
|
-
}
|
|
11887
|
-
if (this.astCache.size > 1e5) this.astCache.clear();
|
|
11888
|
-
this.astCache.set(formula, ast);
|
|
11889
|
-
}
|
|
11890
|
-
return ast;
|
|
12171
|
+
return this.parsed.parse(formula);
|
|
11891
12172
|
}
|
|
11892
12173
|
now() {
|
|
11893
12174
|
return this.options.now ? this.options.now() : /* @__PURE__ */ new Date();
|
|
@@ -11896,20 +12177,6 @@ var EngineHost = class {
|
|
|
11896
12177
|
return this.options.random ? this.options.random() : Math.random();
|
|
11897
12178
|
}
|
|
11898
12179
|
// ---- graph ----
|
|
11899
|
-
build() {
|
|
11900
|
-
this.nodes.clear();
|
|
11901
|
-
this.footprints.clear();
|
|
11902
|
-
this.footprintIndex = void 0;
|
|
11903
|
-
this.workbook.sheets.forEach((sheet, s) => {
|
|
11904
|
-
for (const [row2, cells] of sheet.rows) {
|
|
11905
|
-
for (const [col, cell] of cells) {
|
|
11906
|
-
if (cell.formula) this.createNode(s, row2, col, cell, true);
|
|
11907
|
-
}
|
|
11908
|
-
}
|
|
11909
|
-
});
|
|
11910
|
-
this.built = true;
|
|
11911
|
-
this.graphChanged();
|
|
11912
|
-
}
|
|
11913
12180
|
createNode(sheet, row2, col, cell, initial) {
|
|
11914
12181
|
const formula = cell.formula ?? "";
|
|
11915
12182
|
const parsed = this.parse(formula);
|
|
@@ -11938,6 +12205,14 @@ var EngineHost = class {
|
|
|
11938
12205
|
map.set(cellKey(row2, col), node);
|
|
11939
12206
|
return node;
|
|
11940
12207
|
}
|
|
12208
|
+
/** Parses a node's text again after a structural edit rewrote it (see `FormulaNode.stale`). */
|
|
12209
|
+
refreshAst(node) {
|
|
12210
|
+
const parsed = this.parse(node.formula);
|
|
12211
|
+
delete node.stale;
|
|
12212
|
+
delete node.parseError;
|
|
12213
|
+
node.ast = parsed instanceof FormulaError ? void 0 : parsed;
|
|
12214
|
+
if (parsed instanceof FormulaError && parsed.code) node.parseError = err(parsed.code);
|
|
12215
|
+
}
|
|
11941
12216
|
removeNode(node, changed) {
|
|
11942
12217
|
const sheet = this.workbook.sheets[node.sheet];
|
|
11943
12218
|
if (node.spill && sheet) {
|
|
@@ -12368,6 +12643,7 @@ var EngineCore = class extends EngineHost {
|
|
|
12368
12643
|
return { host: this, sheet, row: row2, col, scope: void 0, depth: 0, root, legacy };
|
|
12369
12644
|
}
|
|
12370
12645
|
evaluateFormula(node) {
|
|
12646
|
+
if (node.stale) this.refreshAst(node);
|
|
12371
12647
|
if (!node.ast) return node.parseError ?? ERR.NAME;
|
|
12372
12648
|
const ast = node.ast;
|
|
12373
12649
|
const frame = this.frameFor(node.sheet, node.row, node.col, ast, node.legacy);
|
|
@@ -12385,22 +12661,371 @@ var EngineCore = class extends EngineHost {
|
|
|
12385
12661
|
}
|
|
12386
12662
|
};
|
|
12387
12663
|
|
|
12664
|
+
// xlsx/formula/shift-graph.ts
|
|
12665
|
+
var POSITIONAL = /* @__PURE__ */ new Set(["ROW", "COLUMN"]);
|
|
12666
|
+
var DESCRIPTIVE = /* @__PURE__ */ new Set(["FORMULATEXT", "CELL", "SHEET"]);
|
|
12667
|
+
var traitsCache = /* @__PURE__ */ new WeakMap();
|
|
12668
|
+
function astTraits(ast) {
|
|
12669
|
+
const cached = traitsCache.get(ast);
|
|
12670
|
+
if (cached) return cached;
|
|
12671
|
+
const sheets = /* @__PURE__ */ new Set();
|
|
12672
|
+
const traits = { complex: false, opaque: false, positional: false, descriptive: false, sheets };
|
|
12673
|
+
const stack2 = [ast];
|
|
12674
|
+
while (stack2.length) {
|
|
12675
|
+
const node = stack2.pop();
|
|
12676
|
+
switch (node.type) {
|
|
12677
|
+
case "ref":
|
|
12678
|
+
if (node.prefix) {
|
|
12679
|
+
sheets.add(node.prefix.sheet.toLowerCase());
|
|
12680
|
+
if (node.prefix.sheet2 !== void 0) {
|
|
12681
|
+
sheets.add(node.prefix.sheet2.toLowerCase());
|
|
12682
|
+
traits.complex = true;
|
|
12683
|
+
}
|
|
12684
|
+
}
|
|
12685
|
+
break;
|
|
12686
|
+
case "name":
|
|
12687
|
+
if (node.prefix) sheets.add(node.prefix.sheet.toLowerCase());
|
|
12688
|
+
traits.complex = true;
|
|
12689
|
+
break;
|
|
12690
|
+
case "structured":
|
|
12691
|
+
traits.complex = true;
|
|
12692
|
+
break;
|
|
12693
|
+
case "unary":
|
|
12694
|
+
case "percent":
|
|
12695
|
+
stack2.push(node.operand);
|
|
12696
|
+
break;
|
|
12697
|
+
case "binary":
|
|
12698
|
+
stack2.push(node.left, node.right);
|
|
12699
|
+
break;
|
|
12700
|
+
case "call":
|
|
12701
|
+
if (POSITIONAL.has(node.name)) traits.positional = true;
|
|
12702
|
+
if (DESCRIPTIVE.has(node.name)) traits.descriptive = true;
|
|
12703
|
+
if (!getFunction(node.name)) traits.complex = traits.opaque = true;
|
|
12704
|
+
stack2.push(...node.args);
|
|
12705
|
+
break;
|
|
12706
|
+
case "invoke":
|
|
12707
|
+
stack2.push(node.callee, ...node.args);
|
|
12708
|
+
break;
|
|
12709
|
+
}
|
|
12710
|
+
}
|
|
12711
|
+
traitsCache.set(ast, traits);
|
|
12712
|
+
return traits;
|
|
12713
|
+
}
|
|
12714
|
+
function intervalDelta(a, b, shift2) {
|
|
12715
|
+
const { at, count: count2 } = shift2;
|
|
12716
|
+
if (count2 > 0) {
|
|
12717
|
+
if (b < at) return 0;
|
|
12718
|
+
if (a < at) return void 0;
|
|
12719
|
+
return b + count2 > (shift2.axis === "row" ? MAX_ROW : MAX_COL) ? void 0 : count2;
|
|
12720
|
+
}
|
|
12721
|
+
const last = at - count2 - 1;
|
|
12722
|
+
if (b < at) return 0;
|
|
12723
|
+
if (a > last) return count2;
|
|
12724
|
+
return void 0;
|
|
12725
|
+
}
|
|
12726
|
+
function areaDelta(area, sheet, shift2) {
|
|
12727
|
+
if (area.sheet !== sheet) return 0;
|
|
12728
|
+
const { start, end } = area.range;
|
|
12729
|
+
return shift2.axis === "row" ? intervalDelta(start.row, end.row, shift2) : intervalDelta(start.col, end.col, shift2);
|
|
12730
|
+
}
|
|
12731
|
+
function movedRange(range2, axis, delta) {
|
|
12732
|
+
if (delta === 0) return range2;
|
|
12733
|
+
return axis === "row" ? {
|
|
12734
|
+
start: { row: range2.start.row + delta, col: range2.start.col },
|
|
12735
|
+
end: { row: range2.end.row + delta, col: range2.end.col }
|
|
12736
|
+
} : {
|
|
12737
|
+
start: { row: range2.start.row, col: range2.start.col + delta },
|
|
12738
|
+
end: { row: range2.end.row, col: range2.end.col + delta }
|
|
12739
|
+
};
|
|
12740
|
+
}
|
|
12741
|
+
function reachesEdit(areas, sheet, shift2) {
|
|
12742
|
+
for (const area of areas) {
|
|
12743
|
+
if (area.sheet !== sheet) continue;
|
|
12744
|
+
if ((shift2.axis === "row" ? area.range.end.row : area.range.end.col) >= shift2.at) return true;
|
|
12745
|
+
}
|
|
12746
|
+
return false;
|
|
12747
|
+
}
|
|
12748
|
+
function intersectionMoves(area, delta, pos, nodeDelta, axis) {
|
|
12749
|
+
if (delta === nodeDelta) return false;
|
|
12750
|
+
const { start, end } = area.range;
|
|
12751
|
+
const a = axis === "row" ? start.row : start.col;
|
|
12752
|
+
const b = axis === "row" ? end.row : end.col;
|
|
12753
|
+
if (a === b) return false;
|
|
12754
|
+
return pos >= a && pos <= b || pos + nodeDelta >= a + delta && pos + nodeDelta <= b + delta;
|
|
12755
|
+
}
|
|
12756
|
+
|
|
12757
|
+
// xlsx/formula/engine-structure.ts
|
|
12758
|
+
var sameAreas = (a, b) => a.length === b.length && a.every((x, i2) => {
|
|
12759
|
+
const y = b[i2];
|
|
12760
|
+
return x.sheet === y.sheet && sameRange(x.range, y.range);
|
|
12761
|
+
});
|
|
12762
|
+
var EngineStructure = class extends EngineCore {
|
|
12763
|
+
/** Formulas a structural edit left to recalculate (with their dependents) on the next pass. */
|
|
12764
|
+
structuralSeeds = /* @__PURE__ */ new Set();
|
|
12765
|
+
/** Whether the graph describes the workbook as it was before the edit just reported. */
|
|
12766
|
+
graphReady() {
|
|
12767
|
+
return this.built && !this.needsFull;
|
|
12768
|
+
}
|
|
12769
|
+
/** Parses a node's current text again and recomputes its precedents. */
|
|
12770
|
+
reanalyze(node) {
|
|
12771
|
+
const parsed = this.parse(node.formula);
|
|
12772
|
+
delete node.stale;
|
|
12773
|
+
delete node.parseError;
|
|
12774
|
+
if (parsed instanceof FormulaError) {
|
|
12775
|
+
node.ast = void 0;
|
|
12776
|
+
if (parsed.code) node.parseError = err(parsed.code);
|
|
12777
|
+
node.deps = [];
|
|
12778
|
+
node.dynamicDeps = [];
|
|
12779
|
+
return;
|
|
12780
|
+
}
|
|
12781
|
+
node.ast = parsed;
|
|
12782
|
+
const found = analyze(parsed, this, node.sheet, node.row, node.col);
|
|
12783
|
+
node.deps = found.deps;
|
|
12784
|
+
node.dynamicDeps = found.dynamicDeps;
|
|
12785
|
+
node.volatile = found.volatile;
|
|
12786
|
+
node.unsupported = found.unsupported;
|
|
12787
|
+
}
|
|
12788
|
+
/**
|
|
12789
|
+
* Moves the graph for rows or columns inserted or deleted on `sheet`, after the workbook was
|
|
12790
|
+
* changed (cells moved, formulas rewritten). Spills on the sheet, array formulas the edit cuts
|
|
12791
|
+
* and anything unexpected fall back to a rebuild on the next recalculation.
|
|
12792
|
+
*/
|
|
12793
|
+
shiftCells(sheet, shift2) {
|
|
12794
|
+
if (!this.graphReady() || !this.shiftable(sheet, shift2)) {
|
|
12795
|
+
this.invalidate();
|
|
12796
|
+
return;
|
|
12797
|
+
}
|
|
12798
|
+
const ws = this.workbook.sheets[sheet];
|
|
12799
|
+
const own = this.nodes.get(sheet);
|
|
12800
|
+
if (!ws) return;
|
|
12801
|
+
const moved = /* @__PURE__ */ new Map();
|
|
12802
|
+
if (own) {
|
|
12803
|
+
const next = /* @__PURE__ */ new Map();
|
|
12804
|
+
for (const node of own.values()) {
|
|
12805
|
+
const pos = shift2.axis === "row" ? node.row : node.col;
|
|
12806
|
+
const delta = intervalDelta(pos, pos, shift2);
|
|
12807
|
+
if (delta === void 0) {
|
|
12808
|
+
this.dropNode(node);
|
|
12809
|
+
continue;
|
|
12810
|
+
}
|
|
12811
|
+
if (delta !== 0) {
|
|
12812
|
+
moved.set(node, delta);
|
|
12813
|
+
if (shift2.axis === "row") node.row += delta;
|
|
12814
|
+
else node.col += delta;
|
|
12815
|
+
}
|
|
12816
|
+
next.set(cellKey(node.row, node.col), node);
|
|
12817
|
+
}
|
|
12818
|
+
this.nodes.set(sheet, next);
|
|
12819
|
+
}
|
|
12820
|
+
for (const map of this.nodes.values())
|
|
12821
|
+
for (const node of map.values()) {
|
|
12822
|
+
if (!this.shiftNode(node, sheet, shift2, moved.get(node) ?? 0)) {
|
|
12823
|
+
this.invalidate();
|
|
12824
|
+
return;
|
|
12825
|
+
}
|
|
12826
|
+
}
|
|
12827
|
+
this.boundsCache.clear();
|
|
12828
|
+
this.graphChanged();
|
|
12829
|
+
}
|
|
12830
|
+
/** No spill or stale spilled value on the sheet, and no array formula the edit cuts. */
|
|
12831
|
+
shiftable(sheet, shift2) {
|
|
12832
|
+
for (const node of this.footprints) {
|
|
12833
|
+
if (node.sheet !== sheet) continue;
|
|
12834
|
+
if (node.spill || node.blockedSpill) return false;
|
|
12835
|
+
if (node.arrayRange && areaDelta({ sheet, range: node.arrayRange }, sheet, shift2) === void 0)
|
|
12836
|
+
return false;
|
|
12837
|
+
}
|
|
12838
|
+
const ws = this.workbook.sheets[sheet];
|
|
12839
|
+
let spilled = false;
|
|
12840
|
+
ws?.rows.forEach((cells) => {
|
|
12841
|
+
if (!spilled) cells.forEach((cell) => spilled ||= isSpilledCell(cell));
|
|
12842
|
+
});
|
|
12843
|
+
return !spilled;
|
|
12844
|
+
}
|
|
12845
|
+
dropNode(node) {
|
|
12846
|
+
this.structuralSeeds.delete(node);
|
|
12847
|
+
this.cycles.delete(node);
|
|
12848
|
+
this.footprints.delete(node);
|
|
12849
|
+
}
|
|
12850
|
+
/** Updates one formula for the edit; false when the graph cannot follow it. */
|
|
12851
|
+
shiftNode(node, sheet, shift2, nodeDelta) {
|
|
12852
|
+
const cell = this.workbook.sheets[node.sheet]?.rows.get(node.row)?.get(node.col);
|
|
12853
|
+
if (cell?.formula === void 0) return false;
|
|
12854
|
+
if (node.arrayRange) {
|
|
12855
|
+
const delta = areaDelta({ sheet: node.sheet, range: node.arrayRange }, sheet, shift2);
|
|
12856
|
+
if (delta === void 0) return false;
|
|
12857
|
+
node.arrayRange = movedRange(node.arrayRange, shift2.axis, delta);
|
|
12858
|
+
if (!cell.arrayRange || !sameRange(node.arrayRange, normalizeRange(cell.arrayRange)))
|
|
12859
|
+
return false;
|
|
12860
|
+
}
|
|
12861
|
+
const changed = cell.formula !== node.formula;
|
|
12862
|
+
const traits = node.ast && astTraits(node.ast);
|
|
12863
|
+
const reached = reachesEdit(node.deps, sheet, shift2) || reachesEdit(node.dynamicDeps, sheet, shift2);
|
|
12864
|
+
if (!changed && !reached && nodeDelta === 0 && !traits?.descriptive && !traits?.opaque)
|
|
12865
|
+
return true;
|
|
12866
|
+
if (traits?.complex) {
|
|
12867
|
+
node.formula = cell.formula;
|
|
12868
|
+
this.reanalyze(node);
|
|
12869
|
+
this.structuralSeeds.add(node);
|
|
12870
|
+
return true;
|
|
12871
|
+
}
|
|
12872
|
+
const pos = shift2.axis === "row" ? node.row - nodeDelta : node.col - nodeDelta;
|
|
12873
|
+
const moves = { seed: !!traits?.descriptive, moved: false, cut: false };
|
|
12874
|
+
const deps = this.moveAreas(node.deps, sheet, shift2, pos, nodeDelta, moves);
|
|
12875
|
+
const dynamicDeps = this.moveAreas(node.dynamicDeps, sheet, shift2, pos, nodeDelta, moves);
|
|
12876
|
+
const { cut, moved: anyMoved } = moves;
|
|
12877
|
+
let seed = moves.seed;
|
|
12878
|
+
if (cut || changed !== anyMoved) {
|
|
12879
|
+
node.formula = cell.formula;
|
|
12880
|
+
this.reanalyze(node);
|
|
12881
|
+
this.structuralSeeds.add(node);
|
|
12882
|
+
return true;
|
|
12883
|
+
}
|
|
12884
|
+
if (traits?.positional && (anyMoved || nodeDelta !== 0)) seed = true;
|
|
12885
|
+
node.deps = deps;
|
|
12886
|
+
node.dynamicDeps = dynamicDeps;
|
|
12887
|
+
if (changed) {
|
|
12888
|
+
node.formula = cell.formula;
|
|
12889
|
+
node.stale = true;
|
|
12890
|
+
}
|
|
12891
|
+
if (seed) this.structuralSeeds.add(node);
|
|
12892
|
+
return true;
|
|
12893
|
+
}
|
|
12894
|
+
/**
|
|
12895
|
+
* Areas moved for the edit (the same list when none moves). Records in `moves` whether one
|
|
12896
|
+
* moved, one was cut (deleted, widened, pushed off the grid) and whether implicit intersection
|
|
12897
|
+
* with one can now pick another cell.
|
|
12898
|
+
*/
|
|
12899
|
+
moveAreas(list, sheet, shift2, pos, nodeDelta, moves) {
|
|
12900
|
+
let out;
|
|
12901
|
+
for (let i2 = 0; i2 < list.length; i2++) {
|
|
12902
|
+
const area = list[i2];
|
|
12903
|
+
const delta = areaDelta(area, sheet, shift2);
|
|
12904
|
+
if (delta === void 0) {
|
|
12905
|
+
moves.cut = true;
|
|
12906
|
+
continue;
|
|
12907
|
+
}
|
|
12908
|
+
if (intersectionMoves(area, delta, pos, nodeDelta, shift2.axis)) moves.seed = true;
|
|
12909
|
+
if (delta === 0) continue;
|
|
12910
|
+
moves.moved = true;
|
|
12911
|
+
out ??= list.slice();
|
|
12912
|
+
out[i2] = { sheet: area.sheet, range: movedRange(area.range, shift2.axis, delta) };
|
|
12913
|
+
}
|
|
12914
|
+
return out ?? list;
|
|
12915
|
+
}
|
|
12916
|
+
/**
|
|
12917
|
+
* Follows a sheet rename (`from` to `to`, formulas already rewritten): precedents are kept by
|
|
12918
|
+
* sheet index, so only rewritten formulas need their text parsed again, and only formulas that
|
|
12919
|
+
* name the new sheet without having been rewritten (previously unresolved), describe sheets
|
|
12920
|
+
* (CELL, SHEET, FORMULATEXT) or read defined names whose areas changed are recalculated.
|
|
12921
|
+
*/
|
|
12922
|
+
renameSheet(from, to) {
|
|
12923
|
+
if (!this.graphReady()) {
|
|
12924
|
+
this.invalidate();
|
|
12925
|
+
return;
|
|
12926
|
+
}
|
|
12927
|
+
const target2 = to.toLowerCase();
|
|
12928
|
+
let depsChanged = false;
|
|
12929
|
+
for (const map of this.nodes.values())
|
|
12930
|
+
for (const node of map.values()) {
|
|
12931
|
+
const cell = this.workbook.sheets[node.sheet]?.rows.get(node.row)?.get(node.col);
|
|
12932
|
+
if (cell?.formula === void 0) {
|
|
12933
|
+
this.invalidate();
|
|
12934
|
+
return;
|
|
12935
|
+
}
|
|
12936
|
+
const changed = cell.formula !== node.formula;
|
|
12937
|
+
const traits = node.ast && astTraits(node.ast);
|
|
12938
|
+
node.formula = cell.formula;
|
|
12939
|
+
if (traits?.complex || !changed && traits?.sheets.has(target2)) {
|
|
12940
|
+
const deps = node.deps;
|
|
12941
|
+
const dynamicDeps = node.dynamicDeps;
|
|
12942
|
+
this.reanalyze(node);
|
|
12943
|
+
const same4 = sameAreas(deps, node.deps) && sameAreas(dynamicDeps, node.dynamicDeps);
|
|
12944
|
+
if (!same4) depsChanged = true;
|
|
12945
|
+
if (!same4 || !traits?.complex) this.structuralSeeds.add(node);
|
|
12946
|
+
} else if (changed) node.stale = true;
|
|
12947
|
+
if (traits?.descriptive || traits?.opaque) this.structuralSeeds.add(node);
|
|
12948
|
+
}
|
|
12949
|
+
if (depsChanged) this.graphChanged();
|
|
12950
|
+
}
|
|
12951
|
+
/** Takes the formulas queued by structural edits. */
|
|
12952
|
+
takeStructuralSeeds(into) {
|
|
12953
|
+
for (const node of this.structuralSeeds)
|
|
12954
|
+
if (this.nodes.get(node.sheet)?.get(cellKey(node.row, node.col)) === node) into.add(node);
|
|
12955
|
+
this.structuralSeeds.clear();
|
|
12956
|
+
}
|
|
12957
|
+
};
|
|
12958
|
+
|
|
12388
12959
|
// xlsx/formula/engine.ts
|
|
12389
|
-
var Engine = class extends
|
|
12960
|
+
var Engine = class extends EngineStructure {
|
|
12961
|
+
preparation;
|
|
12962
|
+
/** The prepared formulas the first recalculation checks (see `trustsStoredValues`). */
|
|
12963
|
+
prepared;
|
|
12964
|
+
// ---- the graph ----
|
|
12965
|
+
prepare(timeRemaining) {
|
|
12966
|
+
if (this.built || this.needsFull) return true;
|
|
12967
|
+
this.preparation ??= this.startPreparation();
|
|
12968
|
+
if (!this.preparation.run(timeRemaining)) return false;
|
|
12969
|
+
this.finishPreparation(this.preparation);
|
|
12970
|
+
return true;
|
|
12971
|
+
}
|
|
12972
|
+
discardPreparation() {
|
|
12973
|
+
if (!this.fresh || this.needsFull) return;
|
|
12974
|
+
this.preparation = void 0;
|
|
12975
|
+
this.prepared = void 0;
|
|
12976
|
+
this.structuralSeeds.clear();
|
|
12977
|
+
this.nodes.clear();
|
|
12978
|
+
this.footprints.clear();
|
|
12979
|
+
this.graphChanged();
|
|
12980
|
+
this.built = false;
|
|
12981
|
+
}
|
|
12982
|
+
/** Completes the graph, continuing a preparation that is under way. */
|
|
12983
|
+
build() {
|
|
12984
|
+
const preparation = this.preparation ?? this.startPreparation();
|
|
12985
|
+
preparation.run();
|
|
12986
|
+
this.finishPreparation(preparation);
|
|
12987
|
+
}
|
|
12988
|
+
startPreparation() {
|
|
12989
|
+
this.nodes.clear();
|
|
12990
|
+
this.footprints.clear();
|
|
12991
|
+
this.footprintIndex = void 0;
|
|
12992
|
+
this.prepared = void 0;
|
|
12993
|
+
return new GraphPreparation(
|
|
12994
|
+
this.workbook,
|
|
12995
|
+
(s, row2, col, cell) => this.createNode(s, row2, col, cell, true)
|
|
12996
|
+
);
|
|
12997
|
+
}
|
|
12998
|
+
finishPreparation(preparation) {
|
|
12999
|
+
this.preparation = void 0;
|
|
13000
|
+
this.built = true;
|
|
13001
|
+
this.graphChanged();
|
|
13002
|
+
this.reverseIndex = preparation.reverse;
|
|
13003
|
+
this.prepared = preparation.formulas;
|
|
13004
|
+
}
|
|
12390
13005
|
// ---- recalculation ----
|
|
12391
13006
|
recalculateAll() {
|
|
13007
|
+
this.fresh = false;
|
|
13008
|
+
this.prepared = void 0;
|
|
12392
13009
|
if (this.needsFull) this.releaseAllSpills();
|
|
12393
13010
|
if (!this.built || this.needsFull) this.build();
|
|
12394
13011
|
this.needsFull = false;
|
|
13012
|
+
this.structuralSeeds.clear();
|
|
12395
13013
|
this.cycles = /* @__PURE__ */ new Set();
|
|
12396
13014
|
this.run(new Set(this.allNodes()), true);
|
|
12397
13015
|
}
|
|
12398
13016
|
recalculateFrom(changes) {
|
|
12399
|
-
|
|
13017
|
+
const seeds = /* @__PURE__ */ new Set();
|
|
13018
|
+
if (this.fresh && !this.needsFull) {
|
|
13019
|
+
this.fresh = false;
|
|
13020
|
+
if (!this.built) this.build();
|
|
13021
|
+
if (!this.trustsStoredValues(changes, seeds)) {
|
|
13022
|
+
this.recalculateAll();
|
|
13023
|
+
return;
|
|
13024
|
+
}
|
|
13025
|
+
} else if (!this.built || this.needsFull) {
|
|
12400
13026
|
this.recalculateAll();
|
|
12401
13027
|
return;
|
|
12402
13028
|
}
|
|
12403
|
-
const seeds = /* @__PURE__ */ new Set();
|
|
12404
13029
|
const changed = [];
|
|
12405
13030
|
let structural = false;
|
|
12406
13031
|
for (const change of changes) {
|
|
@@ -12436,11 +13061,33 @@ var Engine = class extends EngineCore {
|
|
|
12436
13061
|
}
|
|
12437
13062
|
}
|
|
12438
13063
|
if (structural) this.graphChanged();
|
|
13064
|
+
this.takeStructuralSeeds(seeds);
|
|
12439
13065
|
const reverse = this.reverse();
|
|
12440
13066
|
for (const area of changed) reverse.dependents(area.sheet, area.range, seeds);
|
|
12441
13067
|
for (const node of this.allNodes()) if (node.volatile) seeds.add(node);
|
|
12442
13068
|
this.run(seeds, false);
|
|
12443
13069
|
}
|
|
13070
|
+
/**
|
|
13071
|
+
* Whether the stored results can stand for a fresh graph: apart from the changed cells, every
|
|
13072
|
+
* formula has legacy or CSE array semantics (none can spill). Collects the formulas stored
|
|
13073
|
+
* without a value into `missing`.
|
|
13074
|
+
*/
|
|
13075
|
+
trustsStoredValues(changes, missing) {
|
|
13076
|
+
const prepared = this.prepared;
|
|
13077
|
+
this.prepared = void 0;
|
|
13078
|
+
if (!prepared) return false;
|
|
13079
|
+
const changed = new Set(changes.map((c) => `${c.sheet}:${cellKey(c.row, c.col)}`));
|
|
13080
|
+
const current = (node) => this.nodes.get(node.sheet)?.get(cellKey(node.row, node.col)) === node;
|
|
13081
|
+
for (const node of prepared.dynamic) {
|
|
13082
|
+
if (current(node) && !changed.has(`${node.sheet}:${cellKey(node.row, node.col)}`))
|
|
13083
|
+
return false;
|
|
13084
|
+
}
|
|
13085
|
+
for (const node of prepared.unvalued) {
|
|
13086
|
+
const cell = this.workbook.sheets[node.sheet]?.rows.get(node.row)?.get(node.col);
|
|
13087
|
+
if (current(node) && cell && cell.value === null) missing.add(node);
|
|
13088
|
+
}
|
|
13089
|
+
return true;
|
|
13090
|
+
}
|
|
12444
13091
|
/**
|
|
12445
13092
|
* Whether a spilled cell is still part of its anchor's live spill, so a change reported for it
|
|
12446
13093
|
* is a user overwrite. A cell whose anchor is blocked (or gone) keeps its marker: it was
|
|
@@ -12451,7 +13098,10 @@ var Engine = class extends EngineCore {
|
|
|
12451
13098
|
return !!anchor?.spill && rangeHas(anchor.spill, row2, col);
|
|
12452
13099
|
}
|
|
12453
13100
|
invalidate() {
|
|
13101
|
+
this.structuralSeeds.clear();
|
|
12454
13102
|
this.releaseAllSpills();
|
|
13103
|
+
this.preparation = void 0;
|
|
13104
|
+
this.prepared = void 0;
|
|
12455
13105
|
this.nodes.clear();
|
|
12456
13106
|
this.footprints.clear();
|
|
12457
13107
|
this.graphChanged();
|
|
@@ -12496,7 +13146,7 @@ function createCalcEngine(workbook, options = {}) {
|
|
|
12496
13146
|
return new Engine(workbook, options);
|
|
12497
13147
|
}
|
|
12498
13148
|
|
|
12499
|
-
// xlsx/formula/
|
|
13149
|
+
// xlsx/formula/ref-text.ts
|
|
12500
13150
|
function safeTokens(formula) {
|
|
12501
13151
|
try {
|
|
12502
13152
|
return tokenize(formula);
|
|
@@ -12515,50 +13165,26 @@ function formatRefSpec(spec2) {
|
|
|
12515
13165
|
if (spec2.kind === "cell") return a;
|
|
12516
13166
|
return `${a}:${cornerText(spec2.end, spec2.kind)}`;
|
|
12517
13167
|
}
|
|
12518
|
-
function
|
|
13168
|
+
function rewriteRef(token, ref) {
|
|
12519
13169
|
const prefix = token.prefix?.text ?? "";
|
|
12520
13170
|
if (!ref) return `${prefix}#REF!`;
|
|
12521
13171
|
return `${prefix}${formatRefSpec(ref)}${token.spill ? "#" : ""}`;
|
|
12522
13172
|
}
|
|
12523
13173
|
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;
|
|
12524
|
-
|
|
12525
|
-
|
|
12526
|
-
|
|
12527
|
-
|
|
12528
|
-
|
|
12529
|
-
|
|
12530
|
-
const move = (c) => {
|
|
12531
|
-
const row2 = spec2.kind === "cols" || c.rowAbs ? c.row : c.row + dRow;
|
|
12532
|
-
const col = spec2.kind === "rows" || c.colAbs ? c.col : c.col + dCol;
|
|
12533
|
-
if (row2 < 0 || row2 > MAX_ROW || col < 0 || col > MAX_COL) return void 0;
|
|
12534
|
-
return { ...c, row: row2, col };
|
|
12535
|
-
};
|
|
12536
|
-
const start = move(spec2.start);
|
|
12537
|
-
const end = move(spec2.end);
|
|
12538
|
-
const next = start && end ? { kind: spec2.kind, start, end } : void 0;
|
|
12539
|
-
if (next && sameSpec(next, spec2)) continue;
|
|
12540
|
-
token.text = rewrite(token, next);
|
|
12541
|
-
}
|
|
12542
|
-
return joinTokens(tokens);
|
|
13174
|
+
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);
|
|
13175
|
+
function prefixText(prefix) {
|
|
13176
|
+
const sheets = prefix.sheet2 !== void 0 ? `${prefix.sheet}:${prefix.sheet2}` : prefix.sheet;
|
|
13177
|
+
const book = prefix.book !== void 0 ? `[${prefix.book}]` : "";
|
|
13178
|
+
const quote = needsQuote(prefix.sheet) || prefix.sheet2 !== void 0 && needsQuote(prefix.sheet2);
|
|
13179
|
+
return quote ? `'${(book + sheets).replace(/'/g, "''")}'!` : `${book}${sheets}!`;
|
|
12543
13180
|
}
|
|
12544
|
-
|
|
12545
|
-
|
|
12546
|
-
|
|
12547
|
-
|
|
12548
|
-
|
|
12549
|
-
|
|
12550
|
-
|
|
12551
|
-
const na2 = a >= at ? a + count2 : a;
|
|
12552
|
-
const nb2 = b >= at ? b + count2 : b;
|
|
12553
|
-
if (nb2 > max) return na2 > max ? void 0 : [na2, max];
|
|
12554
|
-
return [na2, nb2];
|
|
12555
|
-
}
|
|
12556
|
-
const n = -count2;
|
|
12557
|
-
const last = at + n - 1;
|
|
12558
|
-
if (a >= at && b <= last) return void 0;
|
|
12559
|
-
const na = a < at ? a : a <= last ? at : a - n;
|
|
12560
|
-
const nb = b < at ? b : b <= last ? at - 1 : b - n;
|
|
12561
|
-
return [na, nb];
|
|
13181
|
+
|
|
13182
|
+
// xlsx/formula/shift-formula.ts
|
|
13183
|
+
var templates = /* @__PURE__ */ new Map();
|
|
13184
|
+
var MAX_TEMPLATES2 = 2e5;
|
|
13185
|
+
function remember(text2, template) {
|
|
13186
|
+
if (templates.size >= MAX_TEMPLATES2) templates.clear();
|
|
13187
|
+
templates.set(text2, template);
|
|
12562
13188
|
}
|
|
12563
13189
|
function mergeSpacedAreas(tokens) {
|
|
12564
13190
|
const out = [];
|
|
@@ -12572,10 +13198,10 @@ function mergeSpacedAreas(tokens) {
|
|
|
12572
13198
|
const colon = tokens[j];
|
|
12573
13199
|
const last = tokens[k];
|
|
12574
13200
|
if (plainCell(first2) && colon?.kind === "op" && colon.text === ":" && plainCell(last) && !last?.prefix && k > i2 + 2 && first2.ref && last?.ref) {
|
|
12575
|
-
const
|
|
13201
|
+
const text2 = tokens.slice(i2, k + 1).map((t) => t.text).join("");
|
|
12576
13202
|
out.push({
|
|
12577
13203
|
...first2,
|
|
12578
|
-
text,
|
|
13204
|
+
text: text2,
|
|
12579
13205
|
ref: { kind: "area", start: first2.ref.start, end: last.ref.start }
|
|
12580
13206
|
});
|
|
12581
13207
|
i2 = k;
|
|
@@ -12585,63 +13211,145 @@ function mergeSpacedAreas(tokens) {
|
|
|
12585
13211
|
}
|
|
12586
13212
|
return out;
|
|
12587
13213
|
}
|
|
12588
|
-
function
|
|
12589
|
-
|
|
13214
|
+
function templateOf(formula) {
|
|
13215
|
+
const cached = templates.get(formula);
|
|
13216
|
+
if (cached !== void 0) return cached;
|
|
12590
13217
|
const raw = safeTokens(formula);
|
|
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
|
-
|
|
12617
|
-
|
|
12618
|
-
|
|
13218
|
+
let template = null;
|
|
13219
|
+
if (raw) {
|
|
13220
|
+
template = [];
|
|
13221
|
+
let literal2 = "";
|
|
13222
|
+
for (const token of mergeSpacedAreas(raw)) {
|
|
13223
|
+
if (token.kind !== "ref" && !(token.kind === "name" && token.prefix)) {
|
|
13224
|
+
literal2 += token.text;
|
|
13225
|
+
continue;
|
|
13226
|
+
}
|
|
13227
|
+
if (literal2) template.push(literal2);
|
|
13228
|
+
literal2 = "";
|
|
13229
|
+
const part = { kind: token.kind, text: token.text };
|
|
13230
|
+
if (token.prefix) {
|
|
13231
|
+
part.prefix = token.prefix;
|
|
13232
|
+
if (token.prefix.book === void 0) part.sheet = token.prefix.sheet.toLowerCase();
|
|
13233
|
+
}
|
|
13234
|
+
if (token.ref) part.ref = token.ref;
|
|
13235
|
+
if (token.spill) part.spill = true;
|
|
13236
|
+
template.push(part);
|
|
13237
|
+
}
|
|
13238
|
+
if (literal2) template.push(literal2);
|
|
13239
|
+
}
|
|
13240
|
+
remember(formula, template);
|
|
13241
|
+
return template;
|
|
13242
|
+
}
|
|
13243
|
+
function rewriteTemplate(formula, rewrite) {
|
|
13244
|
+
const template = templateOf(formula);
|
|
13245
|
+
if (!template) return formula;
|
|
13246
|
+
let next;
|
|
13247
|
+
for (let i2 = 0; i2 < template.length; i2++) {
|
|
13248
|
+
const part = template[i2];
|
|
13249
|
+
if (typeof part === "string") continue;
|
|
13250
|
+
const changed = rewrite(part);
|
|
13251
|
+
if (!changed) continue;
|
|
13252
|
+
next ??= template.slice();
|
|
13253
|
+
next[i2] = changed;
|
|
13254
|
+
}
|
|
13255
|
+
if (!next) return formula;
|
|
13256
|
+
const text2 = next.map((part) => typeof part === "string" ? part : part.text).join("");
|
|
13257
|
+
remember(text2, next);
|
|
13258
|
+
return text2;
|
|
13259
|
+
}
|
|
13260
|
+
function shiftInterval(a, b, at, count2, max) {
|
|
13261
|
+
if (count2 > 0) {
|
|
13262
|
+
const na2 = a >= at ? a + count2 : a;
|
|
13263
|
+
const nb2 = b >= at ? b + count2 : b;
|
|
13264
|
+
if (nb2 > max) return na2 > max ? void 0 : [na2, max];
|
|
13265
|
+
return [na2, nb2];
|
|
12619
13266
|
}
|
|
12620
|
-
|
|
13267
|
+
const n = -count2;
|
|
13268
|
+
const last = at + n - 1;
|
|
13269
|
+
if (a >= at && b <= last) return void 0;
|
|
13270
|
+
const na = a < at ? a : a <= last ? at : a - n;
|
|
13271
|
+
const nb = b < at ? b : b <= last ? at - 1 : b - n;
|
|
13272
|
+
return [na, nb];
|
|
12621
13273
|
}
|
|
12622
|
-
|
|
12623
|
-
|
|
12624
|
-
|
|
12625
|
-
const
|
|
12626
|
-
const
|
|
12627
|
-
|
|
13274
|
+
function shiftRef(ref, spec2) {
|
|
13275
|
+
const isRow = spec2.axis === "row";
|
|
13276
|
+
if (isRow && ref.kind === "cols" || !isRow && ref.kind === "rows") return ref;
|
|
13277
|
+
const startFirst = isRow ? ref.start.row <= ref.end.row : ref.start.col <= ref.end.col;
|
|
13278
|
+
const lo = startFirst ? ref.start : ref.end;
|
|
13279
|
+
const hi = startFirst ? ref.end : ref.start;
|
|
13280
|
+
const shifted2 = shiftInterval(
|
|
13281
|
+
isRow ? lo.row : lo.col,
|
|
13282
|
+
isRow ? hi.row : hi.col,
|
|
13283
|
+
spec2.at,
|
|
13284
|
+
spec2.count,
|
|
13285
|
+
isRow ? MAX_ROW : MAX_COL
|
|
13286
|
+
);
|
|
13287
|
+
if (!shifted2) return void 0;
|
|
13288
|
+
const [a, b] = shifted2;
|
|
13289
|
+
const nlo = isRow ? { ...lo, row: a } : { ...lo, col: a };
|
|
13290
|
+
const nhi = isRow ? { ...hi, row: b } : { ...hi, col: b };
|
|
13291
|
+
const next = {
|
|
13292
|
+
kind: ref.kind,
|
|
13293
|
+
start: startFirst ? nlo : nhi,
|
|
13294
|
+
end: startFirst ? nhi : nlo
|
|
13295
|
+
};
|
|
13296
|
+
if (ref.kind === "cell") next.end = next.start;
|
|
13297
|
+
return sameSpec(next, ref) ? ref : next;
|
|
13298
|
+
}
|
|
13299
|
+
function shiftFormula(formula, formulaSheet, spec2) {
|
|
13300
|
+
if (spec2.count === 0) return formula;
|
|
13301
|
+
const sheet = spec2.sheet.toLowerCase();
|
|
13302
|
+
const own = formulaSheet.toLowerCase() === sheet;
|
|
13303
|
+
return rewriteTemplate(formula, (part) => {
|
|
13304
|
+
if (part.kind !== "ref" || !part.ref || (part.prefix ? part.sheet !== sheet : !own))
|
|
13305
|
+
return void 0;
|
|
13306
|
+
const next = shiftRef(part.ref, spec2);
|
|
13307
|
+
if (next === part.ref) return void 0;
|
|
13308
|
+
const out = { kind: "ref", text: rewriteRef(part, next) };
|
|
13309
|
+
if (part.prefix) out.prefix = part.prefix;
|
|
13310
|
+
if (part.sheet !== void 0) out.sheet = part.sheet;
|
|
13311
|
+
if (next) out.ref = next;
|
|
13312
|
+
if (part.spill) out.spill = true;
|
|
13313
|
+
return out;
|
|
13314
|
+
});
|
|
12628
13315
|
}
|
|
12629
13316
|
function renameSheetInFormula(formula, oldName, newName) {
|
|
12630
|
-
const tokens = safeTokens(formula);
|
|
12631
|
-
if (!tokens) return formula;
|
|
12632
13317
|
const lower2 = oldName.toLowerCase();
|
|
12633
|
-
|
|
12634
|
-
const prefix =
|
|
12635
|
-
if (!prefix ||
|
|
12636
|
-
const first2 =
|
|
13318
|
+
return rewriteTemplate(formula, (part) => {
|
|
13319
|
+
const prefix = part.prefix;
|
|
13320
|
+
if (!prefix || part.sheet === void 0) return void 0;
|
|
13321
|
+
const first2 = part.sheet === lower2;
|
|
12637
13322
|
const second = prefix.sheet2?.toLowerCase() === lower2;
|
|
12638
|
-
if (!first2 && !second)
|
|
13323
|
+
if (!first2 && !second) return void 0;
|
|
12639
13324
|
const renamed = { ...prefix, sheet: first2 ? newName : prefix.sheet };
|
|
12640
13325
|
if (prefix.sheet2 !== void 0) renamed.sheet2 = second ? newName : prefix.sheet2;
|
|
12641
|
-
const
|
|
12642
|
-
|
|
12643
|
-
|
|
12644
|
-
|
|
13326
|
+
const text2 = prefixText(renamed);
|
|
13327
|
+
renamed.text = text2;
|
|
13328
|
+
const out = { ...part, text: text2 + part.text.slice(prefix.text.length) };
|
|
13329
|
+
out.prefix = renamed;
|
|
13330
|
+
out.sheet = renamed.sheet.toLowerCase();
|
|
13331
|
+
return out;
|
|
13332
|
+
});
|
|
13333
|
+
}
|
|
13334
|
+
|
|
13335
|
+
// xlsx/formula/transform.ts
|
|
13336
|
+
function translateFormula(formula, dRow, dCol) {
|
|
13337
|
+
const tokens = safeTokens(formula);
|
|
13338
|
+
if (!tokens) return formula;
|
|
13339
|
+
for (const token of tokens) {
|
|
13340
|
+
if (token.kind !== "ref" || !token.ref) continue;
|
|
13341
|
+
const spec2 = token.ref;
|
|
13342
|
+
const move = (c) => {
|
|
13343
|
+
const row2 = spec2.kind === "cols" || c.rowAbs ? c.row : c.row + dRow;
|
|
13344
|
+
const col = spec2.kind === "rows" || c.colAbs ? c.col : c.col + dCol;
|
|
13345
|
+
if (row2 < 0 || row2 > MAX_ROW || col < 0 || col > MAX_COL) return void 0;
|
|
13346
|
+
return { ...c, row: row2, col };
|
|
13347
|
+
};
|
|
13348
|
+
const start = move(spec2.start);
|
|
13349
|
+
const end = move(spec2.end);
|
|
13350
|
+
const next = start && end ? { kind: spec2.kind, start, end } : void 0;
|
|
13351
|
+
if (next && sameSpec(next, spec2)) continue;
|
|
13352
|
+
token.text = rewriteRef(token, next);
|
|
12645
13353
|
}
|
|
12646
13354
|
return joinTokens(tokens);
|
|
12647
13355
|
}
|
|
@@ -12940,6 +13648,16 @@ function parseColor(element2, palette) {
|
|
|
12940
13648
|
return Object.keys(color).length ? color : void 0;
|
|
12941
13649
|
}
|
|
12942
13650
|
|
|
13651
|
+
// color/hex-rgb.ts
|
|
13652
|
+
function parseArgbHex(hex2) {
|
|
13653
|
+
const clean2 = hex2.replace(/^#/, "");
|
|
13654
|
+
const rgb2 = clean2.length === 8 ? clean2.slice(2) : clean2;
|
|
13655
|
+
if (!/^[0-9a-fA-F]{6}$/.test(rgb2)) return void 0;
|
|
13656
|
+
return [0, 2, 4].map((i2) => parseInt(rgb2.slice(i2, i2 + 2), 16));
|
|
13657
|
+
}
|
|
13658
|
+
var clamp255 = (v) => Math.max(0, Math.min(255, v));
|
|
13659
|
+
var rgbToUpperHex = (rgb2) => `#${rgb2.map((v) => clamp255(Math.round(v)).toString(16).padStart(2, "0")).join("").toUpperCase()}`;
|
|
13660
|
+
|
|
12943
13661
|
// xlsx/read/sheet-props.ts
|
|
12944
13662
|
function parseSqref(sqref) {
|
|
12945
13663
|
if (!sqref) return [];
|
|
@@ -12955,13 +13673,13 @@ function dataBarLengths(rule, node) {
|
|
|
12955
13673
|
maxLength: rule.maxLength ?? numAttr(bar, "maxLength") ?? 90
|
|
12956
13674
|
};
|
|
12957
13675
|
}
|
|
12958
|
-
function rewriteConditionalExtension(rule,
|
|
13676
|
+
function rewriteConditionalExtension(rule, rewrite) {
|
|
12959
13677
|
if (!rule.extensionXml) return;
|
|
12960
13678
|
const doc = parseXml(rule.extensionXml);
|
|
12961
13679
|
let changed = false;
|
|
12962
13680
|
for (const formula of descendants(doc.documentElement, "f", XM)) {
|
|
12963
13681
|
const before = formula.textContent ?? "";
|
|
12964
|
-
const next =
|
|
13682
|
+
const next = rewrite(before);
|
|
12965
13683
|
if (before !== next) {
|
|
12966
13684
|
formula.textContent = next;
|
|
12967
13685
|
changed = true;
|
|
@@ -12970,6 +13688,104 @@ function rewriteConditionalExtension(rule, rewrite2) {
|
|
|
12970
13688
|
if (changed) rule.extensionXml = buildXml(doc);
|
|
12971
13689
|
}
|
|
12972
13690
|
|
|
13691
|
+
// xlsx/read/sparklines.ts
|
|
13692
|
+
var XM2 = "http://schemas.microsoft.com/office/excel/2006/main";
|
|
13693
|
+
var TYPES = ["line", "column", "stacked"];
|
|
13694
|
+
var EMPTY = ["gap", "zero", "span"];
|
|
13695
|
+
var AXES = ["individual", "group", "custom"];
|
|
13696
|
+
var COLORS = [
|
|
13697
|
+
"colorSeries",
|
|
13698
|
+
"colorNegative",
|
|
13699
|
+
"colorAxis",
|
|
13700
|
+
"colorMarkers",
|
|
13701
|
+
"colorFirst",
|
|
13702
|
+
"colorLast",
|
|
13703
|
+
"colorHigh",
|
|
13704
|
+
"colorLow"
|
|
13705
|
+
];
|
|
13706
|
+
function pick2(value2, allowed, fallback) {
|
|
13707
|
+
return allowed.includes(value2) ? value2 : fallback;
|
|
13708
|
+
}
|
|
13709
|
+
var text = (element2) => {
|
|
13710
|
+
const value2 = element2?.textContent?.trim();
|
|
13711
|
+
return value2 ? value2 : void 0;
|
|
13712
|
+
};
|
|
13713
|
+
function readSparklineGroup(node) {
|
|
13714
|
+
const attr = (name) => node.hasAttribute(name) ? node.getAttribute(name) : null;
|
|
13715
|
+
const group = {
|
|
13716
|
+
type: pick2(attr("type"), TYPES, "line"),
|
|
13717
|
+
lineWeight: numAttr(node, "lineWeight") ?? 0.75,
|
|
13718
|
+
dateAxis: boolAttr(node, "dateAxis", false),
|
|
13719
|
+
markers: boolAttr(node, "markers", false),
|
|
13720
|
+
high: boolAttr(node, "high", false),
|
|
13721
|
+
low: boolAttr(node, "low", false),
|
|
13722
|
+
first: boolAttr(node, "first", false),
|
|
13723
|
+
last: boolAttr(node, "last", false),
|
|
13724
|
+
negative: boolAttr(node, "negative", false),
|
|
13725
|
+
displayEmptyCellsAs: pick2(attr("displayEmptyCellsAs"), EMPTY, "zero"),
|
|
13726
|
+
displayXAxis: boolAttr(node, "displayXAxis", false),
|
|
13727
|
+
displayHidden: boolAttr(node, "displayHidden", false),
|
|
13728
|
+
rightToLeft: boolAttr(node, "rightToLeft", false),
|
|
13729
|
+
minAxisType: pick2(attr("minAxisType"), AXES, "individual"),
|
|
13730
|
+
maxAxisType: pick2(attr("maxAxisType"), AXES, "individual"),
|
|
13731
|
+
sparklines: []
|
|
13732
|
+
};
|
|
13733
|
+
const manualMin = numAttr(node, "manualMin");
|
|
13734
|
+
const manualMax = numAttr(node, "manualMax");
|
|
13735
|
+
if (manualMin !== void 0) group.manualMin = manualMin;
|
|
13736
|
+
if (manualMax !== void 0) group.manualMax = manualMax;
|
|
13737
|
+
for (const name of COLORS) {
|
|
13738
|
+
const color = parseColor(first(node, name, NS.x14));
|
|
13739
|
+
if (color) group[name] = color;
|
|
13740
|
+
}
|
|
13741
|
+
const dates = text(first(node, "f", XM2));
|
|
13742
|
+
if (dates) group.dateFormula = dates;
|
|
13743
|
+
for (const line2 of children(first(node, "sparklines", NS.x14) ?? node, "sparkline", NS.x14)) {
|
|
13744
|
+
const host = parseRange(text(first(line2, "sqref", XM2)) ?? "");
|
|
13745
|
+
if (!host) continue;
|
|
13746
|
+
const formula = text(first(line2, "f", XM2));
|
|
13747
|
+
group.sparklines.push(formula ? { formula, host } : { host });
|
|
13748
|
+
}
|
|
13749
|
+
return group;
|
|
13750
|
+
}
|
|
13751
|
+
function readSparklineGroups(extLst) {
|
|
13752
|
+
const groups = [];
|
|
13753
|
+
for (const xml of extLst) {
|
|
13754
|
+
if (!xml.includes("sparklineGroup")) continue;
|
|
13755
|
+
let root;
|
|
13756
|
+
try {
|
|
13757
|
+
root = parseXml(xml).documentElement;
|
|
13758
|
+
} catch {
|
|
13759
|
+
continue;
|
|
13760
|
+
}
|
|
13761
|
+
for (const node of descendants(root, "sparklineGroup", NS.x14))
|
|
13762
|
+
groups.push(readSparklineGroup(node));
|
|
13763
|
+
}
|
|
13764
|
+
return groups;
|
|
13765
|
+
}
|
|
13766
|
+
var cache2 = /* @__PURE__ */ new WeakMap();
|
|
13767
|
+
function sheetSparklineGroups(sheet) {
|
|
13768
|
+
const source = sheet.preserved.get("extLst") ?? [];
|
|
13769
|
+
const hit = cache2.get(sheet);
|
|
13770
|
+
if (hit && hit.source.length === source.length && hit.source.every((xml, i2) => xml === source[i2]))
|
|
13771
|
+
return hit.groups;
|
|
13772
|
+
const groups = readSparklineGroups(source);
|
|
13773
|
+
cache2.set(sheet, { source: [...source], groups });
|
|
13774
|
+
return groups;
|
|
13775
|
+
}
|
|
13776
|
+
|
|
13777
|
+
// chart/bar-cluster-geometry.ts
|
|
13778
|
+
function assertBarClusterOptions(options) {
|
|
13779
|
+
for (const [field, min, max] of [
|
|
13780
|
+
["barGapWidth", 0, 500],
|
|
13781
|
+
["barOverlap", -100, 100]
|
|
13782
|
+
]) {
|
|
13783
|
+
const value2 = options[field];
|
|
13784
|
+
if (value2 !== void 0 && (!Number.isInteger(value2) || value2 < min || value2 > max))
|
|
13785
|
+
throw new RangeError(`${field} must be an integer from ${min} to ${max}`);
|
|
13786
|
+
}
|
|
13787
|
+
}
|
|
13788
|
+
|
|
12973
13789
|
// chart/color-palettes.ts
|
|
12974
13790
|
var COLORFUL_VARIATIONS = [
|
|
12975
13791
|
{},
|
|
@@ -13155,24 +13971,19 @@ function hueToRgb(n1, n2, hue) {
|
|
|
13155
13971
|
return n1 + idiv((n2 - n1) * (idiv(HLSMAX * 2, 3) - h2) + idiv(HLSMAX, 12), sixth);
|
|
13156
13972
|
return n1;
|
|
13157
13973
|
}
|
|
13158
|
-
var
|
|
13974
|
+
var clamp2552 = (v) => Math.max(0, Math.min(255, v));
|
|
13159
13975
|
function hls240ToRgb({ h: h2, l, s }) {
|
|
13160
13976
|
if (s === 0) {
|
|
13161
|
-
const v =
|
|
13977
|
+
const v = clamp2552(Math.round(l * RGBMAX / HLSMAX));
|
|
13162
13978
|
return [v, v, v];
|
|
13163
13979
|
}
|
|
13164
13980
|
const m2 = l <= HLSMAX / 2 ? idiv(l * (HLSMAX + s) + idiv(HLSMAX, 2), HLSMAX) : l + s - idiv(l * s + idiv(HLSMAX, 2), HLSMAX);
|
|
13165
13981
|
const m1 = 2 * l - m2;
|
|
13166
|
-
const channel = (hue) =>
|
|
13982
|
+
const channel = (hue) => clamp2552(idiv(hueToRgb(m1, m2, hue) * RGBMAX + idiv(HLSMAX, 2), HLSMAX));
|
|
13167
13983
|
return [channel(h2 + idiv(HLSMAX, 3)), channel(h2), channel(h2 - idiv(HLSMAX, 3))];
|
|
13168
13984
|
}
|
|
13169
|
-
|
|
13170
|
-
|
|
13171
|
-
const rgb2 = clean2.length === 8 ? clean2.slice(2) : clean2;
|
|
13172
|
-
if (!/^[0-9a-fA-F]{6}$/.test(rgb2)) return void 0;
|
|
13173
|
-
return [0, 2, 4].map((i2) => parseInt(rgb2.slice(i2, i2 + 2), 16));
|
|
13174
|
-
}
|
|
13175
|
-
var toHexColor = (rgb2) => `#${rgb2.map((v) => clamp255(Math.round(v)).toString(16).padStart(2, "0")).join("").toUpperCase()}`;
|
|
13985
|
+
var parseHex = parseArgbHex;
|
|
13986
|
+
var toHexColor = rgbToUpperHex;
|
|
13176
13987
|
function applyTint(hex2, tint) {
|
|
13177
13988
|
const rgb2 = parseHex(hex2) ?? [0, 0, 0];
|
|
13178
13989
|
if (!tint) return toHexColor(rgb2);
|
|
@@ -13182,6 +13993,40 @@ function applyTint(hex2, tint) {
|
|
|
13182
13993
|
return toHexColor(hls240ToRgb({ ...hls, l: Math.max(0, Math.min(HLSMAX, l)) }));
|
|
13183
13994
|
}
|
|
13184
13995
|
|
|
13996
|
+
// chart/render/theme-palette.ts
|
|
13997
|
+
var THEME_SLOTS = [
|
|
13998
|
+
"lt1",
|
|
13999
|
+
"dk1",
|
|
14000
|
+
"lt2",
|
|
14001
|
+
"dk2",
|
|
14002
|
+
"accent1",
|
|
14003
|
+
"accent2",
|
|
14004
|
+
"accent3",
|
|
14005
|
+
"accent4",
|
|
14006
|
+
"accent5",
|
|
14007
|
+
"accent6",
|
|
14008
|
+
"hlink",
|
|
14009
|
+
"folHlink"
|
|
14010
|
+
];
|
|
14011
|
+
var DEFAULT_THEME_COLORS = [
|
|
14012
|
+
"FFFFFF",
|
|
14013
|
+
"000000",
|
|
14014
|
+
"E7E6E6",
|
|
14015
|
+
"44546A",
|
|
14016
|
+
"4472C4",
|
|
14017
|
+
"ED7D31",
|
|
14018
|
+
"A5A5A5",
|
|
14019
|
+
"FFC000",
|
|
14020
|
+
"5B9BD5",
|
|
14021
|
+
"70AD47",
|
|
14022
|
+
"0563C1",
|
|
14023
|
+
"954F72"
|
|
14024
|
+
];
|
|
14025
|
+
function themeColor(theme2, index2) {
|
|
14026
|
+
const hex2 = theme2.colors[index2] ?? DEFAULT_THEME_COLORS[index2];
|
|
14027
|
+
return hex2 && parseArgbHex(hex2) ? hex2.replace(/^#/, "") : void 0;
|
|
14028
|
+
}
|
|
14029
|
+
|
|
13185
14030
|
// xlsx/layout/colors.ts
|
|
13186
14031
|
var INDEXED_COLORS = [
|
|
13187
14032
|
"000000",
|
|
@@ -13251,38 +14096,6 @@ var INDEXED_COLORS = [
|
|
|
13251
14096
|
"000000",
|
|
13252
14097
|
"FFFFFF"
|
|
13253
14098
|
];
|
|
13254
|
-
var THEME_SLOTS = [
|
|
13255
|
-
"lt1",
|
|
13256
|
-
"dk1",
|
|
13257
|
-
"lt2",
|
|
13258
|
-
"dk2",
|
|
13259
|
-
"accent1",
|
|
13260
|
-
"accent2",
|
|
13261
|
-
"accent3",
|
|
13262
|
-
"accent4",
|
|
13263
|
-
"accent5",
|
|
13264
|
-
"accent6",
|
|
13265
|
-
"hlink",
|
|
13266
|
-
"folHlink"
|
|
13267
|
-
];
|
|
13268
|
-
var FALLBACK_THEME = [
|
|
13269
|
-
"FFFFFF",
|
|
13270
|
-
"000000",
|
|
13271
|
-
"E7E6E6",
|
|
13272
|
-
"44546A",
|
|
13273
|
-
"4472C4",
|
|
13274
|
-
"ED7D31",
|
|
13275
|
-
"A5A5A5",
|
|
13276
|
-
"FFC000",
|
|
13277
|
-
"5B9BD5",
|
|
13278
|
-
"70AD47",
|
|
13279
|
-
"0563C1",
|
|
13280
|
-
"954F72"
|
|
13281
|
-
];
|
|
13282
|
-
function themeColor(theme2, index2) {
|
|
13283
|
-
const hex2 = theme2.colors[index2] ?? FALLBACK_THEME[index2];
|
|
13284
|
-
return hex2 && parseHex(hex2) ? hex2.replace(/^#/, "") : void 0;
|
|
13285
|
-
}
|
|
13286
14099
|
function resolveColor(color, theme2, fallback, indexed = INDEXED_COLORS) {
|
|
13287
14100
|
if (!color) return fallback;
|
|
13288
14101
|
let base;
|
|
@@ -13305,18 +14118,6 @@ function mixColors(a, b, t, rounding = "nearest") {
|
|
|
13305
14118
|
);
|
|
13306
14119
|
}
|
|
13307
14120
|
|
|
13308
|
-
// chart/bar-cluster-geometry.ts
|
|
13309
|
-
function assertBarClusterOptions(options) {
|
|
13310
|
-
for (const [field, min, max] of [
|
|
13311
|
-
["barGapWidth", 0, 500],
|
|
13312
|
-
["barOverlap", -100, 100]
|
|
13313
|
-
]) {
|
|
13314
|
-
const value2 = options[field];
|
|
13315
|
-
if (value2 !== void 0 && (!Number.isInteger(value2) || value2 < min || value2 > max))
|
|
13316
|
-
throw new RangeError(`${field} must be an integer from ${min} to ${max}`);
|
|
13317
|
-
}
|
|
13318
|
-
}
|
|
13319
|
-
|
|
13320
14121
|
// xlsx/edit/range-math.ts
|
|
13321
14122
|
var axisMax = (axis) => axis === "row" ? MAX_ROW : MAX_COL;
|
|
13322
14123
|
function shiftSpan(start, end, shift2) {
|
|
@@ -13525,8 +14326,8 @@ function syncTableHeader(ctx, sheet, row2, col) {
|
|
|
13525
14326
|
if (!table2) return;
|
|
13526
14327
|
const column = table2.columns[col - table2.range.start.col];
|
|
13527
14328
|
if (!column) return;
|
|
13528
|
-
const
|
|
13529
|
-
if (
|
|
14329
|
+
const text2 = displayText(ctx.workbook, getCell(sheet, row2, col)).trim();
|
|
14330
|
+
if (text2) column.name = text2;
|
|
13530
14331
|
}
|
|
13531
14332
|
function writeScopes(sheet, index2, range2, parts = []) {
|
|
13532
14333
|
const r = normalizeRange(range2);
|
|
@@ -13541,11 +14342,11 @@ function writeScopes(sheet, index2, range2, parts = []) {
|
|
|
13541
14342
|
if (all2.length) scopes.push({ kind: "parts", sheet: index2, parts: all2 });
|
|
13542
14343
|
return scopes;
|
|
13543
14344
|
}
|
|
13544
|
-
function writeInput(ctx, sheet, row2, col,
|
|
14345
|
+
function writeInput(ctx, sheet, row2, col, text2) {
|
|
13545
14346
|
const { workbook } = ctx;
|
|
13546
14347
|
const existing = getCell(sheet, row2, col);
|
|
13547
14348
|
const format = styleAt(workbook, existing?.styleId ?? baseStyleId(sheet, row2, col)).numFmt;
|
|
13548
|
-
if (
|
|
14349
|
+
if (text2 === "") {
|
|
13549
14350
|
if (existing) clearContents(existing);
|
|
13550
14351
|
pruneCell(sheet, row2, col);
|
|
13551
14352
|
return;
|
|
@@ -13553,10 +14354,10 @@ function writeInput(ctx, sheet, row2, col, text) {
|
|
|
13553
14354
|
const cell = ensureCell(sheet, row2, col);
|
|
13554
14355
|
clearContents(cell);
|
|
13555
14356
|
if (format === "@") {
|
|
13556
|
-
cell.value =
|
|
14357
|
+
cell.value = text2;
|
|
13557
14358
|
return;
|
|
13558
14359
|
}
|
|
13559
|
-
const parsed = parseCellInput(
|
|
14360
|
+
const parsed = parseCellInput(text2, { date1904: workbook.date1904 });
|
|
13560
14361
|
if (parsed.formula !== void 0) cell.formula = parsed.formula;
|
|
13561
14362
|
else cell.value = parsed.value;
|
|
13562
14363
|
if (parsed.numFmt && format === "General")
|
|
@@ -13582,7 +14383,7 @@ function clearContents(cell) {
|
|
|
13582
14383
|
delete cell.legacyFormula;
|
|
13583
14384
|
delete cell.spillAnchor;
|
|
13584
14385
|
}
|
|
13585
|
-
function setCellInput(ctx, s, row2, col,
|
|
14386
|
+
function setCellInput(ctx, s, row2, col, text2) {
|
|
13586
14387
|
const sheet = sheetAt(ctx.workbook, s);
|
|
13587
14388
|
const range2 = cellRange(row2, col);
|
|
13588
14389
|
ctx.run(
|
|
@@ -13590,7 +14391,7 @@ function setCellInput(ctx, s, row2, col, text) {
|
|
|
13590
14391
|
"cells",
|
|
13591
14392
|
writeScopes(sheet, s, range2),
|
|
13592
14393
|
() => {
|
|
13593
|
-
writeInput(ctx, sheet, row2, col,
|
|
14394
|
+
writeInput(ctx, sheet, row2, col, text2);
|
|
13594
14395
|
syncTableHeader(ctx, sheet, row2, col);
|
|
13595
14396
|
},
|
|
13596
14397
|
{ sheet: s, ranges: [range2] }
|
|
@@ -13658,10 +14459,10 @@ function clearRange(ctx, s, range2, what) {
|
|
|
13658
14459
|
);
|
|
13659
14460
|
}
|
|
13660
14461
|
function clearIn(ctx, sheet, r, what) {
|
|
13661
|
-
const
|
|
13662
|
-
forEachCellInRange(sheet, r, (_cell, row2, col) =>
|
|
14462
|
+
const positions2 = [];
|
|
14463
|
+
forEachCellInRange(sheet, r, (_cell, row2, col) => positions2.push([row2, col]));
|
|
13663
14464
|
if (what === "contents" || what === "all" || what === "formats") {
|
|
13664
|
-
for (const [row2, col] of
|
|
14465
|
+
for (const [row2, col] of positions2) {
|
|
13665
14466
|
const cell = getCell(sheet, row2, col);
|
|
13666
14467
|
if (!cell) continue;
|
|
13667
14468
|
if (what === "all") deleteCell(sheet, row2, col);
|
|
@@ -13672,7 +14473,7 @@ function clearIn(ctx, sheet, r, what) {
|
|
|
13672
14473
|
}
|
|
13673
14474
|
}
|
|
13674
14475
|
if (what === "contents")
|
|
13675
|
-
for (const [row2, col] of
|
|
14476
|
+
for (const [row2, col] of positions2) syncTableHeader(ctx, sheet, row2, col);
|
|
13676
14477
|
}
|
|
13677
14478
|
if (what === "all" || what === "formats") {
|
|
13678
14479
|
sheet.merges = sheet.merges.filter((m) => !rangesIntersect(m, r));
|
|
@@ -13879,8 +14680,8 @@ var LISTS = [
|
|
|
13879
14680
|
"December"
|
|
13880
14681
|
]
|
|
13881
14682
|
];
|
|
13882
|
-
function listMatch(
|
|
13883
|
-
const lower2 =
|
|
14683
|
+
function listMatch(text2) {
|
|
14684
|
+
const lower2 = text2.toLowerCase();
|
|
13884
14685
|
for (const list of LISTS) {
|
|
13885
14686
|
const index2 = list.findIndex((item) => item.toLowerCase() === lower2);
|
|
13886
14687
|
if (index2 >= 0) return { list, index: index2 };
|
|
@@ -13905,14 +14706,14 @@ function linearTrend(values2) {
|
|
|
13905
14706
|
const slope = den ? num2 / den : 0;
|
|
13906
14707
|
return (k) => Number((meanY + slope * (k - meanX)).toPrecision(15));
|
|
13907
14708
|
}
|
|
13908
|
-
var
|
|
13909
|
-
function matchTextNumber(
|
|
13910
|
-
let end =
|
|
13911
|
-
while (end > 0 && !
|
|
14709
|
+
var isDigit5 = (ch) => ch !== void 0 && ch >= "0" && ch <= "9";
|
|
14710
|
+
function matchTextNumber(text2) {
|
|
14711
|
+
let end = text2.length;
|
|
14712
|
+
while (end > 0 && !isDigit5(text2[end - 1])) end--;
|
|
13912
14713
|
if (end === 0) return null;
|
|
13913
14714
|
let start = end;
|
|
13914
|
-
while (start > 0 &&
|
|
13915
|
-
return [
|
|
14715
|
+
while (start > 0 && isDigit5(text2[start - 1])) start--;
|
|
14716
|
+
return [text2, text2.slice(0, start), text2.slice(start, end), text2.slice(end)];
|
|
13916
14717
|
}
|
|
13917
14718
|
var QUARTER = /^(q|qtr|quarter)(\s?)([1-4])$/i;
|
|
13918
14719
|
function textSeries(texts) {
|
|
@@ -14094,10 +14895,10 @@ function removeValidationArea(rules, area) {
|
|
|
14094
14895
|
}
|
|
14095
14896
|
|
|
14096
14897
|
// xlsx/edit/conditional-formulas.ts
|
|
14097
|
-
function rewriteConditionalRule(rule,
|
|
14898
|
+
function rewriteConditionalRule(rule, rewrite) {
|
|
14098
14899
|
const safe2 = (formula) => {
|
|
14099
14900
|
try {
|
|
14100
|
-
return
|
|
14901
|
+
return rewrite(formula);
|
|
14101
14902
|
} catch {
|
|
14102
14903
|
return formula;
|
|
14103
14904
|
}
|
|
@@ -14317,26 +15118,26 @@ function pasteConditionalFormats(sheet, dest, cells, transpose2, skipBlanks, cut
|
|
|
14317
15118
|
}
|
|
14318
15119
|
|
|
14319
15120
|
// xlsx/edit/annotations.ts
|
|
14320
|
-
function setComment(ctx, s, at,
|
|
15121
|
+
function setComment(ctx, s, at, text2, author) {
|
|
14321
15122
|
const sheet = sheetAt(ctx.workbook, s);
|
|
14322
15123
|
const index2 = sheet.comments.findIndex(
|
|
14323
15124
|
(c) => c.address.row === at.row && c.address.col === at.col
|
|
14324
15125
|
);
|
|
14325
|
-
if (index2 < 0 &&
|
|
15126
|
+
if (index2 < 0 && text2 === void 0) return;
|
|
14326
15127
|
ctx.run(
|
|
14327
|
-
|
|
15128
|
+
text2 === void 0 ? "Delete comment" : index2 < 0 ? "New comment" : "Edit comment",
|
|
14328
15129
|
"annotations",
|
|
14329
15130
|
[{ kind: "sheet", sheet: s }],
|
|
14330
15131
|
() => {
|
|
14331
|
-
if (
|
|
15132
|
+
if (text2 === void 0) {
|
|
14332
15133
|
sheet.comments.splice(index2, 1);
|
|
14333
15134
|
return;
|
|
14334
15135
|
}
|
|
14335
15136
|
const existing = sheet.comments[index2];
|
|
14336
15137
|
if (existing) {
|
|
14337
|
-
existing.text =
|
|
15138
|
+
existing.text = text2;
|
|
14338
15139
|
existing.author = author;
|
|
14339
|
-
} else sheet.comments.push({ address: { row: at.row, col: at.col }, author, text });
|
|
15140
|
+
} else sheet.comments.push({ address: { row: at.row, col: at.col }, author, text: text2 });
|
|
14340
15141
|
},
|
|
14341
15142
|
{ sheet: s, ranges: [{ start: at, end: at }] }
|
|
14342
15143
|
);
|
|
@@ -14525,7 +15326,7 @@ function setBorders(ctx, s, range2, preset, edge = { style: "thin" }) {
|
|
|
14525
15326
|
}
|
|
14526
15327
|
|
|
14527
15328
|
// xlsx/edit/shift-preserved.ts
|
|
14528
|
-
var
|
|
15329
|
+
var XM3 = "http://schemas.microsoft.com/office/excel/2006/main";
|
|
14529
15330
|
function descendants2(root, ns, local) {
|
|
14530
15331
|
return Array.from(root.getElementsByTagNameNS(ns, local));
|
|
14531
15332
|
}
|
|
@@ -14585,14 +15386,14 @@ function removeUpwards(node, root) {
|
|
|
14585
15386
|
}
|
|
14586
15387
|
function shiftSqrefs(root, moveRange) {
|
|
14587
15388
|
let changed = false;
|
|
14588
|
-
for (const sqref of descendants2(root,
|
|
15389
|
+
for (const sqref of descendants2(root, XM3, "sqref")) {
|
|
14589
15390
|
const old = sqref.textContent ?? "";
|
|
14590
15391
|
const ranges = parseSqref(old).map(moveRange).filter((r) => !!r);
|
|
14591
|
-
const
|
|
14592
|
-
if (
|
|
15392
|
+
const text2 = ranges.map(formatRange).join(" ");
|
|
15393
|
+
if (text2 === old.trim()) continue;
|
|
14593
15394
|
changed = true;
|
|
14594
15395
|
const owner = sqref.parentNode;
|
|
14595
|
-
if (ranges.length) sqref.textContent =
|
|
15396
|
+
if (ranges.length) sqref.textContent = text2;
|
|
14596
15397
|
else if (owner) removeUpwards(owner, root);
|
|
14597
15398
|
}
|
|
14598
15399
|
if (!changed) return "same";
|
|
@@ -14616,21 +15417,21 @@ function shiftPreservedXml(sheet, shift2, moveRange, banded) {
|
|
|
14616
15417
|
(xml) => xml.includes("sqref")
|
|
14617
15418
|
);
|
|
14618
15419
|
}
|
|
14619
|
-
function rewritePreservedFormulas(sheet,
|
|
15420
|
+
function rewritePreservedFormulas(sheet, rewrite) {
|
|
14620
15421
|
editEntries(
|
|
14621
15422
|
sheet,
|
|
14622
15423
|
"extLst",
|
|
14623
15424
|
(root) => {
|
|
14624
15425
|
let changed = false;
|
|
14625
|
-
for (const f6 of descendants2(root,
|
|
14626
|
-
const
|
|
14627
|
-
let next =
|
|
15426
|
+
for (const f6 of descendants2(root, XM3, "f")) {
|
|
15427
|
+
const text2 = f6.textContent ?? "";
|
|
15428
|
+
let next = text2;
|
|
14628
15429
|
try {
|
|
14629
|
-
next =
|
|
15430
|
+
next = rewrite(text2, sheet.name);
|
|
14630
15431
|
} catch {
|
|
14631
|
-
next =
|
|
15432
|
+
next = text2;
|
|
14632
15433
|
}
|
|
14633
|
-
if (next ===
|
|
15434
|
+
if (next === text2) continue;
|
|
14634
15435
|
f6.textContent = next;
|
|
14635
15436
|
changed = true;
|
|
14636
15437
|
}
|
|
@@ -14641,46 +15442,46 @@ function rewritePreservedFormulas(sheet, rewrite2) {
|
|
|
14641
15442
|
}
|
|
14642
15443
|
|
|
14643
15444
|
// xlsx/edit/shift-formulas.ts
|
|
14644
|
-
function safe(
|
|
15445
|
+
function safe(rewrite, formula, formulaSheet) {
|
|
14645
15446
|
try {
|
|
14646
|
-
return
|
|
15447
|
+
return rewrite(formula, formulaSheet);
|
|
14647
15448
|
} catch {
|
|
14648
15449
|
return formula;
|
|
14649
15450
|
}
|
|
14650
15451
|
}
|
|
14651
|
-
function rewriteFormulas(workbook,
|
|
14652
|
-
for (const sheet of workbook.sheets) rewriteSheetFormulas(sheet,
|
|
15452
|
+
function rewriteFormulas(workbook, rewrite) {
|
|
15453
|
+
for (const sheet of workbook.sheets) rewriteSheetFormulas(sheet, rewrite);
|
|
14653
15454
|
for (const definedName of workbook.definedNames) {
|
|
14654
15455
|
const local = definedName.localSheet === void 0 ? void 0 : workbook.sheets[definedName.localSheet];
|
|
14655
|
-
definedName.formula = safe(
|
|
15456
|
+
definedName.formula = safe(rewrite, definedName.formula, local?.name ?? "");
|
|
14656
15457
|
}
|
|
14657
15458
|
}
|
|
14658
|
-
function rewriteSheetFormulas(sheet,
|
|
14659
|
-
rewritePreservedFormulas(sheet,
|
|
15459
|
+
function rewriteSheetFormulas(sheet, rewrite) {
|
|
15460
|
+
rewritePreservedFormulas(sheet, rewrite);
|
|
14660
15461
|
{
|
|
14661
15462
|
const name = sheet.name;
|
|
14662
15463
|
for (const table2 of sheet.tables)
|
|
14663
15464
|
for (const column of table2.columns)
|
|
14664
15465
|
if (column.calculatedColumnFormula !== void 0)
|
|
14665
|
-
column.calculatedColumnFormula = safe(
|
|
15466
|
+
column.calculatedColumnFormula = safe(rewrite, column.calculatedColumnFormula, name);
|
|
14666
15467
|
for (const cells of sheet.rows.values())
|
|
14667
15468
|
for (const cell of cells.values())
|
|
14668
|
-
if (cell.formula !== void 0) cell.formula = safe(
|
|
15469
|
+
if (cell.formula !== void 0) cell.formula = safe(rewrite, cell.formula, name);
|
|
14669
15470
|
for (const cf of sheet.conditionalFormats)
|
|
14670
|
-
for (const rule of cf.rules) rewriteConditionalRule(rule, (f6) =>
|
|
15471
|
+
for (const rule of cf.rules) rewriteConditionalRule(rule, (f6) => rewrite(f6, name));
|
|
14671
15472
|
for (const dv of sheet.dataValidations) {
|
|
14672
|
-
if (dv.formula1 !== void 0) dv.formula1 = safe(
|
|
14673
|
-
if (dv.formula2 !== void 0) dv.formula2 = safe(
|
|
15473
|
+
if (dv.formula1 !== void 0) dv.formula1 = safe(rewrite, dv.formula1, name);
|
|
15474
|
+
if (dv.formula2 !== void 0) dv.formula2 = safe(rewrite, dv.formula2, name);
|
|
14674
15475
|
}
|
|
14675
15476
|
for (const link of sheet.hyperlinks)
|
|
14676
15477
|
if (link.location && /![A-Za-z$]/.test(link.location))
|
|
14677
|
-
link.location = safe(
|
|
15478
|
+
link.location = safe(rewrite, link.location, name);
|
|
14678
15479
|
for (const drawing of sheet.drawings) {
|
|
14679
15480
|
if (drawing.kind !== "chart") continue;
|
|
14680
15481
|
for (const series of drawing.series) {
|
|
14681
|
-
if (series.nameRef) series.nameRef = safe(
|
|
14682
|
-
if (series.categoriesRef) series.categoriesRef = safe(
|
|
14683
|
-
if (series.valuesRef) series.valuesRef = safe(
|
|
15482
|
+
if (series.nameRef) series.nameRef = safe(rewrite, series.nameRef, name);
|
|
15483
|
+
if (series.categoriesRef) series.categoriesRef = safe(rewrite, series.categoriesRef, name);
|
|
15484
|
+
if (series.valuesRef) series.valuesRef = safe(rewrite, series.valuesRef, name);
|
|
14684
15485
|
}
|
|
14685
15486
|
}
|
|
14686
15487
|
}
|
|
@@ -14867,7 +15668,7 @@ function shiftAxis(ctx, s, axis, at, count2, insert) {
|
|
|
14867
15668
|
applyAxisShift(ctx, sheet, shift2);
|
|
14868
15669
|
if (insert) inheritFormats(sheet, axis, at, count2);
|
|
14869
15670
|
},
|
|
14870
|
-
{ sheet: s, structural: true }
|
|
15671
|
+
{ sheet: s, structural: true, calc: { kind: "shift", sheet: s, shift: shift2 } }
|
|
14871
15672
|
);
|
|
14872
15673
|
}
|
|
14873
15674
|
var insertRows = (ctx, s, at, count2) => shiftAxis(ctx, s, "row", at, count2, true);
|
|
@@ -14981,7 +15782,7 @@ function pasteHyperlinks(sheet, dest, cells, transpose2, skipBlanks, cutLocation
|
|
|
14981
15782
|
}
|
|
14982
15783
|
|
|
14983
15784
|
// xlsx/edit/clipboard-html.ts
|
|
14984
|
-
var escapeHtml = (
|
|
15785
|
+
var escapeHtml = (text2) => text2.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">").replace(/"/g, """);
|
|
14985
15786
|
function cssColor(color, theme2) {
|
|
14986
15787
|
if (!color || color.auto) return void 0;
|
|
14987
15788
|
if (color.rgb) return `#${color.rgb.slice(-6)}`;
|
|
@@ -15046,12 +15847,12 @@ function toHtml(cells, theme2) {
|
|
|
15046
15847
|
if (cell && typeof cell.value === "number") attrs.push(`x:num="${cell.value}"`);
|
|
15047
15848
|
const css = cssFor(cell?.style, theme2);
|
|
15048
15849
|
if (css) attrs.push(`style="${escapeHtml(css)}"`);
|
|
15049
|
-
let
|
|
15850
|
+
let text2 = escapeHtml(cell?.text ?? "").replace(/\n/g, "<br>");
|
|
15050
15851
|
const link = links.get(`${r},${c}`);
|
|
15051
15852
|
const href = htmlHref(link);
|
|
15052
15853
|
if (href)
|
|
15053
|
-
|
|
15054
|
-
tds.push(`<td${attrs.length ? ` ${attrs.join(" ")}` : ""}>${
|
|
15854
|
+
text2 = `<a href="${escapeHtml(href)}"${link?.tooltip ? ` title="${escapeHtml(link.tooltip)}"` : ""}>${text2}</a>`;
|
|
15855
|
+
tds.push(`<td${attrs.length ? ` ${attrs.join(" ")}` : ""}>${text2}</td>`);
|
|
15055
15856
|
}
|
|
15056
15857
|
rows2.push(`<tr>${tds.join("")}</tr>`);
|
|
15057
15858
|
}
|
|
@@ -15079,8 +15880,8 @@ var NAMED_COLORS2 = {
|
|
|
15079
15880
|
aqua: "00FFFF",
|
|
15080
15881
|
fuchsia: "FF00FF"
|
|
15081
15882
|
};
|
|
15082
|
-
function parseCssColor(
|
|
15083
|
-
const value2 =
|
|
15883
|
+
function parseCssColor(text2) {
|
|
15884
|
+
const value2 = text2.trim().toLowerCase();
|
|
15084
15885
|
const hex2 = /^#([0-9a-f]{3}|[0-9a-f]{6})$/.exec(value2)?.[1];
|
|
15085
15886
|
if (hex2)
|
|
15086
15887
|
return {
|
|
@@ -15102,33 +15903,33 @@ var ENTITIES = {
|
|
|
15102
15903
|
apos: "'",
|
|
15103
15904
|
nbsp: " "
|
|
15104
15905
|
};
|
|
15105
|
-
function decodeEntities(
|
|
15106
|
-
return
|
|
15906
|
+
function decodeEntities(text2) {
|
|
15907
|
+
return text2.replace(/&(#x[0-9a-f]+|#\d+|[a-z]+);/gi, (whole, name) => {
|
|
15107
15908
|
if (name.startsWith("#x") || name.startsWith("#X"))
|
|
15108
15909
|
return String.fromCodePoint(parseInt(name.slice(2), 16));
|
|
15109
15910
|
if (name.startsWith("#")) return String.fromCodePoint(Number(name.slice(1)));
|
|
15110
15911
|
return ENTITIES[name.toLowerCase()] ?? whole;
|
|
15111
15912
|
});
|
|
15112
15913
|
}
|
|
15113
|
-
function parseAttributes(
|
|
15914
|
+
function parseAttributes(text2) {
|
|
15114
15915
|
const attrs = /* @__PURE__ */ new Map();
|
|
15115
|
-
for (const m of
|
|
15916
|
+
for (const m of text2.matchAll(
|
|
15116
15917
|
/([\w:-]{1,64})\s{0,16}=\s{0,16}(?:"([^"]*)"|'([^']*)'|([^\s>]+))/g
|
|
15117
15918
|
))
|
|
15118
15919
|
attrs.set((m[1] ?? "").toLowerCase(), decodeEntities(m[2] ?? m[3] ?? m[4] ?? ""));
|
|
15119
15920
|
return attrs;
|
|
15120
15921
|
}
|
|
15121
|
-
function parseCss(
|
|
15922
|
+
function parseCss(text2) {
|
|
15122
15923
|
const out = /* @__PURE__ */ new Map();
|
|
15123
|
-
for (const decl of
|
|
15924
|
+
for (const decl of text2.split(";")) {
|
|
15124
15925
|
const colon = decl.indexOf(":");
|
|
15125
15926
|
if (colon < 0) continue;
|
|
15126
15927
|
out.set(decl.slice(0, colon).trim().toLowerCase(), decl.slice(colon + 1).trim());
|
|
15127
15928
|
}
|
|
15128
15929
|
return out;
|
|
15129
15930
|
}
|
|
15130
|
-
function decodeNumberFormat(
|
|
15131
|
-
return
|
|
15931
|
+
function decodeNumberFormat(text2) {
|
|
15932
|
+
return text2.replace(/^["']|["']$/g, "").replace(/\\([0-9A-Fa-f]{4})/g, (_m, hex2) => String.fromCharCode(parseInt(hex2, 16))).replace(/\\(.)/g, "$1");
|
|
15132
15933
|
}
|
|
15133
15934
|
var H_ALIGN = {
|
|
15134
15935
|
left: "left",
|
|
@@ -15169,26 +15970,26 @@ function stylePatchFromCss(css, inner2) {
|
|
|
15169
15970
|
if (numFmt) patch.numFmt = decodeNumberFormat(numFmt);
|
|
15170
15971
|
return patch;
|
|
15171
15972
|
}
|
|
15172
|
-
function removeComments(
|
|
15973
|
+
function removeComments(text2) {
|
|
15173
15974
|
let out = "";
|
|
15174
15975
|
let from = 0;
|
|
15175
15976
|
for (; ; ) {
|
|
15176
|
-
const open =
|
|
15177
|
-
const close = open < 0 ? -1 :
|
|
15178
|
-
if (close < 0) return out +
|
|
15179
|
-
out +=
|
|
15977
|
+
const open = text2.indexOf("<!--", from);
|
|
15978
|
+
const close = open < 0 ? -1 : text2.indexOf("-->", open + 4);
|
|
15979
|
+
if (close < 0) return out + text2.slice(from);
|
|
15980
|
+
out += text2.slice(from, open);
|
|
15180
15981
|
from = close + 3;
|
|
15181
15982
|
}
|
|
15182
15983
|
}
|
|
15183
|
-
function removeTags(
|
|
15984
|
+
function removeTags(text2) {
|
|
15184
15985
|
let out = "";
|
|
15185
15986
|
let i2 = 0;
|
|
15186
|
-
while (i2 <
|
|
15187
|
-
const ch =
|
|
15987
|
+
while (i2 < text2.length) {
|
|
15988
|
+
const ch = text2[i2];
|
|
15188
15989
|
if (ch === "<") {
|
|
15189
15990
|
let j = i2 + 1;
|
|
15190
|
-
while (j <
|
|
15191
|
-
if (
|
|
15991
|
+
while (j < text2.length && text2[j] !== "<" && text2[j] !== ">") j++;
|
|
15992
|
+
if (text2[j] === ">") {
|
|
15192
15993
|
i2 = j + 1;
|
|
15193
15994
|
continue;
|
|
15194
15995
|
}
|
|
@@ -15200,15 +16001,15 @@ function removeTags(text) {
|
|
|
15200
16001
|
}
|
|
15201
16002
|
function stripTags(markup) {
|
|
15202
16003
|
let previous;
|
|
15203
|
-
let
|
|
16004
|
+
let text2 = markup;
|
|
15204
16005
|
do {
|
|
15205
|
-
previous =
|
|
15206
|
-
|
|
15207
|
-
} while (
|
|
15208
|
-
return removeAll(
|
|
16006
|
+
previous = text2;
|
|
16007
|
+
text2 = removeTags(removeComments(text2));
|
|
16008
|
+
} while (text2 !== previous);
|
|
16009
|
+
return removeAll(text2, ["<!--", "-->"]);
|
|
15209
16010
|
}
|
|
15210
|
-
function removeAll(
|
|
15211
|
-
let current =
|
|
16011
|
+
function removeAll(text2, tokens) {
|
|
16012
|
+
let current = text2;
|
|
15212
16013
|
let previous;
|
|
15213
16014
|
do {
|
|
15214
16015
|
previous = current;
|
|
@@ -15250,8 +16051,8 @@ function parseHtmlTable(html, base) {
|
|
|
15250
16051
|
for (const [k, v] of parseCss(attrs.get("style") ?? "")) css.set(k, v);
|
|
15251
16052
|
const patch = stylePatchFromCss(css, inner2);
|
|
15252
16053
|
if (td[1]?.toLowerCase() === "h") patch.font = { bold: true, ...patch.font };
|
|
15253
|
-
const
|
|
15254
|
-
row2[c] =
|
|
16054
|
+
const text2 = cellText(inner2);
|
|
16055
|
+
row2[c] = text2 === "" && !Object.keys(patch).length ? null : toCell(text2, attrs, patch, base);
|
|
15255
16056
|
const rowSpan = Math.max(1, Number(attrs.get("rowspan") ?? 1) || 1);
|
|
15256
16057
|
const colSpan = Math.max(1, Number(attrs.get("colspan") ?? 1) || 1);
|
|
15257
16058
|
const anchor = /<a\b([^>]*)>/i.exec(inner2);
|
|
@@ -15283,35 +16084,35 @@ function parseHtmlTable(html, base) {
|
|
|
15283
16084
|
);
|
|
15284
16085
|
return rows2 && cols ? { rows: rows2, cols, data, merges, hyperlinks } : void 0;
|
|
15285
16086
|
}
|
|
15286
|
-
function toCell(
|
|
15287
|
-
let value2 =
|
|
16087
|
+
function toCell(text2, attrs, patch, base) {
|
|
16088
|
+
let value2 = text2;
|
|
15288
16089
|
const num2 = attrs.get("x:num");
|
|
15289
16090
|
if (num2 !== void 0 && num2 !== "" && Number.isFinite(Number(num2))) value2 = Number(num2);
|
|
15290
|
-
else if (attrs.has("x:bool")) value2 =
|
|
15291
|
-
else if (patch.numFmt !== "@" &&
|
|
15292
|
-
const parsed = parseCellInput(
|
|
16091
|
+
else if (attrs.has("x:bool")) value2 = text2.toUpperCase() === "TRUE";
|
|
16092
|
+
else if (patch.numFmt !== "@" && text2 !== "") {
|
|
16093
|
+
const parsed = parseCellInput(text2);
|
|
15293
16094
|
if (parsed.formula === void 0) value2 = parsed.value;
|
|
15294
16095
|
if (!patch.numFmt && parsed.numFmt && typeof value2 === "number") patch.numFmt = parsed.numFmt;
|
|
15295
16096
|
}
|
|
15296
|
-
return { value: value2, text, style: patchStyle(base, patch) };
|
|
16097
|
+
return { value: value2, text: text2, style: patchStyle(base, patch) };
|
|
15297
16098
|
}
|
|
15298
16099
|
|
|
15299
16100
|
// xlsx/edit/clipboard-text.ts
|
|
15300
|
-
function quoteField(
|
|
15301
|
-
return /[\t\r\n"]/.test(
|
|
16101
|
+
function quoteField(text2) {
|
|
16102
|
+
return /[\t\r\n"]/.test(text2) ? `"${text2.replace(/"/g, '""')}"` : text2;
|
|
15302
16103
|
}
|
|
15303
16104
|
function toTsv(rows2) {
|
|
15304
16105
|
if (!rows2.length) return "";
|
|
15305
16106
|
return rows2.map((row2) => row2.map(quoteField).join(" ")).join("\r\n") + "\r\n";
|
|
15306
16107
|
}
|
|
15307
|
-
function parseTsv(
|
|
16108
|
+
function parseTsv(text2) {
|
|
15308
16109
|
const rows2 = [];
|
|
15309
16110
|
let row2 = [];
|
|
15310
16111
|
let field = "";
|
|
15311
16112
|
let i2 = 0;
|
|
15312
16113
|
let atFieldStart = true;
|
|
15313
|
-
const body2 =
|
|
15314
|
-
if (body2 === "") return
|
|
16114
|
+
const body2 = text2.replace(/\r\n?/g, "\n").replace(/\n$/, "");
|
|
16115
|
+
if (body2 === "") return text2 === "" ? [] : [[""]];
|
|
15315
16116
|
while (i2 < body2.length) {
|
|
15316
16117
|
const ch = body2[i2] ?? "";
|
|
15317
16118
|
if (atFieldStart && ch === '"') {
|
|
@@ -15346,10 +16147,10 @@ function parseTsv(text) {
|
|
|
15346
16147
|
for (const r of rows2) while (r.length < width) r.push("");
|
|
15347
16148
|
return rows2;
|
|
15348
16149
|
}
|
|
15349
|
-
function findClosingQuote(
|
|
15350
|
-
for (let i2 = from; i2 <
|
|
15351
|
-
if (
|
|
15352
|
-
if (
|
|
16150
|
+
function findClosingQuote(text2, from) {
|
|
16151
|
+
for (let i2 = from; i2 < text2.length; i2++) {
|
|
16152
|
+
if (text2[i2] !== '"') continue;
|
|
16153
|
+
if (text2[i2 + 1] === '"') {
|
|
15353
16154
|
i2++;
|
|
15354
16155
|
continue;
|
|
15355
16156
|
}
|
|
@@ -15626,12 +16427,12 @@ function copyRange(workbook, s, range2) {
|
|
|
15626
16427
|
cells
|
|
15627
16428
|
};
|
|
15628
16429
|
}
|
|
15629
|
-
function cellsFromText(workbook,
|
|
15630
|
-
if (/<table\b/i.test(
|
|
15631
|
-
const parsed = parseHtmlTable(
|
|
16430
|
+
function cellsFromText(workbook, text2) {
|
|
16431
|
+
if (/<table\b/i.test(text2)) {
|
|
16432
|
+
const parsed = parseHtmlTable(text2, styleAt(workbook, 0));
|
|
15632
16433
|
if (parsed) return parsed;
|
|
15633
16434
|
}
|
|
15634
|
-
const grid6 = parseTsv(
|
|
16435
|
+
const grid6 = parseTsv(text2);
|
|
15635
16436
|
const data = grid6.map(
|
|
15636
16437
|
(line2) => line2.map((field) => {
|
|
15637
16438
|
if (field === "") return null;
|
|
@@ -15826,13 +16627,32 @@ function pasteSelection(ctx, sheet, selection, payload, request) {
|
|
|
15826
16627
|
);
|
|
15827
16628
|
}
|
|
15828
16629
|
|
|
16630
|
+
// xlsx/edit/external.ts
|
|
16631
|
+
function applyExternal(host, apply) {
|
|
16632
|
+
if (host.busy()) throw new Error("Cannot apply an external change inside an edit");
|
|
16633
|
+
const change = apply();
|
|
16634
|
+
if (!change) return false;
|
|
16635
|
+
const structural = change.structural ?? false;
|
|
16636
|
+
host.calculator.afterExternal(structural, change.cells ?? []);
|
|
16637
|
+
const out = {
|
|
16638
|
+
kind: change.kind ?? "remote",
|
|
16639
|
+
label: change.label,
|
|
16640
|
+
structural,
|
|
16641
|
+
external: true
|
|
16642
|
+
};
|
|
16643
|
+
if (change.sheet !== void 0) out.sheet = change.sheet;
|
|
16644
|
+
if (change.ranges?.length) out.ranges = change.ranges;
|
|
16645
|
+
host.emit(out);
|
|
16646
|
+
return true;
|
|
16647
|
+
}
|
|
16648
|
+
|
|
15829
16649
|
// xlsx/edit/dimensions.ts
|
|
15830
16650
|
var MDW = 7;
|
|
15831
16651
|
var MAX_WIDTH = 255;
|
|
15832
16652
|
var MAX_HEIGHT = 409;
|
|
15833
|
-
function estimateWidth(
|
|
16653
|
+
function estimateWidth(text2, style2) {
|
|
15834
16654
|
const scale2 = (style2.font.size ?? 11) / 11;
|
|
15835
|
-
const longest = Math.max(...
|
|
16655
|
+
const longest = Math.max(...text2.split("\n").map((line2) => line2.length));
|
|
15836
16656
|
return longest * MDW * scale2 * (style2.font.bold ? 1.1 : 1);
|
|
15837
16657
|
}
|
|
15838
16658
|
var pixelsToWidth = (px) => Math.round((px + 5) / MDW * 256) / 256;
|
|
@@ -15841,9 +16661,9 @@ function fitColumnWidth(ctx, sheet, col, measure2) {
|
|
|
15841
16661
|
for (const [row2, cells] of sheet.rows) {
|
|
15842
16662
|
const cell = cells.get(col);
|
|
15843
16663
|
if (!cell || sheet.rowInfo.get(row2)?.hidden) continue;
|
|
15844
|
-
const
|
|
15845
|
-
if (!
|
|
15846
|
-
widest = Math.max(widest, measure2(
|
|
16664
|
+
const text2 = displayText(ctx.workbook, cell);
|
|
16665
|
+
if (!text2) continue;
|
|
16666
|
+
widest = Math.max(widest, measure2(text2, styleAt(ctx.workbook, cell.styleId)));
|
|
15847
16667
|
}
|
|
15848
16668
|
return widest < 0 ? void 0 : Math.min(MAX_WIDTH, pixelsToWidth(widest));
|
|
15849
16669
|
}
|
|
@@ -16094,8 +16914,8 @@ function applyFilter(ctx, sheet, filter2) {
|
|
|
16094
16914
|
for (let row2 = range2.start.row + 1; row2 <= range2.end.row; row2++) {
|
|
16095
16915
|
const visible = (filter2.columns ?? []).every((fc) => {
|
|
16096
16916
|
if (!fc.values && !fc.blank) return true;
|
|
16097
|
-
const
|
|
16098
|
-
return
|
|
16917
|
+
const text2 = displayText(ctx.workbook, getCell(sheet, row2, range2.start.col + fc.offset));
|
|
16918
|
+
return text2 === "" ? !!fc.blank : (fc.values ?? []).includes(text2);
|
|
16099
16919
|
});
|
|
16100
16920
|
const info = { ...sheet.rowInfo.get(row2) };
|
|
16101
16921
|
if (visible) delete info.hidden;
|
|
@@ -16194,11 +17014,11 @@ function formulaBarText(workbook, cell, options = {}) {
|
|
|
16194
17014
|
styleAt(workbook, cell.styleId).numFmt || "General",
|
|
16195
17015
|
workbook.date1904
|
|
16196
17016
|
);
|
|
16197
|
-
const
|
|
16198
|
-
if (
|
|
16199
|
-
const parsed = parseCellInput(
|
|
16200
|
-
const literal2 = parsed.formula === void 0 && parsed.value ===
|
|
16201
|
-
return literal2 ?
|
|
17017
|
+
const text2 = cell.richText?.length ? cell.richText.map((run) => run.text).join("") : value2;
|
|
17018
|
+
if (text2 === "" || options.quote === false) return text2;
|
|
17019
|
+
const parsed = parseCellInput(text2, { date1904: workbook.date1904 });
|
|
17020
|
+
const literal2 = parsed.formula === void 0 && parsed.value === text2;
|
|
17021
|
+
return literal2 ? text2 : `'${text2}`;
|
|
16202
17022
|
}
|
|
16203
17023
|
|
|
16204
17024
|
// xlsx/edit/find.ts
|
|
@@ -16217,7 +17037,7 @@ function queryPattern(query, global = false) {
|
|
|
16217
17037
|
if (query.wholeCell) source = `^(?:${source})$`;
|
|
16218
17038
|
return new RegExp(source, `${query.matchCase ? "" : "i"}${global ? "g" : ""}`);
|
|
16219
17039
|
}
|
|
16220
|
-
var escapeRegex2 = (
|
|
17040
|
+
var escapeRegex2 = (text2) => text2.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
16221
17041
|
function searchText(workbook, query, sheet, row2, col) {
|
|
16222
17042
|
const ws = workbook.sheets[sheet];
|
|
16223
17043
|
if (!ws) return "";
|
|
@@ -16234,25 +17054,25 @@ function findAll(workbook, query) {
|
|
|
16234
17054
|
for (const s of indices) {
|
|
16235
17055
|
const sheet = workbook.sheets[s];
|
|
16236
17056
|
if (!sheet) continue;
|
|
16237
|
-
const
|
|
17057
|
+
const positions2 = [];
|
|
16238
17058
|
if (query.lookIn === "comments")
|
|
16239
|
-
for (const c of sheet.comments)
|
|
16240
|
-
else forEachCell(sheet, (_cell, row2, col) =>
|
|
16241
|
-
if (query.order === "columns")
|
|
16242
|
-
else
|
|
16243
|
-
for (const [row2, col] of
|
|
17059
|
+
for (const c of sheet.comments) positions2.push([c.address.row, c.address.col]);
|
|
17060
|
+
else forEachCell(sheet, (_cell, row2, col) => positions2.push([row2, col]));
|
|
17061
|
+
if (query.order === "columns") positions2.sort((a, b) => a[1] - b[1] || a[0] - b[0]);
|
|
17062
|
+
else positions2.sort((a, b) => a[0] - b[0] || a[1] - b[1]);
|
|
17063
|
+
for (const [row2, col] of positions2) {
|
|
16244
17064
|
if (query.range && query.sheet !== void 0 && !rangeContains(query.range, { row: row2, col }))
|
|
16245
17065
|
continue;
|
|
16246
|
-
const
|
|
16247
|
-
if (
|
|
17066
|
+
const text2 = searchText(workbook, query, s, row2, col);
|
|
17067
|
+
if (text2 && pattern.test(text2)) matches2.push({ sheet: s, row: row2, col, text: text2 });
|
|
16248
17068
|
}
|
|
16249
17069
|
}
|
|
16250
17070
|
return matches2;
|
|
16251
17071
|
}
|
|
16252
|
-
function replaceText(
|
|
17072
|
+
function replaceText(text2, query, replacement) {
|
|
16253
17073
|
const pattern = queryPattern(query, true);
|
|
16254
|
-
if (!pattern) return
|
|
16255
|
-
return
|
|
17074
|
+
if (!pattern) return text2;
|
|
17075
|
+
return text2.replace(pattern, (match2) => match2 === "" ? "" : replacement);
|
|
16256
17076
|
}
|
|
16257
17077
|
var isSpilledAt = (workbook, at) => {
|
|
16258
17078
|
const sheet = workbook.sheets[at.sheet];
|
|
@@ -16311,10 +17131,10 @@ function replaceOne(ctx, query, replacement, at) {
|
|
|
16311
17131
|
const q = replaceQuery(query);
|
|
16312
17132
|
if (q.lookIn !== "comments" && isSpilledAt(ctx.workbook, at)) return false;
|
|
16313
17133
|
const pattern = queryPattern(q);
|
|
16314
|
-
const
|
|
16315
|
-
if (!pattern || !
|
|
16316
|
-
const match2 = { ...at, text };
|
|
16317
|
-
if (replaceText(
|
|
17134
|
+
const text2 = searchText(ctx.workbook, q, at.sheet, at.row, at.col);
|
|
17135
|
+
if (!pattern || !text2 || !pattern.test(text2)) return false;
|
|
17136
|
+
const match2 = { ...at, text: text2 };
|
|
17137
|
+
if (replaceText(text2, q, replacement) === text2) return false;
|
|
16318
17138
|
ctx.run(
|
|
16319
17139
|
"Replace",
|
|
16320
17140
|
"cells",
|
|
@@ -16662,6 +17482,14 @@ function setCalcMode(ctx, mode) {
|
|
|
16662
17482
|
|
|
16663
17483
|
// xlsx/edit/session-calc.ts
|
|
16664
17484
|
var isStructural = (step) => step.structural || step.entries.some((entry) => entry.before.kind !== "cells");
|
|
17485
|
+
function hintFor(step, mode) {
|
|
17486
|
+
const hint = step.calc;
|
|
17487
|
+
if (!hint) return void 0;
|
|
17488
|
+
if (hint.kind === "rename")
|
|
17489
|
+
return mode === "undo" ? { kind: "rename", from: hint.to, to: hint.from } : hint;
|
|
17490
|
+
return mode === "undo" ? void 0 : hint;
|
|
17491
|
+
}
|
|
17492
|
+
var settingsOf = (workbook) => `${workbook.iterate ? `${workbook.iterate.count}:${workbook.iterate.delta}` : ""}|${workbook.date1904}`;
|
|
16665
17493
|
var SessionCalculator = class {
|
|
16666
17494
|
constructor(workbook, calc, enabled) {
|
|
16667
17495
|
this.workbook = workbook;
|
|
@@ -16671,31 +17499,113 @@ var SessionCalculator = class {
|
|
|
16671
17499
|
workbook;
|
|
16672
17500
|
calc;
|
|
16673
17501
|
enabled;
|
|
16674
|
-
/** Structural edits
|
|
17502
|
+
/** Structural edits the engine could not follow leave the dependency graph stale (manual mode). */
|
|
16675
17503
|
staleGraph = false;
|
|
17504
|
+
/** Cells changed in manual mode since the last calculation. */
|
|
17505
|
+
dirty = [];
|
|
17506
|
+
/** The settings at the last calculation; undefined before the first. */
|
|
17507
|
+
calculated;
|
|
16676
17508
|
/** Recalculates after an applied, undone or redone step (failures become warnings). */
|
|
16677
|
-
afterStep(step) {
|
|
16678
|
-
if (!this.enabled)
|
|
17509
|
+
afterStep(step, mode = "apply") {
|
|
17510
|
+
if (!this.enabled) {
|
|
17511
|
+
this.calc.discardPreparation();
|
|
17512
|
+
return;
|
|
17513
|
+
}
|
|
17514
|
+
const structural = isStructural(step);
|
|
17515
|
+
const hint = structural ? hintFor(step, mode) : void 0;
|
|
16679
17516
|
if (calcModeOf(this.workbook) === "manual") {
|
|
16680
|
-
if (
|
|
17517
|
+
if (hint && !this.staleGraph && !this.dirty.length) {
|
|
17518
|
+
this.guard(() => this.follow(hint));
|
|
17519
|
+
return;
|
|
17520
|
+
}
|
|
17521
|
+
this.calc.discardPreparation();
|
|
17522
|
+
if (structural) this.staleGraph = true;
|
|
17523
|
+
else this.dirty.push(...touchedCells(step));
|
|
17524
|
+
return;
|
|
17525
|
+
}
|
|
17526
|
+
if (hint && !this.staleGraph) {
|
|
17527
|
+
this.guard(() => {
|
|
17528
|
+
this.follow(hint);
|
|
17529
|
+
this.calc.recalculateFrom(touchedCells(step));
|
|
17530
|
+
this.calculated = settingsOf(this.workbook);
|
|
17531
|
+
});
|
|
17532
|
+
return;
|
|
17533
|
+
}
|
|
17534
|
+
this.recalc(structural, () => touchedCells(step));
|
|
17535
|
+
}
|
|
17536
|
+
/** Recalculates after a change applied outside the history (a collaborator's edit). */
|
|
17537
|
+
afterExternal(structural, cells) {
|
|
17538
|
+
if (!this.enabled || calcModeOf(this.workbook) === "manual") {
|
|
17539
|
+
this.calc.discardPreparation();
|
|
17540
|
+
if (!this.enabled) return;
|
|
17541
|
+
if (structural) this.staleGraph = true;
|
|
17542
|
+
else this.dirty.push(...cells);
|
|
16681
17543
|
return;
|
|
16682
17544
|
}
|
|
17545
|
+
this.recalc(structural, () => cells);
|
|
17546
|
+
}
|
|
17547
|
+
follow(hint) {
|
|
17548
|
+
if (hint.kind === "shift") this.calc.shiftCells(hint.sheet, hint.shift);
|
|
17549
|
+
else this.calc.renameSheet(hint.from, hint.to);
|
|
17550
|
+
}
|
|
17551
|
+
guard(run) {
|
|
16683
17552
|
try {
|
|
16684
|
-
|
|
16685
|
-
else {
|
|
16686
|
-
const changed = touchedCells(step);
|
|
16687
|
-
if (changed.length) this.calc.recalculateFrom(changed);
|
|
16688
|
-
}
|
|
17553
|
+
run();
|
|
16689
17554
|
} catch (error) {
|
|
16690
17555
|
const message = `Recalculation failed: ${error instanceof Error ? error.message : String(error)}`;
|
|
16691
17556
|
if (!this.workbook.warnings.includes(message)) this.workbook.warnings.push(message);
|
|
16692
17557
|
}
|
|
16693
17558
|
}
|
|
16694
|
-
/**
|
|
17559
|
+
/** Builds the dependency graph ahead of the first edit (see `EditSession.prepareCalculation`). */
|
|
17560
|
+
prepare(timeRemaining) {
|
|
17561
|
+
if (!this.enabled || calcModeOf(this.workbook) === "manual" || this.staleGraph) return true;
|
|
17562
|
+
try {
|
|
17563
|
+
return this.calc.prepare(timeRemaining);
|
|
17564
|
+
} catch {
|
|
17565
|
+
this.calc.discardPreparation();
|
|
17566
|
+
return true;
|
|
17567
|
+
}
|
|
17568
|
+
}
|
|
17569
|
+
/**
|
|
17570
|
+
* Before a structural edit the graph can follow in place: finishes a graph being prepared (or
|
|
17571
|
+
* builds it) while it still matches the workbook, so the edit moves it instead of rebuilding.
|
|
17572
|
+
*/
|
|
17573
|
+
beforeStructural() {
|
|
17574
|
+
if (!this.enabled || calcModeOf(this.workbook) === "manual" || this.staleGraph) return;
|
|
17575
|
+
this.prepare();
|
|
17576
|
+
}
|
|
17577
|
+
recalc(structural, cells) {
|
|
17578
|
+
this.guard(() => {
|
|
17579
|
+
if (this.staleGraph || structural) this.full();
|
|
17580
|
+
else {
|
|
17581
|
+
const changed = cells();
|
|
17582
|
+
if (changed.length) this.calc.recalculateFrom(changed);
|
|
17583
|
+
this.calculated = settingsOf(this.workbook);
|
|
17584
|
+
}
|
|
17585
|
+
});
|
|
17586
|
+
}
|
|
17587
|
+
/** Rebuilds the dependency graph and recalculates every formula (Ctrl+Alt+F9). */
|
|
16695
17588
|
full() {
|
|
16696
17589
|
this.staleGraph = false;
|
|
17590
|
+
this.dirty = [];
|
|
16697
17591
|
this.calc.invalidate();
|
|
16698
17592
|
this.calc.recalculateAll();
|
|
17593
|
+
this.calculated = settingsOf(this.workbook);
|
|
17594
|
+
}
|
|
17595
|
+
/**
|
|
17596
|
+
* Calculate Now (F9): the cells changed since the last calculation, the formulas structural
|
|
17597
|
+
* edits queued, their dependents and the volatile functions. Everything when `full`, before
|
|
17598
|
+
* the session's first calculation, after the iteration settings changed or while the graph
|
|
17599
|
+
* is stale.
|
|
17600
|
+
*/
|
|
17601
|
+
now(full) {
|
|
17602
|
+
if (full || this.staleGraph || this.calculated !== settingsOf(this.workbook)) {
|
|
17603
|
+
this.full();
|
|
17604
|
+
return;
|
|
17605
|
+
}
|
|
17606
|
+
const changed = this.dirty;
|
|
17607
|
+
this.dirty = [];
|
|
17608
|
+
this.calc.recalculateFrom(changed);
|
|
16699
17609
|
}
|
|
16700
17610
|
/**
|
|
16701
17611
|
* Recalculates one sheet's formulas and their dependents (Shift+F9); after structural edits
|
|
@@ -17016,8 +17926,8 @@ function nextTableName(workbook) {
|
|
|
17016
17926
|
}
|
|
17017
17927
|
function uniqueHeaders(texts) {
|
|
17018
17928
|
const used = /* @__PURE__ */ new Set();
|
|
17019
|
-
return texts.map((
|
|
17020
|
-
let base =
|
|
17929
|
+
return texts.map((text2, i2) => {
|
|
17930
|
+
let base = text2.trim() || `Column${i2 + 1}`;
|
|
17021
17931
|
if (!used.has(base.toLowerCase())) {
|
|
17022
17932
|
used.add(base.toLowerCase());
|
|
17023
17933
|
return base;
|
|
@@ -17492,8 +18402,8 @@ function normalizeDigestAlgorithmName(name) {
|
|
|
17492
18402
|
// digest/base64.ts
|
|
17493
18403
|
var ALPHABET = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
|
|
17494
18404
|
var VALUES = new Map([...ALPHABET].map((char, index2) => [char, index2]));
|
|
17495
|
-
function decodeBase64(
|
|
17496
|
-
const compact3 =
|
|
18405
|
+
function decodeBase64(text2) {
|
|
18406
|
+
const compact3 = text2.replace(/\s+/g, "");
|
|
17497
18407
|
const body2 = compact3.replace(/={1,2}$/, "");
|
|
17498
18408
|
if (body2.length % 4 === 1) return void 0;
|
|
17499
18409
|
if (compact3.length !== body2.length && compact3.length % 4 !== 0) return void 0;
|
|
@@ -19502,6 +20412,222 @@ function bordersView(border, theme2) {
|
|
|
19502
20412
|
return out;
|
|
19503
20413
|
}
|
|
19504
20414
|
|
|
20415
|
+
// xlsx/layout/sparkline-view.ts
|
|
20416
|
+
var DEFAULTS = {
|
|
20417
|
+
colorSeries: "#376092",
|
|
20418
|
+
colorNegative: "#D00000",
|
|
20419
|
+
colorAxis: "#000000",
|
|
20420
|
+
colorMarkers: "#D00000",
|
|
20421
|
+
colorFirst: "#D00000",
|
|
20422
|
+
colorLast: "#D00000",
|
|
20423
|
+
colorHigh: "#D00000",
|
|
20424
|
+
colorLow: "#D00000"
|
|
20425
|
+
};
|
|
20426
|
+
var COLUMN_GAP = 0.2;
|
|
20427
|
+
function extent(values2) {
|
|
20428
|
+
let min = Infinity;
|
|
20429
|
+
let max = -Infinity;
|
|
20430
|
+
for (const v of values2) {
|
|
20431
|
+
if (v === null) continue;
|
|
20432
|
+
if (v < min) min = v;
|
|
20433
|
+
if (v > max) max = v;
|
|
20434
|
+
}
|
|
20435
|
+
return min <= max ? { min, max } : void 0;
|
|
20436
|
+
}
|
|
20437
|
+
function sparklineValues(group, values2) {
|
|
20438
|
+
return group.displayEmptyCellsAs === "zero" ? values2.map((v) => v ?? 0) : [...values2];
|
|
20439
|
+
}
|
|
20440
|
+
function sparklineScale(group, all2, index2) {
|
|
20441
|
+
const own = extent(sparklineValues(group, all2[index2]?.values ?? []));
|
|
20442
|
+
const needsGroup = group.minAxisType === "group" || group.maxAxisType === "group";
|
|
20443
|
+
const shared = needsGroup ? extent(all2.flatMap((data) => sparklineValues(group, data.values))) : void 0;
|
|
20444
|
+
const end = (type, manual, key) => {
|
|
20445
|
+
if (type === "custom" && manual !== void 0) return manual;
|
|
20446
|
+
if (type === "group" && shared) return shared[key];
|
|
20447
|
+
return own?.[key];
|
|
20448
|
+
};
|
|
20449
|
+
const min = end(group.minAxisType, group.manualMin, "min");
|
|
20450
|
+
const max = end(group.maxAxisType, group.manualMax, "max");
|
|
20451
|
+
return min === void 0 || max === void 0 ? void 0 : { min, max };
|
|
20452
|
+
}
|
|
20453
|
+
function positions(group, data, n) {
|
|
20454
|
+
const dates = data.dates;
|
|
20455
|
+
if (group.dateAxis && dates && dates.length === n) {
|
|
20456
|
+
const span4 = extent(dates);
|
|
20457
|
+
if (span4) {
|
|
20458
|
+
const width = span4.max - span4.min;
|
|
20459
|
+
return dates.map((d) => d === null ? null : width ? (d - span4.min) / width : 0.5);
|
|
20460
|
+
}
|
|
20461
|
+
}
|
|
20462
|
+
return Array.from({ length: n }, (_, i2) => n === 1 ? 0.5 : i2 / (n - 1));
|
|
20463
|
+
}
|
|
20464
|
+
function pointFacts(values2) {
|
|
20465
|
+
const numbers3 = values2.filter((x) => x !== null);
|
|
20466
|
+
let last = values2.length - 1;
|
|
20467
|
+
while (last >= 0 && values2[last] === null) last--;
|
|
20468
|
+
return {
|
|
20469
|
+
high: Math.max(...numbers3),
|
|
20470
|
+
low: Math.min(...numbers3),
|
|
20471
|
+
first: values2.findIndex((x) => x !== null),
|
|
20472
|
+
last
|
|
20473
|
+
};
|
|
20474
|
+
}
|
|
20475
|
+
function pointColor(group, v, i2, facts, colors, markers) {
|
|
20476
|
+
let color = markers && group.markers ? colors.colorMarkers : void 0;
|
|
20477
|
+
if (group.negative && v < 0) color = colors.colorNegative;
|
|
20478
|
+
if (group.high && v === facts.high) color = colors.colorHigh;
|
|
20479
|
+
if (group.low && v === facts.low) color = colors.colorLow;
|
|
20480
|
+
if (group.first && i2 === facts.first) color = colors.colorFirst;
|
|
20481
|
+
if (group.last && i2 === facts.last) color = colors.colorLast;
|
|
20482
|
+
return color;
|
|
20483
|
+
}
|
|
20484
|
+
function resolveColors(group, theme2) {
|
|
20485
|
+
const out = { ...DEFAULTS };
|
|
20486
|
+
for (const key of Object.keys(DEFAULTS)) {
|
|
20487
|
+
const color = group[key];
|
|
20488
|
+
out[key] = resolveColor(color, theme2, DEFAULTS[key]) ?? DEFAULTS[key];
|
|
20489
|
+
}
|
|
20490
|
+
return out;
|
|
20491
|
+
}
|
|
20492
|
+
function sparklineView(group, data, scale2, theme2) {
|
|
20493
|
+
const colors = resolveColors(group, theme2);
|
|
20494
|
+
const view = {
|
|
20495
|
+
type: group.type,
|
|
20496
|
+
color: colors.colorSeries,
|
|
20497
|
+
lineWeightPt: group.lineWeight,
|
|
20498
|
+
lines: [],
|
|
20499
|
+
markers: [],
|
|
20500
|
+
columns: []
|
|
20501
|
+
};
|
|
20502
|
+
const values2 = sparklineValues(group, data.values);
|
|
20503
|
+
const n = values2.length;
|
|
20504
|
+
if (!n || !scale2) return view;
|
|
20505
|
+
const facts = pointFacts(values2);
|
|
20506
|
+
const xs = positions(group, data, n);
|
|
20507
|
+
const flip = (x) => group.rightToLeft ? 1 - x : x;
|
|
20508
|
+
const range2 = scale2.max - scale2.min;
|
|
20509
|
+
const yOf = (v) => range2 ? Math.max(0, Math.min(1, (scale2.max - v) / range2)) : 0.5;
|
|
20510
|
+
if (group.type === "line") {
|
|
20511
|
+
let segment = [];
|
|
20512
|
+
values2.forEach((v, i2) => {
|
|
20513
|
+
const x = xs[i2];
|
|
20514
|
+
if (v === null || x === null || x === void 0) {
|
|
20515
|
+
if (group.displayEmptyCellsAs === "gap" && segment.length) {
|
|
20516
|
+
view.lines.push(segment);
|
|
20517
|
+
segment = [];
|
|
20518
|
+
}
|
|
20519
|
+
return;
|
|
20520
|
+
}
|
|
20521
|
+
const point = { x: flip(x), y: yOf(v) };
|
|
20522
|
+
segment.push(point);
|
|
20523
|
+
const color = pointColor(group, v, i2, facts, colors, true);
|
|
20524
|
+
if (color) view.markers.push({ ...point, color });
|
|
20525
|
+
});
|
|
20526
|
+
if (segment.length) view.lines.push(segment);
|
|
20527
|
+
} else {
|
|
20528
|
+
const slot = 1 / n;
|
|
20529
|
+
const w = slot * (1 - COLUMN_GAP);
|
|
20530
|
+
const base = yOf(Math.max(scale2.min, Math.min(scale2.max, 0)));
|
|
20531
|
+
values2.forEach((v, i2) => {
|
|
20532
|
+
const position = xs[i2];
|
|
20533
|
+
if (v === null || position === null || position === void 0) return;
|
|
20534
|
+
if (v === 0) return;
|
|
20535
|
+
let top;
|
|
20536
|
+
let bottom;
|
|
20537
|
+
if (group.type === "stacked") [top, bottom] = v > 0 ? [0, 0.5] : [0.5, 1];
|
|
20538
|
+
else if (!range2) [top, bottom] = [0, 1];
|
|
20539
|
+
else [top, bottom] = [Math.min(base, yOf(v)), Math.max(base, yOf(v))];
|
|
20540
|
+
const centre = flip(slot / 2 + position * (1 - slot));
|
|
20541
|
+
const color = pointColor(group, v, i2, facts, colors, false) ?? view.color;
|
|
20542
|
+
view.columns.push({ x: centre - w / 2, y: top, w, h: bottom - top, color });
|
|
20543
|
+
});
|
|
20544
|
+
}
|
|
20545
|
+
if (group.type === "stacked") {
|
|
20546
|
+
if (group.displayXAxis) view.axis = { y: 0.5, color: colors.colorAxis };
|
|
20547
|
+
} else if (group.displayXAxis && range2 && scale2.min <= 0 && scale2.max >= 0)
|
|
20548
|
+
view.axis = { y: yOf(0), color: colors.colorAxis };
|
|
20549
|
+
return view;
|
|
20550
|
+
}
|
|
20551
|
+
|
|
20552
|
+
// xlsx/layout/sparkline-data.ts
|
|
20553
|
+
var MAX_POINTS = 1e4;
|
|
20554
|
+
var hostIndex = /* @__PURE__ */ new WeakMap();
|
|
20555
|
+
function hosts(sheet) {
|
|
20556
|
+
const groups = sheetSparklineGroups(sheet);
|
|
20557
|
+
let index2 = hostIndex.get(groups);
|
|
20558
|
+
if (!index2) {
|
|
20559
|
+
index2 = /* @__PURE__ */ new Map();
|
|
20560
|
+
for (const group of groups)
|
|
20561
|
+
group.sparklines.forEach((line2, i2) => {
|
|
20562
|
+
const key = cellKey(line2.host.start.row, line2.host.start.col);
|
|
20563
|
+
if (!index2.has(key)) index2.set(key, { group, index: i2 });
|
|
20564
|
+
});
|
|
20565
|
+
hostIndex.set(groups, index2);
|
|
20566
|
+
}
|
|
20567
|
+
return index2;
|
|
20568
|
+
}
|
|
20569
|
+
function hasSparklineAt(sheet, row2, col) {
|
|
20570
|
+
return hosts(sheet).has(cellKey(row2, col));
|
|
20571
|
+
}
|
|
20572
|
+
function resolveSparklineRange(workbook, sheet, formula) {
|
|
20573
|
+
const ref = formula.trim().replace(/^=/, "");
|
|
20574
|
+
const bang = ref.lastIndexOf("!");
|
|
20575
|
+
let target2 = sheet;
|
|
20576
|
+
if (bang >= 0) {
|
|
20577
|
+
const raw = ref.slice(0, bang);
|
|
20578
|
+
const name = /^'.*'$/.test(raw) ? raw.slice(1, -1).replace(/''/g, "'") : raw;
|
|
20579
|
+
target2 = sheetByName(workbook, name);
|
|
20580
|
+
}
|
|
20581
|
+
const range2 = parseRange(ref.slice(bang + 1).replace(/\$/g, ""));
|
|
20582
|
+
return target2 && range2 ? { sheet: target2, range: normalizeRange(range2) } : void 0;
|
|
20583
|
+
}
|
|
20584
|
+
var rowHidden = (sheet, row2) => sheet.rowInfo.get(row2)?.hidden === true;
|
|
20585
|
+
var colHidden = (sheet, col) => sheet.columns.some((c) => c.hidden === true && col >= c.min && col <= c.max);
|
|
20586
|
+
function readSparklineValues(sheet, range2, displayHidden) {
|
|
20587
|
+
let endRow = range2.end.row;
|
|
20588
|
+
if (endRow - range2.start.row >= MAX_POINTS) {
|
|
20589
|
+
let lastRow = range2.start.row;
|
|
20590
|
+
for (const row2 of sheet.rows.keys()) if (row2 > lastRow) lastRow = row2;
|
|
20591
|
+
endRow = Math.min(endRow, lastRow);
|
|
20592
|
+
}
|
|
20593
|
+
const out = [];
|
|
20594
|
+
for (let row2 = range2.start.row; row2 <= endRow && out.length < MAX_POINTS; row2++) {
|
|
20595
|
+
if (!displayHidden && rowHidden(sheet, row2)) continue;
|
|
20596
|
+
for (let col = range2.start.col; col <= range2.end.col && out.length < MAX_POINTS; col++) {
|
|
20597
|
+
if (!displayHidden && colHidden(sheet, col)) continue;
|
|
20598
|
+
const value2 = getCell(sheet, row2, col)?.value;
|
|
20599
|
+
out.push(typeof value2 === "number" && Number.isFinite(value2) ? value2 : null);
|
|
20600
|
+
}
|
|
20601
|
+
}
|
|
20602
|
+
return out;
|
|
20603
|
+
}
|
|
20604
|
+
function groupData(workbook, sheet, group) {
|
|
20605
|
+
const dateRange = group.dateAxis && group.dateFormula;
|
|
20606
|
+
const dates = dateRange ? resolveSparklineRange(workbook, sheet, dateRange) : void 0;
|
|
20607
|
+
const dateValues = dates ? readSparklineValues(dates.sheet, dates.range, group.displayHidden) : void 0;
|
|
20608
|
+
return group.sparklines.map((line2) => {
|
|
20609
|
+
const source = line2.formula ? resolveSparklineRange(workbook, sheet, line2.formula) : void 0;
|
|
20610
|
+
const values2 = source ? readSparklineValues(source.sheet, source.range, group.displayHidden) : [];
|
|
20611
|
+
return dateValues ? { values: values2, dates: dateValues } : { values: values2 };
|
|
20612
|
+
});
|
|
20613
|
+
}
|
|
20614
|
+
function sparklineViewAt(workbook, sheetIndex2, row2, col) {
|
|
20615
|
+
const sheet = workbook.sheets[sheetIndex2];
|
|
20616
|
+
if (!sheet) return void 0;
|
|
20617
|
+
const entry = hosts(sheet).get(cellKey(row2, col));
|
|
20618
|
+
if (!entry) return void 0;
|
|
20619
|
+
const { group, index: index2 } = entry;
|
|
20620
|
+
const needsGroup = group.minAxisType === "group" || group.maxAxisType === "group";
|
|
20621
|
+
const data = needsGroup ? groupData(workbook, sheet, group) : groupData(workbook, sheet, { ...group, sparklines: [group.sparklines[index2]] });
|
|
20622
|
+
const at = needsGroup ? index2 : 0;
|
|
20623
|
+
return sparklineView(
|
|
20624
|
+
group,
|
|
20625
|
+
data[at] ?? { values: [] },
|
|
20626
|
+
sparklineScale(group, data, at),
|
|
20627
|
+
workbook.theme
|
|
20628
|
+
);
|
|
20629
|
+
}
|
|
20630
|
+
|
|
19505
20631
|
// xlsx/layout/units.ts
|
|
19506
20632
|
var DEFAULT_MAX_DIGIT_WIDTH = 7;
|
|
19507
20633
|
var DEFAULT_BASE_COL_WIDTH = 8;
|
|
@@ -19605,6 +20731,8 @@ function cellView(workbook, sheetIndex2, row2, col, cf, options = {}) {
|
|
|
19605
20731
|
if (fill) view.fill = fill;
|
|
19606
20732
|
if (conditional?.dataBar) view.dataBar = conditional.dataBar;
|
|
19607
20733
|
if (conditional?.icon) view.icon = conditional.icon;
|
|
20734
|
+
const sparkline = sparklineViewAt(workbook, sheetIndex2, row2, col);
|
|
20735
|
+
if (sparkline) view.sparkline = sparkline;
|
|
19608
20736
|
const link = sheet.hyperlinks.find((h2) => rangeContains(h2.range, { row: row2, col }));
|
|
19609
20737
|
if (link) {
|
|
19610
20738
|
view.hasHyperlink = true;
|
|
@@ -19811,9 +20939,9 @@ function lineHeightPoints(sizePt) {
|
|
|
19811
20939
|
}
|
|
19812
20940
|
return Math.max(0.75, Math.ceil(height / 0.75 - 1e-9) * 0.75);
|
|
19813
20941
|
}
|
|
19814
|
-
function wrappedLineCount(
|
|
20942
|
+
function wrappedLineCount(text2, width, measure2) {
|
|
19815
20943
|
let lines = 0;
|
|
19816
|
-
for (const paragraph of
|
|
20944
|
+
for (const paragraph of text2.split(/\r?\n/)) {
|
|
19817
20945
|
lines++;
|
|
19818
20946
|
if (width <= 0) continue;
|
|
19819
20947
|
let current = "";
|
|
@@ -19854,13 +20982,13 @@ function autoFitRowHeight(workbook, sheetIndex2, row2, measure2) {
|
|
|
19854
20982
|
let lines = 1;
|
|
19855
20983
|
if (view.wrap) {
|
|
19856
20984
|
const width = metrics.colWidth(col) - COLUMN_PADDING_PX - 1 - view.indentPx;
|
|
19857
|
-
lines = wrappedLineCount(view.text, width, (
|
|
20985
|
+
lines = wrappedLineCount(view.text, width, (text2) => measure2(text2, view.font));
|
|
19858
20986
|
}
|
|
19859
20987
|
tallest = Math.max(tallest, lines * lineHeightPoints(sizePt));
|
|
19860
20988
|
}
|
|
19861
20989
|
return tallest > 0 ? tallest : sheet.defaultRowHeight;
|
|
19862
20990
|
}
|
|
19863
|
-
var approximateMeasure = (
|
|
20991
|
+
var approximateMeasure = (text2, font) => text2.length * font.sizePx * (font.bold ? 0.58 : 0.53);
|
|
19864
20992
|
|
|
19865
20993
|
// xlsx/edit/row-autofit.ts
|
|
19866
20994
|
var MAX_HEIGHT2 = 409;
|
|
@@ -19986,12 +21114,12 @@ function renameSheet(ctx, index2, name) {
|
|
|
19986
21114
|
ctx.run(
|
|
19987
21115
|
"Rename sheet",
|
|
19988
21116
|
"sheets",
|
|
19989
|
-
[{ kind: "
|
|
21117
|
+
[{ kind: "refs" }],
|
|
19990
21118
|
() => {
|
|
19991
21119
|
rewriteFormulas(workbook, (formula) => renameSheetInFormula(formula, old, name));
|
|
19992
21120
|
sheet.name = name;
|
|
19993
21121
|
},
|
|
19994
|
-
{ sheet: index2, structural: true }
|
|
21122
|
+
{ sheet: index2, structural: true, calc: { kind: "rename", from: old, to: name } }
|
|
19995
21123
|
);
|
|
19996
21124
|
}
|
|
19997
21125
|
function moveSheet(ctx, from, to) {
|
|
@@ -20123,19 +21251,19 @@ function setTabColor(ctx, index2, color) {
|
|
|
20123
21251
|
|
|
20124
21252
|
// xlsx/edit/validation-list.ts
|
|
20125
21253
|
function listSource(workbook, sheet, formula, evaluate, at, depth = 0) {
|
|
20126
|
-
const
|
|
20127
|
-
const literal2 = /^"((?:[^"]|"")*)"$/.exec(
|
|
21254
|
+
const text2 = formula.replace(/^=/, "").trim();
|
|
21255
|
+
const literal2 = /^"((?:[^"]|"")*)"$/.exec(text2);
|
|
20128
21256
|
if (literal2)
|
|
20129
21257
|
return (literal2[1] ?? "").replace(/""/g, '"').split(",").map((s) => s.trim()).filter((s) => s !== "").map((s) => ({ text: s, value: parseCellInput(s, { date1904: workbook.date1904 }).value }));
|
|
20130
21258
|
const named2 = workbook.definedNames.find(
|
|
20131
|
-
(n) => n.name.toLowerCase() ===
|
|
21259
|
+
(n) => n.name.toLowerCase() === text2.toLowerCase() && (n.localSheet === void 0 || n.localSheet === sheet)
|
|
20132
21260
|
);
|
|
20133
21261
|
if (named2 && depth < 4)
|
|
20134
21262
|
return listSource(workbook, sheet, named2.formula, evaluate, at, depth + 1);
|
|
20135
|
-
const ref = /^(?:'((?:[^']|'')+)'|([^'!]+))!(.+)$/.exec(
|
|
21263
|
+
const ref = /^(?:'((?:[^']|'')+)'|([^'!]+))!(.+)$/.exec(text2);
|
|
20136
21264
|
const sheetName = ref ? ref[1]?.replace(/''/g, "'") ?? ref[2] : void 0;
|
|
20137
21265
|
const target2 = sheetName ? sheetByName(workbook, sheetName) : workbook.sheets[sheet];
|
|
20138
|
-
const range2 = parseRange((ref ? ref[3] ?? "" :
|
|
21266
|
+
const range2 = parseRange((ref ? ref[3] ?? "" : text2).replace(/\$/g, ""));
|
|
20139
21267
|
if (target2 && range2) {
|
|
20140
21268
|
const out = [];
|
|
20141
21269
|
forEachCellInRange(target2, range2, (cell) => {
|
|
@@ -20146,7 +21274,7 @@ function listSource(workbook, sheet, formula, evaluate, at, depth = 0) {
|
|
|
20146
21274
|
}
|
|
20147
21275
|
if (!evaluate) return void 0;
|
|
20148
21276
|
try {
|
|
20149
|
-
const value2 = evaluate(
|
|
21277
|
+
const value2 = evaluate(text2, at);
|
|
20150
21278
|
return value2 === null ? [] : [{ text: rawText(value2), value: value2 }];
|
|
20151
21279
|
} catch {
|
|
20152
21280
|
return void 0;
|
|
@@ -20185,12 +21313,12 @@ function validationAt(workbook, sheet, row2, col) {
|
|
|
20185
21313
|
}
|
|
20186
21314
|
function operand3(formula, evaluate, at) {
|
|
20187
21315
|
if (formula === void 0) return void 0;
|
|
20188
|
-
const
|
|
20189
|
-
if (
|
|
20190
|
-
const quoted = /^"((?:[^"]|"")*)"$/.exec(
|
|
21316
|
+
const text2 = formula.replace(/^=/, "").trim();
|
|
21317
|
+
if (text2 !== "" && Number.isFinite(Number(text2))) return Number(text2);
|
|
21318
|
+
const quoted = /^"((?:[^"]|"")*)"$/.exec(text2);
|
|
20191
21319
|
if (quoted) return (quoted[1] ?? "").replace(/""/g, '"');
|
|
20192
21320
|
try {
|
|
20193
|
-
return evaluate(
|
|
21321
|
+
return evaluate(text2, at);
|
|
20194
21322
|
} catch {
|
|
20195
21323
|
return void 0;
|
|
20196
21324
|
}
|
|
@@ -20232,8 +21360,8 @@ function relativeTo(dv, formula, at) {
|
|
|
20232
21360
|
const dRow = at.row - top;
|
|
20233
21361
|
const dCol = at.col - left2;
|
|
20234
21362
|
if (dRow === 0 && dCol === 0) return formula;
|
|
20235
|
-
const
|
|
20236
|
-
return translateFormula(
|
|
21363
|
+
const text2 = formula.replace(/^=/, "");
|
|
21364
|
+
return translateFormula(text2, dRow, dCol);
|
|
20237
21365
|
}
|
|
20238
21366
|
function withProposedValue(workbook, at, value2, fn) {
|
|
20239
21367
|
const sheet = workbook.sheets[at.sheet];
|
|
@@ -20367,13 +21495,12 @@ function createEditSession(workbook, options = {}) {
|
|
|
20367
21495
|
for (const listener of [...listeners2]) listener(change);
|
|
20368
21496
|
};
|
|
20369
21497
|
const calculator = new SessionCalculator(workbook, calc, autoRecalc);
|
|
20370
|
-
const recalc = (step) => calculator.afterStep(step);
|
|
20371
|
-
const begin = (label2, kind, info) =>
|
|
20372
|
-
step
|
|
20373
|
-
|
|
20374
|
-
sheet: info.sheet,
|
|
20375
|
-
|
|
20376
|
-
});
|
|
21498
|
+
const recalc = (step, mode = "apply") => calculator.afterStep(step, mode);
|
|
21499
|
+
const begin = (label2, kind, info) => {
|
|
21500
|
+
const step = { label: label2, entries: [], structural: info.structural ?? false };
|
|
21501
|
+
if (info.calc) step.calc = info.calc;
|
|
21502
|
+
return { step, kind, sheet: info.sheet, ranges: [...info.ranges ?? []] };
|
|
21503
|
+
};
|
|
20377
21504
|
const finish = (current) => {
|
|
20378
21505
|
if (!current.step.entries.length) return;
|
|
20379
21506
|
history.push(current.step);
|
|
@@ -20398,10 +21525,12 @@ function createEditSession(workbook, options = {}) {
|
|
|
20398
21525
|
const outer = !open;
|
|
20399
21526
|
const current = open ?? begin(label2, kind, info);
|
|
20400
21527
|
if (!outer) {
|
|
21528
|
+
delete current.step.calc;
|
|
20401
21529
|
if (info.structural) current.step.structural = true;
|
|
20402
21530
|
if (current.sheet === void 0 && info.sheet !== void 0) current.sheet = info.sheet;
|
|
20403
21531
|
current.ranges.push(...info.ranges ?? []);
|
|
20404
21532
|
}
|
|
21533
|
+
if (outer && info.calc) calculator.beforeStructural();
|
|
20405
21534
|
open = current;
|
|
20406
21535
|
const mark = current.step.entries.length;
|
|
20407
21536
|
const befores = scopes.map((scope) => captureScope(workbook, scope));
|
|
@@ -20449,14 +21578,14 @@ function createEditSession(workbook, options = {}) {
|
|
|
20449
21578
|
if (open) throw new Error(`Cannot ${kind} inside a batch`);
|
|
20450
21579
|
const step = kind === "undo" ? history.undo(workbook) : history.redo(workbook);
|
|
20451
21580
|
if (!step) return false;
|
|
20452
|
-
recalc(step);
|
|
21581
|
+
recalc(step, kind);
|
|
20453
21582
|
emit({ kind, label: step.label, structural: step.structural });
|
|
20454
21583
|
return true;
|
|
20455
21584
|
};
|
|
20456
21585
|
return {
|
|
20457
21586
|
workbook,
|
|
20458
21587
|
calc,
|
|
20459
|
-
setCellInput: (s, r, c,
|
|
21588
|
+
setCellInput: (s, r, c, text2) => setCellInput(ctx, s, r, c, text2),
|
|
20460
21589
|
setCellValue: (s, r, c, value2) => setCellValue(ctx, s, r, c, value2),
|
|
20461
21590
|
setRangeValues: (s, at, rows2) => setRangeValues(ctx, s, at, rows2),
|
|
20462
21591
|
clearRange: (s, range2, what) => clearRange(ctx, s, range2, what),
|
|
@@ -20489,7 +21618,7 @@ function createEditSession(workbook, options = {}) {
|
|
|
20489
21618
|
setSheetState: (i2, state) => setSheetState(ctx, i2, state),
|
|
20490
21619
|
setTabColor: (i2, color) => setTabColor(ctx, i2, color),
|
|
20491
21620
|
setFreeze: (s, freeze) => setFreeze(ctx, s, freeze),
|
|
20492
|
-
setComment: (s, at,
|
|
21621
|
+
setComment: (s, at, text2, author) => setComment(ctx, s, at, text2, author),
|
|
20493
21622
|
setHyperlink: (s, range2, link) => setHyperlink(ctx, s, range2, link),
|
|
20494
21623
|
addConditionalFormat: (s, cf) => addConditionalFormat(ctx, s, cf),
|
|
20495
21624
|
clearConditionalFormats: (s, range2) => clearConditionalFormats(ctx, s, range2),
|
|
@@ -20528,10 +21657,11 @@ function createEditSession(workbook, options = {}) {
|
|
|
20528
21657
|
setDocumentProperties: (patch) => setDocumentProperties(ctx, patch),
|
|
20529
21658
|
setAutoRecalc: (enabled) => setCalcMode(ctx, enabled ? "auto" : "manual"),
|
|
20530
21659
|
autoRecalc: () => autoRecalc && calcModeOf(workbook) === "auto",
|
|
20531
|
-
calculateNow() {
|
|
20532
|
-
calculator.full
|
|
21660
|
+
calculateNow(options2) {
|
|
21661
|
+
calculator.now(options2?.full ?? false);
|
|
20533
21662
|
emit({ kind: "cells", label: "Calculate now", structural: false });
|
|
20534
21663
|
},
|
|
21664
|
+
prepareCalculation: (opts) => calculator.prepare(opts?.timeRemaining),
|
|
20535
21665
|
calculateSheet(s) {
|
|
20536
21666
|
calculator.sheet(s);
|
|
20537
21667
|
emit({ kind: "cells", label: "Calculate sheet", sheet: s, structural: false });
|
|
@@ -20566,18 +21696,19 @@ function createEditSession(workbook, options = {}) {
|
|
|
20566
21696
|
onChange(listener) {
|
|
20567
21697
|
listeners2.add(listener);
|
|
20568
21698
|
return () => listeners2.delete(listener);
|
|
20569
|
-
}
|
|
21699
|
+
},
|
|
21700
|
+
applyExternal: (apply) => applyExternal({ calculator, emit, busy: () => !!open }, apply)
|
|
20570
21701
|
};
|
|
20571
21702
|
}
|
|
20572
21703
|
|
|
20573
21704
|
// xlsx/layout/cf-helpers.ts
|
|
20574
21705
|
function literal(formula) {
|
|
20575
|
-
const
|
|
20576
|
-
if (/^[+-]?(\d+\.?\d*|\.\d+)(e[+-]?\d+)?$/i.test(
|
|
20577
|
-
const quoted = /^"((?:[^"]|"")*)"$/.exec(
|
|
21706
|
+
const text2 = formula.trim();
|
|
21707
|
+
if (/^[+-]?(\d+\.?\d*|\.\d+)(e[+-]?\d+)?$/i.test(text2)) return Number(text2);
|
|
21708
|
+
const quoted = /^"((?:[^"]|"")*)"$/.exec(text2);
|
|
20578
21709
|
if (quoted) return (quoted[1] ?? "").replace(/""/g, '"');
|
|
20579
|
-
if (/^TRUE$/i.test(
|
|
20580
|
-
if (/^FALSE$/i.test(
|
|
21710
|
+
if (/^TRUE$/i.test(text2)) return true;
|
|
21711
|
+
if (/^FALSE$/i.test(text2)) return false;
|
|
20581
21712
|
return void 0;
|
|
20582
21713
|
}
|
|
20583
21714
|
function localTodaySerial(date1904) {
|
|
@@ -20924,12 +22055,12 @@ function createConditionalFormatEvaluator(workbook, sheetIndex2, evaluate, optio
|
|
|
20924
22055
|
case "beginsWith":
|
|
20925
22056
|
case "endsWith": {
|
|
20926
22057
|
if (isCellError(value2)) return false;
|
|
20927
|
-
const
|
|
22058
|
+
const text2 = valueText(value2).toLowerCase();
|
|
20928
22059
|
const needle = rule.text.toLowerCase();
|
|
20929
|
-
if (rule.type === "containsText") return
|
|
20930
|
-
if (rule.type === "notContainsText") return !
|
|
20931
|
-
if (rule.type === "beginsWith") return
|
|
20932
|
-
return
|
|
22060
|
+
if (rule.type === "containsText") return text2.includes(needle);
|
|
22061
|
+
if (rule.type === "notContainsText") return !text2.includes(needle);
|
|
22062
|
+
if (rule.type === "beginsWith") return text2.startsWith(needle);
|
|
22063
|
+
return text2.endsWith(needle);
|
|
20933
22064
|
}
|
|
20934
22065
|
case "timePeriod":
|
|
20935
22066
|
return typeof value2 === "number" && inTimePeriod(rule.timePeriod, value2, today(), workbook.date1904);
|
|
@@ -21060,7 +22191,7 @@ function overflowExtent(sheet, metrics, row2, col, textWidth, hAlign, maxSpan =
|
|
|
21060
22191
|
return result2();
|
|
21061
22192
|
}
|
|
21062
22193
|
|
|
21063
|
-
//
|
|
22194
|
+
// text/css-font-family.ts
|
|
21064
22195
|
var FALLBACKS = {
|
|
21065
22196
|
calibri: '"Calibri", "Carlito", "Segoe UI", Arial, sans-serif',
|
|
21066
22197
|
"calibri light": '"Calibri Light", "Calibri", "Carlito", "Segoe UI", Arial, sans-serif',
|
|
@@ -21461,7 +22592,7 @@ function styleCssFont(style2) {
|
|
|
21461
22592
|
}
|
|
21462
22593
|
function measure(ctx) {
|
|
21463
22594
|
const grid6 = ctx.grid();
|
|
21464
|
-
return grid6 ? (
|
|
22595
|
+
return grid6 ? (text2, style2) => grid6.measureText(text2, styleCssFont(style2)) : void 0;
|
|
21465
22596
|
}
|
|
21466
22597
|
var UNSET = void 0;
|
|
21467
22598
|
|
|
@@ -21840,19 +22971,19 @@ function mergeMessageModules(modules) {
|
|
|
21840
22971
|
for (const value2 of Object.values(module)) {
|
|
21841
22972
|
if (!value2 || typeof value2 !== "object" || Array.isArray(value2)) continue;
|
|
21842
22973
|
const entries = Object.entries(value2);
|
|
21843
|
-
if (!entries.every(([,
|
|
21844
|
-
for (const [key,
|
|
22974
|
+
if (!entries.every(([, text2]) => typeof text2 === "string")) continue;
|
|
22975
|
+
for (const [key, text2] of entries) merged[key] = text2;
|
|
21845
22976
|
}
|
|
21846
22977
|
}
|
|
21847
22978
|
return merged;
|
|
21848
22979
|
}
|
|
21849
22980
|
|
|
21850
22981
|
// i18n/translator.ts
|
|
21851
|
-
var
|
|
22982
|
+
var SINGLE2 = /\{(\w+)\}/g;
|
|
21852
22983
|
var DOUBLE = /\{\{\s*(\w+)\s*\}\}/g;
|
|
21853
22984
|
function interpolate(template, params, placeholder = "single") {
|
|
21854
22985
|
if (!params) return template;
|
|
21855
|
-
const pattern = placeholder === "double" ? DOUBLE :
|
|
22986
|
+
const pattern = placeholder === "double" ? DOUBLE : SINGLE2;
|
|
21856
22987
|
return template.replace(
|
|
21857
22988
|
pattern,
|
|
21858
22989
|
(match2, name) => Object.prototype.hasOwnProperty.call(params, name) && params[name] !== void 0 ? String(params[name]) : match2
|
|
@@ -21861,15 +22992,45 @@ function interpolate(template, params, placeholder = "single") {
|
|
|
21861
22992
|
function createTranslator(messages, fallbacks = [], options = {}) {
|
|
21862
22993
|
const placeholder = options.placeholder ?? "single";
|
|
21863
22994
|
return (key, params) => {
|
|
21864
|
-
let
|
|
21865
|
-
for (let i2 = 0;
|
|
21866
|
-
return interpolate(
|
|
22995
|
+
let text2 = messages?.[key];
|
|
22996
|
+
for (let i2 = 0; text2 === void 0 && i2 < fallbacks.length; i2++) text2 = fallbacks[i2]?.[key];
|
|
22997
|
+
return interpolate(text2 ?? options.missing?.(key) ?? key, params, placeholder);
|
|
21867
22998
|
};
|
|
21868
22999
|
}
|
|
21869
23000
|
|
|
21870
23001
|
// xlsx/ui/locales/merge.ts
|
|
21871
23002
|
var mergeStringModules = mergeMessageModules;
|
|
21872
23003
|
|
|
23004
|
+
// xlsx/ui/locales/de/collab.ts
|
|
23005
|
+
var collab_exports = {};
|
|
23006
|
+
__export(collab_exports, {
|
|
23007
|
+
collab: () => collab
|
|
23008
|
+
});
|
|
23009
|
+
var collab = {
|
|
23010
|
+
Share: "Freigeben",
|
|
23011
|
+
"Session name": "Sitzungsname",
|
|
23012
|
+
"Start sharing": "Freigabe starten",
|
|
23013
|
+
"Stop sharing": "Freigabe beenden",
|
|
23014
|
+
"People in this session": "Personen in dieser Sitzung",
|
|
23015
|
+
"Session: {room}": "Sitzung: {room}",
|
|
23016
|
+
"Not sharing.": "Keine Freigabe aktiv.",
|
|
23017
|
+
"Connecting...": "Verbindung wird hergestellt...",
|
|
23018
|
+
"Connected.": "Verbunden.",
|
|
23019
|
+
"Joining the session...": "Sitzung wird beigetreten...",
|
|
23020
|
+
"Disconnected. Changes are kept and sent when the connection returns.": "Getrennt. \xC4nderungen bleiben erhalten und werden gesendet, sobald die Verbindung zur\xFCck ist.",
|
|
23021
|
+
"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.",
|
|
23022
|
+
"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.",
|
|
23023
|
+
"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.",
|
|
23024
|
+
"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.",
|
|
23025
|
+
"Reconnected. Changes made while offline were sent.": "Wieder verbunden. Offline vorgenommene \xC4nderungen wurden gesendet.",
|
|
23026
|
+
"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.",
|
|
23027
|
+
"Sharing stopped because another workbook was opened.": "Die Freigabe wurde beendet, weil eine andere Arbeitsmappe ge\xF6ffnet wurde.",
|
|
23028
|
+
"Open or create a workbook before sharing it.": "\xD6ffnen oder erstellen Sie eine Arbeitsmappe, bevor Sie sie freigeben.",
|
|
23029
|
+
"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.",
|
|
23030
|
+
"This browser cannot share between windows; pass a server URL.": "Dieser Browser kann nicht zwischen Fenstern teilen; geben Sie eine Server-URL an.",
|
|
23031
|
+
"Stop the current collaboration session first.": "Beenden Sie zuerst die aktuelle Zusammenarbeitssitzung."
|
|
23032
|
+
};
|
|
23033
|
+
|
|
21873
23034
|
// xlsx/ui/locales/de/commands.ts
|
|
21874
23035
|
var commands_exports = {};
|
|
21875
23036
|
__export(commands_exports, {
|
|
@@ -23439,11 +24600,17 @@ var NAVIGATION_STRINGS = {
|
|
|
23439
24600
|
Hyperlinks: ["Liens hypertexte", "Hyperlinks", "Hiperv\xEDnculos", "\u8D85\u94FE\u63A5"],
|
|
23440
24601
|
"Sort and filter": ["Tri et filtre", "Sortieren und Filtern", "Ordenar y filtrar", "\u6392\u5E8F\u548C\u7B5B\u9009"],
|
|
23441
24602
|
"Freeze panes": ["Figer les volets", "Fenster fixieren", "Inmovilizar paneles", "\u51BB\u7ED3\u7A97\u683C"],
|
|
23442
|
-
"Pivot tables
|
|
23443
|
-
"Tableaux crois\xE9s dynamiques
|
|
23444
|
-
"PivotTables
|
|
23445
|
-
"Tablas din\xE1micas
|
|
23446
|
-
"\u6570\u636E\u900F\u89C6\u8868
|
|
24603
|
+
"Pivot tables (kept in the file but not shown)": [
|
|
24604
|
+
"Tableaux crois\xE9s dynamiques (conserv\xE9s dans le fichier mais non affich\xE9s)",
|
|
24605
|
+
"PivotTables (in der Datei erhalten, aber nicht angezeigt)",
|
|
24606
|
+
"Tablas din\xE1micas (se conservan en el archivo, pero no se muestran)",
|
|
24607
|
+
"\u6570\u636E\u900F\u89C6\u8868(\u4FDD\u7559\u5728\u6587\u4EF6\u4E2D\u4F46\u4E0D\u663E\u793A)"
|
|
24608
|
+
],
|
|
24609
|
+
"Creating or editing sparklines (existing ones are shown)": [
|
|
24610
|
+
"Cr\xE9ation ou modification de graphiques sparkline (ceux existants sont affich\xE9s)",
|
|
24611
|
+
"Sparklines erstellen oder bearbeiten (vorhandene werden angezeigt)",
|
|
24612
|
+
"Crear o editar minigr\xE1ficos (los existentes se muestran)",
|
|
24613
|
+
"\u521B\u5EFA\u6216\u7F16\u8F91\u8FF7\u4F60\u56FE(\u73B0\u6709\u8FF7\u4F60\u56FE\u4F1A\u663E\u793A)"
|
|
23447
24614
|
],
|
|
23448
24615
|
"Show Formulas": ["Afficher les formules", "Formeln anzeigen", "Mostrar f\xF3rmulas", "\u663E\u793A\u516C\u5F0F"],
|
|
23449
24616
|
"Manual calculation": ["Calcul manuel", "Manuelle Berechnung", "C\xE1lculo manual", "\u624B\u52A8\u8BA1\u7B97"],
|
|
@@ -25942,7 +27109,7 @@ var shell = {
|
|
|
25942
27109
|
"Inspect Workbook": "Arbeitsmappe pr\xFCfen",
|
|
25943
27110
|
"Compatibility notes": "Kompatibilit\xE4tshinweise",
|
|
25944
27111
|
"No compatibility notes for this workbook.": "Keine Kompatibilit\xE4tshinweise f\xFCr diese Arbeitsmappe.",
|
|
25945
|
-
"Charts are shown but not edited; pivot tables,
|
|
27112
|
+
"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.",
|
|
25946
27113
|
"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.",
|
|
25947
27114
|
"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.",
|
|
25948
27115
|
"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.",
|
|
@@ -26059,11 +27226,42 @@ var shell = {
|
|
|
26059
27226
|
|
|
26060
27227
|
// xlsx/ui/locales/de/index.ts
|
|
26061
27228
|
var de = mergeStringModules({
|
|
27229
|
+
"./collab.ts": collab_exports,
|
|
26062
27230
|
"./commands.ts": commands_exports,
|
|
26063
27231
|
"./grid.ts": grid_exports,
|
|
26064
27232
|
"./shell.ts": shell_exports
|
|
26065
27233
|
});
|
|
26066
27234
|
|
|
27235
|
+
// xlsx/ui/locales/en/collab.ts
|
|
27236
|
+
var collab_exports2 = {};
|
|
27237
|
+
__export(collab_exports2, {
|
|
27238
|
+
collab: () => collab2
|
|
27239
|
+
});
|
|
27240
|
+
var collab2 = {
|
|
27241
|
+
Share: "Share",
|
|
27242
|
+
"Session name": "Session name",
|
|
27243
|
+
"Start sharing": "Start sharing",
|
|
27244
|
+
"Stop sharing": "Stop sharing",
|
|
27245
|
+
"People in this session": "People in this session",
|
|
27246
|
+
"Session: {room}": "Session: {room}",
|
|
27247
|
+
"Not sharing.": "Not sharing.",
|
|
27248
|
+
"Connecting...": "Connecting...",
|
|
27249
|
+
"Connected.": "Connected.",
|
|
27250
|
+
"Joining the session...": "Joining the session...",
|
|
27251
|
+
"Disconnected. Changes are kept and sent when the connection returns.": "Disconnected. Changes are kept and sent when the connection returns.",
|
|
27252
|
+
"The connection failed. Changes are kept and sent when the connection returns.": "The connection failed. Changes are kept and sent when the connection returns.",
|
|
27253
|
+
"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.",
|
|
27254
|
+
"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.",
|
|
27255
|
+
"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.",
|
|
27256
|
+
"Reconnected. Changes made while offline were sent.": "Reconnected. Changes made while offline were sent.",
|
|
27257
|
+
"Connection lost. Keep working; your changes are sent when it returns.": "Connection lost. Keep working; your changes are sent when it returns.",
|
|
27258
|
+
"Sharing stopped because another workbook was opened.": "Sharing stopped because another workbook was opened.",
|
|
27259
|
+
"Open or create a workbook before sharing it.": "Open or create a workbook before sharing it.",
|
|
27260
|
+
"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.",
|
|
27261
|
+
"This browser cannot share between windows; pass a server URL.": "This browser cannot share between windows; pass a server URL.",
|
|
27262
|
+
"Stop the current collaboration session first.": "Stop the current collaboration session first."
|
|
27263
|
+
};
|
|
27264
|
+
|
|
26067
27265
|
// xlsx/ui/locales/en/commands.ts
|
|
26068
27266
|
var commands_exports2 = {};
|
|
26069
27267
|
__export(commands_exports2, {
|
|
@@ -26296,7 +27494,7 @@ var shell2 = {
|
|
|
26296
27494
|
"Inspect Workbook": "Inspect Workbook",
|
|
26297
27495
|
"Compatibility notes": "Compatibility notes",
|
|
26298
27496
|
"No compatibility notes for this workbook.": "No compatibility notes for this workbook.",
|
|
26299
|
-
"Charts are shown but not edited; pivot tables,
|
|
27497
|
+
"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.",
|
|
26300
27498
|
"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.",
|
|
26301
27499
|
"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.",
|
|
26302
27500
|
"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.",
|
|
@@ -26413,11 +27611,42 @@ var shell2 = {
|
|
|
26413
27611
|
|
|
26414
27612
|
// xlsx/ui/locales/en/index.ts
|
|
26415
27613
|
var en = mergeStringModules({
|
|
27614
|
+
"./collab.ts": collab_exports2,
|
|
26416
27615
|
"./commands.ts": commands_exports2,
|
|
26417
27616
|
"./grid.ts": grid_exports2,
|
|
26418
27617
|
"./shell.ts": shell_exports2
|
|
26419
27618
|
});
|
|
26420
27619
|
|
|
27620
|
+
// xlsx/ui/locales/es/collab.ts
|
|
27621
|
+
var collab_exports3 = {};
|
|
27622
|
+
__export(collab_exports3, {
|
|
27623
|
+
collab: () => collab3
|
|
27624
|
+
});
|
|
27625
|
+
var collab3 = {
|
|
27626
|
+
Share: "Compartir",
|
|
27627
|
+
"Session name": "Nombre de la sesi\xF3n",
|
|
27628
|
+
"Start sharing": "Empezar a compartir",
|
|
27629
|
+
"Stop sharing": "Dejar de compartir",
|
|
27630
|
+
"People in this session": "Personas en esta sesi\xF3n",
|
|
27631
|
+
"Session: {room}": "Sesi\xF3n: {room}",
|
|
27632
|
+
"Not sharing.": "No se est\xE1 compartiendo.",
|
|
27633
|
+
"Connecting...": "Conectando...",
|
|
27634
|
+
"Connected.": "Conectado.",
|
|
27635
|
+
"Joining the session...": "Uni\xE9ndose a la sesi\xF3n...",
|
|
27636
|
+
"Disconnected. Changes are kept and sent when the connection returns.": "Desconectado. Los cambios se conservan y se env\xEDan cuando vuelva la conexi\xF3n.",
|
|
27637
|
+
"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.",
|
|
27638
|
+
"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.",
|
|
27639
|
+
"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.",
|
|
27640
|
+
"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.",
|
|
27641
|
+
"Reconnected. Changes made while offline were sent.": "Reconectado. Se enviaron los cambios hechos sin conexi\xF3n.",
|
|
27642
|
+
"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.",
|
|
27643
|
+
"Sharing stopped because another workbook was opened.": "Se dej\xF3 de compartir porque se abri\xF3 otro libro.",
|
|
27644
|
+
"Open or create a workbook before sharing it.": "Abra o cree un libro antes de compartirlo.",
|
|
27645
|
+
"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.",
|
|
27646
|
+
"This browser cannot share between windows; pass a server URL.": "Este navegador no puede compartir entre ventanas; indique la URL de un servidor.",
|
|
27647
|
+
"Stop the current collaboration session first.": "Detenga primero la sesi\xF3n de colaboraci\xF3n actual."
|
|
27648
|
+
};
|
|
27649
|
+
|
|
26421
27650
|
// xlsx/ui/locales/es/commands.ts
|
|
26422
27651
|
var commands_exports3 = {};
|
|
26423
27652
|
__export(commands_exports3, {
|
|
@@ -26650,7 +27879,7 @@ var shell3 = {
|
|
|
26650
27879
|
"Inspect Workbook": "Inspeccionar libro",
|
|
26651
27880
|
"Compatibility notes": "Notas de compatibilidad",
|
|
26652
27881
|
"No compatibility notes for this workbook.": "No hay notas de compatibilidad para este libro.",
|
|
26653
|
-
"Charts are shown but not edited; pivot tables,
|
|
27882
|
+
"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.",
|
|
26654
27883
|
"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.",
|
|
26655
27884
|
"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.",
|
|
26656
27885
|
"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.",
|
|
@@ -26767,11 +27996,42 @@ var shell3 = {
|
|
|
26767
27996
|
|
|
26768
27997
|
// xlsx/ui/locales/es/index.ts
|
|
26769
27998
|
var es = mergeStringModules({
|
|
27999
|
+
"./collab.ts": collab_exports3,
|
|
26770
28000
|
"./commands.ts": commands_exports3,
|
|
26771
28001
|
"./grid.ts": grid_exports3,
|
|
26772
28002
|
"./shell.ts": shell_exports3
|
|
26773
28003
|
});
|
|
26774
28004
|
|
|
28005
|
+
// xlsx/ui/locales/fr/collab.ts
|
|
28006
|
+
var collab_exports4 = {};
|
|
28007
|
+
__export(collab_exports4, {
|
|
28008
|
+
collab: () => collab4
|
|
28009
|
+
});
|
|
28010
|
+
var collab4 = {
|
|
28011
|
+
Share: "Partager",
|
|
28012
|
+
"Session name": "Nom de la session",
|
|
28013
|
+
"Start sharing": "Commencer le partage",
|
|
28014
|
+
"Stop sharing": "Arr\xEAter le partage",
|
|
28015
|
+
"People in this session": "Personnes dans cette session",
|
|
28016
|
+
"Session: {room}": "Session : {room}",
|
|
28017
|
+
"Not sharing.": "Aucun partage en cours.",
|
|
28018
|
+
"Connecting...": "Connexion...",
|
|
28019
|
+
"Connected.": "Connect\xE9.",
|
|
28020
|
+
"Joining the session...": "Connexion \xE0 la session...",
|
|
28021
|
+
"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.",
|
|
28022
|
+
"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.",
|
|
28023
|
+
"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.",
|
|
28024
|
+
"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.",
|
|
28025
|
+
"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.",
|
|
28026
|
+
"Reconnected. Changes made while offline were sent.": "Reconnect\xE9. Les modifications faites hors connexion ont \xE9t\xE9 envoy\xE9es.",
|
|
28027
|
+
"Connection lost. Keep working; your changes are sent when it returns.": "Connexion perdue. Continuez \xE0 travailler ; vos modifications seront envoy\xE9es \xE0 son retour.",
|
|
28028
|
+
"Sharing stopped because another workbook was opened.": "Le partage s'est arr\xEAt\xE9 car un autre classeur a \xE9t\xE9 ouvert.",
|
|
28029
|
+
"Open or create a workbook before sharing it.": "Ouvrez ou cr\xE9ez un classeur avant de le partager.",
|
|
28030
|
+
"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.",
|
|
28031
|
+
"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.",
|
|
28032
|
+
"Stop the current collaboration session first.": "Arr\xEAtez d'abord la session de collaboration en cours."
|
|
28033
|
+
};
|
|
28034
|
+
|
|
26775
28035
|
// xlsx/ui/locales/fr/commands.ts
|
|
26776
28036
|
var commands_exports4 = {};
|
|
26777
28037
|
__export(commands_exports4, {
|
|
@@ -27004,7 +28264,7 @@ var shell4 = {
|
|
|
27004
28264
|
"Inspect Workbook": "Inspecter le classeur",
|
|
27005
28265
|
"Compatibility notes": "Notes de compatibilit\xE9",
|
|
27006
28266
|
"No compatibility notes for this workbook.": "Aucune note de compatibilit\xE9 pour ce classeur.",
|
|
27007
|
-
"Charts are shown but not edited; pivot tables,
|
|
28267
|
+
"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.",
|
|
27008
28268
|
"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.",
|
|
27009
28269
|
"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.",
|
|
27010
28270
|
"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.",
|
|
@@ -27121,11 +28381,42 @@ var shell4 = {
|
|
|
27121
28381
|
|
|
27122
28382
|
// xlsx/ui/locales/fr/index.ts
|
|
27123
28383
|
var fr = mergeStringModules({
|
|
28384
|
+
"./collab.ts": collab_exports4,
|
|
27124
28385
|
"./commands.ts": commands_exports4,
|
|
27125
28386
|
"./grid.ts": grid_exports4,
|
|
27126
28387
|
"./shell.ts": shell_exports4
|
|
27127
28388
|
});
|
|
27128
28389
|
|
|
28390
|
+
// xlsx/ui/locales/zh-CN/collab.ts
|
|
28391
|
+
var collab_exports5 = {};
|
|
28392
|
+
__export(collab_exports5, {
|
|
28393
|
+
collab: () => collab5
|
|
28394
|
+
});
|
|
28395
|
+
var collab5 = {
|
|
28396
|
+
Share: "\u5171\u4EAB",
|
|
28397
|
+
"Session name": "\u4F1A\u8BDD\u540D\u79F0",
|
|
28398
|
+
"Start sharing": "\u5F00\u59CB\u5171\u4EAB",
|
|
28399
|
+
"Stop sharing": "\u505C\u6B62\u5171\u4EAB",
|
|
28400
|
+
"People in this session": "\u6B64\u4F1A\u8BDD\u4E2D\u7684\u4EBA\u5458",
|
|
28401
|
+
"Session: {room}": "\u4F1A\u8BDD\uFF1A{room}",
|
|
28402
|
+
"Not sharing.": "\u672A\u5728\u5171\u4EAB\u3002",
|
|
28403
|
+
"Connecting...": "\u6B63\u5728\u8FDE\u63A5...",
|
|
28404
|
+
"Connected.": "\u5DF2\u8FDE\u63A5\u3002",
|
|
28405
|
+
"Joining the session...": "\u6B63\u5728\u52A0\u5165\u4F1A\u8BDD...",
|
|
28406
|
+
"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",
|
|
28407
|
+
"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",
|
|
28408
|
+
"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",
|
|
28409
|
+
"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",
|
|
28410
|
+
"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",
|
|
28411
|
+
"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",
|
|
28412
|
+
"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",
|
|
28413
|
+
"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",
|
|
28414
|
+
"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",
|
|
28415
|
+
"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",
|
|
28416
|
+
"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",
|
|
28417
|
+
"Stop the current collaboration session first.": "\u8BF7\u5148\u505C\u6B62\u5F53\u524D\u534F\u4F5C\u4F1A\u8BDD\u3002"
|
|
28418
|
+
};
|
|
28419
|
+
|
|
27129
28420
|
// xlsx/ui/locales/zh-CN/commands.ts
|
|
27130
28421
|
var commands_exports5 = {};
|
|
27131
28422
|
__export(commands_exports5, {
|
|
@@ -27358,7 +28649,7 @@ var shell5 = {
|
|
|
27358
28649
|
"Inspect Workbook": "\u68C0\u67E5\u5DE5\u4F5C\u7C3F",
|
|
27359
28650
|
"Compatibility notes": "\u517C\u5BB9\u6027\u8BF4\u660E",
|
|
27360
28651
|
"No compatibility notes for this workbook.": "\u6B64\u5DE5\u4F5C\u7C3F\u6CA1\u6709\u517C\u5BB9\u6027\u8BF4\u660E\u3002",
|
|
27361
|
-
"Charts are shown but not edited; pivot tables,
|
|
28652
|
+
"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",
|
|
27362
28653
|
"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",
|
|
27363
28654
|
"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",
|
|
27364
28655
|
"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",
|
|
@@ -27475,6 +28766,7 @@ var shell5 = {
|
|
|
27475
28766
|
|
|
27476
28767
|
// xlsx/ui/locales/zh-CN/index.ts
|
|
27477
28768
|
var zhCN = mergeStringModules({
|
|
28769
|
+
"./collab.ts": collab_exports5,
|
|
27478
28770
|
"./commands.ts": commands_exports5,
|
|
27479
28771
|
"./grid.ts": grid_exports5,
|
|
27480
28772
|
"./shell.ts": shell_exports5
|
|
@@ -27492,8 +28784,8 @@ var STRINGS = {
|
|
|
27492
28784
|
function normalizeEditorLocale(value2) {
|
|
27493
28785
|
return normalizeLocale(value2, EDITOR_LOCALES, "en");
|
|
27494
28786
|
}
|
|
27495
|
-
function fillTemplate(
|
|
27496
|
-
return interpolate(
|
|
28787
|
+
function fillTemplate(text2, vars) {
|
|
28788
|
+
return interpolate(text2, vars);
|
|
27497
28789
|
}
|
|
27498
28790
|
function translate(locale, key, vars) {
|
|
27499
28791
|
return createTranslator(STRINGS[locale], [STRINGS.en])(key, vars);
|
|
@@ -27510,8 +28802,8 @@ function formatNumber2(locale, value2, digits2 = 10) {
|
|
|
27510
28802
|
}
|
|
27511
28803
|
function sheetBaseName(t) {
|
|
27512
28804
|
const key = "sheet.default-name";
|
|
27513
|
-
const
|
|
27514
|
-
return
|
|
28805
|
+
const text2 = t(key);
|
|
28806
|
+
return text2 && text2 !== key ? text2 : "Sheet";
|
|
27515
28807
|
}
|
|
27516
28808
|
|
|
27517
28809
|
// xlsx/ui/commands/cells.ts
|
|
@@ -29271,6 +30563,11 @@ function tabMenu(state, actions) {
|
|
|
29271
30563
|
);
|
|
29272
30564
|
}
|
|
29273
30565
|
|
|
30566
|
+
// xlsx/ui/context.ts
|
|
30567
|
+
function historyOf(ctx) {
|
|
30568
|
+
return ctx.history ? ctx.history() : ctx.session();
|
|
30569
|
+
}
|
|
30570
|
+
|
|
29274
30571
|
// xlsx/ui/dialogs.ts
|
|
29275
30572
|
function createDialogRegistry(context, onError) {
|
|
29276
30573
|
const openers = /* @__PURE__ */ new Map();
|
|
@@ -29526,8 +30823,8 @@ var DirtyState = class {
|
|
|
29526
30823
|
};
|
|
29527
30824
|
|
|
29528
30825
|
// xlsx/ui/formula-bar/name-resolve.ts
|
|
29529
|
-
function parseSheetReference(workbook, activeSheet,
|
|
29530
|
-
const ref =
|
|
30826
|
+
function parseSheetReference(workbook, activeSheet, text2) {
|
|
30827
|
+
const ref = text2.trim().replace(/^=/, "");
|
|
29531
30828
|
const bang = ref.lastIndexOf("!");
|
|
29532
30829
|
let sheet = activeSheet;
|
|
29533
30830
|
if (bang >= 0) {
|
|
@@ -29545,8 +30842,8 @@ function findDefinedName2(workbook, sheet, name) {
|
|
|
29545
30842
|
const matches2 = workbook.definedNames.filter((d) => d.name.toLowerCase() === lower2);
|
|
29546
30843
|
return matches2.find((d) => d.localSheet === sheet) ?? matches2.find((d) => d.localSheet === void 0);
|
|
29547
30844
|
}
|
|
29548
|
-
function resolveNameBox(workbook, activeSheet,
|
|
29549
|
-
const input =
|
|
30845
|
+
function resolveNameBox(workbook, activeSheet, text2) {
|
|
30846
|
+
const input = text2.trim();
|
|
29550
30847
|
if (!input) return { kind: "invalid" };
|
|
29551
30848
|
const ref = parseSheetReference(workbook, activeSheet, input);
|
|
29552
30849
|
if (ref) return { kind: "go", ...ref };
|
|
@@ -29657,10 +30954,10 @@ function textAlign(hAlign) {
|
|
|
29657
30954
|
if (hAlign === "justify" || hAlign === "distributed") return "justify";
|
|
29658
30955
|
return "left";
|
|
29659
30956
|
}
|
|
29660
|
-
function repeatToFill(
|
|
29661
|
-
if (!
|
|
30957
|
+
function repeatToFill(text2, textWidth, cellWidth) {
|
|
30958
|
+
if (!text2 || textWidth <= 0) return text2;
|
|
29662
30959
|
const times = Math.max(1, Math.floor(cellWidth / textWidth));
|
|
29663
|
-
return
|
|
30960
|
+
return text2.repeat(Math.min(times, 500));
|
|
29664
30961
|
}
|
|
29665
30962
|
function hashes(cellInnerWidth, hashWidth) {
|
|
29666
30963
|
const n = Math.max(1, Math.floor(cellInnerWidth / Math.max(1, hashWidth)));
|
|
@@ -29670,9 +30967,9 @@ function hashes(cellInnerWidth, hashWidth) {
|
|
|
29670
30967
|
// xlsx/ui/grid/cell-items.ts
|
|
29671
30968
|
var PADDING = 2;
|
|
29672
30969
|
function isBlankView(view) {
|
|
29673
|
-
return view.text === "" && !view.fill && !hasBorders(view.borders) && !view.dataBar && !view.icon && !view.hasComment;
|
|
30970
|
+
return view.text === "" && !view.fill && !hasBorders(view.borders) && !view.dataBar && !view.icon && !view.sparkline && !view.hasComment;
|
|
29674
30971
|
}
|
|
29675
|
-
function textWidthOf(input, view,
|
|
30972
|
+
function textWidthOf(input, view, text2) {
|
|
29676
30973
|
if (view.rich?.length)
|
|
29677
30974
|
return view.rich.reduce(
|
|
29678
30975
|
(sum2, run) => sum2 + input.measure(run.text, cssFont(run.font, input.zoom)),
|
|
@@ -29680,7 +30977,7 @@ function textWidthOf(input, view, text) {
|
|
|
29680
30977
|
);
|
|
29681
30978
|
const font = cssFont(view.font, input.zoom);
|
|
29682
30979
|
let widest = 0;
|
|
29683
|
-
for (const line2 of
|
|
30980
|
+
for (const line2 of text2.split("\n")) widest = Math.max(widest, input.measure(line2, font));
|
|
29684
30981
|
return widest;
|
|
29685
30982
|
}
|
|
29686
30983
|
function makeItem(input, row2, col, view, merge2) {
|
|
@@ -29723,7 +31020,7 @@ function makeItem(input, row2, col, view, merge2) {
|
|
|
29723
31020
|
return item;
|
|
29724
31021
|
}
|
|
29725
31022
|
if (view.overflow && !merge2 && measured > inner2) {
|
|
29726
|
-
const
|
|
31023
|
+
const extent2 = overflowExtent(
|
|
29727
31024
|
input.sheet,
|
|
29728
31025
|
metrics,
|
|
29729
31026
|
row2,
|
|
@@ -29731,9 +31028,9 @@ function makeItem(input, row2, col, view, merge2) {
|
|
|
29731
31028
|
measured + 2 * PADDING,
|
|
29732
31029
|
view.hAlign
|
|
29733
31030
|
);
|
|
29734
|
-
item.textLeft =
|
|
29735
|
-
item.textWidth =
|
|
29736
|
-
item.overflowing =
|
|
31031
|
+
item.textLeft = extent2.left - x;
|
|
31032
|
+
item.textWidth = extent2.right - extent2.left;
|
|
31033
|
+
item.overflowing = extent2.startCol !== col || extent2.endCol !== col;
|
|
29737
31034
|
}
|
|
29738
31035
|
return item;
|
|
29739
31036
|
}
|
|
@@ -29842,9 +31139,9 @@ function createEditBridge() {
|
|
|
29842
31139
|
return () => listeners2.delete(listener);
|
|
29843
31140
|
},
|
|
29844
31141
|
begin: (options = {}) => driver?.begin(options) ?? false,
|
|
29845
|
-
update(
|
|
31142
|
+
update(text2, caret, source) {
|
|
29846
31143
|
if (!state.editing) return;
|
|
29847
|
-
state = { ...state, text, caret, source };
|
|
31144
|
+
state = { ...state, text: text2, caret, source };
|
|
29848
31145
|
driver?.changed(source);
|
|
29849
31146
|
emit(source);
|
|
29850
31147
|
},
|
|
@@ -30209,18 +31506,18 @@ function activeRef(selection) {
|
|
|
30209
31506
|
return formatAddress(selection.active);
|
|
30210
31507
|
}
|
|
30211
31508
|
function parseSelectionRef(ref, workbook) {
|
|
30212
|
-
let
|
|
31509
|
+
let text2 = ref.trim();
|
|
30213
31510
|
let sheet;
|
|
30214
|
-
const bang =
|
|
31511
|
+
const bang = text2.lastIndexOf("!");
|
|
30215
31512
|
if (bang > 0) {
|
|
30216
|
-
const name =
|
|
31513
|
+
const name = text2.slice(0, bang).replace(/^'(.*)'$/, "$1").replace(/''/g, "'");
|
|
30217
31514
|
const index2 = workbook?.sheets.findIndex((item) => item.name.toLowerCase() === name.toLowerCase()) ?? -1;
|
|
30218
31515
|
if (index2 < 0) return void 0;
|
|
30219
31516
|
sheet = index2;
|
|
30220
|
-
|
|
31517
|
+
text2 = text2.slice(bang + 1);
|
|
30221
31518
|
}
|
|
30222
31519
|
const ranges = [];
|
|
30223
|
-
for (const part of
|
|
31520
|
+
for (const part of text2.split(",")) {
|
|
30224
31521
|
const range2 = parseRange(part.trim());
|
|
30225
31522
|
if (!range2) return void 0;
|
|
30226
31523
|
ranges.push(range2);
|
|
@@ -30386,7 +31683,7 @@ var CellViewCache = class {
|
|
|
30386
31683
|
let result2 = null;
|
|
30387
31684
|
if (workbook && sheet) {
|
|
30388
31685
|
const stored = getCell(sheet, row2, col);
|
|
30389
|
-
const plain2 = !stored && effectiveStyleId(sheet, row2, col) === 0 && !cfCovers(sheet, row2, col);
|
|
31686
|
+
const plain2 = !stored && effectiveStyleId(sheet, row2, col) === 0 && !cfCovers(sheet, row2, col) && !hasSparklineAt(sheet, row2, col);
|
|
30390
31687
|
if (!plain2) {
|
|
30391
31688
|
const view = cellView(workbook, this.#source.sheetIndex(), row2, col, this.#evaluator());
|
|
30392
31689
|
result2 = isBlankView(view) ? null : view;
|
|
@@ -30449,6 +31746,7 @@ var ICON_PATHS = {
|
|
|
30449
31746
|
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",
|
|
30450
31747
|
comment: "M4 5h16v11H10l-4 4v-4H4z M8 9h8 M8 12h5",
|
|
30451
31748
|
comments: "M3 4h13v9H9l-3 3v-3H3z M9 17h6l3 3v-3h3V8h-3",
|
|
31749
|
+
share: "M14 4l6 6-6 6M20 10h-8a8 8 0 0 0-8 8",
|
|
30452
31750
|
deleteComment: "M4 5h16v11H10l-4 4v-4H4z M9 8.5l5 5 M14 8.5l-5 5",
|
|
30453
31751
|
previous: "M6 14l6-6 6 6",
|
|
30454
31752
|
next: "M6 10l6 6 6-6",
|
|
@@ -31009,6 +32307,7 @@ exports.hasBorders = hasBorders;
|
|
|
31009
32307
|
exports.hasWorkbook = hasWorkbook;
|
|
31010
32308
|
exports.hashes = hashes;
|
|
31011
32309
|
exports.helpTab = helpTab;
|
|
32310
|
+
exports.historyOf = historyOf;
|
|
31012
32311
|
exports.icon = icon;
|
|
31013
32312
|
exports.iconCount = iconCount;
|
|
31014
32313
|
exports.iconSetRule = iconSetRule;
|