@borgar/fx 5.0.1 → 5.0.2
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/index.cjs +52 -26
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +52 -26
- package/dist/index.js.map +1 -1
- package/dist/xlsx/index.cjs +50 -24
- package/dist/xlsx/index.cjs.map +1 -1
- package/dist/xlsx/index.js +50 -24
- package/dist/xlsx/index.js.map +1 -1
- package/lib/constants.ts +3 -0
- package/lib/fixRanges.spec.ts +14 -0
- package/lib/lexers/lexRangeA1.ts +1 -1
- package/lib/lexers/lexRangeR1C1.ts +2 -1
- package/lib/mergeRefTokens.ts +23 -14
- package/lib/parseA1Ref.spec.ts +7 -0
- package/lib/stringifyA1Ref.spec.ts +18 -0
- package/lib/stringifyPrefix.ts +26 -5
- package/lib/tokenize.spec.ts +27 -0
- package/lib/translateToR1C1.ts +1 -2
- package/package.json +7 -7
package/dist/xlsx/index.cjs
CHANGED
|
@@ -85,6 +85,7 @@ var REF_BEAM = "range_beam";
|
|
|
85
85
|
var REF_TERNARY = "range_ternary";
|
|
86
86
|
var REF_NAMED = "range_named";
|
|
87
87
|
var REF_STRUCT = "structured";
|
|
88
|
+
var REF_CELL = "cell";
|
|
88
89
|
var FX_PREFIX = "fx_prefix";
|
|
89
90
|
var UNKNOWN = "unknown";
|
|
90
91
|
var UNARY = "UnaryExpression";
|
|
@@ -104,24 +105,26 @@ var MAX_ROWS = 2 ** 20 - 1;
|
|
|
104
105
|
// lib/mergeRefTokens.ts
|
|
105
106
|
var END = "$";
|
|
106
107
|
var validRunsMerge = [
|
|
107
|
-
[
|
|
108
|
-
[
|
|
109
|
-
[
|
|
110
|
-
[
|
|
108
|
+
[REF_CELL, ":", REF_CELL],
|
|
109
|
+
[REF_CELL, ".:", REF_CELL],
|
|
110
|
+
[REF_CELL, ":.", REF_CELL],
|
|
111
|
+
[REF_CELL, ".:.", REF_CELL],
|
|
111
112
|
[REF_RANGE],
|
|
112
113
|
[REF_BEAM],
|
|
113
114
|
[REF_TERNARY],
|
|
114
|
-
[CONTEXT, "!",
|
|
115
|
-
[CONTEXT, "!",
|
|
116
|
-
[CONTEXT, "!",
|
|
117
|
-
[CONTEXT, "!",
|
|
115
|
+
[CONTEXT, "!", REF_CELL, ":", REF_CELL],
|
|
116
|
+
[CONTEXT, "!", REF_CELL, ".:", REF_CELL],
|
|
117
|
+
[CONTEXT, "!", REF_CELL, ":.", REF_CELL],
|
|
118
|
+
[CONTEXT, "!", REF_CELL, ".:.", REF_CELL],
|
|
119
|
+
[CONTEXT, "!", REF_CELL],
|
|
118
120
|
[CONTEXT, "!", REF_RANGE],
|
|
119
121
|
[CONTEXT, "!", REF_BEAM],
|
|
120
122
|
[CONTEXT, "!", REF_TERNARY],
|
|
121
|
-
[CONTEXT_QUOTE, "!",
|
|
122
|
-
[CONTEXT_QUOTE, "!",
|
|
123
|
-
[CONTEXT_QUOTE, "!",
|
|
124
|
-
[CONTEXT_QUOTE, "!",
|
|
123
|
+
[CONTEXT_QUOTE, "!", REF_CELL, ":", REF_CELL],
|
|
124
|
+
[CONTEXT_QUOTE, "!", REF_CELL, ".:", REF_CELL],
|
|
125
|
+
[CONTEXT_QUOTE, "!", REF_CELL, ":.", REF_CELL],
|
|
126
|
+
[CONTEXT_QUOTE, "!", REF_CELL, ".:.", REF_CELL],
|
|
127
|
+
[CONTEXT_QUOTE, "!", REF_CELL],
|
|
125
128
|
[CONTEXT_QUOTE, "!", REF_RANGE],
|
|
126
129
|
[CONTEXT_QUOTE, "!", REF_BEAM],
|
|
127
130
|
[CONTEXT_QUOTE, "!", REF_TERNARY],
|
|
@@ -153,7 +156,11 @@ var matcher = (tokens2, currNode, anchorIndex, index = 0) => {
|
|
|
153
156
|
while (i <= max) {
|
|
154
157
|
const token = tokens2[anchorIndex - i];
|
|
155
158
|
if (token) {
|
|
156
|
-
const
|
|
159
|
+
const value = token.value;
|
|
160
|
+
let key = token.type === OPERATOR ? value : token.type;
|
|
161
|
+
if (key === REF_RANGE && !value.includes(":")) {
|
|
162
|
+
key = REF_CELL;
|
|
163
|
+
}
|
|
157
164
|
if (key in node) {
|
|
158
165
|
node = node[key];
|
|
159
166
|
i += 1;
|
|
@@ -543,7 +550,7 @@ function lexRangeA1(str, pos, options) {
|
|
|
543
550
|
}
|
|
544
551
|
}
|
|
545
552
|
}
|
|
546
|
-
if (top && canEndRange(str, preOp)) {
|
|
553
|
+
if (top && canEndRange(str, preOp) && str.charCodeAt(preOp) !== 33) {
|
|
547
554
|
return { type: REF_RANGE, value: str.slice(pos, preOp) };
|
|
548
555
|
}
|
|
549
556
|
} else {
|
|
@@ -583,6 +590,7 @@ var UC_C = 67;
|
|
|
583
590
|
var LC_C = 99;
|
|
584
591
|
var PLUS = 43;
|
|
585
592
|
var MINUS = 45;
|
|
593
|
+
var EXCL2 = 33;
|
|
586
594
|
function lexR1C1Part(str, pos, isRow = false) {
|
|
587
595
|
const start = pos;
|
|
588
596
|
const c0 = str.charCodeAt(pos);
|
|
@@ -637,7 +645,7 @@ function lexRangeR1C1(str, pos, options) {
|
|
|
637
645
|
p += r1;
|
|
638
646
|
const c1 = lexR1C1Part(str, p);
|
|
639
647
|
p += c1;
|
|
640
|
-
if (c1 || r1) {
|
|
648
|
+
if ((c1 || r1) && str.charCodeAt(p) !== EXCL2) {
|
|
641
649
|
const op = advRangeOp(str, p);
|
|
642
650
|
const preOp = p;
|
|
643
651
|
if (op) {
|
|
@@ -854,7 +862,7 @@ function parseSRange(str, pos = 0) {
|
|
|
854
862
|
}
|
|
855
863
|
|
|
856
864
|
// lib/lexers/lexStructured.ts
|
|
857
|
-
var
|
|
865
|
+
var EXCL3 = 33;
|
|
858
866
|
function lexStructured(str, pos) {
|
|
859
867
|
const structData = parseSRange(str, pos);
|
|
860
868
|
if (structData && structData.length) {
|
|
@@ -862,7 +870,7 @@ function lexStructured(str, pos) {
|
|
|
862
870
|
while (isWS(str.charCodeAt(pos + i))) {
|
|
863
871
|
i++;
|
|
864
872
|
}
|
|
865
|
-
if (str.charCodeAt(pos + i) !==
|
|
873
|
+
if (str.charCodeAt(pos + i) !== EXCL3) {
|
|
866
874
|
return {
|
|
867
875
|
type: REF_STRUCT,
|
|
868
876
|
value: structData.token
|
|
@@ -957,9 +965,9 @@ function lexNamed(str, pos) {
|
|
|
957
965
|
}
|
|
958
966
|
|
|
959
967
|
// lib/lexers/lexRefOp.ts
|
|
960
|
-
var
|
|
968
|
+
var EXCL4 = 33;
|
|
961
969
|
function lexRefOp(str, pos, opts) {
|
|
962
|
-
if (str.charCodeAt(pos) ===
|
|
970
|
+
if (str.charCodeAt(pos) === EXCL4) {
|
|
963
971
|
return { type: OPERATOR, value: str[pos] };
|
|
964
972
|
}
|
|
965
973
|
if (!opts.r1c1) {
|
|
@@ -973,7 +981,7 @@ function lexRefOp(str, pos, opts) {
|
|
|
973
981
|
// lib/lexers/lexNameFuncCntx.ts
|
|
974
982
|
var BR_OPEN4 = 91;
|
|
975
983
|
var PAREN_OPEN = 40;
|
|
976
|
-
var
|
|
984
|
+
var EXCL5 = 33;
|
|
977
985
|
var OFFS = 32;
|
|
978
986
|
var ALLOWED = new Uint8Array(180 - OFFS);
|
|
979
987
|
var OK_NAME_0 = 1;
|
|
@@ -1038,7 +1046,7 @@ function lexNameFuncCntx(str, pos, opts) {
|
|
|
1038
1046
|
} else {
|
|
1039
1047
|
if (c === PAREN_OPEN && func) {
|
|
1040
1048
|
return { type: FUNCTION, value: str.slice(start, pos) };
|
|
1041
|
-
} else if (c ===
|
|
1049
|
+
} else if (c === EXCL5 && cntx) {
|
|
1042
1050
|
return { type: CONTEXT, value: str.slice(start, pos) };
|
|
1043
1051
|
}
|
|
1044
1052
|
return nameOrUnknown(str, s, start, pos, name);
|
|
@@ -1818,20 +1826,38 @@ function parse(tokenlist, options = {}) {
|
|
|
1818
1826
|
|
|
1819
1827
|
// lib/stringifyPrefix.ts
|
|
1820
1828
|
var reBannedChars = /[^0-9A-Za-z._¡¤§¨ª\u00ad¯-\uffff]/;
|
|
1829
|
+
var reIsRangelike = /^(R|C|RC|[A-Z]{1,3}\d{1,7})$/i;
|
|
1830
|
+
function needQuotes(scope, yesItDoes = 0) {
|
|
1831
|
+
if (yesItDoes) {
|
|
1832
|
+
return 1;
|
|
1833
|
+
}
|
|
1834
|
+
if (scope) {
|
|
1835
|
+
if (reBannedChars.test(scope)) {
|
|
1836
|
+
return 1;
|
|
1837
|
+
}
|
|
1838
|
+
if (reIsRangelike.test(scope)) {
|
|
1839
|
+
return 1;
|
|
1840
|
+
}
|
|
1841
|
+
}
|
|
1842
|
+
return 0;
|
|
1843
|
+
}
|
|
1844
|
+
function quotePrefix(prefix2) {
|
|
1845
|
+
return "'" + prefix2.replace(/'/g, "''") + "'";
|
|
1846
|
+
}
|
|
1821
1847
|
function stringifyPrefixXlsx(ref) {
|
|
1822
1848
|
let pre = "";
|
|
1823
1849
|
let quote = 0;
|
|
1824
1850
|
const { workbookName, sheetName } = ref;
|
|
1825
1851
|
if (workbookName) {
|
|
1826
1852
|
pre += "[" + workbookName + "]";
|
|
1827
|
-
quote +=
|
|
1853
|
+
quote += needQuotes(workbookName);
|
|
1828
1854
|
}
|
|
1829
1855
|
if (sheetName) {
|
|
1830
1856
|
pre += sheetName;
|
|
1831
|
-
quote +=
|
|
1857
|
+
quote += needQuotes(sheetName);
|
|
1832
1858
|
}
|
|
1833
1859
|
if (quote) {
|
|
1834
|
-
pre =
|
|
1860
|
+
pre = quotePrefix(pre);
|
|
1835
1861
|
}
|
|
1836
1862
|
return pre ? pre + "!" : pre;
|
|
1837
1863
|
}
|