@@ -28,12 +28,18 @@ var WK_ = /*#__PURE__*/ (function() {
28
28
if ( ! d ) return d ;
29
29
var o = opts || { } ;
30
30
if ( DENSE != null && o . dense == null ) o . dense = DENSE ;
31
- var s /*:Worksheet*/ = ( ( o . dense ? [ ] : { } ) /*:any*/ ) , n = "Sheet1" , sidx = 0 ;
32
- var sheets = { } , snames = [ n ] , realnames = [ ] ;
31
+ var s /*:Worksheet*/ = ( ( o . dense ? [ ] : { } ) /*:any*/ ) , n = "Sheet1" , next_n = "" , sidx = 0 ;
32
+ var sheets = { } , snames = [ ] , realnames = [ ] ;
33
33
34
34
var refguess = { s : { r :0 , c :0 } , e : { r :0 , c :0 } } ;
35
35
var sheetRows = o . sheetRows || 0 ;
36
36
37
+ if ( d [ 2 ] == 0x00 ) {
38
+ if ( d [ 3 ] == 0x08 || d [ 3 ] == 0x09 ) {
39
+ if ( d . length >= 16 && d [ 14 ] == 0x05 && d [ 15 ] === 0x6c ) throw new Error ( "Unsupported Works 3 for Mac file" ) ;
40
+ }
41
+ }
42
+
37
43
if ( d [ 2 ] == 0x02 ) {
38
44
o . Enum = WK1Enum ;
39
45
lotushopper ( d , function ( val , R , RT ) { switch ( RT ) {
@@ -42,6 +48,8 @@ var WK_ = /*#__PURE__*/ (function() {
42
48
if ( val >= 0x1000 ) o . qpro = true ;
43
49
break ;
44
50
case 0x06 : refguess = val ; break ; /* RANGE */
51
+ case 0xCC : if ( val ) next_n = val ; break ; /* SHEETNAMECS */
52
+ case 0xDE : next_n = val ; break ; /* SHEETNAMELP */
45
53
case 0x0F : /* LABEL */
46
54
case 0x33 : /* STRING */
47
55
if ( ! o . qpro ) val [ 1 ] . v = val [ 1 ] . v . slice ( 1 ) ;
@@ -54,6 +62,18 @@ var WK_ = /*#__PURE__*/ (function() {
54
62
val [ 1 ] . z = o . dateNF || SSF . _table [ 14 ] ;
55
63
if ( o . cellDates ) { val [ 1 ] . t = 'd' ; val [ 1 ] . v = numdate ( val [ 1 ] . v ) ; }
56
64
}
65
+
66
+ if ( o . qpro ) {
67
+ if ( val [ 3 ] > sidx ) {
68
+ s [ "!ref" ] = encode_range ( refguess ) ;
69
+ sheets [ n ] = s ;
70
+ snames . push ( n ) ;
71
+ s = ( o . dense ? [ ] : { } ) ;
72
+ refguess = { s : { r :0 , c :0 } , e : { r :0 , c :0 } } ;
73
+ sidx = val [ 3 ] ; n = next_n || "Sheet" + ( sidx + 1 ) ; next_n = "" ;
74
+ }
75
+ }
76
+
57
77
var tmpcell = o . dense ? ( s [ val [ 0 ] . r ] || [ ] ) [ val [ 0 ] . c ] : s [ encode_cell ( val [ 0 ] ) ] ;
58
78
if ( tmpcell ) {
59
79
tmpcell . t = val [ 1 ] . t ; tmpcell . v = val [ 1 ] . v ;
@@ -72,6 +92,7 @@ var WK_ = /*#__PURE__*/ (function() {
72
92
o . Enum = WK3Enum ;
73
93
if ( d [ 2 ] == 0x0E ) { o . qpro = true ; d . l = 0 ; }
74
94
lotushopper ( d , function ( val , R , RT ) { switch ( RT ) {
95
+ case 0xCC : n = val ; break ; /* SHEETNAMECS */
75
96
case 0x16 : /* LABEL16 */
76
97
val [ 1 ] . v = val [ 1 ] . v . slice ( 1 ) ;
77
98
/* falls through */
@@ -84,10 +105,10 @@ var WK_ = /*#__PURE__*/ (function() {
84
105
if ( val [ 3 ] > sidx ) {
85
106
s [ "!ref" ] = encode_range ( refguess ) ;
86
107
sheets [ n ] = s ;
108
+ snames . push ( n ) ;
87
109
s = ( o . dense ? [ ] : { } ) ;
88
110
refguess = { s : { r :0 , c :0 } , e : { r :0 , c :0 } } ;
89
111
sidx = val [ 3 ] ; n = "Sheet" + ( sidx + 1 ) ;
90
- snames . push ( n ) ;
91
112
}
92
113
if ( sheetRows > 0 && val [ 0 ] . r >= sheetRows ) break ;
93
114
if ( o . dense ) {
@@ -100,17 +121,23 @@ var WK_ = /*#__PURE__*/ (function() {
100
121
case 0x1B : /* XFORMAT */
101
122
if ( val [ 0x36b0 ] ) realnames [ val [ 0x36b0 ] [ 0 ] ] = val [ 0x36b0 ] [ 1 ] ;
102
123
break ;
124
+ case 0x0601 : /* SHEETINFOQP */
125
+ realnames [ val [ 0 ] ] = val [ 1 ] ; if ( val [ 0 ] == sidx ) n = val [ 1 ] ; break ;
103
126
default : break ;
104
127
} } , o ) ;
105
128
} else throw new Error ( "Unrecognized LOTUS BOF " + d [ 2 ] ) ;
106
-
107
129
s [ "!ref" ] = encode_range ( refguess ) ;
108
- sheets [ n ] = s ;
130
+ sheets [ next_n || n ] = s ;
131
+ snames . push ( next_n || n ) ;
109
132
if ( ! realnames . length ) return { SheetNames : snames , Sheets : sheets } ;
110
133
var osheets = { } , rnames = [ ] ;
134
+ /* TODO: verify no collisions */
111
135
for ( var i = 0 ; i < realnames . length ; ++ i ) if ( sheets [ snames [ i ] ] ) {
136
+ rnames . push ( realnames [ i ] || snames [ i ] ) ;
137
+ osheets [ realnames [ i ] ] = sheets [ realnames [ i ] ] || sheets [ snames [ i ] ] ;
138
+ } else {
112
139
rnames . push ( realnames [ i ] ) ;
113
- osheets [ realnames [ i ] ] = sheets [ snames [ i ] ] ;
140
+ osheets [ realnames [ i ] ] = ( { "!ref" : "A1" } ) ;
114
141
}
115
142
return { SheetNames : rnames , Sheets : osheets } ;
116
143
}
@@ -126,7 +153,8 @@ var WK_ = /*#__PURE__*/ (function() {
126
153
127
154
write_biff_rec ( ba , 0x00 , write_BOF_WK1 ( 0x0406 ) ) ;
128
155
write_biff_rec ( ba , 0x06 , write_RANGE ( range ) ) ;
129
- for ( var R = range . s . r ; R <= range . e . r ; ++ R ) {
156
+ var max_R = Math . min ( range . e . r , 8191 ) ;
157
+ for ( var R = range . s . r ; R <= max_R ; ++ R ) {
130
158
var rr = encode_row ( R ) ;
131
159
for ( var C = range . s . c ; C <= range . e . c ; ++ C ) {
132
160
if ( R === range . s . r ) cols [ C ] = encode_col ( C ) ;
@@ -165,7 +193,8 @@ var WK_ = /*#__PURE__*/ (function() {
165
193
var range = safe_decode_range ( ws [ "!ref" ] ) ;
166
194
var dense = Array . isArray ( ws ) ;
167
195
var cols = [ ] ;
168
- for ( var R = range . s . r ; R <= range . e . r ; ++ R ) {
196
+ var max_R = Math . min ( range . e . r , 8191 ) ;
197
+ for ( var R = range . s . r ; R <= max_R ; ++ R ) {
169
198
var rr = encode_row ( R ) ;
170
199
for ( var C = range . s . c ; C <= range . e . c ; ++ C ) {
171
200
if ( R === range . s . r ) cols [ C ] = encode_col ( C ) ;
@@ -211,6 +240,7 @@ var WK_ = /*#__PURE__*/ (function() {
211
240
if ( rows < range . e . r ) rows = range . e . r ;
212
241
if ( cols < range . e . c ) cols = range . e . c ;
213
242
}
243
+ if ( rows > 8191 ) rows = 8191 ;
214
244
out . write_shift ( 2 , rows ) ;
215
245
out . write_shift ( 1 , wscnt ) ;
216
246
out . write_shift ( 1 , cols ) ;
@@ -223,12 +253,23 @@ var WK_ = /*#__PURE__*/ (function() {
223
253
return out ;
224
254
}
225
255
226
- function parse_RANGE ( blob ) {
256
+ function parse_RANGE ( blob , length , opts ) {
227
257
var o = { s :{ c :0 , r :0 } , e :{ c :0 , r :0 } } ;
258
+ if ( length == 8 && opts . qpro ) {
259
+ o . s . c = blob . read_shift ( 1 ) ;
260
+ blob . l ++ ;
261
+ o . s . r = blob . read_shift ( 2 ) ;
262
+ o . e . c = blob . read_shift ( 1 ) ;
263
+ blob . l ++ ;
264
+ o . e . r = blob . read_shift ( 2 ) ;
265
+ return o ;
266
+ }
228
267
o . s . c = blob . read_shift ( 2 ) ;
229
268
o . s . r = blob . read_shift ( 2 ) ;
269
+ if ( length == 12 && opts . qpro ) blob . l += 2 ;
230
270
o . e . c = blob . read_shift ( 2 ) ;
231
271
o . e . r = blob . read_shift ( 2 ) ;
272
+ if ( length == 12 && opts . qpro ) blob . l += 2 ;
232
273
if ( o . s . c == 0xFFFF ) o . s . c = o . e . c = o . s . r = o . e . r = 0 ;
233
274
return o ;
234
275
}
@@ -242,10 +283,10 @@ var WK_ = /*#__PURE__*/ (function() {
242
283
}
243
284
244
285
function parse_cell ( blob , length , opts ) {
245
- var o = [ { c :0 , r :0 } , { t :'n' , v :0 } , 0 ] ;
286
+ var o = [ { c :0 , r :0 } , { t :'n' , v :0 } , 0 , 0 ] ;
246
287
if ( opts . qpro && opts . vers != 0x5120 ) {
247
288
o [ 0 ] . c = blob . read_shift ( 1 ) ;
248
- blob . l ++ ;
289
+ o [ 3 ] = blob . read_shift ( 1 ) ;
249
290
o [ 0 ] . r = blob . read_shift ( 2 ) ;
250
291
blob . l += 2 ;
251
292
} else {
@@ -357,7 +398,7 @@ var WK_ = /*#__PURE__*/ (function() {
357
398
358
399
function wk1_fmla_to_csf ( blob , o ) {
359
400
prep_blob ( blob , 0 ) ;
360
- var out = [ ] , argc = 0 , R = "" , C = "" ;
401
+ var out = [ ] , argc = 0 , R = "" , C = "" , argL = "" , argR = "" ;
361
402
while ( blob . l < blob . length ) {
362
403
var cc = blob [ blob . l ++ ] ;
363
404
switch ( cc ) {
@@ -390,7 +431,7 @@ var WK_ = /*#__PURE__*/ (function() {
390
431
case 0x16 : out . push ( "NOT(" + out . pop ( ) + ")" ) ; break ;
391
432
392
433
case 0x14 : case 0x15 : {
393
- var argR = out . pop ( ) , argL = out . pop ( ) ;
434
+ argR = out . pop ( ) ; argL = out . pop ( ) ;
394
435
out . push ( [ "AND" , "OR" ] [ cc - 0x14 ] + "(" + argL + "," + argR + ")" ) ;
395
436
} break ;
396
437
@@ -536,6 +577,27 @@ var WK_ = /*#__PURE__*/ (function() {
536
577
return o ;
537
578
}
538
579
580
+ function parse_SHEETNAMECS ( blob , length ) {
581
+ return blob [ blob . l + length - 1 ] == 0 ? blob . read_shift ( length , 'cstr' ) : "" ;
582
+ }
583
+
584
+ function parse_SHEETNAMELP ( blob , length ) {
585
+ var len = blob [ blob . l ++ ] ;
586
+ if ( len > length - 1 ) len = length - 1 ;
587
+ var o = "" ; while ( o . length < len ) o += String . fromCharCode ( blob [ blob . l ++ ] ) ;
588
+ return o ;
589
+ }
590
+
591
+ function parse_SHEETINFOQP ( blob , length , opts ) {
592
+ if ( ! opts . qpro || length < 21 ) return ;
593
+ var id = blob . read_shift ( 1 ) ;
594
+ blob . l += 17 ;
595
+ var len = blob . read_shift ( 1 ) ;
596
+ blob . l += 2 ;
597
+ var nm = blob . read_shift ( length - 21 , 'cstr' ) ;
598
+ return [ id , nm ] ;
599
+ }
600
+
539
601
function parse_XFORMAT ( blob , length ) {
540
602
var o = { } , tgt = blob . l + length ;
541
603
while ( blob . l < tgt ) {
@@ -623,6 +685,8 @@ var WK_ = /*#__PURE__*/ (function() {
623
685
/*::[*/ 0x0067 /*::]*/ : { n :"RRANGES??" } ,
624
686
/*::[*/ 0x0068 /*::]*/ : { n :"FNAME??" } ,
625
687
/*::[*/ 0x0069 /*::]*/ : { n :"MRANGES??" } ,
688
+ /*::[*/ 0x00CC /*::]*/ : { n :"SHEETNAMECS" , f :parse_SHEETNAMECS } ,
689
+ /*::[*/ 0x00DE /*::]*/ : { n :"SHEETNAMELP" , f :parse_SHEETNAMELP } ,
626
690
/*::[*/ 0xFFFF /*::]*/ : { n :"" }
627
691
} ;
628
692
@@ -688,6 +752,7 @@ var WK_ = /*#__PURE__*/ (function() {
688
752
/*::[*/ 0x00BC /*::]*/ : { n :"??" } ,
689
753
/*::[*/ 0x00C3 /*::]*/ : { n :"??" } ,
690
754
/*::[*/ 0x00C9 /*::]*/ : { n :"??" } ,
755
+ /*::[*/ 0x00CC /*::]*/ : { n :"SHEETNAMECS" , f :parse_SHEETNAMECS } ,
691
756
/*::[*/ 0x00CD /*::]*/ : { n :"??" } ,
692
757
/*::[*/ 0x00CE /*::]*/ : { n :"??" } ,
693
758
/*::[*/ 0x00CF /*::]*/ : { n :"??" } ,
@@ -732,6 +797,7 @@ var WK_ = /*#__PURE__*/ (function() {
732
797
/*::[*/ 0x029A /*::]*/ : { n :"??" } ,
733
798
/*::[*/ 0x0300 /*::]*/ : { n :"??" } ,
734
799
/*::[*/ 0x0304 /*::]*/ : { n :"??" } ,
800
+ /*::[*/ 0x0601 /*::]*/ : { n :"SHEETINFOQP" , f :parse_SHEETINFOQP } ,
735
801
/*::[*/ 0x0640 /*::]*/ : { n :"??" } ,
736
802
/*::[*/ 0x0642 /*::]*/ : { n :"??" } ,
737
803
/*::[*/ 0x0701 /*::]*/ : { n :"??" } ,
0 commit comments