@@ -28,12 +28,18 @@ var WK_ = /*#__PURE__*/ (function() {
2828 if ( ! d ) return d ;
2929 var o = opts || { } ;
3030 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 = [ ] ;
3333
3434 var refguess = { s : { r :0 , c :0 } , e : { r :0 , c :0 } } ;
3535 var sheetRows = o . sheetRows || 0 ;
3636
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+
3743 if ( d [ 2 ] == 0x02 ) {
3844 o . Enum = WK1Enum ;
3945 lotushopper ( d , function ( val , R , RT ) { switch ( RT ) {
@@ -42,6 +48,8 @@ var WK_ = /*#__PURE__*/ (function() {
4248 if ( val >= 0x1000 ) o . qpro = true ;
4349 break ;
4450 case 0x06 : refguess = val ; break ; /* RANGE */
51+ case 0xCC : if ( val ) next_n = val ; break ; /* SHEETNAMECS */
52+ case 0xDE : next_n = val ; break ; /* SHEETNAMELP */
4553 case 0x0F : /* LABEL */
4654 case 0x33 : /* STRING */
4755 if ( ! o . qpro ) val [ 1 ] . v = val [ 1 ] . v . slice ( 1 ) ;
@@ -54,6 +62,18 @@ var WK_ = /*#__PURE__*/ (function() {
5462 val [ 1 ] . z = o . dateNF || SSF . _table [ 14 ] ;
5563 if ( o . cellDates ) { val [ 1 ] . t = 'd' ; val [ 1 ] . v = numdate ( val [ 1 ] . v ) ; }
5664 }
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+
5777 var tmpcell = o . dense ? ( s [ val [ 0 ] . r ] || [ ] ) [ val [ 0 ] . c ] : s [ encode_cell ( val [ 0 ] ) ] ;
5878 if ( tmpcell ) {
5979 tmpcell . t = val [ 1 ] . t ; tmpcell . v = val [ 1 ] . v ;
@@ -72,6 +92,7 @@ var WK_ = /*#__PURE__*/ (function() {
7292 o . Enum = WK3Enum ;
7393 if ( d [ 2 ] == 0x0E ) { o . qpro = true ; d . l = 0 ; }
7494 lotushopper ( d , function ( val , R , RT ) { switch ( RT ) {
95+ case 0xCC : n = val ; break ; /* SHEETNAMECS */
7596 case 0x16 : /* LABEL16 */
7697 val [ 1 ] . v = val [ 1 ] . v . slice ( 1 ) ;
7798 /* falls through */
@@ -84,10 +105,10 @@ var WK_ = /*#__PURE__*/ (function() {
84105 if ( val [ 3 ] > sidx ) {
85106 s [ "!ref" ] = encode_range ( refguess ) ;
86107 sheets [ n ] = s ;
108+ snames . push ( n ) ;
87109 s = ( o . dense ? [ ] : { } ) ;
88110 refguess = { s : { r :0 , c :0 } , e : { r :0 , c :0 } } ;
89111 sidx = val [ 3 ] ; n = "Sheet" + ( sidx + 1 ) ;
90- snames . push ( n ) ;
91112 }
92113 if ( sheetRows > 0 && val [ 0 ] . r >= sheetRows ) break ;
93114 if ( o . dense ) {
@@ -100,17 +121,23 @@ var WK_ = /*#__PURE__*/ (function() {
100121 case 0x1B : /* XFORMAT */
101122 if ( val [ 0x36b0 ] ) realnames [ val [ 0x36b0 ] [ 0 ] ] = val [ 0x36b0 ] [ 1 ] ;
102123 break ;
124+ case 0x0601 : /* SHEETINFOQP */
125+ realnames [ val [ 0 ] ] = val [ 1 ] ; if ( val [ 0 ] == sidx ) n = val [ 1 ] ; break ;
103126 default : break ;
104127 } } , o ) ;
105128 } else throw new Error ( "Unrecognized LOTUS BOF " + d [ 2 ] ) ;
106-
107129 s [ "!ref" ] = encode_range ( refguess ) ;
108- sheets [ n ] = s ;
130+ sheets [ next_n || n ] = s ;
131+ snames . push ( next_n || n ) ;
109132 if ( ! realnames . length ) return { SheetNames : snames , Sheets : sheets } ;
110133 var osheets = { } , rnames = [ ] ;
134+ /* TODO: verify no collisions */
111135 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 {
112139 rnames . push ( realnames [ i ] ) ;
113- osheets [ realnames [ i ] ] = sheets [ snames [ i ] ] ;
140+ osheets [ realnames [ i ] ] = ( { "!ref" : "A1" } ) ;
114141 }
115142 return { SheetNames : rnames , Sheets : osheets } ;
116143 }
@@ -126,7 +153,8 @@ var WK_ = /*#__PURE__*/ (function() {
126153
127154 write_biff_rec ( ba , 0x00 , write_BOF_WK1 ( 0x0406 ) ) ;
128155 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 ) {
130158 var rr = encode_row ( R ) ;
131159 for ( var C = range . s . c ; C <= range . e . c ; ++ C ) {
132160 if ( R === range . s . r ) cols [ C ] = encode_col ( C ) ;
@@ -165,7 +193,8 @@ var WK_ = /*#__PURE__*/ (function() {
165193 var range = safe_decode_range ( ws [ "!ref" ] ) ;
166194 var dense = Array . isArray ( ws ) ;
167195 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 ) {
169198 var rr = encode_row ( R ) ;
170199 for ( var C = range . s . c ; C <= range . e . c ; ++ C ) {
171200 if ( R === range . s . r ) cols [ C ] = encode_col ( C ) ;
@@ -211,6 +240,7 @@ var WK_ = /*#__PURE__*/ (function() {
211240 if ( rows < range . e . r ) rows = range . e . r ;
212241 if ( cols < range . e . c ) cols = range . e . c ;
213242 }
243+ if ( rows > 8191 ) rows = 8191 ;
214244 out . write_shift ( 2 , rows ) ;
215245 out . write_shift ( 1 , wscnt ) ;
216246 out . write_shift ( 1 , cols ) ;
@@ -223,12 +253,23 @@ var WK_ = /*#__PURE__*/ (function() {
223253 return out ;
224254 }
225255
226- function parse_RANGE ( blob ) {
256+ function parse_RANGE ( blob , length , opts ) {
227257 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+ }
228267 o . s . c = blob . read_shift ( 2 ) ;
229268 o . s . r = blob . read_shift ( 2 ) ;
269+ if ( length == 12 && opts . qpro ) blob . l += 2 ;
230270 o . e . c = blob . read_shift ( 2 ) ;
231271 o . e . r = blob . read_shift ( 2 ) ;
272+ if ( length == 12 && opts . qpro ) blob . l += 2 ;
232273 if ( o . s . c == 0xFFFF ) o . s . c = o . e . c = o . s . r = o . e . r = 0 ;
233274 return o ;
234275 }
@@ -242,10 +283,10 @@ var WK_ = /*#__PURE__*/ (function() {
242283 }
243284
244285 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 ] ;
246287 if ( opts . qpro && opts . vers != 0x5120 ) {
247288 o [ 0 ] . c = blob . read_shift ( 1 ) ;
248- blob . l ++ ;
289+ o [ 3 ] = blob . read_shift ( 1 ) ;
249290 o [ 0 ] . r = blob . read_shift ( 2 ) ;
250291 blob . l += 2 ;
251292 } else {
@@ -357,7 +398,7 @@ var WK_ = /*#__PURE__*/ (function() {
357398
358399 function wk1_fmla_to_csf ( blob , o ) {
359400 prep_blob ( blob , 0 ) ;
360- var out = [ ] , argc = 0 , R = "" , C = "" ;
401+ var out = [ ] , argc = 0 , R = "" , C = "" , argL = "" , argR = "" ;
361402 while ( blob . l < blob . length ) {
362403 var cc = blob [ blob . l ++ ] ;
363404 switch ( cc ) {
@@ -390,7 +431,7 @@ var WK_ = /*#__PURE__*/ (function() {
390431 case 0x16 : out . push ( "NOT(" + out . pop ( ) + ")" ) ; break ;
391432
392433 case 0x14 : case 0x15 : {
393- var argR = out . pop ( ) , argL = out . pop ( ) ;
434+ argR = out . pop ( ) ; argL = out . pop ( ) ;
394435 out . push ( [ "AND" , "OR" ] [ cc - 0x14 ] + "(" + argL + "," + argR + ")" ) ;
395436 } break ;
396437
@@ -536,6 +577,27 @@ var WK_ = /*#__PURE__*/ (function() {
536577 return o ;
537578 }
538579
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+
539601 function parse_XFORMAT ( blob , length ) {
540602 var o = { } , tgt = blob . l + length ;
541603 while ( blob . l < tgt ) {
@@ -623,6 +685,8 @@ var WK_ = /*#__PURE__*/ (function() {
623685 /*::[*/ 0x0067 /*::]*/ : { n :"RRANGES??" } ,
624686 /*::[*/ 0x0068 /*::]*/ : { n :"FNAME??" } ,
625687 /*::[*/ 0x0069 /*::]*/ : { n :"MRANGES??" } ,
688+ /*::[*/ 0x00CC /*::]*/ : { n :"SHEETNAMECS" , f :parse_SHEETNAMECS } ,
689+ /*::[*/ 0x00DE /*::]*/ : { n :"SHEETNAMELP" , f :parse_SHEETNAMELP } ,
626690 /*::[*/ 0xFFFF /*::]*/ : { n :"" }
627691 } ;
628692
@@ -688,6 +752,7 @@ var WK_ = /*#__PURE__*/ (function() {
688752 /*::[*/ 0x00BC /*::]*/ : { n :"??" } ,
689753 /*::[*/ 0x00C3 /*::]*/ : { n :"??" } ,
690754 /*::[*/ 0x00C9 /*::]*/ : { n :"??" } ,
755+ /*::[*/ 0x00CC /*::]*/ : { n :"SHEETNAMECS" , f :parse_SHEETNAMECS } ,
691756 /*::[*/ 0x00CD /*::]*/ : { n :"??" } ,
692757 /*::[*/ 0x00CE /*::]*/ : { n :"??" } ,
693758 /*::[*/ 0x00CF /*::]*/ : { n :"??" } ,
@@ -732,6 +797,7 @@ var WK_ = /*#__PURE__*/ (function() {
732797 /*::[*/ 0x029A /*::]*/ : { n :"??" } ,
733798 /*::[*/ 0x0300 /*::]*/ : { n :"??" } ,
734799 /*::[*/ 0x0304 /*::]*/ : { n :"??" } ,
800+ /*::[*/ 0x0601 /*::]*/ : { n :"SHEETINFOQP" , f :parse_SHEETINFOQP } ,
735801 /*::[*/ 0x0640 /*::]*/ : { n :"??" } ,
736802 /*::[*/ 0x0642 /*::]*/ : { n :"??" } ,
737803 /*::[*/ 0x0701 /*::]*/ : { n :"??" } ,
0 commit comments