@omegagrid/grid-core 0.5.20 → 0.6.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/dist/__generated/functions.d.ts.map +1 -1
- package/dist/__generated/functions.js +1 -3
- package/dist/__generated/functions.js.map +1 -1
- package/dist/calculations/autofill.js +15 -22
- package/dist/calculations/autofill.js.map +1 -1
- package/dist/calculations/conditions.js +7 -12
- package/dist/calculations/conditions.js.map +1 -1
- package/dist/calculations/context.d.ts.map +1 -1
- package/dist/calculations/context.js +7 -11
- package/dist/calculations/context.js.map +1 -1
- package/dist/calculations/formula.js +78 -89
- package/dist/calculations/formula.js.map +1 -1
- package/dist/calculations/functions/dates.d.ts.map +1 -1
- package/dist/calculations/functions/dates.js +26 -40
- package/dist/calculations/functions/dates.js.map +1 -1
- package/dist/calculations/functions/index.js +10 -43
- package/dist/calculations/functions/index.js.map +1 -1
- package/dist/calculations/functions/logical.js +13 -25
- package/dist/calculations/functions/logical.js.map +1 -1
- package/dist/calculations/functions/lookup.js +27 -46
- package/dist/calculations/functions/lookup.js.map +1 -1
- package/dist/calculations/functions/math.js +74 -137
- package/dist/calculations/functions/math.js.map +1 -1
- package/dist/calculations/functions/special.js +1 -5
- package/dist/calculations/functions/special.js.map +1 -1
- package/dist/calculations/functions/statistical.js +17 -29
- package/dist/calculations/functions/statistical.js.map +1 -1
- package/dist/calculations/functions/text.js +9 -17
- package/dist/calculations/functions/text.js.map +1 -1
- package/dist/calculations/helpers.js +6 -15
- package/dist/calculations/helpers.js.map +1 -1
- package/dist/calculations/index.js +6 -35
- package/dist/calculations/index.js.map +1 -1
- package/dist/calculations/operators.d.ts.map +1 -1
- package/dist/calculations/operators.js +14 -23
- package/dist/calculations/operators.js.map +1 -1
- package/dist/calculations/tokenization.d.ts +1 -1
- package/dist/calculations/tokenization.d.ts.map +1 -1
- package/dist/calculations/tokenization.js +18 -26
- package/dist/calculations/tokenization.js.map +1 -1
- package/dist/common/index.js +1 -17
- package/dist/common/index.js.map +1 -1
- package/dist/common/range.js +6 -15
- package/dist/common/range.js.map +1 -1
- package/dist/constants.d.ts +13 -12
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +5 -8
- package/dist/constants.js.map +1 -1
- package/dist/index.js +7 -40
- package/dist/index.js.map +1 -1
- package/dist/model/calculationModel.js +9 -13
- package/dist/model/calculationModel.js.map +1 -1
- package/dist/model/cellModel.js +44 -53
- package/dist/model/cellModel.js.map +1 -1
- package/dist/model/columnModel.d.ts +5 -6
- package/dist/model/columnModel.d.ts.map +1 -1
- package/dist/model/columnModel.js +15 -22
- package/dist/model/columnModel.js.map +1 -1
- package/dist/model/commentModel.js +8 -13
- package/dist/model/commentModel.js.map +1 -1
- package/dist/model/conditionalFormats.d.ts +3 -3
- package/dist/model/conditionalFormats.js +22 -27
- package/dist/model/conditionalFormats.js.map +1 -1
- package/dist/model/cssStyle.d.ts.map +1 -1
- package/dist/model/cssStyle.js +38 -53
- package/dist/model/cssStyle.js.map +1 -1
- package/dist/model/dependencies.js +6 -10
- package/dist/model/dependencies.js.map +1 -1
- package/dist/model/elementModel.js +8 -12
- package/dist/model/elementModel.js.map +1 -1
- package/dist/model/filterModel.d.ts.map +1 -1
- package/dist/model/filterModel.js +26 -39
- package/dist/model/filterModel.js.map +1 -1
- package/dist/model/gridModel.d.ts.map +1 -1
- package/dist/model/gridModel.js +70 -84
- package/dist/model/gridModel.js.map +1 -1
- package/dist/model/groupModel.d.ts +1 -1
- package/dist/model/groupModel.js +5 -10
- package/dist/model/groupModel.js.map +1 -1
- package/dist/model/history.js +1 -5
- package/dist/model/history.js.map +1 -1
- package/dist/model/index.js +20 -36
- package/dist/model/index.js.map +1 -1
- package/dist/model/iterableRange.js +5 -10
- package/dist/model/iterableRange.js.map +1 -1
- package/dist/model/namingModel.js +8 -13
- package/dist/model/namingModel.js.map +1 -1
- package/dist/model/options.js +12 -39
- package/dist/model/options.js.map +1 -1
- package/dist/model/rowModel.d.ts +3 -3
- package/dist/model/rowModel.d.ts.map +1 -1
- package/dist/model/rowModel.js +12 -17
- package/dist/model/rowModel.js.map +1 -1
- package/dist/model/selectionModel.js +5 -9
- package/dist/model/selectionModel.js.map +1 -1
- package/dist/model/sortingModel.js +8 -13
- package/dist/model/sortingModel.js.map +1 -1
- package/dist/model/style.js +9 -18
- package/dist/model/style.js.map +1 -1
- package/dist/model/styleModel.js +7 -11
- package/dist/model/styleModel.js.map +1 -1
- package/dist/model/tableTheme.js +6 -11
- package/dist/model/tableTheme.js.map +1 -1
- package/dist/sparklines/index.js +1 -17
- package/dist/sparklines/index.js.map +1 -1
- package/dist/sparklines/sparklines.js +22 -30
- package/dist/sparklines/sparklines.js.map +1 -1
- package/dist/types.js +1 -2
- package/dist/utils.js +4 -9
- package/dist/utils.js.map +1 -1
- package/package.json +4 -4
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"functions.d.ts","sourceRoot":"","sources":["../../src/__generated/functions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,UAAU,CAAC
|
|
1
|
+
{"version":3,"file":"functions.d.ts","sourceRoot":"","sources":["../../src/__generated/functions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,UAAU,CAAC;wBA4ChC,2BAA2B;AAAvD,wBAAwD"}
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
1
|
const functions = JSON.parse(`[
|
|
4
2
|
{
|
|
5
3
|
"name": "text",
|
|
@@ -43,5 +41,5 @@ const functions = JSON.parse(`[
|
|
|
43
41
|
]
|
|
44
42
|
}
|
|
45
43
|
]`);
|
|
46
|
-
|
|
44
|
+
export default functions;
|
|
47
45
|
//# sourceMappingURL=functions.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"functions.js","sourceRoot":"","sources":["../../src/__generated/functions.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"functions.js","sourceRoot":"","sources":["../../src/__generated/functions.ts"],"names":[],"mappings":"AACA,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA0C3B,CAAC,CAAC;AACJ,eAAe,SAAwC,CAAC"}
|
|
@@ -1,10 +1,6 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
const core_1 = require("@omegagrid/core");
|
|
5
|
-
const _1 = require(".");
|
|
6
|
-
function extrapolateValues(source, count) {
|
|
7
|
-
var _a;
|
|
1
|
+
import { matrix } from "@omegagrid/core";
|
|
2
|
+
import { Formula, prefixFormula } from ".";
|
|
3
|
+
export function extrapolateValues(source, count) {
|
|
8
4
|
const result = Array(count).fill(null);
|
|
9
5
|
let increment = 0;
|
|
10
6
|
let inputValues = [];
|
|
@@ -20,7 +16,7 @@ function extrapolateValues(source, count) {
|
|
|
20
16
|
}
|
|
21
17
|
if (increment == 0) {
|
|
22
18
|
for (let i = 0; i < count; i++) {
|
|
23
|
-
result[i] =
|
|
19
|
+
result[i] = source[i % source.length]?.value;
|
|
24
20
|
}
|
|
25
21
|
}
|
|
26
22
|
else {
|
|
@@ -31,12 +27,11 @@ function extrapolateValues(source, count) {
|
|
|
31
27
|
}
|
|
32
28
|
return result;
|
|
33
29
|
}
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
const formula = new _1.Formula(cell.formula, cell.model.calculations.tokenizer);
|
|
30
|
+
export function extrapolateFormulas(cell, direction, count) {
|
|
31
|
+
const formula = new Formula(cell.formula, cell.model.calculations.tokenizer);
|
|
37
32
|
const result = [];
|
|
38
33
|
for (let i = 0; i < count; i++) {
|
|
39
|
-
result.push(
|
|
34
|
+
result.push(prefixFormula(formula.shift({
|
|
40
35
|
index: 0,
|
|
41
36
|
offset: 1,
|
|
42
37
|
direction: direction,
|
|
@@ -45,18 +40,17 @@ function extrapolateFormulas(cell, direction, count) {
|
|
|
45
40
|
}
|
|
46
41
|
return result;
|
|
47
42
|
}
|
|
48
|
-
|
|
49
|
-
function autofill(model, selectedRange, autofillRange, direction) {
|
|
43
|
+
export function autofill(model, selectedRange, autofillRange, direction) {
|
|
50
44
|
const sourceMatrix = model.getCellMatrix(selectedRange);
|
|
51
45
|
let input;
|
|
52
46
|
if (direction == 'right')
|
|
53
|
-
input =
|
|
47
|
+
input = matrix.clone(sourceMatrix);
|
|
54
48
|
else if (direction == 'down')
|
|
55
|
-
input =
|
|
49
|
+
input = matrix.transpose(sourceMatrix);
|
|
56
50
|
else if (direction == 'left')
|
|
57
|
-
input =
|
|
51
|
+
input = matrix.reverseColumns(sourceMatrix);
|
|
58
52
|
else if (direction == 'up')
|
|
59
|
-
input =
|
|
53
|
+
input = matrix.reverseColumns(matrix.transpose(sourceMatrix));
|
|
60
54
|
const displayValueMatrix = new Array(autofillRange.size.rows);
|
|
61
55
|
for (let r = 0; r < autofillRange.size.rows; r++) {
|
|
62
56
|
displayValueMatrix[r] = (new Array(autofillRange.size.columns));
|
|
@@ -75,11 +69,11 @@ function autofill(model, selectedRange, autofillRange, direction) {
|
|
|
75
69
|
return extrapolateValues(vect, autofillCount);
|
|
76
70
|
});
|
|
77
71
|
if (direction == 'down')
|
|
78
|
-
output =
|
|
72
|
+
output = matrix.transpose(output);
|
|
79
73
|
else if (direction == 'left')
|
|
80
|
-
output =
|
|
74
|
+
output = matrix.reverseColumns(output);
|
|
81
75
|
else if (direction == 'up')
|
|
82
|
-
output =
|
|
76
|
+
output = matrix.reverseRows(matrix.transpose(output));
|
|
83
77
|
return model.spillValues({
|
|
84
78
|
cell: model.getCellByRange(autofillRange.bounds[0][0]),
|
|
85
79
|
values: output,
|
|
@@ -87,5 +81,4 @@ function autofill(model, selectedRange, autofillRange, direction) {
|
|
|
87
81
|
displayValues: displayValueMatrix
|
|
88
82
|
});
|
|
89
83
|
}
|
|
90
|
-
exports.autofill = autofill;
|
|
91
84
|
//# sourceMappingURL=autofill.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"autofill.js","sourceRoot":"","sources":["../../src/calculations/autofill.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"autofill.js","sourceRoot":"","sources":["../../src/calculations/autofill.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,12 +1,9 @@
|
|
|
1
|
-
"use strict";
|
|
2
1
|
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
const core_1 = require("@omegagrid/core");
|
|
6
|
-
function scalarCompare(s1, s2) {
|
|
2
|
+
import { utils } from "@omegagrid/core";
|
|
3
|
+
export function scalarCompare(s1, s2) {
|
|
7
4
|
if ((isNaN(s1) || s1 == null) && (isNaN(s2) || s2 == null)) {
|
|
8
|
-
s1 = s1 == null ? '' :
|
|
9
|
-
s2 = s2 == null ? '' :
|
|
5
|
+
s1 = s1 == null ? '' : utils.removeAccents(s1.toString()).toLowerCase();
|
|
6
|
+
s2 = s2 == null ? '' : utils.removeAccents(s2.toString()).toLowerCase();
|
|
10
7
|
}
|
|
11
8
|
if (s1 > s2)
|
|
12
9
|
return 1;
|
|
@@ -14,10 +11,9 @@ function scalarCompare(s1, s2) {
|
|
|
14
11
|
return -1;
|
|
15
12
|
return 0;
|
|
16
13
|
}
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
if (core_1.utils.isString(condition)) {
|
|
14
|
+
export function evalCondition(condition, value) {
|
|
15
|
+
const isStringValue = utils.isString(value);
|
|
16
|
+
if (utils.isString(condition)) {
|
|
21
17
|
condition = condition.toString().trim();
|
|
22
18
|
if (condition.startsWith('=')) {
|
|
23
19
|
return scalarCompare(value, isStringValue ? condition.substring(1) : parseFloat(condition.substring(1))) == 0;
|
|
@@ -42,5 +38,4 @@ function evalCondition(condition, value) {
|
|
|
42
38
|
return value == condition;
|
|
43
39
|
}
|
|
44
40
|
}
|
|
45
|
-
exports.evalCondition = evalCondition;
|
|
46
41
|
//# sourceMappingURL=conditions.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"conditions.js","sourceRoot":"","sources":["../../src/calculations/conditions.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"conditions.js","sourceRoot":"","sources":["../../src/calculations/conditions.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/calculations/context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACzC,OAAO,EAAa,YAAY,EAAE,MAAM,WAAW,CAAC;AACpD,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAEhD,OAAO,EAAE,QAAQ,EAAmB,MAAM,aAAa,CAAC;AAExD,qBAAa,kBAAkB;aAIF,KAAK,EAAE,SAAS;IAF5C,WAAW,EAAE,SAAS,CAAC;gBAEK,KAAK,EAAE,SAAS;IAE5C,QAAQ,UAAW,MAAM,eAIxB;IAED;;;;;OAKG;IACH,EAAE,QAAS,YAAY,UAAU,MAAM,KAAG,OAAO,CAG/C;IAEF;;;;;OAKG;IACH,EAAE,OAAQ,YAAY,UAAU,MAAM,qBAGrC;IAED;;;;;OAKG;IACH,EAAE,SAAU,MAAM,UAAU,MAAM,KAAG,OAAO,CAE1C;IAEF;;;;;OAKG;IACH,EAAE,SAAU,MAAM,UAAU,MAAM,KAAG,OAAO,CAK1C;IAEF;;;;OAIG;IACH,EAAE,SAAU,MAAM,kCAIhB;IAEF;;;;;;OAMG;IACH,EAAE,
|
|
1
|
+
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/calculations/context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACzC,OAAO,EAAa,YAAY,EAAE,MAAM,WAAW,CAAC;AACpD,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAEhD,OAAO,EAAE,QAAQ,EAAmB,MAAM,aAAa,CAAC;AAExD,qBAAa,kBAAkB;aAIF,KAAK,EAAE,SAAS;IAF5C,WAAW,EAAE,SAAS,CAAC;gBAEK,KAAK,EAAE,SAAS;IAE5C,QAAQ,UAAW,MAAM,eAIxB;IAED;;;;;OAKG;IACH,EAAE,QAAS,YAAY,UAAU,MAAM,KAAG,OAAO,CAG/C;IAEF;;;;;OAKG;IACH,EAAE,OAAQ,YAAY,UAAU,MAAM,qBAGrC;IAED;;;;;OAKG;IACH,EAAE,SAAU,MAAM,UAAU,MAAM,KAAG,OAAO,CAE1C;IAEF;;;;;OAKG;IACH,EAAE,SAAU,MAAM,UAAU,MAAM,KAAG,OAAO,CAK1C;IAEF;;;;OAIG;IACH,EAAE,SAAU,MAAM,kCAIhB;IAEF;;;;;;OAMG;IACH,EAAE,aAAc,MAAM,YAAY,MAAM,YAAY,QAAQ,KAAG,MAAM,CAEpE;CACD"}
|
|
@@ -1,10 +1,7 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
const functions_1 = require("./functions");
|
|
6
|
-
const operators_1 = require("./operators");
|
|
7
|
-
class CalculationContext {
|
|
1
|
+
import { CellRange } from "../common";
|
|
2
|
+
import { _map } from "./functions";
|
|
3
|
+
import { matrixOperation } from "./operators";
|
|
4
|
+
export class CalculationContext {
|
|
8
5
|
constructor(model) {
|
|
9
6
|
this.model = model;
|
|
10
7
|
this.getModel = (sheet) => {
|
|
@@ -31,7 +28,7 @@ class CalculationContext {
|
|
|
31
28
|
*/
|
|
32
29
|
this.rn = (a1, sheet) => {
|
|
33
30
|
const m = this.getModel(sheet);
|
|
34
|
-
return m.getValuesInRange(
|
|
31
|
+
return m.getValuesInRange(CellRange.fromA1(a1));
|
|
35
32
|
};
|
|
36
33
|
/**
|
|
37
34
|
* Returns cell value by range name
|
|
@@ -61,7 +58,7 @@ class CalculationContext {
|
|
|
61
58
|
* @returns
|
|
62
59
|
*/
|
|
63
60
|
this.fn = (name) => {
|
|
64
|
-
const fn =
|
|
61
|
+
const fn = _map.get(name);
|
|
65
62
|
if (fn)
|
|
66
63
|
return fn;
|
|
67
64
|
throw new Error(`Function "${name}" not found`);
|
|
@@ -74,9 +71,8 @@ class CalculationContext {
|
|
|
74
71
|
* @return value
|
|
75
72
|
*/
|
|
76
73
|
this.op = (operand1, operand2, operator) => {
|
|
77
|
-
return
|
|
74
|
+
return matrixOperation(operand1, operand2, operator);
|
|
78
75
|
};
|
|
79
76
|
}
|
|
80
77
|
}
|
|
81
|
-
exports.CalculationContext = CalculationContext;
|
|
82
78
|
//# sourceMappingURL=context.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/calculations/context.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/calculations/context.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAgB,MAAM,WAAW,CAAC;AAEpD,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AACnC,OAAO,EAAY,eAAe,EAAE,MAAM,aAAa,CAAC;AAExD,MAAM,OAAO,kBAAkB;IAI9B,YAA4B,KAAgB;QAAhB,UAAK,GAAL,KAAK,CAAW;QAE5C,aAAQ,GAAG,CAAC,KAAa,EAAE,EAAE;YAC5B,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC;YACnE,IAAI,CAAC;gBAAE,OAAO,CAAC,CAAC;YAChB,MAAM,IAAI,KAAK,CAAC,UAAU,KAAK,aAAa,CAAC,CAAA;QAC9C,CAAC,CAAA;QAED;;;;;WAKG;QACH,OAAE,GAAG,CAAC,EAAiB,EAAE,KAAc,EAAW,EAAE;YACnD,MAAM,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;YAC/B,OAAO,CAAC,EAAE,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC;QAClE,CAAC,CAAC;QAEF;;;;;WAKG;QACH,OAAE,GAAG,CAAC,EAAgB,EAAE,KAAc,EAAE,EAAE;YACzC,MAAM,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;YAC/B,OAAO,CAAC,CAAC,gBAAgB,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;QACjD,CAAC,CAAA;QAED;;;;;WAKG;QACH,OAAE,GAAG,CAAC,IAAY,EAAE,KAAc,EAAW,EAAE;YAC9C,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,aAAa,CAAC,IAAI,EAAE,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC;QAC/E,CAAC,CAAC;QAEF;;;;;WAKG;QACH,OAAE,GAAG,CAAC,IAAY,EAAE,KAAc,EAAW,EAAE;YAC9C,MAAM,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;YAC/B,MAAM,MAAM,GAAG,CAAC,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC;YAC5C,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACvE,OAAO,MAAM,CAAC;QACf,CAAC,CAAC;QAEF;;;;WAIG;QACH,OAAE,GAAG,CAAC,IAAY,EAAE,EAAE;YACrB,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAC1B,IAAI,EAAE;gBAAE,OAAO,EAAE,CAAC;YAClB,MAAM,IAAI,KAAK,CAAC,aAAa,IAAI,aAAa,CAAC,CAAC;QACjD,CAAC,CAAC;QAEF;;;;;;WAMG;QACH,OAAE,GAAG,CAAC,QAAgB,EAAE,QAAgB,EAAE,QAAkB,EAAU,EAAE;YACvE,OAAO,eAAe,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;QACtD,CAAC,CAAA;IAzE+C,CAAC;CA0EjD"}
|
|
@@ -1,16 +1,10 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
const
|
|
6
|
-
const
|
|
7
|
-
const
|
|
8
|
-
const isFormula = (value) => value && value.length > 0 && value.charAt(0) == '=' ? true : false;
|
|
9
|
-
exports.isFormula = isFormula;
|
|
10
|
-
const prefixFormula = (value) => (0, exports.isFormula)(value) ? value : ('=' + (value !== null && value !== void 0 ? value : ''));
|
|
11
|
-
exports.prefixFormula = prefixFormula;
|
|
12
|
-
const stripFormulaPrefix = (value) => (0, exports.isFormula)(value) ? value.substring(1) : value;
|
|
13
|
-
exports.stripFormulaPrefix = stripFormulaPrefix;
|
|
1
|
+
import { TokenType } from "./tokenization";
|
|
2
|
+
import { CellRange } from "../common";
|
|
3
|
+
import { operatorMap } from "./operators";
|
|
4
|
+
import { isArrayFunction } from "./helpers";
|
|
5
|
+
export const isFormula = (value) => value && value.length > 0 && value.charAt(0) == '=' ? true : false;
|
|
6
|
+
export const prefixFormula = (value) => isFormula(value) ? value : ('=' + (value ?? ''));
|
|
7
|
+
export const stripFormulaPrefix = (value) => isFormula(value) ? value.substring(1) : value;
|
|
14
8
|
const colors = ['#5B97FF', '#FF616B', '#B77CFF', '#00B02C', '#FC58BE', '#FF9000', '#2EB0B3'];
|
|
15
9
|
const getColor = (index) => colors[index % colors.length];
|
|
16
10
|
const xlPrefixes = new Map([
|
|
@@ -22,11 +16,10 @@ const xlPrefixes = new Map([
|
|
|
22
16
|
['XOR', '_xlfn.'],
|
|
23
17
|
]);
|
|
24
18
|
const getXlFunctionPrefix = (fn) => {
|
|
25
|
-
|
|
26
|
-
return (_a = xlPrefixes.get(fn)) !== null && _a !== void 0 ? _a : '';
|
|
19
|
+
return xlPrefixes.get(fn) ?? '';
|
|
27
20
|
};
|
|
28
|
-
class Formula {
|
|
29
|
-
get fn() {
|
|
21
|
+
export class Formula {
|
|
22
|
+
get fn() { return this._fn ?? (this._fn = (new Function('t', 'ctx', 'return ' + this.compile()))); }
|
|
30
23
|
get tokens() { return this._tokens; }
|
|
31
24
|
get variables() { return this._variables; }
|
|
32
25
|
get cells() { return this._cells; }
|
|
@@ -36,12 +29,12 @@ class Formula {
|
|
|
36
29
|
this._colors = new Map();
|
|
37
30
|
let sheet;
|
|
38
31
|
this._tokens.forEach((t, i) => {
|
|
39
|
-
if ([
|
|
32
|
+
if ([TokenType.Cell, TokenType.Range].includes(t[1])) {
|
|
40
33
|
const key = (sheet ? ('\'' + sheet + '\'!') : '') + t[0];
|
|
41
34
|
this._colors.set(key, { color: getColor(this._colors.size), address: t[0], sheet: sheet, type: t[1], tokenIndex: i });
|
|
42
35
|
sheet = null;
|
|
43
36
|
}
|
|
44
|
-
else if (t[1] ==
|
|
37
|
+
else if (t[1] == TokenType.Sheet) {
|
|
45
38
|
sheet = t[0];
|
|
46
39
|
}
|
|
47
40
|
});
|
|
@@ -70,13 +63,13 @@ class Formula {
|
|
|
70
63
|
*/
|
|
71
64
|
findSheetTokenIndex(tokenIndex) {
|
|
72
65
|
const token = this._tokens[tokenIndex];
|
|
73
|
-
if (![
|
|
66
|
+
if (![TokenType.Cell, TokenType.Range].includes(token[1]))
|
|
74
67
|
return -1;
|
|
75
|
-
if (tokenIndex == 0 || this._tokens[tokenIndex - 1][1] !=
|
|
68
|
+
if (tokenIndex == 0 || this._tokens[tokenIndex - 1][1] != TokenType.SheetSeparator)
|
|
76
69
|
return -1;
|
|
77
70
|
let i = tokenIndex - 2;
|
|
78
71
|
while (i >= 0) {
|
|
79
|
-
if (this._tokens[i][1] ==
|
|
72
|
+
if (this._tokens[i][1] == TokenType.Sheet)
|
|
80
73
|
return i;
|
|
81
74
|
i--;
|
|
82
75
|
}
|
|
@@ -88,15 +81,15 @@ class Formula {
|
|
|
88
81
|
* @returns number of tokens removed
|
|
89
82
|
*/
|
|
90
83
|
removeSheetToken(tokenIndex) {
|
|
91
|
-
if (this._tokens[tokenIndex][1] !=
|
|
84
|
+
if (this._tokens[tokenIndex][1] != TokenType.Sheet) {
|
|
92
85
|
tokenIndex = this.findSheetTokenIndex(tokenIndex);
|
|
93
86
|
}
|
|
94
87
|
if (tokenIndex > -1) {
|
|
95
|
-
if (tokenIndex > 0 && this._tokens[tokenIndex - 1][1] ==
|
|
88
|
+
if (tokenIndex > 0 && this._tokens[tokenIndex - 1][1] == TokenType.SheetQuote)
|
|
96
89
|
tokenIndex--;
|
|
97
90
|
let maxIndex = tokenIndex;
|
|
98
91
|
while (maxIndex < this._tokens.length && [
|
|
99
|
-
|
|
92
|
+
TokenType.SheetSeparator, TokenType.SheetQuote, TokenType.Sheet
|
|
100
93
|
].includes(this._tokens[maxIndex][1])) {
|
|
101
94
|
maxIndex++;
|
|
102
95
|
}
|
|
@@ -106,8 +99,7 @@ class Formula {
|
|
|
106
99
|
return 0;
|
|
107
100
|
}
|
|
108
101
|
getNamedColor(name) {
|
|
109
|
-
|
|
110
|
-
return (_b = (_a = this.colors.get(name)) === null || _a === void 0 ? void 0 : _a.color) !== null && _b !== void 0 ? _b : 'inherit';
|
|
102
|
+
return this.colors.get(name)?.color ?? 'inherit';
|
|
111
103
|
}
|
|
112
104
|
getTokenPosition(index) {
|
|
113
105
|
let min = 0;
|
|
@@ -140,15 +132,15 @@ class Formula {
|
|
|
140
132
|
this._formula = null;
|
|
141
133
|
this._xlFormula = null;
|
|
142
134
|
const tokens = [];
|
|
143
|
-
if (type ==
|
|
144
|
-
tokens.push([this.tokenizer.options.sheetQuote,
|
|
145
|
-
tokens.push([value,
|
|
146
|
-
tokens.push([this.tokenizer.options.sheetQuote,
|
|
135
|
+
if (type == TokenType.Sheet && /\s/.test(value)) {
|
|
136
|
+
tokens.push([this.tokenizer.options.sheetQuote, TokenType.SheetQuote]);
|
|
137
|
+
tokens.push([value, TokenType.Sheet]);
|
|
138
|
+
tokens.push([this.tokenizer.options.sheetQuote, TokenType.SheetQuote]);
|
|
147
139
|
}
|
|
148
140
|
else {
|
|
149
141
|
tokens.push([value, type]);
|
|
150
142
|
}
|
|
151
|
-
tokens.push(['!',
|
|
143
|
+
tokens.push(['!', TokenType.SheetSeparator]);
|
|
152
144
|
this._tokens.splice(index, 0, ...tokens);
|
|
153
145
|
return tokens.length;
|
|
154
146
|
}
|
|
@@ -162,19 +154,19 @@ class Formula {
|
|
|
162
154
|
let sheet;
|
|
163
155
|
this._tokens.forEach((t, i) => {
|
|
164
156
|
switch (t[1]) {
|
|
165
|
-
case
|
|
157
|
+
case TokenType.Sheet:
|
|
166
158
|
sheet = t[0];
|
|
167
159
|
break;
|
|
168
|
-
case
|
|
160
|
+
case TokenType.Variable:
|
|
169
161
|
this._variables.push([i, t[0], sheet]);
|
|
170
162
|
sheet = undefined;
|
|
171
163
|
break;
|
|
172
|
-
case
|
|
173
|
-
this._cells.push([i,
|
|
164
|
+
case TokenType.Cell:
|
|
165
|
+
this._cells.push([i, CellRange.fromA1(t[0]), sheet]);
|
|
174
166
|
sheet = undefined;
|
|
175
167
|
break;
|
|
176
|
-
case
|
|
177
|
-
this._ranges.push([i,
|
|
168
|
+
case TokenType.Range:
|
|
169
|
+
this._ranges.push([i, CellRange.fromA1(t[0]), sheet]);
|
|
178
170
|
sheet = undefined;
|
|
179
171
|
break;
|
|
180
172
|
}
|
|
@@ -189,38 +181,38 @@ class Formula {
|
|
|
189
181
|
for (let i = 0; i < this._tokens.length; i++) {
|
|
190
182
|
token = this._tokens[i];
|
|
191
183
|
switch (token[1]) {
|
|
192
|
-
case
|
|
184
|
+
case TokenType.SheetQuote:
|
|
193
185
|
formula += '\'';
|
|
194
186
|
break;
|
|
195
|
-
case
|
|
187
|
+
case TokenType.SheetSeparator:
|
|
196
188
|
formula += '!';
|
|
197
189
|
break;
|
|
198
|
-
case
|
|
190
|
+
case TokenType.Sheet:
|
|
199
191
|
sheet = token[0];
|
|
200
192
|
formula += html ? `<span style="font-style:italic">${sheet}</span>` : sheet;
|
|
201
193
|
break;
|
|
202
|
-
case
|
|
194
|
+
case TokenType.Variable:
|
|
203
195
|
formula += token[0];
|
|
204
196
|
break;
|
|
205
|
-
case
|
|
206
|
-
case
|
|
197
|
+
case TokenType.Range:
|
|
198
|
+
case TokenType.Cell:
|
|
207
199
|
colorKey = (sheet ? ('\'' + sheet + '\'!') : '') + token[0];
|
|
208
200
|
formula += html ? `<span style="color:${this.getNamedColor(colorKey)}">${token[0]}</span>` : token[0];
|
|
209
201
|
sheet = null;
|
|
210
202
|
break;
|
|
211
|
-
case
|
|
203
|
+
case TokenType.StringQuote:
|
|
212
204
|
formula += opts.stringQuote;
|
|
213
205
|
break;
|
|
214
|
-
case
|
|
206
|
+
case TokenType.String:
|
|
215
207
|
formula += token[0].replace(new RegExp(opts.stringQuote, 'g'), '\\' + opts.stringQuote);
|
|
216
208
|
break;
|
|
217
|
-
case
|
|
209
|
+
case TokenType.ArgumentSeparator:
|
|
218
210
|
formula += opts.argumentSeparator;
|
|
219
211
|
break;
|
|
220
|
-
case
|
|
212
|
+
case TokenType.Function:
|
|
221
213
|
formula += (fnPrefixes ? getXlFunctionPrefix(token[0]) : '') + token[0];
|
|
222
214
|
break;
|
|
223
|
-
case
|
|
215
|
+
case TokenType.Unknown:
|
|
224
216
|
formula += html
|
|
225
217
|
? `<span style="background:#f00;color:#fff">${token[0]}</span>`
|
|
226
218
|
: token[0];
|
|
@@ -243,26 +235,26 @@ class Formula {
|
|
|
243
235
|
for (let i = 0; i < tokens.length; i++) {
|
|
244
236
|
token = tokens[i];
|
|
245
237
|
switch (token[1]) {
|
|
246
|
-
case
|
|
238
|
+
case TokenType.Sheet:
|
|
247
239
|
sheet = token[0];
|
|
248
240
|
break;
|
|
249
|
-
case
|
|
250
|
-
case
|
|
241
|
+
case TokenType.Cell:
|
|
242
|
+
case TokenType.Range:
|
|
251
243
|
nodeStack.push({ t: token[0], tt: token[1], s: sheet });
|
|
252
244
|
sheet = null;
|
|
253
245
|
break;
|
|
254
|
-
case
|
|
255
|
-
case
|
|
256
|
-
case
|
|
257
|
-
case
|
|
246
|
+
case TokenType.Number:
|
|
247
|
+
case TokenType.String:
|
|
248
|
+
case TokenType.Boolean:
|
|
249
|
+
case TokenType.Variable:
|
|
258
250
|
nodeStack.push({ t: token[0], tt: token[1] });
|
|
259
251
|
break;
|
|
260
|
-
case
|
|
252
|
+
case TokenType.Operator:
|
|
261
253
|
if (nodeStack.length == 0)
|
|
262
|
-
nodeStack.push({ t: '', tt:
|
|
263
|
-
op1 =
|
|
254
|
+
nodeStack.push({ t: '', tt: TokenType.Operand }); // generic operand
|
|
255
|
+
op1 = operatorMap.get(token[0]);
|
|
264
256
|
while (operatorStack.length > 0) {
|
|
265
|
-
op2 =
|
|
257
|
+
op2 = operatorMap.get(operatorStack[operatorStack.length - 1][0]);
|
|
266
258
|
if (!op2)
|
|
267
259
|
break;
|
|
268
260
|
// operators with higher precedence or equal precedence and left associativity
|
|
@@ -274,17 +266,17 @@ class Formula {
|
|
|
274
266
|
}
|
|
275
267
|
operatorStack.push(token);
|
|
276
268
|
break;
|
|
277
|
-
case
|
|
269
|
+
case TokenType.Function:
|
|
278
270
|
operatorStack.push(token);
|
|
279
271
|
break;
|
|
280
|
-
case
|
|
272
|
+
case TokenType.OpenBracket:
|
|
281
273
|
operatorStack.push(token);
|
|
282
274
|
break;
|
|
283
|
-
case
|
|
275
|
+
case TokenType.ArgumentSeparator:
|
|
284
276
|
while (operatorStack.length > 0) {
|
|
285
277
|
// evaluate expression until previous argument separator or open bracket
|
|
286
278
|
operator = operatorStack[operatorStack.length - 1];
|
|
287
|
-
if ([
|
|
279
|
+
if ([TokenType.OpenBracket, TokenType.ArgumentSeparator].includes(operator[1])) {
|
|
288
280
|
break;
|
|
289
281
|
}
|
|
290
282
|
operator = operatorStack.pop();
|
|
@@ -293,29 +285,29 @@ class Formula {
|
|
|
293
285
|
}
|
|
294
286
|
operatorStack.push(token);
|
|
295
287
|
break;
|
|
296
|
-
case
|
|
288
|
+
case TokenType.CloseBracket:
|
|
297
289
|
nodes = [];
|
|
298
290
|
while (operatorStack.length > 0) {
|
|
299
|
-
if (operatorStack[operatorStack.length - 1][1] ===
|
|
291
|
+
if (operatorStack[operatorStack.length - 1][1] === TokenType.OpenBracket) {
|
|
300
292
|
break;
|
|
301
293
|
}
|
|
302
294
|
operator = operatorStack.pop();
|
|
303
|
-
if (operator[1] ==
|
|
295
|
+
if (operator[1] == TokenType.Operator) {
|
|
304
296
|
// nodes array contains operands for the current operator
|
|
305
297
|
nodes.push({ t: operator[0], tt: operator[1], c: [nodeStack.pop(), nodeStack.pop()].reverse() });
|
|
306
298
|
}
|
|
307
|
-
else if (operator[1] ==
|
|
299
|
+
else if (operator[1] == TokenType.ArgumentSeparator) {
|
|
308
300
|
// nodes array contains arguments of the function
|
|
309
301
|
if (nodeStack.length > 0)
|
|
310
302
|
nodes.push(nodeStack.pop());
|
|
311
303
|
}
|
|
312
304
|
}
|
|
313
305
|
operatorStack.pop(); // pop the open bracket
|
|
314
|
-
if (operatorStack.length > 0 && operatorStack[operatorStack.length - 1][1] ===
|
|
306
|
+
if (operatorStack.length > 0 && operatorStack[operatorStack.length - 1][1] === TokenType.Function) {
|
|
315
307
|
// current token is closing bracket of a function
|
|
316
308
|
operator = operatorStack.pop(); // pop function from operator stack
|
|
317
309
|
nodes = nodes.reverse();
|
|
318
|
-
if (nodeStack.length > 0 && tokens[i - 1][1] !==
|
|
310
|
+
if (nodeStack.length > 0 && tokens[i - 1][1] !== TokenType.OpenBracket) {
|
|
319
311
|
nodes.unshift(nodeStack.pop()); // prepend first argument unless the function has zero arguments
|
|
320
312
|
}
|
|
321
313
|
nodeStack.push({ t: operator[0], tt: operator[1], c: nodes });
|
|
@@ -336,33 +328,33 @@ class Formula {
|
|
|
336
328
|
createExpressionJSCode(node, parent, arrayMode) {
|
|
337
329
|
let args;
|
|
338
330
|
switch (node.tt) {
|
|
339
|
-
case
|
|
331
|
+
case TokenType.Range:
|
|
340
332
|
return 't.rn(\'' + node.t + '\'' + (node.s ? (',\'' + node.s + '\'') : '') + ')';
|
|
341
|
-
case
|
|
333
|
+
case TokenType.Cell:
|
|
342
334
|
return 't.cl(\'' + node.t + '\'' + (node.s ? (',\'' + node.s + '\'') : '') + ')';
|
|
343
|
-
case
|
|
335
|
+
case TokenType.Operand:
|
|
344
336
|
return 't.cl()';
|
|
345
|
-
case
|
|
346
|
-
if (arrayMode ||
|
|
337
|
+
case TokenType.Variable:
|
|
338
|
+
if (arrayMode || parent?.tt === TokenType.Function) {
|
|
347
339
|
return 't.nr(\'' + node.t + '\'' + (node.s ? (',\'' + node.s + '\'') : '') + ')';
|
|
348
340
|
}
|
|
349
341
|
else {
|
|
350
342
|
return 't.nv(\'' + node.t + '\'' + (node.s ? (',\'' + node.s + '\'') : '') + ')';
|
|
351
343
|
}
|
|
352
|
-
case
|
|
344
|
+
case TokenType.String:
|
|
353
345
|
return '\'' + node.t.replace(/'/g, "\\'") + '\'';
|
|
354
|
-
case
|
|
346
|
+
case TokenType.Boolean:
|
|
355
347
|
return node.t[0].toUpperCase() == 'T' ? '1' : '0';
|
|
356
|
-
case
|
|
357
|
-
args = node.c.map(n => this.createExpressionJSCode(n, node, arrayMode ||
|
|
348
|
+
case TokenType.Function:
|
|
349
|
+
args = node.c.map(n => this.createExpressionJSCode(n, node, arrayMode || isArrayFunction(node.t)));
|
|
358
350
|
return 't.fn(\'' + node.t + '\').call(ctx' + (args.length > 0 ? (',' + args.join(',')) : '') + ')';
|
|
359
|
-
case
|
|
351
|
+
case TokenType.Operator:
|
|
360
352
|
if (arrayMode) {
|
|
361
|
-
args = node.c.map(n => this.createExpressionJSCode(n, node, arrayMode ||
|
|
353
|
+
args = node.c.map(n => this.createExpressionJSCode(n, node, arrayMode || isArrayFunction(node.t)));
|
|
362
354
|
return 't.op(' + args[0] + ',' + args[1] + ',\'' + node.t + '\')';
|
|
363
355
|
}
|
|
364
|
-
else if (
|
|
365
|
-
return '(' + node.c.map(n => this.createExpressionJSCode(n, node, arrayMode)).join(
|
|
356
|
+
else if (operatorMap.has(node.t)) {
|
|
357
|
+
return '(' + node.c.map(n => this.createExpressionJSCode(n, node, arrayMode)).join(operatorMap.get(node.t)[0]) + ')';
|
|
366
358
|
}
|
|
367
359
|
else {
|
|
368
360
|
return null;
|
|
@@ -376,12 +368,10 @@ class Formula {
|
|
|
376
368
|
return this.createExpressionJSCode(tree);
|
|
377
369
|
}
|
|
378
370
|
toString(prefix = false) {
|
|
379
|
-
|
|
380
|
-
return (prefix ? '=' : '') + ((_a = this._formula) !== null && _a !== void 0 ? _a : (this._formula = this.createFormulaString()));
|
|
371
|
+
return (prefix ? '=' : '') + (this._formula ?? (this._formula = this.createFormulaString()));
|
|
381
372
|
}
|
|
382
373
|
toExcelString() {
|
|
383
|
-
|
|
384
|
-
return ((_a = this._xlFormula) !== null && _a !== void 0 ? _a : (this._xlFormula = this.createFormulaString(false, true)));
|
|
374
|
+
return (this._xlFormula ?? (this._xlFormula = this.createFormulaString(false, true)));
|
|
385
375
|
}
|
|
386
376
|
shift(options) {
|
|
387
377
|
const { index, offset, direction, maxIndex, sheet, allSheets } = options;
|
|
@@ -442,7 +432,7 @@ class Formula {
|
|
|
442
432
|
renameSheet(oldName, newName) {
|
|
443
433
|
let renamed = false;
|
|
444
434
|
this._tokens.forEach(t => {
|
|
445
|
-
if (t[1] ==
|
|
435
|
+
if (t[1] == TokenType.Sheet && t[0] == oldName) {
|
|
446
436
|
t[0] = newName;
|
|
447
437
|
renamed = true;
|
|
448
438
|
}
|
|
@@ -450,5 +440,4 @@ class Formula {
|
|
|
450
440
|
return renamed;
|
|
451
441
|
}
|
|
452
442
|
}
|
|
453
|
-
exports.Formula = Formula;
|
|
454
443
|
//# sourceMappingURL=formula.js.map
|