@borgar/fx 3.1.0 → 4.0.0-rc.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/.eslintrc +25 -12
- package/.jsdoc/config.json +17 -0
- package/.jsdoc/publish.js +195 -0
- package/README.md +8 -311
- package/dist/fx.js +1 -1
- package/docs/API.md +708 -0
- package/docs/AST format.md +144 -0
- package/docs/References.md +60 -0
- package/lib/a1.js +156 -30
- package/lib/a1.spec.js +9 -2
- package/lib/{addMeta.js → addTokenMeta.js} +50 -5
- package/lib/{addMeta.spec.js → addTokenMeta.spec.js} +16 -16
- package/lib/constants.js +14 -4
- package/lib/fixRanges.js +64 -10
- package/lib/fixRanges.spec.js +35 -6
- package/lib/index.js +105 -17
- package/lib/isType.js +119 -8
- package/lib/lexer-srefs.spec.js +311 -0
- package/lib/lexer.js +55 -15
- package/lib/lexer.spec.js +223 -214
- package/lib/lexerParts.js +38 -14
- package/lib/mergeRefTokens.js +38 -25
- package/lib/mergeRefTokens.spec.js +39 -39
- package/lib/parseRef.js +17 -12
- package/lib/parser.js +498 -0
- package/lib/parser.spec.js +777 -0
- package/lib/rc.js +95 -22
- package/lib/rc.spec.js +16 -5
- package/lib/sr.js +277 -0
- package/lib/sr.spec.js +179 -0
- package/lib/translate-toA1.spec.js +38 -20
- package/lib/translate-toRC.spec.js +23 -23
- package/lib/translate.js +111 -30
- package/package.json +3 -1
- package/References.md +0 -39
package/lib/lexer.spec.js
CHANGED
|
@@ -2,7 +2,7 @@ import { test, Test } from 'tape';
|
|
|
2
2
|
import {
|
|
3
3
|
FX_PREFIX, UNKNOWN,
|
|
4
4
|
OPERATOR, BOOLEAN, ERROR, NUMBER, FUNCTION, WHITESPACE, STRING,
|
|
5
|
-
|
|
5
|
+
REF_RANGE, REF_BEAM, REF_NAMED, REF_TERNARY, CONTEXT, CONTEXT_QUOTE, NEWLINE
|
|
6
6
|
} from './constants.js';
|
|
7
7
|
import { tokenize } from './lexer.js';
|
|
8
8
|
|
|
@@ -94,7 +94,7 @@ test('tokenize operators', t => {
|
|
|
94
94
|
]);
|
|
95
95
|
t.isTokens('=A1:INDIRECT("B2",TRUE)', [
|
|
96
96
|
{ type: FX_PREFIX, value: '=' },
|
|
97
|
-
{ type:
|
|
97
|
+
{ type: REF_RANGE, value: 'A1' },
|
|
98
98
|
{ type: OPERATOR, value: ':' },
|
|
99
99
|
{ type: FUNCTION, value: 'INDIRECT' },
|
|
100
100
|
{ type: OPERATOR, value: '(' },
|
|
@@ -112,46 +112,46 @@ test('tokenize operators', t => {
|
|
|
112
112
|
{ type: FX_PREFIX, value: '=' },
|
|
113
113
|
{ type: CONTEXT, value: 'Sheet1' },
|
|
114
114
|
{ type: OPERATOR, value: '!' },
|
|
115
|
-
{ type:
|
|
116
|
-
], {
|
|
115
|
+
{ type: REF_RANGE, value: 'A1' }
|
|
116
|
+
], { mergeRefs: false });
|
|
117
117
|
t.isTokens('=Sheet1!A1', [
|
|
118
118
|
{ type: FX_PREFIX, value: '=' },
|
|
119
|
-
{ type:
|
|
119
|
+
{ type: REF_RANGE, value: 'Sheet1!A1' }
|
|
120
120
|
]);
|
|
121
121
|
t.isTokens('=(A1:C1,A2:C2)', [
|
|
122
122
|
{ type: FX_PREFIX, value: '=' },
|
|
123
123
|
{ type: OPERATOR, value: '(' },
|
|
124
|
-
{ type:
|
|
124
|
+
{ type: REF_RANGE, value: 'A1' },
|
|
125
125
|
{ type: OPERATOR, value: ':' },
|
|
126
|
-
{ type:
|
|
126
|
+
{ type: REF_RANGE, value: 'C1' },
|
|
127
127
|
{ type: OPERATOR, value: ',' },
|
|
128
|
-
{ type:
|
|
128
|
+
{ type: REF_RANGE, value: 'A2' },
|
|
129
129
|
{ type: OPERATOR, value: ':' },
|
|
130
|
-
{ type:
|
|
130
|
+
{ type: REF_RANGE, value: 'C2' },
|
|
131
131
|
{ type: OPERATOR, value: ')' }
|
|
132
|
-
], {
|
|
132
|
+
], { mergeRefs: false });
|
|
133
133
|
t.isTokens('=(A1:C1,A2:C2)', [
|
|
134
134
|
{ type: FX_PREFIX, value: '=' },
|
|
135
135
|
{ type: OPERATOR, value: '(' },
|
|
136
|
-
{ type:
|
|
136
|
+
{ type: REF_RANGE, value: 'A1:C1' },
|
|
137
137
|
{ type: OPERATOR, value: ',' },
|
|
138
|
-
{ type:
|
|
138
|
+
{ type: REF_RANGE, value: 'A2:C2' },
|
|
139
139
|
{ type: OPERATOR, value: ')' }
|
|
140
140
|
]);
|
|
141
141
|
t.isTokens('=(A1:C1 A2:C2)', [
|
|
142
142
|
{ type: FX_PREFIX, value: '=' },
|
|
143
143
|
{ type: OPERATOR, value: '(' },
|
|
144
|
-
{ type:
|
|
144
|
+
{ type: REF_RANGE, value: 'A1:C1' },
|
|
145
145
|
{ type: WHITESPACE, value: ' ' }, // INTERSECT
|
|
146
|
-
{ type:
|
|
146
|
+
{ type: REF_RANGE, value: 'A2:C2' },
|
|
147
147
|
{ type: OPERATOR, value: ')' }
|
|
148
148
|
]);
|
|
149
149
|
t.isTokens('=(A1:C1 A2:C2)', [
|
|
150
150
|
{ type: FX_PREFIX, value: '=' },
|
|
151
151
|
{ type: OPERATOR, value: '(' },
|
|
152
|
-
{ type:
|
|
152
|
+
{ type: REF_RANGE, value: 'A1:C1' },
|
|
153
153
|
{ type: WHITESPACE, value: ' ' }, // INTERSECT
|
|
154
|
-
{ type:
|
|
154
|
+
{ type: REF_RANGE, value: 'A2:C2' },
|
|
155
155
|
{ type: OPERATOR, value: ')' }
|
|
156
156
|
]);
|
|
157
157
|
t.isTokens('={1,2,3}', [
|
|
@@ -199,15 +199,15 @@ test('tokenize operators', t => {
|
|
|
199
199
|
t.isTokens('={A1:B2}', [
|
|
200
200
|
{ type: FX_PREFIX, value: '=' },
|
|
201
201
|
{ type: OPERATOR, value: '{' },
|
|
202
|
-
{ type:
|
|
202
|
+
{ type: REF_RANGE, value: 'A1:B2' },
|
|
203
203
|
{ type: OPERATOR, value: '}' }
|
|
204
204
|
]);
|
|
205
205
|
t.isTokens('={A1:B2,C3:D4}', [
|
|
206
206
|
{ type: FX_PREFIX, value: '=' },
|
|
207
207
|
{ type: OPERATOR, value: '{' },
|
|
208
|
-
{ type:
|
|
208
|
+
{ type: REF_RANGE, value: 'A1:B2' },
|
|
209
209
|
{ type: OPERATOR, value: ',' },
|
|
210
|
-
{ type:
|
|
210
|
+
{ type: REF_RANGE, value: 'C3:D4' },
|
|
211
211
|
{ type: OPERATOR, value: '}' }
|
|
212
212
|
]);
|
|
213
213
|
t.end();
|
|
@@ -294,9 +294,9 @@ test('tokenize functions', t => {
|
|
|
294
294
|
{ type: BOOLEAN, value: 'TRUE' },
|
|
295
295
|
{ type: OPERATOR, value: ')' }
|
|
296
296
|
]);
|
|
297
|
-
t.isTokens('=BINOM.DIST.
|
|
297
|
+
t.isTokens('=BINOM.DIST.REF_RANGE(1)', [
|
|
298
298
|
{ type: FX_PREFIX, value: '=' },
|
|
299
|
-
{ type: FUNCTION, value: 'BINOM.DIST.
|
|
299
|
+
{ type: FUNCTION, value: 'BINOM.DIST.REF_RANGE' },
|
|
300
300
|
{ type: OPERATOR, value: '(' },
|
|
301
301
|
{ type: NUMBER, value: '1' },
|
|
302
302
|
{ type: OPERATOR, value: ')' }
|
|
@@ -331,7 +331,7 @@ test('tokenize functions', t => {
|
|
|
331
331
|
]);
|
|
332
332
|
t.isTokens('=\\FOO(1)', [
|
|
333
333
|
{ type: FX_PREFIX, value: '=' },
|
|
334
|
-
{ type:
|
|
334
|
+
{ type: REF_NAMED, value: '\\FOO' },
|
|
335
335
|
{ type: OPERATOR, value: '(' },
|
|
336
336
|
{ type: NUMBER, value: '1' },
|
|
337
337
|
{ type: OPERATOR, value: ')' }
|
|
@@ -560,26 +560,26 @@ test('tokenize negative numbers', t => {
|
|
|
560
560
|
]);
|
|
561
561
|
t.isTokensNeg('=A1-1', [
|
|
562
562
|
{ type: FX_PREFIX, value: '=' },
|
|
563
|
-
{ type:
|
|
563
|
+
{ type: REF_RANGE, value: 'A1' },
|
|
564
564
|
{ type: OPERATOR, value: '-' },
|
|
565
565
|
{ type: NUMBER, value: '1' }
|
|
566
566
|
]);
|
|
567
567
|
t.isTokensNeg('=A1 -1', [
|
|
568
568
|
{ type: FX_PREFIX, value: '=' },
|
|
569
|
-
{ type:
|
|
569
|
+
{ type: REF_RANGE, value: 'A1' },
|
|
570
570
|
{ type: WHITESPACE, value: ' ' },
|
|
571
571
|
{ type: OPERATOR, value: '-' },
|
|
572
572
|
{ type: NUMBER, value: '1' }
|
|
573
573
|
]);
|
|
574
574
|
t.isTokensNeg('=foo-1', [
|
|
575
575
|
{ type: FX_PREFIX, value: '=' },
|
|
576
|
-
{ type:
|
|
576
|
+
{ type: REF_NAMED, value: 'foo' },
|
|
577
577
|
{ type: OPERATOR, value: '-' },
|
|
578
578
|
{ type: NUMBER, value: '1' }
|
|
579
579
|
]);
|
|
580
580
|
t.isTokensNeg('=foo -1', [
|
|
581
581
|
{ type: FX_PREFIX, value: '=' },
|
|
582
|
-
{ type:
|
|
582
|
+
{ type: REF_NAMED, value: 'foo' },
|
|
583
583
|
{ type: WHITESPACE, value: ' ' },
|
|
584
584
|
{ type: OPERATOR, value: '-' },
|
|
585
585
|
{ type: NUMBER, value: '1' }
|
|
@@ -630,7 +630,7 @@ test('tokenize negative numbers', t => {
|
|
|
630
630
|
]);
|
|
631
631
|
t.isTokensNeg('=A1#-1', [
|
|
632
632
|
{ type: FX_PREFIX, value: '=' },
|
|
633
|
-
{ type:
|
|
633
|
+
{ type: REF_RANGE, value: 'A1' },
|
|
634
634
|
{ type: OPERATOR, value: '#' },
|
|
635
635
|
{ type: OPERATOR, value: '-' },
|
|
636
636
|
{ type: NUMBER, value: '1' }
|
|
@@ -739,195 +739,195 @@ test('tokenize R1C1 style references', t => {
|
|
|
739
739
|
// not all of these make sense but are "theoretically possible"
|
|
740
740
|
t.isTokens('=R', [
|
|
741
741
|
{ type: FX_PREFIX, value: '=' },
|
|
742
|
-
{ type:
|
|
742
|
+
{ type: REF_BEAM, value: 'R' }
|
|
743
743
|
], { r1c1: true });
|
|
744
744
|
t.isTokens('=R:R', [
|
|
745
745
|
{ type: FX_PREFIX, value: '=' },
|
|
746
|
-
{ type:
|
|
746
|
+
{ type: REF_BEAM, value: 'R:R' }
|
|
747
747
|
], { r1c1: true });
|
|
748
748
|
|
|
749
749
|
t.isTokens('=R1', [
|
|
750
750
|
{ type: FX_PREFIX, value: '=' },
|
|
751
|
-
{ type:
|
|
751
|
+
{ type: REF_BEAM, value: 'R1' }
|
|
752
752
|
], { r1c1: true });
|
|
753
753
|
t.isTokens('=R1:R1', [
|
|
754
754
|
{ type: FX_PREFIX, value: '=' },
|
|
755
|
-
{ type:
|
|
755
|
+
{ type: REF_BEAM, value: 'R1:R1' }
|
|
756
756
|
], { r1c1: true });
|
|
757
757
|
|
|
758
758
|
t.isTokens('=R[1]', [
|
|
759
759
|
{ type: FX_PREFIX, value: '=' },
|
|
760
|
-
{ type:
|
|
760
|
+
{ type: REF_BEAM, value: 'R[1]' }
|
|
761
761
|
], { r1c1: true });
|
|
762
762
|
t.isTokens('=R[1]:R[1]', [
|
|
763
763
|
{ type: FX_PREFIX, value: '=' },
|
|
764
|
-
{ type:
|
|
764
|
+
{ type: REF_BEAM, value: 'R[1]:R[1]' }
|
|
765
765
|
], { r1c1: true });
|
|
766
766
|
|
|
767
767
|
t.isTokens('=R[-1]', [
|
|
768
768
|
{ type: FX_PREFIX, value: '=' },
|
|
769
|
-
{ type:
|
|
769
|
+
{ type: REF_BEAM, value: 'R[-1]' }
|
|
770
770
|
], { r1c1: true });
|
|
771
771
|
t.isTokens('=R[-1]:R[-1]', [
|
|
772
772
|
{ type: FX_PREFIX, value: '=' },
|
|
773
|
-
{ type:
|
|
773
|
+
{ type: REF_BEAM, value: 'R[-1]:R[-1]' }
|
|
774
774
|
], { r1c1: true });
|
|
775
775
|
|
|
776
776
|
t.isTokens('=C', [
|
|
777
777
|
{ type: FX_PREFIX, value: '=' },
|
|
778
|
-
{ type:
|
|
778
|
+
{ type: REF_BEAM, value: 'C' }
|
|
779
779
|
], { r1c1: true });
|
|
780
780
|
t.isTokens('=C:C', [
|
|
781
781
|
{ type: FX_PREFIX, value: '=' },
|
|
782
|
-
{ type:
|
|
782
|
+
{ type: REF_BEAM, value: 'C:C' }
|
|
783
783
|
], { r1c1: true });
|
|
784
784
|
|
|
785
785
|
t.isTokens('=C1', [
|
|
786
786
|
{ type: FX_PREFIX, value: '=' },
|
|
787
|
-
{ type:
|
|
787
|
+
{ type: REF_BEAM, value: 'C1' }
|
|
788
788
|
], { r1c1: true });
|
|
789
789
|
t.isTokens('=C1:C1', [
|
|
790
790
|
{ type: FX_PREFIX, value: '=' },
|
|
791
|
-
{ type:
|
|
791
|
+
{ type: REF_BEAM, value: 'C1:C1' }
|
|
792
792
|
], { r1c1: true });
|
|
793
793
|
|
|
794
794
|
t.isTokens('=C[1]', [
|
|
795
795
|
{ type: FX_PREFIX, value: '=' },
|
|
796
|
-
{ type:
|
|
796
|
+
{ type: REF_BEAM, value: 'C[1]' }
|
|
797
797
|
], { r1c1: true });
|
|
798
798
|
t.isTokens('=C[1]:C[1]', [
|
|
799
799
|
{ type: FX_PREFIX, value: '=' },
|
|
800
|
-
{ type:
|
|
800
|
+
{ type: REF_BEAM, value: 'C[1]:C[1]' }
|
|
801
801
|
], { r1c1: true });
|
|
802
802
|
|
|
803
803
|
t.isTokens('=C[-1]', [
|
|
804
804
|
{ type: FX_PREFIX, value: '=' },
|
|
805
|
-
{ type:
|
|
805
|
+
{ type: REF_BEAM, value: 'C[-1]' }
|
|
806
806
|
], { r1c1: true });
|
|
807
807
|
t.isTokens('=C[-1]:C[-1]', [
|
|
808
808
|
{ type: FX_PREFIX, value: '=' },
|
|
809
|
-
{ type:
|
|
809
|
+
{ type: REF_BEAM, value: 'C[-1]:C[-1]' }
|
|
810
810
|
], { r1c1: true });
|
|
811
811
|
|
|
812
812
|
t.isTokens('=RC', [
|
|
813
813
|
{ type: FX_PREFIX, value: '=' },
|
|
814
|
-
{ type:
|
|
814
|
+
{ type: REF_RANGE, value: 'RC' }
|
|
815
815
|
], { r1c1: true });
|
|
816
816
|
t.isTokens('=RC:RC', [
|
|
817
817
|
{ type: FX_PREFIX, value: '=' },
|
|
818
|
-
{ type:
|
|
818
|
+
{ type: REF_RANGE, value: 'RC:RC' }
|
|
819
819
|
], { r1c1: true });
|
|
820
820
|
|
|
821
821
|
t.isTokens('=R1C1', [
|
|
822
822
|
{ type: FX_PREFIX, value: '=' },
|
|
823
|
-
{ type:
|
|
823
|
+
{ type: REF_RANGE, value: 'R1C1' }
|
|
824
824
|
], { r1c1: true });
|
|
825
825
|
t.isTokens('=R1C1:R1C1', [
|
|
826
826
|
{ type: FX_PREFIX, value: '=' },
|
|
827
|
-
{ type:
|
|
827
|
+
{ type: REF_RANGE, value: 'R1C1:R1C1' }
|
|
828
828
|
], { r1c1: true });
|
|
829
829
|
|
|
830
830
|
t.isTokens('=R[2]C', [
|
|
831
831
|
{ type: FX_PREFIX, value: '=' },
|
|
832
|
-
{ type:
|
|
832
|
+
{ type: REF_RANGE, value: 'R[2]C' }
|
|
833
833
|
], { r1c1: true });
|
|
834
834
|
t.isTokens('=R[2]C:R[2]C', [
|
|
835
835
|
{ type: FX_PREFIX, value: '=' },
|
|
836
|
-
{ type:
|
|
836
|
+
{ type: REF_RANGE, value: 'R[2]C:R[2]C' }
|
|
837
837
|
], { r1c1: true });
|
|
838
838
|
|
|
839
839
|
t.isTokens('=R[-2]C', [
|
|
840
840
|
{ type: FX_PREFIX, value: '=' },
|
|
841
|
-
{ type:
|
|
841
|
+
{ type: REF_RANGE, value: 'R[-2]C' }
|
|
842
842
|
], { r1c1: true });
|
|
843
843
|
t.isTokens('=R[-2]C:R[-2]C', [
|
|
844
844
|
{ type: FX_PREFIX, value: '=' },
|
|
845
|
-
{ type:
|
|
845
|
+
{ type: REF_RANGE, value: 'R[-2]C:R[-2]C' }
|
|
846
846
|
], { r1c1: true });
|
|
847
847
|
|
|
848
848
|
t.isTokens('=RC[3]', [
|
|
849
849
|
{ type: FX_PREFIX, value: '=' },
|
|
850
|
-
{ type:
|
|
850
|
+
{ type: REF_RANGE, value: 'RC[3]' }
|
|
851
851
|
], { r1c1: true });
|
|
852
852
|
t.isTokens('=RC[3]:RC[3]', [
|
|
853
853
|
{ type: FX_PREFIX, value: '=' },
|
|
854
|
-
{ type:
|
|
854
|
+
{ type: REF_RANGE, value: 'RC[3]:RC[3]' }
|
|
855
855
|
], { r1c1: true });
|
|
856
856
|
|
|
857
857
|
t.isTokens('=RC[-3]', [
|
|
858
858
|
{ type: FX_PREFIX, value: '=' },
|
|
859
|
-
{ type:
|
|
859
|
+
{ type: REF_RANGE, value: 'RC[-3]' }
|
|
860
860
|
], { r1c1: true });
|
|
861
861
|
t.isTokens('=RC[-3]:RC[-3]', [
|
|
862
862
|
{ type: FX_PREFIX, value: '=' },
|
|
863
|
-
{ type:
|
|
863
|
+
{ type: REF_RANGE, value: 'RC[-3]:RC[-3]' }
|
|
864
864
|
], { r1c1: true });
|
|
865
865
|
|
|
866
866
|
t.isTokens('=R[2]C[2]', [
|
|
867
867
|
{ type: FX_PREFIX, value: '=' },
|
|
868
|
-
{ type:
|
|
868
|
+
{ type: REF_RANGE, value: 'R[2]C[2]' }
|
|
869
869
|
], { r1c1: true });
|
|
870
870
|
t.isTokens('=R[2]C[2]:R[2]C[2]', [
|
|
871
871
|
{ type: FX_PREFIX, value: '=' },
|
|
872
|
-
{ type:
|
|
872
|
+
{ type: REF_RANGE, value: 'R[2]C[2]:R[2]C[2]' }
|
|
873
873
|
], { r1c1: true });
|
|
874
874
|
|
|
875
875
|
t.isTokens('=R[-2]C[-2]', [
|
|
876
876
|
{ type: FX_PREFIX, value: '=' },
|
|
877
|
-
{ type:
|
|
877
|
+
{ type: REF_RANGE, value: 'R[-2]C[-2]' }
|
|
878
878
|
], { r1c1: true });
|
|
879
879
|
t.isTokens('=R[-2]C[-2]:R[-1]C[-1]', [
|
|
880
880
|
{ type: FX_PREFIX, value: '=' },
|
|
881
|
-
{ type:
|
|
881
|
+
{ type: REF_RANGE, value: 'R[-2]C[-2]:R[-1]C[-1]' }
|
|
882
882
|
], { r1c1: true });
|
|
883
883
|
|
|
884
884
|
t.isTokens('=[filename]Sheetname!R[-2]C:R[-1]C', [
|
|
885
885
|
{ type: FX_PREFIX, value: '=' },
|
|
886
|
-
{ type:
|
|
886
|
+
{ type: REF_RANGE, value: '[filename]Sheetname!R[-2]C:R[-1]C' }
|
|
887
887
|
], { r1c1: true });
|
|
888
888
|
|
|
889
889
|
t.isTokens('=[filename]Sheetname!R[-2]C:R[-1]C', [
|
|
890
890
|
{ type: FX_PREFIX, value: '=' },
|
|
891
891
|
{ type: CONTEXT, value: '[filename]Sheetname' },
|
|
892
892
|
{ type: OPERATOR, value: '!' },
|
|
893
|
-
{ type:
|
|
893
|
+
{ type: REF_RANGE, value: 'R[-2]C' },
|
|
894
894
|
{ type: OPERATOR, value: ':' },
|
|
895
|
-
{ type:
|
|
896
|
-
], {
|
|
895
|
+
{ type: REF_RANGE, value: 'R[-1]C' }
|
|
896
|
+
], { mergeRefs: false, r1c1: true });
|
|
897
897
|
|
|
898
898
|
t.isTokens('=R[-2]C[-2]:R[-1]C[-1]', [
|
|
899
899
|
{ type: FX_PREFIX, value: '=' },
|
|
900
|
-
{ type:
|
|
900
|
+
{ type: REF_RANGE, value: 'R[-2]C[-2]:R[-1]C[-1]' }
|
|
901
901
|
], { r1c1: true });
|
|
902
902
|
t.isTokens('=R[-2]:R1', [
|
|
903
903
|
{ type: FX_PREFIX, value: '=' },
|
|
904
|
-
{ type:
|
|
904
|
+
{ type: REF_BEAM, value: 'R[-2]:R1' }
|
|
905
905
|
], { r1c1: true });
|
|
906
906
|
|
|
907
907
|
// should not be merged
|
|
908
908
|
t.isTokens('=R:C', [
|
|
909
909
|
{ type: FX_PREFIX, value: '=' },
|
|
910
|
-
{ type:
|
|
910
|
+
{ type: REF_BEAM, value: 'R' },
|
|
911
911
|
{ type: OPERATOR, value: ':' },
|
|
912
|
-
{ type:
|
|
912
|
+
{ type: REF_BEAM, value: 'C' }
|
|
913
913
|
], { r1c1: true });
|
|
914
914
|
t.isTokens('=C[1]:R[-2]', [
|
|
915
915
|
{ type: FX_PREFIX, value: '=' },
|
|
916
|
-
{ type:
|
|
916
|
+
{ type: REF_BEAM, value: 'C[1]' },
|
|
917
917
|
{ type: OPERATOR, value: ':' },
|
|
918
|
-
{ type:
|
|
918
|
+
{ type: REF_BEAM, value: 'R[-2]' }
|
|
919
919
|
], { r1c1: true });
|
|
920
920
|
t.isTokens('=R1:RC', [
|
|
921
921
|
{ type: FX_PREFIX, value: '=' },
|
|
922
|
-
{ type:
|
|
922
|
+
{ type: REF_BEAM, value: 'R1' },
|
|
923
923
|
{ type: OPERATOR, value: ':' },
|
|
924
|
-
{ type:
|
|
924
|
+
{ type: REF_RANGE, value: 'RC' }
|
|
925
925
|
], { r1c1: true });
|
|
926
926
|
t.isTokens('=RC:C1', [
|
|
927
927
|
{ type: FX_PREFIX, value: '=' },
|
|
928
|
-
{ type:
|
|
928
|
+
{ type: REF_RANGE, value: 'RC' },
|
|
929
929
|
{ type: OPERATOR, value: ':' },
|
|
930
|
-
{ type:
|
|
930
|
+
{ type: REF_BEAM, value: 'C1' }
|
|
931
931
|
], { r1c1: true });
|
|
932
932
|
|
|
933
933
|
t.end();
|
|
@@ -936,195 +936,195 @@ test('tokenize R1C1 style references', t => {
|
|
|
936
936
|
test('tokenize A1 style references', t => {
|
|
937
937
|
t.isTokens('=A1', [
|
|
938
938
|
{ type: FX_PREFIX, value: '=' },
|
|
939
|
-
{ type:
|
|
939
|
+
{ type: REF_RANGE, value: 'A1' }
|
|
940
940
|
]);
|
|
941
941
|
|
|
942
942
|
t.isTokens('=C1', [
|
|
943
943
|
{ type: FX_PREFIX, value: '=' },
|
|
944
|
-
{ type:
|
|
944
|
+
{ type: REF_RANGE, value: 'C1' }
|
|
945
945
|
]);
|
|
946
946
|
|
|
947
947
|
t.isTokens('=R1', [
|
|
948
948
|
{ type: FX_PREFIX, value: '=' },
|
|
949
|
-
{ type:
|
|
949
|
+
{ type: REF_RANGE, value: 'R1' }
|
|
950
950
|
]);
|
|
951
951
|
|
|
952
952
|
t.isTokens('=$A$1', [
|
|
953
953
|
{ type: FX_PREFIX, value: '=' },
|
|
954
|
-
{ type:
|
|
954
|
+
{ type: REF_RANGE, value: '$A$1' }
|
|
955
955
|
]);
|
|
956
956
|
|
|
957
957
|
t.isTokens('=A$1', [
|
|
958
958
|
{ type: FX_PREFIX, value: '=' },
|
|
959
|
-
{ type:
|
|
959
|
+
{ type: REF_RANGE, value: 'A$1' }
|
|
960
960
|
]);
|
|
961
961
|
|
|
962
962
|
t.isTokens('=$A1', [
|
|
963
963
|
{ type: FX_PREFIX, value: '=' },
|
|
964
|
-
{ type:
|
|
964
|
+
{ type: REF_RANGE, value: '$A1' }
|
|
965
965
|
]);
|
|
966
966
|
|
|
967
967
|
t.isTokens('=A10:A20', [
|
|
968
968
|
{ type: FX_PREFIX, value: '=' },
|
|
969
|
-
{ type:
|
|
969
|
+
{ type: REF_RANGE, value: 'A10:A20' }
|
|
970
970
|
]);
|
|
971
971
|
|
|
972
972
|
t.isTokens('=A10:E20', [
|
|
973
973
|
{ type: FX_PREFIX, value: '=' },
|
|
974
|
-
{ type:
|
|
974
|
+
{ type: REF_RANGE, value: 'A10:E20' }
|
|
975
975
|
]);
|
|
976
976
|
|
|
977
977
|
t.isTokens('=A1:C1', [
|
|
978
978
|
{ type: FX_PREFIX, value: '=' },
|
|
979
|
-
{ type:
|
|
979
|
+
{ type: REF_RANGE, value: 'A1:C1' }
|
|
980
980
|
]);
|
|
981
981
|
|
|
982
982
|
t.isTokens('=5:5', [
|
|
983
983
|
{ type: FX_PREFIX, value: '=' },
|
|
984
|
-
{ type:
|
|
984
|
+
{ type: REF_BEAM, value: '5:5' }
|
|
985
985
|
]);
|
|
986
986
|
|
|
987
987
|
t.isTokens('=15:15', [
|
|
988
988
|
{ type: FX_PREFIX, value: '=' },
|
|
989
|
-
{ type:
|
|
989
|
+
{ type: REF_BEAM, value: '15:15' }
|
|
990
990
|
]);
|
|
991
991
|
|
|
992
992
|
t.isTokens('=H:H', [
|
|
993
993
|
{ type: FX_PREFIX, value: '=' },
|
|
994
|
-
{ type:
|
|
994
|
+
{ type: REF_BEAM, value: 'H:H' }
|
|
995
995
|
]);
|
|
996
996
|
|
|
997
997
|
t.isTokens('=AA:JJ', [
|
|
998
998
|
{ type: FX_PREFIX, value: '=' },
|
|
999
|
-
{ type:
|
|
999
|
+
{ type: REF_BEAM, value: 'AA:JJ' }
|
|
1000
1000
|
]);
|
|
1001
1001
|
|
|
1002
1002
|
t.isTokens('=XFD:XFF', [
|
|
1003
1003
|
{ type: FX_PREFIX, value: '=' },
|
|
1004
|
-
{ type:
|
|
1004
|
+
{ type: REF_NAMED, value: 'XFD' },
|
|
1005
1005
|
{ type: OPERATOR, value: ':' },
|
|
1006
|
-
{ type:
|
|
1006
|
+
{ type: REF_NAMED, value: 'XFF' }
|
|
1007
1007
|
]);
|
|
1008
1008
|
|
|
1009
1009
|
t.isTokens('=Sheetname!A1', [
|
|
1010
1010
|
{ type: FX_PREFIX, value: '=' },
|
|
1011
|
-
{ type:
|
|
1011
|
+
{ type: REF_RANGE, value: 'Sheetname!A1' }
|
|
1012
1012
|
]);
|
|
1013
1013
|
|
|
1014
1014
|
t.isTokens('=Sheetname!A1', [
|
|
1015
1015
|
{ type: FX_PREFIX, value: '=' },
|
|
1016
1016
|
{ type: CONTEXT, value: 'Sheetname' },
|
|
1017
1017
|
{ type: OPERATOR, value: '!' },
|
|
1018
|
-
{ type:
|
|
1019
|
-
], {
|
|
1018
|
+
{ type: REF_RANGE, value: 'A1' }
|
|
1019
|
+
], { mergeRefs: false });
|
|
1020
1020
|
|
|
1021
1021
|
t.isTokens('=Sheet1!A1:B2', [
|
|
1022
1022
|
{ type: FX_PREFIX, value: '=' },
|
|
1023
|
-
{ type:
|
|
1023
|
+
{ type: REF_RANGE, value: 'Sheet1!A1:B2' }
|
|
1024
1024
|
]);
|
|
1025
1025
|
|
|
1026
1026
|
t.isTokens('=Sheet1!A1:B2', [
|
|
1027
1027
|
{ type: FX_PREFIX, value: '=' },
|
|
1028
1028
|
{ type: CONTEXT, value: 'Sheet1' },
|
|
1029
1029
|
{ type: OPERATOR, value: '!' },
|
|
1030
|
-
{ type:
|
|
1030
|
+
{ type: REF_RANGE, value: 'A1' },
|
|
1031
1031
|
{ type: OPERATOR, value: ':' },
|
|
1032
|
-
{ type:
|
|
1033
|
-
], {
|
|
1032
|
+
{ type: REF_RANGE, value: 'B2' }
|
|
1033
|
+
], { mergeRefs: false });
|
|
1034
1034
|
|
|
1035
1035
|
t.isTokens("='Sheet name'!A1:B2", [
|
|
1036
1036
|
{ type: FX_PREFIX, value: '=' },
|
|
1037
|
-
{ type:
|
|
1037
|
+
{ type: REF_RANGE, value: "'Sheet name'!A1:B2" }
|
|
1038
1038
|
]);
|
|
1039
1039
|
|
|
1040
1040
|
t.isTokens("='Sheet name'!A1:B2", [
|
|
1041
1041
|
{ type: FX_PREFIX, value: '=' },
|
|
1042
1042
|
{ type: CONTEXT_QUOTE, value: "'Sheet name'" },
|
|
1043
1043
|
{ type: OPERATOR, value: '!' },
|
|
1044
|
-
{ type:
|
|
1044
|
+
{ type: REF_RANGE, value: 'A1' },
|
|
1045
1045
|
{ type: OPERATOR, value: ':' },
|
|
1046
|
-
{ type:
|
|
1047
|
-
], {
|
|
1046
|
+
{ type: REF_RANGE, value: 'B2' }
|
|
1047
|
+
], { mergeRefs: false });
|
|
1048
1048
|
|
|
1049
1049
|
t.isTokens("='Sheets'' name'!A1:B2", [
|
|
1050
1050
|
{ type: FX_PREFIX, value: '=' },
|
|
1051
|
-
{ type:
|
|
1051
|
+
{ type: REF_RANGE, value: "'Sheets'' name'!A1:B2" }
|
|
1052
1052
|
]);
|
|
1053
1053
|
|
|
1054
1054
|
t.isTokens("='Sheets'' name'!A1:B2", [
|
|
1055
1055
|
{ type: FX_PREFIX, value: '=' },
|
|
1056
1056
|
{ type: CONTEXT_QUOTE, value: "'Sheets'' name'" },
|
|
1057
1057
|
{ type: OPERATOR, value: '!' },
|
|
1058
|
-
{ type:
|
|
1058
|
+
{ type: REF_RANGE, value: 'A1' },
|
|
1059
1059
|
{ type: OPERATOR, value: ':' },
|
|
1060
|
-
{ type:
|
|
1061
|
-
], {
|
|
1060
|
+
{ type: REF_RANGE, value: 'B2' }
|
|
1061
|
+
], { mergeRefs: false });
|
|
1062
1062
|
|
|
1063
1063
|
t.isTokens('=[filename]Sheetname!A1', [
|
|
1064
1064
|
{ type: FX_PREFIX, value: '=' },
|
|
1065
|
-
{ type:
|
|
1065
|
+
{ type: REF_RANGE, value: '[filename]Sheetname!A1' }
|
|
1066
1066
|
]);
|
|
1067
1067
|
|
|
1068
1068
|
t.isTokens('=[filename]Sheetname!A1', [
|
|
1069
1069
|
{ type: FX_PREFIX, value: '=' },
|
|
1070
1070
|
{ type: CONTEXT, value: '[filename]Sheetname' },
|
|
1071
1071
|
{ type: OPERATOR, value: '!' },
|
|
1072
|
-
{ type:
|
|
1073
|
-
], {
|
|
1072
|
+
{ type: REF_RANGE, value: 'A1' }
|
|
1073
|
+
], { mergeRefs: false });
|
|
1074
1074
|
|
|
1075
1075
|
t.isTokens("='[filename]Sheets'' name'!A1:B2", [
|
|
1076
1076
|
{ type: FX_PREFIX, value: '=' },
|
|
1077
|
-
{ type:
|
|
1077
|
+
{ type: REF_RANGE, value: "'[filename]Sheets'' name'!A1:B2" }
|
|
1078
1078
|
]);
|
|
1079
1079
|
|
|
1080
1080
|
t.isTokens("='[filename]Sheets'' name'!A1:B2", [
|
|
1081
1081
|
{ type: FX_PREFIX, value: '=' },
|
|
1082
1082
|
{ type: CONTEXT_QUOTE, value: "'[filename]Sheets'' name'" },
|
|
1083
1083
|
{ type: OPERATOR, value: '!' },
|
|
1084
|
-
{ type:
|
|
1084
|
+
{ type: REF_RANGE, value: 'A1' },
|
|
1085
1085
|
{ type: OPERATOR, value: ':' },
|
|
1086
|
-
{ type:
|
|
1087
|
-
], {
|
|
1086
|
+
{ type: REF_RANGE, value: 'B2' }
|
|
1087
|
+
], { mergeRefs: false });
|
|
1088
1088
|
|
|
1089
1089
|
t.isTokens("='Run forest, run!'!A1", [
|
|
1090
1090
|
{ type: FX_PREFIX, value: '=' },
|
|
1091
|
-
{ type:
|
|
1091
|
+
{ type: REF_RANGE, value: '\'Run forest, run!\'!A1' }
|
|
1092
1092
|
]);
|
|
1093
1093
|
|
|
1094
1094
|
t.isTokens("='Run forest, run!'!A1", [
|
|
1095
1095
|
{ type: FX_PREFIX, value: '=' },
|
|
1096
1096
|
{ type: CONTEXT_QUOTE, value: "'Run forest, run!'" },
|
|
1097
1097
|
{ type: OPERATOR, value: '!' },
|
|
1098
|
-
{ type:
|
|
1099
|
-
], {
|
|
1098
|
+
{ type: REF_RANGE, value: 'A1' }
|
|
1099
|
+
], { mergeRefs: false });
|
|
1100
1100
|
|
|
1101
1101
|
t.isTokens("='foo'''!A1", [
|
|
1102
1102
|
{ type: FX_PREFIX, value: '=' },
|
|
1103
|
-
{ type:
|
|
1103
|
+
{ type: REF_RANGE, value: "'foo'''!A1" }
|
|
1104
1104
|
]);
|
|
1105
1105
|
|
|
1106
1106
|
t.isTokens("='foo'''!A1", [
|
|
1107
1107
|
{ type: FX_PREFIX, value: '=' },
|
|
1108
1108
|
{ type: CONTEXT_QUOTE, value: "'foo'''" },
|
|
1109
1109
|
{ type: OPERATOR, value: '!' },
|
|
1110
|
-
{ type:
|
|
1111
|
-
], {
|
|
1110
|
+
{ type: REF_RANGE, value: 'A1' }
|
|
1111
|
+
], { mergeRefs: false });
|
|
1112
1112
|
|
|
1113
1113
|
t.isTokens("='foo'''''!A1", [
|
|
1114
1114
|
{ type: FX_PREFIX, value: '=' },
|
|
1115
|
-
{ type:
|
|
1115
|
+
{ type: REF_RANGE, value: "'foo'''''!A1" }
|
|
1116
1116
|
]);
|
|
1117
1117
|
|
|
1118
1118
|
t.isTokens("='foo'''''!A1", [
|
|
1119
1119
|
{ type: FX_PREFIX, value: '=' },
|
|
1120
1120
|
{ type: CONTEXT_QUOTE, value: "'foo'''''" },
|
|
1121
1121
|
{ type: OPERATOR, value: '!' },
|
|
1122
|
-
{ type:
|
|
1123
|
-
], {
|
|
1122
|
+
{ type: REF_RANGE, value: 'A1' }
|
|
1123
|
+
], { mergeRefs: false });
|
|
1124
1124
|
|
|
1125
1125
|
t.isTokens('=[15]Sheet32!X4', [
|
|
1126
1126
|
{ type: FX_PREFIX, value: '=' },
|
|
1127
|
-
{ type:
|
|
1127
|
+
{ type: REF_RANGE, value: '[15]Sheet32!X4' }
|
|
1128
1128
|
]);
|
|
1129
1129
|
|
|
1130
1130
|
// illegal syntax
|
|
@@ -1134,43 +1134,43 @@ test('tokenize A1 style references', t => {
|
|
|
1134
1134
|
{ type: NUMBER, value: '15' },
|
|
1135
1135
|
{ type: UNKNOWN, value: ']' },
|
|
1136
1136
|
{ type: OPERATOR, value: '!' },
|
|
1137
|
-
{ type:
|
|
1137
|
+
{ type: REF_NAMED, value: 'named' }
|
|
1138
1138
|
]);
|
|
1139
1139
|
|
|
1140
1140
|
t.isTokens('=filename!named', [
|
|
1141
1141
|
{ type: FX_PREFIX, value: '=' },
|
|
1142
|
-
{ type:
|
|
1142
|
+
{ type: REF_NAMED, value: 'filename!named' }
|
|
1143
1143
|
]);
|
|
1144
1144
|
t.isTokens('=filename!named', [
|
|
1145
1145
|
{ type: FX_PREFIX, value: '=' },
|
|
1146
1146
|
{ type: CONTEXT, value: 'filename' },
|
|
1147
1147
|
{ type: OPERATOR, value: '!' },
|
|
1148
|
-
{ type:
|
|
1149
|
-
], {
|
|
1148
|
+
{ type: REF_NAMED, value: 'named' }
|
|
1149
|
+
], { mergeRefs: false });
|
|
1150
1150
|
|
|
1151
1151
|
t.isTokens('=[15]Sheet32!X4', [
|
|
1152
1152
|
{ type: FX_PREFIX, value: '=' },
|
|
1153
1153
|
{ type: CONTEXT, value: '[15]Sheet32' },
|
|
1154
1154
|
{ type: OPERATOR, value: '!' },
|
|
1155
|
-
{ type:
|
|
1156
|
-
], {
|
|
1155
|
+
{ type: REF_RANGE, value: 'X4' }
|
|
1156
|
+
], { mergeRefs: false });
|
|
1157
1157
|
|
|
1158
1158
|
// largest possible A1 ref (in Excel)
|
|
1159
1159
|
t.isTokens('=XFD1048576', [
|
|
1160
1160
|
{ type: FX_PREFIX, value: '=' },
|
|
1161
|
-
{ type:
|
|
1161
|
+
{ type: REF_RANGE, value: 'XFD1048576' }
|
|
1162
1162
|
]);
|
|
1163
1163
|
t.isTokens('=XFD1048577', [
|
|
1164
1164
|
{ type: FX_PREFIX, value: '=' },
|
|
1165
|
-
{ type:
|
|
1165
|
+
{ type: REF_NAMED, value: 'XFD1048577' }
|
|
1166
1166
|
]);
|
|
1167
1167
|
t.isTokens('=XFE1048577', [
|
|
1168
1168
|
{ type: FX_PREFIX, value: '=' },
|
|
1169
|
-
{ type:
|
|
1169
|
+
{ type: REF_NAMED, value: 'XFE1048577' }
|
|
1170
1170
|
]);
|
|
1171
1171
|
t.isTokens('=pensioneligibilitypartner1', [
|
|
1172
1172
|
{ type: FX_PREFIX, value: '=' },
|
|
1173
|
-
{ type:
|
|
1173
|
+
{ type: REF_NAMED, value: 'pensioneligibilitypartner1' }
|
|
1174
1174
|
]);
|
|
1175
1175
|
|
|
1176
1176
|
//
|
|
@@ -1178,49 +1178,58 @@ test('tokenize A1 style references', t => {
|
|
|
1178
1178
|
{ type: FX_PREFIX, value: '=' },
|
|
1179
1179
|
{ type: CONTEXT_QUOTE, value: "'D:\\Reports\\Sales.xlsx'" },
|
|
1180
1180
|
{ type: OPERATOR, value: '!' },
|
|
1181
|
-
{ type:
|
|
1182
|
-
], {
|
|
1181
|
+
{ type: REF_NAMED, value: 'namedrange' }
|
|
1182
|
+
], { mergeRefs: false });
|
|
1183
1183
|
t.isTokens("='D:\\Reports\\Sales.xlsx'!namedrange", [
|
|
1184
1184
|
{ type: FX_PREFIX, value: '=' },
|
|
1185
|
-
{ type:
|
|
1185
|
+
{ type: REF_NAMED, value: "'D:\\Reports\\Sales.xlsx'!namedrange" }
|
|
1186
1186
|
]);
|
|
1187
1187
|
|
|
1188
1188
|
t.isTokens('=Sales.xlsx!namedrange', [
|
|
1189
1189
|
{ type: FX_PREFIX, value: '=' },
|
|
1190
1190
|
{ type: CONTEXT, value: 'Sales.xlsx' },
|
|
1191
1191
|
{ type: OPERATOR, value: '!' },
|
|
1192
|
-
{ type:
|
|
1193
|
-
], {
|
|
1192
|
+
{ type: REF_NAMED, value: 'namedrange' }
|
|
1193
|
+
], { mergeRefs: false });
|
|
1194
1194
|
t.isTokens('=Sales.xlsx!namedrange', [
|
|
1195
1195
|
{ type: FX_PREFIX, value: '=' },
|
|
1196
|
-
{ type:
|
|
1196
|
+
{ type: REF_NAMED, value: 'Sales.xlsx!namedrange' }
|
|
1197
1197
|
]);
|
|
1198
1198
|
|
|
1199
1199
|
t.isTokens('=Sheet1!A:A', [
|
|
1200
1200
|
{ type: FX_PREFIX, value: '=' },
|
|
1201
|
-
{ type:
|
|
1201
|
+
{ type: REF_BEAM, value: 'Sheet1!A:A' }
|
|
1202
1202
|
]);
|
|
1203
1203
|
t.isTokens('=Sheet1!A:A', [
|
|
1204
1204
|
{ type: FX_PREFIX, value: '=' },
|
|
1205
1205
|
{ type: CONTEXT, value: 'Sheet1' },
|
|
1206
1206
|
{ type: OPERATOR, value: '!' },
|
|
1207
|
-
{ type:
|
|
1208
|
-
], {
|
|
1207
|
+
{ type: REF_BEAM, value: 'A:A' }
|
|
1208
|
+
], { mergeRefs: false });
|
|
1209
1209
|
|
|
1210
1210
|
t.isTokens('=Sheet1!A:A:B:B', [
|
|
1211
1211
|
{ type: FX_PREFIX, value: '=' },
|
|
1212
|
-
{ type:
|
|
1212
|
+
{ type: REF_BEAM, value: 'Sheet1!A:A' },
|
|
1213
1213
|
{ type: OPERATOR, value: ':' },
|
|
1214
|
-
{ type:
|
|
1214
|
+
{ type: REF_BEAM, value: 'B:B' }
|
|
1215
1215
|
]);
|
|
1216
1216
|
t.isTokens('=Sheet1!A:A:B:B', [
|
|
1217
1217
|
{ type: FX_PREFIX, value: '=' },
|
|
1218
1218
|
{ type: CONTEXT, value: 'Sheet1' },
|
|
1219
1219
|
{ type: OPERATOR, value: '!' },
|
|
1220
|
-
{ type:
|
|
1220
|
+
{ type: REF_BEAM, value: 'A:A' },
|
|
1221
1221
|
{ type: OPERATOR, value: ':' },
|
|
1222
|
-
{ type:
|
|
1223
|
-
], {
|
|
1222
|
+
{ type: REF_BEAM, value: 'B:B' }
|
|
1223
|
+
], { mergeRefs: false });
|
|
1224
|
+
|
|
1225
|
+
t.isTokens('=Sheet1!#REF!:A1', [
|
|
1226
|
+
{ type: FX_PREFIX, value: '=' },
|
|
1227
|
+
{ type: CONTEXT, value: 'Sheet1' },
|
|
1228
|
+
{ type: OPERATOR, value: '!' },
|
|
1229
|
+
{ type: ERROR, value: '#REF!' },
|
|
1230
|
+
{ type: OPERATOR, value: ':' },
|
|
1231
|
+
{ type: REF_RANGE, value: 'A1' }
|
|
1232
|
+
]);
|
|
1224
1233
|
|
|
1225
1234
|
t.end();
|
|
1226
1235
|
});
|
|
@@ -1419,23 +1428,23 @@ test('tokenize strings', t => {
|
|
|
1419
1428
|
|
|
1420
1429
|
test('unknown and unary minus mess with offsets', t => {
|
|
1421
1430
|
t.isTokens('=-1', [
|
|
1422
|
-
{ type: FX_PREFIX, value: '=',
|
|
1423
|
-
{ type: OPERATOR, value: '-',
|
|
1424
|
-
{ type: NUMBER, value: '1',
|
|
1425
|
-
], {
|
|
1431
|
+
{ type: FX_PREFIX, value: '=', loc: [ 0, 1 ] },
|
|
1432
|
+
{ type: OPERATOR, value: '-', loc: [ 1, 2 ] },
|
|
1433
|
+
{ type: NUMBER, value: '1', loc: [ 2, 3 ] }
|
|
1434
|
+
], { withLocation: true });
|
|
1426
1435
|
t.isTokens('=-1', [
|
|
1427
|
-
{ type: FX_PREFIX, value: '=',
|
|
1428
|
-
{ type: NUMBER, value: '-1',
|
|
1429
|
-
], {
|
|
1436
|
+
{ type: FX_PREFIX, value: '=', loc: [ 0, 1 ] },
|
|
1437
|
+
{ type: NUMBER, value: '-1', loc: [ 1, 3 ] }
|
|
1438
|
+
], { withLocation: true, negativeNumbers: true });
|
|
1430
1439
|
|
|
1431
1440
|
t.isTokens('=$C', [
|
|
1432
|
-
{ type: FX_PREFIX, value: '=',
|
|
1433
|
-
{ type: UNKNOWN, value: '$C',
|
|
1434
|
-
], {
|
|
1441
|
+
{ type: FX_PREFIX, value: '=', loc: [ 0, 1 ] },
|
|
1442
|
+
{ type: UNKNOWN, value: '$C', loc: [ 1, 3 ] }
|
|
1443
|
+
], { withLocation: true });
|
|
1435
1444
|
t.isTokens('=$C.foo', [
|
|
1436
|
-
{ type: FX_PREFIX, value: '=',
|
|
1437
|
-
{ type: UNKNOWN, value: '$C.foo',
|
|
1438
|
-
], {
|
|
1445
|
+
{ type: FX_PREFIX, value: '=', loc: [ 0, 1 ] },
|
|
1446
|
+
{ type: UNKNOWN, value: '$C.foo', loc: [ 1, 7 ] }
|
|
1447
|
+
], { withLocation: true });
|
|
1439
1448
|
|
|
1440
1449
|
t.end();
|
|
1441
1450
|
});
|
|
@@ -1443,37 +1452,37 @@ test('unknown and unary minus mess with offsets', t => {
|
|
|
1443
1452
|
test('unknowns, named ranges and functions', t => {
|
|
1444
1453
|
t.isTokens('=foo', [
|
|
1445
1454
|
{ type: FX_PREFIX, value: '=' },
|
|
1446
|
-
{ type:
|
|
1455
|
+
{ type: REF_NAMED, value: 'foo' }
|
|
1447
1456
|
]);
|
|
1448
1457
|
t.isTokens('=_foo', [
|
|
1449
1458
|
{ type: FX_PREFIX, value: '=' },
|
|
1450
|
-
{ type:
|
|
1459
|
+
{ type: REF_NAMED, value: '_foo' }
|
|
1451
1460
|
]);
|
|
1452
1461
|
t.isTokens('=\\foo', [
|
|
1453
1462
|
{ type: FX_PREFIX, value: '=' },
|
|
1454
|
-
{ type:
|
|
1463
|
+
{ type: REF_NAMED, value: '\\foo' }
|
|
1455
1464
|
]);
|
|
1456
1465
|
t.isTokens('=æði', [
|
|
1457
1466
|
{ type: FX_PREFIX, value: '=' },
|
|
1458
|
-
{ type:
|
|
1467
|
+
{ type: REF_NAMED, value: 'æði' }
|
|
1459
1468
|
]);
|
|
1460
1469
|
t.isTokens('=らーめん', [
|
|
1461
1470
|
{ type: FX_PREFIX, value: '=' },
|
|
1462
|
-
{ type:
|
|
1471
|
+
{ type: REF_NAMED, value: 'らーめん' }
|
|
1463
1472
|
]);
|
|
1464
1473
|
t.isTokens('=@foo', [
|
|
1465
1474
|
{ type: FX_PREFIX, value: '=' },
|
|
1466
1475
|
{ type: OPERATOR, value: '@' },
|
|
1467
|
-
{ type:
|
|
1476
|
+
{ type: REF_NAMED, value: 'foo' }
|
|
1468
1477
|
]);
|
|
1469
1478
|
t.isTokens('=9æði', [
|
|
1470
1479
|
{ type: FX_PREFIX, value: '=' },
|
|
1471
1480
|
{ type: NUMBER, value: '9' },
|
|
1472
|
-
{ type:
|
|
1481
|
+
{ type: REF_NAMED, value: 'æði' }
|
|
1473
1482
|
]);
|
|
1474
1483
|
t.isTokens('=¢mah¢', [
|
|
1475
1484
|
{ type: FX_PREFIX, value: '=' },
|
|
1476
|
-
{ type:
|
|
1485
|
+
{ type: REF_NAMED, value: '¢mah¢' }
|
|
1477
1486
|
]);
|
|
1478
1487
|
t.isTokens('=~mah~', [
|
|
1479
1488
|
{ type: FX_PREFIX, value: '=' },
|
|
@@ -1506,152 +1515,152 @@ test('unknowns, named ranges and functions', t => {
|
|
|
1506
1515
|
test('tokenize partial ranges', t => {
|
|
1507
1516
|
const opts = { allowTernary: true };
|
|
1508
1517
|
t.isTokens('1:D$1', [
|
|
1509
|
-
{ type:
|
|
1518
|
+
{ type: REF_TERNARY, value: '1:D$1' }
|
|
1510
1519
|
], opts);
|
|
1511
1520
|
|
|
1512
1521
|
t.isTokens('1:D$1', [
|
|
1513
1522
|
{ type: NUMBER, value: '1' },
|
|
1514
1523
|
{ type: OPERATOR, value: ':' },
|
|
1515
|
-
{ type:
|
|
1524
|
+
{ type: REF_RANGE, value: 'D$1' }
|
|
1516
1525
|
]);
|
|
1517
1526
|
|
|
1518
1527
|
t.isTokens('B2:B', [
|
|
1519
|
-
{ type:
|
|
1528
|
+
{ type: REF_TERNARY, value: 'B2:B' }
|
|
1520
1529
|
], opts);
|
|
1521
1530
|
t.isTokens('B2:B', [
|
|
1522
|
-
{ type:
|
|
1531
|
+
{ type: REF_RANGE, value: 'B2' },
|
|
1523
1532
|
{ type: OPERATOR, value: ':' },
|
|
1524
|
-
{ type:
|
|
1533
|
+
{ type: REF_NAMED, value: 'B' }
|
|
1525
1534
|
]);
|
|
1526
1535
|
|
|
1527
1536
|
// form 1
|
|
1528
1537
|
t.isTokens('1:A1', [
|
|
1529
|
-
{ type:
|
|
1538
|
+
{ type: REF_TERNARY, value: '1:A1' }
|
|
1530
1539
|
], opts);
|
|
1531
1540
|
t.isTokens('$1:A1', [
|
|
1532
|
-
{ type:
|
|
1541
|
+
{ type: REF_TERNARY, value: '$1:A1' }
|
|
1533
1542
|
], opts);
|
|
1534
1543
|
t.isTokens('1:$A1', [
|
|
1535
|
-
{ type:
|
|
1544
|
+
{ type: REF_TERNARY, value: '1:$A1' }
|
|
1536
1545
|
], opts);
|
|
1537
1546
|
t.isTokens('1:A$1', [
|
|
1538
|
-
{ type:
|
|
1547
|
+
{ type: REF_TERNARY, value: '1:A$1' }
|
|
1539
1548
|
], opts);
|
|
1540
1549
|
t.isTokens('1:$A$1', [
|
|
1541
|
-
{ type:
|
|
1550
|
+
{ type: REF_TERNARY, value: '1:$A$1' }
|
|
1542
1551
|
], opts);
|
|
1543
1552
|
t.isTokens('$1:A$1', [
|
|
1544
|
-
{ type:
|
|
1553
|
+
{ type: REF_TERNARY, value: '$1:A$1' }
|
|
1545
1554
|
], opts);
|
|
1546
1555
|
t.isTokens('$1:$A1', [
|
|
1547
|
-
{ type:
|
|
1556
|
+
{ type: REF_TERNARY, value: '$1:$A1' }
|
|
1548
1557
|
], opts);
|
|
1549
1558
|
t.isTokens('$1:$A$1', [
|
|
1550
|
-
{ type:
|
|
1559
|
+
{ type: REF_TERNARY, value: '$1:$A$1' }
|
|
1551
1560
|
], opts);
|
|
1552
1561
|
|
|
1553
1562
|
// form 2
|
|
1554
1563
|
t.isTokens('A1:1', [
|
|
1555
|
-
{ type:
|
|
1564
|
+
{ type: REF_TERNARY, value: 'A1:1' }
|
|
1556
1565
|
], opts);
|
|
1557
1566
|
t.isTokens('A1:$1', [
|
|
1558
|
-
{ type:
|
|
1567
|
+
{ type: REF_TERNARY, value: 'A1:$1' }
|
|
1559
1568
|
], opts);
|
|
1560
1569
|
t.isTokens('$A1:1', [
|
|
1561
|
-
{ type:
|
|
1570
|
+
{ type: REF_TERNARY, value: '$A1:1' }
|
|
1562
1571
|
], opts);
|
|
1563
1572
|
t.isTokens('A$1:1', [
|
|
1564
|
-
{ type:
|
|
1573
|
+
{ type: REF_TERNARY, value: 'A$1:1' }
|
|
1565
1574
|
], opts);
|
|
1566
1575
|
t.isTokens('$A$1:1', [
|
|
1567
|
-
{ type:
|
|
1576
|
+
{ type: REF_TERNARY, value: '$A$1:1' }
|
|
1568
1577
|
], opts);
|
|
1569
1578
|
t.isTokens('A$1:$1', [
|
|
1570
|
-
{ type:
|
|
1579
|
+
{ type: REF_TERNARY, value: 'A$1:$1' }
|
|
1571
1580
|
], opts);
|
|
1572
1581
|
t.isTokens('$A1:$1', [
|
|
1573
|
-
{ type:
|
|
1582
|
+
{ type: REF_TERNARY, value: '$A1:$1' }
|
|
1574
1583
|
], opts);
|
|
1575
1584
|
t.isTokens('$A$1:$1', [
|
|
1576
|
-
{ type:
|
|
1585
|
+
{ type: REF_TERNARY, value: '$A$1:$1' }
|
|
1577
1586
|
], opts);
|
|
1578
1587
|
|
|
1579
1588
|
// form 3
|
|
1580
1589
|
t.isTokens('A:A1', [
|
|
1581
|
-
{ type:
|
|
1590
|
+
{ type: REF_TERNARY, value: 'A:A1' }
|
|
1582
1591
|
], opts);
|
|
1583
1592
|
t.isTokens('$A:A1', [
|
|
1584
|
-
{ type:
|
|
1593
|
+
{ type: REF_TERNARY, value: '$A:A1' }
|
|
1585
1594
|
], opts);
|
|
1586
1595
|
t.isTokens('A:$A1', [
|
|
1587
|
-
{ type:
|
|
1596
|
+
{ type: REF_TERNARY, value: 'A:$A1' }
|
|
1588
1597
|
], opts);
|
|
1589
1598
|
t.isTokens('A:A$1', [
|
|
1590
|
-
{ type:
|
|
1599
|
+
{ type: REF_TERNARY, value: 'A:A$1' }
|
|
1591
1600
|
], opts);
|
|
1592
1601
|
t.isTokens('A:$A$1', [
|
|
1593
|
-
{ type:
|
|
1602
|
+
{ type: REF_TERNARY, value: 'A:$A$1' }
|
|
1594
1603
|
], opts);
|
|
1595
1604
|
t.isTokens('$A:A$1', [
|
|
1596
|
-
{ type:
|
|
1605
|
+
{ type: REF_TERNARY, value: '$A:A$1' }
|
|
1597
1606
|
], opts);
|
|
1598
1607
|
t.isTokens('$A:$A1', [
|
|
1599
|
-
{ type:
|
|
1608
|
+
{ type: REF_TERNARY, value: '$A:$A1' }
|
|
1600
1609
|
], opts);
|
|
1601
1610
|
t.isTokens('$A:$A$1', [
|
|
1602
|
-
{ type:
|
|
1611
|
+
{ type: REF_TERNARY, value: '$A:$A$1' }
|
|
1603
1612
|
], opts);
|
|
1604
1613
|
|
|
1605
1614
|
// form 4
|
|
1606
1615
|
t.isTokens('A1:A', [
|
|
1607
|
-
{ type:
|
|
1616
|
+
{ type: REF_TERNARY, value: 'A1:A' }
|
|
1608
1617
|
], opts);
|
|
1609
1618
|
t.isTokens('A1:$A', [
|
|
1610
|
-
{ type:
|
|
1619
|
+
{ type: REF_TERNARY, value: 'A1:$A' }
|
|
1611
1620
|
], opts);
|
|
1612
1621
|
t.isTokens('$A1:A', [
|
|
1613
|
-
{ type:
|
|
1622
|
+
{ type: REF_TERNARY, value: '$A1:A' }
|
|
1614
1623
|
], opts);
|
|
1615
1624
|
t.isTokens('A$1:A', [
|
|
1616
|
-
{ type:
|
|
1625
|
+
{ type: REF_TERNARY, value: 'A$1:A' }
|
|
1617
1626
|
], opts);
|
|
1618
1627
|
t.isTokens('$A$1:A', [
|
|
1619
|
-
{ type:
|
|
1628
|
+
{ type: REF_TERNARY, value: '$A$1:A' }
|
|
1620
1629
|
], opts);
|
|
1621
1630
|
t.isTokens('A$1:$A', [
|
|
1622
|
-
{ type:
|
|
1631
|
+
{ type: REF_TERNARY, value: 'A$1:$A' }
|
|
1623
1632
|
], opts);
|
|
1624
1633
|
t.isTokens('$A1:$A', [
|
|
1625
|
-
{ type:
|
|
1634
|
+
{ type: REF_TERNARY, value: '$A1:$A' }
|
|
1626
1635
|
], opts);
|
|
1627
1636
|
t.isTokens('$A$1:$A', [
|
|
1628
|
-
{ type:
|
|
1637
|
+
{ type: REF_TERNARY, value: '$A$1:$A' }
|
|
1629
1638
|
], opts);
|
|
1630
1639
|
|
|
1631
1640
|
t.isTokens('=A10:A+B1:2', [
|
|
1632
1641
|
{ type: FX_PREFIX, value: '=' },
|
|
1633
|
-
{ type:
|
|
1642
|
+
{ type: REF_TERNARY, value: 'A10:A' },
|
|
1634
1643
|
{ type: OPERATOR, value: '+' },
|
|
1635
|
-
{ type:
|
|
1644
|
+
{ type: REF_TERNARY, value: 'B1:2' }
|
|
1636
1645
|
], opts);
|
|
1637
1646
|
t.isTokens('=SUM(A:A$10,3:B$2)', [
|
|
1638
1647
|
{ type: FX_PREFIX, value: '=' },
|
|
1639
1648
|
{ type: FUNCTION, value: 'SUM' },
|
|
1640
1649
|
{ type: OPERATOR, value: '(' },
|
|
1641
|
-
{ type:
|
|
1650
|
+
{ type: REF_TERNARY, value: 'A:A$10' },
|
|
1642
1651
|
{ type: OPERATOR, value: ',' },
|
|
1643
|
-
{ type:
|
|
1652
|
+
{ type: REF_TERNARY, value: '3:B$2' },
|
|
1644
1653
|
{ type: OPERATOR, value: ')' }
|
|
1645
1654
|
], opts);
|
|
1646
1655
|
t.isTokens('$A$10:$12', [
|
|
1647
|
-
{ type:
|
|
1656
|
+
{ type: REF_TERNARY, value: '$A$10:$12' }
|
|
1648
1657
|
], opts);
|
|
1649
1658
|
t.isTokens('1:D$1', [
|
|
1650
|
-
{ type:
|
|
1659
|
+
{ type: REF_TERNARY, value: '1:D$1' }
|
|
1651
1660
|
], opts);
|
|
1652
1661
|
t.isTokens('=A1:IF()', [
|
|
1653
1662
|
{ type: FX_PREFIX, value: '=' },
|
|
1654
|
-
{ type:
|
|
1663
|
+
{ type: REF_RANGE, value: 'A1' },
|
|
1655
1664
|
{ type: OPERATOR, value: ':' },
|
|
1656
1665
|
{ type: FUNCTION, value: 'IF' },
|
|
1657
1666
|
{ type: OPERATOR, value: '(' },
|
|
@@ -1659,7 +1668,7 @@ test('tokenize partial ranges', t => {
|
|
|
1659
1668
|
], opts);
|
|
1660
1669
|
t.isTokens('=A1:F.DIST()', [
|
|
1661
1670
|
{ type: FX_PREFIX, value: '=' },
|
|
1662
|
-
{ type:
|
|
1671
|
+
{ type: REF_RANGE, value: 'A1' },
|
|
1663
1672
|
{ type: OPERATOR, value: ':' },
|
|
1664
1673
|
{ type: FUNCTION, value: 'F.DIST' },
|
|
1665
1674
|
{ type: OPERATOR, value: '(' },
|
|
@@ -1669,12 +1678,12 @@ test('tokenize partial ranges', t => {
|
|
|
1669
1678
|
{ type: FX_PREFIX, value: '=' },
|
|
1670
1679
|
{ type: NUMBER, value: '1' },
|
|
1671
1680
|
{ type: OPERATOR, value: ':' },
|
|
1672
|
-
{ type:
|
|
1681
|
+
{ type: REF_RANGE, value: 'A1' },
|
|
1673
1682
|
{ type: UNKNOWN, value: '.' }
|
|
1674
1683
|
], opts);
|
|
1675
1684
|
t.isTokens('=A1:X$', [
|
|
1676
1685
|
{ type: FX_PREFIX, value: '=' },
|
|
1677
|
-
{ type:
|
|
1686
|
+
{ type: REF_RANGE, value: 'A1' },
|
|
1678
1687
|
{ type: OPERATOR, value: ':' },
|
|
1679
1688
|
{ type: UNKNOWN, value: 'X$' }
|
|
1680
1689
|
], opts);
|
|
@@ -1683,8 +1692,8 @@ test('tokenize partial ranges', t => {
|
|
|
1683
1692
|
{ type: FX_PREFIX, value: '=' },
|
|
1684
1693
|
{ type: CONTEXT, value: '[foo]Bar' },
|
|
1685
1694
|
{ type: OPERATOR, value: '!' },
|
|
1686
|
-
{ type:
|
|
1687
|
-
], {
|
|
1695
|
+
{ type: REF_TERNARY, value: 'A:A1' }
|
|
1696
|
+
], { mergeRefs: false, allowTernary: true });
|
|
1688
1697
|
|
|
1689
1698
|
t.end();
|
|
1690
1699
|
});
|