@svgrid/enterprise 3.0.2 → 3.0.3
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/LICENSE +94 -24
- package/README.md +36 -4
- package/dist/SvAdvancedFilter.svelte +1 -1
- package/dist/SvAlertsManager.svelte +2 -1
- package/dist/SvBoard.svelte +2 -1
- package/dist/SvExportMenu.svelte +4 -1
- package/dist/SvExportMenu.svelte.d.ts +0 -13
- package/dist/SvExpressionEditor.svelte +3 -3
- package/dist/SvFormulaBar.svelte +94 -20
- package/dist/SvFormulaBar.svelte.d.ts +7 -0
- package/dist/SvGridAlerts.svelte +49 -9
- package/dist/SvGridBoard.svelte +13 -8
- package/dist/SvGridBulkEditDrawer.svelte +26 -2
- package/dist/SvGridEditPanel.svelte +3 -0
- package/dist/SvGridScheduler.svelte +69 -40
- package/dist/SvGridSelectionBar.svelte +10 -3
- package/dist/SvPivotDesigner.svelte +198 -40
- package/dist/SvPivotDesigner.svelte.d.ts +27 -20
- package/dist/SvSheet.svelte +4043 -243
- package/dist/SvSheet.svelte.d.ts +76 -3
- package/dist/SvSheetChartSetup.svelte +151 -0
- package/dist/SvSheetChartSetup.svelte.d.ts +18 -0
- package/dist/SvSheetComment.svelte +216 -31
- package/dist/SvSheetComment.svelte.d.ts +11 -11
- package/dist/SvSheetConditionalFormat.svelte +28 -31
- package/dist/SvSheetDataValidation.svelte +66 -42
- package/dist/SvSheetEditRanges.svelte +217 -0
- package/dist/SvSheetEditRanges.svelte.d.ts +15 -0
- package/dist/SvSheetErrors.svelte +125 -0
- package/dist/SvSheetErrors.svelte.d.ts +20 -0
- package/dist/SvSheetEvaluate.svelte +133 -0
- package/dist/SvSheetEvaluate.svelte.d.ts +15 -0
- package/dist/SvSheetFilterMenu.svelte +137 -34
- package/dist/SvSheetFilterMenu.svelte.d.ts +5 -0
- package/dist/SvSheetFindReplace.svelte +19 -19
- package/dist/SvSheetFormatCells.svelte +125 -81
- package/dist/SvSheetGoalSeek.svelte +17 -16
- package/dist/SvSheetInsertFunction.svelte +15 -13
- package/dist/SvSheetIteration.svelte +81 -0
- package/dist/SvSheetIteration.svelte.d.ts +10 -0
- package/dist/SvSheetLink.svelte +99 -0
- package/dist/SvSheetLink.svelte.d.ts +17 -0
- package/dist/SvSheetListPicker.svelte +4 -2
- package/dist/SvSheetListPicker.svelte.d.ts +0 -6
- package/dist/SvSheetManageRules.svelte +20 -18
- package/dist/SvSheetNameManager.svelte +17 -15
- package/dist/SvSheetPageSetup.svelte +159 -0
- package/dist/SvSheetPageSetup.svelte.d.ts +13 -0
- package/dist/SvSheetPasteSpecial.svelte +22 -20
- package/dist/SvSheetPivot.svelte +220 -0
- package/dist/SvSheetPivot.svelte.d.ts +21 -0
- package/dist/SvSheetProtectSheet.svelte +81 -0
- package/dist/SvSheetProtectSheet.svelte.d.ts +11 -0
- package/dist/SvSheetRemoveDuplicates.svelte +13 -10
- package/dist/SvSheetRibbon.svelte +104 -51
- package/dist/SvSheetSizeDialog.svelte +4 -2
- package/dist/SvSheetSort.svelte +218 -0
- package/dist/SvSheetSort.svelte.d.ts +28 -0
- package/dist/SvSheetSparklines.svelte +135 -0
- package/dist/SvSheetSparklines.svelte.d.ts +14 -0
- package/dist/SvSheetTable.svelte +160 -0
- package/dist/SvSheetTable.svelte.d.ts +24 -0
- package/dist/SvSheetTabs.svelte +161 -31
- package/dist/SvSheetTabs.svelte.d.ts +22 -8
- package/dist/SvSheetTextToColumns.svelte +20 -20
- package/dist/SvSheetValidationAlert.svelte +8 -6
- package/dist/advanced-filter-enable.js +1 -1
- package/dist/alerts/alert-engine.d.ts +6 -0
- package/dist/alerts/alert-engine.js +21 -4
- package/dist/alerts/alert-formats.js +2 -0
- package/dist/alerts/alert-types.d.ts +1 -1
- package/dist/alerts.d.ts +1 -1
- package/dist/alerts.js +2 -2
- package/dist/board.js +2 -2
- package/dist/bulk-edit.d.ts +3 -1
- package/dist/bulk-edit.js +1 -1
- package/dist/cdn/svgrid-enterprise.svelte-external.js +39827 -16429
- package/dist/designer/assets/GridMenus-8gTNssgV.js +8 -0
- package/dist/designer/assets/{SvChartMenu-D9hEeHar.js → SvChartMenu-BDoeqGz6.js} +1 -1
- package/dist/designer/assets/{SvDateTimePicker-DARvKUL2.js → SvDateTimePicker-DCPg7WGN.js} +1 -1
- package/dist/designer/assets/SvGridCellEditor-DMoWJjEI.js +4 -0
- package/dist/designer/assets/{SvGridChart-B8j1SSy3.js → SvGridChart-Cy1ATrWh.js} +2 -2
- package/dist/designer/assets/SvGridChartBuilder-eQ3mn0L9.js +1 -0
- package/dist/designer/assets/{SvGridChartPanel-pT6ITc2P.js → SvGridChartPanel-CATdVc9X.js} +3 -3
- package/dist/designer/assets/{SvGridChartView-bg281UA1.js → SvGridChartView-CmsZtCED.js} +1 -1
- package/dist/designer/assets/SvGridDropdown-Cjz0H-fI.js +1 -0
- package/dist/designer/assets/{SvTabs-UFCMTHXS.js → SvTabs-2mHC6oaz.js} +1 -1
- package/dist/designer/assets/cell-formatting-BbubJTVz.js +1 -0
- package/dist/designer/assets/{chart-cIPUsbM5.js → chart-Cn7MnNqA.js} +1 -1
- package/dist/designer/assets/{chart-panel-messages-DtTxpBUU.js → chart-panel-messages-Dz7PTIqT.js} +1 -1
- package/dist/designer/assets/{chart-summary-Czu_5epb.js → chart-summary-BD1qYB2R.js} +1 -1
- package/dist/designer/assets/{chart-trend-D5I5VEe8.js → chart-trend-B8xr5LuD.js} +1 -1
- package/dist/designer/assets/{dismissable-BO547MH9.js → dismissable-ChWRPkoa.js} +1 -1
- package/dist/designer/assets/{export-format-D-eP4b2l.js → export-format-DGckmgKr.js} +1 -1
- package/dist/designer/assets/{focus-trap-CAreAhlU.js → focus-trap-V2-6Fy9I.js} +1 -1
- package/dist/designer/assets/{index-DwU7CAMm.js → index-D5bVbuzI.js} +317 -315
- package/dist/designer/assets/index-_JVFxt02.css +1 -0
- package/dist/designer/assets/row-resize-BInFWCpr.js +1 -0
- package/dist/designer/assets/server-block-cache-CXJKkJpy.js +1 -0
- package/dist/designer/assets/src-DUQ4xE3x.js +58 -0
- package/dist/designer/assets/validate-C3B8QKsM.js +1 -0
- package/dist/designer/index.html +17 -16
- package/dist/export-pdf.d.ts +75 -0
- package/dist/export-pdf.js +216 -15
- package/dist/export.js +10 -2
- package/dist/gantt/SvGridGantt.svelte +2890 -0
- package/dist/gantt/SvGridGantt.svelte.d.ts +30 -0
- package/dist/gantt/gantt-config.d.ts +73 -0
- package/dist/gantt/gantt-config.js +1 -0
- package/dist/gantt/gantt-critical-path.d.ts +67 -0
- package/dist/gantt/gantt-critical-path.js +207 -0
- package/dist/gantt/gantt-model.d.ts +257 -0
- package/dist/gantt/gantt-model.js +651 -0
- package/dist/gantt/gantt-resources.d.ts +59 -0
- package/dist/gantt/gantt-resources.js +71 -0
- package/dist/gantt/gantt.d.ts +7 -0
- package/dist/gantt/gantt.js +36 -0
- package/dist/gantt/index.d.ts +15 -0
- package/dist/gantt/index.js +22 -0
- package/dist/gantt/timeline-arrows.d.ts +102 -0
- package/dist/gantt/timeline-arrows.js +181 -0
- package/dist/import.d.ts +2 -2
- package/dist/import.js +1 -1
- package/dist/index.d.ts +34 -7
- package/dist/index.js +44 -7
- package/dist/install.js +8 -1
- package/dist/license-core.d.ts +17 -1
- package/dist/license-core.js +16 -5
- package/dist/license.d.ts +18 -2
- package/dist/license.js +71 -6
- package/dist/node/studio.js +140 -8
- package/dist/pivot-enable.js +2 -2
- package/dist/scheduler-dependencies.d.ts +35 -0
- package/dist/scheduler-dependencies.js +36 -1
- package/dist/scheduler.js +2 -2
- package/dist/selection-bar.js +2 -2
- package/dist/server/SvGroupCell.svelte +213 -0
- package/dist/server/SvGroupCell.svelte.d.ts +62 -0
- package/dist/server/SvRowGroupPanel.svelte +322 -0
- package/dist/server/SvRowGroupPanel.svelte.d.ts +37 -0
- package/dist/server/enable.d.ts +17 -0
- package/dist/server/enable.js +49 -0
- package/dist/server/index.d.ts +22 -0
- package/dist/server/index.js +24 -0
- package/dist/server/messages.d.ts +45 -0
- package/dist/server/messages.js +35 -0
- package/dist/server/server-group-model.d.ts +104 -0
- package/dist/server/server-group-model.js +272 -0
- package/dist/server/server-pivot.d.ts +46 -0
- package/dist/server/server-pivot.js +57 -0
- package/dist/server/server-row-model.d.ts +547 -0
- package/dist/server/server-row-model.js +1551 -0
- package/dist/server/server-selection.d.ts +99 -0
- package/dist/server/server-selection.js +215 -0
- package/dist/server/svgrid-adapter.d.ts +155 -0
- package/dist/server/svgrid-adapter.js +202 -0
- package/dist/sheet/ast.d.ts +45 -1
- package/dist/sheet/ast.js +14 -0
- package/dist/sheet/auto-filter.d.ts +58 -4
- package/dist/sheet/auto-filter.js +159 -11
- package/dist/sheet/autocomplete.d.ts +9 -0
- package/dist/sheet/autocomplete.js +90 -4
- package/dist/sheet/cell-images.d.ts +39 -0
- package/dist/sheet/cell-images.js +90 -0
- package/dist/sheet/cell-types.d.ts +58 -0
- package/dist/sheet/cell-types.js +96 -0
- package/dist/sheet/coerce.d.ts +40 -0
- package/dist/sheet/coerce.js +170 -3
- package/dist/sheet/comments.d.ts +43 -9
- package/dist/sheet/comments.js +85 -27
- package/dist/sheet/conditional-formats.d.ts +29 -6
- package/dist/sheet/conditional-formats.js +37 -12
- package/dist/sheet/csv.d.ts +32 -0
- package/dist/sheet/csv.js +158 -0
- package/dist/sheet/culture.d.ts +87 -0
- package/dist/sheet/culture.js +247 -0
- package/dist/sheet/delta.d.ts +102 -0
- package/dist/sheet/delta.js +203 -0
- package/dist/sheet/deps.d.ts +45 -1
- package/dist/sheet/deps.js +77 -2
- package/dist/sheet/document.d.ts +106 -4
- package/dist/sheet/document.js +204 -3
- package/dist/sheet/engine.d.ts +67 -0
- package/dist/sheet/engine.js +19 -0
- package/dist/sheet/entry.d.ts +8 -4
- package/dist/sheet/entry.js +171 -21
- package/dist/sheet/error-check.d.ts +49 -0
- package/dist/sheet/error-check.js +83 -0
- package/dist/sheet/evaluate-steps.d.ts +48 -0
- package/dist/sheet/evaluate-steps.js +196 -0
- package/dist/sheet/evaluate.d.ts +67 -0
- package/dist/sheet/evaluate.js +725 -13
- package/dist/sheet/filter-files.d.ts +37 -0
- package/dist/sheet/filter-files.js +465 -0
- package/dist/sheet/format-store.d.ts +15 -0
- package/dist/sheet/format-store.js +11 -1
- package/dist/sheet/from-rows.d.ts +14 -0
- package/dist/sheet/from-rows.js +50 -0
- package/dist/sheet/function-catalog.d.ts +1 -1
- package/dist/sheet/function-catalog.js +296 -5
- package/dist/sheet/functions.js +363 -91
- package/dist/sheet/index.d.ts +35 -8
- package/dist/sheet/index.js +35 -8
- package/dist/sheet/links.d.ts +57 -0
- package/dist/sheet/links.js +174 -0
- package/dist/sheet/messages.d.ts +778 -0
- package/dist/sheet/messages.js +806 -0
- package/dist/sheet/number-format.d.ts +52 -5
- package/dist/sheet/number-format.js +465 -68
- package/dist/sheet/objects.d.ts +106 -0
- package/dist/sheet/objects.js +149 -0
- package/dist/sheet/ods-document.d.ts +44 -0
- package/dist/sheet/ods-document.js +1275 -0
- package/dist/sheet/open-file.d.ts +26 -0
- package/dist/sheet/open-file.js +56 -0
- package/dist/sheet/outline.d.ts +82 -0
- package/dist/sheet/outline.js +228 -0
- package/dist/sheet/packs/array.d.ts +16 -0
- package/dist/sheet/packs/array.js +172 -0
- package/dist/sheet/packs/database.d.ts +42 -0
- package/dist/sheet/packs/database.js +142 -0
- package/dist/sheet/packs/engineering.d.ts +2 -0
- package/dist/sheet/packs/engineering.js +296 -0
- package/dist/sheet/packs/financial.d.ts +5 -0
- package/dist/sheet/packs/financial.js +220 -0
- package/dist/sheet/packs/math-stats.d.ts +2 -0
- package/dist/sheet/packs/math-stats.js +372 -0
- package/dist/sheet/packs/special.d.ts +44 -0
- package/dist/sheet/packs/special.js +187 -0
- package/dist/sheet/packs/stats-dist.d.ts +2 -0
- package/dist/sheet/packs/stats-dist.js +785 -0
- package/dist/sheet/packs/text-date.d.ts +2 -0
- package/dist/sheet/packs/text-date.js +332 -0
- package/dist/sheet/packs/trig.d.ts +2 -0
- package/dist/sheet/packs/trig.js +73 -0
- package/dist/sheet/page-setup.d.ts +73 -0
- package/dist/sheet/page-setup.js +73 -0
- package/dist/sheet/parse.js +42 -10
- package/dist/sheet/paste-special.d.ts +22 -0
- package/dist/sheet/paste-special.js +14 -5
- package/dist/sheet/pivot-range.d.ts +160 -0
- package/dist/sheet/pivot-range.js +333 -0
- package/dist/sheet/presence.d.ts +73 -0
- package/dist/sheet/presence.js +79 -0
- package/dist/sheet/print.d.ts +104 -0
- package/dist/sheet/print.js +169 -0
- package/dist/sheet/protection.d.ts +55 -1
- package/dist/sheet/protection.js +55 -2
- package/dist/sheet/rects.d.ts +1 -1
- package/dist/sheet/refs.d.ts +48 -0
- package/dist/sheet/refs.js +155 -8
- package/dist/sheet/ribbon-icons.d.ts +1 -1
- package/dist/sheet/ribbon-icons.js +186 -0
- package/dist/sheet/ribbon.d.ts +1 -1
- package/dist/sheet/ribbon.js +324 -23
- package/dist/sheet/sheet-kinds.d.ts +74 -0
- package/dist/sheet/sheet-kinds.js +91 -0
- package/dist/sheet/shortcuts.d.ts +13 -3
- package/dist/sheet/shortcuts.js +63 -12
- package/dist/sheet/sort.d.ts +51 -0
- package/dist/sheet/sort.js +107 -0
- package/dist/sheet/sparklines.d.ts +111 -0
- package/dist/sheet/sparklines.js +204 -0
- package/dist/sheet/table-styles.d.ts +74 -0
- package/dist/sheet/table-styles.js +152 -0
- package/dist/sheet/tables.d.ts +19 -0
- package/dist/sheet/tables.js +31 -0
- package/dist/sheet/tokenize.d.ts +18 -1
- package/dist/sheet/tokenize.js +60 -9
- package/dist/sheet/validation.d.ts +16 -0
- package/dist/sheet/validation.js +37 -0
- package/dist/sheet/workbook.d.ts +148 -3
- package/dist/sheet/workbook.js +742 -31
- package/dist/sheet/xls-cfb.d.ts +32 -0
- package/dist/sheet/xls-cfb.js +290 -0
- package/dist/sheet/xls-document.d.ts +10 -0
- package/dist/sheet/xls-document.js +1243 -0
- package/dist/sheet/xls-formula.d.ts +40 -0
- package/dist/sheet/xls-formula.js +569 -0
- package/dist/sheet/xlsx-document.d.ts +108 -0
- package/dist/sheet/xlsx-document.js +1849 -0
- package/dist/sheet/xlsx-drawing.d.ts +99 -0
- package/dist/sheet/xlsx-drawing.js +420 -0
- package/dist/sheet-enable.js +6 -7
- package/dist/sheet-text.d.ts +7 -0
- package/dist/sheet-text.js +29 -0
- package/dist/sources/auth-supabase.js +2 -2
- package/dist/sources/realtime-supabase.js +2 -2
- package/dist/sources/rest.d.ts +6 -2
- package/dist/sources/rest.js +42 -7
- package/dist/sources/supabase.d.ts +10 -1
- package/dist/sources/supabase.js +73 -40
- package/dist/studio/emit-project.js +14 -1
- package/dist/studio/index.js +1 -1
- package/dist/studio/project.d.ts +11 -2
- package/dist/studio/project.js +5 -2
- package/dist/studio/ui-components.generated.js +107 -2
- package/dist/sveltekit/in-memory.d.ts +2 -2
- package/dist/sveltekit/in-memory.js +125 -4
- package/dist/sveltekit/index.d.ts +1 -1
- package/dist/sveltekit/index.js +1 -1
- package/dist/sveltekit/query-plan.d.ts +50 -4
- package/dist/sveltekit/query-plan.js +25 -3
- package/dist/sveltekit/sql-source.d.ts +6 -0
- package/dist/sveltekit/sql-source.js +34 -6
- package/dist/sveltekit/sql.d.ts +31 -0
- package/dist/sveltekit/sql.js +135 -25
- package/dist/sveltekit/transport.d.ts +10 -2
- package/dist/sveltekit/transport.js +30 -6
- package/dist/upgrade-prompt.d.ts +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/dist/watermark.js +35 -2
- package/dist/wc/GridMenus-By9vPuq0.js +1088 -0
- package/dist/wc/SvChartMenu-CQNrQGT2.js +308 -0
- package/dist/wc/SvDateRangeInput-DR6m7bSM.js +199 -0
- package/dist/wc/SvDateTimePicker-D-vRnaMo.js +771 -0
- package/dist/wc/SvField-B_kurx_P.js +149 -0
- package/dist/wc/SvGrid.helpers-BdVDtjUm.js +135 -0
- package/dist/wc/SvGridCellEditor-Bnf1Kr5C.js +560 -0
- package/dist/wc/SvGridChart-BqUJh2pG.js +3572 -0
- package/dist/wc/SvGridChartBuilder-CGycC5cn.js +988 -0
- package/dist/wc/SvGridChartPanel-CRnizsHD.js +1746 -0
- package/dist/wc/SvGridChartView-D1pa_xMy.js +47 -0
- package/dist/wc/SvGridDropdown-45WsObLL.js +259 -0
- package/dist/wc/SvModal-DrfOYYyX.js +189 -0
- package/dist/wc/cell-formatting-CBfgahv1.js +86 -0
- package/dist/wc/chart-6OXlybVT.js +4341 -0
- package/dist/wc/chart-export-CeSADGfi.js +135 -0
- package/dist/wc/chart-export-pdf-BGko7MER.js +104 -0
- package/dist/wc/chart-summary-2m3ia1-n.js +137 -0
- package/dist/wc/chart-trend-CQOQtTMl.js +50 -0
- package/dist/wc/chart-validate-CD6ptiwg.js +180 -0
- package/dist/wc/client-DQIzjDBG.js +3064 -0
- package/dist/wc/column-resize-DUPgynvc.js +101 -0
- package/dist/wc/date-format-DS-z_h9v.js +1130 -0
- package/dist/wc/dismissable-CQ6XFXsk.js +45 -0
- package/dist/wc/editor-contract-peBDxir_.js +22 -0
- package/dist/wc/editor-registry-DxGKqcvx.js +24 -0
- package/dist/wc/focus-trap-Dbb2tJxb.js +65 -0
- package/dist/wc/list-option-DrRyivWp.js +82 -0
- package/dist/wc/popover-WsGlvtQv.js +69 -0
- package/dist/wc/positioning-BiKLfu1E.js +112 -0
- package/dist/wc/react.d.ts +41 -0
- package/dist/wc/react.js +90 -0
- package/dist/wc/rolldown-runtime-Dy4uBu1J.js +11 -0
- package/dist/wc/row-drag-touch-CycRR65n.js +93 -0
- package/dist/wc/row-resize-limG_N1z.js +111 -0
- package/dist/wc/sv-sheet-element.d.ts +97 -0
- package/dist/wc/sv-sheet-element.js +44213 -0
- package/dist/wc/svelte-virtualizer.svelte-CXtQy2TQ.js +530 -0
- package/dist/wc/validate-BqDthkNr.js +88 -0
- package/dist/wc/vue.d.ts +31 -0
- package/dist/wc/vue.js +75 -0
- package/package.json +30 -5
- package/dist/designer/assets/GridMenus-BlsvL_aU.js +0 -8
- package/dist/designer/assets/SvGridCellEditor-C7uQXYds.js +0 -4
- package/dist/designer/assets/SvGridChartBuilder-kvyIU_Rl.js +0 -1
- package/dist/designer/assets/SvGridDropdown-Bb3HH2Aj.js +0 -1
- package/dist/designer/assets/cell-formatting-wr5wm7US.js +0 -1
- package/dist/designer/assets/index-CMFgAoVV.css +0 -1
- package/dist/designer/assets/row-resize-DLktcqUK.js +0 -1
- package/dist/designer/assets/src-EdI3Xqds.js +0 -58
- package/dist/designer/assets/validate-h-aslRV9.js +0 -1
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
* Stop If True stops the rules below it for the cells it matches.
|
|
17
17
|
*/
|
|
18
18
|
import { type CellValue } from './ast.js';
|
|
19
|
-
import type
|
|
19
|
+
import { type StructuralEdit } from './refs.js';
|
|
20
20
|
import { type Rect } from './rects.js';
|
|
21
21
|
import type { CellFormatEntry } from './format-store.js';
|
|
22
22
|
export type CfStyle = Pick<CellFormatEntry, 'fill' | 'color' | 'bold' | 'italic' | 'underline' | 'strike' | 'numFmt'>;
|
|
@@ -53,9 +53,20 @@ export type CfRule = {
|
|
|
53
53
|
kind: 'average';
|
|
54
54
|
above: boolean;
|
|
55
55
|
style: CfStyle;
|
|
56
|
-
}
|
|
56
|
+
}
|
|
57
|
+
/** Excel's "Use a formula to determine which cells to format": written
|
|
58
|
+
* for the rule's top-left cell and moved to each cell, TRUE formats. */
|
|
59
|
+
| {
|
|
60
|
+
kind: 'formula';
|
|
61
|
+
formula: string;
|
|
62
|
+
style: CfStyle;
|
|
63
|
+
}
|
|
64
|
+
/** `negativeColor` paints the bars left of the axis; without it a range
|
|
65
|
+
* with negatives still draws them, in Excel's red. */
|
|
66
|
+
| {
|
|
57
67
|
kind: 'dataBar';
|
|
58
68
|
color: string;
|
|
69
|
+
negativeColor?: string;
|
|
59
70
|
} | {
|
|
60
71
|
kind: 'colorScale';
|
|
61
72
|
colors: CfScaleColors;
|
|
@@ -75,7 +86,7 @@ export type CfRuleBody = DistributiveOmit<CfRule, 'id' | 'rects'>;
|
|
|
75
86
|
/** A styled rule without its id and rectangles: what the dialog hands back. */
|
|
76
87
|
export type CfBody = DistributiveOmit<CfStyledRule, 'id' | 'rects'>;
|
|
77
88
|
/** The small dialogs, one per ribbon entry. */
|
|
78
|
-
export type CfPreset = 'greater' | 'less' | 'between' | 'equal' | 'text' | 'duplicates' | 'top10' | 'bottom10' | 'aboveAverage' | 'belowAverage';
|
|
89
|
+
export type CfPreset = 'greater' | 'less' | 'between' | 'equal' | 'text' | 'duplicates' | 'top10' | 'bottom10' | 'aboveAverage' | 'belowAverage' | 'formula';
|
|
79
90
|
/** What one rule knows about the numbers in its rectangles. */
|
|
80
91
|
export type CfStats = {
|
|
81
92
|
/** Numbers, sorted ascending. */
|
|
@@ -89,10 +100,16 @@ export type CfStats = {
|
|
|
89
100
|
/** What the rules say about one cell. */
|
|
90
101
|
export type CfResult = {
|
|
91
102
|
style?: CfStyle;
|
|
92
|
-
/**
|
|
103
|
+
/**
|
|
104
|
+
* A bar across the cell: `ratio` of its width, starting `axis` of the
|
|
105
|
+
* way across (0 when the range has no negatives) and running right for a
|
|
106
|
+
* positive value, left for a negative one, which `negative` says.
|
|
107
|
+
*/
|
|
93
108
|
dataBar?: {
|
|
94
109
|
ratio: number;
|
|
95
110
|
color: string;
|
|
111
|
+
axis: number;
|
|
112
|
+
negative: boolean;
|
|
96
113
|
};
|
|
97
114
|
/** The icon set and which of its three icons: 0 = the top one. */
|
|
98
115
|
icon?: {
|
|
@@ -102,8 +119,12 @@ export type CfResult = {
|
|
|
102
119
|
};
|
|
103
120
|
/** How a rule reads the sheet: the shell wires the workbook in. */
|
|
104
121
|
export type CfContext = {
|
|
105
|
-
/** A formula or a literal, evaluated in the sheet
|
|
106
|
-
|
|
122
|
+
/** A formula or a literal, evaluated in the sheet; `at` is the cell a
|
|
123
|
+
* formula rule is being read for, so ROW() and COLUMN() work in it. */
|
|
124
|
+
evaluate(text: string, at?: {
|
|
125
|
+
row: number;
|
|
126
|
+
col: number;
|
|
127
|
+
}): CellValue;
|
|
107
128
|
};
|
|
108
129
|
/** The six "with" styles of Excel's Highlight Cells dialogs. */
|
|
109
130
|
export declare const CF_PRESET_STYLES: ReadonlyArray<{
|
|
@@ -112,6 +133,8 @@ export declare const CF_PRESET_STYLES: ReadonlyArray<{
|
|
|
112
133
|
style: CfStyle;
|
|
113
134
|
}>;
|
|
114
135
|
export declare const DATA_BAR_COLOR = "#638EC6";
|
|
136
|
+
/** Excel's colour for the bars left of the axis. */
|
|
137
|
+
export declare const DATA_BAR_NEGATIVE_COLOR = "#FF0000";
|
|
115
138
|
export declare const COLOR_SCALES: Record<'green-yellow-red' | 'red-yellow-green' | 'green-white' | 'white-red', CfScaleColors>;
|
|
116
139
|
export declare function cfId(): string;
|
|
117
140
|
/**
|
|
@@ -17,6 +17,7 @@
|
|
|
17
17
|
*/
|
|
18
18
|
import { isError } from './ast.js';
|
|
19
19
|
import { toText } from './coerce.js';
|
|
20
|
+
import { translateFormula } from './refs.js';
|
|
20
21
|
import { rectContains, shiftRects, subtractRect, rectsIntersect } from './rects.js';
|
|
21
22
|
// ---------------------------------------------------------------------------
|
|
22
23
|
// Excel's palettes
|
|
@@ -30,6 +31,8 @@ export const CF_PRESET_STYLES = [
|
|
|
30
31
|
{ id: 'red-text', label: 'Red Text', style: { color: '#9C0006' } },
|
|
31
32
|
];
|
|
32
33
|
export const DATA_BAR_COLOR = '#638EC6';
|
|
34
|
+
/** Excel's colour for the bars left of the axis. */
|
|
35
|
+
export const DATA_BAR_NEGATIVE_COLOR = '#FF0000';
|
|
33
36
|
export const COLOR_SCALES = {
|
|
34
37
|
'green-yellow-red': ['#63BE7B', '#FFEB84', '#F8696B'],
|
|
35
38
|
'red-yellow-green': ['#F8696B', '#FFEB84', '#63BE7B'],
|
|
@@ -109,7 +112,7 @@ function cellIs(value, operator, a, b) {
|
|
|
109
112
|
}
|
|
110
113
|
}
|
|
111
114
|
/** Whether a styling rule matches the cell. */
|
|
112
|
-
function matches(rule, value, display, stats, ctx) {
|
|
115
|
+
function matches(rule, value, display, stats, ctx, at) {
|
|
113
116
|
switch (rule.kind) {
|
|
114
117
|
case 'cellIs': {
|
|
115
118
|
const isEquality = rule.operator === 'equal' || rule.operator === 'notEqual';
|
|
@@ -166,22 +169,43 @@ function matches(rule, value, display, stats, ctx) {
|
|
|
166
169
|
return false;
|
|
167
170
|
return rule.above ? value > stats.mean : value < stats.mean;
|
|
168
171
|
}
|
|
172
|
+
case 'formula': {
|
|
173
|
+
// Written for the rule's top-left cell and moved to the cell being
|
|
174
|
+
// painted, as a copied formula would be: =$B2>100 on A2:A9 reads
|
|
175
|
+
// each row's B. TRUE, or a number other than 0, formats.
|
|
176
|
+
const text = rule.formula.trim();
|
|
177
|
+
if (!text)
|
|
178
|
+
return false;
|
|
179
|
+
const origin = rule.rects[0];
|
|
180
|
+
const source = text.startsWith('=') ? text : `=${text}`;
|
|
181
|
+
const moved = origin && at ? String(translateFormula(source, at.row - origin[0], at.col - origin[1])) : source;
|
|
182
|
+
const v = ctx.evaluate(moved, at);
|
|
183
|
+
if (isError(v))
|
|
184
|
+
return false;
|
|
185
|
+
return typeof v === 'boolean' ? v : typeof v === 'number' ? v !== 0 : false;
|
|
186
|
+
}
|
|
169
187
|
default:
|
|
170
188
|
return false;
|
|
171
189
|
}
|
|
172
190
|
}
|
|
173
191
|
/**
|
|
174
|
-
* A data bar's
|
|
175
|
-
* range
|
|
176
|
-
*
|
|
177
|
-
*
|
|
192
|
+
* A data bar's geometry. Excel measures from zero: over a non-negative
|
|
193
|
+
* range 10, 20, 40 draw a quarter, a half and the whole width, so the
|
|
194
|
+
* smallest value keeps a bar. A range with negatives puts an axis where
|
|
195
|
+
* zero falls between the minimum and the maximum, and a bar grows away
|
|
196
|
+
* from it, right for a positive value and left for a negative one, each
|
|
197
|
+
* as its share of the whole span, as Excel's automatic axis draws them.
|
|
178
198
|
*/
|
|
179
|
-
function
|
|
199
|
+
function dataBarFor(value, stats) {
|
|
180
200
|
const lo = Math.min(0, stats.min);
|
|
181
201
|
const hi = Math.max(0, stats.max);
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
202
|
+
const span = hi - lo;
|
|
203
|
+
const negative = value < 0;
|
|
204
|
+
if (span === 0)
|
|
205
|
+
return { ratio: 0, axis: 0, negative };
|
|
206
|
+
const axis = lo < 0 ? -lo / span : 0;
|
|
207
|
+
const ratio = Math.min(1, Math.abs(value) / span);
|
|
208
|
+
return { ratio, axis, negative };
|
|
185
209
|
}
|
|
186
210
|
/** Where a number sits in a range, 0..1; 0.5 for a flat range. */
|
|
187
211
|
function ratioOf(value, stats) {
|
|
@@ -229,8 +253,8 @@ export function evaluateCf(rules, r, c, value, display, statsFor, ctx) {
|
|
|
229
253
|
let hit = false;
|
|
230
254
|
if (rule.kind === 'dataBar') {
|
|
231
255
|
if (typeof value === 'number' && !(out?.dataBar)) {
|
|
232
|
-
const
|
|
233
|
-
out = { ...(out ?? {}), dataBar: {
|
|
256
|
+
const bar = dataBarFor(value, statsFor(rule));
|
|
257
|
+
out = { ...(out ?? {}), dataBar: { ...bar, color: bar.negative ? rule.negativeColor ?? DATA_BAR_NEGATIVE_COLOR : rule.color } };
|
|
234
258
|
hit = true;
|
|
235
259
|
}
|
|
236
260
|
}
|
|
@@ -249,7 +273,7 @@ export function evaluateCf(rules, r, c, value, display, statsFor, ctx) {
|
|
|
249
273
|
hit = true;
|
|
250
274
|
}
|
|
251
275
|
}
|
|
252
|
-
else if (hasStyle(rule) && matches(rule, value, display, statsFor(rule), ctx)) {
|
|
276
|
+
else if (hasStyle(rule) && matches(rule, value, display, statsFor(rule), ctx, { row: r, col: c })) {
|
|
253
277
|
const style = { ...(out?.style ?? {}) };
|
|
254
278
|
const own = rule.style;
|
|
255
279
|
for (const key of Object.keys(own)) {
|
|
@@ -305,6 +329,7 @@ export function describeCf(rule) {
|
|
|
305
329
|
case 'duplicates': return rule.unique ? 'Unique Values' : 'Duplicate Values';
|
|
306
330
|
case 'topBottom': return `${rule.top ? 'Top' : 'Bottom'} ${rule.rank}${rule.percent ? '%' : ''}`;
|
|
307
331
|
case 'average': return rule.above ? 'Above Average' : 'Below Average';
|
|
332
|
+
case 'formula': return `Formula: ${rule.formula}`;
|
|
308
333
|
case 'dataBar': return 'Data Bar';
|
|
309
334
|
case 'colorScale': return rule.colors.length === 3 ? 'Graded Color Scale' : 'Two-Color Scale';
|
|
310
335
|
case 'iconSet': return 'Icon Set';
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { SheetState } from './document.js';
|
|
2
|
+
/**
|
|
3
|
+
* A sheet as CSV, the way Excel's Save As CSV writes one: what the cells
|
|
4
|
+
* SHOW, so a formula goes out as its value and a formatted number as its
|
|
5
|
+
* text; a field with a comma, a quote or a line break in quotes, a quote
|
|
6
|
+
* doubled; CRLF between rows; trailing empty cells kept so every row has
|
|
7
|
+
* the sheet's width.
|
|
8
|
+
*/
|
|
9
|
+
export declare function csvText(rows: ReadonlyArray<ReadonlyArray<string>>, separator?: string): string;
|
|
10
|
+
/**
|
|
11
|
+
* CSV text back into rows.
|
|
12
|
+
*
|
|
13
|
+
* A scan, not a split: a quoted field may hold the separator, a line break
|
|
14
|
+
* or a doubled quote, and every real export uses all three. CRLF and LF both
|
|
15
|
+
* end a row, a BOM at the start is dropped (Excel writes one), and the
|
|
16
|
+
* separator is guessed when it is not given, so a semicolon file from a
|
|
17
|
+
* European Excel and a tab file pasted from anywhere read as themselves.
|
|
18
|
+
*/
|
|
19
|
+
export declare function csvRows(text: string, separator?: string): string[][];
|
|
20
|
+
/** The separator a file uses: the one that divides its first lines evenly. */
|
|
21
|
+
export declare function guessCsvSeparator(text: string): string;
|
|
22
|
+
/**
|
|
23
|
+
* A CSV (or TSV) file as a one-sheet document.
|
|
24
|
+
*
|
|
25
|
+
* Every spreadsheet exports CSV and every one of them reads it back the same
|
|
26
|
+
* way: a field that looks like a number IS a number, and one that looks like
|
|
27
|
+
* a percentage, a currency amount or a grouped number keeps the format it
|
|
28
|
+
* implies, which is what `parseEntry` decides for typing. A field is never
|
|
29
|
+
* read as a formula - a CSV holding `=1+1` is text in Excel too, since the
|
|
30
|
+
* file came from somewhere else.
|
|
31
|
+
*/
|
|
32
|
+
export declare function sheetStateFromCsv(text: string, sheetName?: string, separator?: string): SheetState;
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
import { parseEntry } from './entry.js';
|
|
2
|
+
import { formatKeyAt } from './format-store.js';
|
|
3
|
+
/**
|
|
4
|
+
* A sheet as CSV, the way Excel's Save As CSV writes one: what the cells
|
|
5
|
+
* SHOW, so a formula goes out as its value and a formatted number as its
|
|
6
|
+
* text; a field with a comma, a quote or a line break in quotes, a quote
|
|
7
|
+
* doubled; CRLF between rows; trailing empty cells kept so every row has
|
|
8
|
+
* the sheet's width.
|
|
9
|
+
*/
|
|
10
|
+
export function csvText(rows, separator = ',') {
|
|
11
|
+
const width = rows.reduce((max, row) => Math.max(max, row.length), 0);
|
|
12
|
+
const field = (text) => /[",\r\n]/.test(text) || text.includes(separator) ? `"${text.replace(/"/g, '""')}"` : text;
|
|
13
|
+
return rows
|
|
14
|
+
.map((row) => Array.from({ length: width }, (_, i) => field(row[i] ?? '')).join(separator))
|
|
15
|
+
.join('\r\n');
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* CSV text back into rows.
|
|
19
|
+
*
|
|
20
|
+
* A scan, not a split: a quoted field may hold the separator, a line break
|
|
21
|
+
* or a doubled quote, and every real export uses all three. CRLF and LF both
|
|
22
|
+
* end a row, a BOM at the start is dropped (Excel writes one), and the
|
|
23
|
+
* separator is guessed when it is not given, so a semicolon file from a
|
|
24
|
+
* European Excel and a tab file pasted from anywhere read as themselves.
|
|
25
|
+
*/
|
|
26
|
+
export function csvRows(text, separator) {
|
|
27
|
+
const body = text.replace(/^/, '');
|
|
28
|
+
if (body === '')
|
|
29
|
+
return [];
|
|
30
|
+
const sep = separator ?? guessCsvSeparator(body);
|
|
31
|
+
const rows = [];
|
|
32
|
+
let row = [];
|
|
33
|
+
let field = '';
|
|
34
|
+
let quoted = false;
|
|
35
|
+
let i = 0;
|
|
36
|
+
const endField = () => { row.push(field); field = ''; };
|
|
37
|
+
const endRow = () => { endField(); rows.push(row); row = []; };
|
|
38
|
+
while (i < body.length) {
|
|
39
|
+
const ch = body[i];
|
|
40
|
+
if (quoted) {
|
|
41
|
+
if (ch === '"') {
|
|
42
|
+
if (body[i + 1] === '"') {
|
|
43
|
+
field += '"';
|
|
44
|
+
i += 2;
|
|
45
|
+
continue;
|
|
46
|
+
}
|
|
47
|
+
quoted = false;
|
|
48
|
+
i += 1;
|
|
49
|
+
continue;
|
|
50
|
+
}
|
|
51
|
+
field += ch;
|
|
52
|
+
i += 1;
|
|
53
|
+
continue;
|
|
54
|
+
}
|
|
55
|
+
if (ch === '"' && field === '') {
|
|
56
|
+
quoted = true;
|
|
57
|
+
i += 1;
|
|
58
|
+
continue;
|
|
59
|
+
}
|
|
60
|
+
if (body.startsWith(sep, i)) {
|
|
61
|
+
endField();
|
|
62
|
+
i += sep.length;
|
|
63
|
+
continue;
|
|
64
|
+
}
|
|
65
|
+
if (ch === '\r') {
|
|
66
|
+
if (body[i + 1] === '\n')
|
|
67
|
+
i += 1;
|
|
68
|
+
endRow();
|
|
69
|
+
i += 1;
|
|
70
|
+
continue;
|
|
71
|
+
}
|
|
72
|
+
if (ch === '\n') {
|
|
73
|
+
endRow();
|
|
74
|
+
i += 1;
|
|
75
|
+
continue;
|
|
76
|
+
}
|
|
77
|
+
field += ch;
|
|
78
|
+
i += 1;
|
|
79
|
+
}
|
|
80
|
+
if (field !== '' || row.length)
|
|
81
|
+
endRow();
|
|
82
|
+
return rows;
|
|
83
|
+
}
|
|
84
|
+
/** The separator a file uses: the one that divides its first lines evenly. */
|
|
85
|
+
export function guessCsvSeparator(text) {
|
|
86
|
+
const lines = text.split(/\r?\n/).filter((line) => line !== '').slice(0, 20);
|
|
87
|
+
if (!lines.length)
|
|
88
|
+
return ',';
|
|
89
|
+
let best = null;
|
|
90
|
+
for (const sep of [',', ';', '\t', '|']) {
|
|
91
|
+
// Count outside quotes: a comma inside "Smith, John" divides nothing.
|
|
92
|
+
const counts = lines.map((line) => {
|
|
93
|
+
let n = 0;
|
|
94
|
+
let quoted = false;
|
|
95
|
+
for (let i = 0; i < line.length; i += 1) {
|
|
96
|
+
const ch = line[i];
|
|
97
|
+
if (ch === '"') {
|
|
98
|
+
quoted = !quoted;
|
|
99
|
+
continue;
|
|
100
|
+
}
|
|
101
|
+
if (!quoted && line.startsWith(sep, i))
|
|
102
|
+
n += 1;
|
|
103
|
+
}
|
|
104
|
+
return n;
|
|
105
|
+
});
|
|
106
|
+
const present = counts.filter((n) => n > 0).length;
|
|
107
|
+
if (!present)
|
|
108
|
+
continue;
|
|
109
|
+
const first = counts.find((n) => n > 0) ?? 0;
|
|
110
|
+
const even = counts.every((n) => n === 0 || n === first);
|
|
111
|
+
const score = present * (even ? 3 : 1) + first;
|
|
112
|
+
if (!best || score > best.score)
|
|
113
|
+
best = { sep, score };
|
|
114
|
+
}
|
|
115
|
+
return best?.sep ?? ',';
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* A CSV (or TSV) file as a one-sheet document.
|
|
119
|
+
*
|
|
120
|
+
* Every spreadsheet exports CSV and every one of them reads it back the same
|
|
121
|
+
* way: a field that looks like a number IS a number, and one that looks like
|
|
122
|
+
* a percentage, a currency amount or a grouped number keeps the format it
|
|
123
|
+
* implies, which is what `parseEntry` decides for typing. A field is never
|
|
124
|
+
* read as a formula - a CSV holding `=1+1` is text in Excel too, since the
|
|
125
|
+
* file came from somewhere else.
|
|
126
|
+
*/
|
|
127
|
+
export function sheetStateFromCsv(text, sheetName = 'Sheet1', separator) {
|
|
128
|
+
const rows = csvRows(text, separator);
|
|
129
|
+
const cells = [];
|
|
130
|
+
const formats = {};
|
|
131
|
+
rows.forEach((row, r) => {
|
|
132
|
+
const line = [];
|
|
133
|
+
row.forEach((field, c) => {
|
|
134
|
+
const parsed = field === '' ? null : parseEntry(field);
|
|
135
|
+
if (parsed) {
|
|
136
|
+
line.push(parsed.value);
|
|
137
|
+
if (parsed.numFmt)
|
|
138
|
+
formats[formatKeyAt(r, c)] = { numFmt: parsed.numFmt };
|
|
139
|
+
return;
|
|
140
|
+
}
|
|
141
|
+
// A leading = would be read as a formula by the workbook, and this
|
|
142
|
+
// text was never one: Excel's own CSV import keeps it as it reads.
|
|
143
|
+
line.push(field.startsWith('=') ? `'${field}` : field);
|
|
144
|
+
});
|
|
145
|
+
cells.push(line);
|
|
146
|
+
});
|
|
147
|
+
return {
|
|
148
|
+
version: 1,
|
|
149
|
+
workbook: { sheets: [{ name: sheetName, cells }], active: sheetName, names: {} },
|
|
150
|
+
sheets: {
|
|
151
|
+
[sheetName]: {
|
|
152
|
+
formats, columnWidths: {}, rowHeights: [], hidden: { rows: [], cols: [] },
|
|
153
|
+
freeze: { rows: 0, cols: 0 }, comments: {}, protected: false,
|
|
154
|
+
merges: [], validation: [], conditionalFormats: [], autoFilter: null,
|
|
155
|
+
},
|
|
156
|
+
},
|
|
157
|
+
};
|
|
158
|
+
}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* How a locale spells a number, a date and a formula.
|
|
3
|
+
*
|
|
4
|
+
* The rule this module exists to enforce: **the workbook stores the
|
|
5
|
+
* invariant spelling, always.** A formula in the document is
|
|
6
|
+
* `=SUM(1.5, A1)` whatever the user's locale, and a number is `1234.5`.
|
|
7
|
+
* The culture is a layer over the top, applied when a formula is shown for
|
|
8
|
+
* editing and un-applied when one is typed.
|
|
9
|
+
*
|
|
10
|
+
* That is what Excel does, and it is the only arrangement where a file
|
|
11
|
+
* written in Berlin opens in Boston. Storing `=SUMME(1,5;A1)` would make
|
|
12
|
+
* the document's meaning depend on who saved it, and every reader, writer
|
|
13
|
+
* and test would have to carry the locale to make sense of a cell.
|
|
14
|
+
*
|
|
15
|
+
* What a culture changes:
|
|
16
|
+
* - the decimal mark and the group mark, `1.234,5` against `1,234.5`
|
|
17
|
+
* - the argument separator, which Excel makes `;` wherever the decimal
|
|
18
|
+
* mark is `,`, since `,` is then busy
|
|
19
|
+
* - the order of a slash date, `31/12` against `12/31`
|
|
20
|
+
*
|
|
21
|
+
* What it does NOT change: function names, which stay English here, and
|
|
22
|
+
* the spelling in the file, which stays invariant.
|
|
23
|
+
*/
|
|
24
|
+
export type SheetCulture = {
|
|
25
|
+
/** The locale this was derived from, for the number formatter. */
|
|
26
|
+
locale: string;
|
|
27
|
+
/** The decimal mark, `.` or `,`. */
|
|
28
|
+
decimal: string;
|
|
29
|
+
/** The group mark, which may be a non-breaking space. */
|
|
30
|
+
group: string;
|
|
31
|
+
/** What separates a function's arguments: `,`, or `;` where `,` is the
|
|
32
|
+
* decimal mark. */
|
|
33
|
+
argSeparator: string;
|
|
34
|
+
/** How a slash date reads: day first, month first, or year first. */
|
|
35
|
+
dateOrder: 'dmy' | 'mdy' | 'ymd';
|
|
36
|
+
};
|
|
37
|
+
export declare const SPACE_GROUP_MARKS: ReadonlyArray<string>;
|
|
38
|
+
/** The spelling the document itself uses, and the default. */
|
|
39
|
+
export declare const INVARIANT_CULTURE: SheetCulture;
|
|
40
|
+
/**
|
|
41
|
+
* The culture a locale implies, read off `Intl` rather than a table, so a
|
|
42
|
+
* locale nobody thought of still comes out right.
|
|
43
|
+
*
|
|
44
|
+
* Falls back to the invariant culture where `Intl` is missing or the
|
|
45
|
+
* locale is not one it knows, since a sheet that renders in the wrong
|
|
46
|
+
* separators is better than one that does not render.
|
|
47
|
+
*/
|
|
48
|
+
export declare function cultureFromLocale(locale: string): SheetCulture;
|
|
49
|
+
/** True where the culture spells everything the way the document does. */
|
|
50
|
+
export declare const isInvariant: (c: SheetCulture) => boolean;
|
|
51
|
+
/**
|
|
52
|
+
* A stored formula as the user's locale spells it, for the formula bar.
|
|
53
|
+
*
|
|
54
|
+
* `=SUM(1.5, A1)` becomes `=SUM(1,5; A1)` in a German sheet.
|
|
55
|
+
*/
|
|
56
|
+
export declare function formulaToCulture(formula: string, culture: SheetCulture): string;
|
|
57
|
+
/**
|
|
58
|
+
* A typed formula back to the spelling the document stores.
|
|
59
|
+
*
|
|
60
|
+
* The inverse of `formulaToCulture`, with one deliberate kindness: where
|
|
61
|
+
* the culture's separator is `;`, a `,` between arguments is taken as a
|
|
62
|
+
* separator too, so a user with an English keyboard habit is not stopped.
|
|
63
|
+
* A `,` that sits between digits is still the decimal mark, so nothing
|
|
64
|
+
* ambiguous is guessed at.
|
|
65
|
+
*/
|
|
66
|
+
export declare function formulaFromCulture(formula: string, culture: SheetCulture): string;
|
|
67
|
+
/**
|
|
68
|
+
* A number as the culture writes it, back to a plain number.
|
|
69
|
+
*
|
|
70
|
+
* Returns null when the text is not a number in this culture, so the
|
|
71
|
+
* caller can fall through to treating it as text. The group mark is
|
|
72
|
+
* dropped wherever it appears rather than checked for position, as Excel
|
|
73
|
+
* does: `1.2.3,4` is not worth refusing on a technicality.
|
|
74
|
+
*/
|
|
75
|
+
export declare function parseNumberInCulture(text: string, culture: SheetCulture): number | null;
|
|
76
|
+
/** A number as the culture writes it, for display. */
|
|
77
|
+
export declare function formatNumberInCulture(value: number, culture: SheetCulture): string;
|
|
78
|
+
/**
|
|
79
|
+
* The day, month and year a slash date names, in this culture's order.
|
|
80
|
+
*
|
|
81
|
+
* Returns null when the pieces cannot be a date, which is what tells a
|
|
82
|
+
* slash date apart from a fraction typed without a whole part.
|
|
83
|
+
*/
|
|
84
|
+
export declare function slashDateParts(a: number, b: number, culture: SheetCulture): {
|
|
85
|
+
month: number;
|
|
86
|
+
day: number;
|
|
87
|
+
} | null;
|