2018-06-01 16:32:08 +00:00
/*! xlsx.js (C) 2013-present SheetJS -- http://sheetjs.com */
2017-02-03 20:50:45 +00:00
/* vim: set ts=2: */
2017-03-10 01:09:18 +00:00
/*exported XLSX */
2022-05-22 23:51:41 +00:00
/*global global, exports, module, require:false, process:false, Buffer:false, ArrayBuffer:false, DataView:false, Deno:false */
2017-02-03 20:50:45 +00:00
var XLSX = { } ;
2018-06-01 16:32:08 +00:00
function make _xlsx _lib ( XLSX ) {
2022-06-09 04:45:22 +00:00
XLSX . version = '0.18.9' ;
2017-12-30 05:40:35 +00:00
var current _codepage = 1200 , current _ansi = 1252 ;
2017-03-12 18:02:43 +00:00
/*:: declare var cptable:any; */
2018-05-05 06:34:37 +00:00
/*global cptable:true, window */
2022-03-12 14:05:57 +00:00
var $cptable ;
2017-02-03 20:50:45 +00:00
2022-03-12 14:05:57 +00:00
var VALID _ANSI = [ 874 , 932 , 936 , 949 , 950 , 1250 , 1251 , 1252 , 1253 , 1254 , 1255 , 1256 , 1257 , 1258 , 10000 ] ;
2017-12-30 05:40:35 +00:00
/* ECMA-376 Part I 18.4.1 charset to codepage mapping */
var CS2CP = ( {
/*::[*/ 0 /*::]*/ : 1252 , /* ANSI */
/*::[*/ 1 /*::]*/ : 65001 , /* DEFAULT */
/*::[*/ 2 /*::]*/ : 65001 , /* SYMBOL */
/*::[*/ 77 /*::]*/ : 10000 , /* MAC */
/*::[*/ 128 /*::]*/ : 932 , /* SHIFTJIS */
/*::[*/ 129 /*::]*/ : 949 , /* HANGUL */
/*::[*/ 130 /*::]*/ : 1361 , /* JOHAB */
/*::[*/ 134 /*::]*/ : 936 , /* GB2312 */
/*::[*/ 136 /*::]*/ : 950 , /* CHINESEBIG5 */
/*::[*/ 161 /*::]*/ : 1253 , /* GREEK */
/*::[*/ 162 /*::]*/ : 1254 , /* TURKISH */
/*::[*/ 163 /*::]*/ : 1258 , /* VIETNAMESE */
/*::[*/ 177 /*::]*/ : 1255 , /* HEBREW */
/*::[*/ 178 /*::]*/ : 1256 , /* ARABIC */
/*::[*/ 186 /*::]*/ : 1257 , /* BALTIC */
/*::[*/ 204 /*::]*/ : 1251 , /* RUSSIAN */
/*::[*/ 222 /*::]*/ : 874 , /* THAI */
/*::[*/ 238 /*::]*/ : 1250 , /* EASTEUROPE */
/*::[*/ 255 /*::]*/ : 1252 , /* OEM */
/*::[*/ 69 /*::]*/ : 6969 /* MISC */
} /*:any*/ ) ;
var set _ansi = function ( cp /*:number*/ ) { if ( VALID _ANSI . indexOf ( cp ) == - 1 ) return ; current _ansi = CS2CP [ 0 ] = cp ; } ;
function reset _ansi ( ) { set _ansi ( 1252 ) ; }
var set _cp = function ( cp /*:number*/ ) { current _codepage = cp ; set _ansi ( cp ) ; } ;
function reset _cp ( ) { set _cp ( 1200 ) ; reset _ansi ( ) ; }
function char _codes ( data /*:string*/ ) /*:Array<number>*/ { var o /*:Array<number>*/ = [ ] ; for ( var i = 0 , len = data . length ; i < len ; ++ i ) o [ i ] = data . charCodeAt ( i ) ; return o ; }
2017-06-24 06:51:37 +00:00
function utf16leread ( data /*:string*/ ) /*:string*/ {
2017-12-30 05:40:35 +00:00
var o /*:Array<string>*/ = [ ] ;
2017-06-24 06:51:37 +00:00
for ( var i = 0 ; i < ( data . length >> 1 ) ; ++ i ) o [ i ] = String . fromCharCode ( data . charCodeAt ( 2 * i ) + ( data . charCodeAt ( 2 * i + 1 ) << 8 ) ) ;
return o . join ( "" ) ;
}
function utf16beread ( data /*:string*/ ) /*:string*/ {
2017-12-30 05:40:35 +00:00
var o /*:Array<string>*/ = [ ] ;
2017-06-24 06:51:37 +00:00
for ( var i = 0 ; i < ( data . length >> 1 ) ; ++ i ) o [ i ] = String . fromCharCode ( data . charCodeAt ( 2 * i + 1 ) + ( data . charCodeAt ( 2 * i ) << 8 ) ) ;
return o . join ( "" ) ;
}
2017-02-24 10:33:01 +00:00
var debom = function ( data /*:string*/ ) /*:string*/ {
var c1 = data . charCodeAt ( 0 ) , c2 = data . charCodeAt ( 1 ) ;
2018-01-11 08:01:25 +00:00
if ( c1 == 0xFF && c2 == 0xFE ) return utf16leread ( data . slice ( 2 ) ) ;
if ( c1 == 0xFE && c2 == 0xFF ) return utf16beread ( data . slice ( 2 ) ) ;
if ( c1 == 0xFEFF ) return data . slice ( 1 ) ;
2017-02-24 10:33:01 +00:00
return data ;
} ;
2017-02-03 20:50:45 +00:00
2017-10-17 00:14:32 +00:00
var _getchar = function _gc1 ( x /*:number*/ ) /*:string*/ { return String . fromCharCode ( x ) ; } ;
2019-07-21 03:32:02 +00:00
var _getansi = function _ga1 ( x /*:number*/ ) /*:string*/ { return String . fromCharCode ( x ) ; } ;
2022-05-22 23:51:41 +00:00
function set _cptable ( cptable ) {
$cptable = cptable ;
2019-07-21 03:32:02 +00:00
set _cp = function ( cp /*:number*/ ) { current _codepage = cp ; set _ansi ( cp ) ; } ;
2017-10-17 00:14:32 +00:00
debom = function ( data /*:string*/ ) {
2022-03-12 14:05:57 +00:00
if ( data . charCodeAt ( 0 ) === 0xFF && data . charCodeAt ( 1 ) === 0xFE ) { return $cptable . utils . decode ( 1200 , char _codes ( data . slice ( 2 ) ) ) ; }
2017-02-03 20:50:45 +00:00
return data ;
} ;
2017-10-17 00:14:32 +00:00
_getchar = function _gc2 ( x /*:number*/ ) /*:string*/ {
2017-02-03 20:50:45 +00:00
if ( current _codepage === 1200 ) return String . fromCharCode ( x ) ;
2022-03-12 14:05:57 +00:00
return $cptable . utils . decode ( current _codepage , [ x & 255 , x >> 8 ] ) [ 0 ] ;
2017-02-03 20:50:45 +00:00
} ;
2019-07-21 03:32:02 +00:00
_getansi = function _ga2 ( x /*:number*/ ) /*:string*/ {
2022-03-12 14:05:57 +00:00
return $cptable . utils . decode ( current _ansi , [ x ] ) [ 0 ] ;
2019-08-03 22:37:04 +00:00
} ;
2022-05-22 23:51:41 +00:00
cpdoit ( ) ;
2017-02-03 20:50:45 +00:00
}
2017-04-09 04:03:19 +00:00
var DENSE = null ;
2017-04-30 16:27:03 +00:00
var DIF _XL = true ;
2022-03-22 20:08:08 +00:00
var Base64 _map = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=" ;
function Base64 _encode ( input ) {
var o = "" ;
var c1 = 0 , c2 = 0 , c3 = 0 , e1 = 0 , e2 = 0 , e3 = 0 , e4 = 0 ;
for ( var i = 0 ; i < input . length ; ) {
c1 = input . charCodeAt ( i ++ ) ;
e1 = c1 >> 2 ;
c2 = input . charCodeAt ( i ++ ) ;
e2 = ( c1 & 3 ) << 4 | c2 >> 4 ;
c3 = input . charCodeAt ( i ++ ) ;
e3 = ( c2 & 15 ) << 2 | c3 >> 6 ;
e4 = c3 & 63 ;
if ( isNaN ( c2 ) ) {
e3 = e4 = 64 ;
} else if ( isNaN ( c3 ) ) {
e4 = 64 ;
2022-02-10 12:40:50 +00:00
}
2022-03-22 20:08:08 +00:00
o += Base64 _map . charAt ( e1 ) + Base64 _map . charAt ( e2 ) + Base64 _map . charAt ( e3 ) + Base64 _map . charAt ( e4 ) ;
}
return o ;
}
function Base64 _decode ( input ) {
var o = "" ;
var c1 = 0 , c2 = 0 , c3 = 0 , e1 = 0 , e2 = 0 , e3 = 0 , e4 = 0 ;
input = input . replace ( /[^\w\+\/\=]/g , "" ) ;
for ( var i = 0 ; i < input . length ; ) {
e1 = Base64 _map . indexOf ( input . charAt ( i ++ ) ) ;
e2 = Base64 _map . indexOf ( input . charAt ( i ++ ) ) ;
c1 = e1 << 2 | e2 >> 4 ;
o += String . fromCharCode ( c1 ) ;
e3 = Base64 _map . indexOf ( input . charAt ( i ++ ) ) ;
c2 = ( e2 & 15 ) << 4 | e3 >> 2 ;
if ( e3 !== 64 ) {
o += String . fromCharCode ( c2 ) ;
}
e4 = Base64 _map . indexOf ( input . charAt ( i ++ ) ) ;
c3 = ( e3 & 3 ) << 6 | e4 ;
if ( e4 !== 64 ) {
o += String . fromCharCode ( c3 ) ;
}
}
return o ;
}
2022-03-20 05:29:24 +00:00
var has _buf = /*#__PURE__*/ ( function ( ) { return typeof Buffer !== 'undefined' && typeof process !== 'undefined' && typeof process . versions !== 'undefined' && ! ! process . versions . node ; } ) ( ) ;
2017-02-03 20:50:45 +00:00
2022-03-20 05:29:24 +00:00
var Buffer _from = /*#__PURE__*/ ( function ( ) {
if ( typeof Buffer !== 'undefined' ) {
var nbfs = ! Buffer . from ;
if ( ! nbfs ) try { Buffer . from ( "foo" , "utf8" ) ; } catch ( e ) { nbfs = true ; }
return nbfs ? function ( buf , enc ) { return ( enc ) ? new Buffer ( buf , enc ) : new Buffer ( buf ) ; } : Buffer . from . bind ( Buffer ) ;
}
return function ( ) { } ;
} ) ( ) ;
2018-07-09 03:46:11 +00:00
2018-05-05 06:34:37 +00:00
2017-02-10 19:23:01 +00:00
function new _raw _buf ( len /*:number*/ ) {
2017-02-03 20:50:45 +00:00
/* jshint -W056 */
2022-03-20 05:29:24 +00:00
if ( has _buf ) return Buffer . alloc ? Buffer . alloc ( len ) : new Buffer ( len ) ;
return typeof Uint8Array != "undefined" ? new Uint8Array ( len ) : new Array ( len ) ;
2017-02-03 20:50:45 +00:00
/* jshint +W056 */
}
2018-09-06 07:55:28 +00:00
function new _unsafe _buf ( len /*:number*/ ) {
/* jshint -W056 */
2022-03-20 05:29:24 +00:00
if ( has _buf ) return Buffer . allocUnsafe ? Buffer . allocUnsafe ( len ) : new Buffer ( len ) ;
return typeof Uint8Array != "undefined" ? new Uint8Array ( len ) : new Array ( len ) ;
2018-09-06 07:55:28 +00:00
/* jshint +W056 */
}
2018-05-05 06:34:37 +00:00
var s2a = function s2a ( s /*:string*/ ) /*:any*/ {
2018-07-09 03:46:11 +00:00
if ( has _buf ) return Buffer _from ( s , "binary" ) ;
2018-04-21 15:16:37 +00:00
return s . split ( "" ) . map ( function ( x /*:string*/ ) /*:number*/ { return x . charCodeAt ( 0 ) & 0xff ; } ) ;
2018-05-05 06:34:37 +00:00
} ;
2017-02-03 20:50:45 +00:00
2018-04-21 15:16:37 +00:00
function s2ab ( s /*:string*/ ) /*:any*/ {
2017-12-30 05:40:35 +00:00
if ( typeof ArrayBuffer === 'undefined' ) return s2a ( s ) ;
var buf = new ArrayBuffer ( s . length ) , view = new Uint8Array ( buf ) ;
for ( var i = 0 ; i != s . length ; ++ i ) view [ i ] = s . charCodeAt ( i ) & 0xFF ;
return buf ;
}
2018-02-03 20:46:32 +00:00
function a2s ( data /*:any*/ ) /*:string*/ {
2019-08-04 19:50:49 +00:00
if ( Array . isArray ( data ) ) return data . map ( function ( c ) { return String . fromCharCode ( c ) ; } ) . join ( "" ) ;
var o /*:Array<string>*/ = [ ] ; for ( var i = 0 ; i < data . length ; ++ i ) o [ i ] = String . fromCharCode ( data [ i ] ) ; return o . join ( "" ) ;
2017-12-30 05:40:35 +00:00
}
2018-02-03 20:46:32 +00:00
function a2u ( data /*:Array<number>*/ ) /*:Uint8Array*/ {
if ( typeof Uint8Array === 'undefined' ) throw new Error ( "Unsupported" ) ;
return new Uint8Array ( data ) ;
}
2018-01-11 08:01:25 +00:00
function ab2a ( data /*:ArrayBuffer|Uint8Array*/ ) /*:Array<number>*/ {
if ( typeof ArrayBuffer == 'undefined' ) throw new Error ( "Unsupported" ) ;
if ( data instanceof ArrayBuffer ) return ab2a ( new Uint8Array ( data ) ) ;
/*:: if(data instanceof ArrayBuffer) throw new Error("unreachable"); */
var o = new Array ( data . length ) ;
for ( var i = 0 ; i < data . length ; ++ i ) o [ i ] = data [ i ] ;
return o ;
}
2022-03-20 05:29:24 +00:00
var bconcat = has _buf ? function ( bufs ) { return Buffer . concat ( bufs . map ( function ( buf ) { return Buffer . isBuffer ( buf ) ? buf : Buffer _from ( buf ) ; } ) ) ; } : function ( bufs ) {
if ( typeof Uint8Array !== "undefined" ) {
var i = 0 , maxlen = 0 ;
for ( i = 0 ; i < bufs . length ; ++ i ) maxlen += bufs [ i ] . length ;
var o = new Uint8Array ( maxlen ) ;
var len = 0 ;
for ( i = 0 , maxlen = 0 ; i < bufs . length ; maxlen += len , ++ i ) {
len = bufs [ i ] . length ;
if ( bufs [ i ] instanceof Uint8Array ) o . set ( bufs [ i ] , maxlen ) ;
else if ( typeof bufs [ i ] == "string" ) { throw "wtf" ; }
else o . set ( new Uint8Array ( bufs [ i ] ) , maxlen ) ;
}
return o ;
}
return [ ] . concat . apply ( [ ] , bufs . map ( function ( buf ) { return Array . isArray ( buf ) ? buf : [ ] . slice . call ( buf ) ; } ) ) ;
} ;
2022-02-10 12:40:50 +00:00
function utf8decode ( content /*:string*/ ) {
2022-02-15 07:18:15 +00:00
var out = [ ] , widx = 0 , L = content . length + 250 ;
2022-02-10 12:40:50 +00:00
var o = new _raw _buf ( content . length + 255 ) ;
for ( var ridx = 0 ; ridx < content . length ; ++ ridx ) {
var c = content . charCodeAt ( ridx ) ;
if ( c < 0x80 ) o [ widx ++ ] = c ;
else if ( c < 0x800 ) {
o [ widx ++ ] = ( 192 | ( ( c >> 6 ) & 31 ) ) ;
o [ widx ++ ] = ( 128 | ( c & 63 ) ) ;
} else if ( c >= 0xD800 && c < 0xE000 ) {
c = ( c & 1023 ) + 64 ;
2022-02-14 01:28:13 +00:00
var d = content . charCodeAt ( ++ ridx ) & 1023 ;
2022-02-10 12:40:50 +00:00
o [ widx ++ ] = ( 240 | ( ( c >> 8 ) & 7 ) ) ;
o [ widx ++ ] = ( 128 | ( ( c >> 2 ) & 63 ) ) ;
o [ widx ++ ] = ( 128 | ( ( d >> 6 ) & 15 ) | ( ( c & 3 ) << 4 ) ) ;
o [ widx ++ ] = ( 128 | ( d & 63 ) ) ;
} else {
o [ widx ++ ] = ( 224 | ( ( c >> 12 ) & 15 ) ) ;
o [ widx ++ ] = ( 128 | ( ( c >> 6 ) & 63 ) ) ;
o [ widx ++ ] = ( 128 | ( c & 63 ) ) ;
}
2022-02-15 07:18:15 +00:00
if ( widx > L ) {
2022-02-10 12:40:50 +00:00
out . push ( o . slice ( 0 , widx ) ) ;
widx = 0 ;
o = new _raw _buf ( 65535 ) ;
2022-02-15 07:18:15 +00:00
L = 65530 ;
2022-02-10 12:40:50 +00:00
}
}
out . push ( o . slice ( 0 , widx ) ) ;
return bconcat ( out ) ;
}
2017-12-01 05:48:10 +00:00
var chr0 = /\u0000/g , chr1 = /[\u0001-\u0006]/g ;
2017-02-03 20:50:45 +00:00
/ * : :
declare type Block = any ;
declare type BufArray = {
2017-02-10 19:23:01 +00:00
newblk ( sz : number ) : Block ;
2017-02-03 20:50:45 +00:00
next ( sz : number ) : Block ;
end ( ) : any ;
push ( buf : Block ) : void ;
} ;
2017-02-10 19:23:01 +00:00
2017-04-09 04:03:19 +00:00
type RecordHopperCB = { ( d : any , Rn : string , RT : number ) : ? boolean ; } ;
2017-02-10 19:23:01 +00:00
type EvertType = { [ string ] : string } ;
type EvertNumType = { [ string ] : number } ;
type EvertArrType = { [ string ] : Array < string > } ;
type StringConv = { ( string ) : string } ;
2017-04-03 00:16:03 +00:00
2017-02-03 20:50:45 +00:00
* /
2017-03-12 18:02:43 +00:00
/* ssf.js (C) 2013-present SheetJS -- http://sheetjs.com */
2017-02-03 20:50:45 +00:00
/*jshint -W041 */
2017-03-12 18:02:43 +00:00
function _strrev ( x /*:string*/ ) /*:string*/ { var o = "" , i = x . length - 1 ; while ( i >= 0 ) o += x . charAt ( i -- ) ; return o ; }
function pad0 ( v /*:any*/ , d /*:number*/ ) /*:string*/ { var t = "" + v ; return t . length >= d ? t : fill ( '0' , d - t . length ) + t ; }
function pad _ ( v /*:any*/ , d /*:number*/ ) /*:string*/ { var t = "" + v ; return t . length >= d ? t : fill ( ' ' , d - t . length ) + t ; }
function rpad _ ( v /*:any*/ , d /*:number*/ ) /*:string*/ { var t = "" + v ; return t . length >= d ? t : t + fill ( ' ' , d - t . length ) ; }
function pad0r1 ( v /*:any*/ , d /*:number*/ ) /*:string*/ { var t = "" + Math . round ( v ) ; return t . length >= d ? t : fill ( '0' , d - t . length ) + t ; }
function pad0r2 ( v /*:any*/ , d /*:number*/ ) /*:string*/ { var t = "" + v ; return t . length >= d ? t : fill ( '0' , d - t . length ) + t ; }
2022-03-20 05:29:24 +00:00
var p2 _32 = /*#__PURE__*/ Math . pow ( 2 , 32 ) ;
2017-03-12 18:02:43 +00:00
function pad0r ( v /*:any*/ , d /*:number*/ ) /*:string*/ { if ( v > p2 _32 || v < - p2 _32 ) return pad0r1 ( v , d ) ; var i = Math . round ( v ) ; return pad0r2 ( i , d ) ; }
2022-03-20 05:29:24 +00:00
/* yes, in 2022 this is still faster than string compare */
function SSF _isgeneral ( s /*:string*/ , i /*:?number*/ ) /*:boolean*/ { i = i || 0 ; return s . length >= 7 + i && ( s . charCodeAt ( i ) | 32 ) === 103 && ( s . charCodeAt ( i + 1 ) | 32 ) === 101 && ( s . charCodeAt ( i + 2 ) | 32 ) === 110 && ( s . charCodeAt ( i + 3 ) | 32 ) === 101 && ( s . charCodeAt ( i + 4 ) | 32 ) === 114 && ( s . charCodeAt ( i + 5 ) | 32 ) === 97 && ( s . charCodeAt ( i + 6 ) | 32 ) === 108 ; }
2017-03-21 20:44:35 +00:00
var days /*:Array<Array<string> >*/ = [
2017-02-03 20:50:45 +00:00
[ 'Sun' , 'Sunday' ] ,
[ 'Mon' , 'Monday' ] ,
[ 'Tue' , 'Tuesday' ] ,
[ 'Wed' , 'Wednesday' ] ,
[ 'Thu' , 'Thursday' ] ,
[ 'Fri' , 'Friday' ] ,
[ 'Sat' , 'Saturday' ]
] ;
2017-03-21 20:44:35 +00:00
var months /*:Array<Array<string> >*/ = [
2017-02-03 20:50:45 +00:00
[ 'J' , 'Jan' , 'January' ] ,
[ 'F' , 'Feb' , 'February' ] ,
[ 'M' , 'Mar' , 'March' ] ,
[ 'A' , 'Apr' , 'April' ] ,
[ 'M' , 'May' , 'May' ] ,
[ 'J' , 'Jun' , 'June' ] ,
[ 'J' , 'Jul' , 'July' ] ,
[ 'A' , 'Aug' , 'August' ] ,
[ 'S' , 'Sep' , 'September' ] ,
[ 'O' , 'Oct' , 'October' ] ,
[ 'N' , 'Nov' , 'November' ] ,
[ 'D' , 'Dec' , 'December' ]
] ;
2022-03-20 05:29:24 +00:00
function SSF _init _table ( t /*:any*/ ) {
if ( ! t ) t = { } ;
2017-04-30 16:27:03 +00:00
t [ 0 ] = 'General' ;
t [ 1 ] = '0' ;
t [ 2 ] = '0.00' ;
t [ 3 ] = '#,##0' ;
t [ 4 ] = '#,##0.00' ;
t [ 9 ] = '0%' ;
t [ 10 ] = '0.00%' ;
t [ 11 ] = '0.00E+00' ;
t [ 12 ] = '# ?/?' ;
t [ 13 ] = '# ??/??' ;
t [ 14 ] = 'm/d/yy' ;
t [ 15 ] = 'd-mmm-yy' ;
t [ 16 ] = 'd-mmm' ;
t [ 17 ] = 'mmm-yy' ;
t [ 18 ] = 'h:mm AM/PM' ;
t [ 19 ] = 'h:mm:ss AM/PM' ;
t [ 20 ] = 'h:mm' ;
t [ 21 ] = 'h:mm:ss' ;
t [ 22 ] = 'm/d/yy h:mm' ;
t [ 37 ] = '#,##0 ;(#,##0)' ;
t [ 38 ] = '#,##0 ;[Red](#,##0)' ;
t [ 39 ] = '#,##0.00;(#,##0.00)' ;
t [ 40 ] = '#,##0.00;[Red](#,##0.00)' ;
t [ 45 ] = 'mm:ss' ;
t [ 46 ] = '[h]:mm:ss' ;
t [ 47 ] = 'mmss.0' ;
t [ 48 ] = '##0.0E+0' ;
t [ 49 ] = '@' ;
t [ 56 ] = '"上午/下午 "hh"時"mm"分"ss"秒 "' ;
2022-03-20 05:29:24 +00:00
return t ;
}
/* repeated to satiate webpack */
var table _fmt = {
0 : 'General' ,
1 : '0' ,
2 : '0.00' ,
3 : '#,##0' ,
4 : '#,##0.00' ,
9 : '0%' ,
10 : '0.00%' ,
11 : '0.00E+00' ,
12 : '# ?/?' ,
13 : '# ??/??' ,
14 : 'm/d/yy' ,
15 : 'd-mmm-yy' ,
16 : 'd-mmm' ,
17 : 'mmm-yy' ,
18 : 'h:mm AM/PM' ,
19 : 'h:mm:ss AM/PM' ,
20 : 'h:mm' ,
21 : 'h:mm:ss' ,
22 : 'm/d/yy h:mm' ,
37 : '#,##0 ;(#,##0)' ,
38 : '#,##0 ;[Red](#,##0)' ,
39 : '#,##0.00;(#,##0.00)' ,
40 : '#,##0.00;[Red](#,##0.00)' ,
45 : 'mm:ss' ,
46 : '[h]:mm:ss' ,
47 : 'mmss.0' ,
48 : '##0.0E+0' ,
49 : '@' ,
56 : '"上午/下午 "hh"時"mm"分"ss"秒 "'
} ;
2017-04-30 16:27:03 +00:00
2020-06-29 08:07:23 +00:00
/* Defaults determined by systematically testing in Excel 2019 */
/* These formats appear to default to other formats in the table */
2022-03-20 05:29:24 +00:00
var SSF _default _map = {
5 : 37 , 6 : 38 , 7 : 39 , 8 : 40 , // 5 -> 37 ... 8 -> 40
2020-06-29 08:07:23 +00:00
2022-03-20 05:29:24 +00:00
23 : 0 , 24 : 0 , 25 : 0 , 26 : 0 , // 23 -> 0 ... 26 -> 0
2020-06-29 08:07:23 +00:00
2022-03-20 05:29:24 +00:00
27 : 14 , 28 : 14 , 29 : 14 , 30 : 14 , 31 : 14 , // 27 -> 14 ... 31 -> 14
2020-06-29 08:07:23 +00:00
2022-03-20 05:29:24 +00:00
50 : 14 , 51 : 14 , 52 : 14 , 53 : 14 , 54 : 14 , // 50 -> 14 ... 58 -> 14
55 : 14 , 56 : 14 , 57 : 14 , 58 : 14 ,
59 : 1 , 60 : 2 , 61 : 3 , 62 : 4 , // 59 -> 1 ... 62 -> 4
2020-06-29 08:07:23 +00:00
2022-03-20 05:29:24 +00:00
67 : 9 , 68 : 10 , // 67 -> 9 ... 68 -> 10
69 : 12 , 70 : 13 , 71 : 14 , // 69 -> 12 ... 71 -> 14
72 : 14 , 73 : 15 , 74 : 16 , 75 : 17 , // 72 -> 14 ... 75 -> 17
76 : 20 , 77 : 21 , 78 : 22 , // 76 -> 20 ... 78 -> 22
79 : 45 , 80 : 46 , 81 : 47 , // 79 -> 45 ... 81 -> 47
82 : 0 // 82 -> 0 ... 65536 -> 0 (omitted)
} ;
2020-06-29 08:07:23 +00:00
/* These formats technically refer to Accounting formats with no equivalent */
2022-03-20 05:29:24 +00:00
var SSF _default _str = {
2022-03-12 14:05:57 +00:00
// 5 -- Currency, 0 decimal, black negative
5 : '"$"#,##0_);\\("$"#,##0\\)' ,
63 : '"$"#,##0_);\\("$"#,##0\\)' ,
// 6 -- Currency, 0 decimal, red negative
6 : '"$"#,##0_);[Red]\\("$"#,##0\\)' ,
64 : '"$"#,##0_);[Red]\\("$"#,##0\\)' ,
// 7 -- Currency, 2 decimal, black negative
7 : '"$"#,##0.00_);\\("$"#,##0.00\\)' ,
65 : '"$"#,##0.00_);\\("$"#,##0.00\\)' ,
// 8 -- Currency, 2 decimal, red negative
8 : '"$"#,##0.00_);[Red]\\("$"#,##0.00\\)' ,
66 : '"$"#,##0.00_);[Red]\\("$"#,##0.00\\)' ,
// 41 -- Accounting, 0 decimal, No Symbol
41 : '_(* #,##0_);_(* \\(#,##0\\);_(* "-"_);_(@_)' ,
// 42 -- Accounting, 0 decimal, $ Symbol
42 : '_("$"* #,##0_);_("$"* \\(#,##0\\);_("$"* "-"_);_(@_)' ,
// 43 -- Accounting, 2 decimal, No Symbol
43 : '_(* #,##0.00_);_(* \\(#,##0.00\\);_(* "-"??_);_(@_)' ,
// 44 -- Accounting, 2 decimal, $ Symbol
44 : '_("$"* #,##0.00_);_("$"* \\(#,##0.00\\);_("$"* "-"??_);_(@_)'
} ;
2022-03-20 05:29:24 +00:00
function SSF _frac ( x /*:number*/ , D /*:number*/ , mixed /*:?boolean*/ ) /*:Array<number>*/ {
2017-02-03 20:50:45 +00:00
var sgn = x < 0 ? - 1 : 1 ;
var B = x * sgn ;
var P _2 = 0 , P _1 = 1 , P = 0 ;
var Q _2 = 1 , Q _1 = 0 , Q = 0 ;
var A = Math . floor ( B ) ;
while ( Q _1 < D ) {
A = Math . floor ( B ) ;
P = A * P _1 + P _2 ;
Q = A * Q _1 + Q _2 ;
2017-04-30 16:27:03 +00:00
if ( ( B - A ) < 0.00000005 ) break ;
2017-02-03 20:50:45 +00:00
B = 1 / ( B - A ) ;
P _2 = P _1 ; P _1 = P ;
Q _2 = Q _1 ; Q _1 = Q ;
}
2017-04-30 16:27:03 +00:00
if ( Q > D ) { if ( Q _1 > D ) { Q = Q _2 ; P = P _2 ; } else { Q = Q _1 ; P = P _1 ; } }
2017-02-03 20:50:45 +00:00
if ( ! mixed ) return [ 0 , sgn * P , Q ] ;
var q = Math . floor ( sgn * P / Q ) ;
return [ q , sgn * P - q * Q , Q ] ;
}
2022-03-20 05:29:24 +00:00
function SSF _parse _date _code ( v /*:number*/ , opts /*:?any*/ , b2 /*:?boolean*/ ) {
2017-07-28 23:27:16 +00:00
if ( v > 2958465 || v < 0 ) return null ;
var date = ( v | 0 ) , time = Math . floor ( 86400 * ( v - date ) ) , dow = 0 ;
var dout = [ ] ;
var out = { D : date , T : time , u : 86400 * ( v - date ) - time , y : 0 , m : 0 , d : 0 , H : 0 , M : 0 , S : 0 , q : 0 } ;
if ( Math . abs ( out . u ) < 1e-6 ) out . u = 0 ;
if ( opts && opts . date1904 ) date += 1462 ;
if ( out . u > 0.9999 ) {
out . u = 0 ;
if ( ++ time == 86400 ) { out . T = time = 0 ; ++ date ; ++ out . D ; }
}
if ( date === 60 ) { dout = b2 ? [ 1317 , 10 , 29 ] : [ 1900 , 2 , 29 ] ; dow = 3 ; }
else if ( date === 0 ) { dout = b2 ? [ 1317 , 8 , 29 ] : [ 1900 , 1 , 0 ] ; dow = 6 ; }
else {
if ( date > 60 ) -- date ;
/* 1 = Jan 1 1900 in Gregorian */
var d = new Date ( 1900 , 0 , 1 ) ;
d . setDate ( d . getDate ( ) + date - 1 ) ;
dout = [ d . getFullYear ( ) , d . getMonth ( ) + 1 , d . getDate ( ) ] ;
dow = d . getDay ( ) ;
if ( date < 60 ) dow = ( dow + 6 ) % 7 ;
2022-03-20 05:29:24 +00:00
if ( b2 ) dow = SSF _fix _hijri ( d , dout ) ;
2017-07-28 23:27:16 +00:00
}
out . y = dout [ 0 ] ; out . m = dout [ 1 ] ; out . d = dout [ 2 ] ;
out . S = time % 60 ; time = Math . floor ( time / 60 ) ;
out . M = time % 60 ; time = Math . floor ( time / 60 ) ;
out . H = time ;
out . q = dow ;
return out ;
}
2022-03-20 05:29:24 +00:00
var SSFbasedate = /*#__PURE__*/ new Date ( 1899 , 11 , 31 , 0 , 0 , 0 ) ;
var SSFdnthresh = /*#__PURE__*/ SSFbasedate . getTime ( ) ;
var SSFbase1904 = /*#__PURE__*/ new Date ( 1900 , 2 , 1 , 0 , 0 , 0 ) ;
2017-07-28 23:27:16 +00:00
function datenum _local ( v /*:Date*/ , date1904 /*:?boolean*/ ) /*:number*/ {
2022-03-20 05:29:24 +00:00
var epoch = /*#__PURE__*/ v . getTime ( ) ;
2017-07-28 23:27:16 +00:00
if ( date1904 ) epoch -= 1461 * 24 * 60 * 60 * 1000 ;
2022-03-20 05:29:24 +00:00
else if ( v >= SSFbase1904 ) epoch += 24 * 60 * 60 * 1000 ;
return ( epoch - ( SSFdnthresh + ( /*#__PURE__*/ v . getTimezoneOffset ( ) - /*#__PURE__*/ SSFbasedate . getTimezoneOffset ( ) ) * 60000 ) ) / ( 24 * 60 * 60 * 1000 ) ;
2017-07-28 23:27:16 +00:00
}
2020-06-29 08:07:23 +00:00
/* ECMA-376 18.8.30 numFmt*/
/* Note: `toPrecision` uses standard form when prec > E and E >= -6 */
2022-03-20 05:29:24 +00:00
/* exponent >= -9 and <= 9 */
function SSF _strip _decimal ( o /*:string*/ ) /*:string*/ {
return ( o . indexOf ( "." ) == - 1 ) ? o : o . replace ( /(?:\.0*|(\.\d*[1-9])0+)$/ , "$1" ) ;
}
2020-06-29 08:07:23 +00:00
2022-03-20 05:29:24 +00:00
/* General Exponential always shows 2 digits exp and trims the mantissa */
function SSF _normalize _exp ( o /*:string*/ ) /*:string*/ {
if ( o . indexOf ( "E" ) == - 1 ) return o ;
return o . replace ( /(?:\.0*|(\.\d*[1-9])0+)[Ee]/ , "$1E" ) . replace ( /(E[+-])(\d)$/ , "$10$2" ) ;
}
2020-06-29 08:07:23 +00:00
2022-03-20 05:29:24 +00:00
/* exponent >= -9 and <= 9 */
function SSF _small _exp ( v /*:number*/ ) /*:string*/ {
var w = ( v < 0 ? 12 : 11 ) ;
var o = SSF _strip _decimal ( v . toFixed ( 12 ) ) ; if ( o . length <= w ) return o ;
o = v . toPrecision ( 10 ) ; if ( o . length <= w ) return o ;
return v . toExponential ( 5 ) ;
}
2020-06-29 08:07:23 +00:00
2022-03-20 05:29:24 +00:00
/* exponent >= 11 or <= -10 likely exponential */
function SSF _large _exp ( v /*:number*/ ) /*:string*/ {
var o = SSF _strip _decimal ( v . toFixed ( 11 ) ) ;
return ( o . length > ( v < 0 ? 12 : 11 ) || o === "0" || o === "-0" ) ? v . toPrecision ( 6 ) : o ;
}
2020-06-29 08:07:23 +00:00
2022-03-20 05:29:24 +00:00
function SSF _general _num ( v /*:number*/ ) /*:string*/ {
var V = Math . floor ( Math . log ( Math . abs ( v ) ) * Math . LOG10E ) , o ;
2020-06-29 08:07:23 +00:00
2022-03-20 05:29:24 +00:00
if ( V >= - 4 && V <= - 1 ) o = v . toPrecision ( 10 + V ) ;
else if ( Math . abs ( V ) <= 9 ) o = SSF _small _exp ( v ) ;
else if ( V === 10 ) o = v . toFixed ( 10 ) . substr ( 0 , 12 ) ;
else o = SSF _large _exp ( v ) ;
2020-06-29 08:07:23 +00:00
2022-03-20 05:29:24 +00:00
return SSF _strip _decimal ( SSF _normalize _exp ( o . toUpperCase ( ) ) ) ;
}
2020-06-29 08:07:23 +00:00
/ *
"General" rules :
- text is passed through ( "@" )
- booleans are rendered as TRUE / FALSE
- "up to 11 characters" displayed for numbers
- Default date format ( code 14 ) used for Dates
2022-03-20 05:29:24 +00:00
The longest 32 - bit integer text is "-2147483648" , exactly 11 chars
2020-06-29 08:07:23 +00:00
TODO : technically the display depends on the width of the cell
* /
2022-03-20 05:29:24 +00:00
function SSF _general ( v /*:any*/ , opts /*:any*/ ) {
2017-02-03 20:50:45 +00:00
switch ( typeof v ) {
case 'string' : return v ;
case 'boolean' : return v ? "TRUE" : "FALSE" ;
2022-03-20 05:29:24 +00:00
case 'number' : return ( v | 0 ) === v ? v . toString ( 10 ) : SSF _general _num ( v ) ;
2017-04-30 16:27:03 +00:00
case 'undefined' : return "" ;
2017-07-28 23:27:16 +00:00
case 'object' :
if ( v == null ) return "" ;
2022-03-20 05:29:24 +00:00
if ( v instanceof Date ) return SSF _format ( 14 , datenum _local ( v , opts && opts . date1904 ) , opts ) ;
2017-02-03 20:50:45 +00:00
}
throw new Error ( "unsupported value in General format: " + v ) ;
}
2022-03-20 05:29:24 +00:00
function SSF _fix _hijri ( date /*:Date*/ , o /*:[number, number, number]*/ ) {
2020-06-29 08:07:23 +00:00
/* TODO: properly adjust y/m/d and */
o [ 0 ] -= 581 ;
var dow = date . getDay ( ) ;
if ( date < 60 ) dow = ( dow + 6 ) % 7 ;
return dow ;
}
//var THAI_DIGITS = "\u0E50\u0E51\u0E52\u0E53\u0E54\u0E55\u0E56\u0E57\u0E58\u0E59".split("");
2022-03-20 05:29:24 +00:00
function SSF _write _date ( type /*:number*/ , fmt /*:string*/ , val , ss0 /*:?number*/ ) /*:string*/ {
2017-02-03 20:50:45 +00:00
var o = "" , ss = 0 , tt = 0 , y = val . y , out , outl = 0 ;
switch ( type ) {
case 98 : /* 'b' buddhist year */
y = val . y + 543 ;
/* falls through */
case 121 : /* 'y' year */
switch ( fmt . length ) {
case 1 : case 2 : out = y % 100 ; outl = 2 ; break ;
default : out = y % 10000 ; outl = 4 ; break ;
} break ;
case 109 : /* 'm' month */
switch ( fmt . length ) {
case 1 : case 2 : out = val . m ; outl = fmt . length ; break ;
case 3 : return months [ val . m - 1 ] [ 1 ] ;
case 5 : return months [ val . m - 1 ] [ 0 ] ;
default : return months [ val . m - 1 ] [ 2 ] ;
} break ;
case 100 : /* 'd' day */
switch ( fmt . length ) {
case 1 : case 2 : out = val . d ; outl = fmt . length ; break ;
case 3 : return days [ val . q ] [ 0 ] ;
default : return days [ val . q ] [ 1 ] ;
} break ;
case 104 : /* 'h' 12-hour */
switch ( fmt . length ) {
case 1 : case 2 : out = 1 + ( val . H + 11 ) % 12 ; outl = fmt . length ; break ;
default : throw 'bad hour format: ' + fmt ;
} break ;
case 72 : /* 'H' 24-hour */
switch ( fmt . length ) {
case 1 : case 2 : out = val . H ; outl = fmt . length ; break ;
default : throw 'bad hour format: ' + fmt ;
} break ;
case 77 : /* 'M' minutes */
switch ( fmt . length ) {
case 1 : case 2 : out = val . M ; outl = fmt . length ; break ;
default : throw 'bad minute format: ' + fmt ;
} break ;
case 115 : /* 's' seconds */
2017-07-28 23:27:16 +00:00
if ( fmt != 's' && fmt != 'ss' && fmt != '.0' && fmt != '.00' && fmt != '.000' ) throw 'bad second format: ' + fmt ;
if ( val . u === 0 && ( fmt == "s" || fmt == "ss" ) ) return pad0 ( val . S , fmt . length ) ;
/*::if(!ss0) ss0 = 0; */
if ( ss0 >= 2 ) tt = ss0 === 3 ? 1000 : 100 ;
else tt = ss0 === 1 ? 10 : 1 ;
ss = Math . round ( ( tt ) * ( val . S + val . u ) ) ;
if ( ss >= 60 * tt ) ss = 0 ;
if ( fmt === 's' ) return ss === 0 ? "0" : "" + ss / tt ;
o = pad0 ( ss , 2 + ss0 ) ;
if ( fmt === 'ss' ) return o . substr ( 0 , 2 ) ;
return "." + o . substr ( 2 , fmt . length - 1 ) ;
2017-02-03 20:50:45 +00:00
case 90 : /* 'Z' absolute time */
switch ( fmt ) {
case '[h]' : case '[hh]' : out = val . D * 24 + val . H ; break ;
case '[m]' : case '[mm]' : out = ( val . D * 24 + val . H ) * 60 + val . M ; break ;
case '[s]' : case '[ss]' : out = ( ( val . D * 24 + val . H ) * 60 + val . M ) * 60 + Math . round ( val . S + val . u ) ; break ;
default : throw 'bad abstime format: ' + fmt ;
} outl = fmt . length === 3 ? 1 : 2 ; break ;
case 101 : /* 'e' era */
2020-06-29 08:07:23 +00:00
out = y ; outl = 1 ; break ;
2017-02-03 20:50:45 +00:00
}
2020-06-29 08:07:23 +00:00
var outstr = outl > 0 ? pad0 ( out , outl ) : "" ;
return outstr ;
2017-02-03 20:50:45 +00:00
}
2022-03-20 05:29:24 +00:00
/*jshint -W086 */
2017-02-03 20:50:45 +00:00
/*jshint +W086 */
2017-03-12 18:02:43 +00:00
function commaify ( s /*:string*/ ) /*:string*/ {
2017-07-28 23:27:16 +00:00
var w = 3 ;
if ( s . length <= w ) return s ;
var j = ( s . length % w ) , o = s . substr ( 0 , j ) ;
for ( ; j != s . length ; j += w ) o += ( o . length > 0 ? "," : "" ) + s . substr ( j , w ) ;
2017-02-03 20:50:45 +00:00
return o ;
}
var pct1 = /%/g ;
2017-03-12 18:02:43 +00:00
function write _num _pct ( type /*:string*/ , fmt /*:string*/ , val /*:number*/ ) /*:string*/ {
2017-02-03 20:50:45 +00:00
var sfmt = fmt . replace ( pct1 , "" ) , mul = fmt . length - sfmt . length ;
return write _num ( type , sfmt , val * Math . pow ( 10 , 2 * mul ) ) + fill ( "%" , mul ) ;
}
2022-03-20 05:29:24 +00:00
2017-03-12 18:02:43 +00:00
function write _num _cm ( type /*:string*/ , fmt /*:string*/ , val /*:number*/ ) /*:string*/ {
2017-02-03 20:50:45 +00:00
var idx = fmt . length - 1 ;
while ( fmt . charCodeAt ( idx - 1 ) === 44 ) -- idx ;
return write _num ( type , fmt . substr ( 0 , idx ) , val / Math . pow ( 10 , 3 * ( fmt . length - idx ) ) ) ;
}
2022-03-20 05:29:24 +00:00
2017-03-12 18:02:43 +00:00
function write _num _exp ( fmt /*:string*/ , val /*:number*/ ) /*:string*/ {
var o /*:string*/ ;
2017-02-03 20:50:45 +00:00
var idx = fmt . indexOf ( "E" ) - fmt . indexOf ( "." ) - 1 ;
if ( fmt . match ( /^#+0.0E\+0$/ ) ) {
2017-05-09 18:07:57 +00:00
if ( val == 0 ) return "0.0E+0" ;
else if ( val < 0 ) return "-" + write _num _exp ( fmt , - val ) ;
2017-02-03 20:50:45 +00:00
var period = fmt . indexOf ( "." ) ; if ( period === - 1 ) period = fmt . indexOf ( 'E' ) ;
2017-05-09 18:07:57 +00:00
var ee = Math . floor ( Math . log ( val ) * Math . LOG10E ) % period ;
2017-02-03 20:50:45 +00:00
if ( ee < 0 ) ee += period ;
o = ( val / Math . pow ( 10 , ee ) ) . toPrecision ( idx + 1 + ( period + ee ) % period ) ;
if ( o . indexOf ( "e" ) === - 1 ) {
2017-05-09 18:07:57 +00:00
var fakee = Math . floor ( Math . log ( val ) * Math . LOG10E ) ;
2017-03-12 18:02:43 +00:00
if ( o . indexOf ( "." ) === - 1 ) o = o . charAt ( 0 ) + "." + o . substr ( 1 ) + "E+" + ( fakee - o . length + ee ) ;
2017-02-03 20:50:45 +00:00
else o += "E+" + ( fakee - ee ) ;
while ( o . substr ( 0 , 2 ) === "0." ) {
2017-03-12 18:02:43 +00:00
o = o . charAt ( 0 ) + o . substr ( 2 , period ) + "." + o . substr ( 2 + period ) ;
2017-02-03 20:50:45 +00:00
o = o . replace ( /^0+([1-9])/ , "$1" ) . replace ( /^0+\./ , "0." ) ;
}
o = o . replace ( /\+-/ , "-" ) ;
}
o = o . replace ( /^([+-]?)(\d*)\.(\d*)[Ee]/ , function ( $$ , $1 , $2 , $3 ) { return $1 + $2 + $3 . substr ( 0 , ( period + ee ) % period ) + "." + $3 . substr ( ee ) + "E" ; } ) ;
} else o = val . toExponential ( idx ) ;
2017-03-12 18:02:43 +00:00
if ( fmt . match ( /E\+00$/ ) && o . match ( /e[+-]\d$/ ) ) o = o . substr ( 0 , o . length - 1 ) + "0" + o . charAt ( o . length - 1 ) ;
2017-02-03 20:50:45 +00:00
if ( fmt . match ( /E\-/ ) && o . match ( /e\+/ ) ) o = o . replace ( /e\+/ , "e" ) ;
return o . replace ( "e" , "E" ) ;
}
var frac1 = /# (\?+)( ?)\/( ?)(\d+)/ ;
2017-03-12 18:02:43 +00:00
function write _num _f1 ( r /*:Array<string>*/ , aval /*:number*/ , sign /*:string*/ ) /*:string*/ {
var den = parseInt ( r [ 4 ] , 10 ) , rr = Math . round ( aval * den ) , base = Math . floor ( rr / den ) ;
2017-02-03 20:50:45 +00:00
var myn = ( rr - base * den ) , myd = den ;
return sign + ( base === 0 ? "" : "" + base ) + " " + ( myn === 0 ? fill ( " " , r [ 1 ] . length + 1 + r [ 4 ] . length ) : pad _ ( myn , r [ 1 ] . length ) + r [ 2 ] + "/" + r [ 3 ] + pad0 ( myd , r [ 4 ] . length ) ) ;
}
2017-03-12 18:02:43 +00:00
function write _num _f2 ( r /*:Array<string>*/ , aval /*:number*/ , sign /*:string*/ ) /*:string*/ {
2017-02-03 20:50:45 +00:00
return sign + ( aval === 0 ? "" : "" + aval ) + fill ( " " , r [ 1 ] . length + 2 + r [ 4 ] . length ) ;
}
2017-06-09 02:15:36 +00:00
var dec1 = /^#*0*\.([0#]+)/ ;
2017-02-03 20:50:45 +00:00
var closeparen = /\).*[0#]/ ;
var phone = /\(###\) ###\\?-####/ ;
2017-03-12 18:02:43 +00:00
function hashq ( str /*:string*/ ) /*:string*/ {
2017-02-03 20:50:45 +00:00
var o = "" , cc ;
for ( var i = 0 ; i != str . length ; ++ i ) switch ( ( cc = str . charCodeAt ( i ) ) ) {
case 35 : break ;
case 63 : o += " " ; break ;
case 48 : o += "0" ; break ;
default : o += String . fromCharCode ( cc ) ;
}
return o ;
}
2017-03-12 18:02:43 +00:00
function rnd ( val /*:number*/ , d /*:number*/ ) /*:string*/ { var dd = Math . pow ( 10 , d ) ; return "" + ( Math . round ( val * dd ) / dd ) ; }
2017-03-18 00:45:06 +00:00
function dec ( val /*:number*/ , d /*:number*/ ) /*:number*/ {
2020-06-29 08:07:23 +00:00
var _frac = val - Math . floor ( val ) , dd = Math . pow ( 10 , d ) ;
if ( d < ( '' + Math . round ( _frac * dd ) ) . length ) return 0 ;
return Math . round ( _frac * dd ) ;
2017-03-18 00:45:06 +00:00
}
function carry ( val /*:number*/ , d /*:number*/ ) /*:number*/ {
if ( d < ( '' + Math . round ( ( val - Math . floor ( val ) ) * Math . pow ( 10 , d ) ) ) . length ) {
return 1 ;
}
return 0 ;
}
2020-06-29 08:07:23 +00:00
function flr ( val /*:number*/ ) /*:string*/ {
if ( val < 2147483647 && val > - 2147483648 ) return "" + ( val >= 0 ? ( val | 0 ) : ( val - 1 | 0 ) ) ;
return "" + Math . floor ( val ) ;
}
2017-03-12 18:02:43 +00:00
function write _num _flt ( type /*:string*/ , fmt /*:string*/ , val /*:number*/ ) /*:string*/ {
2017-02-03 20:50:45 +00:00
if ( type . charCodeAt ( 0 ) === 40 && ! fmt . match ( closeparen ) ) {
var ffmt = fmt . replace ( /\( */ , "" ) . replace ( / \)/ , "" ) . replace ( /\)/ , "" ) ;
if ( val >= 0 ) return write _num _flt ( 'n' , ffmt , val ) ;
return '(' + write _num _flt ( 'n' , ffmt , - val ) + ')' ;
}
if ( fmt . charCodeAt ( fmt . length - 1 ) === 44 ) return write _num _cm ( type , fmt , val ) ;
if ( fmt . indexOf ( '%' ) !== - 1 ) return write _num _pct ( type , fmt , val ) ;
if ( fmt . indexOf ( 'E' ) !== - 1 ) return write _num _exp ( fmt , val ) ;
2017-03-25 01:36:40 +00:00
if ( fmt . charCodeAt ( 0 ) === 36 ) return "$" + write _num _flt ( type , fmt . substr ( fmt . charAt ( 1 ) == ' ' ? 2 : 1 ) , val ) ;
2017-03-12 18:02:43 +00:00
var o ;
var r /*:?Array<string>*/ , ri , ff , aval = Math . abs ( val ) , sign = val < 0 ? "-" : "" ;
2017-02-03 20:50:45 +00:00
if ( fmt . match ( /^00+$/ ) ) return sign + pad0r ( aval , fmt . length ) ;
if ( fmt . match ( /^[#?]+$/ ) ) {
o = pad0r ( val , 0 ) ; if ( o === "0" ) o = "" ;
return o . length > fmt . length ? o : hashq ( fmt . substr ( 0 , fmt . length - o . length ) ) + o ;
}
2017-03-12 18:02:43 +00:00
if ( ( r = fmt . match ( frac1 ) ) ) return write _num _f1 ( r , aval , sign ) ;
if ( fmt . match ( /^#+0+$/ ) ) return sign + pad0r ( aval , fmt . length - fmt . indexOf ( "0" ) ) ;
if ( ( r = fmt . match ( dec1 ) ) ) {
2017-06-09 02:15:36 +00:00
o = rnd ( val , r [ 1 ] . length ) . replace ( /^([^\.]+)$/ , "$1." + hashq ( r [ 1 ] ) ) . replace ( /\.$/ , "." + hashq ( r [ 1 ] ) ) . replace ( /\.(\d*)$/ , function ( $$ , $1 ) { return "." + $1 + fill ( "0" , hashq ( /*::(*/ r /*::||[""])*/ [ 1 ] ) . length - $1 . length ) ; } ) ;
2017-02-03 20:50:45 +00:00
return fmt . indexOf ( "0." ) !== - 1 ? o : o . replace ( /^0\./ , "." ) ;
}
fmt = fmt . replace ( /^#+([0.])/ , "$1" ) ;
2017-03-12 18:02:43 +00:00
if ( ( r = fmt . match ( /^(0*)\.(#*)$/ ) ) ) {
2017-02-03 20:50:45 +00:00
return sign + rnd ( aval , r [ 2 ] . length ) . replace ( /\.(\d*[1-9])0*$/ , ".$1" ) . replace ( /^(-?\d*)$/ , "$1." ) . replace ( /^0\./ , r [ 1 ] . length ? "0." : "." ) ;
}
2017-05-09 18:07:57 +00:00
if ( ( r = fmt . match ( /^#{1,3},##0(\.?)$/ ) ) ) return sign + commaify ( pad0r ( aval , 0 ) ) ;
2017-03-12 18:02:43 +00:00
if ( ( r = fmt . match ( /^#,##0\.([#0]*0)$/ ) ) ) {
2017-03-18 00:45:06 +00:00
return val < 0 ? "-" + write _num _flt ( type , fmt , - val ) : commaify ( "" + ( Math . floor ( val ) + carry ( val , r [ 1 ] . length ) ) ) + "." + pad0 ( dec ( val , r [ 1 ] . length ) , r [ 1 ] . length ) ;
2017-02-03 20:50:45 +00:00
}
2017-03-12 18:02:43 +00:00
if ( ( r = fmt . match ( /^#,#*,#0/ ) ) ) return write _num _flt ( type , fmt . replace ( /^#,#*,/ , "" ) , val ) ;
if ( ( r = fmt . match ( /^([0#]+)(\\?-([0#]+))+$/ ) ) ) {
2017-02-03 20:50:45 +00:00
o = _strrev ( write _num _flt ( type , fmt . replace ( /[\\-]/g , "" ) , val ) ) ;
ri = 0 ;
2017-03-25 01:36:40 +00:00
return _strrev ( _strrev ( fmt . replace ( /\\/g , "" ) ) . replace ( /[0#]/g , function ( x ) { return ri < o . length ? o . charAt ( ri ++ ) : x === '0' ? '0' : "" ; } ) ) ;
2017-02-03 20:50:45 +00:00
}
2017-03-12 18:02:43 +00:00
if ( fmt . match ( phone ) ) {
2017-02-03 20:50:45 +00:00
o = write _num _flt ( type , "##########" , val ) ;
return "(" + o . substr ( 0 , 3 ) + ") " + o . substr ( 3 , 3 ) + "-" + o . substr ( 6 ) ;
}
var oa = "" ;
2017-03-12 18:02:43 +00:00
if ( ( r = fmt . match ( /^([#0?]+)( ?)\/( ?)([#0?]+)/ ) ) ) {
ri = Math . min ( /*::String(*/ r [ 4 ] /*::)*/ . length , 7 ) ;
2022-03-20 05:29:24 +00:00
ff = SSF _frac ( aval , Math . pow ( 10 , ri ) - 1 , false ) ;
2017-02-03 20:50:45 +00:00
o = "" + sign ;
2017-03-12 18:02:43 +00:00
oa = write _num ( "n" , /*::String(*/ r [ 1 ] /*::)*/ , ff [ 1 ] ) ;
2017-03-25 01:36:40 +00:00
if ( oa . charAt ( oa . length - 1 ) == " " ) oa = oa . substr ( 0 , oa . length - 1 ) + "0" ;
2017-03-12 18:02:43 +00:00
o += oa + /*::String(*/ r [ 2 ] /*::)*/ + "/" + /*::String(*/ r [ 3 ] /*::)*/ ;
2017-02-03 20:50:45 +00:00
oa = rpad _ ( ff [ 2 ] , ri ) ;
if ( oa . length < r [ 4 ] . length ) oa = hashq ( r [ 4 ] . substr ( r [ 4 ] . length - oa . length ) ) + oa ;
o += oa ;
return o ;
}
2017-03-12 18:02:43 +00:00
if ( ( r = fmt . match ( /^# ([#0?]+)( ?)\/( ?)([#0?]+)/ ) ) ) {
2017-02-03 20:50:45 +00:00
ri = Math . min ( Math . max ( r [ 1 ] . length , r [ 4 ] . length ) , 7 ) ;
2022-03-20 05:29:24 +00:00
ff = SSF _frac ( aval , Math . pow ( 10 , ri ) - 1 , true ) ;
2017-02-03 20:50:45 +00:00
return sign + ( ff [ 0 ] || ( ff [ 1 ] ? "" : "0" ) ) + " " + ( ff [ 1 ] ? pad _ ( ff [ 1 ] , ri ) + r [ 2 ] + "/" + r [ 3 ] + rpad _ ( ff [ 2 ] , ri ) : fill ( " " , 2 * ri + 1 + r [ 2 ] . length + r [ 3 ] . length ) ) ;
}
2017-03-12 18:02:43 +00:00
if ( ( r = fmt . match ( /^[#0?]+$/ ) ) ) {
2017-02-03 20:50:45 +00:00
o = pad0r ( val , 0 ) ;
if ( fmt . length <= o . length ) return o ;
return hashq ( fmt . substr ( 0 , fmt . length - o . length ) ) + o ;
}
2017-03-12 18:02:43 +00:00
if ( ( r = fmt . match ( /^([#0?]+)\.([#0]+)$/ ) ) ) {
2017-02-03 20:50:45 +00:00
o = "" + val . toFixed ( Math . min ( r [ 2 ] . length , 10 ) ) . replace ( /([^0])0+$/ , "$1" ) ;
ri = o . indexOf ( "." ) ;
var lres = fmt . indexOf ( "." ) - ri , rres = fmt . length - o . length - lres ;
return hashq ( fmt . substr ( 0 , lres ) + o + fmt . substr ( fmt . length - rres ) ) ;
}
2017-03-12 18:02:43 +00:00
if ( ( r = fmt . match ( /^00,000\.([#0]*0)$/ ) ) ) {
2017-02-03 20:50:45 +00:00
ri = dec ( val , r [ 1 ] . length ) ;
return val < 0 ? "-" + write _num _flt ( type , fmt , - val ) : commaify ( flr ( val ) ) . replace ( /^\d,\d{3}$/ , "0$&" ) . replace ( /^\d*$/ , function ( $$ ) { return "00," + ( $$ . length < 3 ? pad0 ( 0 , 3 - $$ . length ) : "" ) + $$ ; } ) + "." + pad0 ( ri , r [ 1 ] . length ) ;
}
switch ( fmt ) {
2017-05-09 18:07:57 +00:00
case "###,##0.00" : return write _num _flt ( type , "#,##0.00" , val ) ;
case "###,###" :
case "##,###" :
2017-02-03 20:50:45 +00:00
case "#,###" : var x = commaify ( pad0r ( aval , 0 ) ) ; return x !== "0" ? sign + x : "" ;
2017-05-09 18:07:57 +00:00
case "###,###.00" : return write _num _flt ( type , "###,##0.00" , val ) . replace ( /^0\./ , "." ) ;
case "#,###.00" : return write _num _flt ( type , "#,##0.00" , val ) . replace ( /^0\./ , "." ) ;
2017-02-03 20:50:45 +00:00
default :
}
throw new Error ( "unsupported format |" + fmt + "|" ) ;
}
2017-03-12 18:02:43 +00:00
function write _num _cm2 ( type /*:string*/ , fmt /*:string*/ , val /*:number*/ ) /*:string*/ {
2017-02-03 20:50:45 +00:00
var idx = fmt . length - 1 ;
while ( fmt . charCodeAt ( idx - 1 ) === 44 ) -- idx ;
return write _num ( type , fmt . substr ( 0 , idx ) , val / Math . pow ( 10 , 3 * ( fmt . length - idx ) ) ) ;
}
2017-03-12 18:02:43 +00:00
function write _num _pct2 ( type /*:string*/ , fmt /*:string*/ , val /*:number*/ ) /*:string*/ {
2017-02-03 20:50:45 +00:00
var sfmt = fmt . replace ( pct1 , "" ) , mul = fmt . length - sfmt . length ;
return write _num ( type , sfmt , val * Math . pow ( 10 , 2 * mul ) ) + fill ( "%" , mul ) ;
}
2017-03-12 18:02:43 +00:00
function write _num _exp2 ( fmt /*:string*/ , val /*:number*/ ) /*:string*/ {
var o /*:string*/ ;
2017-02-03 20:50:45 +00:00
var idx = fmt . indexOf ( "E" ) - fmt . indexOf ( "." ) - 1 ;
if ( fmt . match ( /^#+0.0E\+0$/ ) ) {
2017-05-09 18:07:57 +00:00
if ( val == 0 ) return "0.0E+0" ;
else if ( val < 0 ) return "-" + write _num _exp2 ( fmt , - val ) ;
2017-02-03 20:50:45 +00:00
var period = fmt . indexOf ( "." ) ; if ( period === - 1 ) period = fmt . indexOf ( 'E' ) ;
2017-05-09 18:07:57 +00:00
var ee = Math . floor ( Math . log ( val ) * Math . LOG10E ) % period ;
2017-02-03 20:50:45 +00:00
if ( ee < 0 ) ee += period ;
o = ( val / Math . pow ( 10 , ee ) ) . toPrecision ( idx + 1 + ( period + ee ) % period ) ;
if ( ! o . match ( /[Ee]/ ) ) {
2017-05-09 18:07:57 +00:00
var fakee = Math . floor ( Math . log ( val ) * Math . LOG10E ) ;
2017-03-12 18:02:43 +00:00
if ( o . indexOf ( "." ) === - 1 ) o = o . charAt ( 0 ) + "." + o . substr ( 1 ) + "E+" + ( fakee - o . length + ee ) ;
2017-02-03 20:50:45 +00:00
else o += "E+" + ( fakee - ee ) ;
o = o . replace ( /\+-/ , "-" ) ;
}
o = o . replace ( /^([+-]?)(\d*)\.(\d*)[Ee]/ , function ( $$ , $1 , $2 , $3 ) { return $1 + $2 + $3 . substr ( 0 , ( period + ee ) % period ) + "." + $3 . substr ( ee ) + "E" ; } ) ;
} else o = val . toExponential ( idx ) ;
2017-03-12 18:02:43 +00:00
if ( fmt . match ( /E\+00$/ ) && o . match ( /e[+-]\d$/ ) ) o = o . substr ( 0 , o . length - 1 ) + "0" + o . charAt ( o . length - 1 ) ;
2017-02-03 20:50:45 +00:00
if ( fmt . match ( /E\-/ ) && o . match ( /e\+/ ) ) o = o . replace ( /e\+/ , "e" ) ;
return o . replace ( "e" , "E" ) ;
}
2017-03-12 18:02:43 +00:00
function write _num _int ( type /*:string*/ , fmt /*:string*/ , val /*:number*/ ) /*:string*/ {
2017-02-03 20:50:45 +00:00
if ( type . charCodeAt ( 0 ) === 40 && ! fmt . match ( closeparen ) ) {
var ffmt = fmt . replace ( /\( */ , "" ) . replace ( / \)/ , "" ) . replace ( /\)/ , "" ) ;
if ( val >= 0 ) return write _num _int ( 'n' , ffmt , val ) ;
return '(' + write _num _int ( 'n' , ffmt , - val ) + ')' ;
}
if ( fmt . charCodeAt ( fmt . length - 1 ) === 44 ) return write _num _cm2 ( type , fmt , val ) ;
if ( fmt . indexOf ( '%' ) !== - 1 ) return write _num _pct2 ( type , fmt , val ) ;
if ( fmt . indexOf ( 'E' ) !== - 1 ) return write _num _exp2 ( fmt , val ) ;
2017-03-25 01:36:40 +00:00
if ( fmt . charCodeAt ( 0 ) === 36 ) return "$" + write _num _int ( type , fmt . substr ( fmt . charAt ( 1 ) == ' ' ? 2 : 1 ) , val ) ;
2017-02-03 20:50:45 +00:00
var o ;
2017-05-09 18:07:57 +00:00
var r /*:?Array<string>*/ , ri , ff , aval = Math . abs ( val ) , sign = val < 0 ? "-" : "" ;
2017-02-03 20:50:45 +00:00
if ( fmt . match ( /^00+$/ ) ) return sign + pad0 ( aval , fmt . length ) ;
if ( fmt . match ( /^[#?]+$/ ) ) {
o = ( "" + val ) ; if ( val === 0 ) o = "" ;
return o . length > fmt . length ? o : hashq ( fmt . substr ( 0 , fmt . length - o . length ) ) + o ;
}
2017-03-12 18:02:43 +00:00
if ( ( r = fmt . match ( frac1 ) ) ) return write _num _f2 ( r , aval , sign ) ;
if ( fmt . match ( /^#+0+$/ ) ) return sign + pad0 ( aval , fmt . length - fmt . indexOf ( "0" ) ) ;
if ( ( r = fmt . match ( dec1 ) ) ) {
2017-04-30 16:27:03 +00:00
/*:: if(!Array.isArray(r)) throw new Error("unreachable"); */
2017-06-09 02:15:36 +00:00
o = ( "" + val ) . replace ( /^([^\.]+)$/ , "$1." + hashq ( r [ 1 ] ) ) . replace ( /\.$/ , "." + hashq ( r [ 1 ] ) ) ;
2017-03-21 20:44:35 +00:00
o = o . replace ( /\.(\d*)$/ , function ( $$ , $1 ) {
2017-04-30 16:27:03 +00:00
/*:: if(!Array.isArray(r)) throw new Error("unreachable"); */
2017-06-09 02:15:36 +00:00
return "." + $1 + fill ( "0" , hashq ( r [ 1 ] ) . length - $1 . length ) ; } ) ;
2017-02-03 20:50:45 +00:00
return fmt . indexOf ( "0." ) !== - 1 ? o : o . replace ( /^0\./ , "." ) ;
}
fmt = fmt . replace ( /^#+([0.])/ , "$1" ) ;
2017-03-12 18:02:43 +00:00
if ( ( r = fmt . match ( /^(0*)\.(#*)$/ ) ) ) {
2017-02-03 20:50:45 +00:00
return sign + ( "" + aval ) . replace ( /\.(\d*[1-9])0*$/ , ".$1" ) . replace ( /^(-?\d*)$/ , "$1." ) . replace ( /^0\./ , r [ 1 ] . length ? "0." : "." ) ;
}
2017-05-09 18:07:57 +00:00
if ( ( r = fmt . match ( /^#{1,3},##0(\.?)$/ ) ) ) return sign + commaify ( ( "" + aval ) ) ;
2017-03-12 18:02:43 +00:00
if ( ( r = fmt . match ( /^#,##0\.([#0]*0)$/ ) ) ) {
2017-02-03 20:50:45 +00:00
return val < 0 ? "-" + write _num _int ( type , fmt , - val ) : commaify ( ( "" + val ) ) + "." + fill ( '0' , r [ 1 ] . length ) ;
}
2017-03-12 18:02:43 +00:00
if ( ( r = fmt . match ( /^#,#*,#0/ ) ) ) return write _num _int ( type , fmt . replace ( /^#,#*,/ , "" ) , val ) ;
if ( ( r = fmt . match ( /^([0#]+)(\\?-([0#]+))+$/ ) ) ) {
2017-02-03 20:50:45 +00:00
o = _strrev ( write _num _int ( type , fmt . replace ( /[\\-]/g , "" ) , val ) ) ;
ri = 0 ;
2017-03-25 01:36:40 +00:00
return _strrev ( _strrev ( fmt . replace ( /\\/g , "" ) ) . replace ( /[0#]/g , function ( x ) { return ri < o . length ? o . charAt ( ri ++ ) : x === '0' ? '0' : "" ; } ) ) ;
2017-02-03 20:50:45 +00:00
}
2017-03-12 18:02:43 +00:00
if ( fmt . match ( phone ) ) {
2017-02-03 20:50:45 +00:00
o = write _num _int ( type , "##########" , val ) ;
return "(" + o . substr ( 0 , 3 ) + ") " + o . substr ( 3 , 3 ) + "-" + o . substr ( 6 ) ;
}
var oa = "" ;
2017-03-12 18:02:43 +00:00
if ( ( r = fmt . match ( /^([#0?]+)( ?)\/( ?)([#0?]+)/ ) ) ) {
2017-05-09 18:07:57 +00:00
ri = Math . min ( /*::String(*/ r [ 4 ] /*::)*/ . length , 7 ) ;
2022-03-20 05:29:24 +00:00
ff = SSF _frac ( aval , Math . pow ( 10 , ri ) - 1 , false ) ;
2017-02-03 20:50:45 +00:00
o = "" + sign ;
2017-05-09 18:07:57 +00:00
oa = write _num ( "n" , /*::String(*/ r [ 1 ] /*::)*/ , ff [ 1 ] ) ;
2017-03-25 01:36:40 +00:00
if ( oa . charAt ( oa . length - 1 ) == " " ) oa = oa . substr ( 0 , oa . length - 1 ) + "0" ;
2017-05-09 18:07:57 +00:00
o += oa + /*::String(*/ r [ 2 ] /*::)*/ + "/" + /*::String(*/ r [ 3 ] /*::)*/ ;
2017-02-03 20:50:45 +00:00
oa = rpad _ ( ff [ 2 ] , ri ) ;
if ( oa . length < r [ 4 ] . length ) oa = hashq ( r [ 4 ] . substr ( r [ 4 ] . length - oa . length ) ) + oa ;
o += oa ;
return o ;
}
2017-03-12 18:02:43 +00:00
if ( ( r = fmt . match ( /^# ([#0?]+)( ?)\/( ?)([#0?]+)/ ) ) ) {
2017-02-03 20:50:45 +00:00
ri = Math . min ( Math . max ( r [ 1 ] . length , r [ 4 ] . length ) , 7 ) ;
2022-03-20 05:29:24 +00:00
ff = SSF _frac ( aval , Math . pow ( 10 , ri ) - 1 , true ) ;
2017-02-03 20:50:45 +00:00
return sign + ( ff [ 0 ] || ( ff [ 1 ] ? "" : "0" ) ) + " " + ( ff [ 1 ] ? pad _ ( ff [ 1 ] , ri ) + r [ 2 ] + "/" + r [ 3 ] + rpad _ ( ff [ 2 ] , ri ) : fill ( " " , 2 * ri + 1 + r [ 2 ] . length + r [ 3 ] . length ) ) ;
}
2017-03-12 18:02:43 +00:00
if ( ( r = fmt . match ( /^[#0?]+$/ ) ) ) {
2017-02-03 20:50:45 +00:00
o = "" + val ;
if ( fmt . length <= o . length ) return o ;
return hashq ( fmt . substr ( 0 , fmt . length - o . length ) ) + o ;
}
2017-03-12 18:02:43 +00:00
if ( ( r = fmt . match ( /^([#0]+)\.([#0]+)$/ ) ) ) {
2017-02-03 20:50:45 +00:00
o = "" + val . toFixed ( Math . min ( r [ 2 ] . length , 10 ) ) . replace ( /([^0])0+$/ , "$1" ) ;
ri = o . indexOf ( "." ) ;
var lres = fmt . indexOf ( "." ) - ri , rres = fmt . length - o . length - lres ;
return hashq ( fmt . substr ( 0 , lres ) + o + fmt . substr ( fmt . length - rres ) ) ;
}
2017-03-12 18:02:43 +00:00
if ( ( r = fmt . match ( /^00,000\.([#0]*0)$/ ) ) ) {
2017-02-03 20:50:45 +00:00
return val < 0 ? "-" + write _num _int ( type , fmt , - val ) : commaify ( "" + val ) . replace ( /^\d,\d{3}$/ , "0$&" ) . replace ( /^\d*$/ , function ( $$ ) { return "00," + ( $$ . length < 3 ? pad0 ( 0 , 3 - $$ . length ) : "" ) + $$ ; } ) + "." + pad0 ( 0 , r [ 1 ] . length ) ;
}
switch ( fmt ) {
2017-05-09 18:07:57 +00:00
case "###,###" :
case "##,###" :
2017-02-03 20:50:45 +00:00
case "#,###" : var x = commaify ( "" + aval ) ; return x !== "0" ? sign + x : "" ;
default :
2017-05-11 07:29:59 +00:00
if ( fmt . match ( /\.[0#?]*$/ ) ) return write _num _int ( type , fmt . slice ( 0 , fmt . lastIndexOf ( "." ) ) , val ) + hashq ( fmt . slice ( fmt . lastIndexOf ( "." ) ) ) ;
2017-02-03 20:50:45 +00:00
}
throw new Error ( "unsupported format |" + fmt + "|" ) ;
}
2022-03-20 05:29:24 +00:00
function write _num ( type /*:string*/ , fmt /*:string*/ , val /*:number*/ ) /*:string*/ {
2017-02-03 20:50:45 +00:00
return ( val | 0 ) === val ? write _num _int ( type , fmt , val ) : write _num _flt ( type , fmt , val ) ;
2022-03-20 05:29:24 +00:00
}
function SSF _split _fmt ( fmt /*:string*/ ) /*:Array<string>*/ {
2017-03-12 18:02:43 +00:00
var out /*:Array<string>*/ = [ ] ;
2017-05-11 07:29:59 +00:00
var in _str = false /*, cc*/ ;
for ( var i = 0 , j = 0 ; i < fmt . length ; ++ i ) switch ( ( /*cc=*/ fmt . charCodeAt ( i ) ) ) {
2017-02-03 20:50:45 +00:00
case 34 : /* '"' */
in _str = ! in _str ; break ;
case 95 : case 42 : case 92 : /* '_' '*' '\\' */
++ i ; break ;
case 59 : /* ';' */
out [ out . length ] = fmt . substr ( j , i - j ) ;
j = i + 1 ;
}
out [ out . length ] = fmt . substr ( j ) ;
if ( in _str === true ) throw new Error ( "Format |" + fmt + "| unterminated string " ) ;
return out ;
}
2022-03-20 05:29:24 +00:00
var SSF _abstime = /\[[HhMmSs\u0E0A\u0E19\u0E17]*\]/ ;
2017-03-21 20:44:35 +00:00
function fmt _is _date ( fmt /*:string*/ ) /*:boolean*/ {
2017-05-11 07:29:59 +00:00
var i = 0 , /*cc = 0,*/ c = "" , o = "" ;
2017-03-21 20:44:35 +00:00
while ( i < fmt . length ) {
switch ( ( c = fmt . charAt ( i ) ) ) {
2022-03-20 05:29:24 +00:00
case 'G' : if ( SSF _isgeneral ( fmt , i ) ) i += 6 ; i ++ ; break ;
2020-03-15 07:42:05 +00:00
case '"' : for ( ; ( /*cc=*/ fmt . charCodeAt ( ++ i ) ) !== 34 && i < fmt . length ; ) { /*empty*/ } ++ i ; break ;
2017-03-21 20:44:35 +00:00
case '\\' : i += 2 ; break ;
case '_' : i += 2 ; break ;
case '@' : ++ i ; break ;
case 'B' : case 'b' :
if ( fmt . charAt ( i + 1 ) === "1" || fmt . charAt ( i + 1 ) === "2" ) return true ;
/* falls through */
case 'M' : case 'D' : case 'Y' : case 'H' : case 'S' : case 'E' :
/* falls through */
case 'm' : case 'd' : case 'y' : case 'h' : case 's' : case 'e' : case 'g' : return true ;
2020-06-29 08:07:23 +00:00
case 'A' : case 'a' : case '上' :
2017-06-09 02:15:36 +00:00
if ( fmt . substr ( i , 3 ) . toUpperCase ( ) === "A/P" ) return true ;
if ( fmt . substr ( i , 5 ) . toUpperCase ( ) === "AM/PM" ) return true ;
2020-06-29 08:07:23 +00:00
if ( fmt . substr ( i , 5 ) . toUpperCase ( ) === "上午/下午" ) return true ;
2017-03-21 20:44:35 +00:00
++ i ; break ;
case '[' :
o = c ;
while ( fmt . charAt ( i ++ ) !== ']' && i < fmt . length ) o += fmt . charAt ( i ) ;
2022-03-20 05:29:24 +00:00
if ( o . match ( SSF _abstime ) ) return true ;
2017-03-21 20:44:35 +00:00
break ;
case '.' :
/* falls through */
case '0' : case '#' :
2017-05-11 07:29:59 +00:00
while ( i < fmt . length && ( "0#?.,E+-%" . indexOf ( c = fmt . charAt ( ++ i ) ) > - 1 || ( c == '\\' && fmt . charAt ( i + 1 ) == "-" && "0#" . indexOf ( fmt . charAt ( i + 2 ) ) > - 1 ) ) ) { /* empty */ }
2017-03-21 20:44:35 +00:00
break ;
2017-05-11 07:29:59 +00:00
case '?' : while ( fmt . charAt ( ++ i ) === c ) { /* empty */ } break ;
2017-03-21 20:44:35 +00:00
case '*' : ++ i ; if ( fmt . charAt ( i ) == ' ' || fmt . charAt ( i ) == '*' ) ++ i ; break ;
case '(' : case ')' : ++ i ; break ;
case '1' : case '2' : case '3' : case '4' : case '5' : case '6' : case '7' : case '8' : case '9' :
2017-05-11 07:29:59 +00:00
while ( i < fmt . length && "0123456789" . indexOf ( fmt . charAt ( ++ i ) ) > - 1 ) { /* empty */ } break ;
2017-03-21 20:44:35 +00:00
case ' ' : ++ i ; break ;
default : ++ i ; break ;
}
}
return false ;
}
2022-03-20 05:29:24 +00:00
2017-03-12 18:02:43 +00:00
function eval _fmt ( fmt /*:string*/ , v /*:any*/ , opts /*:any*/ , flen /*:number*/ ) {
2017-07-28 23:27:16 +00:00
var out = [ ] , o = "" , i = 0 , c = "" , lst = 't' , dt , j , cc ;
2017-02-03 20:50:45 +00:00
var hr = 'H' ;
/* Tokenize */
while ( i < fmt . length ) {
2017-03-12 18:02:43 +00:00
switch ( ( c = fmt . charAt ( i ) ) ) {
2017-02-03 20:50:45 +00:00
case 'G' : /* General */
2022-03-20 05:29:24 +00:00
if ( ! SSF _isgeneral ( fmt , i ) ) throw new Error ( 'unrecognized character ' + c + ' in ' + fmt ) ;
2017-02-03 20:50:45 +00:00
out [ out . length ] = { t : 'G' , v : 'General' } ; i += 7 ; break ;
case '"' : /* Literal text */
for ( o = "" ; ( cc = fmt . charCodeAt ( ++ i ) ) !== 34 && i < fmt . length ; ) o += String . fromCharCode ( cc ) ;
out [ out . length ] = { t : 't' , v : o } ; ++ i ; break ;
2017-03-21 20:44:35 +00:00
case '\\' : var w = fmt . charAt ( ++ i ) , t = ( w === "(" || w === ")" ) ? w : 't' ;
2017-02-03 20:50:45 +00:00
out [ out . length ] = { t : t , v : w } ; ++ i ; break ;
case '_' : out [ out . length ] = { t : 't' , v : " " } ; i += 2 ; break ;
case '@' : /* Text Placeholder */
out [ out . length ] = { t : 'T' , v : v } ; ++ i ; break ;
case 'B' : case 'b' :
2017-03-21 20:44:35 +00:00
if ( fmt . charAt ( i + 1 ) === "1" || fmt . charAt ( i + 1 ) === "2" ) {
2022-03-20 05:29:24 +00:00
if ( dt == null ) { dt = SSF _parse _date _code ( v , opts , fmt . charAt ( i + 1 ) === "2" ) ; if ( dt == null ) return "" ; }
2017-02-03 20:50:45 +00:00
out [ out . length ] = { t : 'X' , v : fmt . substr ( i , 2 ) } ; lst = c ; i += 2 ; break ;
}
/* falls through */
case 'M' : case 'D' : case 'Y' : case 'H' : case 'S' : case 'E' :
c = c . toLowerCase ( ) ;
/* falls through */
case 'm' : case 'd' : case 'y' : case 'h' : case 's' : case 'e' : case 'g' :
if ( v < 0 ) return "" ;
2022-03-20 05:29:24 +00:00
if ( dt == null ) { dt = SSF _parse _date _code ( v , opts ) ; if ( dt == null ) return "" ; }
2017-07-28 23:27:16 +00:00
o = c ; while ( ++ i < fmt . length && fmt . charAt ( i ) . toLowerCase ( ) === c ) o += c ;
2017-05-09 18:07:57 +00:00
if ( c === 'm' && lst . toLowerCase ( ) === 'h' ) c = 'M' ;
2017-02-03 20:50:45 +00:00
if ( c === 'h' ) c = hr ;
out [ out . length ] = { t : c , v : o } ; lst = c ; break ;
2020-06-29 08:07:23 +00:00
case 'A' : case 'a' : case '上' :
2017-07-28 23:27:16 +00:00
var q = { t : c , v : c } ;
2022-03-20 05:29:24 +00:00
if ( dt == null ) dt = SSF _parse _date _code ( v , opts ) ;
2022-04-11 04:11:47 +00:00
if ( fmt . substr ( i , 3 ) . toUpperCase ( ) === "A/P" ) { if ( dt != null ) q . v = dt . H >= 12 ? fmt . charAt ( i + 2 ) : c ; q . t = 'T' ; hr = 'h' ; i += 3 ; }
2017-06-09 02:15:36 +00:00
else if ( fmt . substr ( i , 5 ) . toUpperCase ( ) === "AM/PM" ) { if ( dt != null ) q . v = dt . H >= 12 ? "PM" : "AM" ; q . t = 'T' ; i += 5 ; hr = 'h' ; }
2020-06-29 08:07:23 +00:00
else if ( fmt . substr ( i , 5 ) . toUpperCase ( ) === "上午/下午" ) { if ( dt != null ) q . v = dt . H >= 12 ? "下午" : "上午" ; q . t = 'T' ; i += 5 ; hr = 'h' ; }
2017-02-03 20:50:45 +00:00
else { q . t = "t" ; ++ i ; }
if ( dt == null && q . t === 'T' ) return "" ;
out [ out . length ] = q ; lst = c ; break ;
case '[' :
o = c ;
2017-03-21 20:44:35 +00:00
while ( fmt . charAt ( i ++ ) !== ']' && i < fmt . length ) o += fmt . charAt ( i ) ;
if ( o . slice ( - 1 ) !== ']' ) throw 'unterminated "[" block: |' + o + '|' ;
2022-03-20 05:29:24 +00:00
if ( o . match ( SSF _abstime ) ) {
if ( dt == null ) { dt = SSF _parse _date _code ( v , opts ) ; if ( dt == null ) return "" ; }
2017-02-03 20:50:45 +00:00
out [ out . length ] = { t : 'Z' , v : o . toLowerCase ( ) } ;
2017-05-09 18:07:57 +00:00
lst = o . charAt ( 1 ) ;
2017-04-30 16:27:03 +00:00
} else if ( o . indexOf ( "$" ) > - 1 ) {
o = ( o . match ( /\$([^-\[\]]*)/ ) || [ ] ) [ 1 ] || "$" ;
if ( ! fmt _is _date ( fmt ) ) out [ out . length ] = { t : 't' , v : o } ;
}
2017-02-03 20:50:45 +00:00
break ;
/* Numbers */
case '.' :
if ( dt != null ) {
2017-07-28 23:27:16 +00:00
o = c ; while ( ++ i < fmt . length && ( c = fmt . charAt ( i ) ) === "0" ) o += c ;
2017-02-03 20:50:45 +00:00
out [ out . length ] = { t : 's' , v : o } ; break ;
}
/* falls through */
case '0' : case '#' :
2020-06-29 08:07:23 +00:00
o = c ; while ( ++ i < fmt . length && "0#?.,E+-%" . indexOf ( c = fmt . charAt ( i ) ) > - 1 ) o += c ;
2017-02-03 20:50:45 +00:00
out [ out . length ] = { t : 'n' , v : o } ; break ;
case '?' :
2017-03-21 20:44:35 +00:00
o = c ; while ( fmt . charAt ( ++ i ) === c ) o += c ;
2017-07-28 23:27:16 +00:00
out [ out . length ] = { t : c , v : o } ; lst = c ; break ;
2017-03-21 20:44:35 +00:00
case '*' : ++ i ; if ( fmt . charAt ( i ) == ' ' || fmt . charAt ( i ) == '*' ) ++ i ; break ; // **
2017-02-03 20:50:45 +00:00
case '(' : case ')' : out [ out . length ] = { t : ( flen === 1 ? 't' : c ) , v : c } ; ++ i ; break ;
case '1' : case '2' : case '3' : case '4' : case '5' : case '6' : case '7' : case '8' : case '9' :
2017-03-21 20:44:35 +00:00
o = c ; while ( i < fmt . length && "0123456789" . indexOf ( fmt . charAt ( ++ i ) ) > - 1 ) o += fmt . charAt ( i ) ;
2017-02-03 20:50:45 +00:00
out [ out . length ] = { t : 'D' , v : o } ; break ;
case ' ' : out [ out . length ] = { t : c , v : c } ; ++ i ; break ;
2020-06-29 08:07:23 +00:00
case '$' : out [ out . length ] = { t : 't' , v : '$' } ; ++ i ; break ;
2017-02-03 20:50:45 +00:00
default :
2017-06-09 02:15:36 +00:00
if ( ",$-+/():!^&'~{}<>=€acfijklopqrtuvwxzP" . indexOf ( c ) === - 1 ) throw new Error ( 'unrecognized character ' + c + ' in ' + fmt ) ;
2017-02-03 20:50:45 +00:00
out [ out . length ] = { t : 't' , v : c } ; ++ i ; break ;
}
}
2020-06-29 08:07:23 +00:00
/* Scan for date/time parts */
2017-02-03 20:50:45 +00:00
var bt = 0 , ss0 = 0 , ssm ;
for ( i = out . length - 1 , lst = 't' ; i >= 0 ; -- i ) {
switch ( out [ i ] . t ) {
case 'h' : case 'H' : out [ i ] . t = hr ; lst = 'h' ; if ( bt < 1 ) bt = 1 ; break ;
case 's' :
if ( ( ssm = out [ i ] . v . match ( /\.0+$/ ) ) ) ss0 = Math . max ( ss0 , ssm [ 0 ] . length - 1 ) ;
if ( bt < 3 ) bt = 3 ;
/* falls through */
case 'd' : case 'y' : case 'M' : case 'e' : lst = out [ i ] . t ; break ;
case 'm' : if ( lst === 's' ) { out [ i ] . t = 'M' ; if ( bt < 2 ) bt = 2 ; } break ;
2017-04-30 16:27:03 +00:00
case 'X' : /*if(out[i].v === "B2");*/
2017-02-03 20:50:45 +00:00
break ;
case 'Z' :
if ( bt < 1 && out [ i ] . v . match ( /[Hh]/ ) ) bt = 1 ;
if ( bt < 2 && out [ i ] . v . match ( /[Mm]/ ) ) bt = 2 ;
if ( bt < 3 && out [ i ] . v . match ( /[Ss]/ ) ) bt = 3 ;
}
}
2020-06-29 08:07:23 +00:00
/* time rounding depends on presence of minute / second / usec fields */
2017-02-03 20:50:45 +00:00
switch ( bt ) {
case 0 : break ;
case 1 :
2017-03-12 18:02:43 +00:00
/*::if(!dt) break;*/
2017-02-03 20:50:45 +00:00
if ( dt . u >= 0.5 ) { dt . u = 0 ; ++ dt . S ; }
if ( dt . S >= 60 ) { dt . S = 0 ; ++ dt . M ; }
if ( dt . M >= 60 ) { dt . M = 0 ; ++ dt . H ; }
break ;
case 2 :
2017-03-12 18:02:43 +00:00
/*::if(!dt) break;*/
2017-02-03 20:50:45 +00:00
if ( dt . u >= 0.5 ) { dt . u = 0 ; ++ dt . S ; }
if ( dt . S >= 60 ) { dt . S = 0 ; ++ dt . M ; }
break ;
}
2020-06-29 08:07:23 +00:00
2017-02-03 20:50:45 +00:00
/* replace fields */
var nstr = "" , jj ;
for ( i = 0 ; i < out . length ; ++ i ) {
switch ( out [ i ] . t ) {
case 't' : case 'T' : case ' ' : case 'D' : break ;
2017-03-12 18:02:43 +00:00
case 'X' : out [ i ] . v = "" ; out [ i ] . t = ";" ; break ;
2017-02-03 20:50:45 +00:00
case 'd' : case 'm' : case 'y' : case 'h' : case 'H' : case 'M' : case 's' : case 'e' : case 'b' : case 'Z' :
2017-03-12 18:02:43 +00:00
/*::if(!dt) throw "unreachable"; */
2022-03-20 05:29:24 +00:00
out [ i ] . v = SSF _write _date ( out [ i ] . t . charCodeAt ( 0 ) , out [ i ] . v , dt , ss0 ) ;
2017-02-03 20:50:45 +00:00
out [ i ] . t = 't' ; break ;
2020-06-29 08:07:23 +00:00
case 'n' : case '?' :
2017-02-03 20:50:45 +00:00
jj = i + 1 ;
while ( out [ jj ] != null && (
( c = out [ jj ] . t ) === "?" || c === "D" ||
2017-05-11 07:29:59 +00:00
( ( c === " " || c === "t" ) && out [ jj + 1 ] != null && ( out [ jj + 1 ] . t === '?' || out [ jj + 1 ] . t === "t" && out [ jj + 1 ] . v === '/' ) ) ||
( out [ i ] . t === '(' && ( c === ' ' || c === 'n' || c === ')' ) ) ||
( c === 't' && ( out [ jj ] . v === '/' || out [ jj ] . v === ' ' && out [ jj + 1 ] != null && out [ jj + 1 ] . t == '?' ) )
2017-02-03 20:50:45 +00:00
) ) {
out [ i ] . v += out [ jj ] . v ;
2017-03-12 18:02:43 +00:00
out [ jj ] = { v : "" , t : ";" } ; ++ jj ;
2017-02-03 20:50:45 +00:00
}
nstr += out [ i ] . v ;
i = jj - 1 ; break ;
2022-03-20 05:29:24 +00:00
case 'G' : out [ i ] . t = 't' ; out [ i ] . v = SSF _general ( v , opts ) ; break ;
2017-02-03 20:50:45 +00:00
}
}
var vv = "" , myv , ostr ;
if ( nstr . length > 0 ) {
2017-04-30 16:27:03 +00:00
if ( nstr . charCodeAt ( 0 ) == 40 ) /* '(' */ {
myv = ( v < 0 && nstr . charCodeAt ( 0 ) === 45 ? - v : v ) ;
2020-06-29 08:07:23 +00:00
ostr = write _num ( 'n' , nstr , myv ) ;
2017-04-30 16:27:03 +00:00
} else {
myv = ( v < 0 && flen > 1 ? - v : v ) ;
ostr = write _num ( 'n' , nstr , myv ) ;
if ( myv < 0 && out [ 0 ] && out [ 0 ] . t == 't' ) {
ostr = ostr . substr ( 1 ) ;
out [ 0 ] . v = "-" + out [ 0 ] . v ;
}
}
2017-02-03 20:50:45 +00:00
jj = ostr . length - 1 ;
var decpt = out . length ;
2017-04-30 16:27:03 +00:00
for ( i = 0 ; i < out . length ; ++ i ) if ( out [ i ] != null && out [ i ] . t != 't' && out [ i ] . v . indexOf ( "." ) > - 1 ) { decpt = i ; break ; }
2017-02-03 20:50:45 +00:00
var lasti = out . length ;
if ( decpt === out . length && ostr . indexOf ( "E" ) === - 1 ) {
for ( i = out . length - 1 ; i >= 0 ; -- i ) {
2020-06-29 08:07:23 +00:00
if ( out [ i ] == null || 'n?' . indexOf ( out [ i ] . t ) === - 1 ) continue ;
2017-02-03 20:50:45 +00:00
if ( jj >= out [ i ] . v . length - 1 ) { jj -= out [ i ] . v . length ; out [ i ] . v = ostr . substr ( jj + 1 , out [ i ] . v . length ) ; }
else if ( jj < 0 ) out [ i ] . v = "" ;
else { out [ i ] . v = ostr . substr ( 0 , jj + 1 ) ; jj = - 1 ; }
out [ i ] . t = 't' ;
lasti = i ;
}
if ( jj >= 0 && lasti < out . length ) out [ lasti ] . v = ostr . substr ( 0 , jj + 1 ) + out [ lasti ] . v ;
}
else if ( decpt !== out . length && ostr . indexOf ( "E" ) === - 1 ) {
jj = ostr . indexOf ( "." ) - 1 ;
for ( i = decpt ; i >= 0 ; -- i ) {
2020-06-29 08:07:23 +00:00
if ( out [ i ] == null || 'n?' . indexOf ( out [ i ] . t ) === - 1 ) continue ;
2017-02-03 20:50:45 +00:00
j = out [ i ] . v . indexOf ( "." ) > - 1 && i === decpt ? out [ i ] . v . indexOf ( "." ) - 1 : out [ i ] . v . length - 1 ;
vv = out [ i ] . v . substr ( j + 1 ) ;
for ( ; j >= 0 ; -- j ) {
2017-03-25 01:36:40 +00:00
if ( jj >= 0 && ( out [ i ] . v . charAt ( j ) === "0" || out [ i ] . v . charAt ( j ) === "#" ) ) vv = ostr . charAt ( jj -- ) + vv ;
2017-02-03 20:50:45 +00:00
}
out [ i ] . v = vv ;
out [ i ] . t = 't' ;
lasti = i ;
}
if ( jj >= 0 && lasti < out . length ) out [ lasti ] . v = ostr . substr ( 0 , jj + 1 ) + out [ lasti ] . v ;
jj = ostr . indexOf ( "." ) + 1 ;
for ( i = decpt ; i < out . length ; ++ i ) {
2017-05-11 07:29:59 +00:00
if ( out [ i ] == null || ( 'n?(' . indexOf ( out [ i ] . t ) === - 1 && i !== decpt ) ) continue ;
2017-02-03 20:50:45 +00:00
j = out [ i ] . v . indexOf ( "." ) > - 1 && i === decpt ? out [ i ] . v . indexOf ( "." ) + 1 : 0 ;
vv = out [ i ] . v . substr ( 0 , j ) ;
for ( ; j < out [ i ] . v . length ; ++ j ) {
2017-03-25 01:36:40 +00:00
if ( jj < ostr . length ) vv += ostr . charAt ( jj ++ ) ;
2017-02-03 20:50:45 +00:00
}
out [ i ] . v = vv ;
out [ i ] . t = 't' ;
lasti = i ;
}
}
}
2020-06-29 08:07:23 +00:00
for ( i = 0 ; i < out . length ; ++ i ) if ( out [ i ] != null && 'n?' . indexOf ( out [ i ] . t ) > - 1 ) {
2017-02-03 20:50:45 +00:00
myv = ( flen > 1 && v < 0 && i > 0 && out [ i - 1 ] . v === "-" ? - v : v ) ;
out [ i ] . v = write _num ( out [ i ] . t , out [ i ] . v , myv ) ;
out [ i ] . t = 't' ;
}
var retval = "" ;
for ( i = 0 ; i !== out . length ; ++ i ) if ( out [ i ] != null ) retval += out [ i ] . v ;
return retval ;
}
2022-03-20 05:29:24 +00:00
2018-02-21 07:01:34 +00:00
var cfregex2 = /\[(=|>[=]?|<[>=]?)(-?\d+(?:\.\d*)?)\]/ ;
2017-02-03 20:50:45 +00:00
function chkcond ( v , rr ) {
if ( rr == null ) return false ;
var thresh = parseFloat ( rr [ 2 ] ) ;
switch ( rr [ 1 ] ) {
case "=" : if ( v == thresh ) return true ; break ;
case ">" : if ( v > thresh ) return true ; break ;
case "<" : if ( v < thresh ) return true ; break ;
case "<>" : if ( v != thresh ) return true ; break ;
case ">=" : if ( v >= thresh ) return true ; break ;
case "<=" : if ( v <= thresh ) return true ; break ;
}
return false ;
}
2017-07-28 23:27:16 +00:00
function choose _fmt ( f /*:string*/ , v /*:any*/ ) {
2022-03-20 05:29:24 +00:00
var fmt = SSF _split _fmt ( f ) ;
2017-02-03 20:50:45 +00:00
var l = fmt . length , lat = fmt [ l - 1 ] . indexOf ( "@" ) ;
if ( l < 4 && lat > - 1 ) -- l ;
2017-03-12 18:02:43 +00:00
if ( fmt . length > 4 ) throw new Error ( "cannot find right format for |" + fmt . join ( "|" ) + "|" ) ;
2017-02-03 20:50:45 +00:00
if ( typeof v !== "number" ) return [ 4 , fmt . length === 4 || lat > - 1 ? fmt [ fmt . length - 1 ] : "@" ] ;
switch ( fmt . length ) {
case 1 : fmt = lat > - 1 ? [ "General" , "General" , "General" , fmt [ 0 ] ] : [ fmt [ 0 ] , fmt [ 0 ] , fmt [ 0 ] , "@" ] ; break ;
case 2 : fmt = lat > - 1 ? [ fmt [ 0 ] , fmt [ 0 ] , fmt [ 0 ] , fmt [ 1 ] ] : [ fmt [ 0 ] , fmt [ 1 ] , fmt [ 0 ] , "@" ] ; break ;
case 3 : fmt = lat > - 1 ? [ fmt [ 0 ] , fmt [ 1 ] , fmt [ 0 ] , fmt [ 2 ] ] : [ fmt [ 0 ] , fmt [ 1 ] , fmt [ 2 ] , "@" ] ; break ;
case 4 : break ;
}
var ff = v > 0 ? fmt [ 0 ] : v < 0 ? fmt [ 1 ] : fmt [ 2 ] ;
if ( fmt [ 0 ] . indexOf ( "[" ) === - 1 && fmt [ 1 ] . indexOf ( "[" ) === - 1 ) return [ l , ff ] ;
2022-03-20 05:29:24 +00:00
if ( fmt [ 0 ] . match ( /\[[=<>]/ ) != null || fmt [ 1 ] . match ( /\[[=<>]/ ) != null ) {
2017-02-03 20:50:45 +00:00
var m1 = fmt [ 0 ] . match ( cfregex2 ) ;
var m2 = fmt [ 1 ] . match ( cfregex2 ) ;
return chkcond ( v , m1 ) ? [ l , fmt [ 0 ] ] : chkcond ( v , m2 ) ? [ l , fmt [ 1 ] ] : [ l , fmt [ m1 != null && m2 != null ? 2 : 1 ] ] ;
}
return [ l , ff ] ;
}
2022-03-20 05:29:24 +00:00
function SSF _format ( fmt /*:string|number*/ , v /*:any*/ , o /*:?any*/ ) {
2017-04-30 16:27:03 +00:00
if ( o == null ) o = { } ;
2017-02-03 20:50:45 +00:00
var sfmt = "" ;
switch ( typeof fmt ) {
2017-04-30 16:27:03 +00:00
case "string" :
if ( fmt == "m/d/yy" && o . dateNF ) sfmt = o . dateNF ;
else sfmt = fmt ;
break ;
case "number" :
if ( fmt == 14 && o . dateNF ) sfmt = o . dateNF ;
else sfmt = ( o . table != null ? ( o . table /*:any*/ ) : table _fmt ) [ fmt ] ;
2022-03-20 05:29:24 +00:00
if ( sfmt == null ) sfmt = ( o . table && o . table [ SSF _default _map [ fmt ] ] ) || table _fmt [ SSF _default _map [ fmt ] ] ;
if ( sfmt == null ) sfmt = SSF _default _str [ fmt ] || "General" ;
2017-04-30 16:27:03 +00:00
break ;
2017-02-03 20:50:45 +00:00
}
2022-03-20 05:29:24 +00:00
if ( SSF _isgeneral ( sfmt , 0 ) ) return SSF _general ( v , o ) ;
2017-07-28 23:27:16 +00:00
if ( v instanceof Date ) v = datenum _local ( v , o . date1904 ) ;
2017-02-03 20:50:45 +00:00
var f = choose _fmt ( sfmt , v ) ;
2022-03-20 05:29:24 +00:00
if ( SSF _isgeneral ( f [ 1 ] ) ) return SSF _general ( v , o ) ;
2017-02-03 20:50:45 +00:00
if ( v === true ) v = "TRUE" ; else if ( v === false ) v = "FALSE" ;
else if ( v === "" || v == null ) return "" ;
return eval _fmt ( f [ 1 ] , v , o , f [ 0 ] ) ;
}
2022-03-20 05:29:24 +00:00
function SSF _load ( fmt /*:string*/ , idx /*:?number*/ ) /*:number*/ {
2017-07-28 23:27:16 +00:00
if ( typeof idx != 'number' ) {
idx = + idx || - 1 ;
/*::if(typeof idx != 'number') return 0x188; */
for ( var i = 0 ; i < 0x0188 ; ++ i ) {
/*::if(typeof idx != 'number') return 0x188; */
if ( table _fmt [ i ] == undefined ) { if ( idx < 0 ) idx = i ; continue ; }
if ( table _fmt [ i ] == fmt ) { idx = i ; break ; }
}
/*::if(typeof idx != 'number') return 0x188; */
if ( idx < 0 ) idx = 0x187 ;
}
/*::if(typeof idx != 'number') return 0x188; */
table _fmt [ idx ] = fmt ;
return idx ;
}
2022-03-20 05:29:24 +00:00
function SSF _load _table ( tbl /*:SSFTable*/ ) /*:void*/ {
2017-07-28 23:27:16 +00:00
for ( var i = 0 ; i != 0x0188 ; ++ i )
2022-03-20 05:29:24 +00:00
if ( tbl [ i ] !== undefined ) SSF _load ( tbl [ i ] , i ) ;
}
function make _ssf ( ) {
table _fmt = SSF _init _table ( ) ;
2022-03-12 14:05:57 +00:00
}
2022-03-20 05:29:24 +00:00
var SSF = {
format : SSF _format ,
load : SSF _load ,
_table : table _fmt ,
load _table : SSF _load _table ,
parse _date _code : SSF _parse _date _code ,
is _date : fmt _is _date ,
get _table : function get _table ( ) { return SSF . _table = table _fmt ; }
} ;
2017-02-03 20:50:45 +00:00
2018-02-14 20:06:35 +00:00
var SSFImplicit /*{[number]:string}*/ = ( {
"5" : '"$"#,##0_);\\("$"#,##0\\)' ,
"6" : '"$"#,##0_);[Red]\\("$"#,##0\\)' ,
"7" : '"$"#,##0.00_);\\("$"#,##0.00\\)' ,
"8" : '"$"#,##0.00_);[Red]\\("$"#,##0.00\\)' ,
"23" : 'General' , "24" : 'General' , "25" : 'General' , "26" : 'General' ,
"27" : 'm/d/yy' , "28" : 'm/d/yy' , "29" : 'm/d/yy' , "30" : 'm/d/yy' , "31" : 'm/d/yy' ,
"32" : 'h:mm:ss' , "33" : 'h:mm:ss' , "34" : 'h:mm:ss' , "35" : 'h:mm:ss' ,
"36" : 'm/d/yy' ,
"41" : '_(* #,##0_);_(* \(#,##0\);_(* "-"_);_(@_)' ,
"42" : '_("$"* #,##0_);_("$"* \(#,##0\);_("$"* "-"_);_(@_)' ,
"43" : '_(* #,##0.00_);_(* \(#,##0.00\);_(* "-"??_);_(@_)' ,
"44" : '_("$"* #,##0.00_);_("$"* \(#,##0.00\);_("$"* "-"??_);_(@_)' ,
"50" : 'm/d/yy' , "51" : 'm/d/yy' , "52" : 'm/d/yy' , "53" : 'm/d/yy' , "54" : 'm/d/yy' ,
"55" : 'm/d/yy' , "56" : 'm/d/yy' , "57" : 'm/d/yy' , "58" : 'm/d/yy' ,
"59" : '0' ,
"60" : '0.00' ,
"61" : '#,##0' ,
"62" : '#,##0.00' ,
"63" : '"$"#,##0_);\\("$"#,##0\\)' ,
"64" : '"$"#,##0_);[Red]\\("$"#,##0\\)' ,
"65" : '"$"#,##0.00_);\\("$"#,##0.00\\)' ,
"66" : '"$"#,##0.00_);[Red]\\("$"#,##0.00\\)' ,
"67" : '0%' ,
"68" : '0.00%' ,
"69" : '# ?/?' ,
"70" : '# ??/??' ,
"71" : 'm/d/yy' ,
"72" : 'm/d/yy' ,
"73" : 'd-mmm-yy' ,
"74" : 'd-mmm' ,
"75" : 'mmm-yy' ,
"76" : 'h:mm' ,
"77" : 'h:mm:ss' ,
"78" : 'm/d/yy h:mm' ,
"79" : 'mm:ss' ,
"80" : '[h]:mm:ss' ,
"81" : 'mmss.0'
} /*:any*/ ) ;
2017-06-01 21:22:11 +00:00
/* dateNF parse TODO: move to SSF */
var dateNFregex = /[dD]+|[mM]+|[yYeE]+|[Hh]+|[Ss]+/g ;
function dateNF _regex ( dateNF /*:string|number*/ ) /*:RegExp*/ {
2022-03-20 05:29:24 +00:00
var fmt = typeof dateNF == "number" ? table _fmt [ dateNF ] : dateNF ;
2017-06-01 21:22:11 +00:00
fmt = fmt . replace ( dateNFregex , "(\\d+)" ) ;
return new RegExp ( "^" + fmt + "$" ) ;
}
function dateNF _fix ( str /*:string*/ , dateNF /*:string*/ , match /*:Array<string>*/ ) /*:string*/ {
var Y = - 1 , m = - 1 , d = - 1 , H = - 1 , M = - 1 , S = - 1 ;
( dateNF . match ( dateNFregex ) || [ ] ) . forEach ( function ( n , i ) {
var v = parseInt ( match [ i + 1 ] , 10 ) ;
switch ( n . toLowerCase ( ) . charAt ( 0 ) ) {
case 'y' : Y = v ; break ; case 'd' : d = v ; break ;
case 'h' : H = v ; break ; case 's' : S = v ; break ;
case 'm' : if ( H >= 0 ) M = v ; else m = v ; break ;
}
} ) ;
if ( S >= 0 && M == - 1 && m >= 0 ) { M = m ; m = - 1 ; }
var datestr = ( ( "" + ( Y >= 0 ? Y : new Date ( ) . getFullYear ( ) ) ) . slice ( - 4 ) + "-" + ( "00" + ( m >= 1 ? m : 1 ) ) . slice ( - 2 ) + "-" + ( "00" + ( d >= 1 ? d : 1 ) ) . slice ( - 2 ) ) ;
if ( datestr . length == 7 ) datestr = "0" + datestr ;
if ( datestr . length == 8 ) datestr = "20" + datestr ;
var timestr = ( ( "00" + ( H >= 0 ? H : 0 ) ) . slice ( - 2 ) + ":" + ( "00" + ( M >= 0 ? M : 0 ) ) . slice ( - 2 ) + ":" + ( "00" + ( S >= 0 ? S : 0 ) ) . slice ( - 2 ) ) ;
if ( H == - 1 && M == - 1 && S == - 1 ) return datestr ;
if ( Y == - 1 && m == - 1 && d == - 1 ) return timestr ;
return datestr + "T" + timestr ;
}
2022-04-11 04:11:47 +00:00
/* table of bad formats written by third-party tools */
var bad _formats = {
"d.m" : "d\\.m" // Issue #2571 Google Sheets writes invalid format 'd.m', correct format is 'd"."m' or 'd\\.m'
} ;
function SSF _ _load ( fmt , idx ) {
return SSF _load ( bad _formats [ fmt ] || fmt , idx ) ;
}
2017-02-24 10:33:01 +00:00
/ * : :
declare var ReadShift : any ;
declare var CheckField : any ;
declare var prep _blob : any ;
declare var _ _readUInt32LE : any ;
declare var _ _readInt32LE : any ;
declare var _ _toBuffer : any ;
declare var _ _utf16le : any ;
declare var bconcat : any ;
declare var s2a : any ;
declare var chr0 : any ;
declare var chr1 : any ;
2018-09-06 07:55:28 +00:00
declare var has _buf : boolean ;
2017-09-22 22:18:51 +00:00
declare var new _buf : any ;
2018-09-06 07:55:28 +00:00
declare var new _raw _buf : any ;
declare var new _unsafe _buf : any ;
2022-02-10 12:40:50 +00:00
declare var Buffer _from : any ;
2017-02-24 10:33:01 +00:00
* /
/* cfb.js (C) 2013-present SheetJS -- http://sheetjs.com */
2017-02-03 20:50:45 +00:00
/* vim: set ts=2: */
/*jshint eqnull:true */
2017-09-22 22:18:51 +00:00
/*exported CFB */
2022-03-16 03:18:09 +00:00
/*global Uint8Array:false, Uint16Array:false */
2017-02-03 20:50:45 +00:00
2017-02-24 10:33:01 +00:00
/ * : :
2017-07-28 23:27:16 +00:00
type SectorEntry = {
name ? : string ;
nodes ? : Array < number > ;
data : RawBytes ;
} ;
2017-02-24 10:33:01 +00:00
type SectorList = {
2017-07-28 23:27:16 +00:00
[ k : string | number ] : SectorEntry ;
2017-02-24 10:33:01 +00:00
name : ? string ;
2017-07-28 23:27:16 +00:00
fat _addrs : Array < number > ;
2017-02-24 10:33:01 +00:00
ssz : number ;
}
2017-07-28 23:27:16 +00:00
type CFBFiles = { [ n : string ] : CFBEntry } ;
2017-02-24 10:33:01 +00:00
* /
2018-09-06 07:55:28 +00:00
/* crc32.js (C) 2014-present SheetJS -- http://sheetjs.com */
/* vim: set ts=2: */
/*exported CRC32 */
2022-03-12 14:05:57 +00:00
var CRC32 = /*#__PURE__*/ ( function ( ) {
var CRC32 = { } ;
2018-09-06 07:55:28 +00:00
CRC32 . version = '1.2.0' ;
/* see perf/crc32table.js */
/*global Int32Array */
function signed _crc _table ( ) /*:any*/ {
var c = 0 , table /*:Array<number>*/ = new Array ( 256 ) ;
for ( var n = 0 ; n != 256 ; ++ n ) {
c = n ;
c = ( ( c & 1 ) ? ( - 306674912 ^ ( c >>> 1 ) ) : ( c >>> 1 ) ) ;
c = ( ( c & 1 ) ? ( - 306674912 ^ ( c >>> 1 ) ) : ( c >>> 1 ) ) ;
c = ( ( c & 1 ) ? ( - 306674912 ^ ( c >>> 1 ) ) : ( c >>> 1 ) ) ;
c = ( ( c & 1 ) ? ( - 306674912 ^ ( c >>> 1 ) ) : ( c >>> 1 ) ) ;
c = ( ( c & 1 ) ? ( - 306674912 ^ ( c >>> 1 ) ) : ( c >>> 1 ) ) ;
c = ( ( c & 1 ) ? ( - 306674912 ^ ( c >>> 1 ) ) : ( c >>> 1 ) ) ;
c = ( ( c & 1 ) ? ( - 306674912 ^ ( c >>> 1 ) ) : ( c >>> 1 ) ) ;
c = ( ( c & 1 ) ? ( - 306674912 ^ ( c >>> 1 ) ) : ( c >>> 1 ) ) ;
table [ n ] = c ;
}
return typeof Int32Array !== 'undefined' ? new Int32Array ( table ) : table ;
}
2022-02-10 12:40:50 +00:00
var T0 = signed _crc _table ( ) ;
function slice _by _16 _tables ( T ) {
var c = 0 , v = 0 , n = 0 , table /*:Array<number>*/ = typeof Int32Array !== 'undefined' ? new Int32Array ( 4096 ) : new Array ( 4096 ) ;
2018-09-06 07:55:28 +00:00
2022-02-10 12:40:50 +00:00
for ( n = 0 ; n != 256 ; ++ n ) table [ n ] = T [ n ] ;
for ( n = 0 ; n != 256 ; ++ n ) {
v = T [ n ] ;
for ( c = 256 + n ; c < 4096 ; c += 256 ) v = table [ c ] = ( v >>> 8 ) ^ T [ v & 0xFF ] ;
2018-09-06 07:55:28 +00:00
}
2022-02-10 12:40:50 +00:00
var out = [ ] ;
for ( n = 1 ; n != 16 ; ++ n ) out [ n - 1 ] = typeof Int32Array !== 'undefined' ? table . subarray ( n * 256 , n * 256 + 256 ) : table . slice ( n * 256 , n * 256 + 256 ) ;
return out ;
2018-09-06 07:55:28 +00:00
}
2022-02-10 12:40:50 +00:00
var TT = slice _by _16 _tables ( T0 ) ;
var T1 = TT [ 0 ] , T2 = TT [ 1 ] , T3 = TT [ 2 ] , T4 = TT [ 3 ] , T5 = TT [ 4 ] ;
var T6 = TT [ 5 ] , T7 = TT [ 6 ] , T8 = TT [ 7 ] , T9 = TT [ 8 ] , Ta = TT [ 9 ] ;
var Tb = TT [ 10 ] , Tc = TT [ 11 ] , Td = TT [ 12 ] , Te = TT [ 13 ] , Tf = TT [ 14 ] ;
function crc32 _bstr ( bstr /*:string*/ , seed /*:number*/ ) /*:number*/ {
var C = seed /*:: ? 0 : 0 */ ^ - 1 ;
for ( var i = 0 , L = bstr . length ; i < L ; ) C = ( C >>> 8 ) ^ T0 [ ( C ^ bstr . charCodeAt ( i ++ ) ) & 0xFF ] ;
return ~ C ;
}
function crc32 _buf ( B /*:Uint8Array|Array<number>*/ , seed /*:number*/ ) /*:number*/ {
var C = seed /*:: ? 0 : 0 */ ^ - 1 , L = B . length - 15 , i = 0 ;
for ( ; i < L ; ) C =
Tf [ B [ i ++ ] ^ ( C & 255 ) ] ^
Te [ B [ i ++ ] ^ ( ( C >> 8 ) & 255 ) ] ^
Td [ B [ i ++ ] ^ ( ( C >> 16 ) & 255 ) ] ^
Tc [ B [ i ++ ] ^ ( C >>> 24 ) ] ^
Tb [ B [ i ++ ] ] ^ Ta [ B [ i ++ ] ] ^ T9 [ B [ i ++ ] ] ^ T8 [ B [ i ++ ] ] ^
T7 [ B [ i ++ ] ] ^ T6 [ B [ i ++ ] ] ^ T5 [ B [ i ++ ] ] ^ T4 [ B [ i ++ ] ] ^
T3 [ B [ i ++ ] ] ^ T2 [ B [ i ++ ] ] ^ T1 [ B [ i ++ ] ] ^ T0 [ B [ i ++ ] ] ;
L += 15 ;
while ( i < L ) C = ( C >>> 8 ) ^ T0 [ ( C ^ B [ i ++ ] ) & 0xFF ] ;
return ~ C ;
2018-09-06 07:55:28 +00:00
}
function crc32 _str ( str /*:string*/ , seed /*:number*/ ) /*:number*/ {
var C = seed ^ - 1 ;
2022-02-10 12:40:50 +00:00
for ( var i = 0 , L = str . length , c = 0 , d = 0 ; i < L ; ) {
2018-09-06 07:55:28 +00:00
c = str . charCodeAt ( i ++ ) ;
if ( c < 0x80 ) {
2022-02-10 12:40:50 +00:00
C = ( C >>> 8 ) ^ T0 [ ( C ^ c ) & 0xFF ] ;
2018-09-06 07:55:28 +00:00
} else if ( c < 0x800 ) {
2022-02-10 12:40:50 +00:00
C = ( C >>> 8 ) ^ T0 [ ( C ^ ( 192 | ( ( c >> 6 ) & 31 ) ) ) & 0xFF ] ;
C = ( C >>> 8 ) ^ T0 [ ( C ^ ( 128 | ( c & 63 ) ) ) & 0xFF ] ;
2018-09-06 07:55:28 +00:00
} else if ( c >= 0xD800 && c < 0xE000 ) {
c = ( c & 1023 ) + 64 ; d = str . charCodeAt ( i ++ ) & 1023 ;
2022-02-10 12:40:50 +00:00
C = ( C >>> 8 ) ^ T0 [ ( C ^ ( 240 | ( ( c >> 8 ) & 7 ) ) ) & 0xFF ] ;
C = ( C >>> 8 ) ^ T0 [ ( C ^ ( 128 | ( ( c >> 2 ) & 63 ) ) ) & 0xFF ] ;
C = ( C >>> 8 ) ^ T0 [ ( C ^ ( 128 | ( ( d >> 6 ) & 15 ) | ( ( c & 3 ) << 4 ) ) ) & 0xFF ] ;
C = ( C >>> 8 ) ^ T0 [ ( C ^ ( 128 | ( d & 63 ) ) ) & 0xFF ] ;
2018-09-06 07:55:28 +00:00
} else {
2022-02-10 12:40:50 +00:00
C = ( C >>> 8 ) ^ T0 [ ( C ^ ( 224 | ( ( c >> 12 ) & 15 ) ) ) & 0xFF ] ;
C = ( C >>> 8 ) ^ T0 [ ( C ^ ( 128 | ( ( c >> 6 ) & 63 ) ) ) & 0xFF ] ;
C = ( C >>> 8 ) ^ T0 [ ( C ^ ( 128 | ( c & 63 ) ) ) & 0xFF ] ;
2018-09-06 07:55:28 +00:00
}
}
2022-02-10 12:40:50 +00:00
return ~ C ;
2018-09-06 07:55:28 +00:00
}
2022-02-10 12:40:50 +00:00
CRC32 . table = T0 ;
2018-09-06 07:55:28 +00:00
CRC32 . bstr = crc32 _bstr ;
CRC32 . buf = crc32 _buf ;
CRC32 . str = crc32 _str ;
2022-03-12 14:05:57 +00:00
return CRC32 ;
} ) ( ) ;
2018-03-06 00:34:04 +00:00
/* [MS-CFB] v20171201 */
2022-03-12 14:05:57 +00:00
var CFB = /*#__PURE__*/ ( function _CFB ( ) {
2017-07-28 23:27:16 +00:00
var exports /*:CFBModule*/ = /*::(*/ { } /*:: :any)*/ ;
2022-04-11 04:11:47 +00:00
exports . version = '1.2.2' ;
2017-09-22 22:18:51 +00:00
/* [MS-CFB] 2.6.4 */
function namecmp ( l /*:string*/ , r /*:string*/ ) /*:number*/ {
var L = l . split ( "/" ) , R = r . split ( "/" ) ;
for ( var i = 0 , c = 0 , Z = Math . min ( L . length , R . length ) ; i < Z ; ++ i ) {
if ( ( c = L [ i ] . length - R [ i ] . length ) ) return c ;
if ( L [ i ] != R [ i ] ) return L [ i ] < R [ i ] ? - 1 : 1 ;
}
return L . length - R . length ;
}
function dirname ( p /*:string*/ ) /*:string*/ {
if ( p . charAt ( p . length - 1 ) == "/" ) return ( p . slice ( 0 , - 1 ) . indexOf ( "/" ) === - 1 ) ? p : dirname ( p . slice ( 0 , - 1 ) ) ;
var c = p . lastIndexOf ( "/" ) ;
return ( c === - 1 ) ? p : p . slice ( 0 , c + 1 ) ;
}
function filename ( p /*:string*/ ) /*:string*/ {
if ( p . charAt ( p . length - 1 ) == "/" ) return filename ( p . slice ( 0 , - 1 ) ) ;
var c = p . lastIndexOf ( "/" ) ;
return ( c === - 1 ) ? p : p . slice ( c + 1 ) ;
}
2018-09-06 07:55:28 +00:00
/* -------------------------------------------------------------------------- */
/ * D O S D a t e f o r m a t :
high | YYYYYYYm . mmmddddd . HHHHHMMM . MMMSSSSS | low
add 1980 to stored year
stored second should be doubled
* /
/* write JS date to buf as a DOS date */
function write _dos _date ( buf /*:CFBlob*/ , date /*:Date|string*/ ) {
if ( typeof date === "string" ) date = new Date ( date ) ;
var hms /*:number*/ = date . getHours ( ) ;
hms = hms << 6 | date . getMinutes ( ) ;
hms = hms << 5 | ( date . getSeconds ( ) >>> 1 ) ;
buf . write _shift ( 2 , hms ) ;
var ymd /*:number*/ = ( date . getFullYear ( ) - 1980 ) ;
ymd = ymd << 4 | ( date . getMonth ( ) + 1 ) ;
ymd = ymd << 5 | date . getDate ( ) ;
buf . write _shift ( 2 , ymd ) ;
}
/* read four bytes from buf and interpret as a DOS date */
function parse _dos _date ( buf /*:CFBlob*/ ) /*:Date*/ {
var hms = buf . read _shift ( 2 ) & 0xFFFF ;
var ymd = buf . read _shift ( 2 ) & 0xFFFF ;
var val = new Date ( ) ;
var d = ymd & 0x1F ; ymd >>>= 5 ;
var m = ymd & 0x0F ; ymd >>>= 4 ;
val . setMilliseconds ( 0 ) ;
val . setFullYear ( ymd + 1980 ) ;
val . setMonth ( m - 1 ) ;
val . setDate ( d ) ;
var S = hms & 0x1F ; hms >>>= 5 ;
var M = hms & 0x3F ; hms >>>= 6 ;
val . setHours ( hms ) ;
val . setMinutes ( M ) ;
val . setSeconds ( S << 1 ) ;
return val ;
}
function parse _extra _field ( blob /*:CFBlob*/ ) /*:any*/ {
prep _blob ( blob , 0 ) ;
var o = /*::(*/ { } /*:: :any)*/ ;
var flags = 0 ;
while ( blob . l <= blob . length - 4 ) {
var type = blob . read _shift ( 2 ) ;
var sz = blob . read _shift ( 2 ) , tgt = blob . l + sz ;
var p = { } ;
switch ( type ) {
/* UNIX-style Timestamps */
case 0x5455 : {
flags = blob . read _shift ( 1 ) ;
if ( flags & 1 ) p . mtime = blob . read _shift ( 4 ) ;
/* for some reason, CD flag corresponds to LFH */
if ( sz > 5 ) {
if ( flags & 2 ) p . atime = blob . read _shift ( 4 ) ;
if ( flags & 4 ) p . ctime = blob . read _shift ( 4 ) ;
}
if ( p . mtime ) p . mt = new Date ( p . mtime * 1000 ) ;
}
break ;
}
blob . l = tgt ;
o [ type ] = p ;
}
return o ;
}
2017-10-27 16:25:54 +00:00
var fs /*:: = require('fs'); */ ;
2022-05-22 23:51:41 +00:00
function get _fs ( ) { return fs || ( fs = _fs ) ; }
2017-07-28 23:27:16 +00:00
function parse ( file /*:RawBytes*/ , options /*:CFBReadOpts*/ ) /*:CFBContainer*/ {
2018-09-06 07:55:28 +00:00
if ( file [ 0 ] == 0x50 && file [ 1 ] == 0x4b ) return parse _zip ( file , options ) ;
2022-02-10 12:40:50 +00:00
if ( ( file [ 0 ] | 0x20 ) == 0x6d && ( file [ 1 ] | 0x20 ) == 0x69 ) return parse _mad ( file , options ) ;
2018-03-06 00:34:04 +00:00
if ( file . length < 512 ) throw new Error ( "CFB file size " + file . length + " < 512" ) ;
2017-09-22 22:18:51 +00:00
var mver = 3 ;
var ssz = 512 ;
2017-02-03 20:50:45 +00:00
var nmfs = 0 ; // number of mini FAT sectors
2017-09-22 22:18:51 +00:00
var difat _sec _cnt = 0 ;
var dir _start = 0 ;
var minifat _start = 0 ;
var difat _start = 0 ;
2017-02-03 20:50:45 +00:00
2017-07-28 23:27:16 +00:00
var fat _addrs /*:Array<number>*/ = [ ] ; // locations of FAT sectors
2017-02-03 20:50:45 +00:00
/* [MS-CFB] 2.2 Compound File Header */
2017-07-28 23:27:16 +00:00
var blob /*:CFBlob*/ = /*::(*/ file . slice ( 0 , 512 ) /*:: :any)*/ ;
2017-02-03 20:50:45 +00:00
prep _blob ( blob , 0 ) ;
/* major version */
var mv = check _get _mver ( blob ) ;
mver = mv [ 0 ] ;
switch ( mver ) {
case 3 : ssz = 512 ; break ; case 4 : ssz = 4096 ; break ;
2018-09-06 07:55:28 +00:00
case 0 : if ( mv [ 1 ] == 0 ) return parse _zip ( file , options ) ;
/* falls through */
2017-03-31 00:47:35 +00:00
default : throw new Error ( "Major Version: Expected 3 or 4 saw " + mver ) ;
2017-02-03 20:50:45 +00:00
}
/* reprocess header */
2017-07-28 23:27:16 +00:00
if ( ssz !== 512 ) { blob = /*::(*/ file . slice ( 0 , ssz ) /*:: :any)*/ ; prep _blob ( blob , 28 /* blob.l */ ) ; }
2017-02-03 20:50:45 +00:00
/* Save header for final object */
2017-07-28 23:27:16 +00:00
var header /*:RawBytes*/ = file . slice ( 0 , ssz ) ;
2017-02-03 20:50:45 +00:00
check _shifts ( blob , mver ) ;
// Number of Directory Sectors
2017-09-22 22:18:51 +00:00
var dir _cnt /*:number*/ = blob . read _shift ( 4 , 'i' ) ;
if ( mver === 3 && dir _cnt !== 0 ) throw new Error ( '# Directory Sectors: Expected 0 saw ' + dir _cnt ) ;
2017-02-03 20:50:45 +00:00
// Number of FAT Sectors
blob . l += 4 ;
// First Directory Sector Location
dir _start = blob . read _shift ( 4 , 'i' ) ;
// Transaction Signature
blob . l += 4 ;
// Mini Stream Cutoff Size
blob . chk ( '00100000' , 'Mini Stream Cutoff Size: ' ) ;
// First Mini FAT Sector Location
minifat _start = blob . read _shift ( 4 , 'i' ) ;
// Number of Mini FAT Sectors
nmfs = blob . read _shift ( 4 , 'i' ) ;
// First DIFAT sector location
difat _start = blob . read _shift ( 4 , 'i' ) ;
// Number of DIFAT Sectors
2017-09-22 22:18:51 +00:00
difat _sec _cnt = blob . read _shift ( 4 , 'i' ) ;
2017-02-03 20:50:45 +00:00
// Grab FAT Sector Locations
2017-07-28 23:27:16 +00:00
for ( var q = - 1 , j = 0 ; j < 109 ; ++ j ) { /* 109 = (512 - blob.l)>>>2; */
2017-02-03 20:50:45 +00:00
q = blob . read _shift ( 4 , 'i' ) ;
if ( q < 0 ) break ;
fat _addrs [ j ] = q ;
}
/** Break the file up into sectors */
2017-07-28 23:27:16 +00:00
var sectors /*:Array<RawBytes>*/ = sectorify ( file , ssz ) ;
2017-02-03 20:50:45 +00:00
2017-09-22 22:18:51 +00:00
sleuth _fat ( difat _start , difat _sec _cnt , sectors , ssz , fat _addrs ) ;
2017-02-03 20:50:45 +00:00
/** Chains */
2017-02-24 10:33:01 +00:00
var sector _list /*:SectorList*/ = make _sector _list ( sectors , dir _start , fat _addrs , ssz ) ;
2017-02-03 20:50:45 +00:00
sector _list [ dir _start ] . name = "!Directory" ;
if ( nmfs > 0 && minifat _start !== ENDOFCHAIN ) sector _list [ minifat _start ] . name = "!MiniFAT" ;
sector _list [ fat _addrs [ 0 ] ] . name = "!FAT" ;
sector _list . fat _addrs = fat _addrs ;
sector _list . ssz = ssz ;
/* [MS-CFB] 2.6.1 Compound File Directory Entry */
2017-11-05 19:18:35 +00:00
var files /*:CFBFiles*/ = { } , Paths /*:Array<string>*/ = [ ] , FileIndex /*:CFBFileIndex*/ = [ ] , FullPaths /*:Array<string>*/ = [ ] ;
read _directory ( dir _start , sector _list , sectors , Paths , nmfs , files , FileIndex , minifat _start ) ;
2017-02-03 20:50:45 +00:00
2017-11-05 19:18:35 +00:00
build _full _paths ( FileIndex , FullPaths , Paths ) ;
2017-09-22 22:18:51 +00:00
Paths . shift ( ) ;
2017-02-03 20:50:45 +00:00
2017-09-22 22:18:51 +00:00
var o = {
2017-02-03 20:50:45 +00:00
FileIndex : FileIndex ,
2017-11-05 19:18:35 +00:00
FullPaths : FullPaths
2017-02-03 20:50:45 +00:00
} ;
2017-09-22 22:18:51 +00:00
// $FlowIgnore
if ( options && options . raw ) o . raw = { header : header , sectors : sectors } ;
return o ;
2017-02-03 20:50:45 +00:00
} // parse
/* [MS-CFB] 2.2 Compound File Header -- read up to major version */
2017-07-28 23:27:16 +00:00
function check _get _mver ( blob /*:CFBlob*/ ) /*:[number, number]*/ {
2018-09-06 07:55:28 +00:00
if ( blob [ blob . l ] == 0x50 && blob [ blob . l + 1 ] == 0x4b ) return [ 0 , 0 ] ;
2017-02-03 20:50:45 +00:00
// header signature 8
blob . chk ( HEADER _SIGNATURE , 'Header Signature: ' ) ;
// clsid 16
2019-07-21 03:32:02 +00:00
//blob.chk(HEADER_CLSID, 'CLSID: ');
blob . l += 16 ;
2017-02-03 20:50:45 +00:00
// minor version 2
2017-07-28 23:27:16 +00:00
var mver /*:number*/ = blob . read _shift ( 2 , 'u' ) ;
2017-02-03 20:50:45 +00:00
return [ blob . read _shift ( 2 , 'u' ) , mver ] ;
}
2017-07-28 23:27:16 +00:00
function check _shifts ( blob /*:CFBlob*/ , mver /*:number*/ ) /*:void*/ {
2017-02-03 20:50:45 +00:00
var shift = 0x09 ;
// Byte Order
2017-03-31 00:47:35 +00:00
//blob.chk('feff', 'Byte Order: '); // note: some writers put 0xffff
blob . l += 2 ;
2017-02-03 20:50:45 +00:00
// Sector Shift
switch ( ( shift = blob . read _shift ( 2 ) ) ) {
2017-03-31 00:47:35 +00:00
case 0x09 : if ( mver != 3 ) throw new Error ( 'Sector Shift: Expected 9 saw ' + shift ) ; break ;
case 0x0c : if ( mver != 4 ) throw new Error ( 'Sector Shift: Expected 12 saw ' + shift ) ; break ;
default : throw new Error ( 'Sector Shift: Expected 9 or 12 saw ' + shift ) ;
2017-02-03 20:50:45 +00:00
}
// Mini Sector Shift
blob . chk ( '0600' , 'Mini Sector Shift: ' ) ;
// Reserved
blob . chk ( '000000000000' , 'Reserved: ' ) ;
}
/** Break the file up into sectors */
2017-07-28 23:27:16 +00:00
function sectorify ( file /*:RawBytes*/ , ssz /*:number*/ ) /*:Array<RawBytes>*/ {
2017-02-03 20:50:45 +00:00
var nsectors = Math . ceil ( file . length / ssz ) - 1 ;
2017-07-28 23:27:16 +00:00
var sectors /*:Array<RawBytes>*/ = [ ] ;
2017-02-03 20:50:45 +00:00
for ( var i = 1 ; i < nsectors ; ++ i ) sectors [ i - 1 ] = file . slice ( i * ssz , ( i + 1 ) * ssz ) ;
sectors [ nsectors - 1 ] = file . slice ( nsectors * ssz ) ;
return sectors ;
}
/* [MS-CFB] 2.6.4 Red-Black Tree */
2017-11-05 19:18:35 +00:00
function build _full _paths ( FI /*:CFBFileIndex*/ , FP /*:Array<string>*/ , Paths /*:Array<string>*/ ) /*:void*/ {
2017-02-03 20:50:45 +00:00
var i = 0 , L = 0 , R = 0 , C = 0 , j = 0 , pl = Paths . length ;
2017-07-28 23:27:16 +00:00
var dad /*:Array<number>*/ = [ ] , q /*:Array<number>*/ = [ ] ;
2017-02-03 20:50:45 +00:00
for ( ; i < pl ; ++ i ) { dad [ i ] = q [ i ] = i ; FP [ i ] = Paths [ i ] ; }
for ( ; j < q . length ; ++ j ) {
i = q [ j ] ;
L = FI [ i ] . L ; R = FI [ i ] . R ; C = FI [ i ] . C ;
if ( dad [ i ] === i ) {
if ( L !== - 1 /*NOSTREAM*/ && dad [ L ] !== L ) dad [ i ] = dad [ L ] ;
if ( R !== - 1 && dad [ R ] !== R ) dad [ i ] = dad [ R ] ;
}
if ( C !== - 1 /*NOSTREAM*/ ) dad [ C ] = i ;
2019-07-21 03:32:02 +00:00
if ( L !== - 1 && i != dad [ i ] ) { dad [ L ] = dad [ i ] ; if ( q . lastIndexOf ( L ) < j ) q . push ( L ) ; }
if ( R !== - 1 && i != dad [ i ] ) { dad [ R ] = dad [ i ] ; if ( q . lastIndexOf ( R ) < j ) q . push ( R ) ; }
2017-02-03 20:50:45 +00:00
}
2018-03-06 00:34:04 +00:00
for ( i = 1 ; i < pl ; ++ i ) if ( dad [ i ] === i ) {
2017-02-03 20:50:45 +00:00
if ( R !== - 1 /*NOSTREAM*/ && dad [ R ] !== R ) dad [ i ] = dad [ R ] ;
else if ( L !== - 1 && dad [ L ] !== L ) dad [ i ] = dad [ L ] ;
}
for ( i = 1 ; i < pl ; ++ i ) {
if ( FI [ i ] . type === 0 /* unknown */ ) continue ;
2019-07-21 03:32:02 +00:00
j = i ;
if ( j != dad [ j ] ) do {
2017-02-03 20:50:45 +00:00
j = dad [ j ] ;
2019-07-21 03:32:02 +00:00
FP [ i ] = FP [ j ] + "/" + FP [ i ] ;
} while ( j !== 0 && - 1 !== dad [ j ] && j != dad [ j ] ) ;
dad [ i ] = - 1 ;
2017-02-03 20:50:45 +00:00
}
FP [ 0 ] += "/" ;
for ( i = 1 ; i < pl ; ++ i ) {
if ( FI [ i ] . type !== 2 /* stream */ ) FP [ i ] += "/" ;
}
}
2017-11-05 19:18:35 +00:00
function get _mfat _entry ( entry /*:CFBEntry*/ , payload /*:RawBytes*/ , mini /*:?RawBytes*/ ) /*:CFBlob*/ {
var start = entry . start , size = entry . size ;
//return (payload.slice(start*MSSZ, start*MSSZ + size)/*:any*/);
var o = [ ] ;
var idx = start ;
while ( mini && size > 0 && idx >= 0 ) {
o . push ( payload . slice ( idx * MSSZ , idx * MSSZ + MSSZ ) ) ;
size -= MSSZ ;
idx = _ _readInt32LE ( mini , idx * 4 ) ;
}
if ( o . length === 0 ) return ( new _buf ( 0 ) /*:any*/ ) ;
return ( bconcat ( o ) . slice ( 0 , entry . size ) /*:any*/ ) ;
}
2017-02-03 20:50:45 +00:00
/ * * C h a s e d o w n t h e r e s t o f t h e D I F A T c h a i n t o b u i l d a c o m p r e h e n s i v e l i s t
2017-09-22 22:18:51 +00:00
DIFAT chains by storing the next sector number as the last 32 bits * /
2017-07-28 23:27:16 +00:00
function sleuth _fat ( idx /*:number*/ , cnt /*:number*/ , sectors /*:Array<RawBytes>*/ , ssz /*:number*/ , fat _addrs ) /*:void*/ {
var q /*:number*/ = ENDOFCHAIN ;
2017-02-03 20:50:45 +00:00
if ( idx === ENDOFCHAIN ) {
2017-03-31 00:47:35 +00:00
if ( cnt !== 0 ) throw new Error ( "DIFAT chain shorter than expected" ) ;
2017-02-03 20:50:45 +00:00
} else if ( idx !== - 1 /*FREESECT*/ ) {
var sector = sectors [ idx ] , m = ( ssz >>> 2 ) - 1 ;
2017-02-24 10:33:01 +00:00
if ( ! sector ) return ;
2017-02-03 20:50:45 +00:00
for ( var i = 0 ; i < m ; ++ i ) {
if ( ( q = _ _readInt32LE ( sector , i * 4 ) ) === ENDOFCHAIN ) break ;
fat _addrs . push ( q ) ;
}
2022-04-11 04:11:47 +00:00
if ( cnt >= 1 ) sleuth _fat ( _ _readInt32LE ( sector , ssz - 4 ) , cnt - 1 , sectors , ssz , fat _addrs ) ;
2017-02-03 20:50:45 +00:00
}
}
/** Follow the linked list of sectors for a given starting point */
2017-07-28 23:27:16 +00:00
function get _sector _list ( sectors /*:Array<RawBytes>*/ , start /*:number*/ , fat _addrs /*:Array<number>*/ , ssz /*:number*/ , chkd /*:?Array<boolean>*/ ) /*:SectorEntry*/ {
var buf /*:Array<number>*/ = [ ] , buf _chain /*:Array<any>*/ = [ ] ;
if ( ! chkd ) chkd = [ ] ;
var modulus = ssz - 1 , j = 0 , jj = 0 ;
2017-02-03 20:50:45 +00:00
for ( j = start ; j >= 0 ; ) {
chkd [ j ] = true ;
buf [ buf . length ] = j ;
buf _chain . push ( sectors [ j ] ) ;
var addr = fat _addrs [ Math . floor ( j * 4 / ssz ) ] ;
jj = ( ( j * 4 ) & modulus ) ;
2017-03-31 00:47:35 +00:00
if ( ssz < 4 + jj ) throw new Error ( "FAT boundary crossed: " + j + " 4 " + ssz ) ;
2017-02-24 10:33:01 +00:00
if ( ! sectors [ addr ] ) break ;
2017-02-03 20:50:45 +00:00
j = _ _readInt32LE ( sectors [ addr ] , jj ) ;
}
return { nodes : buf , data : _ _toBuffer ( [ buf _chain ] ) } ;
}
/** Chase down the sector linked lists */
2017-07-28 23:27:16 +00:00
function make _sector _list ( sectors /*:Array<RawBytes>*/ , dir _start /*:number*/ , fat _addrs /*:Array<number>*/ , ssz /*:number*/ ) /*:SectorList*/ {
var sl = sectors . length , sector _list /*:SectorList*/ = ( [ ] /*:any*/ ) ;
var chkd /*:Array<boolean>*/ = [ ] , buf /*:Array<number>*/ = [ ] , buf _chain /*:Array<RawBytes>*/ = [ ] ;
var modulus = ssz - 1 , i = 0 , j = 0 , k = 0 , jj = 0 ;
2017-02-03 20:50:45 +00:00
for ( i = 0 ; i < sl ; ++ i ) {
2017-07-28 23:27:16 +00:00
buf = ( [ ] /*:Array<number>*/ ) ;
2017-02-03 20:50:45 +00:00
k = ( i + dir _start ) ; if ( k >= sl ) k -= sl ;
2017-07-28 23:27:16 +00:00
if ( chkd [ k ] ) continue ;
2017-02-03 20:50:45 +00:00
buf _chain = [ ] ;
2020-03-15 07:42:05 +00:00
var seen = [ ] ;
2017-02-03 20:50:45 +00:00
for ( j = k ; j >= 0 ; ) {
2020-03-15 07:42:05 +00:00
seen [ j ] = true ;
2017-02-03 20:50:45 +00:00
chkd [ j ] = true ;
buf [ buf . length ] = j ;
buf _chain . push ( sectors [ j ] ) ;
2017-07-28 23:27:16 +00:00
var addr /*:number*/ = fat _addrs [ Math . floor ( j * 4 / ssz ) ] ;
2017-02-03 20:50:45 +00:00
jj = ( ( j * 4 ) & modulus ) ;
2017-03-31 00:47:35 +00:00
if ( ssz < 4 + jj ) throw new Error ( "FAT boundary crossed: " + j + " 4 " + ssz ) ;
2017-02-24 10:33:01 +00:00
if ( ! sectors [ addr ] ) break ;
2017-02-03 20:50:45 +00:00
j = _ _readInt32LE ( sectors [ addr ] , jj ) ;
2020-03-15 07:42:05 +00:00
if ( seen [ j ] ) break ;
2017-02-03 20:50:45 +00:00
}
2017-07-28 23:27:16 +00:00
sector _list [ k ] = ( { nodes : buf , data : _ _toBuffer ( [ buf _chain ] ) } /*:SectorEntry*/ ) ;
2017-02-03 20:50:45 +00:00
}
return sector _list ;
}
/* [MS-CFB] 2.6.1 Compound File Directory Entry */
2017-11-05 19:18:35 +00:00
function read _directory ( dir _start /*:number*/ , sector _list /*:SectorList*/ , sectors /*:Array<RawBytes>*/ , Paths /*:Array<string>*/ , nmfs , files , FileIndex , mini ) {
2017-02-03 20:50:45 +00:00
var minifat _store = 0 , pl = ( Paths . length ? 2 : 0 ) ;
var sector = sector _list [ dir _start ] . data ;
2017-07-28 23:27:16 +00:00
var i = 0 , namelen = 0 , name ;
2017-02-03 20:50:45 +00:00
for ( ; i < sector . length ; i += 128 ) {
2017-07-28 23:27:16 +00:00
var blob /*:CFBlob*/ = /*::(*/ sector . slice ( i , i + 128 ) /*:: :any)*/ ;
2017-02-03 20:50:45 +00:00
prep _blob ( blob , 64 ) ;
namelen = blob . read _shift ( 2 ) ;
name = _ _utf16le ( blob , 0 , namelen - pl ) ;
Paths . push ( name ) ;
2017-07-28 23:27:16 +00:00
var o /*:CFBEntry*/ = ( {
2017-02-03 20:50:45 +00:00
name : name ,
type : blob . read _shift ( 1 ) ,
color : blob . read _shift ( 1 ) ,
L : blob . read _shift ( 4 , 'i' ) ,
R : blob . read _shift ( 4 , 'i' ) ,
C : blob . read _shift ( 4 , 'i' ) ,
clsid : blob . read _shift ( 16 ) ,
2017-07-28 23:27:16 +00:00
state : blob . read _shift ( 4 , 'i' ) ,
start : 0 ,
size : 0
} ) ;
var ctime /*:number*/ = blob . read _shift ( 2 ) + blob . read _shift ( 2 ) + blob . read _shift ( 2 ) + blob . read _shift ( 2 ) ;
if ( ctime !== 0 ) o . ct = read _date ( blob , blob . l - 8 ) ;
var mtime /*:number*/ = blob . read _shift ( 2 ) + blob . read _shift ( 2 ) + blob . read _shift ( 2 ) + blob . read _shift ( 2 ) ;
if ( mtime !== 0 ) o . mt = read _date ( blob , blob . l - 8 ) ;
2017-02-03 20:50:45 +00:00
o . start = blob . read _shift ( 4 , 'i' ) ;
o . size = blob . read _shift ( 4 , 'i' ) ;
2017-08-09 22:38:23 +00:00
if ( o . size < 0 && o . start < 0 ) { o . size = o . type = 0 ; o . start = ENDOFCHAIN ; o . name = "" ; }
2017-02-03 20:50:45 +00:00
if ( o . type === 5 ) { /* root */
minifat _store = o . start ;
if ( nmfs > 0 && minifat _store !== ENDOFCHAIN ) sector _list [ minifat _store ] . name = "!StreamData" ;
/*minifat_size = o.size;*/
} else if ( o . size >= 4096 /* MSCSZ */ ) {
o . storage = 'fat' ;
if ( sector _list [ o . start ] === undefined ) sector _list [ o . start ] = get _sector _list ( sectors , o . start , sector _list . fat _addrs , sector _list . ssz ) ;
sector _list [ o . start ] . name = o . name ;
2017-07-28 23:27:16 +00:00
o . content = ( sector _list [ o . start ] . data . slice ( 0 , o . size ) /*:any*/ ) ;
2017-02-03 20:50:45 +00:00
} else {
o . storage = 'minifat' ;
2018-02-14 20:06:35 +00:00
if ( o . size < 0 ) o . size = 0 ;
else if ( minifat _store !== ENDOFCHAIN && o . start !== ENDOFCHAIN && sector _list [ minifat _store ] ) {
2017-11-05 19:18:35 +00:00
o . content = get _mfat _entry ( o , sector _list [ minifat _store ] . data , ( sector _list [ mini ] || { } ) . data ) ;
2017-02-03 20:50:45 +00:00
}
}
2018-02-14 20:06:35 +00:00
if ( o . content ) prep _blob ( o . content , 0 ) ;
2017-02-03 20:50:45 +00:00
files [ name ] = o ;
FileIndex . push ( o ) ;
}
}
2017-07-28 23:27:16 +00:00
function read _date ( blob /*:RawBytes|CFBlob*/ , offset /*:number*/ ) /*:Date*/ {
2017-02-03 20:50:45 +00:00
return new Date ( ( ( ( _ _readUInt32LE ( blob , offset + 4 ) / 1e7 ) * Math . pow ( 2 , 32 ) + _ _readUInt32LE ( blob , offset ) / 1e7 ) - 11644473600 ) * 1000 ) ;
}
2017-09-22 22:18:51 +00:00
function read _file ( filename /*:string*/ , options /*:CFBReadOpts*/ ) {
2017-10-27 16:25:54 +00:00
get _fs ( ) ;
2017-02-03 20:50:45 +00:00
return parse ( fs . readFileSync ( filename ) , options ) ;
}
2017-09-22 22:18:51 +00:00
function read ( blob /*:RawBytes|string*/ , options /*:CFBReadOpts*/ ) {
2022-02-10 12:40:50 +00:00
var type = options && options . type ;
if ( ! type ) {
if ( has _buf && Buffer . isBuffer ( blob ) ) type = "buffer" ;
}
switch ( type || "base64" ) {
2017-09-22 22:18:51 +00:00
case "file" : /*:: if(typeof blob !== 'string') throw "Must pass a filename when type='file'"; */ return read _file ( blob , options ) ;
2022-03-22 20:08:08 +00:00
case "base64" : /*:: if(typeof blob !== 'string') throw "Must pass a base64-encoded binary string when type='file'"; */ return parse ( s2a ( Base64 _decode ( blob ) ) , options ) ;
2017-07-28 23:27:16 +00:00
case "binary" : /*:: if(typeof blob !== 'string') throw "Must pass a binary string when type='file'"; */ return parse ( s2a ( blob ) , options ) ;
2017-02-03 20:50:45 +00:00
}
2017-07-28 23:27:16 +00:00
return parse ( /*::typeof blob == 'string' ? new Buffer(blob, 'utf-8') : */ blob , options ) ;
2017-02-03 20:50:45 +00:00
}
2017-09-22 22:18:51 +00:00
function init _cfb ( cfb /*:CFBContainer*/ , opts /*:?any*/ ) /*:void*/ {
var o = opts || { } , root = o . root || "Root Entry" ;
if ( ! cfb . FullPaths ) cfb . FullPaths = [ ] ;
if ( ! cfb . FileIndex ) cfb . FileIndex = [ ] ;
if ( cfb . FullPaths . length !== cfb . FileIndex . length ) throw new Error ( "inconsistent CFB structure" ) ;
if ( cfb . FullPaths . length === 0 ) {
cfb . FullPaths [ 0 ] = root + "/" ;
cfb . FileIndex [ 0 ] = ( { name : root , type : 5 } /*:any*/ ) ;
}
if ( o . CLSID ) cfb . FileIndex [ 0 ] . clsid = o . CLSID ;
seed _cfb ( cfb ) ;
}
function seed _cfb ( cfb /*:CFBContainer*/ ) /*:void*/ {
var nm = "\u0001Sh33tJ5" ;
if ( CFB . find ( cfb , "/" + nm ) ) return ;
var p = new _buf ( 4 ) ; p [ 0 ] = 55 ; p [ 1 ] = p [ 3 ] = 50 ; p [ 2 ] = 54 ;
cfb . FileIndex . push ( ( { name : nm , type : 2 , content : p , size : 4 , L : 69 , R : 69 , C : 69 } /*:any*/ ) ) ;
cfb . FullPaths . push ( cfb . FullPaths [ 0 ] + nm ) ;
rebuild _cfb ( cfb ) ;
}
function rebuild _cfb ( cfb /*:CFBContainer*/ , f /*:?boolean*/ ) /*:void*/ {
init _cfb ( cfb ) ;
var gc = false , s = false ;
for ( var i = cfb . FullPaths . length - 1 ; i >= 0 ; -- i ) {
var _file = cfb . FileIndex [ i ] ;
switch ( _file . type ) {
case 0 :
if ( s ) gc = true ;
else { cfb . FileIndex . pop ( ) ; cfb . FullPaths . pop ( ) ; }
break ;
case 1 : case 2 : case 5 :
s = true ;
if ( isNaN ( _file . R * _file . L * _file . C ) ) gc = true ;
if ( _file . R > - 1 && _file . L > - 1 && _file . R == _file . L ) gc = true ;
break ;
default : gc = true ; break ;
}
}
if ( ! gc && ! f ) return ;
var now = new Date ( 1987 , 1 , 19 ) , j = 0 ;
2022-02-10 12:40:50 +00:00
// Track which names exist
var fullPaths = Object . create ? Object . create ( null ) : { } ;
2017-09-22 22:18:51 +00:00
var data /*:Array<[string, CFBEntry]>*/ = [ ] ;
for ( i = 0 ; i < cfb . FullPaths . length ; ++ i ) {
2022-02-10 12:40:50 +00:00
fullPaths [ cfb . FullPaths [ i ] ] = true ;
2017-09-22 22:18:51 +00:00
if ( cfb . FileIndex [ i ] . type === 0 ) continue ;
data . push ( [ cfb . FullPaths [ i ] , cfb . FileIndex [ i ] ] ) ;
}
for ( i = 0 ; i < data . length ; ++ i ) {
var dad = dirname ( data [ i ] [ 0 ] ) ;
2022-02-10 12:40:50 +00:00
s = fullPaths [ dad ] ;
2022-04-11 04:11:47 +00:00
while ( ! s ) {
while ( dirname ( dad ) && ! fullPaths [ dirname ( dad ) ] ) dad = dirname ( dad ) ;
2022-02-10 12:40:50 +00:00
data . push ( [ dad , ( {
name : filename ( dad ) . replace ( "/" , "" ) ,
type : 1 ,
clsid : HEADER _CLSID ,
ct : now , mt : now ,
content : null
} /*:any*/ ) ] ) ;
2022-04-11 04:11:47 +00:00
2022-02-10 12:40:50 +00:00
// Add name to set
fullPaths [ dad ] = true ;
2022-04-11 04:11:47 +00:00
dad = dirname ( data [ i ] [ 0 ] ) ;
s = fullPaths [ dad ] ;
2022-02-10 12:40:50 +00:00
}
2017-09-22 22:18:51 +00:00
}
data . sort ( function ( x , y ) { return namecmp ( x [ 0 ] , y [ 0 ] ) ; } ) ;
cfb . FullPaths = [ ] ; cfb . FileIndex = [ ] ;
for ( i = 0 ; i < data . length ; ++ i ) { cfb . FullPaths [ i ] = data [ i ] [ 0 ] ; cfb . FileIndex [ i ] = data [ i ] [ 1 ] ; }
for ( i = 0 ; i < data . length ; ++ i ) {
var elt = cfb . FileIndex [ i ] ;
var nm = cfb . FullPaths [ i ] ;
elt . name = filename ( nm ) . replace ( "/" , "" ) ;
elt . L = elt . R = elt . C = - ( elt . color = 1 ) ;
elt . size = elt . content ? elt . content . length : 0 ;
elt . start = 0 ;
elt . clsid = ( elt . clsid || HEADER _CLSID ) ;
if ( i === 0 ) {
elt . C = data . length > 1 ? 1 : - 1 ;
elt . size = 0 ;
elt . type = 5 ;
} else if ( nm . slice ( - 1 ) == "/" ) {
for ( j = i + 1 ; j < data . length ; ++ j ) if ( dirname ( cfb . FullPaths [ j ] ) == nm ) break ;
elt . C = j >= data . length ? - 1 : j ;
for ( j = i + 1 ; j < data . length ; ++ j ) if ( dirname ( cfb . FullPaths [ j ] ) == dirname ( nm ) ) break ;
elt . R = j >= data . length ? - 1 : j ;
elt . type = 1 ;
} else {
if ( dirname ( cfb . FullPaths [ i + 1 ] || "" ) == dirname ( nm ) ) elt . R = i + 1 ;
elt . type = 2 ;
}
}
}
2022-02-10 12:40:50 +00:00
function _write ( cfb /*:CFBContainer*/ , options /*:CFBWriteOpts*/ ) /*:RawBytes|string*/ {
2018-01-23 09:07:51 +00:00
var _opts = options || { } ;
2022-02-10 12:40:50 +00:00
/* MAD is order-sensitive, skip rebuild and sort */
if ( _opts . fileType == 'mad' ) return write _mad ( cfb , _opts ) ;
2017-09-22 22:18:51 +00:00
rebuild _cfb ( cfb ) ;
2022-02-10 12:40:50 +00:00
switch ( _opts . fileType ) {
case 'zip' : return write _zip ( cfb , _opts ) ;
//case 'mad': return write_mad(cfb, _opts);
}
2017-09-22 22:18:51 +00:00
var L = ( function ( cfb /*:CFBContainer*/ ) /*:Array<number>*/ {
var mini _size = 0 , fat _size = 0 ;
for ( var i = 0 ; i < cfb . FileIndex . length ; ++ i ) {
var file = cfb . FileIndex [ i ] ;
if ( ! file . content ) continue ;
var flen = file . content . length ;
2018-01-23 09:07:51 +00:00
if ( flen > 0 ) {
if ( flen < 0x1000 ) mini _size += ( flen + 0x3F ) >> 6 ;
else fat _size += ( flen + 0x01FF ) >> 9 ;
}
2017-09-22 22:18:51 +00:00
}
var dir _cnt = ( cfb . FullPaths . length + 3 ) >> 2 ;
var mini _cnt = ( mini _size + 7 ) >> 3 ;
var mfat _cnt = ( mini _size + 0x7F ) >> 7 ;
var fat _base = mini _cnt + fat _size + dir _cnt + mfat _cnt ;
var fat _cnt = ( fat _base + 0x7F ) >> 7 ;
var difat _cnt = fat _cnt <= 109 ? 0 : Math . ceil ( ( fat _cnt - 109 ) / 0x7F ) ;
while ( ( ( fat _base + fat _cnt + difat _cnt + 0x7F ) >> 7 ) > fat _cnt ) difat _cnt = ++ fat _cnt <= 109 ? 0 : Math . ceil ( ( fat _cnt - 109 ) / 0x7F ) ;
var L = [ 1 , difat _cnt , fat _cnt , mfat _cnt , dir _cnt , fat _size , mini _size , 0 ] ;
cfb . FileIndex [ 0 ] . size = mini _size << 6 ;
L [ 7 ] = ( cfb . FileIndex [ 0 ] . start = L [ 0 ] + L [ 1 ] + L [ 2 ] + L [ 3 ] + L [ 4 ] + L [ 5 ] ) + ( ( L [ 6 ] + 7 ) >> 3 ) ;
return L ;
} ) ( cfb ) ;
var o = new _buf ( L [ 7 ] << 9 ) ;
var i = 0 , T = 0 ;
{
for ( i = 0 ; i < 8 ; ++ i ) o . write _shift ( 1 , HEADER _SIG [ i ] ) ;
for ( i = 0 ; i < 8 ; ++ i ) o . write _shift ( 2 , 0 ) ;
o . write _shift ( 2 , 0x003E ) ;
o . write _shift ( 2 , 0x0003 ) ;
o . write _shift ( 2 , 0xFFFE ) ;
o . write _shift ( 2 , 0x0009 ) ;
o . write _shift ( 2 , 0x0006 ) ;
for ( i = 0 ; i < 3 ; ++ i ) o . write _shift ( 2 , 0 ) ;
o . write _shift ( 4 , 0 ) ;
o . write _shift ( 4 , L [ 2 ] ) ;
o . write _shift ( 4 , L [ 0 ] + L [ 1 ] + L [ 2 ] + L [ 3 ] - 1 ) ;
o . write _shift ( 4 , 0 ) ;
o . write _shift ( 4 , 1 << 12 ) ;
o . write _shift ( 4 , L [ 3 ] ? L [ 0 ] + L [ 1 ] + L [ 2 ] - 1 : ENDOFCHAIN ) ;
o . write _shift ( 4 , L [ 3 ] ) ;
o . write _shift ( - 4 , L [ 1 ] ? L [ 0 ] - 1 : ENDOFCHAIN ) ;
o . write _shift ( 4 , L [ 1 ] ) ;
for ( i = 0 ; i < 109 ; ++ i ) o . write _shift ( - 4 , i < L [ 2 ] ? L [ 1 ] + i : - 1 ) ;
}
if ( L [ 1 ] ) {
for ( T = 0 ; T < L [ 1 ] ; ++ T ) {
for ( ; i < 236 + T * 127 ; ++ i ) o . write _shift ( - 4 , i < L [ 2 ] ? L [ 1 ] + i : - 1 ) ;
o . write _shift ( - 4 , T === L [ 1 ] - 1 ? ENDOFCHAIN : T + 1 ) ;
}
}
var chainit = function ( w /*:number*/ ) /*:void*/ {
for ( T += w ; i < T - 1 ; ++ i ) o . write _shift ( - 4 , i + 1 ) ;
if ( w ) { ++ i ; o . write _shift ( - 4 , ENDOFCHAIN ) ; }
} ;
T = i = 0 ;
for ( T += L [ 1 ] ; i < T ; ++ i ) o . write _shift ( - 4 , consts . DIFSECT ) ;
for ( T += L [ 2 ] ; i < T ; ++ i ) o . write _shift ( - 4 , consts . FATSECT ) ;
chainit ( L [ 3 ] ) ;
chainit ( L [ 4 ] ) ;
var j /*:number*/ = 0 , flen /*:number*/ = 0 ;
var file /*:CFBEntry*/ = cfb . FileIndex [ 0 ] ;
for ( ; j < cfb . FileIndex . length ; ++ j ) {
file = cfb . FileIndex [ j ] ;
if ( ! file . content ) continue ;
/*:: if(file.content == null) throw new Error("unreachable"); */
flen = file . content . length ;
if ( flen < 0x1000 ) continue ;
file . start = T ;
chainit ( ( flen + 0x01FF ) >> 9 ) ;
}
chainit ( ( L [ 6 ] + 7 ) >> 3 ) ;
while ( o . l & 0x1FF ) o . write _shift ( - 4 , consts . ENDOFCHAIN ) ;
T = i = 0 ;
for ( j = 0 ; j < cfb . FileIndex . length ; ++ j ) {
file = cfb . FileIndex [ j ] ;
if ( ! file . content ) continue ;
/*:: if(file.content == null) throw new Error("unreachable"); */
flen = file . content . length ;
if ( ! flen || flen >= 0x1000 ) continue ;
file . start = T ;
chainit ( ( flen + 0x3F ) >> 6 ) ;
}
while ( o . l & 0x1FF ) o . write _shift ( - 4 , consts . ENDOFCHAIN ) ;
for ( i = 0 ; i < L [ 4 ] << 2 ; ++ i ) {
var nm = cfb . FullPaths [ i ] ;
if ( ! nm || nm . length === 0 ) {
for ( j = 0 ; j < 17 ; ++ j ) o . write _shift ( 4 , 0 ) ;
for ( j = 0 ; j < 3 ; ++ j ) o . write _shift ( 4 , - 1 ) ;
for ( j = 0 ; j < 12 ; ++ j ) o . write _shift ( 4 , 0 ) ;
continue ;
}
file = cfb . FileIndex [ i ] ;
if ( i === 0 ) file . start = file . size ? file . start - 1 : ENDOFCHAIN ;
2018-01-23 09:07:51 +00:00
var _nm /*:string*/ = ( i === 0 && _opts . root ) || file . name ;
2022-04-11 04:11:47 +00:00
if ( _nm . length > 32 ) {
console . error ( "Name " + _nm + " will be truncated to " + _nm . slice ( 0 , 32 ) ) ;
_nm = _nm . slice ( 0 , 32 ) ;
}
2018-01-23 09:07:51 +00:00
flen = 2 * ( _nm . length + 1 ) ;
o . write _shift ( 64 , _nm , "utf16le" ) ;
2017-09-22 22:18:51 +00:00
o . write _shift ( 2 , flen ) ;
o . write _shift ( 1 , file . type ) ;
o . write _shift ( 1 , file . color ) ;
o . write _shift ( - 4 , file . L ) ;
o . write _shift ( - 4 , file . R ) ;
o . write _shift ( - 4 , file . C ) ;
if ( ! file . clsid ) for ( j = 0 ; j < 4 ; ++ j ) o . write _shift ( 4 , 0 ) ;
else o . write _shift ( 16 , file . clsid , "hex" ) ;
o . write _shift ( 4 , file . state || 0 ) ;
o . write _shift ( 4 , 0 ) ; o . write _shift ( 4 , 0 ) ;
o . write _shift ( 4 , 0 ) ; o . write _shift ( 4 , 0 ) ;
o . write _shift ( 4 , file . start ) ;
o . write _shift ( 4 , file . size ) ; o . write _shift ( 4 , 0 ) ;
}
for ( i = 1 ; i < cfb . FileIndex . length ; ++ i ) {
file = cfb . FileIndex [ i ] ;
/*:: if(!file.content) throw new Error("unreachable"); */
if ( file . size >= 0x1000 ) {
o . l = ( file . start + 1 ) << 9 ;
2022-02-10 12:40:50 +00:00
if ( has _buf && Buffer . isBuffer ( file . content ) ) {
file . content . copy ( o , o . l , 0 , file . size ) ;
// o is a 0-filled Buffer so just set next offset
o . l += ( file . size + 511 ) & - 512 ;
} else {
for ( j = 0 ; j < file . size ; ++ j ) o . write _shift ( 1 , file . content [ j ] ) ;
for ( ; j & 0x1FF ; ++ j ) o . write _shift ( 1 , 0 ) ;
}
2017-09-22 22:18:51 +00:00
}
}
for ( i = 1 ; i < cfb . FileIndex . length ; ++ i ) {
file = cfb . FileIndex [ i ] ;
/*:: if(!file.content) throw new Error("unreachable"); */
if ( file . size > 0 && file . size < 0x1000 ) {
2022-02-10 12:40:50 +00:00
if ( has _buf && Buffer . isBuffer ( file . content ) ) {
file . content . copy ( o , o . l , 0 , file . size ) ;
// o is a 0-filled Buffer so just set next offset
o . l += ( file . size + 63 ) & - 64 ;
} else {
for ( j = 0 ; j < file . size ; ++ j ) o . write _shift ( 1 , file . content [ j ] ) ;
for ( ; j & 0x3F ; ++ j ) o . write _shift ( 1 , 0 ) ;
}
2017-09-22 22:18:51 +00:00
}
}
2022-02-10 12:40:50 +00:00
if ( has _buf ) {
o . l = o . length ;
} else {
// When using Buffer, already 0-filled
while ( o . l < o . length ) o . write _shift ( 1 , 0 ) ;
}
2017-09-22 22:18:51 +00:00
return o ;
}
/* [MS-CFB] 2.6.4 (Unicode 3.0.1 case conversion) */
2017-08-09 22:38:23 +00:00
function find ( cfb /*:CFBContainer*/ , path /*:string*/ ) /*:?CFBEntry*/ {
2017-09-22 22:18:51 +00:00
var UCFullPaths /*:Array<string>*/ = cfb . FullPaths . map ( function ( x ) { return x . toUpperCase ( ) ; } ) ;
var UCPaths /*:Array<string>*/ = UCFullPaths . map ( function ( x ) { var y = x . split ( "/" ) ; return y [ y . length - ( x . slice ( - 1 ) == "/" ? 2 : 1 ) ] ; } ) ;
var k /*:boolean*/ = false ;
if ( path . charCodeAt ( 0 ) === 47 /* "/" */ ) { k = true ; path = UCFullPaths [ 0 ] . slice ( 0 , - 1 ) + path ; }
else k = path . indexOf ( "/" ) !== - 1 ;
var UCPath /*:string*/ = path . toUpperCase ( ) ;
var w /*:number*/ = k === true ? UCFullPaths . indexOf ( UCPath ) : UCPaths . indexOf ( UCPath ) ;
if ( w !== - 1 ) return cfb . FileIndex [ w ] ;
2018-03-06 00:34:04 +00:00
var m = ! UCPath . match ( chr1 ) ;
UCPath = UCPath . replace ( chr0 , '' ) ;
if ( m ) UCPath = UCPath . replace ( chr1 , '!' ) ;
2017-09-22 22:18:51 +00:00
for ( w = 0 ; w < UCFullPaths . length ; ++ w ) {
2018-03-06 00:34:04 +00:00
if ( ( m ? UCFullPaths [ w ] . replace ( chr1 , '!' ) : UCFullPaths [ w ] ) . replace ( chr0 , '' ) == UCPath ) return cfb . FileIndex [ w ] ;
if ( ( m ? UCPaths [ w ] . replace ( chr1 , '!' ) : UCPaths [ w ] ) . replace ( chr0 , '' ) == UCPath ) return cfb . FileIndex [ w ] ;
2017-09-22 22:18:51 +00:00
}
return null ;
2017-08-09 22:38:23 +00:00
}
2017-02-03 20:50:45 +00:00
/** CFB Constants */
var MSSZ = 64 ; /* Mini Sector Size = 1<<6 */
//var MSCSZ = 4096; /* Mini Stream Cutoff Size */
/* 2.1 Compound File Sector Numbers and Types */
var ENDOFCHAIN = - 2 ;
/* 2.2 Compound File Header */
var HEADER _SIGNATURE = 'd0cf11e0a1b11ae1' ;
2017-09-22 22:18:51 +00:00
var HEADER _SIG = [ 0xD0 , 0xCF , 0x11 , 0xE0 , 0xA1 , 0xB1 , 0x1A , 0xE1 ] ;
2017-02-03 20:50:45 +00:00
var HEADER _CLSID = '00000000000000000000000000000000' ;
var consts = {
2017-09-22 22:18:51 +00:00
/* 2.1 Compund File Sector Numbers and Types */
2017-02-03 20:50:45 +00:00
MAXREGSECT : - 6 ,
DIFSECT : - 4 ,
FATSECT : - 3 ,
ENDOFCHAIN : ENDOFCHAIN ,
FREESECT : - 1 ,
/* 2.2 Compound File Header */
HEADER _SIGNATURE : HEADER _SIGNATURE ,
HEADER _MINOR _VERSION : '3e00' ,
MAXREGSID : - 6 ,
NOSTREAM : - 1 ,
HEADER _CLSID : HEADER _CLSID ,
/* 2.6.1 Compound File Directory Entry */
EntryTypes : [ 'unknown' , 'storage' , 'stream' , 'lockbytes' , 'property' , 'root' ]
} ;
2017-09-22 22:18:51 +00:00
function write _file ( cfb /*:CFBContainer*/ , filename /*:string*/ , options /*:CFBWriteOpts*/ ) /*:void*/ {
2017-10-27 16:25:54 +00:00
get _fs ( ) ;
2017-09-22 22:18:51 +00:00
var o = _write ( cfb , options ) ;
/*:: if(typeof Buffer == 'undefined' || !Buffer.isBuffer(o) || !(o instanceof Buffer)) throw new Error("unreachable"); */
fs . writeFileSync ( filename , o ) ;
}
function a2s ( o /*:RawBytes*/ ) /*:string*/ {
var out = new Array ( o . length ) ;
for ( var i = 0 ; i < o . length ; ++ i ) out [ i ] = String . fromCharCode ( o [ i ] ) ;
return out . join ( "" ) ;
}
function write ( cfb /*:CFBContainer*/ , options /*:CFBWriteOpts*/ ) /*:RawBytes|string*/ {
var o = _write ( cfb , options ) ;
2022-02-10 12:40:50 +00:00
switch ( options && options . type || "buffer" ) {
2017-10-27 16:25:54 +00:00
case "file" : get _fs ( ) ; fs . writeFileSync ( options . filename , ( o /*:any*/ ) ) ; return o ;
2022-02-10 12:40:50 +00:00
case "binary" : return typeof o == "string" ? o : a2s ( o ) ;
2022-03-22 20:08:08 +00:00
case "base64" : return Base64 _encode ( typeof o == "string" ? o : a2s ( o ) ) ;
2022-02-10 12:40:50 +00:00
case "buffer" : if ( has _buf ) return Buffer . isBuffer ( o ) ? o : Buffer _from ( o ) ;
/* falls through */
case "array" : return typeof o == "string" ? s2a ( o ) : o ;
2017-09-22 22:18:51 +00:00
}
return o ;
}
2018-09-06 07:55:28 +00:00
/* node < 8.1 zlib does not expose bytesRead, so default to pure JS */
var _zlib ;
function use _zlib ( zlib ) { try {
var InflateRaw = zlib . InflateRaw ;
var InflRaw = new InflateRaw ( ) ;
InflRaw . _processChunk ( new Uint8Array ( [ 3 , 0 ] ) , InflRaw . _finishFlushFlag ) ;
if ( InflRaw . bytesRead ) _zlib = zlib ;
else throw new Error ( "zlib does not expose bytesRead" ) ;
} catch ( e ) { console . error ( "cannot use native zlib: " + ( e . message || e ) ) ; } }
function _inflateRawSync ( payload , usz ) {
if ( ! _zlib ) return _inflate ( payload , usz ) ;
var InflateRaw = _zlib . InflateRaw ;
var InflRaw = new InflateRaw ( ) ;
var out = InflRaw . _processChunk ( payload . slice ( payload . l ) , InflRaw . _finishFlushFlag ) ;
payload . l += InflRaw . bytesRead ;
return out ;
}
function _deflateRawSync ( payload ) {
return _zlib ? _zlib . deflateRawSync ( payload ) : _deflate ( payload ) ;
}
var CLEN _ORDER = [ 16 , 17 , 18 , 0 , 8 , 7 , 9 , 6 , 10 , 5 , 11 , 4 , 12 , 3 , 13 , 2 , 14 , 1 , 15 ] ;
/* LEN_ID = [ 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285 ]; */
var LEN _LN = [ 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 13 , 15 , 17 , 19 , 23 , 27 , 31 , 35 , 43 , 51 , 59 , 67 , 83 , 99 , 115 , 131 , 163 , 195 , 227 , 258 ] ;
/* DST_ID = [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29 ]; */
var DST _LN = [ 1 , 2 , 3 , 4 , 5 , 7 , 9 , 13 , 17 , 25 , 33 , 49 , 65 , 97 , 129 , 193 , 257 , 385 , 513 , 769 , 1025 , 1537 , 2049 , 3073 , 4097 , 6145 , 8193 , 12289 , 16385 , 24577 ] ;
function bit _swap _8 ( n ) { var t = ( ( ( ( ( n << 1 ) | ( n << 11 ) ) & 0x22110 ) | ( ( ( n << 5 ) | ( n << 15 ) ) & 0x88440 ) ) ) ; return ( ( t >> 16 ) | ( t >> 8 ) | t ) & 0xFF ; }
var use _typed _arrays = typeof Uint8Array !== 'undefined' ;
var bitswap8 = use _typed _arrays ? new Uint8Array ( 1 << 8 ) : [ ] ;
for ( var q = 0 ; q < ( 1 << 8 ) ; ++ q ) bitswap8 [ q ] = bit _swap _8 ( q ) ;
function bit _swap _n ( n , b ) {
var rev = bitswap8 [ n & 0xFF ] ;
if ( b <= 8 ) return rev >>> ( 8 - b ) ;
rev = ( rev << 8 ) | bitswap8 [ ( n >> 8 ) & 0xFF ] ;
if ( b <= 16 ) return rev >>> ( 16 - b ) ;
rev = ( rev << 8 ) | bitswap8 [ ( n >> 16 ) & 0xFF ] ;
return rev >>> ( 24 - b ) ;
}
/* helpers for unaligned bit reads */
function read _bits _2 ( buf , bl ) { var w = ( bl & 7 ) , h = ( bl >>> 3 ) ; return ( ( buf [ h ] | ( w <= 6 ? 0 : buf [ h + 1 ] << 8 ) ) >>> w ) & 0x03 ; }
function read _bits _3 ( buf , bl ) { var w = ( bl & 7 ) , h = ( bl >>> 3 ) ; return ( ( buf [ h ] | ( w <= 5 ? 0 : buf [ h + 1 ] << 8 ) ) >>> w ) & 0x07 ; }
function read _bits _4 ( buf , bl ) { var w = ( bl & 7 ) , h = ( bl >>> 3 ) ; return ( ( buf [ h ] | ( w <= 4 ? 0 : buf [ h + 1 ] << 8 ) ) >>> w ) & 0x0F ; }
function read _bits _5 ( buf , bl ) { var w = ( bl & 7 ) , h = ( bl >>> 3 ) ; return ( ( buf [ h ] | ( w <= 3 ? 0 : buf [ h + 1 ] << 8 ) ) >>> w ) & 0x1F ; }
function read _bits _7 ( buf , bl ) { var w = ( bl & 7 ) , h = ( bl >>> 3 ) ; return ( ( buf [ h ] | ( w <= 1 ? 0 : buf [ h + 1 ] << 8 ) ) >>> w ) & 0x7F ; }
/* works up to n = 3 * 8 + 1 = 25 */
function read _bits _n ( buf , bl , n ) {
var w = ( bl & 7 ) , h = ( bl >>> 3 ) , f = ( ( 1 << n ) - 1 ) ;
var v = buf [ h ] >>> w ;
if ( n < 8 - w ) return v & f ;
v |= buf [ h + 1 ] << ( 8 - w ) ;
if ( n < 16 - w ) return v & f ;
v |= buf [ h + 2 ] << ( 16 - w ) ;
if ( n < 24 - w ) return v & f ;
v |= buf [ h + 3 ] << ( 24 - w ) ;
return v & f ;
}
2022-02-10 12:40:50 +00:00
/* helpers for unaligned bit writes */
function write _bits _3 ( buf , bl , v ) { var w = bl & 7 , h = bl >>> 3 ;
if ( w <= 5 ) buf [ h ] |= ( v & 7 ) << w ;
else {
buf [ h ] |= ( v << w ) & 0xFF ;
buf [ h + 1 ] = ( v & 7 ) >> ( 8 - w ) ;
}
return bl + 3 ;
}
function write _bits _1 ( buf , bl , v ) {
var w = bl & 7 , h = bl >>> 3 ;
v = ( v & 1 ) << w ;
buf [ h ] |= v ;
return bl + 1 ;
}
function write _bits _8 ( buf , bl , v ) {
var w = bl & 7 , h = bl >>> 3 ;
v <<= w ;
buf [ h ] |= v & 0xFF ; v >>>= 8 ;
buf [ h + 1 ] = v ;
return bl + 8 ;
}
function write _bits _16 ( buf , bl , v ) {
var w = bl & 7 , h = bl >>> 3 ;
v <<= w ;
buf [ h ] |= v & 0xFF ; v >>>= 8 ;
buf [ h + 1 ] = v & 0xFF ;
buf [ h + 2 ] = v >>> 8 ;
return bl + 16 ;
}
2018-09-06 07:55:28 +00:00
/* until ArrayBuffer#realloc is a thing, fake a realloc */
function realloc ( b , sz /*:number*/ ) {
var L = b . length , M = 2 * L > sz ? 2 * L : sz + 5 , i = 0 ;
if ( L >= sz ) return b ;
if ( has _buf ) {
var o = new _unsafe _buf ( M ) ;
// $FlowIgnore
if ( b . copy ) b . copy ( o ) ;
else for ( ; i < b . length ; ++ i ) o [ i ] = b [ i ] ;
return o ;
} else if ( use _typed _arrays ) {
var a = new Uint8Array ( M ) ;
if ( a . set ) a . set ( b ) ;
2022-02-10 12:40:50 +00:00
else for ( ; i < L ; ++ i ) a [ i ] = b [ i ] ;
2018-09-06 07:55:28 +00:00
return a ;
}
b . length = M ;
return b ;
}
/* zero-filled arrays for older browsers */
function zero _fill _array ( n ) {
var o = new Array ( n ) ;
for ( var i = 0 ; i < n ; ++ i ) o [ i ] = 0 ;
return o ;
2022-02-10 12:40:50 +00:00
}
2018-09-06 07:55:28 +00:00
/* build tree (used for literals and lengths) */
function build _tree ( clens , cmap , MAX /*:number*/ ) /*:number*/ {
var maxlen = 1 , w = 0 , i = 0 , j = 0 , ccode = 0 , L = clens . length ;
var bl _count = use _typed _arrays ? new Uint16Array ( 32 ) : zero _fill _array ( 32 ) ;
for ( i = 0 ; i < 32 ; ++ i ) bl _count [ i ] = 0 ;
for ( i = L ; i < MAX ; ++ i ) clens [ i ] = 0 ;
L = clens . length ;
var ctree = use _typed _arrays ? new Uint16Array ( L ) : zero _fill _array ( L ) ; // []
/* build code tree */
for ( i = 0 ; i < L ; ++ i ) {
bl _count [ ( w = clens [ i ] ) ] ++ ;
if ( maxlen < w ) maxlen = w ;
ctree [ i ] = 0 ;
}
bl _count [ 0 ] = 0 ;
for ( i = 1 ; i <= maxlen ; ++ i ) bl _count [ i + 16 ] = ( ccode = ( ccode + bl _count [ i - 1 ] ) << 1 ) ;
for ( i = 0 ; i < L ; ++ i ) {
ccode = clens [ i ] ;
if ( ccode != 0 ) ctree [ i ] = bl _count [ ccode + 16 ] ++ ;
}
/* cmap[maxlen + 4 bits] = (off&15) + (lit<<4) reverse mapping */
var cleni = 0 ;
for ( i = 0 ; i < L ; ++ i ) {
cleni = clens [ i ] ;
if ( cleni != 0 ) {
ccode = bit _swap _n ( ctree [ i ] , maxlen ) >> ( maxlen - cleni ) ;
for ( j = ( 1 << ( maxlen + 4 - cleni ) ) - 1 ; j >= 0 ; -- j )
cmap [ ccode | ( j << cleni ) ] = ( cleni & 15 ) | ( i << 4 ) ;
}
}
return maxlen ;
}
2022-02-10 12:40:50 +00:00
/* Fixed Huffman */
2018-09-06 07:55:28 +00:00
var fix _lmap = use _typed _arrays ? new Uint16Array ( 512 ) : zero _fill _array ( 512 ) ;
var fix _dmap = use _typed _arrays ? new Uint16Array ( 32 ) : zero _fill _array ( 32 ) ;
if ( ! use _typed _arrays ) {
for ( var i = 0 ; i < 512 ; ++ i ) fix _lmap [ i ] = 0 ;
for ( i = 0 ; i < 32 ; ++ i ) fix _dmap [ i ] = 0 ;
}
( function ( ) {
var dlens /*:Array<number>*/ = [ ] ;
var i = 0 ;
for ( ; i < 32 ; i ++ ) dlens . push ( 5 ) ;
build _tree ( dlens , fix _dmap , 32 ) ;
var clens /*:Array<number>*/ = [ ] ;
i = 0 ;
for ( ; i <= 143 ; i ++ ) clens . push ( 8 ) ;
for ( ; i <= 255 ; i ++ ) clens . push ( 9 ) ;
for ( ; i <= 279 ; i ++ ) clens . push ( 7 ) ;
for ( ; i <= 287 ; i ++ ) clens . push ( 8 ) ;
build _tree ( clens , fix _lmap , 288 ) ;
2022-03-12 14:05:57 +00:00
} ) ( ) ; var _deflateRaw = /*#__PURE__*/ ( function _deflateRawIIFE ( ) {
2022-02-10 12:40:50 +00:00
var DST _LN _RE = use _typed _arrays ? new Uint8Array ( 0x8000 ) : [ ] ;
var j = 0 , k = 0 ;
for ( ; j < DST _LN . length - 1 ; ++ j ) {
for ( ; k < DST _LN [ j + 1 ] ; ++ k ) DST _LN _RE [ k ] = j ;
}
for ( ; k < 32768 ; ++ k ) DST _LN _RE [ k ] = 29 ;
var LEN _LN _RE = use _typed _arrays ? new Uint8Array ( 0x103 ) : [ ] ;
for ( j = 0 , k = 0 ; j < LEN _LN . length - 1 ; ++ j ) {
for ( ; k < LEN _LN [ j + 1 ] ; ++ k ) LEN _LN _RE [ k ] = j ;
}
function write _stored ( data , out ) {
var boff = 0 ;
while ( boff < data . length ) {
var L = Math . min ( 0xFFFF , data . length - boff ) ;
var h = boff + L == data . length ;
out . write _shift ( 1 , + h ) ;
out . write _shift ( 2 , L ) ;
out . write _shift ( 2 , ( ~ L ) & 0xFFFF ) ;
while ( L -- > 0 ) out [ out . l ++ ] = data [ boff ++ ] ;
}
return out . l ;
}
/* Fixed Huffman */
function write _huff _fixed ( data , out ) {
var bl = 0 ;
var boff = 0 ;
var addrs = use _typed _arrays ? new Uint16Array ( 0x8000 ) : [ ] ;
while ( boff < data . length ) {
var L = /* data.length - boff; */ Math . min ( 0xFFFF , data . length - boff ) ;
/* write a stored block for short data */
if ( L < 10 ) {
bl = write _bits _3 ( out , bl , + ! ! ( boff + L == data . length ) ) ; // jshint ignore:line
if ( bl & 7 ) bl += 8 - ( bl & 7 ) ;
out . l = ( bl / 8 ) | 0 ;
out . write _shift ( 2 , L ) ;
out . write _shift ( 2 , ( ~ L ) & 0xFFFF ) ;
while ( L -- > 0 ) out [ out . l ++ ] = data [ boff ++ ] ;
bl = out . l * 8 ;
continue ;
}
bl = write _bits _3 ( out , bl , + ! ! ( boff + L == data . length ) + 2 ) ; // jshint ignore:line
var hash = 0 ;
while ( L -- > 0 ) {
var d = data [ boff ] ;
hash = ( ( hash << 5 ) ^ d ) & 0x7FFF ;
var match = - 1 , mlen = 0 ;
if ( ( match = addrs [ hash ] ) ) {
match |= boff & ~ 0x7FFF ;
if ( match > boff ) match -= 0x8000 ;
if ( match < boff ) while ( data [ match + mlen ] == data [ boff + mlen ] && mlen < 250 ) ++ mlen ;
}
if ( mlen > 2 ) {
/* Copy Token */
d = LEN _LN _RE [ mlen ] ;
if ( d <= 22 ) bl = write _bits _8 ( out , bl , bitswap8 [ d + 1 ] >> 1 ) - 1 ;
else {
write _bits _8 ( out , bl , 3 ) ;
bl += 5 ;
write _bits _8 ( out , bl , bitswap8 [ d - 23 ] >> 5 ) ;
bl += 3 ;
}
var len _eb = ( d < 8 ) ? 0 : ( ( d - 4 ) >> 2 ) ;
if ( len _eb > 0 ) {
write _bits _16 ( out , bl , mlen - LEN _LN [ d ] ) ;
bl += len _eb ;
}
d = DST _LN _RE [ boff - match ] ;
bl = write _bits _8 ( out , bl , bitswap8 [ d ] >> 3 ) ;
bl -= 3 ;
var dst _eb = d < 4 ? 0 : ( d - 2 ) >> 1 ;
if ( dst _eb > 0 ) {
write _bits _16 ( out , bl , boff - match - DST _LN [ d ] ) ;
bl += dst _eb ;
}
for ( var q = 0 ; q < mlen ; ++ q ) {
addrs [ hash ] = boff & 0x7FFF ;
hash = ( ( hash << 5 ) ^ data [ boff ] ) & 0x7FFF ;
++ boff ;
}
L -= mlen - 1 ;
} else {
/* Literal Token */
if ( d <= 143 ) d = d + 48 ;
else bl = write _bits _1 ( out , bl , 1 ) ;
bl = write _bits _8 ( out , bl , bitswap8 [ d ] ) ;
addrs [ hash ] = boff & 0x7FFF ;
++ boff ;
}
}
bl = write _bits _8 ( out , bl , 0 ) - 1 ;
}
out . l = ( ( bl + 7 ) / 8 ) | 0 ;
return out . l ;
}
return function _deflateRaw ( data , out ) {
if ( data . length < 8 ) return write _stored ( data , out ) ;
return write _huff _fixed ( data , out ) ;
} ;
2018-09-06 07:55:28 +00:00
} ) ( ) ;
2022-02-10 12:40:50 +00:00
function _deflate ( data ) {
var buf = new _buf ( 50 + Math . floor ( data . length * 1.1 ) ) ;
var off = _deflateRaw ( data , buf ) ;
return buf . slice ( 0 , off ) ;
}
/* modified inflate function also moves original read head */
2018-09-06 07:55:28 +00:00
var dyn _lmap = use _typed _arrays ? new Uint16Array ( 32768 ) : zero _fill _array ( 32768 ) ;
var dyn _dmap = use _typed _arrays ? new Uint16Array ( 32768 ) : zero _fill _array ( 32768 ) ;
var dyn _cmap = use _typed _arrays ? new Uint16Array ( 128 ) : zero _fill _array ( 128 ) ;
var dyn _len _1 = 1 , dyn _len _2 = 1 ;
/* 5.5.3 Expanding Huffman Codes */
function dyn ( data , boff /*:number*/ ) {
/* nomenclature from RFC1951 refers to bit values; these are offset by the implicit constant */
var _HLIT = read _bits _5 ( data , boff ) + 257 ; boff += 5 ;
var _HDIST = read _bits _5 ( data , boff ) + 1 ; boff += 5 ;
var _HCLEN = read _bits _4 ( data , boff ) + 4 ; boff += 4 ;
var w = 0 ;
/* grab and store code lengths */
var clens = use _typed _arrays ? new Uint8Array ( 19 ) : zero _fill _array ( 19 ) ;
var ctree = [ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ] ;
var maxlen = 1 ;
var bl _count = use _typed _arrays ? new Uint8Array ( 8 ) : zero _fill _array ( 8 ) ;
var next _code = use _typed _arrays ? new Uint8Array ( 8 ) : zero _fill _array ( 8 ) ;
var L = clens . length ; /* 19 */
for ( var i = 0 ; i < _HCLEN ; ++ i ) {
clens [ CLEN _ORDER [ i ] ] = w = read _bits _3 ( data , boff ) ;
if ( maxlen < w ) maxlen = w ;
bl _count [ w ] ++ ;
boff += 3 ;
}
/* build code tree */
var ccode = 0 ;
bl _count [ 0 ] = 0 ;
for ( i = 1 ; i <= maxlen ; ++ i ) next _code [ i ] = ccode = ( ccode + bl _count [ i - 1 ] ) << 1 ;
for ( i = 0 ; i < L ; ++ i ) if ( ( ccode = clens [ i ] ) != 0 ) ctree [ i ] = next _code [ ccode ] ++ ;
/* cmap[7 bits from stream] = (off&7) + (lit<<3) */
var cleni = 0 ;
for ( i = 0 ; i < L ; ++ i ) {
cleni = clens [ i ] ;
if ( cleni != 0 ) {
ccode = bitswap8 [ ctree [ i ] ] >> ( 8 - cleni ) ;
for ( var j = ( 1 << ( 7 - cleni ) ) - 1 ; j >= 0 ; -- j ) dyn _cmap [ ccode | ( j << cleni ) ] = ( cleni & 7 ) | ( i << 3 ) ;
}
}
/* read literal and dist codes at once */
var hcodes /*:Array<number>*/ = [ ] ;
maxlen = 1 ;
for ( ; hcodes . length < _HLIT + _HDIST ; ) {
ccode = dyn _cmap [ read _bits _7 ( data , boff ) ] ;
boff += ccode & 7 ;
switch ( ( ccode >>>= 3 ) ) {
case 16 :
w = 3 + read _bits _2 ( data , boff ) ; boff += 2 ;
ccode = hcodes [ hcodes . length - 1 ] ;
while ( w -- > 0 ) hcodes . push ( ccode ) ;
break ;
case 17 :
w = 3 + read _bits _3 ( data , boff ) ; boff += 3 ;
while ( w -- > 0 ) hcodes . push ( 0 ) ;
break ;
case 18 :
w = 11 + read _bits _7 ( data , boff ) ; boff += 7 ;
while ( w -- > 0 ) hcodes . push ( 0 ) ;
break ;
default :
hcodes . push ( ccode ) ;
if ( maxlen < ccode ) maxlen = ccode ;
break ;
}
}
/* build literal / length trees */
var h1 = hcodes . slice ( 0 , _HLIT ) , h2 = hcodes . slice ( _HLIT ) ;
for ( i = _HLIT ; i < 286 ; ++ i ) h1 [ i ] = 0 ;
for ( i = _HDIST ; i < 30 ; ++ i ) h2 [ i ] = 0 ;
dyn _len _1 = build _tree ( h1 , dyn _lmap , 286 ) ;
dyn _len _2 = build _tree ( h2 , dyn _dmap , 30 ) ;
return boff ;
}
/* return [ data, bytesRead ] */
function inflate ( data , usz /*:number*/ ) {
/* shortcircuit for empty buffer [0x03, 0x00] */
if ( data [ 0 ] == 3 && ! ( data [ 1 ] & 0x3 ) ) { return [ new _raw _buf ( usz ) , 2 ] ; }
/* bit offset */
var boff = 0 ;
/* header includes final bit and type bits */
var header = 0 ;
var outbuf = new _unsafe _buf ( usz ? usz : ( 1 << 18 ) ) ;
var woff = 0 ;
var OL = outbuf . length >>> 0 ;
var max _len _1 = 0 , max _len _2 = 0 ;
while ( ( header & 1 ) == 0 ) {
header = read _bits _3 ( data , boff ) ; boff += 3 ;
if ( ( header >>> 1 ) == 0 ) {
/* Stored block */
if ( boff & 7 ) boff += 8 - ( boff & 7 ) ;
/* 2 bytes sz, 2 bytes bit inverse */
var sz = data [ boff >>> 3 ] | data [ ( boff >>> 3 ) + 1 ] << 8 ;
boff += 32 ;
/* push sz bytes */
2022-02-10 12:40:50 +00:00
if ( sz > 0 ) {
if ( ! usz && OL < woff + sz ) { outbuf = realloc ( outbuf , woff + sz ) ; OL = outbuf . length ; }
while ( sz -- > 0 ) { outbuf [ woff ++ ] = data [ boff >>> 3 ] ; boff += 8 ; }
}
2018-09-06 07:55:28 +00:00
continue ;
2022-02-10 12:40:50 +00:00
} else if ( ( header >> 1 ) == 1 ) {
2018-09-06 07:55:28 +00:00
/* Fixed Huffman */
max _len _1 = 9 ; max _len _2 = 5 ;
} else {
/* Dynamic Huffman */
boff = dyn ( data , boff ) ;
max _len _1 = dyn _len _1 ; max _len _2 = dyn _len _2 ;
}
for ( ; ; ) { // while(true) is apparently out of vogue in modern JS circles
2022-02-10 12:40:50 +00:00
if ( ! usz && ( OL < woff + 32767 ) ) { outbuf = realloc ( outbuf , woff + 32767 ) ; OL = outbuf . length ; }
2018-09-06 07:55:28 +00:00
/* ingest code and move read head */
var bits = read _bits _n ( data , boff , max _len _1 ) ;
var code = ( header >>> 1 ) == 1 ? fix _lmap [ bits ] : dyn _lmap [ bits ] ;
boff += code & 15 ; code >>>= 4 ;
/* 0-255 are literals, 256 is end of block token, 257+ are copy tokens */
if ( ( ( code >>> 8 ) & 0xFF ) === 0 ) outbuf [ woff ++ ] = code ;
else if ( code == 256 ) break ;
else {
code -= 257 ;
var len _eb = ( code < 8 ) ? 0 : ( ( code - 4 ) >> 2 ) ; if ( len _eb > 5 ) len _eb = 0 ;
var tgt = woff + LEN _LN [ code ] ;
/* length extra bits */
if ( len _eb > 0 ) {
tgt += read _bits _n ( data , boff , len _eb ) ;
boff += len _eb ;
}
/* dist code */
bits = read _bits _n ( data , boff , max _len _2 ) ;
code = ( header >>> 1 ) == 1 ? fix _dmap [ bits ] : dyn _dmap [ bits ] ;
boff += code & 15 ; code >>>= 4 ;
var dst _eb = ( code < 4 ? 0 : ( code - 2 ) >> 1 ) ;
var dst = DST _LN [ code ] ;
/* dist extra bits */
if ( dst _eb > 0 ) {
dst += read _bits _n ( data , boff , dst _eb ) ;
boff += dst _eb ;
}
/* in the common case, manual byte copy is faster than TA set / Buffer copy */
2022-02-10 12:40:50 +00:00
if ( ! usz && OL < tgt ) { outbuf = realloc ( outbuf , tgt + 100 ) ; OL = outbuf . length ; }
2018-09-06 07:55:28 +00:00
while ( woff < tgt ) { outbuf [ woff ] = outbuf [ woff - dst ] ; ++ woff ; }
}
}
}
2022-02-10 12:40:50 +00:00
if ( usz ) return [ outbuf , ( boff + 7 ) >>> 3 ] ;
return [ outbuf . slice ( 0 , woff ) , ( boff + 7 ) >>> 3 ] ;
2018-09-06 07:55:28 +00:00
}
function _inflate ( payload , usz ) {
var data = payload . slice ( payload . l || 0 ) ;
var out = inflate ( data , usz ) ;
payload . l += out [ 1 ] ;
return out [ 0 ] ;
}
function warn _or _throw ( wrn , msg ) {
if ( wrn ) { if ( typeof console !== 'undefined' ) console . error ( msg ) ; }
else throw new Error ( msg ) ;
}
function parse _zip ( file /*:RawBytes*/ , options /*:CFBReadOpts*/ ) /*:CFBContainer*/ {
var blob /*:CFBlob*/ = /*::(*/ file /*:: :any)*/ ;
prep _blob ( blob , 0 ) ;
var FileIndex /*:CFBFileIndex*/ = [ ] , FullPaths /*:Array<string>*/ = [ ] ;
var o = {
FileIndex : FileIndex ,
FullPaths : FullPaths
} ;
init _cfb ( o , { root : options . root } ) ;
/* find end of central directory, start just after signature */
var i = blob . length - 4 ;
while ( ( blob [ i ] != 0x50 || blob [ i + 1 ] != 0x4b || blob [ i + 2 ] != 0x05 || blob [ i + 3 ] != 0x06 ) && i >= 0 ) -- i ;
blob . l = i + 4 ;
/* parse end of central directory */
blob . l += 4 ;
var fcnt = blob . read _shift ( 2 ) ;
blob . l += 6 ;
var start _cd = blob . read _shift ( 4 ) ;
/* parse central directory */
blob . l = start _cd ;
for ( i = 0 ; i < fcnt ; ++ i ) {
/* trust local file header instead of CD entry */
blob . l += 20 ;
var csz = blob . read _shift ( 4 ) ;
var usz = blob . read _shift ( 4 ) ;
var namelen = blob . read _shift ( 2 ) ;
var efsz = blob . read _shift ( 2 ) ;
var fcsz = blob . read _shift ( 2 ) ;
blob . l += 8 ;
var offset = blob . read _shift ( 4 ) ;
var EF = parse _extra _field ( /*::(*/ blob . slice ( blob . l + namelen , blob . l + namelen + efsz ) /*:: :any)*/ ) ;
blob . l += namelen + efsz + fcsz ;
var L = blob . l ;
blob . l = offset + 4 ;
parse _local _file ( blob , csz , usz , o , EF ) ;
blob . l = L ;
}
2022-04-11 04:11:47 +00:00
2018-09-06 07:55:28 +00:00
return o ;
}
/* head starts just after local file header signature */
function parse _local _file ( blob /*:CFBlob*/ , csz /*:number*/ , usz /*:number*/ , o /*:CFBContainer*/ , EF ) {
/* [local file header] */
blob . l += 2 ;
var flags = blob . read _shift ( 2 ) ;
var meth = blob . read _shift ( 2 ) ;
var date = parse _dos _date ( blob ) ;
if ( flags & 0x2041 ) throw new Error ( "Unsupported ZIP encryption" ) ;
var crc32 = blob . read _shift ( 4 ) ;
var _csz = blob . read _shift ( 4 ) ;
var _usz = blob . read _shift ( 4 ) ;
var namelen = blob . read _shift ( 2 ) ;
var efsz = blob . read _shift ( 2 ) ;
// TODO: flags & (1<<11) // UTF8
var name = "" ; for ( var i = 0 ; i < namelen ; ++ i ) name += String . fromCharCode ( blob [ blob . l ++ ] ) ;
if ( efsz ) {
var ef = parse _extra _field ( /*::(*/ blob . slice ( blob . l , blob . l + efsz ) /*:: :any)*/ ) ;
if ( ( ef [ 0x5455 ] || { } ) . mt ) date = ef [ 0x5455 ] . mt ;
if ( ( ( EF || { } ) [ 0x5455 ] || { } ) . mt ) date = EF [ 0x5455 ] . mt ;
}
blob . l += efsz ;
/* [encryption header] */
/* [file data] */
var data = blob . slice ( blob . l , blob . l + _csz ) ;
switch ( meth ) {
case 8 : data = _inflateRawSync ( blob , _usz ) ; break ;
2022-02-10 12:40:50 +00:00
case 0 : break ; // TODO: scan for magic number
2018-09-06 07:55:28 +00:00
default : throw new Error ( "Unsupported ZIP Compression method " + meth ) ;
}
/* [data descriptor] */
var wrn = false ;
if ( flags & 8 ) {
crc32 = blob . read _shift ( 4 ) ;
if ( crc32 == 0x08074b50 ) { crc32 = blob . read _shift ( 4 ) ; wrn = true ; }
_csz = blob . read _shift ( 4 ) ;
_usz = blob . read _shift ( 4 ) ;
}
if ( _csz != csz ) warn _or _throw ( wrn , "Bad compressed size: " + csz + " != " + _csz ) ;
if ( _usz != usz ) warn _or _throw ( wrn , "Bad uncompressed size: " + usz + " != " + _usz ) ;
2022-02-10 12:40:50 +00:00
//var _crc32 = CRC32.buf(data, 0);
//if((crc32>>0) != (_crc32>>0)) warn_or_throw(wrn, "Bad CRC32 checksum: " + crc32 + " != " + _crc32);
2018-09-06 07:55:28 +00:00
cfb _add ( o , name , data , { unsafe : true , mt : date } ) ;
}
function write _zip ( cfb /*:CFBContainer*/ , options /*:CFBWriteOpts*/ ) /*:RawBytes*/ {
var _opts = options || { } ;
var out = [ ] , cdirs = [ ] ;
var o /*:CFBlob*/ = new _buf ( 1 ) ;
var method = ( _opts . compression ? 8 : 0 ) , flags = 0 ;
var desc = false ;
if ( desc ) flags |= 8 ;
var i = 0 , j = 0 ;
var start _cd = 0 , fcnt = 0 ;
var root = cfb . FullPaths [ 0 ] , fp = root , fi = cfb . FileIndex [ 0 ] ;
var crcs = [ ] ;
var sz _cd = 0 ;
for ( i = 1 ; i < cfb . FullPaths . length ; ++ i ) {
fp = cfb . FullPaths [ i ] . slice ( root . length ) ; fi = cfb . FileIndex [ i ] ;
if ( ! fi . size || ! fi . content || fp == "\u0001Sh33tJ5" ) continue ;
var start = start _cd ;
/* TODO: CP437 filename */
var namebuf = new _buf ( fp . length ) ;
for ( j = 0 ; j < fp . length ; ++ j ) namebuf . write _shift ( 1 , fp . charCodeAt ( j ) & 0x7F ) ;
namebuf = namebuf . slice ( 0 , namebuf . l ) ;
crcs [ fcnt ] = CRC32 . buf ( /*::((*/ fi . content /*::||[]):any)*/ , 0 ) ;
var outbuf = fi . content /*::||[]*/ ;
if ( method == 8 ) outbuf = _deflateRawSync ( outbuf ) ;
/* local file header */
o = new _buf ( 30 ) ;
o . write _shift ( 4 , 0x04034b50 ) ;
o . write _shift ( 2 , 20 ) ;
o . write _shift ( 2 , flags ) ;
o . write _shift ( 2 , method ) ;
/* TODO: last mod file time/date */
if ( fi . mt ) write _dos _date ( o , fi . mt ) ;
else o . write _shift ( 4 , 0 ) ;
o . write _shift ( - 4 , ( flags & 8 ) ? 0 : crcs [ fcnt ] ) ;
o . write _shift ( 4 , ( flags & 8 ) ? 0 : outbuf . length ) ;
o . write _shift ( 4 , ( flags & 8 ) ? 0 : /*::(*/ fi . content /*::||[])*/ . length ) ;
o . write _shift ( 2 , namebuf . length ) ;
o . write _shift ( 2 , 0 ) ;
start _cd += o . length ;
out . push ( o ) ;
start _cd += namebuf . length ;
out . push ( namebuf ) ;
2022-02-10 12:40:50 +00:00
/* TODO: extra fields? */
2018-09-06 07:55:28 +00:00
/* TODO: encryption header ? */
2022-02-10 12:40:50 +00:00
2018-09-06 07:55:28 +00:00
start _cd += outbuf . length ;
out . push ( outbuf ) ;
/* data descriptor */
if ( flags & 8 ) {
o = new _buf ( 12 ) ;
o . write _shift ( - 4 , crcs [ fcnt ] ) ;
o . write _shift ( 4 , outbuf . length ) ;
o . write _shift ( 4 , /*::(*/ fi . content /*::||[])*/ . length ) ;
start _cd += o . l ;
out . push ( o ) ;
}
/* central directory */
o = new _buf ( 46 ) ;
o . write _shift ( 4 , 0x02014b50 ) ;
o . write _shift ( 2 , 0 ) ;
o . write _shift ( 2 , 20 ) ;
o . write _shift ( 2 , flags ) ;
o . write _shift ( 2 , method ) ;
o . write _shift ( 4 , 0 ) ; /* TODO: last mod file time/date */
o . write _shift ( - 4 , crcs [ fcnt ] ) ;
o . write _shift ( 4 , outbuf . length ) ;
o . write _shift ( 4 , /*::(*/ fi . content /*::||[])*/ . length ) ;
o . write _shift ( 2 , namebuf . length ) ;
o . write _shift ( 2 , 0 ) ;
o . write _shift ( 2 , 0 ) ;
o . write _shift ( 2 , 0 ) ;
o . write _shift ( 2 , 0 ) ;
o . write _shift ( 4 , 0 ) ;
o . write _shift ( 4 , start ) ;
sz _cd += o . l ;
cdirs . push ( o ) ;
sz _cd += namebuf . length ;
cdirs . push ( namebuf ) ;
++ fcnt ;
}
/* end of central directory */
o = new _buf ( 22 ) ;
o . write _shift ( 4 , 0x06054b50 ) ;
o . write _shift ( 2 , 0 ) ;
o . write _shift ( 2 , 0 ) ;
o . write _shift ( 2 , fcnt ) ;
o . write _shift ( 2 , fcnt ) ;
o . write _shift ( 4 , sz _cd ) ;
o . write _shift ( 4 , start _cd ) ;
o . write _shift ( 2 , 0 ) ;
return bconcat ( ( [ bconcat ( ( out /*:any*/ ) ) , bconcat ( cdirs ) , o ] /*:any*/ ) ) ;
}
2022-02-10 12:40:50 +00:00
var ContentTypeMap = ( {
"htm" : "text/html" ,
"xml" : "text/xml" ,
"gif" : "image/gif" ,
"jpg" : "image/jpeg" ,
"png" : "image/png" ,
"mso" : "application/x-mso" ,
"thmx" : "application/vnd.ms-officetheme" ,
"sh33tj5" : "application/octet-stream"
} /*:any*/ ) ;
function get _content _type ( fi /*:CFBEntry*/ , fp /*:string*/ ) /*:string*/ {
if ( fi . ctype ) return fi . ctype ;
var ext = fi . name || "" , m = ext . match ( /\.([^\.]+)$/ ) ;
if ( m && ContentTypeMap [ m [ 1 ] ] ) return ContentTypeMap [ m [ 1 ] ] ;
if ( fp ) {
m = ( ext = fp ) . match ( /[\.\\]([^\.\\])+$/ ) ;
if ( m && ContentTypeMap [ m [ 1 ] ] ) return ContentTypeMap [ m [ 1 ] ] ;
}
return "application/octet-stream" ;
}
/* 76 character chunks TODO: intertwine encoding */
function write _base64 _76 ( bstr /*:string*/ ) /*:string*/ {
2022-03-22 20:08:08 +00:00
var data = Base64 _encode ( bstr ) ;
2022-02-10 12:40:50 +00:00
var o = [ ] ;
for ( var i = 0 ; i < data . length ; i += 76 ) o . push ( data . slice ( i , i + 76 ) ) ;
return o . join ( "\r\n" ) + "\r\n" ;
}
/ *
Rules for QP :
- escape = # # applies for all non - display characters and literal "="
- space or tab at end of line must be encoded
- \ r \ n newlines can be preserved , but bare \ r and \ n must be escaped
- lines must not exceed 76 characters , use soft breaks = \ r \ n
TODO : Some files from word appear to write line extensions with bare equals :
` ` `
< table class = 3 DMsoTableGrid border = 3 D1 cellspacing = 3 D0 cellpadding = 3 D0 width =
= "70%"
` ` `
* /
function write _quoted _printable ( text /*:string*/ ) /*:string*/ {
var encoded = text . replace ( /[\x00-\x08\x0B\x0C\x0E-\x1F\x7E-\xFF=]/g , function ( c ) {
var w = c . charCodeAt ( 0 ) . toString ( 16 ) . toUpperCase ( ) ;
return "=" + ( w . length == 1 ? "0" + w : w ) ;
} ) ;
encoded = encoded . replace ( / $/mg , "=20" ) . replace ( /\t$/mg , "=09" ) ;
if ( encoded . charAt ( 0 ) == "\n" ) encoded = "=0D" + encoded . slice ( 1 ) ;
encoded = encoded . replace ( /\r(?!\n)/mg , "=0D" ) . replace ( /\n\n/mg , "\n=0A" ) . replace ( /([^\r\n])\n/mg , "$1=0A" ) ;
var o /*:Array<string>*/ = [ ] , split = encoded . split ( "\r\n" ) ;
for ( var si = 0 ; si < split . length ; ++ si ) {
var str = split [ si ] ;
if ( str . length == 0 ) { o . push ( "" ) ; continue ; }
for ( var i = 0 ; i < str . length ; ) {
var end = 76 ;
var tmp = str . slice ( i , i + end ) ;
if ( tmp . charAt ( end - 1 ) == "=" ) end -- ;
else if ( tmp . charAt ( end - 2 ) == "=" ) end -= 2 ;
else if ( tmp . charAt ( end - 3 ) == "=" ) end -= 3 ;
tmp = str . slice ( i , i + end ) ;
i += end ;
if ( i < str . length ) tmp += "=" ;
o . push ( tmp ) ;
}
}
return o . join ( "\r\n" ) ;
}
function parse _quoted _printable ( data /*:Array<string>*/ ) /*:RawBytes*/ {
var o = [ ] ;
/* unify long lines */
for ( var di = 0 ; di < data . length ; ++ di ) {
var line = data [ di ] ;
while ( di <= data . length && line . charAt ( line . length - 1 ) == "=" ) line = line . slice ( 0 , line . length - 1 ) + data [ ++ di ] ;
o . push ( line ) ;
}
/* decode */
for ( var oi = 0 ; oi < o . length ; ++ oi ) o [ oi ] = o [ oi ] . replace ( /[=][0-9A-Fa-f]{2}/g , function ( $$ ) { return String . fromCharCode ( parseInt ( $$ . slice ( 1 ) , 16 ) ) ; } ) ;
return s2a ( o . join ( "\r\n" ) ) ;
}
function parse _mime ( cfb /*:CFBContainer*/ , data /*:Array<string>*/ , root /*:string*/ ) /*:void*/ {
var fname = "" , cte = "" , ctype = "" , fdata ;
var di = 0 ;
for ( ; di < 10 ; ++ di ) {
var line = data [ di ] ;
if ( ! line || line . match ( /^\s*$/ ) ) break ;
var m = line . match ( /^(.*?):\s*([^\s].*)$/ ) ;
if ( m ) switch ( m [ 1 ] . toLowerCase ( ) ) {
case "content-location" : fname = m [ 2 ] . trim ( ) ; break ;
case "content-type" : ctype = m [ 2 ] . trim ( ) ; break ;
case "content-transfer-encoding" : cte = m [ 2 ] . trim ( ) ; break ;
}
}
++ di ;
switch ( cte . toLowerCase ( ) ) {
2022-03-22 20:08:08 +00:00
case 'base64' : fdata = s2a ( Base64 _decode ( data . slice ( di ) . join ( "" ) ) ) ; break ;
2022-02-10 12:40:50 +00:00
case 'quoted-printable' : fdata = parse _quoted _printable ( data . slice ( di ) ) ; break ;
default : throw new Error ( "Unsupported Content-Transfer-Encoding " + cte ) ;
}
var file = cfb _add ( cfb , fname . slice ( root . length ) , fdata , { unsafe : true } ) ;
if ( ctype ) file . ctype = ctype ;
}
function parse _mad ( file /*:RawBytes*/ , options /*:CFBReadOpts*/ ) /*:CFBContainer*/ {
if ( a2s ( file . slice ( 0 , 13 ) ) . toLowerCase ( ) != "mime-version:" ) throw new Error ( "Unsupported MAD header" ) ;
var root = ( options && options . root || "" ) ;
// $FlowIgnore
var data = ( has _buf && Buffer . isBuffer ( file ) ? file . toString ( "binary" ) : a2s ( file ) ) . split ( "\r\n" ) ;
var di = 0 , row = "" ;
/* if root is not specified, scan for the common prefix */
for ( di = 0 ; di < data . length ; ++ di ) {
row = data [ di ] ;
if ( ! /^Content-Location:/i . test ( row ) ) continue ;
row = row . slice ( row . indexOf ( "file" ) ) ;
if ( ! root ) root = row . slice ( 0 , row . lastIndexOf ( "/" ) + 1 ) ;
if ( row . slice ( 0 , root . length ) == root ) continue ;
while ( root . length > 0 ) {
root = root . slice ( 0 , root . length - 1 ) ;
root = root . slice ( 0 , root . lastIndexOf ( "/" ) + 1 ) ;
if ( row . slice ( 0 , root . length ) == root ) break ;
}
}
var mboundary = ( data [ 1 ] || "" ) . match ( /boundary="(.*?)"/ ) ;
if ( ! mboundary ) throw new Error ( "MAD cannot find boundary" ) ;
var boundary = "--" + ( mboundary [ 1 ] || "" ) ;
var FileIndex /*:CFBFileIndex*/ = [ ] , FullPaths /*:Array<string>*/ = [ ] ;
var o = {
FileIndex : FileIndex ,
FullPaths : FullPaths
} ;
init _cfb ( o ) ;
var start _di , fcnt = 0 ;
for ( di = 0 ; di < data . length ; ++ di ) {
var line = data [ di ] ;
if ( line !== boundary && line !== boundary + "--" ) continue ;
if ( fcnt ++ ) parse _mime ( o , data . slice ( start _di , di ) , root ) ;
start _di = di ;
}
return o ;
}
function write _mad ( cfb /*:CFBContainer*/ , options /*:CFBWriteOpts*/ ) /*:string*/ {
var opts = options || { } ;
var boundary = opts . boundary || "SheetJS" ;
boundary = '------=' + boundary ;
var out = [
'MIME-Version: 1.0' ,
'Content-Type: multipart/related; boundary="' + boundary . slice ( 2 ) + '"' ,
'' ,
'' ,
''
] ;
var root = cfb . FullPaths [ 0 ] , fp = root , fi = cfb . FileIndex [ 0 ] ;
for ( var i = 1 ; i < cfb . FullPaths . length ; ++ i ) {
fp = cfb . FullPaths [ i ] . slice ( root . length ) ;
fi = cfb . FileIndex [ i ] ;
if ( ! fi . size || ! fi . content || fp == "\u0001Sh33tJ5" ) continue ;
/* Normalize filename */
fp = fp . replace ( /[\x00-\x08\x0B\x0C\x0E-\x1F\x7E-\xFF]/g , function ( c ) {
return "_x" + c . charCodeAt ( 0 ) . toString ( 16 ) + "_" ;
} ) . replace ( /[\u0080-\uFFFF]/g , function ( u ) {
return "_u" + u . charCodeAt ( 0 ) . toString ( 16 ) + "_" ;
} ) ;
/* Extract content as binary string */
var ca = fi . content ;
// $FlowIgnore
var cstr = has _buf && Buffer . isBuffer ( ca ) ? ca . toString ( "binary" ) : a2s ( ca ) ;
/* 4/5 of first 1024 chars ascii -> quoted printable, else base64 */
var dispcnt = 0 , L = Math . min ( 1024 , cstr . length ) , cc = 0 ;
for ( var csl = 0 ; csl <= L ; ++ csl ) if ( ( cc = cstr . charCodeAt ( csl ) ) >= 0x20 && cc < 0x80 ) ++ dispcnt ;
var qp = dispcnt >= L * 4 / 5 ;
out . push ( boundary ) ;
out . push ( 'Content-Location: ' + ( opts . root || 'file:///C:/SheetJS/' ) + fp ) ;
out . push ( 'Content-Transfer-Encoding: ' + ( qp ? 'quoted-printable' : 'base64' ) ) ;
out . push ( 'Content-Type: ' + get _content _type ( fi , fp ) ) ;
out . push ( '' ) ;
out . push ( qp ? write _quoted _printable ( cstr ) : write _base64 _76 ( cstr ) ) ;
}
out . push ( boundary + '--\r\n' ) ;
return out . join ( "\r\n" ) ;
}
2017-09-22 22:18:51 +00:00
function cfb _new ( opts /*:?any*/ ) /*:CFBContainer*/ {
var o /*:CFBContainer*/ = ( { } /*:any*/ ) ;
init _cfb ( o , opts ) ;
return o ;
}
function cfb _add ( cfb /*:CFBContainer*/ , name /*:string*/ , content /*:?RawBytes*/ , opts /*:?any*/ ) /*:CFBEntry*/ {
2018-04-13 04:48:21 +00:00
var unsafe = opts && opts . unsafe ;
if ( ! unsafe ) init _cfb ( cfb ) ;
var file = ! unsafe && CFB . find ( cfb , name ) ;
2017-09-22 22:18:51 +00:00
if ( ! file ) {
2017-10-27 16:25:54 +00:00
var fpath /*:string*/ = cfb . FullPaths [ 0 ] ;
2017-09-22 22:18:51 +00:00
if ( name . slice ( 0 , fpath . length ) == fpath ) fpath = name ;
else {
if ( fpath . slice ( - 1 ) != "/" ) fpath += "/" ;
fpath = ( fpath + name ) . replace ( "//" , "/" ) ;
}
2017-10-27 16:25:54 +00:00
file = ( { name : filename ( name ) , type : 2 } /*:any*/ ) ;
2017-09-22 22:18:51 +00:00
cfb . FileIndex . push ( file ) ;
cfb . FullPaths . push ( fpath ) ;
2018-04-13 04:48:21 +00:00
if ( ! unsafe ) CFB . utils . cfb _gc ( cfb ) ;
2017-09-22 22:18:51 +00:00
}
/*:: if(!file) throw new Error("unreachable"); */
file . content = ( content /*:any*/ ) ;
file . size = content ? content . length : 0 ;
if ( opts ) {
if ( opts . CLSID ) file . clsid = opts . CLSID ;
2018-09-06 07:55:28 +00:00
if ( opts . mt ) file . mt = opts . mt ;
if ( opts . ct ) file . ct = opts . ct ;
2017-09-22 22:18:51 +00:00
}
return file ;
}
function cfb _del ( cfb /*:CFBContainer*/ , name /*:string*/ ) /*:boolean*/ {
init _cfb ( cfb ) ;
var file = CFB . find ( cfb , name ) ;
if ( file ) for ( var j = 0 ; j < cfb . FileIndex . length ; ++ j ) if ( cfb . FileIndex [ j ] == file ) {
cfb . FileIndex . splice ( j , 1 ) ;
cfb . FullPaths . splice ( j , 1 ) ;
return true ;
}
return false ;
}
function cfb _mov ( cfb /*:CFBContainer*/ , old _name /*:string*/ , new _name /*:string*/ ) /*:boolean*/ {
init _cfb ( cfb ) ;
var file = CFB . find ( cfb , old _name ) ;
if ( file ) for ( var j = 0 ; j < cfb . FileIndex . length ; ++ j ) if ( cfb . FileIndex [ j ] == file ) {
cfb . FileIndex [ j ] . name = filename ( new _name ) ;
cfb . FullPaths [ j ] = new _name ;
return true ;
}
return false ;
}
function cfb _gc ( cfb /*:CFBContainer*/ ) /*:void*/ { rebuild _cfb ( cfb , true ) ; }
2017-08-09 22:38:23 +00:00
exports . find = find ;
2017-09-22 22:18:51 +00:00
exports . read = read ;
2017-02-03 20:50:45 +00:00
exports . parse = parse ;
2017-09-22 22:18:51 +00:00
exports . write = write ;
exports . writeFile = write _file ;
2017-02-03 20:50:45 +00:00
exports . utils = {
2017-09-22 22:18:51 +00:00
cfb _new : cfb _new ,
cfb _add : cfb _add ,
cfb _del : cfb _del ,
cfb _mov : cfb _mov ,
cfb _gc : cfb _gc ,
2017-02-03 20:50:45 +00:00
ReadShift : ReadShift ,
CheckField : CheckField ,
prep _blob : prep _blob ,
bconcat : bconcat ,
2018-09-06 07:55:28 +00:00
use _zlib : use _zlib ,
_deflateRaw : _deflate ,
_inflateRaw : _inflate ,
2017-02-03 20:50:45 +00:00
consts : consts
} ;
return exports ;
} ) ( ) ;
2018-02-03 20:46:32 +00:00
var _fs ;
2022-05-22 23:51:41 +00:00
function set _fs ( fs ) { _fs = fs ; }
2018-02-03 20:46:32 +00:00
/* normalize data for blob ctor */
function blobify ( data ) {
if ( typeof data === "string" ) return s2ab ( data ) ;
if ( Array . isArray ( data ) ) return a2u ( data ) ;
return data ;
}
/* write or download file */
function write _dl ( fname /*:string*/ , payload /*:any*/ , enc /*:?string*/ ) {
2020-03-15 07:42:05 +00:00
/*global IE_SaveFile, Blob, navigator, saveAs, document, File, chrome */
2018-02-03 20:46:32 +00:00
if ( typeof _fs !== 'undefined' && _fs . writeFileSync ) return enc ? _fs . writeFileSync ( fname , payload , enc ) : _fs . writeFileSync ( fname , payload ) ;
2022-02-14 01:28:13 +00:00
if ( typeof Deno !== 'undefined' ) {
/* in this spot, it's safe to assume typed arrays and TextEncoder/TextDecoder exist */
2022-03-03 08:35:39 +00:00
if ( enc && typeof payload == "string" ) switch ( enc ) {
2022-02-14 01:28:13 +00:00
case "utf8" : payload = new TextEncoder ( enc ) . encode ( payload ) ; break ;
case "binary" : payload = s2ab ( payload ) ; break ;
/* TODO: binary equivalent */
default : throw new Error ( "Unsupported encoding " + enc ) ;
}
return Deno . writeFileSync ( fname , payload ) ;
}
2018-02-03 20:46:32 +00:00
var data = ( enc == "utf8" ) ? utf8write ( payload ) : payload ;
/*:: declare var IE_SaveFile: any; */
if ( typeof IE _SaveFile !== 'undefined' ) return IE _SaveFile ( data , fname ) ;
if ( typeof Blob !== 'undefined' ) {
var blob = new Blob ( [ blobify ( data ) ] , { type : "application/octet-stream" } ) ;
/*:: declare var navigator: any; */
if ( typeof navigator !== 'undefined' && navigator . msSaveBlob ) return navigator . msSaveBlob ( blob , fname ) ;
/*:: declare var saveAs: any; */
if ( typeof saveAs !== 'undefined' ) return saveAs ( blob , fname ) ;
if ( typeof URL !== 'undefined' && typeof document !== 'undefined' && document . createElement && URL . createObjectURL ) {
2018-03-29 04:31:36 +00:00
var url = URL . createObjectURL ( blob ) ;
/*:: declare var chrome: any; */
if ( typeof chrome === 'object' && typeof ( chrome . downloads || { } ) . download == "function" ) {
if ( URL . revokeObjectURL && typeof setTimeout !== 'undefined' ) setTimeout ( function ( ) { URL . revokeObjectURL ( url ) ; } , 60000 ) ;
return chrome . downloads . download ( { url : url , filename : fname , saveAs : true } ) ;
}
2018-02-03 20:46:32 +00:00
var a = document . createElement ( "a" ) ;
if ( a . download != null ) {
/*:: if(document.body == null) throw new Error("unreachable"); */
a . download = fname ; a . href = url ; document . body . appendChild ( a ) ; a . click ( ) ;
/*:: if(document.body == null) throw new Error("unreachable"); */ document . body . removeChild ( a ) ;
if ( URL . revokeObjectURL && typeof setTimeout !== 'undefined' ) setTimeout ( function ( ) { URL . revokeObjectURL ( url ) ; } , 60000 ) ;
return url ;
}
}
}
2018-02-08 18:21:39 +00:00
// $FlowIgnore
if ( typeof $ !== 'undefined' && typeof File !== 'undefined' && typeof Folder !== 'undefined' ) try { // extendscript
// $FlowIgnore
var out = File ( fname ) ; out . open ( "w" ) ; out . encoding = "binary" ;
if ( Array . isArray ( payload ) ) payload = a2s ( payload ) ;
out . write ( payload ) ; out . close ( ) ; return payload ;
} catch ( e ) { if ( ! e . message || ! e . message . match ( /onstruct/ ) ) throw e ; }
throw new Error ( "cannot save file " + fname ) ;
2018-02-03 20:46:32 +00:00
}
2018-02-08 18:21:39 +00:00
/* read binary data from file */
function read _binary ( path /*:string*/ ) {
if ( typeof _fs !== 'undefined' ) return _fs . readFileSync ( path ) ;
2022-02-14 01:28:13 +00:00
if ( typeof Deno !== 'undefined' ) return Deno . readFileSync ( path ) ;
2018-02-08 18:21:39 +00:00
// $FlowIgnore
if ( typeof $ !== 'undefined' && typeof File !== 'undefined' && typeof Folder !== 'undefined' ) try { // extendscript
// $FlowIgnore
var infile = File ( path ) ; infile . open ( "r" ) ; infile . encoding = "binary" ;
var data = infile . read ( ) ; infile . close ( ) ;
return data ;
} catch ( e ) { if ( ! e . message || ! e . message . match ( /onstruct/ ) ) throw e ; }
throw new Error ( "Cannot access file " + path ) ;
}
2018-02-28 10:41:49 +00:00
function keys ( o /*:any*/ ) /*:Array<any>*/ {
var ks = Object . keys ( o ) , o2 = [ ] ;
2020-03-15 07:42:05 +00:00
for ( var i = 0 ; i < ks . length ; ++ i ) if ( Object . prototype . hasOwnProperty . call ( o , ks [ i ] ) ) o2 . push ( ks [ i ] ) ;
2018-02-28 10:41:49 +00:00
return o2 ;
}
2017-02-03 20:50:45 +00:00
2017-02-10 19:23:01 +00:00
function evert _key ( obj /*:any*/ , key /*:string*/ ) /*:EvertType*/ {
var o = ( [ ] /*:any*/ ) , K = keys ( obj ) ;
2018-02-14 20:06:35 +00:00
for ( var i = 0 ; i !== K . length ; ++ i ) if ( o [ obj [ K [ i ] ] [ key ] ] == null ) o [ obj [ K [ i ] ] [ key ] ] = K [ i ] ;
2017-02-03 20:50:45 +00:00
return o ;
}
2017-02-10 19:23:01 +00:00
function evert ( obj /*:any*/ ) /*:EvertType*/ {
var o = ( [ ] /*:any*/ ) , K = keys ( obj ) ;
2017-02-03 20:50:45 +00:00
for ( var i = 0 ; i !== K . length ; ++ i ) o [ obj [ K [ i ] ] ] = K [ i ] ;
return o ;
}
2017-02-10 19:23:01 +00:00
function evert _num ( obj /*:any*/ ) /*:EvertNumType*/ {
var o = ( [ ] /*:any*/ ) , K = keys ( obj ) ;
2017-02-03 20:50:45 +00:00
for ( var i = 0 ; i !== K . length ; ++ i ) o [ obj [ K [ i ] ] ] = parseInt ( K [ i ] , 10 ) ;
return o ;
}
2017-02-10 19:23:01 +00:00
function evert _arr ( obj /*:any*/ ) /*:EvertArrType*/ {
var o /*:EvertArrType*/ = ( [ ] /*:any*/ ) , K = keys ( obj ) ;
2017-02-03 20:50:45 +00:00
for ( var i = 0 ; i !== K . length ; ++ i ) {
if ( o [ obj [ K [ i ] ] ] == null ) o [ obj [ K [ i ] ] ] = [ ] ;
o [ obj [ K [ i ] ] ] . push ( K [ i ] ) ;
}
return o ;
}
2022-03-20 05:29:24 +00:00
var basedate = /*#__PURE__*/ new Date ( 1899 , 11 , 30 , 0 , 0 , 0 ) ; // 2209161600000
2017-03-09 05:24:32 +00:00
function datenum ( v /*:Date*/ , date1904 /*:?boolean*/ ) /*:number*/ {
2022-03-20 05:29:24 +00:00
var epoch = /*#__PURE__*/ v . getTime ( ) ;
2017-08-05 06:32:57 +00:00
if ( date1904 ) epoch -= 1462 * 24 * 60 * 60 * 1000 ;
2022-03-20 05:29:24 +00:00
var dnthresh = /*#__PURE__*/ basedate . getTime ( ) + ( /*#__PURE__*/ v . getTimezoneOffset ( ) - /*#__PURE__*/ basedate . getTimezoneOffset ( ) ) * 60000 ;
2017-06-01 21:22:11 +00:00
return ( epoch - dnthresh ) / ( 24 * 60 * 60 * 1000 ) ;
2017-02-03 20:50:45 +00:00
}
2022-03-20 05:29:24 +00:00
var refdate = /*#__PURE__*/ new Date ( ) ;
var dnthresh = /*#__PURE__*/ basedate . getTime ( ) + ( /*#__PURE__*/ refdate . getTimezoneOffset ( ) - /*#__PURE__*/ basedate . getTimezoneOffset ( ) ) * 60000 ;
var refoffset = /*#__PURE__*/ refdate . getTimezoneOffset ( ) ;
2017-03-25 01:36:40 +00:00
function numdate ( v /*:number*/ ) /*:Date*/ {
2017-06-01 21:22:11 +00:00
var out = new Date ( ) ;
out . setTime ( v * 24 * 60 * 60 * 1000 + dnthresh ) ;
2020-03-20 06:44:37 +00:00
if ( out . getTimezoneOffset ( ) !== refoffset ) {
out . setTime ( out . getTime ( ) + ( out . getTimezoneOffset ( ) - refoffset ) * 60000 ) ;
}
2017-06-01 21:22:11 +00:00
return out ;
2017-03-25 01:36:40 +00:00
}
2017-02-03 20:50:45 +00:00
2017-03-10 01:09:18 +00:00
/* ISO 8601 Duration */
function parse _isodur ( s ) {
var sec = 0 , mt = 0 , time = false ;
var m = s . match ( /P([0-9\.]+Y)?([0-9\.]+M)?([0-9\.]+D)?T([0-9\.]+H)?([0-9\.]+M)?([0-9\.]+S)?/ ) ;
if ( ! m ) throw new Error ( "|" + s + "| is not an ISO8601 Duration" ) ;
for ( var i = 1 ; i != m . length ; ++ i ) {
if ( ! m [ i ] ) continue ;
mt = 1 ;
if ( i > 3 ) time = true ;
2018-01-11 08:01:25 +00:00
switch ( m [ i ] . slice ( m [ i ] . length - 1 ) ) {
2017-03-10 01:09:18 +00:00
case 'Y' :
2018-01-11 08:01:25 +00:00
throw new Error ( "Unsupported ISO Duration Field: " + m [ i ] . slice ( m [ i ] . length - 1 ) ) ;
2017-03-10 01:09:18 +00:00
case 'D' : mt *= 24 ;
/* falls through */
case 'H' : mt *= 60 ;
/* falls through */
case 'M' :
if ( ! time ) throw new Error ( "Unsupported ISO Duration Field: M" ) ;
else mt *= 60 ;
/* falls through */
case 'S' : break ;
}
sec += mt * parseInt ( m [ i ] , 10 ) ;
}
return sec ;
}
2022-03-20 05:29:24 +00:00
var good _pd _date _1 = /*#__PURE__*/ new Date ( '2017-02-19T19:06:09.000Z' ) ;
var good _pd _date = /*#__PURE__*/ isNaN ( /*#__PURE__*/ good _pd _date _1 . getFullYear ( ) ) ? /*#__PURE__*/ new Date ( '2/19/17' ) : good _pd _date _1 ;
var good _pd = /*#__PURE__*/ good _pd _date . getFullYear ( ) == 2017 ;
2017-08-10 23:46:34 +00:00
/* parses a date as a local date */
2017-06-01 21:22:11 +00:00
function parseDate ( str /*:string|Date*/ , fixdate /*:?number*/ ) /*:Date*/ {
2017-05-17 04:23:36 +00:00
var d = new Date ( str ) ;
2017-06-01 21:22:11 +00:00
if ( good _pd ) {
/*:: if(fixdate == null) fixdate = 0; */
if ( fixdate > 0 ) d . setTime ( d . getTime ( ) + d . getTimezoneOffset ( ) * 60 * 1000 ) ;
else if ( fixdate < 0 ) d . setTime ( d . getTime ( ) - d . getTimezoneOffset ( ) * 60 * 1000 ) ;
return d ;
}
2017-03-23 01:18:40 +00:00
if ( str instanceof Date ) return str ;
2017-05-17 04:23:36 +00:00
if ( good _pd _date . getFullYear ( ) == 1917 && ! isNaN ( d . getFullYear ( ) ) ) {
var s = d . getFullYear ( ) ;
if ( str . indexOf ( "" + s ) > - 1 ) return d ;
d . setFullYear ( d . getFullYear ( ) + 100 ) ; return d ;
}
2017-03-23 01:18:40 +00:00
var n = str . match ( /\d+/g ) || [ "2017" , "2" , "19" , "0" , "0" , "0" ] ;
2017-08-10 23:46:34 +00:00
var out = new Date ( + n [ 0 ] , + n [ 1 ] - 1 , + n [ 2 ] , ( + n [ 3 ] || 0 ) , ( + n [ 4 ] || 0 ) , ( + n [ 5 ] || 0 ) ) ;
if ( str . indexOf ( "Z" ) > - 1 ) out = new Date ( out . getTime ( ) - out . getTimezoneOffset ( ) * 60 * 1000 ) ;
return out ;
2017-03-23 01:18:40 +00:00
}
2022-02-10 12:40:50 +00:00
function cc2str ( arr /*:Array<number>*/ , debomit ) /*:string*/ {
if ( has _buf && Buffer . isBuffer ( arr ) ) {
if ( debomit ) {
2022-03-20 05:29:24 +00:00
if ( arr [ 0 ] == 0xFF && arr [ 1 ] == 0xFE ) return utf8write ( arr . slice ( 2 ) . toString ( "utf16le" ) ) ;
if ( arr [ 1 ] == 0xFE && arr [ 2 ] == 0xFF ) return utf8write ( utf16beread ( arr . slice ( 2 ) . toString ( "binary" ) ) ) ;
2022-02-10 12:40:50 +00:00
}
return arr . toString ( "binary" ) ;
}
2022-03-20 05:29:24 +00:00
if ( typeof TextDecoder !== "undefined" ) try {
if ( debomit ) {
if ( arr [ 0 ] == 0xFF && arr [ 1 ] == 0xFE ) return utf8write ( new TextDecoder ( "utf-16le" ) . decode ( arr . slice ( 2 ) ) ) ;
if ( arr [ 0 ] == 0xFE && arr [ 1 ] == 0xFF ) return utf8write ( new TextDecoder ( "utf-16be" ) . decode ( arr . slice ( 2 ) ) ) ;
}
var rev = {
"\u20ac" : "\x80" , "\u201a" : "\x82" , "\u0192" : "\x83" , "\u201e" : "\x84" ,
"\u2026" : "\x85" , "\u2020" : "\x86" , "\u2021" : "\x87" , "\u02c6" : "\x88" ,
"\u2030" : "\x89" , "\u0160" : "\x8a" , "\u2039" : "\x8b" , "\u0152" : "\x8c" ,
"\u017d" : "\x8e" , "\u2018" : "\x91" , "\u2019" : "\x92" , "\u201c" : "\x93" ,
"\u201d" : "\x94" , "\u2022" : "\x95" , "\u2013" : "\x96" , "\u2014" : "\x97" ,
"\u02dc" : "\x98" , "\u2122" : "\x99" , "\u0161" : "\x9a" , "\u203a" : "\x9b" ,
"\u0153" : "\x9c" , "\u017e" : "\x9e" , "\u0178" : "\x9f"
} ;
if ( Array . isArray ( arr ) ) arr = new Uint8Array ( arr ) ;
return new TextDecoder ( "latin1" ) . decode ( arr ) . replace ( /[€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ]/g , function ( c ) { return rev [ c ] || c ; } ) ;
} catch ( e ) { }
2022-02-10 12:40:50 +00:00
var o = [ ] ;
for ( var i = 0 ; i != arr . length ; ++ i ) o . push ( String . fromCharCode ( arr [ i ] ) ) ;
return o . join ( "" ) ;
2017-02-03 20:50:45 +00:00
}
2017-02-19 20:36:32 +00:00
function dup ( o /*:any*/ ) /*:any*/ {
2017-03-20 09:02:25 +00:00
if ( typeof JSON != 'undefined' && ! Array . isArray ( o ) ) return JSON . parse ( JSON . stringify ( o ) ) ;
2017-03-19 23:46:41 +00:00
if ( typeof o != 'object' || o == null ) return o ;
2018-01-11 08:01:25 +00:00
if ( o instanceof Date ) return new Date ( o . getTime ( ) ) ;
2017-02-19 20:36:32 +00:00
var out = { } ;
2020-03-15 07:42:05 +00:00
for ( var k in o ) if ( Object . prototype . hasOwnProperty . call ( o , k ) ) out [ k ] = dup ( o [ k ] ) ;
2017-02-19 20:36:32 +00:00
return out ;
}
function fill ( c /*:string*/ , l /*:number*/ ) /*:string*/ { var o = "" ; while ( o . length < l ) o += c ; return o ; }
2017-05-11 07:29:59 +00:00
/* TODO: stress test */
2017-08-09 22:38:23 +00:00
function fuzzynum ( s /*:string*/ ) /*:number*/ {
var v /*:number*/ = Number ( s ) ;
2022-03-16 03:18:09 +00:00
if ( ! isNaN ( v ) ) return isFinite ( v ) ? v : NaN ;
2020-09-11 08:38:33 +00:00
if ( ! /\d/ . test ( s ) ) return v ;
2017-08-10 23:46:34 +00:00
var wt = 1 ;
var ss = s . replace ( /([\d]),([\d])/g , "$1$2" ) . replace ( /[$]/g , "" ) . replace ( /[%]/g , function ( ) { wt *= 100 ; return "" ; } ) ;
if ( ! isNaN ( v = Number ( ss ) ) ) return v / wt ;
ss = ss . replace ( /[(](.*)[)]/ , function ( $$ , $1 ) { wt = - wt ; return $1 ; } ) ;
if ( ! isNaN ( v = Number ( ss ) ) ) return v / wt ;
2017-08-09 22:38:23 +00:00
return v ;
}
2022-05-22 23:51:41 +00:00
/* NOTE: Chrome rejects bare times like 1:23 PM */
var FDRE1 = /^(0?\d|1[0-2])(?:|:([0-5]?\d)(?:|(\.\d+)(?:|:([0-5]?\d))|:([0-5]?\d)(|\.\d+)))([ap])m?/ ;
function fuzzytime1 ( M ) /*:Date*/ {
/* TODO: 1904 adjustment */
if ( ! M [ 2 ] ) return new Date ( 1900 , 0 , 0 , ( + M [ 1 ] % 12 ) + ( M [ 7 ] == "p" ? 12 : 0 ) , 0 , 0 , 0 ) ;
if ( M [ 3 ] ) {
if ( M [ 4 ] ) return new Date ( 1900 , 0 , 0 , ( + M [ 1 ] % 12 ) + ( M [ 7 ] == "p" ? 12 : 0 ) , + M [ 2 ] , + M [ 4 ] , parseFloat ( M [ 3 ] ) * 1000 ) ;
else return new Date ( 1900 , 0 , 0 , ( M [ 7 ] == "p" ? 12 : 0 ) , + M [ 1 ] , + M [ 2 ] , parseFloat ( M [ 3 ] ) * 1000 ) ;
}
else if ( M [ 5 ] ) return new Date ( 1900 , 0 , 0 , ( + M [ 1 ] % 12 ) + ( M [ 7 ] == "p" ? 12 : 0 ) , + M [ 2 ] , + M [ 5 ] , M [ 6 ] ? parseFloat ( M [ 6 ] ) * 1000 : 0 ) ;
else return new Date ( 1900 , 0 , 0 , ( + M [ 1 ] % 12 ) + ( M [ 7 ] == "p" ? 12 : 0 ) , + M [ 2 ] , 0 , 0 ) ;
}
2022-02-14 01:28:13 +00:00
var lower _months = [ 'january' , 'february' , 'march' , 'april' , 'may' , 'june' , 'july' , 'august' , 'september' , 'october' , 'november' , 'december' ] ;
2017-05-11 07:29:59 +00:00
function fuzzydate ( s /*:string*/ ) /*:Date*/ {
2022-05-22 23:51:41 +00:00
var lower = s . toLowerCase ( ) ;
var lnos = lower . replace ( /\s+/g , "" ) ;
var M = lnos . match ( FDRE1 ) ;
if ( M ) return fuzzytime1 ( M ) ;
2017-05-11 07:29:59 +00:00
var o = new Date ( s ) , n = new Date ( NaN ) ;
var y = o . getYear ( ) , m = o . getMonth ( ) , d = o . getDate ( ) ;
if ( isNaN ( d ) ) return n ;
2022-02-14 01:28:13 +00:00
if ( lower . match ( /jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec/ ) ) {
lower = lower . replace ( /[^a-z]/g , "" ) . replace ( /([^a-z]|^)[ap]m?([^a-z]|$)/ , "" ) ;
if ( lower . length > 3 && lower _months . indexOf ( lower ) == - 1 ) return n ;
2022-05-22 23:51:41 +00:00
} else if ( lower . replace ( /[ap]m?/ , "" ) . match ( /[a-z]/ ) ) return n ;
2017-05-11 07:29:59 +00:00
if ( y < 0 || y > 8099 ) return n ;
if ( ( m > 0 || d > 1 ) && y != 101 ) return o ;
2017-08-17 15:59:17 +00:00
if ( s . match ( /[^-0-9:,\/\\]/ ) ) return n ;
return o ;
2017-05-11 07:29:59 +00:00
}
2022-03-20 05:29:24 +00:00
var split _regex = /*#__PURE__*/ ( function ( ) {
var safe _split _regex = "abacaba" . split ( /(:?b)/i ) . length == 5 ;
return function split _regex ( str /*:string*/ , re , def /*:string*/ ) /*:Array<string>*/ {
if ( safe _split _regex || typeof re == "string" ) return str . split ( re ) ;
var p = str . split ( re ) , o = [ p [ 0 ] ] ;
for ( var i = 1 ; i < p . length ; ++ i ) { o . push ( def ) ; o . push ( p [ i ] ) ; }
return o ;
} ;
} ) ( ) ;
2017-02-10 19:23:01 +00:00
function getdatastr ( data ) /*:?string*/ {
2017-02-03 20:50:45 +00:00
if ( ! data ) return null ;
2022-02-10 12:40:50 +00:00
if ( data . content && data . type ) return cc2str ( data . content , true ) ;
2017-02-24 10:33:01 +00:00
if ( data . data ) return debom ( data . data ) ;
if ( data . asNodeBuffer && has _buf ) return debom ( data . asNodeBuffer ( ) . toString ( 'binary' ) ) ;
if ( data . asBinary ) return debom ( data . asBinary ( ) ) ;
if ( data . _data && data . _data . getContent ) return debom ( cc2str ( Array . prototype . slice . call ( data . _data . getContent ( ) , 0 ) ) ) ;
2017-02-03 20:50:45 +00:00
return null ;
}
2017-02-10 19:23:01 +00:00
function getdatabin ( data ) {
if ( ! data ) return null ;
if ( data . data ) return char _codes ( data . data ) ;
if ( data . asNodeBuffer && has _buf ) return data . asNodeBuffer ( ) ;
2017-02-22 06:57:59 +00:00
if ( data . _data && data . _data . getContent ) {
var o = data . _data . getContent ( ) ;
2017-12-30 05:40:35 +00:00
if ( typeof o == "string" ) return char _codes ( o ) ;
2017-02-22 06:57:59 +00:00
return Array . prototype . slice . call ( o ) ;
}
2019-08-04 19:50:49 +00:00
if ( data . content && data . type ) return data . content ;
2017-02-10 19:23:01 +00:00
return null ;
}
2017-02-22 06:57:59 +00:00
function getdata ( data ) { return ( data && data . name . slice ( - 4 ) === ".bin" ) ? getdatabin ( data ) : getdatastr ( data ) ; }
2017-02-10 19:23:01 +00:00
2017-02-24 10:33:01 +00:00
/* Part 2 Section 10.1.2 "Mapping Content Types" Names are case-insensitive */
2017-03-10 01:09:18 +00:00
/* OASIS does not comment on filename case sensitivity */
2017-02-10 19:23:01 +00:00
function safegetzipfile ( zip , file /*:string*/ ) {
2019-08-04 19:50:49 +00:00
var k = zip . FullPaths || keys ( zip . files ) ;
2021-10-13 07:20:25 +00:00
var f = file . toLowerCase ( ) . replace ( /[\/]/g , '\\' ) , g = f . replace ( /\\/g , '\/' ) ;
2017-02-24 10:33:01 +00:00
for ( var i = 0 ; i < k . length ; ++ i ) {
2021-10-13 07:20:25 +00:00
var n = k [ i ] . replace ( /^Root Entry[\/]/ , "" ) . toLowerCase ( ) ;
if ( f == n || g == n ) return zip . files ? zip . files [ k [ i ] ] : zip . FileIndex [ i ] ;
2017-02-24 10:33:01 +00:00
}
2017-02-03 20:50:45 +00:00
return null ;
}
2017-02-10 19:23:01 +00:00
function getzipfile ( zip , file /*:string*/ ) {
2017-02-03 20:50:45 +00:00
var o = safegetzipfile ( zip , file ) ;
if ( o == null ) throw new Error ( "Cannot find file " + file + " in zip" ) ;
return o ;
}
2017-09-30 06:18:11 +00:00
function getzipdata ( zip , file /*:string*/ , safe /*:?boolean*/ ) /*:any*/ {
2017-02-03 20:50:45 +00:00
if ( ! safe ) return getdata ( getzipfile ( zip , file ) ) ;
if ( ! file ) return null ;
try { return getzipdata ( zip , file ) ; } catch ( e ) { return null ; }
}
2017-02-10 19:23:01 +00:00
function getzipstr ( zip , file /*:string*/ , safe /*:?boolean*/ ) /*:?string*/ {
if ( ! safe ) return getdatastr ( getzipfile ( zip , file ) ) ;
if ( ! file ) return null ;
try { return getzipstr ( zip , file ) ; } catch ( e ) { return null ; }
}
2022-02-01 05:58:45 +00:00
function getzipbin ( zip , file /*:string*/ , safe /*:?boolean*/ ) /*:any*/ {
if ( ! safe ) return getdatabin ( getzipfile ( zip , file ) ) ;
if ( ! file ) return null ;
try { return getzipbin ( zip , file ) ; } catch ( e ) { return null ; }
}
2018-02-28 10:41:49 +00:00
function zipentries ( zip ) {
2019-08-04 19:50:49 +00:00
var k = zip . FullPaths || keys ( zip . files ) , o = [ ] ;
2022-02-14 01:28:13 +00:00
for ( var i = 0 ; i < k . length ; ++ i ) if ( k [ i ] . slice ( - 1 ) != '/' ) o . push ( k [ i ] . replace ( /^Root Entry[\/]/ , "" ) ) ;
2018-02-28 10:41:49 +00:00
return o . sort ( ) ;
}
2019-08-04 19:50:49 +00:00
function zip _add _file ( zip , path , content ) {
2022-02-10 12:40:50 +00:00
if ( zip . FullPaths ) {
if ( typeof content == "string" ) {
var res ;
if ( has _buf ) res = Buffer _from ( content ) ;
/* TODO: investigate performance in Edge 13 */
//else if(typeof TextEncoder !== "undefined") res = new TextEncoder().encode(content);
else res = utf8decode ( content ) ;
return CFB . utils . cfb _add ( zip , path , res ) ;
}
CFB . utils . cfb _add ( zip , path , content ) ;
2017-02-03 20:50:45 +00:00
}
2022-02-10 12:40:50 +00:00
else zip . file ( path , content ) ;
2017-02-03 20:50:45 +00:00
}
2017-03-27 21:35:15 +00:00
2022-02-10 12:40:50 +00:00
function zip _new ( ) { return CFB . utils . cfb _new ( ) ; }
2019-08-04 19:50:49 +00:00
2019-11-01 03:09:14 +00:00
function zip _read ( d , o ) {
2022-02-10 12:40:50 +00:00
switch ( o . type ) {
case "base64" : return CFB . read ( d , { type : "base64" } ) ;
case "binary" : return CFB . read ( d , { type : "binary" } ) ;
case "buffer" : case "array" : return CFB . read ( d , { type : "buffer" } ) ;
2019-11-01 03:09:14 +00:00
}
2022-02-10 12:40:50 +00:00
throw new Error ( "Unrecognized type " + o . type ) ;
2019-11-01 03:09:14 +00:00
}
2017-03-27 21:35:15 +00:00
function resolve _path ( path /*:string*/ , base /*:string*/ ) /*:string*/ {
2019-11-01 03:09:14 +00:00
if ( path . charAt ( 0 ) == "/" ) return path . slice ( 1 ) ;
2017-03-27 21:35:15 +00:00
var result = base . split ( '/' ) ;
if ( base . slice ( - 1 ) != "/" ) result . pop ( ) ; // folder path
var target = path . split ( '/' ) ;
while ( target . length !== 0 ) {
var step = target . shift ( ) ;
if ( step === '..' ) result . pop ( ) ;
else if ( step !== '.' ) result . push ( step ) ;
}
return result . join ( '/' ) ;
}
2017-09-22 22:18:51 +00:00
var XML _HEADER = '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>\r\n' ;
2017-12-30 05:40:35 +00:00
var attregexg = /([^"\s?>\/]+)\s*=\s*((?:")([^"]*)(?:")|(?:')([^']*)(?:')|([^'">\s]+))/g ;
2022-03-20 05:29:24 +00:00
var tagregex1 = /<[\/\?]?[a-zA-Z0-9:_-]+(?:\s+[^"\s?>\/]+\s*=\s*(?:"[^"]*"|'[^']*'|[^'">\s=]+))*\s*[\/\?]?>/mg , tagregex2 = /<[^>]*>/g ;
var tagregex = /*#__PURE__*/ XML _HEADER . match ( tagregex1 ) ? tagregex1 : tagregex2 ;
2017-02-03 20:50:45 +00:00
var nsregex = /<\w*:/ , nsregex2 = /<(\/?)\w+:/ ;
2019-11-15 01:46:49 +00:00
function parsexmltag ( tag /*:string*/ , skip _root /*:?boolean*/ , skip _LC /*:?boolean*/ ) /*:any*/ {
2017-03-22 07:50:11 +00:00
var z = ( { } /*:any*/ ) ;
2017-02-03 20:50:45 +00:00
var eq = 0 , c = 0 ;
for ( ; eq !== tag . length ; ++ eq ) if ( ( c = tag . charCodeAt ( eq ) ) === 32 || c === 10 || c === 13 ) break ;
2018-01-11 08:01:25 +00:00
if ( ! skip _root ) z [ 0 ] = tag . slice ( 0 , eq ) ;
2017-02-03 20:50:45 +00:00
if ( eq === tag . length ) return z ;
2017-04-16 04:32:13 +00:00
var m = tag . match ( attregexg ) , j = 0 , v = "" , i = 0 , q = "" , cc = "" , quot = 1 ;
2017-02-03 20:50:45 +00:00
if ( m ) for ( i = 0 ; i != m . length ; ++ i ) {
cc = m [ i ] ;
for ( c = 0 ; c != cc . length ; ++ c ) if ( cc . charCodeAt ( c ) === 61 ) break ;
2018-01-11 08:01:25 +00:00
q = cc . slice ( 0 , c ) . trim ( ) ;
2017-12-30 05:40:35 +00:00
while ( cc . charCodeAt ( c + 1 ) == 32 ) ++ c ;
2017-04-16 04:32:13 +00:00
quot = ( ( eq = cc . charCodeAt ( c + 1 ) ) == 34 || eq == 39 ) ? 1 : 0 ;
2018-01-11 08:01:25 +00:00
v = cc . slice ( c + 1 + quot , cc . length - quot ) ;
2017-02-03 20:50:45 +00:00
for ( j = 0 ; j != q . length ; ++ j ) if ( q . charCodeAt ( j ) === 58 ) break ;
2017-03-10 01:09:18 +00:00
if ( j === q . length ) {
2018-01-11 08:01:25 +00:00
if ( q . indexOf ( "_" ) > 0 ) q = q . slice ( 0 , q . indexOf ( "_" ) ) ; // from ods
2017-03-10 01:09:18 +00:00
z [ q ] = v ;
2019-11-15 01:46:49 +00:00
if ( ! skip _LC ) z [ q . toLowerCase ( ) ] = v ;
2017-03-10 01:09:18 +00:00
}
else {
2018-01-11 08:01:25 +00:00
var k = ( j === 5 && q . slice ( 0 , 5 ) === "xmlns" ? "xmlns" : "" ) + q . slice ( j + 1 ) ;
if ( z [ k ] && q . slice ( j - 3 , j ) == "ext" ) continue ; // from ods
2017-03-10 01:09:18 +00:00
z [ k ] = v ;
2019-11-15 01:46:49 +00:00
if ( ! skip _LC ) z [ k . toLowerCase ( ) ] = v ;
2017-03-10 01:09:18 +00:00
}
2017-02-03 20:50:45 +00:00
}
return z ;
}
2017-02-10 19:23:01 +00:00
function strip _ns ( x /*:string*/ ) /*:string*/ { return x . replace ( nsregex2 , "<$1" ) ; }
2017-02-03 20:50:45 +00:00
var encodings = {
'"' : '"' ,
''' : "'" ,
'>' : '>' ,
'<' : '<' ,
'&' : '&'
} ;
2022-03-20 05:29:24 +00:00
var rencoding = /*#__PURE__*/ evert ( encodings ) ;
2017-05-09 18:07:57 +00:00
//var rencstr = "&<>'\"".split("");
2017-02-03 20:50:45 +00:00
// TODO: CP remap (need to read file version to determine OS)
2022-03-12 14:05:57 +00:00
var unescapexml /*:StringConv*/ = /*#__PURE__*/ ( function ( ) {
2017-03-06 02:27:21 +00:00
/* 22.4.2.4 bstr (Basic String) */
2020-03-15 07:42:05 +00:00
var encregex = /&(?:quot|apos|gt|lt|amp|#x?([\da-fA-F]+));/ig , coderegex = /_x([\da-fA-F]{4})_/ig ;
2022-04-25 09:02:14 +00:00
function raw _unescapexml ( text /*:string*/ ) /*:string*/ {
2017-08-10 23:46:34 +00:00
var s = text + '' , i = s . indexOf ( "<![CDATA[" ) ;
if ( i == - 1 ) return s . replace ( encregex , function ( $$ , $1 ) { return encodings [ $$ ] || String . fromCharCode ( parseInt ( $1 , $$ . indexOf ( "x" ) > - 1 ? 16 : 10 ) ) || $$ ; } ) . replace ( coderegex , function ( m , c ) { return String . fromCharCode ( parseInt ( c , 16 ) ) ; } ) ;
var j = s . indexOf ( "]]>" ) ;
2022-04-25 09:02:14 +00:00
return raw _unescapexml ( s . slice ( 0 , i ) ) + s . slice ( i + 9 , j ) + raw _unescapexml ( s . slice ( j + 3 ) ) ;
}
return function unescapexml ( text /*:string*/ , xlsx /*:boolean*/ ) {
var out = raw _unescapexml ( text ) ;
return xlsx ? out . replace ( /\r\n/g , "\n" ) : out ;
2017-02-03 20:50:45 +00:00
} ;
} ) ( ) ;
2022-04-25 09:02:14 +00:00
var decregex = /[&<>'"]/g , charegex = /[\u0000-\u0008\u000b-\u001f\uFFFE-\uFFFF]/g ;
2018-01-23 09:07:51 +00:00
function escapexml ( text /*:string*/ ) /*:string*/ {
2017-02-03 20:50:45 +00:00
var s = text + '' ;
2017-02-22 06:57:59 +00:00
return s . replace ( decregex , function ( y ) { return rencoding [ y ] ; } ) . replace ( charegex , function ( s ) { return "_x" + ( "000" + s . charCodeAt ( 0 ) . toString ( 16 ) ) . slice ( - 4 ) + "_" ; } ) ;
2017-02-03 20:50:45 +00:00
}
2017-03-14 08:19:51 +00:00
function escapexmltag ( text /*:string*/ ) /*:string*/ { return escapexml ( text ) . replace ( / /g , "_x0020_" ) ; }
2017-02-03 20:50:45 +00:00
2017-04-16 04:32:13 +00:00
var htmlcharegex = /[\u0000-\u001f]/g ;
2018-01-09 07:36:02 +00:00
function escapehtml ( text /*:string*/ ) /*:string*/ {
2017-04-13 18:28:16 +00:00
var s = text + '' ;
2018-08-25 23:44:35 +00:00
return s . replace ( decregex , function ( y ) { return rencoding [ y ] ; } ) . replace ( /\n/g , "<br/>" ) . replace ( htmlcharegex , function ( s ) { return "&#x" + ( "000" + s . charCodeAt ( 0 ) . toString ( 16 ) ) . slice ( - 4 ) + ";" ; } ) ;
2017-04-13 18:28:16 +00:00
}
2018-01-09 07:36:02 +00:00
function escapexlml ( text /*:string*/ ) /*:string*/ {
var s = text + '' ;
return s . replace ( decregex , function ( y ) { return rencoding [ y ] ; } ) . replace ( htmlcharegex , function ( s ) { return "&#x" + ( s . charCodeAt ( 0 ) . toString ( 16 ) ) . toUpperCase ( ) + ";" ; } ) ;
}
2017-02-03 20:50:45 +00:00
/* TODO: handle codepages */
2022-03-12 14:05:57 +00:00
var xlml _fixstr /*:StringConv*/ = /*#__PURE__*/ ( function ( ) {
2017-02-03 20:50:45 +00:00
var entregex = /&#(\d+);/g ;
2017-02-10 19:23:01 +00:00
function entrepl ( $$ /*:string*/ , $1 /*:string*/ ) /*:string*/ { return String . fromCharCode ( parseInt ( $1 , 10 ) ) ; }
return function xlml _fixstr ( str /*:string*/ ) /*:string*/ { return str . replace ( entregex , entrepl ) ; } ;
2017-02-03 20:50:45 +00:00
} ) ( ) ;
2022-03-16 03:18:09 +00:00
function xlml _unfixstr ( str /*:string*/ ) /*:string*/ { return str . replace ( /(\r\n|[\r\n])/g , "\ " ) ; }
2017-02-03 20:50:45 +00:00
2022-04-25 09:02:14 +00:00
/* note: xsd:boolean valid values: true / 1 / false / 0 */
2018-01-23 09:07:51 +00:00
function parsexmlbool ( value /*:any*/ ) /*:boolean*/ {
2017-02-03 20:50:45 +00:00
switch ( value ) {
2022-04-25 09:02:14 +00:00
case 1 : case true : case '1' : case 'true' : return true ;
case 0 : case false : case '0' : case 'false' : return false ;
//default: throw new Error("Invalid xsd:boolean " + value);
2017-02-03 20:50:45 +00:00
}
2022-04-25 09:02:14 +00:00
return false ;
2017-02-03 20:50:45 +00:00
}
2022-03-20 05:29:24 +00:00
function utf8reada ( orig /*:string*/ ) /*:string*/ {
2017-02-03 20:50:45 +00:00
var out = "" , i = 0 , c = 0 , d = 0 , e = 0 , f = 0 , w = 0 ;
while ( i < orig . length ) {
c = orig . charCodeAt ( i ++ ) ;
if ( c < 128 ) { out += String . fromCharCode ( c ) ; continue ; }
d = orig . charCodeAt ( i ++ ) ;
2017-07-10 22:18:18 +00:00
if ( c > 191 && c < 224 ) { f = ( ( c & 31 ) << 6 ) ; f |= ( d & 63 ) ; out += String . fromCharCode ( f ) ; continue ; }
2017-02-03 20:50:45 +00:00
e = orig . charCodeAt ( i ++ ) ;
if ( c < 240 ) { out += String . fromCharCode ( ( ( c & 15 ) << 12 ) | ( ( d & 63 ) << 6 ) | ( e & 63 ) ) ; continue ; }
f = orig . charCodeAt ( i ++ ) ;
w = ( ( ( c & 7 ) << 18 ) | ( ( d & 63 ) << 12 ) | ( ( e & 63 ) << 6 ) | ( f & 63 ) ) - 65536 ;
out += String . fromCharCode ( 0xD800 + ( ( w >>> 10 ) & 1023 ) ) ;
out += String . fromCharCode ( 0xDC00 + ( w & 1023 ) ) ;
}
return out ;
2022-03-20 05:29:24 +00:00
}
function utf8readb ( data ) {
var out = new _raw _buf ( 2 * data . length ) , w , i , j = 1 , k = 0 , ww = 0 , c ;
for ( i = 0 ; i < data . length ; i += j ) {
j = 1 ;
if ( ( c = data . charCodeAt ( i ) ) < 128 ) w = c ;
else if ( c < 224 ) { w = ( c & 31 ) * 64 + ( data . charCodeAt ( i + 1 ) & 63 ) ; j = 2 ; }
else if ( c < 240 ) { w = ( c & 15 ) * 4096 + ( data . charCodeAt ( i + 1 ) & 63 ) * 64 + ( data . charCodeAt ( i + 2 ) & 63 ) ; j = 3 ; }
else { j = 4 ;
w = ( c & 7 ) * 262144 + ( data . charCodeAt ( i + 1 ) & 63 ) * 4096 + ( data . charCodeAt ( i + 2 ) & 63 ) * 64 + ( data . charCodeAt ( i + 3 ) & 63 ) ;
w -= 65536 ; ww = 0xD800 + ( ( w >>> 10 ) & 1023 ) ; w = 0xDC00 + ( w & 1023 ) ;
}
if ( ww !== 0 ) { out [ k ++ ] = ww & 255 ; out [ k ++ ] = ww >>> 8 ; ww = 0 ; }
out [ k ++ ] = w % 256 ; out [ k ++ ] = w >>> 8 ;
}
return out . slice ( 0 , k ) . toString ( 'ucs2' ) ;
}
function utf8readc ( data ) { return Buffer _from ( data , 'binary' ) . toString ( 'utf8' ) ; }
2017-02-03 20:50:45 +00:00
2022-03-20 05:29:24 +00:00
var utf8corpus = "foo bar baz\u00e2\u0098\u0083\u00f0\u009f\u008d\u00a3" ;
var utf8read = has _buf && ( /*#__PURE__*/ utf8readc ( utf8corpus ) == /*#__PURE__*/ utf8reada ( utf8corpus ) && utf8readc || /*#__PURE__*/ utf8readb ( utf8corpus ) == /*#__PURE__*/ utf8reada ( utf8corpus ) && utf8readb ) || utf8reada ;
var utf8write /*:StringConv*/ = has _buf ? function ( data ) { return Buffer _from ( data , 'utf8' ) . toString ( "binary" ) ; } : function ( orig /*:string*/ ) /*:string*/ {
2017-10-17 00:14:32 +00:00
var out /*:Array<string>*/ = [ ] , i = 0 , c = 0 , d = 0 ;
2017-09-30 06:18:11 +00:00
while ( i < orig . length ) {
c = orig . charCodeAt ( i ++ ) ;
switch ( true ) {
case c < 128 : out . push ( String . fromCharCode ( c ) ) ; break ;
case c < 2048 :
out . push ( String . fromCharCode ( 192 + ( c >> 6 ) ) ) ;
out . push ( String . fromCharCode ( 128 + ( c & 63 ) ) ) ;
break ;
case c >= 55296 && c < 57344 :
c -= 55296 ; d = orig . charCodeAt ( i ++ ) - 56320 + ( c << 10 ) ;
out . push ( String . fromCharCode ( 240 + ( ( d >> 18 ) & 7 ) ) ) ;
out . push ( String . fromCharCode ( 144 + ( ( d >> 12 ) & 63 ) ) ) ;
out . push ( String . fromCharCode ( 128 + ( ( d >> 6 ) & 63 ) ) ) ;
out . push ( String . fromCharCode ( 128 + ( d & 63 ) ) ) ;
break ;
default :
out . push ( String . fromCharCode ( 224 + ( c >> 12 ) ) ) ;
out . push ( String . fromCharCode ( 128 + ( ( c >> 6 ) & 63 ) ) ) ;
out . push ( String . fromCharCode ( 128 + ( c & 63 ) ) ) ;
}
}
return out . join ( "" ) ;
} ;
2017-02-03 20:50:45 +00:00
// matches <foo>...</foo> extracts content
2022-03-12 14:05:57 +00:00
var matchtag = /*#__PURE__*/ ( function ( ) {
2017-03-12 18:02:43 +00:00
var mtcache /*:{[k:string]:RegExp}*/ = ( { } /*:any*/ ) ;
2017-12-30 05:40:35 +00:00
return function matchtag ( f /*:string*/ , g /*:?string*/ ) /*:RegExp*/ {
2017-02-10 19:23:01 +00:00
var t = f + "|" + ( g || "" ) ;
2017-03-12 18:02:43 +00:00
if ( mtcache [ t ] ) return mtcache [ t ] ;
2017-06-24 06:51:37 +00:00
return ( mtcache [ t ] = new RegExp ( '<(?:\\w+:)?' + f + '(?: xml:space="preserve")?(?:[^>]*)>([\\s\\S]*?)</(?:\\w+:)?' + f + '>' , ( ( g || "" ) /*:any*/ ) ) ) ;
2017-02-03 20:50:45 +00:00
} ;
} ) ( ) ;
2022-03-12 14:05:57 +00:00
var htmldecode /*:{(s:string):string}*/ = /*#__PURE__*/ ( function ( ) {
2017-12-30 05:40:35 +00:00
var entities /*:Array<[RegExp, string]>*/ = [
2017-12-09 07:17:25 +00:00
[ 'nbsp' , ' ' ] , [ 'middot' , '·' ] ,
[ 'quot' , '"' ] , [ 'apos' , "'" ] , [ 'gt' , '>' ] , [ 'lt' , '<' ] , [ 'amp' , '&' ]
2020-03-15 07:42:05 +00:00
] . map ( function ( x /*:[string, string]*/ ) { return [ new RegExp ( '&' + x [ 0 ] + ';' , "ig" ) , x [ 1 ] ] ; } ) ;
2017-12-09 07:17:25 +00:00
return function htmldecode ( str /*:string*/ ) /*:string*/ {
2019-11-01 03:09:14 +00:00
var o = str
// Remove new lines and spaces from start of content
. replace ( /^[\t\n\r ]+/ , "" )
// Remove new lines and spaces from end of content
. replace ( /[\t\n\r ]+$/ , "" )
// Added line which removes any white space characters after and before html tags
. replace ( />\s+/g , ">" ) . replace ( /\s+</g , "<" )
// Replace remaining new lines and spaces with space
. replace ( /[\t\n\r ]+/g , " " )
// Replace <br> tags with new lines
. replace ( /<\s*[bB][rR]\s*\/?>/g , "\n" )
// Strip HTML elements
. replace ( /<[^>]*>/g , "" ) ;
2017-12-09 07:17:25 +00:00
for ( var i = 0 ; i < entities . length ; ++ i ) o = o . replace ( entities [ i ] [ 0 ] , entities [ i ] [ 1 ] ) ;
return o ;
} ;
} ) ( ) ;
2017-09-30 06:18:11 +00:00
2022-03-12 14:05:57 +00:00
var vtregex = /*#__PURE__*/ ( function ( ) { var vt _cache = { } ;
2017-02-03 20:50:45 +00:00
return function vt _regex ( bt ) {
if ( vt _cache [ bt ] !== undefined ) return vt _cache [ bt ] ;
2017-07-05 22:27:54 +00:00
return ( vt _cache [ bt ] = new RegExp ( "<(?:vt:)?" + bt + ">([\\s\\S]*?)</(?:vt:)?" + bt + ">" , 'g' ) ) ;
2017-02-03 20:50:45 +00:00
} ; } ) ( ) ;
2017-07-05 22:27:54 +00:00
var vtvregex = /<\/?(?:vt:)?variant>/g , vtmregex = /<(?:vt:)([^>]*)>([\s\S]*)</ ;
2017-12-30 05:40:35 +00:00
function parseVector ( data /*:string*/ , opts ) /*:Array<{v:string,t:string}>*/ {
2017-02-03 20:50:45 +00:00
var h = parsexmltag ( data ) ;
2017-12-30 05:40:35 +00:00
var matches /*:Array<string>*/ = data . match ( vtregex ( h . baseType ) ) || [ ] ;
var res /*:Array<any>*/ = [ ] ;
2017-08-03 15:51:16 +00:00
if ( matches . length != h . size ) {
if ( opts . WTF ) throw new Error ( "unexpected vector length " + matches . length + " != " + h . size ) ;
return res ;
}
2017-12-30 05:40:35 +00:00
matches . forEach ( function ( x /*:string*/ ) {
2017-02-03 20:50:45 +00:00
var v = x . replace ( vtvregex , "" ) . match ( vtmregex ) ;
2017-12-30 05:40:35 +00:00
if ( v ) res . push ( { v : utf8read ( v [ 2 ] ) , t : v [ 1 ] } ) ;
2017-02-03 20:50:45 +00:00
} ) ;
return res ;
}
var wtregex = /(^\s|\s$|\n)/ ;
2017-12-30 05:40:35 +00:00
function writetag ( f /*:string*/ , g /*:string*/ ) /*:string*/ { return '<' + f + ( g . match ( wtregex ) ? ' xml:space="preserve"' : "" ) + '>' + g + '</' + f + '>' ; }
2017-02-03 20:50:45 +00:00
2017-02-10 19:23:01 +00:00
function wxt _helper ( h ) /*:string*/ { return keys ( h ) . map ( function ( k ) { return " " + k + '="' + h [ k ] + '"' ; } ) . join ( "" ) ; }
2017-12-30 05:40:35 +00:00
function writextag ( f /*:string*/ , g /*:?string*/ , h ) { return '<' + f + ( ( h != null ) ? wxt _helper ( h ) : "" ) + ( ( g != null ) ? ( g . match ( wtregex ) ? ' xml:space="preserve"' : "" ) + '>' + g + '</' + f : "/" ) + '>' ; }
2017-02-03 20:50:45 +00:00
2017-02-10 19:23:01 +00:00
function write _w3cdtf ( d /*:Date*/ , t /*:?boolean*/ ) /*:string*/ { try { return d . toISOString ( ) . replace ( /\.\d*/ , "" ) ; } catch ( e ) { if ( t ) throw e ; } return "" ; }
2017-02-03 20:50:45 +00:00
2020-05-16 19:45:54 +00:00
function write _vt ( s , xlsx /*:?boolean*/ ) /*:string*/ {
2017-02-03 20:50:45 +00:00
switch ( typeof s ) {
2020-05-16 19:45:54 +00:00
case 'string' :
var o = writextag ( 'vt:lpwstr' , escapexml ( s ) ) ;
if ( xlsx ) o = o . replace ( /"/g , "_x0022_" ) ;
return o ;
2019-11-27 09:47:16 +00:00
case 'number' : return writextag ( ( s | 0 ) == s ? 'vt:i4' : 'vt:r8' , escapexml ( String ( s ) ) ) ;
2017-02-03 20:50:45 +00:00
case 'boolean' : return writextag ( 'vt:bool' , s ? 'true' : 'false' ) ;
}
if ( s instanceof Date ) return writextag ( 'vt:filetime' , write _w3cdtf ( s ) ) ;
throw new Error ( "Unable to serialize " + s ) ;
}
2022-03-09 01:44:10 +00:00
function xlml _normalize ( d ) /*:string*/ {
if ( has _buf && /*::typeof Buffer !== "undefined" && d != null && d instanceof Buffer &&*/ Buffer . isBuffer ( d ) ) return d . toString ( 'utf8' ) ;
if ( typeof d === 'string' ) return d ;
/* duktape */
if ( typeof Uint8Array !== 'undefined' && d instanceof Uint8Array ) return utf8read ( a2s ( ab2a ( d ) ) ) ;
throw new Error ( "Bad input format: expected Buffer or string" ) ;
}
/* UOS uses CJK in tags */
var xlmlregex = /<(\/?)([^\s?><!\/:]*:|)([^\s?<>:\/]+)(?:[\s?:\/][^>]*)?>/mg ;
//var xlmlregex = /<(\/?)([a-z0-9]*:|)(\w+)[^>]*>/mg;
2017-02-10 19:23:01 +00:00
var XMLNS = ( {
2022-03-12 14:05:57 +00:00
CORE _PROPS : 'http://schemas.openxmlformats.org/package/2006/metadata/core-properties' ,
CUST _PROPS : "http://schemas.openxmlformats.org/officeDocument/2006/custom-properties" ,
EXT _PROPS : "http://schemas.openxmlformats.org/officeDocument/2006/extended-properties" ,
CT : 'http://schemas.openxmlformats.org/package/2006/content-types' ,
RELS : 'http://schemas.openxmlformats.org/package/2006/relationships' ,
2022-03-16 03:18:09 +00:00
TCMNT : 'http://schemas.microsoft.com/office/spreadsheetml/2018/threadedcomments' ,
2017-02-03 20:50:45 +00:00
'dc' : 'http://purl.org/dc/elements/1.1/' ,
'dcterms' : 'http://purl.org/dc/terms/' ,
'dcmitype' : 'http://purl.org/dc/dcmitype/' ,
'mx' : 'http://schemas.microsoft.com/office/mac/excel/2008/main' ,
'r' : 'http://schemas.openxmlformats.org/officeDocument/2006/relationships' ,
'sjs' : 'http://schemas.openxmlformats.org/package/2006/sheetjs/core-properties' ,
'vt' : 'http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes' ,
'xsi' : 'http://www.w3.org/2001/XMLSchema-instance' ,
'xsd' : 'http://www.w3.org/2001/XMLSchema'
2017-02-10 19:23:01 +00:00
} /*:any*/ ) ;
2017-02-03 20:50:45 +00:00
2022-03-12 14:05:57 +00:00
var XMLNS _main = [
2017-02-03 20:50:45 +00:00
'http://schemas.openxmlformats.org/spreadsheetml/2006/main' ,
'http://purl.oclc.org/ooxml/spreadsheetml/main' ,
'http://schemas.microsoft.com/office/excel/2006/main' ,
'http://schemas.microsoft.com/office/excel/2006/2'
] ;
2017-03-14 08:19:51 +00:00
var XLMLNS = ( {
'o' : 'urn:schemas-microsoft-com:office:office' ,
'x' : 'urn:schemas-microsoft-com:office:excel' ,
'ss' : 'urn:schemas-microsoft-com:office:spreadsheet' ,
'dt' : 'uuid:C2F41010-65B3-11d1-A29F-00AA00C14882' ,
2017-04-02 06:47:25 +00:00
'mv' : 'http://macVmlSchemaUri' ,
'v' : 'urn:schemas-microsoft-com:vml' ,
2017-03-14 08:19:51 +00:00
'html' : 'http://www.w3.org/TR/REC-html40'
} /*:any*/ ) ;
2017-09-30 06:18:11 +00:00
function read _double _le ( b /*:RawBytes|CFBlob*/ , idx /*:number*/ ) /*:number*/ {
2017-02-10 19:23:01 +00:00
var s = 1 - 2 * ( b [ idx + 7 ] >>> 7 ) ;
var e = ( ( b [ idx + 7 ] & 0x7f ) << 4 ) + ( ( b [ idx + 6 ] >>> 4 ) & 0x0f ) ;
var m = ( b [ idx + 6 ] & 0x0f ) ;
for ( var i = 5 ; i >= 0 ; -- i ) m = m * 256 + b [ idx + i ] ;
2018-02-08 18:21:39 +00:00
if ( e == 0x7ff ) return m == 0 ? ( s * Infinity ) : NaN ;
2017-02-10 19:23:01 +00:00
if ( e == 0 ) e = - 1022 ;
else { e -= 1023 ; m += Math . pow ( 2 , 52 ) ; }
return s * Math . pow ( 2 , e - 52 ) * m ;
}
2017-09-30 06:18:11 +00:00
function write _double _le ( b /*:RawBytes|CFBlob*/ , v /*:number*/ , idx /*:number*/ ) {
2018-02-08 18:21:39 +00:00
var bs = ( ( ( ( v < 0 ) || ( 1 / v == - Infinity ) ) ? 1 : 0 ) << 7 ) , e = 0 , m = 0 ;
var av = bs ? ( - v ) : v ;
2017-02-10 19:23:01 +00:00
if ( ! isFinite ( av ) ) { e = 0x7ff ; m = isNaN ( v ) ? 0x6969 : 0 ; }
2017-09-22 22:18:51 +00:00
else if ( av == 0 ) e = m = 0 ;
2017-02-10 19:23:01 +00:00
else {
2017-09-05 05:26:50 +00:00
e = Math . floor ( Math . log ( av ) / Math . LN2 ) ;
m = av * Math . pow ( 2 , 52 - e ) ;
2018-02-08 18:21:39 +00:00
if ( ( e <= - 1023 ) && ( ! isFinite ( m ) || ( m < Math . pow ( 2 , 52 ) ) ) ) { e = - 1022 ; }
2017-02-10 19:23:01 +00:00
else { m -= Math . pow ( 2 , 52 ) ; e += 1023 ; }
}
for ( var i = 0 ; i <= 5 ; ++ i , m /= 256 ) b [ idx + i ] = m & 0xff ;
2018-02-08 18:21:39 +00:00
b [ idx + 6 ] = ( ( e & 0x0f ) << 4 ) | ( m & 0xf ) ;
2017-02-10 19:23:01 +00:00
b [ idx + 7 ] = ( e >> 4 ) | bs ;
2017-02-03 20:50:45 +00:00
}
2022-03-20 05:29:24 +00:00
var _ _ _toBuffer = function ( bufs /*:Array<Array<RawBytes> >*/ ) /*:RawBytes*/ { var x = [ ] , w = 10240 ; for ( var i = 0 ; i < bufs [ 0 ] . length ; ++ i ) if ( bufs [ 0 ] [ i ] ) for ( var j = 0 , L = bufs [ 0 ] [ i ] . length ; j < L ; j += w ) x . push . apply ( x , bufs [ 0 ] [ i ] . slice ( j , j + w ) ) ; return x ; } ;
var _ _toBuffer = has _buf ? function ( bufs ) { return ( bufs [ 0 ] . length > 0 && Buffer . isBuffer ( bufs [ 0 ] [ 0 ] ) ) ? Buffer . concat ( bufs [ 0 ] . map ( function ( x ) { return Buffer . isBuffer ( x ) ? x : Buffer _from ( x ) ; } ) ) : _ _ _toBuffer ( bufs ) ; } : _ _ _toBuffer ;
var _ _ _utf16le = function ( b /*:RawBytes|CFBlob*/ , s /*:number*/ , e /*:number*/ ) /*:string*/ { var ss /*:Array<string>*/ = [ ] ; for ( var i = s ; i < e ; i += 2 ) ss . push ( String . fromCharCode ( _ _readUInt16LE ( b , i ) ) ) ; return ss . join ( "" ) . replace ( chr0 , '' ) ; } ;
var _ _utf16le = has _buf ? function ( b /*:RawBytes|CFBlob*/ , s /*:number*/ , e /*:number*/ ) /*:string*/ { if ( ! Buffer . isBuffer ( b ) /*:: || !(b instanceof Buffer)*/ ) return _ _ _utf16le ( b , s , e ) ; return b . toString ( 'utf16le' , s , e ) . replace ( chr0 , '' ) /*.replace(chr1,'!')*/ ; } : _ _ _utf16le ;
var _ _ _hexlify = function ( b /*:RawBytes|CFBlob*/ , s /*:number*/ , l /*:number*/ ) /*:string*/ { var ss /*:Array<string>*/ = [ ] ; for ( var i = s ; i < s + l ; ++ i ) ss . push ( ( "0" + b [ i ] . toString ( 16 ) ) . slice ( - 2 ) ) ; return ss . join ( "" ) ; } ;
var _ _hexlify = has _buf ? function ( b /*:RawBytes|CFBlob*/ , s /*:number*/ , l /*:number*/ ) /*:string*/ { return Buffer . isBuffer ( b ) /*:: && b instanceof Buffer*/ ? b . toString ( 'hex' , s , s + l ) : _ _ _hexlify ( b , s , l ) ; } : _ _ _hexlify ;
var _ _ _utf8 = function ( b /*:RawBytes|CFBlob*/ , s /*:number*/ , e /*:number*/ ) { var ss = [ ] ; for ( var i = s ; i < e ; i ++ ) ss . push ( String . fromCharCode ( _ _readUInt8 ( b , i ) ) ) ; return ss . join ( "" ) ; } ;
var _ _utf8 = has _buf ? function utf8 _b ( b /*:RawBytes|CFBlob*/ , s /*:number*/ , e /*:number*/ ) { return ( Buffer . isBuffer ( b ) /*:: && (b instanceof Buffer)*/ ) ? b . toString ( 'utf8' , s , e ) : _ _ _utf8 ( b , s , e ) ; } : _ _ _utf8 ;
var _ _ _lpstr = function ( b /*:RawBytes|CFBlob*/ , i /*:number*/ ) { var len = _ _readUInt32LE ( b , i ) ; return len > 0 ? _ _utf8 ( b , i + 4 , i + 4 + len - 1 ) : "" ; } ;
var _ _lpstr = _ _ _lpstr ;
var _ _ _cpstr = function ( b /*:RawBytes|CFBlob*/ , i /*:number*/ ) { var len = _ _readUInt32LE ( b , i ) ; return len > 0 ? _ _utf8 ( b , i + 4 , i + 4 + len - 1 ) : "" ; } ;
var _ _cpstr = _ _ _cpstr ;
var _ _ _lpwstr = function ( b /*:RawBytes|CFBlob*/ , i /*:number*/ ) { var len = 2 * _ _readUInt32LE ( b , i ) ; return len > 0 ? _ _utf8 ( b , i + 4 , i + 4 + len - 1 ) : "" ; } ;
var _ _lpwstr = _ _ _lpwstr ;
var _ _ _lpp4 = function lpp4 _ ( b /*:RawBytes|CFBlob*/ , i /*:number*/ ) { var len = _ _readUInt32LE ( b , i ) ; return len > 0 ? _ _utf16le ( b , i + 4 , i + 4 + len ) : "" ; } ;
var _ _lpp4 = _ _ _lpp4 ;
var _ _ _8lpp4 = function ( b /*:RawBytes|CFBlob*/ , i /*:number*/ ) { var len = _ _readUInt32LE ( b , i ) ; return len > 0 ? _ _utf8 ( b , i + 4 , i + 4 + len ) : "" ; } ;
var _ _8lpp4 = _ _ _8lpp4 ;
var _ _ _double = function ( b /*:RawBytes|CFBlob*/ , idx /*:number*/ ) { return read _double _le ( b , idx ) ; } ;
var _ _double = _ _ _double ;
2022-02-10 12:40:50 +00:00
var is _buf = function is _buf _a ( a ) { return Array . isArray ( a ) || ( typeof Uint8Array !== "undefined" && a instanceof Uint8Array ) ; } ;
2017-09-30 06:18:11 +00:00
if ( has _buf /*:: && typeof Buffer !== 'undefined'*/ ) {
_ _lpstr = function lpstr _b ( b /*:RawBytes|CFBlob*/ , i /*:number*/ ) { if ( ! Buffer . isBuffer ( b ) /*:: || !(b instanceof Buffer)*/ ) return _ _ _lpstr ( b , i ) ; var len = b . readUInt32LE ( i ) ; return len > 0 ? b . toString ( 'utf8' , i + 4 , i + 4 + len - 1 ) : "" ; } ;
2017-12-30 05:40:35 +00:00
_ _cpstr = function cpstr _b ( b /*:RawBytes|CFBlob*/ , i /*:number*/ ) { if ( ! Buffer . isBuffer ( b ) /*:: || !(b instanceof Buffer)*/ ) return _ _ _cpstr ( b , i ) ; var len = b . readUInt32LE ( i ) ; return len > 0 ? b . toString ( 'utf8' , i + 4 , i + 4 + len - 1 ) : "" ; } ;
2017-09-30 06:18:11 +00:00
_ _lpwstr = function lpwstr _b ( b /*:RawBytes|CFBlob*/ , i /*:number*/ ) { if ( ! Buffer . isBuffer ( b ) /*:: || !(b instanceof Buffer)*/ ) return _ _ _lpwstr ( b , i ) ; var len = 2 * b . readUInt32LE ( i ) ; return b . toString ( 'utf16le' , i + 4 , i + 4 + len - 1 ) ; } ;
_ _lpp4 = function lpp4 _b ( b /*:RawBytes|CFBlob*/ , i /*:number*/ ) { if ( ! Buffer . isBuffer ( b ) /*:: || !(b instanceof Buffer)*/ ) return _ _ _lpp4 ( b , i ) ; var len = b . readUInt32LE ( i ) ; return b . toString ( 'utf16le' , i + 4 , i + 4 + len ) ; } ;
_ _8lpp4 = function lpp4 _8b ( b /*:RawBytes|CFBlob*/ , i /*:number*/ ) { if ( ! Buffer . isBuffer ( b ) /*:: || !(b instanceof Buffer)*/ ) return _ _ _8lpp4 ( b , i ) ; var len = b . readUInt32LE ( i ) ; return b . toString ( 'utf8' , i + 4 , i + 4 + len ) ; } ;
_ _double = function double _ ( b /*:RawBytes|CFBlob*/ , i /*:number*/ ) { if ( Buffer . isBuffer ( b ) /*::&& b instanceof Buffer*/ ) return b . readDoubleLE ( i ) ; return _ _ _double ( b , i ) ; } ;
2022-02-10 12:40:50 +00:00
is _buf = function is _buf _b ( a ) { return Buffer . isBuffer ( a ) || Array . isArray ( a ) || ( typeof Uint8Array !== "undefined" && a instanceof Uint8Array ) ; } ;
2017-02-03 20:50:45 +00:00
}
/* from js-xls */
2022-02-14 01:28:13 +00:00
function cpdoit ( ) {
2022-03-12 14:05:57 +00:00
_ _utf16le = function ( b /*:RawBytes|CFBlob*/ , s /*:number*/ , e /*:number*/ ) { return $cptable . utils . decode ( 1200 , b . slice ( s , e ) ) . replace ( chr0 , '' ) ; } ;
_ _utf8 = function ( b /*:RawBytes|CFBlob*/ , s /*:number*/ , e /*:number*/ ) { return $cptable . utils . decode ( 65001 , b . slice ( s , e ) ) ; } ;
_ _lpstr = function ( b /*:RawBytes|CFBlob*/ , i /*:number*/ ) { var len = _ _readUInt32LE ( b , i ) ; return len > 0 ? $cptable . utils . decode ( current _ansi , b . slice ( i + 4 , i + 4 + len - 1 ) ) : "" ; } ;
_ _cpstr = function ( b /*:RawBytes|CFBlob*/ , i /*:number*/ ) { var len = _ _readUInt32LE ( b , i ) ; return len > 0 ? $cptable . utils . decode ( current _codepage , b . slice ( i + 4 , i + 4 + len - 1 ) ) : "" ; } ;
_ _lpwstr = function ( b /*:RawBytes|CFBlob*/ , i /*:number*/ ) { var len = 2 * _ _readUInt32LE ( b , i ) ; return len > 0 ? $cptable . utils . decode ( 1200 , b . slice ( i + 4 , i + 4 + len - 1 ) ) : "" ; } ;
_ _lpp4 = function ( b /*:RawBytes|CFBlob*/ , i /*:number*/ ) { var len = _ _readUInt32LE ( b , i ) ; return len > 0 ? $cptable . utils . decode ( 1200 , b . slice ( i + 4 , i + 4 + len ) ) : "" ; } ;
_ _8lpp4 = function ( b /*:RawBytes|CFBlob*/ , i /*:number*/ ) { var len = _ _readUInt32LE ( b , i ) ; return len > 0 ? $cptable . utils . decode ( 65001 , b . slice ( i + 4 , i + 4 + len ) ) : "" ; } ;
2017-02-03 20:50:45 +00:00
}
2022-03-12 14:05:57 +00:00
if ( typeof $cptable !== 'undefined' ) cpdoit ( ) ;
2017-02-03 20:50:45 +00:00
2017-09-30 06:18:11 +00:00
var _ _readUInt8 = function ( b /*:RawBytes|CFBlob*/ , idx /*:number*/ ) /*:number*/ { return b [ idx ] ; } ;
2018-02-08 18:21:39 +00:00
var _ _readUInt16LE = function ( b /*:RawBytes|CFBlob*/ , idx /*:number*/ ) /*:number*/ { return ( b [ idx + 1 ] * ( 1 << 8 ) ) + b [ idx ] ; } ;
var _ _readInt16LE = function ( b /*:RawBytes|CFBlob*/ , idx /*:number*/ ) /*:number*/ { var u = ( b [ idx + 1 ] * ( 1 << 8 ) ) + b [ idx ] ; return ( u < 0x8000 ) ? u : ( ( 0xffff - u + 1 ) * - 1 ) ; } ;
2017-09-30 06:18:11 +00:00
var _ _readUInt32LE = function ( b /*:RawBytes|CFBlob*/ , idx /*:number*/ ) /*:number*/ { return b [ idx + 3 ] * ( 1 << 24 ) + ( b [ idx + 2 ] << 16 ) + ( b [ idx + 1 ] << 8 ) + b [ idx ] ; } ;
var _ _readInt32LE = function ( b /*:RawBytes|CFBlob*/ , idx /*:number*/ ) /*:number*/ { return ( b [ idx + 3 ] << 24 ) | ( b [ idx + 2 ] << 16 ) | ( b [ idx + 1 ] << 8 ) | b [ idx ] ; } ;
2017-10-17 00:14:32 +00:00
var _ _readInt32BE = function ( b /*:RawBytes|CFBlob*/ , idx /*:number*/ ) /*:number*/ { return ( b [ idx ] << 24 ) | ( b [ idx + 1 ] << 16 ) | ( b [ idx + 2 ] << 8 ) | b [ idx + 3 ] ; } ;
2017-02-03 20:50:45 +00:00
2017-09-30 06:18:11 +00:00
function ReadShift ( size /*:number*/ , t /*:?string*/ ) /*:number|string*/ {
var o = "" , oI /*:: :number = 0*/ , oR , oo = [ ] , w , vv , i , loc ;
2017-02-03 20:50:45 +00:00
switch ( t ) {
case 'dbcs' :
loc = this . l ;
if ( has _buf && Buffer . isBuffer ( this ) ) o = this . slice ( this . l , this . l + 2 * size ) . toString ( "utf16le" ) ;
2018-02-08 18:21:39 +00:00
else for ( i = 0 ; i < size ; ++ i ) { o += String . fromCharCode ( _ _readUInt16LE ( this , loc ) ) ; loc += 2 ; }
2017-02-03 20:50:45 +00:00
size *= 2 ;
break ;
case 'utf8' : o = _ _utf8 ( this , this . l , this . l + size ) ; break ;
case 'utf16le' : size *= 2 ; o = _ _utf16le ( this , this . l , this . l + size ) ; break ;
2017-02-22 06:57:59 +00:00
case 'wstr' :
2022-03-12 14:05:57 +00:00
if ( typeof $cptable !== 'undefined' ) o = $cptable . utils . decode ( current _codepage , this . slice ( this . l , this . l + 2 * size ) ) ;
2017-02-22 06:57:59 +00:00
else return ReadShift . call ( this , size , 'dbcs' ) ;
2017-03-10 08:39:51 +00:00
size = 2 * size ; break ;
2017-02-19 20:36:32 +00:00
2017-02-03 20:50:45 +00:00
/* [MS-OLEDS] 2.1.4 LengthPrefixedAnsiString */
2017-12-30 05:40:35 +00:00
case 'lpstr-ansi' : o = _ _lpstr ( this , this . l ) ; size = 4 + _ _readUInt32LE ( this , this . l ) ; break ;
case 'lpstr-cp' : o = _ _cpstr ( this , this . l ) ; size = 4 + _ _readUInt32LE ( this , this . l ) ; break ;
2017-02-03 20:50:45 +00:00
/* [MS-OLEDS] 2.1.5 LengthPrefixedUnicodeString */
2017-12-30 05:40:35 +00:00
case 'lpwstr' : o = _ _lpwstr ( this , this . l ) ; size = 4 + 2 * _ _readUInt32LE ( this , this . l ) ; break ;
2017-04-13 01:29:38 +00:00
/* [MS-OFFCRYPTO] 2.1.2 Length-Prefixed Padded Unicode String (UNICODE-LP-P4) */
case 'lpp4' : size = 4 + _ _readUInt32LE ( this , this . l ) ; o = _ _lpp4 ( this , this . l ) ; if ( size & 0x02 ) size += 2 ; break ;
/* [MS-OFFCRYPTO] 2.1.3 Length-Prefixed UTF-8 String (UTF-8-LP-P4) */
case '8lpp4' : size = 4 + _ _readUInt32LE ( this , this . l ) ; o = _ _8lpp4 ( this , this . l ) ; if ( size & 0x03 ) size += 4 - ( size & 0x03 ) ; break ;
2017-02-03 20:50:45 +00:00
case 'cstr' : size = 0 ; o = "" ;
while ( ( w = _ _readUInt8 ( this , this . l + size ++ ) ) !== 0 ) oo . push ( _getchar ( w ) ) ;
o = oo . join ( "" ) ; break ;
2017-03-28 22:03:03 +00:00
case '_wstr' : size = 0 ; o = "" ;
2017-02-03 20:50:45 +00:00
while ( ( w = _ _readUInt16LE ( this , this . l + size ) ) !== 0 ) { oo . push ( _getchar ( w ) ) ; size += 2 ; }
size += 2 ; o = oo . join ( "" ) ; break ;
/* sbcs and dbcs support continue records in the SST way TODO codepages */
case 'dbcs-cont' : o = "" ; loc = this . l ;
2018-02-08 18:21:39 +00:00
for ( i = 0 ; i < size ; ++ i ) {
2017-02-03 20:50:45 +00:00
if ( this . lens && this . lens . indexOf ( loc ) !== - 1 ) {
w = _ _readUInt8 ( this , loc ) ;
this . l = loc + 1 ;
vv = ReadShift . call ( this , size - i , w ? 'dbcs-cont' : 'sbcs-cont' ) ;
return oo . join ( "" ) + vv ;
}
oo . push ( _getchar ( _ _readUInt16LE ( this , loc ) ) ) ;
loc += 2 ;
} o = oo . join ( "" ) ; size *= 2 ; break ;
2017-12-04 04:41:41 +00:00
case 'cpstr' :
2022-03-12 14:05:57 +00:00
if ( typeof $cptable !== 'undefined' ) {
o = $cptable . utils . decode ( current _codepage , this . slice ( this . l , this . l + size ) ) ;
2017-12-04 04:41:41 +00:00
break ;
}
/* falls through */
2017-02-03 20:50:45 +00:00
case 'sbcs-cont' : o = "" ; loc = this . l ;
for ( i = 0 ; i != size ; ++ i ) {
if ( this . lens && this . lens . indexOf ( loc ) !== - 1 ) {
w = _ _readUInt8 ( this , loc ) ;
this . l = loc + 1 ;
vv = ReadShift . call ( this , size - i , w ? 'dbcs-cont' : 'sbcs-cont' ) ;
return oo . join ( "" ) + vv ;
}
oo . push ( _getchar ( _ _readUInt8 ( this , loc ) ) ) ;
loc += 1 ;
} o = oo . join ( "" ) ; break ;
default :
switch ( size ) {
case 1 : oI = _ _readUInt8 ( this , this . l ) ; this . l ++ ; return oI ;
case 2 : oI = ( t === 'i' ? _ _readInt16LE : _ _readUInt16LE ) ( this , this . l ) ; this . l += 2 ; return oI ;
2017-10-17 00:14:32 +00:00
case 4 : case - 4 :
2018-02-08 18:21:39 +00:00
if ( t === 'i' || ( ( this [ this . l + 3 ] & 0x80 ) === 0 ) ) { oI = ( ( size > 0 ) ? _ _readInt32LE : _ _readInt32BE ) ( this , this . l ) ; this . l += 4 ; return oI ; }
2017-03-12 18:02:43 +00:00
else { oR = _ _readUInt32LE ( this , this . l ) ; this . l += 4 ; } return oR ;
2017-10-17 00:14:32 +00:00
case 8 : case - 8 :
if ( t === 'f' ) {
if ( size == 8 ) oR = _ _double ( this , this . l ) ;
else oR = _ _double ( [ this [ this . l + 7 ] , this [ this . l + 6 ] , this [ this . l + 5 ] , this [ this . l + 4 ] , this [ this . l + 3 ] , this [ this . l + 2 ] , this [ this . l + 1 ] , this [ this . l + 0 ] ] , 0 ) ;
this . l += 8 ; return oR ;
} else size = 8 ;
2017-02-03 20:50:45 +00:00
/* falls through */
case 16 : o = _ _hexlify ( this , this . l , size ) ; break ;
} }
this . l += size ; return o ;
}
2017-09-30 06:18:11 +00:00
var _ _writeUInt32LE = function ( b /*:RawBytes|CFBlob*/ , val /*:number*/ , idx /*:number*/ ) /*:void*/ { b [ idx ] = ( val & 0xFF ) ; b [ idx + 1 ] = ( ( val >>> 8 ) & 0xFF ) ; b [ idx + 2 ] = ( ( val >>> 16 ) & 0xFF ) ; b [ idx + 3 ] = ( ( val >>> 24 ) & 0xFF ) ; } ;
var _ _writeInt32LE = function ( b /*:RawBytes|CFBlob*/ , val /*:number*/ , idx /*:number*/ ) /*:void*/ { b [ idx ] = ( val & 0xFF ) ; b [ idx + 1 ] = ( ( val >> 8 ) & 0xFF ) ; b [ idx + 2 ] = ( ( val >> 16 ) & 0xFF ) ; b [ idx + 3 ] = ( ( val >> 24 ) & 0xFF ) ; } ;
var _ _writeUInt16LE = function ( b /*:RawBytes|CFBlob*/ , val /*:number*/ , idx /*:number*/ ) /*:void*/ { b [ idx ] = ( val & 0xFF ) ; b [ idx + 1 ] = ( ( val >>> 8 ) & 0xFF ) ; } ;
2017-02-10 19:23:01 +00:00
2017-09-30 06:18:11 +00:00
function WriteShift ( t /*:number*/ , val /*:string|number*/ , f /*:?string*/ ) /*:any*/ {
2017-03-12 18:02:43 +00:00
var size = 0 , i = 0 ;
2017-02-03 20:50:45 +00:00
if ( f === 'dbcs' ) {
2017-03-12 18:02:43 +00:00
/*:: if(typeof val !== 'string') throw new Error("unreachable"); */
2017-02-10 19:23:01 +00:00
for ( i = 0 ; i != val . length ; ++ i ) _ _writeUInt16LE ( this , val . charCodeAt ( i ) , this . l + 2 * i ) ;
2017-02-03 20:50:45 +00:00
size = 2 * val . length ;
2017-02-10 19:23:01 +00:00
} else if ( f === 'sbcs' ) {
2022-03-12 14:05:57 +00:00
if ( typeof $cptable !== 'undefined' && current _ansi == 874 ) {
2019-11-15 01:46:49 +00:00
/* TODO: use tables directly, don't encode */
/*:: if(typeof val !== "string") throw new Error("unreachable"); */
for ( i = 0 ; i != val . length ; ++ i ) {
2022-03-12 14:05:57 +00:00
var cppayload = $cptable . utils . encode ( current _ansi , val . charAt ( i ) ) ;
2019-11-15 01:46:49 +00:00
this [ this . l + i ] = cppayload [ 0 ] ;
}
} else {
/*:: if(typeof val !== 'string') throw new Error("unreachable"); */
val = val . replace ( /[^\x00-\x7F]/g , "_" ) ;
/*:: if(typeof val !== 'string') throw new Error("unreachable"); */
for ( i = 0 ; i != val . length ; ++ i ) this [ this . l + i ] = ( val . charCodeAt ( i ) & 0xFF ) ;
}
2017-02-10 19:23:01 +00:00
size = val . length ;
2017-09-22 22:18:51 +00:00
} else if ( f === 'hex' ) {
for ( ; i < t ; ++ i ) {
/*:: if(typeof val !== "string") throw new Error("unreachable"); */
2018-02-08 18:21:39 +00:00
this [ this . l ++ ] = ( parseInt ( val . slice ( 2 * i , 2 * i + 2 ) , 16 ) || 0 ) ;
2017-09-22 22:18:51 +00:00
} return this ;
} else if ( f === 'utf16le' ) {
2017-09-30 06:18:11 +00:00
/*:: if(typeof val !== "string") throw new Error("unreachable"); */
2018-02-14 20:06:35 +00:00
var end /*:number*/ = Math . min ( this . l + t , this . length ) ;
2017-09-22 22:18:51 +00:00
for ( i = 0 ; i < Math . min ( val . length , t ) ; ++ i ) {
var cc = val . charCodeAt ( i ) ;
2018-02-08 18:21:39 +00:00
this [ this . l ++ ] = ( cc & 0xff ) ;
this [ this . l ++ ] = ( cc >> 8 ) ;
2017-09-22 22:18:51 +00:00
}
while ( this . l < end ) this [ this . l ++ ] = 0 ;
return this ;
2017-03-12 18:02:43 +00:00
} else /*:: if(typeof val === 'number') */ switch ( t ) {
2017-02-10 19:23:01 +00:00
case 1 : size = 1 ; this [ this . l ] = val & 0xFF ; break ;
case 2 : size = 2 ; this [ this . l ] = val & 0xFF ; val >>>= 8 ; this [ this . l + 1 ] = val & 0xFF ; break ;
case 3 : size = 3 ; this [ this . l ] = val & 0xFF ; val >>>= 8 ; this [ this . l + 1 ] = val & 0xFF ; val >>>= 8 ; this [ this . l + 2 ] = val & 0xFF ; break ;
case 4 : size = 4 ; _ _writeUInt32LE ( this , val , this . l ) ; break ;
case 8 : size = 8 ; if ( f === 'f' ) { write _double _le ( this , val , this . l ) ; break ; }
2017-02-03 20:50:45 +00:00
/* falls through */
case 16 : break ;
2017-02-10 19:23:01 +00:00
case - 4 : size = 4 ; _ _writeInt32LE ( this , val , this . l ) ; break ;
2017-02-03 20:50:45 +00:00
}
this . l += size ; return this ;
}
2017-09-30 06:18:11 +00:00
function CheckField ( hexstr /*:string*/ , fld /*:string*/ ) /*:void*/ {
2017-02-03 20:50:45 +00:00
var m = _ _hexlify ( this , this . l , hexstr . length >> 1 ) ;
2017-09-30 06:18:11 +00:00
if ( m !== hexstr ) throw new Error ( fld + 'Expected ' + hexstr + ' saw ' + m ) ;
2017-02-03 20:50:45 +00:00
this . l += hexstr . length >> 1 ;
}
2017-09-30 06:18:11 +00:00
function prep _blob ( blob , pos /*:number*/ ) /*:void*/ {
2017-02-03 20:50:45 +00:00
blob . l = pos ;
2017-09-30 06:18:11 +00:00
blob . read _shift = /*::(*/ ReadShift /*:: :any)*/ ;
2017-02-03 20:50:45 +00:00
blob . chk = CheckField ;
blob . write _shift = WriteShift ;
}
2017-09-30 06:18:11 +00:00
function parsenoop ( blob , length /*:: :number, opts?:any */ ) { blob . l += length ; }
2017-02-03 20:50:45 +00:00
2017-03-12 18:02:43 +00:00
function new _buf ( sz /*:number*/ ) /*:Block*/ {
2017-02-03 20:50:45 +00:00
var o = new _raw _buf ( sz ) ;
prep _blob ( o , 0 ) ;
return o ;
}
/* [MS-XLSB] 2.1.4 Record */
2017-02-10 19:23:01 +00:00
function recordhopper ( data , cb /*:RecordHopperCB*/ , opts /*:?any*/ ) {
if ( ! data ) return ;
2017-02-03 20:50:45 +00:00
var tmpbyte , cntbyte , length ;
prep _blob ( data , data . l || 0 ) ;
2017-04-09 04:03:19 +00:00
var L = data . length , RT = 0 , tgt = 0 ;
while ( data . l < L ) {
RT = data . read _shift ( 1 ) ;
2017-02-03 20:50:45 +00:00
if ( RT & 0x80 ) RT = ( RT & 0x7F ) + ( ( data . read _shift ( 1 ) & 0x7F ) << 7 ) ;
var R = XLSBRecordEnum [ RT ] || XLSBRecordEnum [ 0xFFFF ] ;
tmpbyte = data . read _shift ( 1 ) ;
length = tmpbyte & 0x7F ;
for ( cntbyte = 1 ; cntbyte < 4 && ( tmpbyte & 0x80 ) ; ++ cntbyte ) length += ( ( tmpbyte = data . read _shift ( 1 ) ) & 0x7F ) << ( 7 * cntbyte ) ;
2017-04-09 04:03:19 +00:00
tgt = data . l + length ;
2021-11-14 04:38:00 +00:00
var d = R . f && R . f ( data , length , opts ) ;
2017-04-02 06:47:25 +00:00
data . l = tgt ;
2022-03-12 14:05:57 +00:00
if ( cb ( d , R , RT ) ) return ;
2017-02-03 20:50:45 +00:00
}
}
/* control buffer usage for fixed-length buffers */
2017-02-10 19:23:01 +00:00
function buf _array ( ) /*:BufArray*/ {
2017-12-30 05:40:35 +00:00
var bufs /*:Array<Block>*/ = [ ] , blksz = has _buf ? 256 : 2048 ;
var newblk = function ba _newblk ( sz /*:number*/ ) /*:Block*/ {
2017-03-12 18:02:43 +00:00
var o /*:Block*/ = ( new _buf ( sz ) /*:any*/ ) ;
2017-02-03 20:50:45 +00:00
prep _blob ( o , 0 ) ;
return o ;
} ;
2017-12-30 05:40:35 +00:00
var curbuf /*:Block*/ = newblk ( blksz ) ;
2017-02-03 20:50:45 +00:00
var endbuf = function ba _endbuf ( ) {
2017-02-10 19:23:01 +00:00
if ( ! curbuf ) return ;
2018-02-08 18:21:39 +00:00
if ( curbuf . length > curbuf . l ) { curbuf = curbuf . slice ( 0 , curbuf . l ) ; curbuf . l = curbuf . length ; }
2017-02-03 20:50:45 +00:00
if ( curbuf . length > 0 ) bufs . push ( curbuf ) ;
curbuf = null ;
} ;
2017-12-30 05:40:35 +00:00
var next = function ba _next ( sz /*:number*/ ) /*:Block*/ {
2018-02-08 18:21:39 +00:00
if ( curbuf && ( sz < ( curbuf . length - curbuf . l ) ) ) return curbuf ;
2017-02-03 20:50:45 +00:00
endbuf ( ) ;
return ( curbuf = newblk ( Math . max ( sz + 1 , blksz ) ) ) ;
} ;
var end = function ba _end ( ) {
endbuf ( ) ;
2022-02-10 12:40:50 +00:00
return bconcat ( bufs ) ;
2017-02-03 20:50:45 +00:00
} ;
2018-02-08 18:21:39 +00:00
var push = function ba _push ( buf ) { endbuf ( ) ; curbuf = buf ; if ( curbuf . l == null ) curbuf . l = curbuf . length ; next ( blksz ) ; } ;
2017-02-03 20:50:45 +00:00
2017-02-10 19:23:01 +00:00
return ( { next : next , push : push , end : end , _bufs : bufs } /*:any*/ ) ;
2017-02-03 20:50:45 +00:00
}
2022-03-12 14:05:57 +00:00
function write _record ( ba /*:BufArray*/ , type /*:number*/ , payload , length /*:?number*/ ) {
var t /*:number*/ = + type , l ;
2017-02-10 19:23:01 +00:00
if ( isNaN ( t ) ) return ; // TODO: throw something here?
2017-02-03 20:50:45 +00:00
if ( ! length ) length = XLSBRecordEnum [ t ] . p || ( payload || [ ] ) . length || 0 ;
2017-12-30 05:40:35 +00:00
l = 1 + ( t >= 0x80 ? 1 : 0 ) + 1 /* + length*/ ;
2017-02-03 20:50:45 +00:00
if ( length >= 0x80 ) ++ l ; if ( length >= 0x4000 ) ++ l ; if ( length >= 0x200000 ) ++ l ;
var o = ba . next ( l ) ;
if ( t <= 0x7F ) o . write _shift ( 1 , t ) ;
else {
o . write _shift ( 1 , ( t & 0x7F ) + 0x80 ) ;
o . write _shift ( 1 , ( t >> 7 ) ) ;
}
for ( var i = 0 ; i != 4 ; ++ i ) {
if ( length >= 0x80 ) { o . write _shift ( 1 , ( length & 0x7F ) + 0x80 ) ; length >>= 7 ; }
else { o . write _shift ( 1 , length ) ; break ; }
}
if ( /*:: length != null &&*/ length > 0 && is _buf ( payload ) ) ba . push ( payload ) ;
}
/* XLS ranges enforced */
2017-05-13 18:21:22 +00:00
function shift _cell _xls ( cell /*:CellAddress*/ , tgt /*:any*/ , opts /*:?any*/ ) /*:CellAddress*/ {
2017-02-19 20:36:32 +00:00
var out = dup ( cell ) ;
2017-02-03 20:50:45 +00:00
if ( tgt . s ) {
2017-02-19 20:36:32 +00:00
if ( out . cRel ) out . c += tgt . s . c ;
if ( out . rRel ) out . r += tgt . s . r ;
2017-02-03 20:50:45 +00:00
} else {
2018-01-09 07:36:02 +00:00
if ( out . cRel ) out . c += tgt . c ;
if ( out . rRel ) out . r += tgt . r ;
2017-02-03 20:50:45 +00:00
}
2017-02-19 20:36:32 +00:00
if ( ! opts || opts . biff < 12 ) {
while ( out . c >= 0x100 ) out . c -= 0x100 ;
while ( out . r >= 0x10000 ) out . r -= 0x10000 ;
}
return out ;
2017-02-03 20:50:45 +00:00
}
2017-03-10 08:39:51 +00:00
function shift _range _xls ( cell , range , opts ) {
var out = dup ( cell ) ;
out . s = shift _cell _xls ( out . s , range . s , opts ) ;
out . e = shift _cell _xls ( out . e , range . s , opts ) ;
return out ;
2017-02-03 20:50:45 +00:00
}
2018-02-21 07:01:34 +00:00
function encode _cell _xls ( c /*:CellAddress*/ , biff /*:number*/ ) /*:string*/ {
2019-11-15 01:46:49 +00:00
if ( c . cRel && c . c < 0 ) { c = dup ( c ) ; while ( c . c < 0 ) c . c += ( biff > 8 ) ? 0x4000 : 0x100 ; }
if ( c . rRel && c . r < 0 ) { c = dup ( c ) ; while ( c . r < 0 ) c . r += ( biff > 8 ) ? 0x100000 : ( ( biff > 5 ) ? 0x10000 : 0x4000 ) ; }
2017-02-19 20:36:32 +00:00
var s = encode _cell ( c ) ;
2019-11-01 03:09:14 +00:00
if ( ! c . cRel && c . cRel != null ) s = fix _col ( s ) ;
if ( ! c . rRel && c . rRel != null ) s = fix _row ( s ) ;
2017-02-19 20:36:32 +00:00
return s ;
}
2017-03-10 08:39:51 +00:00
function encode _range _xls ( r , opts ) /*:string*/ {
if ( r . s . r == 0 && ! r . s . rRel ) {
2018-02-21 07:01:34 +00:00
if ( r . e . r == ( opts . biff >= 12 ? 0xFFFFF : ( opts . biff >= 8 ? 0x10000 : 0x4000 ) ) && ! r . e . rRel ) {
2017-03-10 08:39:51 +00:00
return ( r . s . cRel ? "" : "$" ) + encode _col ( r . s . c ) + ":" + ( r . e . cRel ? "" : "$" ) + encode _col ( r . e . c ) ;
}
}
if ( r . s . c == 0 && ! r . s . cRel ) {
2020-03-15 07:42:05 +00:00
if ( r . e . c == ( opts . biff >= 12 ? 0x3FFF : 0xFF ) && ! r . e . cRel ) {
2017-03-10 08:39:51 +00:00
return ( r . s . rRel ? "" : "$" ) + encode _row ( r . s . r ) + ":" + ( r . e . rRel ? "" : "$" ) + encode _row ( r . e . r ) ;
}
}
2018-02-21 07:01:34 +00:00
return encode _cell _xls ( r . s , opts . biff ) + ":" + encode _cell _xls ( r . e , opts . biff ) ;
2017-02-19 20:36:32 +00:00
}
2022-05-22 23:51:41 +00:00
if ( typeof cptable !== 'undefined' ) set _cptable ( cptable ) ;
else if ( typeof module !== "undefined" && typeof require !== 'undefined' ) {
set _cptable ( require ( './dist/cpexcel.js' ) ) ;
}
2017-04-17 02:08:23 +00:00
function decode _row ( rowstr /*:string*/ ) /*:number*/ { return parseInt ( unfix _row ( rowstr ) , 10 ) - 1 ; }
function encode _row ( row /*:number*/ ) /*:string*/ { return "" + ( row + 1 ) ; }
function fix _row ( cstr /*:string*/ ) /*:string*/ { return cstr . replace ( /([A-Z]|^)(\d+)$/ , "$1$$$2" ) ; }
function unfix _row ( cstr /*:string*/ ) /*:string*/ { return cstr . replace ( /\$(\d+)$/ , "$1" ) ; }
function decode _col ( colstr /*:string*/ ) /*:number*/ { var c = unfix _col ( colstr ) , d = 0 , i = 0 ; for ( ; i !== c . length ; ++ i ) d = 26 * d + c . charCodeAt ( i ) - 64 ; return d - 1 ; }
2019-11-01 03:09:14 +00:00
function encode _col ( col /*:number*/ ) /*:string*/ { if ( col < 0 ) throw new Error ( "invalid column " + col ) ; var s = "" ; for ( ++ col ; col ; col = Math . floor ( ( col - 1 ) / 26 ) ) s = String . fromCharCode ( ( ( col - 1 ) % 26 ) + 65 ) + s ; return s ; }
2017-04-17 02:08:23 +00:00
function fix _col ( cstr /*:string*/ ) /*:string*/ { return cstr . replace ( /^([A-Z])/ , "$$$1" ) ; }
function unfix _col ( cstr /*:string*/ ) /*:string*/ { return cstr . replace ( /^\$([A-Z])/ , "$1" ) ; }
function split _cell ( cstr /*:string*/ ) /*:Array<string>*/ { return cstr . replace ( /(\$?[A-Z]*)(\$?\d*)/ , "$1,$2" ) . split ( "," ) ; }
2020-05-16 19:45:54 +00:00
//function decode_cell(cstr/*:string*/)/*:CellAddress*/ { var splt = split_cell(cstr); return { c:decode_col(splt[0]), r:decode_row(splt[1]) }; }
function decode _cell ( cstr /*:string*/ ) /*:CellAddress*/ {
var R = 0 , C = 0 ;
for ( var i = 0 ; i < cstr . length ; ++ i ) {
var cc = cstr . charCodeAt ( i ) ;
if ( cc >= 48 && cc <= 57 ) R = 10 * R + ( cc - 48 ) ;
else if ( cc >= 65 && cc <= 90 ) C = 26 * C + ( cc - 64 ) ;
}
return { c : C - 1 , r : R - 1 } ;
}
//function encode_cell(cell/*:CellAddress*/)/*:string*/ { return encode_col(cell.c) + encode_row(cell.r); }
function encode _cell ( cell /*:CellAddress*/ ) /*:string*/ {
var col = cell . c + 1 ;
var s = "" ;
for ( ; col ; col = ( ( col - 1 ) / 26 ) | 0 ) s = String . fromCharCode ( ( ( col - 1 ) % 26 ) + 65 ) + s ;
return s + ( cell . r + 1 ) ;
}
2020-07-31 03:38:44 +00:00
function decode _range ( range /*:string*/ ) /*:Range*/ {
var idx = range . indexOf ( ":" ) ;
if ( idx == - 1 ) return { s : decode _cell ( range ) , e : decode _cell ( range ) } ;
return { s : decode _cell ( range . slice ( 0 , idx ) ) , e : decode _cell ( range . slice ( idx + 1 ) ) } ;
}
2017-04-17 02:08:23 +00:00
/*# if only one arg, it is assumed to be a Range. If 2 args, both are cell addresses */
function encode _range ( cs /*:CellAddrSpec|Range*/ , ce /*:?CellAddrSpec*/ ) /*:string*/ {
if ( typeof ce === 'undefined' || typeof ce === 'number' ) {
/*:: if(!(cs instanceof Range)) throw "unreachable"; */
return encode _range ( cs . s , cs . e ) ;
}
/*:: if((cs instanceof Range)) throw "unreachable"; */
if ( typeof cs !== 'string' ) cs = encode _cell ( ( cs /*:any*/ ) ) ;
if ( typeof ce !== 'string' ) ce = encode _cell ( ( ce /*:any*/ ) ) ;
/*:: if(typeof cs !== 'string') throw "unreachable"; */
/*:: if(typeof ce !== 'string') throw "unreachable"; */
return cs == ce ? cs : cs + ":" + ce ;
}
2022-05-30 08:40:51 +00:00
function fix _range ( a1 /*:string*/ ) /*:string*/ {
var s = decode _range ( a1 ) ;
return "$" + encode _col ( s . s . c ) + "$" + encode _row ( s . s . r ) + ":$" + encode _col ( s . e . c ) + "$" + encode _row ( s . e . r ) ;
}
// List of invalid characters needs to be tested further
function formula _quote _sheet _name ( sname /*:string*/ , opts ) /*:string*/ {
if ( ! sname && ! ( opts && opts . biff <= 5 && opts . biff >= 2 ) ) throw new Error ( "empty sheet name" ) ;
if ( /[^\w\u4E00-\u9FFF\u3040-\u30FF]/ . test ( sname ) ) return "'" + sname . replace ( /'/g , "''" ) + "'" ;
return sname ;
}
2017-04-17 02:08:23 +00:00
function safe _decode _range ( range /*:string*/ ) /*:Range*/ {
var o = { s : { c : 0 , r : 0 } , e : { c : 0 , r : 0 } } ;
var idx = 0 , i = 0 , cc = 0 ;
var len = range . length ;
for ( idx = 0 ; i < len ; ++ i ) {
if ( ( cc = range . charCodeAt ( i ) - 64 ) < 1 || cc > 26 ) break ;
idx = 26 * idx + cc ;
}
o . s . c = -- idx ;
for ( idx = 0 ; i < len ; ++ i ) {
if ( ( cc = range . charCodeAt ( i ) - 48 ) < 0 || cc > 9 ) break ;
idx = 10 * idx + cc ;
}
o . s . r = -- idx ;
2022-01-10 18:45:50 +00:00
if ( i === len || cc != 10 ) { o . e . c = o . s . c ; o . e . r = o . s . r ; return o ; }
++ i ;
2017-04-17 02:08:23 +00:00
for ( idx = 0 ; i != len ; ++ i ) {
if ( ( cc = range . charCodeAt ( i ) - 64 ) < 1 || cc > 26 ) break ;
idx = 26 * idx + cc ;
}
o . e . c = -- idx ;
for ( idx = 0 ; i != len ; ++ i ) {
if ( ( cc = range . charCodeAt ( i ) - 48 ) < 0 || cc > 9 ) break ;
idx = 10 * idx + cc ;
}
o . e . r = -- idx ;
return o ;
}
function safe _format _cell ( cell /*:Cell*/ , v /*:any*/ ) {
var q = ( cell . t == 'd' && v instanceof Date ) ;
2022-03-20 05:29:24 +00:00
if ( cell . z != null ) try { return ( cell . w = SSF _format ( cell . z , q ? datenum ( v ) : v ) ) ; } catch ( e ) { }
try { return ( cell . w = SSF _format ( ( cell . XF || { } ) . numFmtId || ( q ? 14 : 0 ) , q ? datenum ( v ) : v ) ) ; } catch ( e ) { return '' + v ; }
2017-04-17 02:08:23 +00:00
}
function format _cell ( cell /*:Cell*/ , v /*:any*/ , o /*:any*/ ) {
if ( cell == null || cell . t == null || cell . t == 'z' ) return "" ;
if ( cell . w !== undefined ) return cell . w ;
if ( cell . t == 'd' && ! cell . z && o && o . dateNF ) cell . z = o . dateNF ;
2021-10-13 07:20:25 +00:00
if ( cell . t == "e" ) return BErr [ cell . v ] || cell . v ;
2017-07-27 20:07:51 +00:00
if ( v == undefined ) return safe _format _cell ( cell , cell . v ) ;
return safe _format _cell ( cell , v ) ;
2017-04-17 02:08:23 +00:00
}
2017-03-25 01:36:40 +00:00
function sheet _to _workbook ( sheet /*:Worksheet*/ , opts ) /*:Workbook*/ {
var n = opts && opts . sheet ? opts . sheet : "Sheet1" ;
var sheets = { } ; sheets [ n ] = sheet ;
return { SheetNames : [ n ] , Sheets : sheets } ;
}
2018-01-09 07:36:02 +00:00
function sheet _add _aoa ( _ws /*:?Worksheet*/ , data /*:AOA*/ , opts /*:?any*/ ) /*:Worksheet*/ {
2017-03-25 01:36:40 +00:00
var o = opts || { } ;
2018-01-09 07:36:02 +00:00
var dense = _ws ? Array . isArray ( _ws ) : o . dense ;
if ( DENSE != null && dense == null ) dense = DENSE ;
var ws /*:Worksheet*/ = _ws || ( dense ? ( [ ] /*:any*/ ) : ( { } /*:any*/ ) ) ;
var _R = 0 , _C = 0 ;
if ( ws && o . origin != null ) {
if ( typeof o . origin == 'number' ) _R = o . origin ;
else {
var _origin /*:CellAddress*/ = typeof o . origin == "string" ? decode _cell ( o . origin ) : o . origin ;
_R = _origin . r ; _C = _origin . c ;
}
2020-07-31 03:38:44 +00:00
if ( ! ws [ "!ref" ] ) ws [ "!ref" ] = "A1:A1" ;
2018-01-09 07:36:02 +00:00
}
2017-03-25 01:36:40 +00:00
var range /*:Range*/ = ( { s : { c : 10000000 , r : 10000000 } , e : { c : 0 , r : 0 } } /*:any*/ ) ;
2018-01-09 07:36:02 +00:00
if ( ws [ '!ref' ] ) {
var _range = safe _decode _range ( ws [ '!ref' ] ) ;
range . s . c = _range . s . c ;
range . s . r = _range . s . r ;
range . e . c = Math . max ( range . e . c , _range . e . c ) ;
range . e . r = Math . max ( range . e . r , _range . e . r ) ;
if ( _R == - 1 ) range . e . r = _R = _range . e . r + 1 ;
}
2017-03-25 01:36:40 +00:00
for ( var R = 0 ; R != data . length ; ++ R ) {
2018-08-15 19:22:47 +00:00
if ( ! data [ R ] ) continue ;
if ( ! Array . isArray ( data [ R ] ) ) throw new Error ( "aoa_to_sheet expects an array of arrays" ) ;
2017-03-25 01:36:40 +00:00
for ( var C = 0 ; C != data [ R ] . length ; ++ C ) {
if ( typeof data [ R ] [ C ] === 'undefined' ) continue ;
var cell /*:Cell*/ = ( { v : data [ R ] [ C ] } /*:any*/ ) ;
2018-01-09 07:36:02 +00:00
var _ _R = _R + R , _ _C = _C + C ;
if ( range . s . r > _ _R ) range . s . r = _ _R ;
if ( range . s . c > _ _C ) range . s . c = _ _C ;
if ( range . e . r < _ _R ) range . e . r = _ _R ;
if ( range . e . c < _ _C ) range . e . c = _ _C ;
2018-09-19 10:58:14 +00:00
if ( data [ R ] [ C ] && typeof data [ R ] [ C ] === 'object' && ! Array . isArray ( data [ R ] [ C ] ) && ! ( data [ R ] [ C ] instanceof Date ) ) cell = data [ R ] [ C ] ;
else {
if ( Array . isArray ( cell . v ) ) { cell . f = data [ R ] [ C ] [ 1 ] ; cell . v = cell . v [ 0 ] ; }
2021-10-13 07:20:25 +00:00
if ( cell . v === null ) {
if ( cell . f ) cell . t = 'n' ;
else if ( o . nullError ) { cell . t = 'e' ; cell . v = 0 ; }
else if ( ! o . sheetStubs ) continue ;
else cell . t = 'z' ;
}
2018-09-19 10:58:14 +00:00
else if ( typeof cell . v === 'number' ) cell . t = 'n' ;
else if ( typeof cell . v === 'boolean' ) cell . t = 'b' ;
else if ( cell . v instanceof Date ) {
2022-03-20 05:29:24 +00:00
cell . z = o . dateNF || table _fmt [ 14 ] ;
2022-06-06 23:05:27 +00:00
if ( o . cellDates ) { cell . t = 'd' ; cell . w = SSF _format ( cell . z , datenum ( cell . v , o . date1904 ) ) ; }
else { cell . t = 'n' ; cell . v = datenum ( cell . v , o . date1904 ) ; cell . w = SSF _format ( cell . z , cell . v ) ; }
2018-09-19 10:58:14 +00:00
}
else cell . t = 's' ;
2017-03-25 01:36:40 +00:00
}
2018-01-09 07:36:02 +00:00
if ( dense ) {
if ( ! ws [ _ _R ] ) ws [ _ _R ] = [ ] ;
2019-12-23 03:19:56 +00:00
if ( ws [ _ _R ] [ _ _C ] && ws [ _ _R ] [ _ _C ] . z ) cell . z = ws [ _ _R ] [ _ _C ] . z ;
2018-01-09 07:36:02 +00:00
ws [ _ _R ] [ _ _C ] = cell ;
2017-04-08 06:55:35 +00:00
} else {
2018-01-09 07:36:02 +00:00
var cell _ref = encode _cell ( ( { c : _ _C , r : _ _R } /*:any*/ ) ) ;
2019-12-23 03:19:56 +00:00
if ( ws [ cell _ref ] && ws [ cell _ref ] . z ) cell . z = ws [ cell _ref ] . z ;
2017-04-08 06:55:35 +00:00
ws [ cell _ref ] = cell ;
}
2017-03-25 01:36:40 +00:00
}
}
if ( range . s . c < 10000000 ) ws [ '!ref' ] = encode _range ( range ) ;
return ws ;
}
2018-01-09 07:36:02 +00:00
function aoa _to _sheet ( data /*:AOA*/ , opts /*:?any*/ ) /*:Worksheet*/ { return sheet _add _aoa ( null , data , opts ) ; }
2017-03-25 01:36:40 +00:00
2022-03-03 08:35:39 +00:00
function parse _Int32LE ( data ) {
return data . read _shift ( 4 , 'i' ) ;
}
2017-05-09 18:07:57 +00:00
function write _UInt32LE ( x /*:number*/ , o ) {
2020-07-31 03:38:44 +00:00
if ( ! o ) o = new _buf ( 4 ) ;
2017-05-09 18:07:57 +00:00
o . write _shift ( 4 , x ) ;
return o ;
}
/* [MS-XLSB] 2.5.168 */
2017-07-05 22:27:54 +00:00
function parse _XLWideString ( data /*::, length*/ ) /*:string*/ {
2017-05-09 18:07:57 +00:00
var cchCharacters = data . read _shift ( 4 ) ;
return cchCharacters === 0 ? "" : data . read _shift ( cchCharacters , 'dbcs' ) ;
}
function write _XLWideString ( data /*:string*/ , o ) {
2020-07-31 03:38:44 +00:00
var _null = false ; if ( o == null ) { _null = true ; o = new _buf ( 4 + 2 * data . length ) ; }
2017-05-09 18:07:57 +00:00
o . write _shift ( 4 , data . length ) ;
2020-07-31 03:38:44 +00:00
if ( data . length > 0 ) o . write _shift ( 0 , data , 'dbcs' ) ;
2017-05-09 18:07:57 +00:00
return _null ? o . slice ( 0 , o . l ) : o ;
}
2017-02-03 20:50:45 +00:00
2020-03-15 07:42:05 +00:00
/* [MS-XLSB] 2.5.91 */
//function parse_LPWideString(data/*::, length*/)/*:string*/ {
// var cchCharacters = data.read_shift(2);
// return cchCharacters === 0 ? "" : data.read_shift(cchCharacters, "utf16le");
//}
2017-02-03 20:50:45 +00:00
/* [MS-XLSB] 2.5.143 */
2018-01-23 09:07:51 +00:00
function parse _StrRun ( data ) {
2017-02-03 20:50:45 +00:00
return { ich : data . read _shift ( 2 ) , ifnt : data . read _shift ( 2 ) } ;
}
2017-05-09 18:07:57 +00:00
function write _StrRun ( run , o ) {
2020-07-31 03:38:44 +00:00
if ( ! o ) o = new _buf ( 4 ) ;
2017-05-09 18:07:57 +00:00
o . write _shift ( 2 , run . ich || 0 ) ;
o . write _shift ( 2 , run . ifnt || 0 ) ;
return o ;
}
2017-02-03 20:50:45 +00:00
2018-02-14 20:06:35 +00:00
/* [MS-XLSB] 2.5.121 */
2017-03-12 18:02:43 +00:00
function parse _RichStr ( data , length /*:number*/ ) /*:XLString*/ {
2017-02-03 20:50:45 +00:00
var start = data . l ;
var flags = data . read _shift ( 1 ) ;
var str = parse _XLWideString ( data ) ;
var rgsStrRun = [ ] ;
2017-02-10 19:23:01 +00:00
var z = ( { t : str , h : str } /*:any*/ ) ;
2020-07-31 03:38:44 +00:00
if ( ( flags & 1 ) !== 0 ) { /* fRichStr */
2017-02-03 20:50:45 +00:00
/* TODO: formatted string */
var dwSizeStrRun = data . read _shift ( 4 ) ;
2020-07-31 03:38:44 +00:00
for ( var i = 0 ; i != dwSizeStrRun ; ++ i ) rgsStrRun . push ( parse _StrRun ( data ) ) ;
2017-02-03 20:50:45 +00:00
z . r = rgsStrRun ;
}
2020-07-31 03:38:44 +00:00
else z . r = [ { ich : 0 , ifnt : 0 } ] ;
2017-03-31 00:47:35 +00:00
//if((flags & 2) !== 0) { /* fExtStr */
// /* TODO: phonetic string */
//}
2017-02-03 20:50:45 +00:00
data . l = start + length ;
return z ;
}
2017-03-12 18:02:43 +00:00
function write _RichStr ( str /*:XLString*/ , o /*:?Block*/ ) /*:Block*/ {
2017-02-03 20:50:45 +00:00
/* TODO: formatted string */
2020-07-31 03:38:44 +00:00
var _null = false ; if ( o == null ) { _null = true ; o = new _buf ( 15 + 4 * str . t . length ) ; }
o . write _shift ( 1 , 0 ) ;
2017-02-03 20:50:45 +00:00
write _XLWideString ( str . t , o ) ;
2017-04-02 06:47:25 +00:00
return _null ? o . slice ( 0 , o . l ) : o ;
2017-02-03 20:50:45 +00:00
}
2018-02-14 20:06:35 +00:00
/* [MS-XLSB] 2.4.328 BrtCommentText (RichStr w/1 run) */
2017-05-09 18:07:57 +00:00
var parse _BrtCommentText = parse _RichStr ;
function write _BrtCommentText ( str /*:XLString*/ , o /*:?Block*/ ) /*:Block*/ {
/* TODO: formatted string */
2020-07-31 03:38:44 +00:00
var _null = false ; if ( o == null ) { _null = true ; o = new _buf ( 23 + 4 * str . t . length ) ; }
o . write _shift ( 1 , 1 ) ;
2017-05-09 18:07:57 +00:00
write _XLWideString ( str . t , o ) ;
2020-07-31 03:38:44 +00:00
o . write _shift ( 4 , 1 ) ;
write _StrRun ( { ich : 0 , ifnt : 0 } , o ) ;
2017-05-09 18:07:57 +00:00
return _null ? o . slice ( 0 , o . l ) : o ;
}
2017-02-03 20:50:45 +00:00
/* [MS-XLSB] 2.5.9 */
2017-03-12 18:02:43 +00:00
function parse _XLSBCell ( data ) /*:any*/ {
2017-02-03 20:50:45 +00:00
var col = data . read _shift ( 4 ) ;
var iStyleRef = data . read _shift ( 2 ) ;
2020-07-31 03:38:44 +00:00
iStyleRef += data . read _shift ( 1 ) << 16 ;
2018-01-23 09:07:51 +00:00
data . l ++ ; //var fPhShow = data.read_shift(1);
2020-07-31 03:38:44 +00:00
return { c : col , iStyleRef : iStyleRef } ;
2017-02-03 20:50:45 +00:00
}
2017-03-12 18:02:43 +00:00
function write _XLSBCell ( cell /*:any*/ , o /*:?Block*/ ) {
2020-07-31 03:38:44 +00:00
if ( o == null ) o = new _buf ( 8 ) ;
2017-02-03 20:50:45 +00:00
o . write _shift ( - 4 , cell . c ) ;
2017-02-10 19:23:01 +00:00
o . write _shift ( 3 , cell . iStyleRef || cell . s ) ;
2017-02-03 20:50:45 +00:00
o . write _shift ( 1 , 0 ) ; /* fPhShow */
return o ;
}
2021-08-18 18:34:02 +00:00
/* Short XLSB Cell does not include column */
function parse _XLSBShortCell ( data ) /*:any*/ {
var iStyleRef = data . read _shift ( 2 ) ;
iStyleRef += data . read _shift ( 1 ) << 16 ;
data . l ++ ; //var fPhShow = data.read_shift(1);
return { c : - 1 , iStyleRef : iStyleRef } ;
}
function write _XLSBShortCell ( cell /*:any*/ , o /*:?Block*/ ) {
if ( o == null ) o = new _buf ( 4 ) ;
o . write _shift ( 3 , cell . iStyleRef || cell . s ) ;
o . write _shift ( 1 , 0 ) ; /* fPhShow */
return o ;
}
2017-02-03 20:50:45 +00:00
/* [MS-XLSB] 2.5.21 */
2017-03-31 00:47:35 +00:00
var parse _XLSBCodeName = parse _XLWideString ;
var write _XLSBCodeName = write _XLWideString ;
2017-02-03 20:50:45 +00:00
/* [MS-XLSB] 2.5.166 */
2017-07-05 22:27:54 +00:00
function parse _XLNullableWideString ( data /*::, length*/ ) /*:string*/ {
2017-02-03 20:50:45 +00:00
var cchCharacters = data . read _shift ( 4 ) ;
return cchCharacters === 0 || cchCharacters === 0xFFFFFFFF ? "" : data . read _shift ( cchCharacters , 'dbcs' ) ;
}
2017-02-10 19:23:01 +00:00
function write _XLNullableWideString ( data /*:string*/ , o ) {
2020-07-31 03:38:44 +00:00
var _null = false ; if ( o == null ) { _null = true ; o = new _buf ( 127 ) ; }
2017-02-03 20:50:45 +00:00
o . write _shift ( 4 , data . length > 0 ? data . length : 0xFFFFFFFF ) ;
2020-07-31 03:38:44 +00:00
if ( data . length > 0 ) o . write _shift ( 0 , data , 'dbcs' ) ;
2017-04-02 06:47:25 +00:00
return _null ? o . slice ( 0 , o . l ) : o ;
2017-02-03 20:50:45 +00:00
}
2017-02-19 20:36:32 +00:00
/* [MS-XLSB] 2.5.165 */
var parse _XLNameWideString = parse _XLWideString ;
2018-01-23 09:07:51 +00:00
//var write_XLNameWideString = write_XLWideString;
2017-02-19 20:36:32 +00:00
2017-02-03 20:50:45 +00:00
/* [MS-XLSB] 2.5.114 */
var parse _RelID = parse _XLNullableWideString ;
var write _RelID = write _XLNullableWideString ;
2018-02-14 20:06:35 +00:00
/* [MS-XLS] 2.5.217 ; [MS-XLSB] 2.5.122 */
2017-02-10 19:23:01 +00:00
function parse _RkNumber ( data ) /*:number*/ {
2020-07-31 03:38:44 +00:00
var b = data . slice ( data . l , data . l + 4 ) ;
2018-02-08 18:21:39 +00:00
var fX100 = ( b [ 0 ] & 1 ) , fInt = ( b [ 0 ] & 2 ) ;
2020-07-31 03:38:44 +00:00
data . l += 4 ;
2022-02-10 12:40:50 +00:00
var RK = fInt === 0 ? _ _double ( [ 0 , 0 , 0 , 0 , ( b [ 0 ] & 0xFC ) , b [ 1 ] , b [ 2 ] , b [ 3 ] ] , 0 ) : _ _readInt32LE ( b , 0 ) >> 2 ;
2020-07-31 03:38:44 +00:00
return fX100 ? ( RK / 100 ) : RK ;
2017-02-03 20:50:45 +00:00
}
function write _RkNumber ( data /*:number*/ , o ) {
2020-07-31 03:38:44 +00:00
if ( o == null ) o = new _buf ( 4 ) ;
2017-02-03 20:50:45 +00:00
var fX100 = 0 , fInt = 0 , d100 = data * 100 ;
2020-07-31 03:38:44 +00:00
if ( ( data == ( data | 0 ) ) && ( data >= - ( 1 << 29 ) ) && ( data < ( 1 << 29 ) ) ) { fInt = 1 ; }
else if ( ( d100 == ( d100 | 0 ) ) && ( d100 >= - ( 1 << 29 ) ) && ( d100 < ( 1 << 29 ) ) ) { fInt = 1 ; fX100 = 1 ; }
if ( fInt ) o . write _shift ( - 4 , ( ( fX100 ? d100 : data ) << 2 ) + ( fX100 + 2 ) ) ;
2017-02-03 20:50:45 +00:00
else throw new Error ( "unsupported RkNumber " + data ) ; // TODO
}
2017-02-19 20:36:32 +00:00
/* [MS-XLSB] 2.5.117 RfX */
2017-07-05 22:27:54 +00:00
function parse _RfX ( data /*::, length*/ ) /*:Range*/ {
2020-07-31 03:38:44 +00:00
var cell /*:Range*/ = ( { s : { } , e : { } } /*:any*/ ) ;
2017-02-03 20:50:45 +00:00
cell . s . r = data . read _shift ( 4 ) ;
cell . e . r = data . read _shift ( 4 ) ;
cell . s . c = data . read _shift ( 4 ) ;
cell . e . c = data . read _shift ( 4 ) ;
return cell ;
}
2017-02-19 20:36:32 +00:00
function write _RfX ( r /*:Range*/ , o ) {
2020-07-31 03:38:44 +00:00
if ( ! o ) o = new _buf ( 16 ) ;
2017-02-03 20:50:45 +00:00
o . write _shift ( 4 , r . s . r ) ;
o . write _shift ( 4 , r . e . r ) ;
o . write _shift ( 4 , r . s . c ) ;
o . write _shift ( 4 , r . e . c ) ;
return o ;
}
2017-02-19 20:36:32 +00:00
/* [MS-XLSB] 2.5.153 UncheckedRfX */
var parse _UncheckedRfX = parse _RfX ;
var write _UncheckedRfX = write _RfX ;
2020-03-15 07:42:05 +00:00
/* [MS-XLSB] 2.5.155 UncheckedSqRfX */
//function parse_UncheckedSqRfX(data) {
// var cnt = data.read_shift(4);
// var out = [];
// for(var i = 0; i < cnt; ++i) {
// var rng = parse_UncheckedRfX(data);
// out.push(encode_range(rng));
// }
// return out.join(",");
//}
//function write_UncheckedSqRfX(sqrfx/*:string*/) {
// var parts = sqrfx.split(/\s*,\s*/);
// var o = new_buf(4); o.write_shift(4, parts.length);
// var out = [o];
// parts.forEach(function(rng) {
// out.push(write_UncheckedRfX(safe_decode_range(rng)));
// });
// return bconcat(out);
//}
2019-11-01 03:09:14 +00:00
2018-02-14 20:06:35 +00:00
/* [MS-XLS] 2.5.342 ; [MS-XLSB] 2.5.171 */
2017-02-03 20:50:45 +00:00
/* TODO: error checking, NaN and Infinity values are not valid Xnum */
2021-05-13 19:02:31 +00:00
function parse _Xnum ( data /*::, length*/ ) {
if ( data . length - data . l < 8 ) throw "XLS Xnum Buffer underflow" ;
return data . read _shift ( 8 , 'f' ) ;
}
2017-02-03 20:50:45 +00:00
function write _Xnum ( data , o ) { return ( o || new _buf ( 8 ) ) . write _shift ( 8 , data , 'f' ) ; }
2018-02-14 20:06:35 +00:00
/* [MS-XLSB] 2.4.324 BrtColor */
2018-01-23 09:07:51 +00:00
function parse _BrtColor ( data /*::, length*/ ) {
2017-02-03 20:50:45 +00:00
var out = { } ;
var d = data . read _shift ( 1 ) ;
2017-05-09 18:07:57 +00:00
2018-01-23 09:07:51 +00:00
//var fValidRGB = d & 1;
2017-05-09 18:07:57 +00:00
var xColorType = d >>> 1 ;
var index = data . read _shift ( 1 ) ;
var nTS = data . read _shift ( 2 , 'i' ) ;
var bR = data . read _shift ( 1 ) ;
var bG = data . read _shift ( 1 ) ;
var bB = data . read _shift ( 1 ) ;
2018-01-23 09:07:51 +00:00
data . l ++ ; //var bAlpha = data.read_shift(1);
2017-05-09 18:07:57 +00:00
2020-07-31 03:38:44 +00:00
switch ( xColorType ) {
2017-05-09 18:07:57 +00:00
case 0 : out . auto = 1 ; break ;
case 1 :
out . index = index ;
var icv = XLSIcv [ index ] ;
/* automatic pseudo index 81 */
2020-07-31 03:38:44 +00:00
if ( icv ) out . rgb = rgb2Hex ( icv ) ;
2017-05-09 18:07:57 +00:00
break ;
case 2 :
/* if(!fValidRGB) throw new Error("invalid"); */
2017-07-27 20:07:51 +00:00
out . rgb = rgb2Hex ( [ bR , bG , bB ] ) ;
2017-05-09 18:07:57 +00:00
break ;
case 3 : out . theme = index ; break ;
}
2020-07-31 03:38:44 +00:00
if ( nTS != 0 ) out . tint = nTS > 0 ? nTS / 32767 : nTS / 32768 ;
2017-05-09 18:07:57 +00:00
return out ;
}
function write _BrtColor ( color , o ) {
2020-07-31 03:38:44 +00:00
if ( ! o ) o = new _buf ( 8 ) ;
if ( ! color || color . auto ) { o . write _shift ( 4 , 0 ) ; o . write _shift ( 4 , 0 ) ; return o ; }
if ( color . index != null ) {
2017-05-09 18:07:57 +00:00
o . write _shift ( 1 , 0x02 ) ;
o . write _shift ( 1 , color . index ) ;
2020-07-31 03:38:44 +00:00
} else if ( color . theme != null ) {
2017-05-09 18:07:57 +00:00
o . write _shift ( 1 , 0x06 ) ;
o . write _shift ( 1 , color . theme ) ;
} else {
o . write _shift ( 1 , 0x05 ) ;
o . write _shift ( 1 , 0 ) ;
}
var nTS = color . tint || 0 ;
2020-07-31 03:38:44 +00:00
if ( nTS > 0 ) nTS *= 32767 ;
else if ( nTS < 0 ) nTS *= 32768 ;
2017-05-09 18:07:57 +00:00
o . write _shift ( 2 , nTS ) ;
2020-07-31 03:38:44 +00:00
if ( ! color . rgb || color . theme != null ) {
2017-05-09 18:07:57 +00:00
o . write _shift ( 2 , 0 ) ;
o . write _shift ( 1 , 0 ) ;
o . write _shift ( 1 , 0 ) ;
} else {
var rgb = ( color . rgb || 'FFFFFF' ) ;
2020-07-31 03:38:44 +00:00
if ( typeof rgb == 'number' ) rgb = ( "000000" + rgb . toString ( 16 ) ) . slice ( - 6 ) ;
o . write _shift ( 1 , parseInt ( rgb . slice ( 0 , 2 ) , 16 ) ) ;
o . write _shift ( 1 , parseInt ( rgb . slice ( 2 , 4 ) , 16 ) ) ;
o . write _shift ( 1 , parseInt ( rgb . slice ( 4 , 6 ) , 16 ) ) ;
2017-05-09 18:07:57 +00:00
o . write _shift ( 1 , 0xFF ) ;
}
return o ;
2017-02-03 20:50:45 +00:00
}
/* [MS-XLSB] 2.5.52 */
2018-01-23 09:07:51 +00:00
function parse _FontFlags ( data /*::, length, opts*/ ) {
2017-02-03 20:50:45 +00:00
var d = data . read _shift ( 1 ) ;
data . l ++ ;
var out = {
2019-11-01 03:09:14 +00:00
fBold : d & 0x01 ,
2017-05-09 18:07:57 +00:00
fItalic : d & 0x02 ,
2019-11-01 03:09:14 +00:00
fUnderline : d & 0x04 ,
2017-05-09 18:07:57 +00:00
fStrikeout : d & 0x08 ,
2017-02-03 20:50:45 +00:00
fOutline : d & 0x10 ,
fShadow : d & 0x20 ,
fCondense : d & 0x40 ,
fExtend : d & 0x80
} ;
return out ;
}
2017-05-09 18:07:57 +00:00
function write _FontFlags ( font , o ) {
2020-07-31 03:38:44 +00:00
if ( ! o ) o = new _buf ( 2 ) ;
2017-05-09 18:07:57 +00:00
var grbit =
2020-07-31 03:38:44 +00:00
( font . italic ? 0x02 : 0 ) |
( font . strike ? 0x08 : 0 ) |
( font . outline ? 0x10 : 0 ) |
( font . shadow ? 0x20 : 0 ) |
2017-05-09 18:07:57 +00:00
( font . condense ? 0x40 : 0 ) |
2020-07-31 03:38:44 +00:00
( font . extend ? 0x80 : 0 ) ;
2017-05-09 18:07:57 +00:00
o . write _shift ( 1 , grbit ) ;
o . write _shift ( 1 , 0 ) ;
return o ;
}
2017-12-30 05:40:35 +00:00
/* [MS-OLEDS] 2.3.1 and 2.3.2 */
function parse _ClipboardFormatOrString ( o , w /*:number*/ ) /*:string*/ {
// $FlowIgnore
2020-07-31 03:38:44 +00:00
var ClipFmt = { 2 : "BITMAP" , 3 : "METAFILEPICT" , 8 : "DIB" , 14 : "ENHMETAFILE" } ;
2017-12-30 05:40:35 +00:00
var m /*:number*/ = o . read _shift ( 4 ) ;
2020-07-31 03:38:44 +00:00
switch ( m ) {
2017-12-30 05:40:35 +00:00
case 0x00000000 : return "" ;
2020-07-31 03:38:44 +00:00
case 0xffffffff : case 0xfffffffe : return ClipFmt [ o . read _shift ( 4 ) ] || "" ;
2017-12-30 05:40:35 +00:00
}
2020-07-31 03:38:44 +00:00
if ( m > 0x190 ) throw new Error ( "Unsupported Clipboard: " + m . toString ( 16 ) ) ;
2017-12-30 05:40:35 +00:00
o . l -= 4 ;
return o . read _shift ( 0 , w == 1 ? "lpstr" : "lpwstr" ) ;
}
function parse _ClipboardFormatOrAnsiString ( o ) { return parse _ClipboardFormatOrString ( o , 1 ) ; }
function parse _ClipboardFormatOrUnicodeString ( o ) { return parse _ClipboardFormatOrString ( o , 2 ) ; }
2017-02-03 20:50:45 +00:00
/* [MS-OLEPS] 2.2 PropertyType */
2022-03-22 20:08:08 +00:00
// Note: some tree shakers cannot handle VT_VECTOR | $CONST, hence extra vars
2017-10-17 00:14:32 +00:00
//var VT_EMPTY = 0x0000;
//var VT_NULL = 0x0001;
2020-09-11 08:38:33 +00:00
var VT _I2 = 0x0002 ;
var VT _I4 = 0x0003 ;
2017-10-17 00:14:32 +00:00
//var VT_R4 = 0x0004;
//var VT_R8 = 0x0005;
//var VT_CY = 0x0006;
//var VT_DATE = 0x0007;
//var VT_BSTR = 0x0008;
//var VT_ERROR = 0x000A;
2020-09-11 08:38:33 +00:00
var VT _BOOL = 0x000B ;
var VT _VARIANT = 0x000C ;
2017-10-17 00:14:32 +00:00
//var VT_DECIMAL = 0x000E;
//var VT_I1 = 0x0010;
//var VT_UI1 = 0x0011;
//var VT_UI2 = 0x0012;
2020-09-11 08:38:33 +00:00
var VT _UI4 = 0x0013 ;
2017-10-17 00:14:32 +00:00
//var VT_I8 = 0x0014;
2018-01-23 09:07:51 +00:00
//var VT_UI8 = 0x0015;
2017-10-17 00:14:32 +00:00
//var VT_INT = 0x0016;
//var VT_UINT = 0x0017;
2022-04-14 07:27:38 +00:00
//var VT_LPSTR = 0x001E;
2017-10-17 00:14:32 +00:00
//var VT_LPWSTR = 0x001F;
var VT _FILETIME = 0x0040 ;
2020-09-11 08:38:33 +00:00
var VT _BLOB = 0x0041 ;
2017-10-17 00:14:32 +00:00
//var VT_STREAM = 0x0042;
//var VT_STORAGE = 0x0043;
//var VT_STREAMED_Object = 0x0044;
//var VT_STORED_Object = 0x0045;
//var VT_BLOB_Object = 0x0046;
2020-09-11 08:38:33 +00:00
var VT _CF = 0x0047 ;
2017-10-17 00:14:32 +00:00
//var VT_CLSID = 0x0048;
//var VT_VERSIONED_STREAM = 0x0049;
2022-04-14 07:27:38 +00:00
//var VT_VECTOR = 0x1000;
2022-03-22 20:08:08 +00:00
var VT _VECTOR _VARIANT = 0x100C ;
var VT _VECTOR _LPSTR = 0x101E ;
2017-10-17 00:14:32 +00:00
//var VT_ARRAY = 0x2000;
2020-09-11 08:38:33 +00:00
var VT _STRING = 0x0050 ; // 2.3.3.1.11 VtString
var VT _USTR = 0x0051 ; // 2.3.3.1.12 VtUnalignedString
var VT _CUSTOM = [ VT _STRING , VT _USTR ] ;
2017-02-03 20:50:45 +00:00
/* [MS-OSHARED] 2.3.3.2.2.1 Document Summary Information PIDDSI */
var DocSummaryPIDDSI = {
2017-02-10 19:23:01 +00:00
/*::[*/ 0x01 /*::]*/ : { n : 'CodePage' , t : VT _I2 } ,
/*::[*/ 0x02 /*::]*/ : { n : 'Category' , t : VT _STRING } ,
/*::[*/ 0x03 /*::]*/ : { n : 'PresentationFormat' , t : VT _STRING } ,
/*::[*/ 0x04 /*::]*/ : { n : 'ByteCount' , t : VT _I4 } ,
/*::[*/ 0x05 /*::]*/ : { n : 'LineCount' , t : VT _I4 } ,
/*::[*/ 0x06 /*::]*/ : { n : 'ParagraphCount' , t : VT _I4 } ,
/*::[*/ 0x07 /*::]*/ : { n : 'SlideCount' , t : VT _I4 } ,
/*::[*/ 0x08 /*::]*/ : { n : 'NoteCount' , t : VT _I4 } ,
/*::[*/ 0x09 /*::]*/ : { n : 'HiddenCount' , t : VT _I4 } ,
/*::[*/ 0x0a /*::]*/ : { n : 'MultimediaClipCount' , t : VT _I4 } ,
2018-05-05 06:34:37 +00:00
/*::[*/ 0x0b /*::]*/ : { n : 'ScaleCrop' , t : VT _BOOL } ,
2022-03-22 20:08:08 +00:00
/*::[*/ 0x0c /*::]*/ : { n : 'HeadingPairs' , t : VT _VECTOR _VARIANT /* VT_VECTOR | VT_VARIANT */ } ,
/*::[*/ 0x0d /*::]*/ : { n : 'TitlesOfParts' , t : VT _VECTOR _LPSTR /* VT_VECTOR | VT_LPSTR */ } ,
2017-02-10 19:23:01 +00:00
/*::[*/ 0x0e /*::]*/ : { n : 'Manager' , t : VT _STRING } ,
/*::[*/ 0x0f /*::]*/ : { n : 'Company' , t : VT _STRING } ,
2018-05-05 06:34:37 +00:00
/*::[*/ 0x10 /*::]*/ : { n : 'LinksUpToDate' , t : VT _BOOL } ,
2017-02-10 19:23:01 +00:00
/*::[*/ 0x11 /*::]*/ : { n : 'CharacterCount' , t : VT _I4 } ,
/*::[*/ 0x13 /*::]*/ : { n : 'SharedDoc' , t : VT _BOOL } ,
2018-05-05 06:34:37 +00:00
/*::[*/ 0x16 /*::]*/ : { n : 'HyperlinksChanged' , t : VT _BOOL } ,
2017-02-10 19:23:01 +00:00
/*::[*/ 0x17 /*::]*/ : { n : 'AppVersion' , t : VT _I4 , p : 'version' } ,
2018-02-21 07:01:34 +00:00
/*::[*/ 0x18 /*::]*/ : { n : 'DigSig' , t : VT _BLOB } ,
2017-02-10 19:23:01 +00:00
/*::[*/ 0x1A /*::]*/ : { n : 'ContentType' , t : VT _STRING } ,
/*::[*/ 0x1B /*::]*/ : { n : 'ContentStatus' , t : VT _STRING } ,
/*::[*/ 0x1C /*::]*/ : { n : 'Language' , t : VT _STRING } ,
/*::[*/ 0x1D /*::]*/ : { n : 'Version' , t : VT _STRING } ,
2021-11-14 04:38:00 +00:00
/*::[*/ 0xFF /*::]*/ : { } ,
/* [MS-OLEPS] 2.18 */
/*::[*/ 0x80000000 /*::]*/ : { n : 'Locale' , t : VT _UI4 } ,
/*::[*/ 0x80000003 /*::]*/ : { n : 'Behavior' , t : VT _UI4 } ,
/*::[*/ 0x72627262 /*::]*/ : { }
2017-02-03 20:50:45 +00:00
} ;
/* [MS-OSHARED] 2.3.3.2.1.1 Summary Information Property Set PIDSI */
var SummaryPIDSI = {
2017-02-10 19:23:01 +00:00
/*::[*/ 0x01 /*::]*/ : { n : 'CodePage' , t : VT _I2 } ,
/*::[*/ 0x02 /*::]*/ : { n : 'Title' , t : VT _STRING } ,
/*::[*/ 0x03 /*::]*/ : { n : 'Subject' , t : VT _STRING } ,
/*::[*/ 0x04 /*::]*/ : { n : 'Author' , t : VT _STRING } ,
/*::[*/ 0x05 /*::]*/ : { n : 'Keywords' , t : VT _STRING } ,
/*::[*/ 0x06 /*::]*/ : { n : 'Comments' , t : VT _STRING } ,
/*::[*/ 0x07 /*::]*/ : { n : 'Template' , t : VT _STRING } ,
/*::[*/ 0x08 /*::]*/ : { n : 'LastAuthor' , t : VT _STRING } ,
/*::[*/ 0x09 /*::]*/ : { n : 'RevNumber' , t : VT _STRING } ,
/*::[*/ 0x0A /*::]*/ : { n : 'EditTime' , t : VT _FILETIME } ,
/*::[*/ 0x0B /*::]*/ : { n : 'LastPrinted' , t : VT _FILETIME } ,
/*::[*/ 0x0C /*::]*/ : { n : 'CreatedDate' , t : VT _FILETIME } ,
/*::[*/ 0x0D /*::]*/ : { n : 'ModifiedDate' , t : VT _FILETIME } ,
/*::[*/ 0x0E /*::]*/ : { n : 'PageCount' , t : VT _I4 } ,
/*::[*/ 0x0F /*::]*/ : { n : 'WordCount' , t : VT _I4 } ,
/*::[*/ 0x10 /*::]*/ : { n : 'CharCount' , t : VT _I4 } ,
/*::[*/ 0x11 /*::]*/ : { n : 'Thumbnail' , t : VT _CF } ,
2018-05-05 06:34:37 +00:00
/*::[*/ 0x12 /*::]*/ : { n : 'Application' , t : VT _STRING } ,
/*::[*/ 0x13 /*::]*/ : { n : 'DocSecurity' , t : VT _I4 } ,
2021-11-14 04:38:00 +00:00
/*::[*/ 0xFF /*::]*/ : { } ,
/* [MS-OLEPS] 2.18 */
2017-02-10 19:23:01 +00:00
/*::[*/ 0x80000000 /*::]*/ : { n : 'Locale' , t : VT _UI4 } ,
/*::[*/ 0x80000003 /*::]*/ : { n : 'Behavior' , t : VT _UI4 } ,
/*::[*/ 0x72627262 /*::]*/ : { }
2017-02-03 20:50:45 +00:00
} ;
/* [MS-XLS] 2.4.63 Country/Region codes */
var CountryEnum = {
2017-02-10 19:23:01 +00:00
/*::[*/ 0x0001 /*::]*/ : "US" , // United States
/*::[*/ 0x0002 /*::]*/ : "CA" , // Canada
/*::[*/ 0x0003 /*::]*/ : "" , // Latin America (except Brazil)
/*::[*/ 0x0007 /*::]*/ : "RU" , // Russia
/*::[*/ 0x0014 /*::]*/ : "EG" , // Egypt
/*::[*/ 0x001E /*::]*/ : "GR" , // Greece
/*::[*/ 0x001F /*::]*/ : "NL" , // Netherlands
/*::[*/ 0x0020 /*::]*/ : "BE" , // Belgium
/*::[*/ 0x0021 /*::]*/ : "FR" , // France
/*::[*/ 0x0022 /*::]*/ : "ES" , // Spain
/*::[*/ 0x0024 /*::]*/ : "HU" , // Hungary
/*::[*/ 0x0027 /*::]*/ : "IT" , // Italy
/*::[*/ 0x0029 /*::]*/ : "CH" , // Switzerland
/*::[*/ 0x002B /*::]*/ : "AT" , // Austria
/*::[*/ 0x002C /*::]*/ : "GB" , // United Kingdom
/*::[*/ 0x002D /*::]*/ : "DK" , // Denmark
/*::[*/ 0x002E /*::]*/ : "SE" , // Sweden
/*::[*/ 0x002F /*::]*/ : "NO" , // Norway
/*::[*/ 0x0030 /*::]*/ : "PL" , // Poland
/*::[*/ 0x0031 /*::]*/ : "DE" , // Germany
/*::[*/ 0x0034 /*::]*/ : "MX" , // Mexico
/*::[*/ 0x0037 /*::]*/ : "BR" , // Brazil
/*::[*/ 0x003d /*::]*/ : "AU" , // Australia
/*::[*/ 0x0040 /*::]*/ : "NZ" , // New Zealand
/*::[*/ 0x0042 /*::]*/ : "TH" , // Thailand
/*::[*/ 0x0051 /*::]*/ : "JP" , // Japan
/*::[*/ 0x0052 /*::]*/ : "KR" , // Korea
/*::[*/ 0x0054 /*::]*/ : "VN" , // Viet Nam
/*::[*/ 0x0056 /*::]*/ : "CN" , // China
/*::[*/ 0x005A /*::]*/ : "TR" , // Turkey
/*::[*/ 0x0069 /*::]*/ : "JS" , // Ramastan
/*::[*/ 0x00D5 /*::]*/ : "DZ" , // Algeria
/*::[*/ 0x00D8 /*::]*/ : "MA" , // Morocco
/*::[*/ 0x00DA /*::]*/ : "LY" , // Libya
/*::[*/ 0x015F /*::]*/ : "PT" , // Portugal
/*::[*/ 0x0162 /*::]*/ : "IS" , // Iceland
/*::[*/ 0x0166 /*::]*/ : "FI" , // Finland
/*::[*/ 0x01A4 /*::]*/ : "CZ" , // Czech Republic
/*::[*/ 0x0376 /*::]*/ : "TW" , // Taiwan
/*::[*/ 0x03C1 /*::]*/ : "LB" , // Lebanon
/*::[*/ 0x03C2 /*::]*/ : "JO" , // Jordan
/*::[*/ 0x03C3 /*::]*/ : "SY" , // Syria
/*::[*/ 0x03C4 /*::]*/ : "IQ" , // Iraq
/*::[*/ 0x03C5 /*::]*/ : "KW" , // Kuwait
/*::[*/ 0x03C6 /*::]*/ : "SA" , // Saudi Arabia
/*::[*/ 0x03CB /*::]*/ : "AE" , // United Arab Emirates
/*::[*/ 0x03CC /*::]*/ : "IL" , // Israel
/*::[*/ 0x03CE /*::]*/ : "QA" , // Qatar
/*::[*/ 0x03D5 /*::]*/ : "IR" , // Iran
/*::[*/ 0xFFFF /*::]*/ : "US" // United States
2017-02-03 20:50:45 +00:00
} ;
/* [MS-XLS] 2.5.127 */
var XLSFillPattern = [
null ,
'solid' ,
'mediumGray' ,
'darkGray' ,
'lightGray' ,
'darkHorizontal' ,
'darkVertical' ,
'darkDown' ,
'darkUp' ,
'darkGrid' ,
'darkTrellis' ,
'lightHorizontal' ,
'lightVertical' ,
'lightDown' ,
'lightUp' ,
'lightGrid' ,
'lightTrellis' ,
'gray125' ,
'gray0625'
] ;
2020-09-11 08:38:33 +00:00
function rgbify ( arr /*:Array<number>*/ ) /*:Array<[number, number, number]>*/ { return arr . map ( function ( x ) { return [ ( x >> 16 ) & 255 , ( x >> 8 ) & 255 , x & 255 ] ; } ) ; }
2017-02-03 20:50:45 +00:00
/* [MS-XLS] 2.5.161 */
2018-02-14 20:06:35 +00:00
/* [MS-XLSB] 2.5.75 Icv */
2022-03-20 05:29:24 +00:00
var _XLSIcv = /*#__PURE__*/ rgbify ( [
2017-02-03 20:50:45 +00:00
/* Color Constants */
0x000000 ,
0xFFFFFF ,
0xFF0000 ,
0x00FF00 ,
0x0000FF ,
0xFFFF00 ,
0xFF00FF ,
0x00FFFF ,
2017-05-09 18:07:57 +00:00
/* Overridable Defaults */
2017-02-03 20:50:45 +00:00
0x000000 ,
0xFFFFFF ,
0xFF0000 ,
0x00FF00 ,
0x0000FF ,
0xFFFF00 ,
0xFF00FF ,
0x00FFFF ,
0x800000 ,
0x008000 ,
0x000080 ,
0x808000 ,
0x800080 ,
0x008080 ,
0xC0C0C0 ,
0x808080 ,
0x9999FF ,
0x993366 ,
0xFFFFCC ,
0xCCFFFF ,
0x660066 ,
0xFF8080 ,
0x0066CC ,
0xCCCCFF ,
0x000080 ,
0xFF00FF ,
0xFFFF00 ,
0x00FFFF ,
0x800080 ,
0x800000 ,
0x008080 ,
0x0000FF ,
0x00CCFF ,
0xCCFFFF ,
0xCCFFCC ,
0xFFFF99 ,
0x99CCFF ,
0xFF99CC ,
0xCC99FF ,
0xFFCC99 ,
0x3366FF ,
0x33CCCC ,
0x99CC00 ,
0xFFCC00 ,
0xFF9900 ,
0xFF6600 ,
0x666699 ,
0x969696 ,
0x003366 ,
0x339966 ,
0x003300 ,
0x333300 ,
0x993300 ,
0x993366 ,
0x333399 ,
0x333333 ,
2017-05-09 18:07:57 +00:00
/* Other entries to appease BIFF8/12 */
2022-05-22 23:51:41 +00:00
0x000000 , /* 0x40 icvForeground ?? */
0xFFFFFF , /* 0x41 icvBackground ?? */
2017-05-09 18:07:57 +00:00
0x000000 , /* 0x42 icvFrame ?? */
0x000000 , /* 0x43 icv3D ?? */
0x000000 , /* 0x44 icv3DText ?? */
0x000000 , /* 0x45 icv3DHilite ?? */
0x000000 , /* 0x46 icv3DShadow ?? */
0x000000 , /* 0x47 icvHilite ?? */
0x000000 , /* 0x48 icvCtlText ?? */
0x000000 , /* 0x49 icvCtlScrl ?? */
0x000000 , /* 0x4A icvCtlInv ?? */
0x000000 , /* 0x4B icvCtlBody ?? */
0x000000 , /* 0x4C icvCtlFrame ?? */
0x000000 , /* 0x4D icvCtlFore ?? */
0x000000 , /* 0x4E icvCtlBack ?? */
0x000000 , /* 0x4F icvCtlNeutral */
0x000000 , /* 0x50 icvInfoBk ?? */
0x000000 /* 0x51 icvInfoText ?? */
2017-02-03 20:50:45 +00:00
] ) ;
2022-03-20 05:29:24 +00:00
var XLSIcv = /*#__PURE__*/ dup ( _XLSIcv ) ;
2020-07-31 03:38:44 +00:00
/* [MS-XLSB] 2.5.97.2 */
var BErr = {
/*::[*/ 0x00 /*::]*/ : "#NULL!" ,
/*::[*/ 0x07 /*::]*/ : "#DIV/0!" ,
/*::[*/ 0x0F /*::]*/ : "#VALUE!" ,
/*::[*/ 0x17 /*::]*/ : "#REF!" ,
/*::[*/ 0x1D /*::]*/ : "#NAME?" ,
/*::[*/ 0x24 /*::]*/ : "#NUM!" ,
/*::[*/ 0x2A /*::]*/ : "#N/A" ,
/*::[*/ 0x2B /*::]*/ : "#GETTING_DATA" ,
/*::[*/ 0xFF /*::]*/ : "#WTF?"
} ;
2022-03-20 05:29:24 +00:00
//var RBErr = evert_num(BErr);
var RBErr = {
"#NULL!" : 0x00 ,
"#DIV/0!" : 0x07 ,
"#VALUE!" : 0x0F ,
"#REF!" : 0x17 ,
"#NAME?" : 0x1D ,
"#NUM!" : 0x24 ,
"#N/A" : 0x2A ,
"#GETTING_DATA" : 0x2B ,
"#WTF?" : 0xFF
} ;
2022-05-30 08:40:51 +00:00
var XLSLblBuiltIn = [
"_xlnm.Consolidate_Area" ,
"_xlnm.Auto_Open" ,
"_xlnm.Auto_Close" ,
"_xlnm.Extract" ,
"_xlnm.Database" ,
"_xlnm.Criteria" ,
"_xlnm.Print_Area" ,
"_xlnm.Print_Titles" ,
"_xlnm.Recorder" ,
"_xlnm.Data_Form" ,
"_xlnm.Auto_Activate" ,
"_xlnm.Auto_Deactivate" ,
"_xlnm.Sheet_Title" ,
"_xlnm._FilterDatabase"
] ;
2020-09-11 08:38:33 +00:00
/* Parts enumerated in OPC spec, MS-XLSB and MS-XLSX */
2017-02-03 20:50:45 +00:00
/* 12.3 Part Summary <SpreadsheetML> */
/* 14.2 Part Summary <DrawingML> */
2018-02-14 20:06:35 +00:00
/* [MS-XLSX] 2.1 Part Enumerations ; [MS-XLSB] 2.1.7 Part Enumeration */
2017-02-10 19:23:01 +00:00
var ct2type /*{[string]:string}*/ = ( {
2017-02-03 20:50:45 +00:00
/* Workbook */
"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml" : "workbooks" ,
2022-03-12 14:05:57 +00:00
"application/vnd.ms-excel.sheet.macroEnabled.main+xml" : "workbooks" ,
"application/vnd.ms-excel.sheet.binary.macroEnabled.main" : "workbooks" ,
"application/vnd.ms-excel.addin.macroEnabled.main+xml" : "workbooks" ,
"application/vnd.openxmlformats-officedocument.spreadsheetml.template.main+xml" : "workbooks" ,
2017-02-03 20:50:45 +00:00
/* Worksheet */
2022-03-12 14:05:57 +00:00
"application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml" : "sheets" ,
"application/vnd.ms-excel.worksheet" : "sheets" ,
2017-02-03 20:50:45 +00:00
"application/vnd.ms-excel.binIndexWs" : "TODO" , /* Binary Index */
2022-03-12 14:05:57 +00:00
/* Chartsheet */
"application/vnd.openxmlformats-officedocument.spreadsheetml.chartsheet+xml" : "charts" ,
"application/vnd.ms-excel.chartsheet" : "charts" ,
2017-02-03 20:50:45 +00:00
/* Macrosheet */
2022-03-12 14:05:57 +00:00
"application/vnd.ms-excel.macrosheet+xml" : "macros" ,
"application/vnd.ms-excel.macrosheet" : "macros" ,
2017-02-03 20:50:45 +00:00
"application/vnd.ms-excel.intlmacrosheet" : "TODO" ,
"application/vnd.ms-excel.binIndexMs" : "TODO" , /* Binary Index */
2022-03-12 14:05:57 +00:00
/* Dialogsheet */
"application/vnd.openxmlformats-officedocument.spreadsheetml.dialogsheet+xml" : "dialogs" ,
"application/vnd.ms-excel.dialogsheet" : "dialogs" ,
/* Shared Strings */
"application/vnd.openxmlformats-officedocument.spreadsheetml.sharedStrings+xml" : "strs" ,
"application/vnd.ms-excel.sharedStrings" : "strs" ,
/* Styles */
"application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml" : "styles" ,
"application/vnd.ms-excel.styles" : "styles" ,
2017-02-03 20:50:45 +00:00
/* File Properties */
"application/vnd.openxmlformats-package.core-properties+xml" : "coreprops" ,
"application/vnd.openxmlformats-officedocument.custom-properties+xml" : "custprops" ,
"application/vnd.openxmlformats-officedocument.extended-properties+xml" : "extprops" ,
/* Custom Data Properties */
"application/vnd.openxmlformats-officedocument.customXmlProperties+xml" : "TODO" ,
2017-03-27 21:35:15 +00:00
"application/vnd.openxmlformats-officedocument.spreadsheetml.customProperty" : "TODO" ,
2017-02-03 20:50:45 +00:00
2022-03-12 14:05:57 +00:00
/* Comments */
"application/vnd.openxmlformats-officedocument.spreadsheetml.comments+xml" : "comments" ,
"application/vnd.ms-excel.comments" : "comments" ,
2022-03-16 03:18:09 +00:00
"application/vnd.ms-excel.threadedcomments+xml" : "threadedcomments" ,
"application/vnd.ms-excel.person+xml" : "people" ,
2022-03-12 14:05:57 +00:00
/* Metadata (Stock/Geography and Dynamic Array) */
"application/vnd.openxmlformats-officedocument.spreadsheetml.sheetMetadata+xml" : "metadata" ,
"application/vnd.ms-excel.sheetMetadata" : "metadata" ,
2017-02-03 20:50:45 +00:00
/* PivotTable */
"application/vnd.ms-excel.pivotTable" : "TODO" ,
"application/vnd.openxmlformats-officedocument.spreadsheetml.pivotTable+xml" : "TODO" ,
2019-11-01 03:09:14 +00:00
/* Chart Objects */
"application/vnd.openxmlformats-officedocument.drawingml.chart+xml" : "TODO" ,
2017-02-19 20:36:32 +00:00
/* Chart Colors */
"application/vnd.ms-office.chartcolorstyle+xml" : "TODO" ,
/* Chart Style */
"application/vnd.ms-office.chartstyle+xml" : "TODO" ,
2019-11-01 03:09:14 +00:00
/* Chart Advanced */
"application/vnd.ms-office.chartex+xml" : "TODO" ,
2017-02-03 20:50:45 +00:00
/* Calculation Chain */
"application/vnd.ms-excel.calcChain" : "calcchains" ,
"application/vnd.openxmlformats-officedocument.spreadsheetml.calcChain+xml" : "calcchains" ,
/* Printer Settings */
"application/vnd.openxmlformats-officedocument.spreadsheetml.printerSettings" : "TODO" ,
/* ActiveX */
"application/vnd.ms-office.activeX" : "TODO" ,
"application/vnd.ms-office.activeX+xml" : "TODO" ,
/* Custom Toolbars */
"application/vnd.ms-excel.attachedToolbars" : "TODO" ,
/* External Data Connections */
"application/vnd.ms-excel.connections" : "TODO" ,
"application/vnd.openxmlformats-officedocument.spreadsheetml.connections+xml" : "TODO" ,
/* External Links */
2017-07-27 20:07:51 +00:00
"application/vnd.ms-excel.externalLink" : "links" ,
"application/vnd.openxmlformats-officedocument.spreadsheetml.externalLink+xml" : "links" ,
2017-02-03 20:50:45 +00:00
/* PivotCache */
"application/vnd.ms-excel.pivotCacheDefinition" : "TODO" ,
"application/vnd.ms-excel.pivotCacheRecords" : "TODO" ,
"application/vnd.openxmlformats-officedocument.spreadsheetml.pivotCacheDefinition+xml" : "TODO" ,
"application/vnd.openxmlformats-officedocument.spreadsheetml.pivotCacheRecords+xml" : "TODO" ,
/* Query Table */
"application/vnd.ms-excel.queryTable" : "TODO" ,
"application/vnd.openxmlformats-officedocument.spreadsheetml.queryTable+xml" : "TODO" ,
/* Shared Workbook */
"application/vnd.ms-excel.userNames" : "TODO" ,
"application/vnd.ms-excel.revisionHeaders" : "TODO" ,
"application/vnd.ms-excel.revisionLog" : "TODO" ,
"application/vnd.openxmlformats-officedocument.spreadsheetml.revisionHeaders+xml" : "TODO" ,
"application/vnd.openxmlformats-officedocument.spreadsheetml.revisionLog+xml" : "TODO" ,
"application/vnd.openxmlformats-officedocument.spreadsheetml.userNames+xml" : "TODO" ,
/* Single Cell Table */
"application/vnd.ms-excel.tableSingleCells" : "TODO" ,
"application/vnd.openxmlformats-officedocument.spreadsheetml.tableSingleCells+xml" : "TODO" ,
/* Slicer */
"application/vnd.ms-excel.slicer" : "TODO" ,
"application/vnd.ms-excel.slicerCache" : "TODO" ,
"application/vnd.ms-excel.slicer+xml" : "TODO" ,
"application/vnd.ms-excel.slicerCache+xml" : "TODO" ,
/* Sort Map */
"application/vnd.ms-excel.wsSortMap" : "TODO" ,
/* Table */
"application/vnd.ms-excel.table" : "TODO" ,
"application/vnd.openxmlformats-officedocument.spreadsheetml.table+xml" : "TODO" ,
/* Themes */
"application/vnd.openxmlformats-officedocument.theme+xml" : "themes" ,
2017-03-27 21:35:15 +00:00
/* Theme Override */
"application/vnd.openxmlformats-officedocument.themeOverride+xml" : "TODO" ,
2017-02-03 20:50:45 +00:00
/* Timeline */
"application/vnd.ms-excel.Timeline+xml" : "TODO" , /* verify */
"application/vnd.ms-excel.TimelineCache+xml" : "TODO" , /* verify */
/* VBA */
"application/vnd.ms-office.vbaProject" : "vba" ,
2022-02-10 12:40:50 +00:00
"application/vnd.ms-office.vbaProjectSignature" : "TODO" ,
2017-02-03 20:50:45 +00:00
/* Volatile Dependencies */
"application/vnd.ms-office.volatileDependencies" : "TODO" ,
"application/vnd.openxmlformats-officedocument.spreadsheetml.volatileDependencies+xml" : "TODO" ,
/* Control Properties */
"application/vnd.ms-excel.controlproperties+xml" : "TODO" ,
/* Data Model */
"application/vnd.openxmlformats-officedocument.model+data" : "TODO" ,
/* Survey */
"application/vnd.ms-excel.Survey+xml" : "TODO" ,
/* Drawing */
2017-04-08 06:55:35 +00:00
"application/vnd.openxmlformats-officedocument.drawing+xml" : "drawings" ,
2017-02-03 20:50:45 +00:00
"application/vnd.openxmlformats-officedocument.drawingml.chartshapes+xml" : "TODO" ,
"application/vnd.openxmlformats-officedocument.drawingml.diagramColors+xml" : "TODO" ,
"application/vnd.openxmlformats-officedocument.drawingml.diagramData+xml" : "TODO" ,
"application/vnd.openxmlformats-officedocument.drawingml.diagramLayout+xml" : "TODO" ,
"application/vnd.openxmlformats-officedocument.drawingml.diagramStyle+xml" : "TODO" ,
/* VML */
"application/vnd.openxmlformats-officedocument.vmlDrawing" : "TODO" ,
"application/vnd.openxmlformats-package.relationships+xml" : "rels" ,
"application/vnd.openxmlformats-officedocument.oleObject" : "TODO" ,
2017-03-27 21:35:15 +00:00
/* Image */
"image/png" : "TODO" ,
2017-02-03 20:50:45 +00:00
"sheet" : "js"
2017-02-10 19:23:01 +00:00
} /*:any*/ ) ;
2017-02-03 20:50:45 +00:00
2022-03-12 14:05:57 +00:00
var CT _LIST = {
2022-05-22 23:51:41 +00:00
workbooks : {
xlsx : "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml" ,
xlsm : "application/vnd.ms-excel.sheet.macroEnabled.main+xml" ,
xlsb : "application/vnd.ms-excel.sheet.binary.macroEnabled.main" ,
xlam : "application/vnd.ms-excel.addin.macroEnabled.main+xml" ,
xltx : "application/vnd.openxmlformats-officedocument.spreadsheetml.template.main+xml"
} ,
strs : { /* Shared Strings */
xlsx : "application/vnd.openxmlformats-officedocument.spreadsheetml.sharedStrings+xml" ,
xlsb : "application/vnd.ms-excel.sharedStrings"
} ,
comments : { /* Comments */
xlsx : "application/vnd.openxmlformats-officedocument.spreadsheetml.comments+xml" ,
xlsb : "application/vnd.ms-excel.comments"
} ,
sheets : { /* Worksheet */
xlsx : "application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml" ,
xlsb : "application/vnd.ms-excel.worksheet"
} ,
charts : { /* Chartsheet */
xlsx : "application/vnd.openxmlformats-officedocument.spreadsheetml.chartsheet+xml" ,
xlsb : "application/vnd.ms-excel.chartsheet"
} ,
dialogs : { /* Dialogsheet */
xlsx : "application/vnd.openxmlformats-officedocument.spreadsheetml.dialogsheet+xml" ,
xlsb : "application/vnd.ms-excel.dialogsheet"
} ,
macros : { /* Macrosheet (Excel 4.0 Macros) */
xlsx : "application/vnd.ms-excel.macrosheet+xml" ,
xlsb : "application/vnd.ms-excel.macrosheet"
} ,
metadata : { /* Metadata (Stock/Geography and Dynamic Array) */
xlsx : "application/vnd.openxmlformats-officedocument.spreadsheetml.sheetMetadata+xml" ,
xlsb : "application/vnd.ms-excel.sheetMetadata"
} ,
styles : { /* Styles */
xlsx : "application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml" ,
xlsb : "application/vnd.ms-excel.styles"
}
2022-03-12 14:05:57 +00:00
} ;
2017-02-03 20:50:45 +00:00
2017-07-27 20:07:51 +00:00
function new _ct ( ) /*:any*/ {
return ( {
2017-03-28 04:41:01 +00:00
workbooks : [ ] , sheets : [ ] , charts : [ ] , dialogs : [ ] , macros : [ ] ,
2022-03-16 03:18:09 +00:00
rels : [ ] , strs : [ ] , comments : [ ] , threadedcomments : [ ] , links : [ ] ,
2017-03-27 21:35:15 +00:00
coreprops : [ ] , extprops : [ ] , custprops : [ ] , themes : [ ] , styles : [ ] ,
2022-03-16 03:18:09 +00:00
calcchains : [ ] , vba : [ ] , drawings : [ ] , metadata : [ ] , people : [ ] ,
2017-03-27 21:35:15 +00:00
TODO : [ ] , xmlns : "" } /*:any*/ ) ;
2017-07-27 20:07:51 +00:00
}
2018-01-23 09:07:51 +00:00
function parse _ct ( data /*:?string*/ ) {
2017-07-27 20:07:51 +00:00
var ct = new _ct ( ) ;
2017-02-10 19:23:01 +00:00
if ( ! data || ! data . match ) return ct ;
var ctext = { } ;
2017-02-03 20:50:45 +00:00
( data . match ( tagregex ) || [ ] ) . forEach ( function ( x ) {
var y = parsexmltag ( x ) ;
switch ( y [ 0 ] . replace ( nsregex , "<" ) ) {
case '<?xml' : break ;
case '<Types' : ct . xmlns = y [ 'xmlns' + ( y [ 0 ] . match ( /<(\w+):/ ) || [ "" , "" ] ) [ 1 ] ] ; break ;
2022-05-22 23:51:41 +00:00
case '<Default' : ctext [ y . Extension . toLowerCase ( ) ] = y . ContentType ; break ;
2017-02-03 20:50:45 +00:00
case '<Override' :
if ( ct [ ct2type [ y . ContentType ] ] !== undefined ) ct [ ct2type [ y . ContentType ] ] . push ( y . PartName ) ;
break ;
}
} ) ;
if ( ct . xmlns !== XMLNS . CT ) throw new Error ( "Unknown Namespace: " + ct . xmlns ) ;
ct . calcchain = ct . calcchains . length > 0 ? ct . calcchains [ 0 ] : "" ;
ct . sst = ct . strs . length > 0 ? ct . strs [ 0 ] : "" ;
ct . style = ct . styles . length > 0 ? ct . styles [ 0 ] : "" ;
ct . defaults = ctext ;
delete ct . calcchains ;
return ct ;
}
2022-05-22 23:51:41 +00:00
function write _ct ( ct , opts , raw ) /*:string*/ {
2022-03-12 14:05:57 +00:00
var type2ct /*{[string]:Array<string>}*/ = evert _arr ( ct2type ) ;
2017-02-10 19:23:01 +00:00
var o /*:Array<string>*/ = [ ] , v ;
2022-03-20 05:29:24 +00:00
2022-05-22 23:51:41 +00:00
if ( ! raw ) {
o [ o . length ] = ( XML _HEADER ) ;
o [ o . length ] = writextag ( 'Types' , null , {
'xmlns' : XMLNS . CT ,
'xmlns:xsd' : XMLNS . xsd ,
'xmlns:xsi' : XMLNS . xsi
} ) ;
o = o . concat ( [
[ 'xml' , 'application/xml' ] ,
[ 'bin' , 'application/vnd.ms-excel.sheet.binary.macroEnabled.main' ] ,
[ 'vml' , 'application/vnd.openxmlformats-officedocument.vmlDrawing' ] ,
[ 'data' , 'application/vnd.openxmlformats-officedocument.model+data' ] ,
/* from test files */
[ 'bmp' , 'image/bmp' ] ,
[ 'png' , 'image/png' ] ,
[ 'gif' , 'image/gif' ] ,
[ 'emf' , 'image/x-emf' ] ,
[ 'wmf' , 'image/x-wmf' ] ,
[ 'jpg' , 'image/jpeg' ] , [ 'jpeg' , 'image/jpeg' ] ,
[ 'tif' , 'image/tiff' ] , [ 'tiff' , 'image/tiff' ] ,
[ 'pdf' , 'application/pdf' ] ,
[ 'rels' , 'application/vnd.openxmlformats-package.relationships+xml' ]
] . map ( function ( x ) {
return writextag ( 'Default' , null , { 'Extension' : x [ 0 ] , 'ContentType' : x [ 1 ] } ) ;
} ) ) ;
}
2019-11-01 03:09:14 +00:00
/* only write first instance */
2017-02-03 20:50:45 +00:00
var f1 = function ( w ) {
if ( ct [ w ] && ct [ w ] . length > 0 ) {
v = ct [ w ] [ 0 ] ;
o [ o . length ] = ( writextag ( 'Override' , null , {
'PartName' : ( v [ 0 ] == '/' ? "" : "/" ) + v ,
2022-03-12 14:05:57 +00:00
'ContentType' : CT _LIST [ w ] [ opts . bookType ] || CT _LIST [ w ] [ 'xlsx' ]
2017-02-03 20:50:45 +00:00
} ) ) ;
}
} ;
2019-11-01 03:09:14 +00:00
/* book type-specific */
2017-02-03 20:50:45 +00:00
var f2 = function ( w ) {
2017-04-08 06:55:35 +00:00
( ct [ w ] || [ ] ) . forEach ( function ( v ) {
2017-02-03 20:50:45 +00:00
o [ o . length ] = ( writextag ( 'Override' , null , {
'PartName' : ( v [ 0 ] == '/' ? "" : "/" ) + v ,
2022-03-12 14:05:57 +00:00
'ContentType' : CT _LIST [ w ] [ opts . bookType ] || CT _LIST [ w ] [ 'xlsx' ]
2017-02-03 20:50:45 +00:00
} ) ) ;
} ) ;
} ;
2019-11-01 03:09:14 +00:00
/* standard type */
2017-02-03 20:50:45 +00:00
var f3 = function ( t ) {
( ct [ t ] || [ ] ) . forEach ( function ( v ) {
o [ o . length ] = ( writextag ( 'Override' , null , {
'PartName' : ( v [ 0 ] == '/' ? "" : "/" ) + v ,
'ContentType' : type2ct [ t ] [ 0 ]
} ) ) ;
} ) ;
} ;
2019-11-01 03:09:14 +00:00
2017-02-03 20:50:45 +00:00
f1 ( 'workbooks' ) ;
f2 ( 'sheets' ) ;
2017-04-08 06:55:35 +00:00
f2 ( 'charts' ) ;
2017-02-03 20:50:45 +00:00
f3 ( 'themes' ) ;
[ 'strs' , 'styles' ] . forEach ( f1 ) ;
[ 'coreprops' , 'extprops' , 'custprops' ] . forEach ( f3 ) ;
2017-03-28 04:41:01 +00:00
f3 ( 'vba' ) ;
2017-04-08 06:55:35 +00:00
f3 ( 'comments' ) ;
2022-03-16 03:18:09 +00:00
f3 ( 'threadedcomments' ) ;
2017-04-08 06:55:35 +00:00
f3 ( 'drawings' ) ;
2022-03-03 08:35:39 +00:00
f2 ( 'metadata' ) ;
2022-03-16 03:18:09 +00:00
f3 ( 'people' ) ;
2022-05-22 23:51:41 +00:00
if ( ! raw && o . length > 2 ) { o [ o . length ] = ( '</Types>' ) ; o [ 1 ] = o [ 1 ] . replace ( "/>" , ">" ) ; }
2017-02-03 20:50:45 +00:00
return o . join ( "" ) ;
}
2017-03-27 21:35:15 +00:00
/* 9.3 Relationships */
2017-02-10 19:23:01 +00:00
var RELS = ( {
2017-02-03 20:50:45 +00:00
WB : "http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument" ,
2017-03-28 04:41:01 +00:00
SHEET : "http://sheetjs.openxmlformats.org/officeDocument/2006/relationships/officeDocument" ,
2017-03-31 00:47:35 +00:00
HLINK : "http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink" ,
2017-04-02 06:47:25 +00:00
VML : "http://schemas.openxmlformats.org/officeDocument/2006/relationships/vmlDrawing" ,
2019-11-01 03:09:14 +00:00
XPATH : "http://schemas.openxmlformats.org/officeDocument/2006/relationships/externalLinkPath" ,
XMISS : "http://schemas.microsoft.com/office/2006/relationships/xlExternalLinkPath/xlPathMissing" ,
XLINK : "http://schemas.openxmlformats.org/officeDocument/2006/relationships/externalLink" ,
2020-09-11 08:38:33 +00:00
CXML : "http://schemas.openxmlformats.org/officeDocument/2006/relationships/customXml" ,
CXMLP : "http://schemas.openxmlformats.org/officeDocument/2006/relationships/customXmlProps" ,
2022-03-16 03:18:09 +00:00
CMNT : "http://schemas.openxmlformats.org/officeDocument/2006/relationships/comments" ,
CORE _PROPS : "http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties" ,
EXT _PROPS : 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/extended-properties' ,
CUST _PROPS : 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/custom-properties' ,
SST : "http://schemas.openxmlformats.org/officeDocument/2006/relationships/sharedStrings" ,
STY : "http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles" ,
THEME : "http://schemas.openxmlformats.org/officeDocument/2006/relationships/theme" ,
CHART : "http://schemas.openxmlformats.org/officeDocument/2006/relationships/chart" ,
CHARTEX : "http://schemas.microsoft.com/office/2014/relationships/chartEx" ,
CS : "http://schemas.openxmlformats.org/officeDocument/2006/relationships/chartsheet" ,
WS : [
"http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet" ,
"http://purl.oclc.org/ooxml/officeDocument/relationships/worksheet"
] ,
DS : "http://schemas.openxmlformats.org/officeDocument/2006/relationships/dialogsheet" ,
MS : "http://schemas.microsoft.com/office/2006/relationships/xlMacrosheet" ,
IMG : "http://schemas.openxmlformats.org/officeDocument/2006/relationships/image" ,
DRAW : "http://schemas.openxmlformats.org/officeDocument/2006/relationships/drawing" ,
XLMETA : "http://schemas.openxmlformats.org/officeDocument/2006/relationships/sheetMetadata" ,
TCMNT : "http://schemas.microsoft.com/office/2017/10/relationships/threadedComment" ,
PEOPLE : "http://schemas.microsoft.com/office/2017/10/relationships/person" ,
2022-05-17 01:26:22 +00:00
CONN : "http://schemas.openxmlformats.org/officeDocument/2006/relationships/connections" ,
2017-03-28 04:41:01 +00:00
VBA : "http://schemas.microsoft.com/office/2006/relationships/vbaProject"
2017-02-10 19:23:01 +00:00
} /*:any*/ ) ;
2017-02-03 20:50:45 +00:00
2017-03-27 21:35:15 +00:00
/* 9.3.3 Representing Relationships */
function get _rels _path ( file /*:string*/ ) /*:string*/ {
var n = file . lastIndexOf ( "/" ) ;
2018-01-11 08:01:25 +00:00
return file . slice ( 0 , n + 1 ) + '_rels/' + file . slice ( n + 1 ) + ".rels" ;
2017-03-27 21:35:15 +00:00
}
2017-02-10 19:23:01 +00:00
function parse _rels ( data /*:?string*/ , currentFilePath /*:string*/ ) {
2019-11-15 01:46:49 +00:00
var rels = { "!id" : { } } ;
if ( ! data ) return rels ;
2017-02-03 20:50:45 +00:00
if ( currentFilePath . charAt ( 0 ) !== '/' ) {
currentFilePath = '/' + currentFilePath ;
}
var hash = { } ;
2017-02-10 19:23:01 +00:00
( data . match ( tagregex ) || [ ] ) . forEach ( function ( x ) {
2017-02-03 20:50:45 +00:00
var y = parsexmltag ( x ) ;
/* 9.3.2.2 OPC_Relationships */
if ( y [ 0 ] === '<Relationship' ) {
2022-01-10 18:45:50 +00:00
var rel = { } ; rel . Type = y . Type ; rel . Target = y . Target ; rel . Id = y . Id ; if ( y . TargetMode ) rel . TargetMode = y . TargetMode ;
2017-03-27 21:35:15 +00:00
var canonictarget = y . TargetMode === 'External' ? y . Target : resolve _path ( y . Target , currentFilePath ) ;
2017-02-03 20:50:45 +00:00
rels [ canonictarget ] = rel ;
hash [ y . Id ] = rel ;
}
} ) ;
rels [ "!id" ] = hash ;
return rels ;
}
/* TODO */
2017-02-10 19:23:01 +00:00
function write _rels ( rels ) /*:string*/ {
2022-03-20 05:29:24 +00:00
var o = [ XML _HEADER , writextag ( 'Relationships' , null , {
//'xmlns:ns0': XMLNS.RELS,
'xmlns' : XMLNS . RELS
} ) ] ;
2017-04-08 06:55:35 +00:00
keys ( rels [ '!id' ] ) . forEach ( function ( rid ) {
o [ o . length ] = ( writextag ( 'Relationship' , null , rels [ '!id' ] [ rid ] ) ) ;
2017-02-03 20:50:45 +00:00
} ) ;
if ( o . length > 2 ) { o [ o . length ] = ( '</Relationships>' ) ; o [ 1 ] = o [ 1 ] . replace ( "/>" , ">" ) ; }
return o . join ( "" ) ;
}
2017-03-31 00:47:35 +00:00
2019-11-01 03:09:14 +00:00
function add _rels ( rels , rId /*:number*/ , f , type , relobj , targetmode /*:?string*/ ) /*:number*/ {
2017-03-31 00:47:35 +00:00
if ( ! relobj ) relobj = { } ;
if ( ! rels [ '!id' ] ) rels [ '!id' ] = { } ;
2022-03-03 08:35:39 +00:00
if ( ! rels [ '!idx' ] ) rels [ '!idx' ] = 1 ;
if ( rId < 0 ) for ( rId = rels [ '!idx' ] ; rels [ '!id' ] [ 'rId' + rId ] ; ++ rId ) { /* empty */ }
rels [ '!idx' ] = rId + 1 ;
2017-03-31 00:47:35 +00:00
relobj . Id = 'rId' + rId ;
relobj . Type = type ;
relobj . Target = f ;
2019-11-01 03:09:14 +00:00
if ( targetmode ) relobj . TargetMode = targetmode ;
2022-03-21 01:39:16 +00:00
else if ( [ RELS . HLINK , RELS . XPATH , RELS . XMISS ] . indexOf ( relobj . Type ) > - 1 ) relobj . TargetMode = "External" ;
2017-03-31 00:47:35 +00:00
if ( rels [ '!id' ] [ relobj . Id ] ) throw new Error ( "Cannot rewrite rId " + rId ) ;
rels [ '!id' ] [ relobj . Id ] = relobj ;
rels [ ( '/' + relobj . Target ) . replace ( "//" , "/" ) ] = relobj ;
return rId ;
}
2017-03-10 01:09:18 +00:00
/* Open Document Format for Office Applications (OpenDocument) Version 1.2 */
/* Part 3 Section 4 Manifest File */
var CT _ODS = "application/vnd.oasis.opendocument.spreadsheet" ;
function parse _manifest ( d , opts ) {
var str = xlml _normalize ( d ) ;
var Rn ;
var FEtag ;
while ( ( Rn = xlmlregex . exec ( str ) ) ) switch ( Rn [ 3 ] ) {
case 'manifest' : break ; // 4.2 <manifest:manifest>
case 'file-entry' : // 4.3 <manifest:file-entry>
FEtag = parsexmltag ( Rn [ 0 ] , false ) ;
if ( FEtag . path == '/' && FEtag . type !== CT _ODS ) throw new Error ( "This OpenDocument is not a spreadsheet" ) ;
break ;
case 'encryption-data' : // 4.4 <manifest:encryption-data>
case 'algorithm' : // 4.5 <manifest:algorithm>
case 'start-key-generation' : // 4.6 <manifest:start-key-generation>
case 'key-derivation' : // 4.7 <manifest:key-derivation>
throw new Error ( "Unsupported ODS Encryption" ) ;
default : if ( opts && opts . WTF ) throw Rn ;
}
}
2018-01-23 09:07:51 +00:00
function write _manifest ( manifest /*:Array<Array<string> >*/ ) /*:string*/ {
2017-03-10 01:09:18 +00:00
var o = [ XML _HEADER ] ;
o . push ( '<manifest:manifest xmlns:manifest="urn:oasis:names:tc:opendocument:xmlns:manifest:1.0" manifest:version="1.2">\n' ) ;
o . push ( ' <manifest:file-entry manifest:full-path="/" manifest:version="1.2" manifest:media-type="application/vnd.oasis.opendocument.spreadsheet"/>\n' ) ;
for ( var i = 0 ; i < manifest . length ; ++ i ) o . push ( ' <manifest:file-entry manifest:full-path="' + manifest [ i ] [ 0 ] + '" manifest:media-type="' + manifest [ i ] [ 1 ] + '"/>\n' ) ;
o . push ( '</manifest:manifest>' ) ;
return o . join ( "" ) ;
}
/* Part 3 Section 6 Metadata Manifest File */
function write _rdf _type ( file /*:string*/ , res /*:string*/ , tag /*:?string*/ ) {
return [
' <rdf:Description rdf:about="' + file + '">\n' ,
' <rdf:type rdf:resource="http://docs.oasis-open.org/ns/office/1.2/meta/' + ( tag || "odf" ) + '#' + res + '"/>\n' ,
' </rdf:Description>\n'
] . join ( "" ) ;
}
function write _rdf _has ( base /*:string*/ , file /*:string*/ ) {
return [
' <rdf:Description rdf:about="' + base + '">\n' ,
' <ns0:hasPart xmlns:ns0="http://docs.oasis-open.org/ns/office/1.2/meta/pkg#" rdf:resource="' + file + '"/>\n' ,
' </rdf:Description>\n'
] . join ( "" ) ;
}
2018-01-23 09:07:51 +00:00
function write _rdf ( rdf ) {
2017-03-10 01:09:18 +00:00
var o = [ XML _HEADER ] ;
o . push ( '<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">\n' ) ;
for ( var i = 0 ; i != rdf . length ; ++ i ) {
o . push ( write _rdf _type ( rdf [ i ] [ 0 ] , rdf [ i ] [ 1 ] ) ) ;
o . push ( write _rdf _has ( "" , rdf [ i ] [ 0 ] ) ) ;
}
o . push ( write _rdf _type ( "" , "Document" , "pkg" ) ) ;
o . push ( '</rdf:RDF>' ) ;
return o . join ( "" ) ;
}
2017-05-11 07:29:59 +00:00
/* TODO: pull properties */
2022-03-12 14:05:57 +00:00
function write _meta _ods ( /*:: wb: Workbook, opts: any*/ ) /*:string*/ {
return '<office:document-meta xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:xlink="http://www.w3.org/1999/xlink" office:version="1.2"><office:meta><meta:generator>Sheet' + 'JS ' + XLSX . version + '</meta:generator></office:meta></office:document-meta>' ;
}
2017-05-11 07:29:59 +00:00
2017-02-03 20:50:45 +00:00
/* ECMA-376 Part II 11.1 Core Properties Part */
/* [MS-OSHARED] 2.3.3.2.[1-2].1 (PIDSI/PIDDSI) */
2017-02-10 19:23:01 +00:00
var CORE _PROPS /*:Array<Array<string> >*/ = [
2017-02-03 20:50:45 +00:00
[ "cp:category" , "Category" ] ,
[ "cp:contentStatus" , "ContentStatus" ] ,
[ "cp:keywords" , "Keywords" ] ,
[ "cp:lastModifiedBy" , "LastAuthor" ] ,
[ "cp:lastPrinted" , "LastPrinted" ] ,
[ "cp:revision" , "RevNumber" ] ,
[ "cp:version" , "Version" ] ,
[ "dc:creator" , "Author" ] ,
[ "dc:description" , "Comments" ] ,
[ "dc:identifier" , "Identifier" ] ,
[ "dc:language" , "Language" ] ,
[ "dc:subject" , "Subject" ] ,
[ "dc:title" , "Title" ] ,
[ "dcterms:created" , "CreatedDate" , 'date' ] ,
[ "dcterms:modified" , "ModifiedDate" , 'date' ]
] ;
2022-03-12 14:05:57 +00:00
var CORE _PROPS _REGEX /*:Array<RegExp>*/ = /*#__PURE__*/ ( function ( ) {
2017-02-03 20:50:45 +00:00
var r = new Array ( CORE _PROPS . length ) ;
for ( var i = 0 ; i < CORE _PROPS . length ; ++ i ) {
var f = CORE _PROPS [ i ] ;
2018-01-11 08:01:25 +00:00
var g = "(?:" + f [ 0 ] . slice ( 0 , f [ 0 ] . indexOf ( ":" ) ) + ":)" + f [ 0 ] . slice ( f [ 0 ] . indexOf ( ":" ) + 1 ) ;
2017-07-05 22:27:54 +00:00
r [ i ] = new RegExp ( "<" + g + "[^>]*>([\\s\\S]*?)<\/" + g + ">" ) ;
2017-02-03 20:50:45 +00:00
}
return r ;
} ) ( ) ;
function parse _core _props ( data ) {
var p = { } ;
2017-09-30 06:18:11 +00:00
data = utf8read ( data ) ;
2017-02-03 20:50:45 +00:00
for ( var i = 0 ; i < CORE _PROPS . length ; ++ i ) {
var f = CORE _PROPS [ i ] , cur = data . match ( CORE _PROPS _REGEX [ i ] ) ;
2019-11-27 09:47:16 +00:00
if ( cur != null && cur . length > 0 ) p [ f [ 1 ] ] = unescapexml ( cur [ 1 ] ) ;
2017-03-23 01:18:40 +00:00
if ( f [ 2 ] === 'date' && p [ f [ 1 ] ] ) p [ f [ 1 ] ] = parseDate ( p [ f [ 1 ] ] ) ;
2017-02-03 20:50:45 +00:00
}
return p ;
}
function cp _doit ( f , g , h , o , p ) {
if ( p [ f ] != null || g == null || g === "" ) return ;
p [ f ] = g ;
2019-11-27 09:47:16 +00:00
g = escapexml ( g ) ;
2017-02-03 20:50:45 +00:00
o [ o . length ] = ( h ? writextag ( f , g , h ) : writetag ( f , g ) ) ;
}
2017-04-10 05:10:54 +00:00
function write _core _props ( cp , _opts ) {
var opts = _opts || { } ;
2022-03-16 03:18:09 +00:00
var o = [ XML _HEADER , writextag ( 'cp:coreProperties' , null , {
//'xmlns': XMLNS.CORE_PROPS,
'xmlns:cp' : XMLNS . CORE _PROPS ,
'xmlns:dc' : XMLNS . dc ,
'xmlns:dcterms' : XMLNS . dcterms ,
'xmlns:dcmitype' : XMLNS . dcmitype ,
'xmlns:xsi' : XMLNS . xsi
} ) ] , p = { } ;
2017-04-10 05:10:54 +00:00
if ( ! cp && ! opts . Props ) return o . join ( "" ) ;
2017-02-03 20:50:45 +00:00
2017-04-10 05:10:54 +00:00
if ( cp ) {
if ( cp . CreatedDate != null ) cp _doit ( "dcterms:created" , typeof cp . CreatedDate === "string" ? cp . CreatedDate : write _w3cdtf ( cp . CreatedDate , opts . WTF ) , { "xsi:type" : "dcterms:W3CDTF" } , o , p ) ;
if ( cp . ModifiedDate != null ) cp _doit ( "dcterms:modified" , typeof cp . ModifiedDate === "string" ? cp . ModifiedDate : write _w3cdtf ( cp . ModifiedDate , opts . WTF ) , { "xsi:type" : "dcterms:W3CDTF" } , o , p ) ;
}
2017-02-03 20:50:45 +00:00
2017-04-10 05:10:54 +00:00
for ( var i = 0 ; i != CORE _PROPS . length ; ++ i ) {
var f = CORE _PROPS [ i ] ;
var v = opts . Props && opts . Props [ f [ 1 ] ] != null ? opts . Props [ f [ 1 ] ] : cp ? cp [ f [ 1 ] ] : null ;
if ( v === true ) v = "1" ;
else if ( v === false ) v = "0" ;
else if ( typeof v == "number" ) v = String ( v ) ;
if ( v != null ) cp _doit ( f [ 0 ] , v , null , o , p ) ;
}
2017-02-03 20:50:45 +00:00
if ( o . length > 2 ) { o [ o . length ] = ( '</cp:coreProperties>' ) ; o [ 1 ] = o [ 1 ] . replace ( "/>" , ">" ) ; }
return o . join ( "" ) ;
}
/* 15.2.12.3 Extended File Properties Part */
/* [MS-OSHARED] 2.3.3.2.[1-2].1 (PIDSI/PIDDSI) */
2017-02-10 19:23:01 +00:00
var EXT _PROPS /*:Array<Array<string> >*/ = [
2017-02-03 20:50:45 +00:00
[ "Application" , "Application" , "string" ] ,
[ "AppVersion" , "AppVersion" , "string" ] ,
[ "Company" , "Company" , "string" ] ,
[ "DocSecurity" , "DocSecurity" , "string" ] ,
[ "Manager" , "Manager" , "string" ] ,
[ "HyperlinksChanged" , "HyperlinksChanged" , "bool" ] ,
[ "SharedDoc" , "SharedDoc" , "bool" ] ,
[ "LinksUpToDate" , "LinksUpToDate" , "bool" ] ,
[ "ScaleCrop" , "ScaleCrop" , "bool" ] ,
[ "HeadingPairs" , "HeadingPairs" , "raw" ] ,
[ "TitlesOfParts" , "TitlesOfParts" , "raw" ]
] ;
2018-05-05 06:34:37 +00:00
var PseudoPropsPairs = [
"Worksheets" , "SheetNames" ,
"NamedRanges" , "DefinedNames" ,
"Chartsheets" , "ChartNames"
] ;
function load _props _pairs ( HP /*:string|Array<Array<any>>*/ , TOP , props , opts ) {
var v = [ ] ;
if ( typeof HP == "string" ) v = parseVector ( HP , opts ) ;
else for ( var j = 0 ; j < HP . length ; ++ j ) v = v . concat ( HP [ j ] . map ( function ( hp ) { return { v : hp } ; } ) ) ;
var parts = ( typeof TOP == "string" ) ? parseVector ( TOP , opts ) . map ( function ( x ) { return x . v ; } ) : TOP ;
var idx = 0 , len = 0 ;
if ( parts . length > 0 ) for ( var i = 0 ; i !== v . length ; i += 2 ) {
len = + ( v [ i + 1 ] . v ) ;
switch ( v [ i ] . v ) {
case "Worksheets" :
case "工作表" :
case "Листы" :
case "أوراق العمل" :
case "ワークシート" :
case "גליונות עבודה" :
case "Arbeitsblätter" :
case "Çalı şma Sayfaları " :
case "Feuilles de calcul" :
case "Fogli di lavoro" :
case "Folhas de cálculo" :
case "Planilhas" :
case "Regneark" :
2019-11-01 03:09:14 +00:00
case "Hojas de cálculo" :
2018-05-05 06:34:37 +00:00
case "Werkbladen" :
props . Worksheets = len ;
props . SheetNames = parts . slice ( idx , idx + len ) ;
break ;
case "Named Ranges" :
2019-11-01 03:09:14 +00:00
case "Rangos con nombre" :
2018-05-05 06:34:37 +00:00
case "名前付き一覧" :
case "Benannte Bereiche" :
case "Navngivne områder" :
props . NamedRanges = len ;
props . DefinedNames = parts . slice ( idx , idx + len ) ;
break ;
case "Charts" :
case "Diagramme" :
props . Chartsheets = len ;
props . ChartNames = parts . slice ( idx , idx + len ) ;
break ;
}
idx += len ;
}
}
2017-08-03 15:51:16 +00:00
function parse _ext _props ( data , p , opts ) {
2017-02-03 20:50:45 +00:00
var q = { } ; if ( ! p ) p = { } ;
2017-09-30 06:18:11 +00:00
data = utf8read ( data ) ;
2017-02-03 20:50:45 +00:00
EXT _PROPS . forEach ( function ( f ) {
2019-11-27 09:47:16 +00:00
var xml = ( data . match ( matchtag ( f [ 0 ] ) ) || [ ] ) [ 1 ] ;
2017-02-03 20:50:45 +00:00
switch ( f [ 2 ] ) {
2020-05-16 19:45:54 +00:00
case "string" : if ( xml ) p [ f [ 1 ] ] = unescapexml ( xml ) ; break ;
2019-11-27 09:47:16 +00:00
case "bool" : p [ f [ 1 ] ] = xml === "true" ; break ;
2017-02-03 20:50:45 +00:00
case "raw" :
2017-07-05 22:27:54 +00:00
var cur = data . match ( new RegExp ( "<" + f [ 0 ] + "[^>]*>([\\s\\S]*?)<\/" + f [ 0 ] + ">" ) ) ;
2017-02-03 20:50:45 +00:00
if ( cur && cur . length > 0 ) q [ f [ 1 ] ] = cur [ 1 ] ;
break ;
}
} ) ;
2018-05-05 06:34:37 +00:00
if ( q . HeadingPairs && q . TitlesOfParts ) load _props _pairs ( q . HeadingPairs , q . TitlesOfParts , p , opts ) ;
2017-03-31 18:46:42 +00:00
2017-02-03 20:50:45 +00:00
return p ;
}
2018-01-23 09:07:51 +00:00
function write _ext _props ( cp /*::, opts*/ ) /*:string*/ {
var o /*:Array<string>*/ = [ ] , W = writextag ;
2017-02-03 20:50:45 +00:00
if ( ! cp ) cp = { } ;
cp . Application = "SheetJS" ;
o [ o . length ] = ( XML _HEADER ) ;
2022-03-16 03:18:09 +00:00
o [ o . length ] = ( writextag ( 'Properties' , null , {
'xmlns' : XMLNS . EXT _PROPS ,
'xmlns:vt' : XMLNS . vt
} ) ) ;
2017-02-03 20:50:45 +00:00
EXT _PROPS . forEach ( function ( f ) {
if ( cp [ f [ 1 ] ] === undefined ) return ;
var v ;
switch ( f [ 2 ] ) {
2019-11-27 09:47:16 +00:00
case 'string' : v = escapexml ( String ( cp [ f [ 1 ] ] ) ) ; break ;
2017-02-03 20:50:45 +00:00
case 'bool' : v = cp [ f [ 1 ] ] ? 'true' : 'false' ; break ;
}
if ( v !== undefined ) o [ o . length ] = ( W ( f [ 0 ] , v ) ) ;
} ) ;
/* TODO: HeadingPairs, TitlesOfParts */
o [ o . length ] = ( W ( 'HeadingPairs' , W ( 'vt:vector' , W ( 'vt:variant' , '<vt:lpstr>Worksheets</vt:lpstr>' ) + W ( 'vt:variant' , W ( 'vt:i4' , String ( cp . Worksheets ) ) ) , { size : 2 , baseType : "variant" } ) ) ) ;
2017-03-13 06:46:37 +00:00
o [ o . length ] = ( W ( 'TitlesOfParts' , W ( 'vt:vector' , cp . SheetNames . map ( function ( s ) { return "<vt:lpstr>" + escapexml ( s ) + "</vt:lpstr>" ; } ) . join ( "" ) , { size : cp . Worksheets , baseType : "lpstr" } ) ) ) ;
2017-02-03 20:50:45 +00:00
if ( o . length > 2 ) { o [ o . length ] = ( '</Properties>' ) ; o [ 1 ] = o [ 1 ] . replace ( "/>" , ">" ) ; }
return o . join ( "" ) ;
}
/* 15.2.12.2 Custom File Properties Part */
var custregex = /<[^>]+>[^<]*/g ;
2017-02-10 19:23:01 +00:00
function parse _cust _props ( data /*:string*/ , opts ) {
var p = { } , name = "" ;
2017-02-03 20:50:45 +00:00
var m = data . match ( custregex ) ;
if ( m ) for ( var i = 0 ; i != m . length ; ++ i ) {
var x = m [ i ] , y = parsexmltag ( x ) ;
switch ( y [ 0 ] ) {
case '<?xml' : break ;
2017-02-19 20:36:32 +00:00
case '<Properties' : break ;
2019-11-27 09:47:16 +00:00
case '<property' : name = unescapexml ( y . name ) ; break ;
2017-02-03 20:50:45 +00:00
case '</property>' : name = null ; break ;
default : if ( x . indexOf ( '<vt:' ) === 0 ) {
var toks = x . split ( '>' ) ;
2018-01-11 08:01:25 +00:00
var type = toks [ 0 ] . slice ( 4 ) , text = toks [ 1 ] ;
2017-02-03 20:50:45 +00:00
/* 22.4.2.32 (CT_Variant). Omit the binary types from 22.4 (Variant Types) */
switch ( type ) {
2017-03-28 22:03:03 +00:00
case 'lpstr' : case 'bstr' : case 'lpwstr' :
2017-02-03 20:50:45 +00:00
p [ name ] = unescapexml ( text ) ;
break ;
case 'bool' :
2018-01-23 09:07:51 +00:00
p [ name ] = parsexmlbool ( text ) ;
2017-02-03 20:50:45 +00:00
break ;
case 'i1' : case 'i2' : case 'i4' : case 'i8' : case 'int' : case 'uint' :
p [ name ] = parseInt ( text , 10 ) ;
break ;
case 'r4' : case 'r8' : case 'decimal' :
p [ name ] = parseFloat ( text ) ;
break ;
case 'filetime' : case 'date' :
2017-03-23 01:18:40 +00:00
p [ name ] = parseDate ( text ) ;
2017-02-03 20:50:45 +00:00
break ;
case 'cy' : case 'error' :
p [ name ] = unescapexml ( text ) ;
break ;
default :
2017-07-26 08:35:28 +00:00
if ( type . slice ( - 1 ) == '/' ) break ;
2017-02-03 20:50:45 +00:00
if ( opts . WTF && typeof console !== 'undefined' ) console . warn ( 'Unexpected' , x , type , toks ) ;
}
2018-01-11 08:01:25 +00:00
} else if ( x . slice ( 0 , 2 ) === "</" ) { /* empty */
2017-02-03 20:50:45 +00:00
} else if ( opts . WTF ) throw new Error ( x ) ;
}
}
return p ;
}
2018-01-23 09:07:51 +00:00
function write _cust _props ( cp /*::, opts*/ ) /*:string*/ {
2022-03-16 03:18:09 +00:00
var o = [ XML _HEADER , writextag ( 'Properties' , null , {
'xmlns' : XMLNS . CUST _PROPS ,
'xmlns:vt' : XMLNS . vt
} ) ] ;
2017-02-03 20:50:45 +00:00
if ( ! cp ) return o . join ( "" ) ;
var pid = 1 ;
keys ( cp ) . forEach ( function custprop ( k ) { ++ pid ;
2020-05-16 19:45:54 +00:00
o [ o . length ] = ( writextag ( 'property' , write _vt ( cp [ k ] , true ) , {
2017-02-03 20:50:45 +00:00
'fmtid' : '{D5CDD505-2E9C-101B-9397-08002B2CF9AE}' ,
'pid' : pid ,
2019-11-27 09:47:16 +00:00
'name' : escapexml ( k )
2017-02-03 20:50:45 +00:00
} ) ) ;
} ) ;
if ( o . length > 2 ) { o [ o . length ] = '</Properties>' ; o [ 1 ] = o [ 1 ] . replace ( "/>" , ">" ) ; }
return o . join ( "" ) ;
}
2017-04-10 05:10:54 +00:00
/* Common Name -> XLML Name */
var XLMLDocPropsMap = {
2017-04-26 02:27:12 +00:00
Title : 'Title' ,
Subject : 'Subject' ,
Author : 'Author' ,
2017-04-10 05:10:54 +00:00
Keywords : 'Keywords' ,
2017-04-26 02:27:12 +00:00
Comments : 'Description' ,
2017-04-10 05:10:54 +00:00
LastAuthor : 'LastAuthor' ,
RevNumber : 'Revision' ,
2017-04-26 02:27:12 +00:00
Application : 'AppName' ,
/* TotalTime: 'TotalTime', */
LastPrinted : 'LastPrinted' ,
2017-04-10 05:10:54 +00:00
CreatedDate : 'Created' ,
ModifiedDate : 'LastSaved' ,
2017-04-26 02:27:12 +00:00
/* Pages */
/* Words */
/* Characters */
Category : 'Category' ,
/* PresentationFormat */
2017-04-10 05:10:54 +00:00
Manager : 'Manager' ,
2017-04-26 02:27:12 +00:00
Company : 'Company' ,
/* Guid */
/* HyperlinkBase */
/* Bytes */
/* Lines */
/* Paragraphs */
/* CharactersWithSpaces */
AppVersion : 'Version' ,
ContentStatus : 'ContentStatus' , /* NOTE: missing from schema */
Identifier : 'Identifier' , /* NOTE: missing from schema */
Language : 'Language' /* NOTE: missing from schema */
2017-04-10 05:10:54 +00:00
} ;
2022-03-16 03:18:09 +00:00
var evert _XLMLDPM ;
2017-04-10 05:10:54 +00:00
2017-02-10 19:23:01 +00:00
function xlml _set _prop ( Props , tag /*:string*/ , val ) {
2022-03-16 03:18:09 +00:00
if ( ! evert _XLMLDPM ) evert _XLMLDPM = evert ( XLMLDocPropsMap ) ;
2017-04-10 05:10:54 +00:00
tag = evert _XLMLDPM [ tag ] || tag ;
2017-02-03 20:50:45 +00:00
Props [ tag ] = val ;
}
2017-04-10 05:10:54 +00:00
function xlml _write _docprops ( Props , opts ) {
2017-12-30 05:40:35 +00:00
var o /*:Array<string>*/ = [ ] ;
2017-04-26 02:27:12 +00:00
keys ( XLMLDocPropsMap ) . map ( function ( m ) {
for ( var i = 0 ; i < CORE _PROPS . length ; ++ i ) if ( CORE _PROPS [ i ] [ 1 ] == m ) return CORE _PROPS [ i ] ;
for ( i = 0 ; i < EXT _PROPS . length ; ++ i ) if ( EXT _PROPS [ i ] [ 1 ] == m ) return EXT _PROPS [ i ] ;
throw m ;
} ) . forEach ( function ( p ) {
2017-04-10 05:10:54 +00:00
if ( Props [ p [ 1 ] ] == null ) return ;
var m = opts && opts . Props && opts . Props [ p [ 1 ] ] != null ? opts . Props [ p [ 1 ] ] : Props [ p [ 1 ] ] ;
2017-03-14 08:19:51 +00:00
switch ( p [ 2 ] ) {
2017-04-26 02:27:12 +00:00
case 'date' : m = new Date ( m ) . toISOString ( ) . replace ( /\.\d*Z/ , "Z" ) ; break ;
2017-03-14 08:19:51 +00:00
}
2017-04-10 05:10:54 +00:00
if ( typeof m == 'number' ) m = String ( m ) ;
2017-04-11 22:15:36 +00:00
else if ( m === true || m === false ) { m = m ? "1" : "0" ; }
2017-04-26 02:27:12 +00:00
else if ( m instanceof Date ) m = new Date ( m ) . toISOString ( ) . replace ( /\.\d*Z/ , "" ) ;
2017-04-10 05:10:54 +00:00
o . push ( writetag ( XLMLDocPropsMap [ p [ 1 ] ] || p [ 1 ] , m ) ) ;
2017-03-14 08:19:51 +00:00
} ) ;
2017-04-10 05:10:54 +00:00
return writextag ( 'DocumentProperties' , o . join ( "" ) , { xmlns : XLMLNS . o } ) ;
2017-03-14 08:19:51 +00:00
}
2018-01-23 09:07:51 +00:00
function xlml _write _custprops ( Props , Custprops /*::, opts*/ ) {
2017-04-10 05:10:54 +00:00
var BLACKLIST = [ "Worksheets" , "SheetNames" ] ;
2017-03-14 08:19:51 +00:00
var T = 'CustomDocumentProperties' ;
2017-12-30 05:40:35 +00:00
var o /*:Array<string>*/ = [ ] ;
2017-03-14 08:19:51 +00:00
if ( Props ) keys ( Props ) . forEach ( function ( k ) {
/*:: if(!Props) return; */
2020-03-15 07:42:05 +00:00
if ( ! Object . prototype . hasOwnProperty . call ( Props , k ) ) return ;
2017-04-10 05:10:54 +00:00
for ( var i = 0 ; i < CORE _PROPS . length ; ++ i ) if ( k == CORE _PROPS [ i ] [ 1 ] ) return ;
for ( i = 0 ; i < EXT _PROPS . length ; ++ i ) if ( k == EXT _PROPS [ i ] [ 1 ] ) return ;
for ( i = 0 ; i < BLACKLIST . length ; ++ i ) if ( k == BLACKLIST [ i ] ) return ;
2017-03-14 08:19:51 +00:00
var m = Props [ k ] ;
var t = "string" ;
if ( typeof m == 'number' ) { t = "float" ; m = String ( m ) ; }
else if ( m === true || m === false ) { t = "boolean" ; m = m ? "1" : "0" ; }
else m = String ( m ) ;
o . push ( writextag ( escapexmltag ( k ) , m , { "dt:dt" : t } ) ) ;
} ) ;
if ( Custprops ) keys ( Custprops ) . forEach ( function ( k ) {
/*:: if(!Custprops) return; */
2020-03-15 07:42:05 +00:00
if ( ! Object . prototype . hasOwnProperty . call ( Custprops , k ) ) return ;
if ( Props && Object . prototype . hasOwnProperty . call ( Props , k ) ) return ;
2017-03-14 08:19:51 +00:00
var m = Custprops [ k ] ;
var t = "string" ;
if ( typeof m == 'number' ) { t = "float" ; m = String ( m ) ; }
else if ( m === true || m === false ) { t = "boolean" ; m = m ? "1" : "0" ; }
else if ( m instanceof Date ) { t = "dateTime.tz" ; m = m . toISOString ( ) ; }
else m = String ( m ) ;
o . push ( writextag ( escapexmltag ( k ) , m , { "dt:dt" : t } ) ) ;
} ) ;
return '<' + T + ' xmlns="' + XLMLNS . o + '">' + o . join ( "" ) + '</' + T + '>' ;
}
2017-02-03 20:50:45 +00:00
/* [MS-DTYP] 2.3.3 FILETIME */
/* [MS-OLEDS] 2.1.3 FILETIME (Packet Version) */
/* [MS-OLEPS] 2.8 FILETIME (Packet Version) */
function parse _FILETIME ( blob ) {
var dwLowDateTime = blob . read _shift ( 4 ) , dwHighDateTime = blob . read _shift ( 4 ) ;
return new Date ( ( ( dwHighDateTime / 1e7 * Math . pow ( 2 , 32 ) + dwLowDateTime / 1e7 ) - 11644473600 ) * 1000 ) . toISOString ( ) . replace ( /\.000/ , "" ) ;
}
2018-05-05 06:34:37 +00:00
function write _FILETIME ( time /*:string|Date*/ ) {
var date = ( typeof time == "string" ) ? new Date ( Date . parse ( time ) ) : time ;
var t = date . getTime ( ) / 1000 + 11644473600 ;
var l = t % Math . pow ( 2 , 32 ) , h = ( t - l ) / Math . pow ( 2 , 32 ) ;
l *= 1e7 ; h *= 1e7 ;
var w = ( l / Math . pow ( 2 , 32 ) ) | 0 ;
if ( w > 0 ) { l = l % Math . pow ( 2 , 32 ) ; h += w ; }
var o = new _buf ( 8 ) ; o . write _shift ( 4 , l ) ; o . write _shift ( 4 , h ) ; return o ;
}
2017-02-03 20:50:45 +00:00
/* [MS-OSHARED] 2.3.3.1.4 Lpstr */
2017-07-27 20:07:51 +00:00
function parse _lpstr ( blob , type , pad /*:?number*/ ) {
2017-12-30 05:40:35 +00:00
var start = blob . l ;
var str = blob . read _shift ( 0 , 'lpstr-cp' ) ;
if ( pad ) while ( ( blob . l - start ) & 3 ) ++ blob . l ;
2017-02-03 20:50:45 +00:00
return str ;
}
/* [MS-OSHARED] 2.3.3.1.6 Lpwstr */
function parse _lpwstr ( blob , type , pad ) {
var str = blob . read _shift ( 0 , 'lpwstr' ) ;
if ( pad ) blob . l += ( 4 - ( ( str . length + 1 ) & 3 ) ) & 3 ;
return str ;
}
/* [MS-OSHARED] 2.3.3.1.11 VtString */
/* [MS-OSHARED] 2.3.3.1.12 VtUnalignedString */
function parse _VtStringBase ( blob , stringType , pad ) {
if ( stringType === 0x1F /*VT_LPWSTR*/ ) return parse _lpwstr ( blob ) ;
return parse _lpstr ( blob , stringType , pad ) ;
}
2017-08-05 06:32:57 +00:00
function parse _VtString ( blob , t /*:number*/ , pad /*:?boolean*/ ) { return parse _VtStringBase ( blob , t , pad === false ? 0 : 4 ) ; }
function parse _VtUnalignedString ( blob , t /*:number*/ ) { if ( ! t ) throw new Error ( "VtUnalignedString must have positive length" ) ; return parse _VtStringBase ( blob , t , 0 ) ; }
2017-02-03 20:50:45 +00:00
2021-10-13 07:20:25 +00:00
/* [MS-OSHARED] 2.3.3.1.7 VtVecLpwstrValue */
function parse _VtVecLpwstrValue ( blob ) /*:Array<string>*/ {
var length = blob . read _shift ( 4 ) ;
var ret /*:Array<string>*/ = [ ] ;
for ( var i = 0 ; i != length ; ++ i ) {
var start = blob . l ;
ret [ i ] = blob . read _shift ( 0 , 'lpwstr' ) . replace ( chr0 , '' ) ;
if ( ( blob . l - start ) & 0x02 ) blob . l += 2 ;
}
return ret ;
}
2017-02-03 20:50:45 +00:00
/* [MS-OSHARED] 2.3.3.1.9 VtVecUnalignedLpstrValue */
2017-12-30 05:40:35 +00:00
function parse _VtVecUnalignedLpstrValue ( blob ) /*:Array<string>*/ {
2017-02-03 20:50:45 +00:00
var length = blob . read _shift ( 4 ) ;
2017-12-30 05:40:35 +00:00
var ret /*:Array<string>*/ = [ ] ;
for ( var i = 0 ; i != length ; ++ i ) ret [ i ] = blob . read _shift ( 0 , 'lpstr-cp' ) . replace ( chr0 , '' ) ;
2017-02-03 20:50:45 +00:00
return ret ;
}
/* [MS-OSHARED] 2.3.3.1.13 VtHeadingPair */
function parse _VtHeadingPair ( blob ) {
2021-10-13 07:20:25 +00:00
var start = blob . l ;
2017-02-03 20:50:45 +00:00
var headingString = parse _TypedPropertyValue ( blob , VT _USTR ) ;
2021-10-13 07:20:25 +00:00
if ( blob [ blob . l ] == 0x00 && blob [ blob . l + 1 ] == 0x00 && ( ( blob . l - start ) & 0x02 ) ) blob . l += 2 ;
2017-02-03 20:50:45 +00:00
var headerParts = parse _TypedPropertyValue ( blob , VT _I4 ) ;
return [ headingString , headerParts ] ;
}
/* [MS-OSHARED] 2.3.3.1.14 VtVecHeadingPairValue */
function parse _VtVecHeadingPairValue ( blob ) {
var cElements = blob . read _shift ( 4 ) ;
var out = [ ] ;
2021-10-13 07:20:25 +00:00
for ( var i = 0 ; i < cElements / 2 ; ++ i ) out . push ( parse _VtHeadingPair ( blob ) ) ;
2017-02-03 20:50:45 +00:00
return out ;
}
/* [MS-OLEPS] 2.18.1 Dictionary (uses 2.17, 2.16) */
function parse _dictionary ( blob , CodePage ) {
var cnt = blob . read _shift ( 4 ) ;
2017-03-05 00:56:31 +00:00
var dict /*:{[number]:string}*/ = ( { } /*:any*/ ) ;
2017-02-03 20:50:45 +00:00
for ( var j = 0 ; j != cnt ; ++ j ) {
var pid = blob . read _shift ( 4 ) ;
var len = blob . read _shift ( 4 ) ;
dict [ pid ] = blob . read _shift ( len , ( CodePage === 0x4B0 ? 'utf16le' : 'utf8' ) ) . replace ( chr0 , '' ) . replace ( chr1 , '!' ) ;
2018-05-05 06:34:37 +00:00
if ( CodePage === 0x4B0 && ( len % 2 ) ) blob . l += 2 ;
2017-02-03 20:50:45 +00:00
}
if ( blob . l & 3 ) blob . l = ( blob . l >> 2 + 1 ) << 2 ;
return dict ;
}
/* [MS-OLEPS] 2.9 BLOB */
function parse _BLOB ( blob ) {
var size = blob . read _shift ( 4 ) ;
var bytes = blob . slice ( blob . l , blob . l + size ) ;
2018-02-21 07:01:34 +00:00
blob . l += size ;
2017-02-10 19:23:01 +00:00
if ( ( size & 3 ) > 0 ) blob . l += ( 4 - ( size & 3 ) ) & 3 ;
2017-02-03 20:50:45 +00:00
return bytes ;
}
/* [MS-OLEPS] 2.11 ClipboardData */
function parse _ClipboardData ( blob ) {
// TODO
var o = { } ;
o . Size = blob . read _shift ( 4 ) ;
//o.Format = blob.read_shift(4);
2018-02-21 07:01:34 +00:00
blob . l += o . Size + 3 - ( o . Size - 1 ) % 4 ;
2017-02-03 20:50:45 +00:00
return o ;
}
/* [MS-OLEPS] 2.15 TypedPropertyValue */
2017-10-17 00:14:32 +00:00
function parse _TypedPropertyValue ( blob , type /*:number*/ , _opts ) /*:any*/ {
2017-02-03 20:50:45 +00:00
var t = blob . read _shift ( 2 ) , ret , opts = _opts || { } ;
blob . l += 2 ;
if ( type !== VT _VARIANT )
2021-10-13 07:20:25 +00:00
if ( t !== type && VT _CUSTOM . indexOf ( type ) === - 1 && ! ( ( type & 0xFFFE ) == 0x101E && ( t & 0xFFFE ) == 0x101E ) ) throw new Error ( 'Expected type ' + type + ' saw ' + t ) ;
2017-02-03 20:50:45 +00:00
switch ( type === VT _VARIANT ? t : type ) {
case 0x02 /*VT_I2*/ : ret = blob . read _shift ( 2 , 'i' ) ; if ( ! opts . raw ) blob . l += 2 ; return ret ;
case 0x03 /*VT_I4*/ : ret = blob . read _shift ( 4 , 'i' ) ; return ret ;
case 0x0B /*VT_BOOL*/ : return blob . read _shift ( 4 ) !== 0x0 ;
case 0x13 /*VT_UI4*/ : ret = blob . read _shift ( 4 ) ; return ret ;
case 0x1E /*VT_LPSTR*/ : return parse _lpstr ( blob , t , 4 ) . replace ( chr0 , '' ) ;
case 0x1F /*VT_LPWSTR*/ : return parse _lpwstr ( blob ) ;
case 0x40 /*VT_FILETIME*/ : return parse _FILETIME ( blob ) ;
case 0x41 /*VT_BLOB*/ : return parse _BLOB ( blob ) ;
case 0x47 /*VT_CF*/ : return parse _ClipboardData ( blob ) ;
2017-08-05 06:32:57 +00:00
case 0x50 /*VT_STRING*/ : return parse _VtString ( blob , t , ! opts . raw ) . replace ( chr0 , '' ) ;
2017-07-05 22:27:54 +00:00
case 0x51 /*VT_USTR*/ : return parse _VtUnalignedString ( blob , t /*, 4*/ ) . replace ( chr0 , '' ) ;
2021-10-13 07:20:25 +00:00
case 0x100C /*VT_VECTOR|VT_VARIANT*/ : return parse _VtVecHeadingPairValue ( blob ) ;
case 0x101E /*VT_VECTOR|VT_LPSTR*/ :
case 0x101F /*VT_VECTOR|VT_LPWSTR*/ :
return t == 0x101F ? parse _VtVecLpwstrValue ( blob ) : parse _VtVecUnalignedLpstrValue ( blob ) ;
2017-02-03 20:50:45 +00:00
default : throw new Error ( "TypedPropertyValue unrecognized type " + type + " " + t ) ;
}
}
2018-05-05 06:34:37 +00:00
function write _TypedPropertyValue ( type /*:number*/ , value ) {
var o = new _buf ( 4 ) , p = new _buf ( 4 ) ;
o . write _shift ( 4 , type == 0x50 ? 0x1F : type ) ;
switch ( type ) {
case 0x03 /*VT_I4*/ : p . write _shift ( - 4 , value ) ; break ;
case 0x05 /*VT_I4*/ : p = new _buf ( 8 ) ; p . write _shift ( 8 , value , 'f' ) ; break ;
case 0x0B /*VT_BOOL*/ : p . write _shift ( 4 , value ? 0x01 : 0x00 ) ; break ;
2018-05-20 01:34:59 +00:00
case 0x40 /*VT_FILETIME*/ : /*:: if(typeof value !== "string" && !(value instanceof Date)) throw "unreachable"; */ p = write _FILETIME ( value ) ; break ;
2018-05-05 06:34:37 +00:00
case 0x1F /*VT_LPWSTR*/ :
case 0x50 /*VT_STRING*/ :
2018-05-20 01:34:59 +00:00
/*:: if(typeof value !== "string") throw "unreachable"; */
2018-05-05 06:34:37 +00:00
p = new _buf ( 4 + 2 * ( value . length + 1 ) + ( value . length % 2 ? 0 : 2 ) ) ;
p . write _shift ( 4 , value . length + 1 ) ;
p . write _shift ( 0 , value , "dbcs" ) ;
while ( p . l != p . length ) p . write _shift ( 1 , 0 ) ;
break ;
default : throw new Error ( "TypedPropertyValue unrecognized type " + type + " " + value ) ;
}
return bconcat ( [ o , p ] ) ;
}
2017-02-03 20:50:45 +00:00
/* [MS-OLEPS] 2.20 PropertySet */
function parse _PropertySet ( blob , PIDSI ) {
var start _addr = blob . l ;
var size = blob . read _shift ( 4 ) ;
var NumProps = blob . read _shift ( 4 ) ;
var Props = [ ] , i = 0 ;
var CodePage = 0 ;
2017-03-05 00:56:31 +00:00
var Dictionary = - 1 , DictObj /*:{[number]:string}*/ = ( { } /*:any*/ ) ;
2017-02-03 20:50:45 +00:00
for ( i = 0 ; i != NumProps ; ++ i ) {
var PropID = blob . read _shift ( 4 ) ;
var Offset = blob . read _shift ( 4 ) ;
Props [ i ] = [ PropID , Offset + start _addr ] ;
}
2017-12-30 05:40:35 +00:00
Props . sort ( function ( x , y ) { return x [ 1 ] - y [ 1 ] ; } ) ;
2017-02-03 20:50:45 +00:00
var PropH = { } ;
for ( i = 0 ; i != NumProps ; ++ i ) {
if ( blob . l !== Props [ i ] [ 1 ] ) {
var fail = true ;
if ( i > 0 && PIDSI ) switch ( PIDSI [ Props [ i - 1 ] [ 0 ] ] . t ) {
2017-12-30 05:40:35 +00:00
case 0x02 /*VT_I2*/ : if ( blob . l + 2 === Props [ i ] [ 1 ] ) { blob . l += 2 ; fail = false ; } break ;
2017-02-03 20:50:45 +00:00
case 0x50 /*VT_STRING*/ : if ( blob . l <= Props [ i ] [ 1 ] ) { blob . l = Props [ i ] [ 1 ] ; fail = false ; } break ;
case 0x100C /*VT_VECTOR|VT_VARIANT*/ : if ( blob . l <= Props [ i ] [ 1 ] ) { blob . l = Props [ i ] [ 1 ] ; fail = false ; } break ;
}
2017-12-30 05:40:35 +00:00
if ( ( ! PIDSI || i == 0 ) && blob . l <= Props [ i ] [ 1 ] ) { fail = false ; blob . l = Props [ i ] [ 1 ] ; }
2017-02-03 20:50:45 +00:00
if ( fail ) throw new Error ( "Read Error: Expected address " + Props [ i ] [ 1 ] + ' at ' + blob . l + ' :' + i ) ;
}
if ( PIDSI ) {
2022-04-25 09:02:14 +00:00
if ( Props [ i ] [ 0 ] == 0 && Props . length > i + 1 && Props [ i ] [ 1 ] == Props [ i + 1 ] [ 1 ] ) continue ; // R9
2017-02-03 20:50:45 +00:00
var piddsi = PIDSI [ Props [ i ] [ 0 ] ] ;
PropH [ piddsi . n ] = parse _TypedPropertyValue ( blob , piddsi . t , { raw : true } ) ;
2018-05-05 06:34:37 +00:00
if ( piddsi . p === 'version' ) PropH [ piddsi . n ] = String ( PropH [ piddsi . n ] >> 16 ) + "." + ( "0000" + String ( PropH [ piddsi . n ] & 0xFFFF ) ) . slice ( - 4 ) ;
2017-02-03 20:50:45 +00:00
if ( piddsi . n == "CodePage" ) switch ( PropH [ piddsi . n ] ) {
case 0 : PropH [ piddsi . n ] = 1252 ;
/* falls through */
2017-05-09 18:07:57 +00:00
case 874 :
case 932 :
case 936 :
case 949 :
case 950 :
case 1250 :
case 1251 :
case 1253 :
case 1254 :
case 1255 :
case 1256 :
case 1257 :
case 1258 :
case 10000 :
case 1200 :
case 1201 :
case 1252 :
case 65000 : case - 536 :
case 65001 : case - 535 :
2017-10-17 00:14:32 +00:00
set _cp ( CodePage = ( PropH [ piddsi . n ] >>> 0 ) & 0xFFFF ) ; break ;
2017-02-03 20:50:45 +00:00
default : throw new Error ( "Unsupported CodePage: " + PropH [ piddsi . n ] ) ;
}
} else {
if ( Props [ i ] [ 0 ] === 0x1 ) {
2017-10-17 00:14:32 +00:00
CodePage = PropH . CodePage = ( parse _TypedPropertyValue ( blob , VT _I2 ) /*:number*/ ) ;
2017-02-03 20:50:45 +00:00
set _cp ( CodePage ) ;
if ( Dictionary !== - 1 ) {
var oldpos = blob . l ;
blob . l = Props [ Dictionary ] [ 1 ] ;
DictObj = parse _dictionary ( blob , CodePage ) ;
blob . l = oldpos ;
}
} else if ( Props [ i ] [ 0 ] === 0 ) {
if ( CodePage === 0 ) { Dictionary = i ; blob . l = Props [ i + 1 ] [ 1 ] ; continue ; }
DictObj = parse _dictionary ( blob , CodePage ) ;
} else {
var name = DictObj [ Props [ i ] [ 0 ] ] ;
var val ;
/* [MS-OSHARED] 2.3.3.2.3.1.2 + PROPVARIANT */
switch ( blob [ blob . l ] ) {
case 0x41 /*VT_BLOB*/ : blob . l += 4 ; val = parse _BLOB ( blob ) ; break ;
2018-05-05 06:34:37 +00:00
case 0x1E /*VT_LPSTR*/ : blob . l += 4 ; val = parse _VtString ( blob , blob [ blob . l - 4 ] ) . replace ( /\u0000+$/ , "" ) ; break ;
case 0x1F /*VT_LPWSTR*/ : blob . l += 4 ; val = parse _VtString ( blob , blob [ blob . l - 4 ] ) . replace ( /\u0000+$/ , "" ) ; break ;
2017-02-03 20:50:45 +00:00
case 0x03 /*VT_I4*/ : blob . l += 4 ; val = blob . read _shift ( 4 , 'i' ) ; break ;
case 0x13 /*VT_UI4*/ : blob . l += 4 ; val = blob . read _shift ( 4 ) ; break ;
case 0x05 /*VT_R8*/ : blob . l += 4 ; val = blob . read _shift ( 8 , 'f' ) ; break ;
case 0x0B /*VT_BOOL*/ : blob . l += 4 ; val = parsebool ( blob , 4 ) ; break ;
2017-03-23 01:18:40 +00:00
case 0x40 /*VT_FILETIME*/ : blob . l += 4 ; val = parseDate ( parse _FILETIME ( blob ) ) ; break ;
2017-02-03 20:50:45 +00:00
default : throw new Error ( "unparsed value: " + blob [ blob . l ] ) ;
}
PropH [ name ] = val ;
}
}
}
blob . l = start _addr + size ; /* step ahead to skip padding */
return PropH ;
}
2022-05-22 23:51:41 +00:00
var XLSPSSkip = [ "CodePage" , "Thumbnail" , "_PID_LINKBASE" , "_PID_HLINKS" , "SystemIdentifier" , "FMTID" ] ;
2018-05-05 06:34:37 +00:00
function guess _property _type ( val /*:any*/ ) /*:number*/ {
switch ( typeof val ) {
case "boolean" : return 0x0B ;
case "number" : return ( ( val | 0 ) == val ) ? 0x03 : 0x05 ;
case "string" : return 0x1F ;
case "object" : if ( val instanceof Date ) return 0x40 ; break ;
}
return - 1 ;
}
function write _PropertySet ( entries , RE , PIDSI ) {
var hdr = new _buf ( 8 ) , piao = [ ] , prop = [ ] ;
var sz = 8 , i = 0 ;
var pr = new _buf ( 8 ) , pio = new _buf ( 8 ) ;
pr . write _shift ( 4 , 0x0002 ) ;
pr . write _shift ( 4 , 0x04B0 ) ;
pio . write _shift ( 4 , 0x0001 ) ;
prop . push ( pr ) ; piao . push ( pio ) ;
sz += 8 + pr . length ;
if ( ! RE ) {
pio = new _buf ( 8 ) ;
pio . write _shift ( 4 , 0 ) ;
piao . unshift ( pio ) ;
var bufs = [ new _buf ( 4 ) ] ;
bufs [ 0 ] . write _shift ( 4 , entries . length ) ;
for ( i = 0 ; i < entries . length ; ++ i ) {
var value = entries [ i ] [ 0 ] ;
pr = new _buf ( 4 + 4 + 2 * ( value . length + 1 ) + ( value . length % 2 ? 0 : 2 ) ) ;
pr . write _shift ( 4 , i + 2 ) ;
pr . write _shift ( 4 , value . length + 1 ) ;
pr . write _shift ( 0 , value , "dbcs" ) ;
while ( pr . l != pr . length ) pr . write _shift ( 1 , 0 ) ;
bufs . push ( pr ) ;
}
pr = bconcat ( bufs ) ;
prop . unshift ( pr ) ;
sz += 8 + pr . length ;
}
for ( i = 0 ; i < entries . length ; ++ i ) {
if ( RE && ! RE [ entries [ i ] [ 0 ] ] ) continue ;
2022-03-16 03:18:09 +00:00
if ( XLSPSSkip . indexOf ( entries [ i ] [ 0 ] ) > - 1 || PseudoPropsPairs . indexOf ( entries [ i ] [ 0 ] ) > - 1 ) continue ;
2018-05-05 06:34:37 +00:00
if ( entries [ i ] [ 1 ] == null ) continue ;
var val = entries [ i ] [ 1 ] , idx = 0 ;
if ( RE ) {
idx = + RE [ entries [ i ] [ 0 ] ] ;
2018-05-20 01:34:59 +00:00
var pinfo = ( PIDSI /*:: || {}*/ ) [ idx ] /*:: || {} */ ;
if ( pinfo . p == "version" && typeof val == "string" ) {
/*:: if(typeof val !== "string") throw "unreachable"; */
var arr = val . split ( "." ) ;
val = ( ( + arr [ 0 ] ) << 16 ) + ( ( + arr [ 1 ] ) || 0 ) ;
}
2018-05-05 06:34:37 +00:00
pr = write _TypedPropertyValue ( pinfo . t , val ) ;
} else {
var T = guess _property _type ( val ) ;
if ( T == - 1 ) { T = 0x1F ; val = String ( val ) ; }
pr = write _TypedPropertyValue ( T , val ) ;
}
prop . push ( pr ) ;
pio = new _buf ( 8 ) ;
pio . write _shift ( 4 , ! RE ? 2 + i : idx ) ;
piao . push ( pio ) ;
sz += 8 + pr . length ;
}
var w = 8 * ( prop . length + 1 ) ;
for ( i = 0 ; i < prop . length ; ++ i ) { piao [ i ] . write _shift ( 4 , w ) ; w += prop [ i ] . length ; }
hdr . write _shift ( 4 , sz ) ;
hdr . write _shift ( 4 , prop . length ) ;
return bconcat ( [ hdr ] . concat ( piao ) . concat ( prop ) ) ;
}
2017-02-03 20:50:45 +00:00
/* [MS-OLEPS] 2.21 PropertySetStream */
2018-02-14 20:06:35 +00:00
function parse _PropertySetStream ( file , PIDSI , clsid ) {
2017-02-03 20:50:45 +00:00
var blob = file . content ;
2017-09-30 06:18:11 +00:00
if ( ! blob ) return ( { } /*:any*/ ) ;
2017-02-03 20:50:45 +00:00
prep _blob ( blob , 0 ) ;
2017-02-10 19:23:01 +00:00
var NumSets , FMTID0 , FMTID1 , Offset0 , Offset1 = 0 ;
2017-02-03 20:50:45 +00:00
blob . chk ( 'feff' , 'Byte Order: ' ) ;
2018-01-23 09:07:51 +00:00
/*var vers = */ blob . read _shift ( 2 ) ; // TODO: check version
2017-02-03 20:50:45 +00:00
var SystemIdentifier = blob . read _shift ( 4 ) ;
2018-02-14 20:06:35 +00:00
var CLSID = blob . read _shift ( 16 ) ;
if ( CLSID !== CFB . utils . consts . HEADER _CLSID && CLSID !== clsid ) throw new Error ( "Bad PropertySet CLSID " + CLSID ) ;
2017-02-03 20:50:45 +00:00
NumSets = blob . read _shift ( 4 ) ;
2017-03-27 21:35:15 +00:00
if ( NumSets !== 1 && NumSets !== 2 ) throw new Error ( "Unrecognized #Sets: " + NumSets ) ;
2017-02-03 20:50:45 +00:00
FMTID0 = blob . read _shift ( 16 ) ; Offset0 = blob . read _shift ( 4 ) ;
2017-03-27 21:35:15 +00:00
if ( NumSets === 1 && Offset0 !== blob . l ) throw new Error ( "Length mismatch: " + Offset0 + " !== " + blob . l ) ;
2017-02-03 20:50:45 +00:00
else if ( NumSets === 2 ) { FMTID1 = blob . read _shift ( 16 ) ; Offset1 = blob . read _shift ( 4 ) ; }
var PSet0 = parse _PropertySet ( blob , PIDSI ) ;
2017-02-10 19:23:01 +00:00
var rval = ( { SystemIdentifier : SystemIdentifier } /*:any*/ ) ;
2017-02-03 20:50:45 +00:00
for ( var y in PSet0 ) rval [ y ] = PSet0 [ y ] ;
//rval.blob = blob;
rval . FMTID = FMTID0 ;
//rval.PSet0 = PSet0;
if ( NumSets === 1 ) return rval ;
2018-02-21 07:01:34 +00:00
if ( Offset1 - blob . l == 2 ) blob . l += 2 ;
2017-02-10 19:23:01 +00:00
if ( blob . l !== Offset1 ) throw new Error ( "Length mismatch 2: " + blob . l + " !== " + Offset1 ) ;
2017-02-03 20:50:45 +00:00
var PSet1 ;
2017-05-09 18:07:57 +00:00
try { PSet1 = parse _PropertySet ( blob , null ) ; } catch ( e ) { /* empty */ }
2017-02-03 20:50:45 +00:00
for ( y in PSet1 ) rval [ y ] = PSet1 [ y ] ;
rval . FMTID = [ FMTID0 , FMTID1 ] ; // TODO: verify FMTID0/1
return rval ;
}
2018-05-20 01:34:59 +00:00
function write _PropertySetStream ( entries , clsid , RE , PIDSI /*:{[key:string|number]:any}*/ , entries2 /*:?any*/ , clsid2 /*:?any*/ ) {
2018-05-05 06:34:37 +00:00
var hdr = new _buf ( entries2 ? 68 : 48 ) ;
var bufs = [ hdr ] ;
hdr . write _shift ( 2 , 0xFFFE ) ;
hdr . write _shift ( 2 , 0x0000 ) ; /* TODO: type 1 props */
hdr . write _shift ( 4 , 0x32363237 ) ;
hdr . write _shift ( 16 , CFB . utils . consts . HEADER _CLSID , "hex" ) ;
hdr . write _shift ( 4 , ( entries2 ? 2 : 1 ) ) ;
hdr . write _shift ( 16 , clsid , "hex" ) ;
hdr . write _shift ( 4 , ( entries2 ? 68 : 48 ) ) ;
var ps0 = write _PropertySet ( entries , RE , PIDSI ) ;
bufs . push ( ps0 ) ;
2017-02-03 20:50:45 +00:00
2018-05-05 06:34:37 +00:00
if ( entries2 ) {
var ps1 = write _PropertySet ( entries2 , null , null ) ;
hdr . write _shift ( 16 , clsid2 , "hex" ) ;
hdr . write _shift ( 4 , 68 + ps0 . length ) ;
bufs . push ( ps1 ) ;
}
return bconcat ( bufs ) ;
}
2017-02-03 20:50:45 +00:00
function parsenoop2 ( blob , length ) { blob . read _shift ( length ) ; return null ; }
2017-09-22 22:18:51 +00:00
function writezeroes ( n , o ) { if ( ! o ) o = new _buf ( n ) ; for ( var j = 0 ; j < n ; ++ j ) o . write _shift ( 1 , 0 ) ; return o ; }
2017-02-03 20:50:45 +00:00
function parslurp ( blob , length , cb ) {
var arr = [ ] , target = blob . l + length ;
while ( blob . l < target ) arr . push ( cb ( blob , target - blob . l ) ) ;
if ( target !== blob . l ) throw new Error ( "Slurp error" ) ;
return arr ;
}
2017-09-22 22:18:51 +00:00
function parsebool ( blob , length /*:number*/ ) { return blob . read _shift ( length ) === 0x1 ; }
function writebool ( v /*:any*/ , o ) { if ( ! o ) o = new _buf ( 2 ) ; o . write _shift ( 2 , + ! ! v ) ; return o ; }
2017-02-03 20:50:45 +00:00
2017-07-05 22:27:54 +00:00
function parseuint16 ( blob /*::, length:?number, opts:?any*/ ) { return blob . read _shift ( 2 , 'u' ) ; }
2017-09-22 22:18:51 +00:00
function writeuint16 ( v /*:number*/ , o ) { if ( ! o ) o = new _buf ( 2 ) ; o . write _shift ( 2 , v ) ; return o ; }
2017-07-05 22:27:54 +00:00
function parseuint16a ( blob , length /*:: :?number, opts:?any*/ ) { return parslurp ( blob , length , parseuint16 ) ; }
2017-02-03 20:50:45 +00:00
/* --- 2.5 Structures --- */
/* [MS-XLS] 2.5.10 Bes (boolean or error) */
2017-07-05 22:27:54 +00:00
function parse _Bes ( blob /*::, length*/ ) {
2017-02-03 20:50:45 +00:00
var v = blob . read _shift ( 1 ) , t = blob . read _shift ( 1 ) ;
return t === 0x01 ? v : v === 0x01 ;
}
2017-09-22 22:18:51 +00:00
function write _Bes ( v , t /*:string*/ , o ) {
if ( ! o ) o = new _buf ( 2 ) ;
2021-10-13 07:20:25 +00:00
o . write _shift ( 1 , ( ( t == 'e' ) ? + v : + ! ! v ) ) ;
2018-02-14 20:06:35 +00:00
o . write _shift ( 1 , ( ( t == 'e' ) ? 1 : 0 ) ) ;
2017-09-22 22:18:51 +00:00
return o ;
}
2017-02-03 20:50:45 +00:00
/* [MS-XLS] 2.5.240 ShortXLUnicodeString */
function parse _ShortXLUnicodeString ( blob , length , opts ) {
2017-02-19 20:36:32 +00:00
var cch = blob . read _shift ( opts && opts . biff >= 12 ? 2 : 1 ) ;
2018-01-23 09:07:51 +00:00
var encoding = 'sbcs-cont' ;
2017-02-03 20:50:45 +00:00
var cp = current _codepage ;
if ( opts && opts . biff >= 8 ) current _codepage = 1200 ;
2017-02-19 20:36:32 +00:00
if ( ! opts || opts . biff == 8 ) {
2017-02-03 20:50:45 +00:00
var fHighByte = blob . read _shift ( 1 ) ;
2018-01-23 09:07:51 +00:00
if ( fHighByte ) { encoding = 'dbcs-cont' ; }
2017-02-19 20:36:32 +00:00
} else if ( opts . biff == 12 ) {
2018-01-23 09:07:51 +00:00
encoding = 'wstr' ;
2017-02-03 20:50:45 +00:00
}
2018-01-11 08:01:25 +00:00
if ( opts . biff >= 2 && opts . biff <= 5 ) encoding = 'cpstr' ;
2017-02-03 20:50:45 +00:00
var o = cch ? blob . read _shift ( cch , encoding ) : "" ;
current _codepage = cp ;
return o ;
}
/* 2.5.293 XLUnicodeRichExtendedString */
function parse _XLUnicodeRichExtendedString ( blob ) {
var cp = current _codepage ;
current _codepage = 1200 ;
var cch = blob . read _shift ( 2 ) , flags = blob . read _shift ( 1 ) ;
2018-01-23 09:07:51 +00:00
var /*fHighByte = flags & 0x1,*/ fExtSt = flags & 0x4 , fRichSt = flags & 0x8 ;
2017-02-03 20:50:45 +00:00
var width = 1 + ( flags & 0x1 ) ; // 0x0 -> utf8, 0x1 -> dbcs
2017-02-10 19:23:01 +00:00
var cRun = 0 , cbExtRst ;
2017-02-03 20:50:45 +00:00
var z = { } ;
if ( fRichSt ) cRun = blob . read _shift ( 2 ) ;
if ( fExtSt ) cbExtRst = blob . read _shift ( 4 ) ;
2017-12-30 05:40:35 +00:00
var encoding = width == 2 ? 'dbcs-cont' : 'sbcs-cont' ;
2017-02-03 20:50:45 +00:00
var msg = cch === 0 ? "" : blob . read _shift ( cch , encoding ) ;
if ( fRichSt ) blob . l += 4 * cRun ; //TODO: parse this
if ( fExtSt ) blob . l += cbExtRst ; //TODO: parse this
z . t = msg ;
if ( ! fRichSt ) { z . raw = "<t>" + z . t + "</t>" ; z . r = z . t ; }
current _codepage = cp ;
return z ;
}
2020-06-29 08:07:23 +00:00
function write _XLUnicodeRichExtendedString ( xlstr /*:: :XLString, opts*/ ) {
var str = ( xlstr . t || "" ) , nfmts = 1 ;
var hdr = new _buf ( 3 + ( nfmts > 1 ? 2 : 0 ) ) ;
hdr . write _shift ( 2 , str . length ) ;
hdr . write _shift ( 1 , ( nfmts > 1 ? 0x08 : 0x00 ) | 0x01 ) ;
if ( nfmts > 1 ) hdr . write _shift ( 2 , nfmts ) ;
var otext = new _buf ( 2 * str . length ) ;
otext . write _shift ( 2 * str . length , str , 'utf16le' ) ;
var out = [ hdr , otext ] ;
return bconcat ( out ) ;
}
2017-02-03 20:50:45 +00:00
/* 2.5.296 XLUnicodeStringNoCch */
function parse _XLUnicodeStringNoCch ( blob , cch , opts ) {
var retval ;
2017-02-19 20:36:32 +00:00
if ( opts ) {
2018-01-11 08:01:25 +00:00
if ( opts . biff >= 2 && opts . biff <= 5 ) return blob . read _shift ( cch , 'cpstr' ) ;
2017-02-19 20:36:32 +00:00
if ( opts . biff >= 12 ) return blob . read _shift ( cch , 'dbcs-cont' ) ;
}
2017-02-03 20:50:45 +00:00
var fHighByte = blob . read _shift ( 1 ) ;
if ( fHighByte === 0 ) { retval = blob . read _shift ( cch , 'sbcs-cont' ) ; }
else { retval = blob . read _shift ( cch , 'dbcs-cont' ) ; }
return retval ;
}
/* 2.5.294 XLUnicodeString */
function parse _XLUnicodeString ( blob , length , opts ) {
2017-02-19 20:36:32 +00:00
var cch = blob . read _shift ( opts && opts . biff == 2 ? 1 : 2 ) ;
2017-02-03 20:50:45 +00:00
if ( cch === 0 ) { blob . l ++ ; return "" ; }
return parse _XLUnicodeStringNoCch ( blob , cch , opts ) ;
}
/* BIFF5 override */
function parse _XLUnicodeString2 ( blob , length , opts ) {
2017-02-10 19:23:01 +00:00
if ( opts . biff > 5 ) return parse _XLUnicodeString ( blob , length , opts ) ;
2017-02-03 20:50:45 +00:00
var cch = blob . read _shift ( 1 ) ;
if ( cch === 0 ) { blob . l ++ ; return "" ; }
2018-01-11 08:01:25 +00:00
return blob . read _shift ( cch , ( opts . biff <= 4 || ! blob . lens ) ? 'cpstr' : 'sbcs-cont' ) ;
2017-02-03 20:50:45 +00:00
}
2017-10-27 16:25:54 +00:00
/* TODO: BIFF5 and lower, codepage awareness */
function write _XLUnicodeString ( str , opts , o ) {
if ( ! o ) o = new _buf ( 3 + 2 * str . length ) ;
o . write _shift ( 2 , str . length ) ;
o . write _shift ( 1 , 1 ) ;
o . write _shift ( 31 , str , 'utf16le' ) ;
return o ;
}
2017-02-03 20:50:45 +00:00
/* [MS-XLS] 2.5.61 ControlInfo */
2018-01-23 09:07:51 +00:00
function parse _ControlInfo ( blob /*::, length, opts*/ ) {
2017-07-26 08:35:28 +00:00
var flags = blob . read _shift ( 1 ) ;
blob . l ++ ;
var accel = blob . read _shift ( 2 ) ;
blob . l += 2 ;
return [ flags , accel ] ;
}
2017-02-03 20:50:45 +00:00
/* [MS-OSHARED] 2.3.7.6 URLMoniker TODO: flags */
2017-09-22 22:18:51 +00:00
function parse _URLMoniker ( blob /*::, length, opts*/ ) {
2017-02-03 20:50:45 +00:00
var len = blob . read _shift ( 4 ) , start = blob . l ;
var extra = false ;
if ( len > 24 ) {
/* look ahead */
blob . l += len - 24 ;
if ( blob . read _shift ( 16 ) === "795881f43b1d7f48af2c825dc4852763" ) extra = true ;
blob . l = start ;
}
var url = blob . read _shift ( ( extra ? len - 24 : len ) >> 1 , 'utf16le' ) . replace ( chr0 , "" ) ;
if ( extra ) blob . l += 24 ;
return url ;
2017-09-22 22:18:51 +00:00
}
2017-02-03 20:50:45 +00:00
/* [MS-OSHARED] 2.3.7.8 FileMoniker TODO: all fields */
2018-01-23 09:07:51 +00:00
function parse _FileMoniker ( blob /*::, length*/ ) {
2021-10-13 07:20:25 +00:00
var cAnti = blob . read _shift ( 2 ) ;
var preamble = "" ; while ( cAnti -- > 0 ) preamble += "../" ;
2017-12-30 05:40:35 +00:00
var ansiPath = blob . read _shift ( 0 , 'lpstr-ansi' ) ;
2018-01-23 09:07:51 +00:00
blob . l += 2 ; //var endServer = blob.read_shift(2);
2017-12-30 05:40:35 +00:00
if ( blob . read _shift ( 2 ) != 0xDEAD ) throw new Error ( "Bad FileMoniker" ) ;
var sz = blob . read _shift ( 4 ) ;
2021-10-13 07:20:25 +00:00
if ( sz === 0 ) return preamble + ansiPath . replace ( /\\/g , "/" ) ;
2017-12-30 05:40:35 +00:00
var bytes = blob . read _shift ( 4 ) ;
if ( blob . read _shift ( 2 ) != 3 ) throw new Error ( "Bad FileMoniker" ) ;
var unicodePath = blob . read _shift ( bytes >> 1 , 'utf16le' ) . replace ( chr0 , "" ) ;
2021-10-13 07:20:25 +00:00
return preamble + unicodePath ;
2017-09-22 22:18:51 +00:00
}
2017-02-03 20:50:45 +00:00
/* [MS-OSHARED] 2.3.7.2 HyperlinkMoniker TODO: all the monikers */
2017-09-22 22:18:51 +00:00
function parse _HyperlinkMoniker ( blob , length ) {
2017-02-03 20:50:45 +00:00
var clsid = blob . read _shift ( 16 ) ; length -= 16 ;
switch ( clsid ) {
case "e0c9ea79f9bace118c8200aa004ba90b" : return parse _URLMoniker ( blob , length ) ;
case "0303000000000000c000000000000046" : return parse _FileMoniker ( blob , length ) ;
2017-03-27 21:35:15 +00:00
default : throw new Error ( "Unsupported Moniker " + clsid ) ;
2017-02-03 20:50:45 +00:00
}
2017-09-22 22:18:51 +00:00
}
2017-02-03 20:50:45 +00:00
/* [MS-OSHARED] 2.3.7.9 HyperlinkString */
2018-01-23 09:07:51 +00:00
function parse _HyperlinkString ( blob /*::, length*/ ) {
2017-02-03 20:50:45 +00:00
var len = blob . read _shift ( 4 ) ;
2017-12-15 01:18:40 +00:00
var o = len > 0 ? blob . read _shift ( len , 'utf16le' ) . replace ( chr0 , "" ) : "" ;
2017-02-03 20:50:45 +00:00
return o ;
2017-09-22 22:18:51 +00:00
}
2021-10-13 07:20:25 +00:00
function write _HyperlinkString ( str /*:string*/ , o ) {
if ( ! o ) o = new _buf ( 6 + str . length * 2 ) ;
o . write _shift ( 4 , 1 + str . length ) ;
for ( var i = 0 ; i < str . length ; ++ i ) o . write _shift ( 2 , str . charCodeAt ( i ) ) ;
o . write _shift ( 2 , 0 ) ;
return o ;
}
2017-02-03 20:50:45 +00:00
2017-12-15 01:18:40 +00:00
/* [MS-OSHARED] 2.3.7.1 Hyperlink Object */
function parse _Hyperlink ( blob , length ) /*:Hyperlink*/ {
2017-02-03 20:50:45 +00:00
var end = blob . l + length ;
var sVer = blob . read _shift ( 4 ) ;
if ( sVer !== 2 ) throw new Error ( "Unrecognized streamVersion: " + sVer ) ;
var flags = blob . read _shift ( 2 ) ;
blob . l += 2 ;
2018-01-23 09:07:51 +00:00
var displayName , targetFrameName , moniker , oleMoniker , Loc = "" , guid , fileTime ;
2017-02-03 20:50:45 +00:00
if ( flags & 0x0010 ) displayName = parse _HyperlinkString ( blob , end - blob . l ) ;
if ( flags & 0x0080 ) targetFrameName = parse _HyperlinkString ( blob , end - blob . l ) ;
if ( ( flags & 0x0101 ) === 0x0101 ) moniker = parse _HyperlinkString ( blob , end - blob . l ) ;
if ( ( flags & 0x0101 ) === 0x0001 ) oleMoniker = parse _HyperlinkMoniker ( blob , end - blob . l ) ;
2018-01-23 09:07:51 +00:00
if ( flags & 0x0008 ) Loc = parse _HyperlinkString ( blob , end - blob . l ) ;
2017-02-03 20:50:45 +00:00
if ( flags & 0x0020 ) guid = blob . read _shift ( 16 ) ;
2017-07-26 08:35:28 +00:00
if ( flags & 0x0040 ) fileTime = parse _FILETIME ( blob /*, 8*/ ) ;
2017-02-03 20:50:45 +00:00
blob . l = end ;
2017-12-15 01:18:40 +00:00
var target = targetFrameName || moniker || oleMoniker || "" ;
2018-01-23 09:07:51 +00:00
if ( target && Loc ) target += "#" + Loc ;
if ( ! target ) target = "#" + Loc ;
2021-10-13 07:20:25 +00:00
if ( ( flags & 0x0002 ) && target . charAt ( 0 ) == "/" && target . charAt ( 1 ) != "/" ) target = "file://" + target ;
2018-01-23 09:07:51 +00:00
var out = ( { Target : target } /*:any*/ ) ;
if ( guid ) out . guid = guid ;
if ( fileTime ) out . time = fileTime ;
if ( displayName ) out . Tooltip = displayName ;
return out ;
2017-09-22 22:18:51 +00:00
}
2017-12-15 01:18:40 +00:00
function write _Hyperlink ( hl ) {
var out = new _buf ( 512 ) , i = 0 ;
var Target = hl . Target ;
2021-10-13 07:20:25 +00:00
if ( Target . slice ( 0 , 7 ) == "file://" ) Target = Target . slice ( 7 ) ;
var hashidx = Target . indexOf ( "#" ) ;
var F = hashidx > - 1 ? 0x1f : 0x17 ;
2017-12-15 01:18:40 +00:00
switch ( Target . charAt ( 0 ) ) { case "#" : F = 0x1c ; break ; case "." : F &= ~ 2 ; break ; }
out . write _shift ( 4 , 2 ) ; out . write _shift ( 4 , F ) ;
var data = [ 8 , 6815827 , 6619237 , 4849780 , 83 ] ; for ( i = 0 ; i < data . length ; ++ i ) out . write _shift ( 4 , data [ i ] ) ;
if ( F == 0x1C ) {
Target = Target . slice ( 1 ) ;
2021-10-13 07:20:25 +00:00
write _HyperlinkString ( Target , out ) ;
2017-12-15 01:18:40 +00:00
} else if ( F & 0x02 ) {
data = "e0 c9 ea 79 f9 ba ce 11 8c 82 00 aa 00 4b a9 0b" . split ( " " ) ;
for ( i = 0 ; i < data . length ; ++ i ) out . write _shift ( 1 , parseInt ( data [ i ] , 16 ) ) ;
2021-10-13 07:20:25 +00:00
var Pretarget = hashidx > - 1 ? Target . slice ( 0 , hashidx ) : Target ;
out . write _shift ( 4 , 2 * ( Pretarget . length + 1 ) ) ;
for ( i = 0 ; i < Pretarget . length ; ++ i ) out . write _shift ( 2 , Pretarget . charCodeAt ( i ) ) ;
2017-12-15 01:18:40 +00:00
out . write _shift ( 2 , 0 ) ;
2021-10-13 07:20:25 +00:00
if ( F & 0x08 ) write _HyperlinkString ( hashidx > - 1 ? Target . slice ( hashidx + 1 ) : "" , out ) ;
2017-12-15 01:18:40 +00:00
} else {
data = "03 03 00 00 00 00 00 00 c0 00 00 00 00 00 00 46" . split ( " " ) ;
for ( i = 0 ; i < data . length ; ++ i ) out . write _shift ( 1 , parseInt ( data [ i ] , 16 ) ) ;
var P = 0 ;
while ( Target . slice ( P * 3 , P * 3 + 3 ) == "../" || Target . slice ( P * 3 , P * 3 + 3 ) == "..\\" ) ++ P ;
out . write _shift ( 2 , P ) ;
2021-10-13 07:20:25 +00:00
out . write _shift ( 4 , Target . length - 3 * P + 1 ) ;
for ( i = 0 ; i < Target . length - 3 * P ; ++ i ) out . write _shift ( 1 , Target . charCodeAt ( i + 3 * P ) & 0xFF ) ;
2017-12-15 01:18:40 +00:00
out . write _shift ( 1 , 0 ) ;
out . write _shift ( 2 , 0xFFFF ) ;
out . write _shift ( 2 , 0xDEAD ) ;
for ( i = 0 ; i < 6 ; ++ i ) out . write _shift ( 4 , 0 ) ;
}
return out . slice ( 0 , out . l ) ;
}
2017-02-03 20:50:45 +00:00
/* 2.5.178 LongRGBA */
2018-01-23 09:07:51 +00:00
function parse _LongRGBA ( blob /*::, length*/ ) { var r = blob . read _shift ( 1 ) , g = blob . read _shift ( 1 ) , b = blob . read _shift ( 1 ) , a = blob . read _shift ( 1 ) ; return [ r , g , b , a ] ; }
2017-02-03 20:50:45 +00:00
/* 2.5.177 LongRGB */
function parse _LongRGB ( blob , length ) { var x = parse _LongRGBA ( blob , length ) ; x [ 3 ] = 0 ; return x ; }
2018-02-14 20:06:35 +00:00
/* [MS-XLS] 2.5.19 */
2018-01-23 09:07:51 +00:00
function parse _XLSCell ( blob /*::, length*/ ) /*:Cell*/ {
2017-02-03 20:50:45 +00:00
var rw = blob . read _shift ( 2 ) ; // 0-indexed
var col = blob . read _shift ( 2 ) ;
var ixfe = blob . read _shift ( 2 ) ;
2017-02-10 19:23:01 +00:00
return ( { r : rw , c : col , ixfe : ixfe } /*:any*/ ) ;
2017-02-03 20:50:45 +00:00
}
2017-09-30 06:18:11 +00:00
function write _XLSCell ( R /*:number*/ , C /*:number*/ , ixfe /*:?number*/ , o ) {
2017-09-22 22:18:51 +00:00
if ( ! o ) o = new _buf ( 6 ) ;
o . write _shift ( 2 , R ) ;
o . write _shift ( 2 , C ) ;
o . write _shift ( 2 , ixfe || 0 ) ;
return o ;
}
2017-02-03 20:50:45 +00:00
2018-02-14 20:06:35 +00:00
/* [MS-XLS] 2.5.134 */
2017-02-03 20:50:45 +00:00
function parse _frtHeader ( blob ) {
var rt = blob . read _shift ( 2 ) ;
var flags = blob . read _shift ( 2 ) ; // TODO: parse these flags
blob . l += 8 ;
return { type : rt , flags : flags } ;
}
function parse _OptXLUnicodeString ( blob , length , opts ) { return length === 0 ? "" : parse _XLUnicodeString2 ( blob , length , opts ) ; }
2018-02-14 20:06:35 +00:00
/* [MS-XLS] 2.5.344 */
2017-07-27 20:07:51 +00:00
function parse _XTI ( blob , length , opts ) {
var w = opts . biff > 8 ? 4 : 2 ;
var iSupBook = blob . read _shift ( w ) , itabFirst = blob . read _shift ( w , 'i' ) , itabLast = blob . read _shift ( w , 'i' ) ;
2017-02-03 20:50:45 +00:00
return [ iSupBook , itabFirst , itabLast ] ;
}
2018-02-14 20:06:35 +00:00
/* [MS-XLS] 2.5.218 */
2018-01-23 09:07:51 +00:00
function parse _RkRec ( blob ) {
2017-02-03 20:50:45 +00:00
var ixfe = blob . read _shift ( 2 ) ;
var RK = parse _RkNumber ( blob ) ;
return [ ixfe , RK ] ;
}
2018-02-14 20:06:35 +00:00
/* [MS-XLS] 2.5.1 */
2017-02-19 20:36:32 +00:00
function parse _AddinUdf ( blob , length , opts ) {
2017-02-03 20:50:45 +00:00
blob . l += 4 ; length -= 4 ;
var l = blob . l + length ;
2017-02-19 20:36:32 +00:00
var udfName = parse _ShortXLUnicodeString ( blob , length , opts ) ;
2017-02-03 20:50:45 +00:00
var cb = blob . read _shift ( 2 ) ;
l -= blob . l ;
2017-03-27 21:35:15 +00:00
if ( cb !== l ) throw new Error ( "Malformed AddinUdf: padding = " + l + " != " + cb ) ;
2017-02-03 20:50:45 +00:00
blob . l += cb ;
return udfName ;
}
2018-02-14 20:06:35 +00:00
/* [MS-XLS] 2.5.209 TODO: Check sizes */
2018-01-23 09:07:51 +00:00
function parse _Ref8U ( blob /*::, length*/ ) {
2017-02-03 20:50:45 +00:00
var rwFirst = blob . read _shift ( 2 ) ;
var rwLast = blob . read _shift ( 2 ) ;
var colFirst = blob . read _shift ( 2 ) ;
var colLast = blob . read _shift ( 2 ) ;
return { s : { c : colFirst , r : rwFirst } , e : { c : colLast , r : rwLast } } ;
}
2017-12-30 05:40:35 +00:00
function write _Ref8U ( r /*:Range*/ , o ) {
if ( ! o ) o = new _buf ( 8 ) ;
o . write _shift ( 2 , r . s . r ) ;
o . write _shift ( 2 , r . e . r ) ;
o . write _shift ( 2 , r . s . c ) ;
o . write _shift ( 2 , r . e . c ) ;
return o ;
}
2017-02-03 20:50:45 +00:00
2018-02-14 20:06:35 +00:00
/* [MS-XLS] 2.5.211 */
2018-01-23 09:07:51 +00:00
function parse _RefU ( blob /*::, length*/ ) {
2017-02-03 20:50:45 +00:00
var rwFirst = blob . read _shift ( 2 ) ;
var rwLast = blob . read _shift ( 2 ) ;
var colFirst = blob . read _shift ( 1 ) ;
var colLast = blob . read _shift ( 1 ) ;
return { s : { c : colFirst , r : rwFirst } , e : { c : colLast , r : rwLast } } ;
}
2018-02-14 20:06:35 +00:00
/* [MS-XLS] 2.5.207 */
2017-02-03 20:50:45 +00:00
var parse _Ref = parse _RefU ;
2018-02-14 20:06:35 +00:00
/* [MS-XLS] 2.5.143 */
2018-01-23 09:07:51 +00:00
function parse _FtCmo ( blob /*::, length*/ ) {
2017-02-03 20:50:45 +00:00
blob . l += 4 ;
var ot = blob . read _shift ( 2 ) ;
var id = blob . read _shift ( 2 ) ;
var flags = blob . read _shift ( 2 ) ;
blob . l += 12 ;
return [ id , ot , flags ] ;
}
2018-02-14 20:06:35 +00:00
/* [MS-XLS] 2.5.149 */
2018-01-23 09:07:51 +00:00
function parse _FtNts ( blob ) {
2017-02-03 20:50:45 +00:00
var out = { } ;
blob . l += 4 ;
blob . l += 16 ; // GUID TODO
out . fSharedNote = blob . read _shift ( 2 ) ;
blob . l += 4 ;
return out ;
}
2018-02-14 20:06:35 +00:00
/* [MS-XLS] 2.5.142 */
2018-01-23 09:07:51 +00:00
function parse _FtCf ( blob ) {
2017-02-03 20:50:45 +00:00
var out = { } ;
blob . l += 4 ;
blob . cf = blob . read _shift ( 2 ) ;
return out ;
}
2018-02-14 20:06:35 +00:00
/* [MS-XLS] 2.5.140 - 2.5.154 and friends */
2018-01-23 09:07:51 +00:00
function parse _FtSkip ( blob ) { blob . l += 2 ; blob . l += blob . read _shift ( 2 ) ; }
2017-02-03 20:50:45 +00:00
var FtTab = {
2017-05-09 18:07:57 +00:00
/*::[*/ 0x00 /*::]*/ : parse _FtSkip , /* FtEnd */
/*::[*/ 0x04 /*::]*/ : parse _FtSkip , /* FtMacro */
/*::[*/ 0x05 /*::]*/ : parse _FtSkip , /* FtButton */
/*::[*/ 0x06 /*::]*/ : parse _FtSkip , /* FtGmo */
/*::[*/ 0x07 /*::]*/ : parse _FtCf , /* FtCf */
/*::[*/ 0x08 /*::]*/ : parse _FtSkip , /* FtPioGrbit */
/*::[*/ 0x09 /*::]*/ : parse _FtSkip , /* FtPictFmla */
/*::[*/ 0x0A /*::]*/ : parse _FtSkip , /* FtCbls */
/*::[*/ 0x0B /*::]*/ : parse _FtSkip , /* FtRbo */
/*::[*/ 0x0C /*::]*/ : parse _FtSkip , /* FtSbs */
/*::[*/ 0x0D /*::]*/ : parse _FtNts , /* FtNts */
/*::[*/ 0x0E /*::]*/ : parse _FtSkip , /* FtSbsFmla */
/*::[*/ 0x0F /*::]*/ : parse _FtSkip , /* FtGboData */
/*::[*/ 0x10 /*::]*/ : parse _FtSkip , /* FtEdoData */
/*::[*/ 0x11 /*::]*/ : parse _FtSkip , /* FtRboData */
/*::[*/ 0x12 /*::]*/ : parse _FtSkip , /* FtCblsData */
/*::[*/ 0x13 /*::]*/ : parse _FtSkip , /* FtLbsData */
/*::[*/ 0x14 /*::]*/ : parse _FtSkip , /* FtCblsFmla */
/*::[*/ 0x15 /*::]*/ : parse _FtCmo
2017-02-03 20:50:45 +00:00
} ;
2018-01-23 09:07:51 +00:00
function parse _FtArray ( blob , length /*::, ot*/ ) {
2017-05-09 18:07:57 +00:00
var tgt = blob . l + length ;
2017-02-03 20:50:45 +00:00
var fts = [ ] ;
2017-05-09 18:07:57 +00:00
while ( blob . l < tgt ) {
2017-02-03 20:50:45 +00:00
var ft = blob . read _shift ( 2 ) ;
blob . l -= 2 ;
try {
2017-05-09 18:07:57 +00:00
fts . push ( FtTab [ ft ] ( blob , tgt - blob . l ) ) ;
} catch ( e ) { blob . l = tgt ; return fts ; }
2017-02-03 20:50:45 +00:00
}
2017-05-09 18:07:57 +00:00
if ( blob . l != tgt ) blob . l = tgt ; //throw new Error("bad Object Ft-sequence");
2017-02-03 20:50:45 +00:00
return fts ;
}
/* --- 2.4 Records --- */
2018-02-14 20:06:35 +00:00
/* [MS-XLS] 2.4.21 */
2017-02-03 20:50:45 +00:00
function parse _BOF ( blob , length ) {
2017-03-27 21:35:15 +00:00
var o = { BIFFVer : 0 , dt : 0 } ;
2017-02-03 20:50:45 +00:00
o . BIFFVer = blob . read _shift ( 2 ) ; length -= 2 ;
2017-03-27 21:35:15 +00:00
if ( length >= 2 ) { o . dt = blob . read _shift ( 2 ) ; blob . l -= 2 ; }
2017-02-03 20:50:45 +00:00
switch ( o . BIFFVer ) {
case 0x0600 : /* BIFF8 */
case 0x0500 : /* BIFF5 */
2018-02-21 07:01:34 +00:00
case 0x0400 : /* BIFF4 */
case 0x0300 : /* BIFF3 */
case 0x0200 : /* BIFF2 */
2017-02-03 20:50:45 +00:00
case 0x0002 : case 0x0007 : /* BIFF2 */
break ;
2017-02-10 19:23:01 +00:00
default : if ( length > 6 ) throw new Error ( "Unexpected BIFF Ver " + o . BIFFVer ) ;
2017-02-03 20:50:45 +00:00
}
2017-03-27 21:35:15 +00:00
2017-02-03 20:50:45 +00:00
blob . read _shift ( length ) ;
return o ;
}
2017-09-22 22:18:51 +00:00
function write _BOF ( wb /*:Workbook*/ , t /*:number*/ , o ) {
var h = 0x0600 , w = 16 ;
switch ( o . bookType ) {
case 'biff8' : break ;
case 'biff5' : h = 0x0500 ; w = 8 ; break ;
case 'biff4' : h = 0x0004 ; w = 6 ; break ;
case 'biff3' : h = 0x0003 ; w = 6 ; break ;
case 'biff2' : h = 0x0002 ; w = 4 ; break ;
2017-12-30 05:40:35 +00:00
case 'xla' : break ;
2017-09-22 22:18:51 +00:00
default : throw new Error ( "unsupported BIFF version" ) ;
}
var out = new _buf ( w ) ;
out . write _shift ( 2 , h ) ;
out . write _shift ( 2 , t ) ;
if ( w > 4 ) out . write _shift ( 2 , 0x7262 ) ;
if ( w > 6 ) out . write _shift ( 2 , 0x07CD ) ;
if ( w > 8 ) {
out . write _shift ( 2 , 0xC009 ) ;
out . write _shift ( 2 , 0x0001 ) ;
out . write _shift ( 2 , 0x0706 ) ;
out . write _shift ( 2 , 0x0000 ) ;
}
return out ;
}
2017-02-03 20:50:45 +00:00
2018-02-14 20:06:35 +00:00
/* [MS-XLS] 2.4.146 */
2017-02-03 20:50:45 +00:00
function parse _InterfaceHdr ( blob , length ) {
if ( length === 0 ) return 0x04b0 ;
2018-01-23 09:07:51 +00:00
if ( ( blob . read _shift ( 2 ) ) !== 0x04b0 ) { /* empty */ }
2017-02-03 20:50:45 +00:00
return 0x04b0 ;
}
2018-02-14 20:06:35 +00:00
/* [MS-XLS] 2.4.349 */
2017-02-03 20:50:45 +00:00
function parse _WriteAccess ( blob , length , opts ) {
if ( opts . enc ) { blob . l += length ; return "" ; }
var l = blob . l ;
// TODO: make sure XLUnicodeString doesnt overrun
2018-01-23 09:07:51 +00:00
var UserName = parse _XLUnicodeString2 ( blob , 0 , opts ) ;
2017-02-03 20:50:45 +00:00
blob . read _shift ( length + l - blob . l ) ;
return UserName ;
}
2017-09-22 22:18:51 +00:00
function write _WriteAccess ( s /*:string*/ , opts ) {
2017-10-17 00:14:32 +00:00
var b8 = ! opts || opts . biff == 8 ;
var o = new _buf ( b8 ? 112 : 54 ) ;
2017-09-22 22:18:51 +00:00
o . write _shift ( opts . biff == 8 ? 2 : 1 , 7 ) ;
2018-02-14 20:06:35 +00:00
if ( b8 ) o . write _shift ( 1 , 0 ) ;
2017-09-22 22:18:51 +00:00
o . write _shift ( 4 , 0x33336853 ) ;
2018-02-14 20:06:35 +00:00
o . write _shift ( 4 , ( 0x00534A74 | ( b8 ? 0 : 0x20000000 ) ) ) ;
while ( o . l < o . length ) o . write _shift ( 1 , ( b8 ? 0 : 32 ) ) ;
2017-09-22 22:18:51 +00:00
return o ;
}
2017-02-03 20:50:45 +00:00
2018-02-14 20:06:35 +00:00
/* [MS-XLS] 2.4.351 */
2017-11-20 01:51:14 +00:00
function parse _WsBool ( blob , length , opts ) {
var flags = opts && opts . biff == 8 || length == 2 ? blob . read _shift ( 2 ) : ( blob . l += length , 0 ) ;
2021-10-13 07:20:25 +00:00
return { fDialog : flags & 0x10 , fBelow : flags & 0x40 , fRight : flags & 0x80 } ;
2017-11-20 01:51:14 +00:00
}
2018-02-14 20:06:35 +00:00
/* [MS-XLS] 2.4.28 */
2017-02-03 20:50:45 +00:00
function parse _BoundSheet8 ( blob , length , opts ) {
var pos = blob . read _shift ( 4 ) ;
2017-02-10 19:23:01 +00:00
var hidden = blob . read _shift ( 1 ) & 0x03 ;
2017-02-03 20:50:45 +00:00
var dt = blob . read _shift ( 1 ) ;
switch ( dt ) {
case 0 : dt = 'Worksheet' ; break ;
case 1 : dt = 'Macrosheet' ; break ;
case 2 : dt = 'Chartsheet' ; break ;
case 6 : dt = 'VBAModule' ; break ;
}
var name = parse _ShortXLUnicodeString ( blob , 0 , opts ) ;
if ( name . length === 0 ) name = "Sheet1" ;
return { pos : pos , hs : hidden , dt : dt , name : name } ;
}
2017-09-22 22:18:51 +00:00
function write _BoundSheet8 ( data , opts ) {
2017-10-17 00:14:32 +00:00
var w = ( ! opts || opts . biff >= 8 ? 2 : 1 ) ;
var o = new _buf ( 8 + w * data . name . length ) ;
2017-09-22 22:18:51 +00:00
o . write _shift ( 4 , data . pos ) ;
o . write _shift ( 1 , data . hs || 0 ) ;
o . write _shift ( 1 , data . dt ) ;
o . write _shift ( 1 , data . name . length ) ;
2017-10-17 00:14:32 +00:00
if ( opts . biff >= 8 ) o . write _shift ( 1 , 1 ) ;
o . write _shift ( w * data . name . length , data . name , opts . biff < 8 ? 'sbcs' : 'utf16le' ) ;
2018-02-08 18:21:39 +00:00
var out = o . slice ( 0 , o . l ) ;
out . l = o . l ; return out ;
2017-09-22 22:18:51 +00:00
}
2017-02-03 20:50:45 +00:00
2018-02-14 20:06:35 +00:00
/* [MS-XLS] 2.4.265 TODO */
2017-03-12 18:02:43 +00:00
function parse _SST ( blob , length ) /*:SST*/ {
2017-07-27 20:07:51 +00:00
var end = blob . l + length ;
2017-02-03 20:50:45 +00:00
var cnt = blob . read _shift ( 4 ) ;
var ucnt = blob . read _shift ( 4 ) ;
2017-03-12 18:02:43 +00:00
var strs /*:SST*/ = ( [ ] /*:any*/ ) ;
2017-07-27 20:07:51 +00:00
for ( var i = 0 ; i != ucnt && blob . l < end ; ++ i ) {
2017-02-03 20:50:45 +00:00
strs . push ( parse _XLUnicodeRichExtendedString ( blob ) ) ;
}
strs . Count = cnt ; strs . Unique = ucnt ;
return strs ;
}
2020-06-29 08:07:23 +00:00
function write _SST ( sst , opts ) {
var header = new _buf ( 8 ) ;
header . write _shift ( 4 , sst . Count ) ;
header . write _shift ( 4 , sst . Unique ) ;
var strs = [ ] ;
for ( var j = 0 ; j < sst . length ; ++ j ) strs [ j ] = write _XLUnicodeRichExtendedString ( sst [ j ] , opts ) ;
var o = bconcat ( [ header ] . concat ( strs ) ) ;
/*::(*/ o /*:: :any)*/ . parts = [ header . length ] . concat ( strs . map ( function ( str ) { return str . length ; } ) ) ;
return o ;
}
2017-02-03 20:50:45 +00:00
2018-02-14 20:06:35 +00:00
/* [MS-XLS] 2.4.107 */
2017-02-03 20:50:45 +00:00
function parse _ExtSST ( blob , length ) {
var extsst = { } ;
extsst . dsst = blob . read _shift ( 2 ) ;
blob . l += length - 2 ;
return extsst ;
}
2018-02-14 20:06:35 +00:00
/* [MS-XLS] 2.4.221 TODO: check BIFF2-4 */
2018-01-23 09:07:51 +00:00
function parse _Row ( blob ) {
2017-04-28 07:28:03 +00:00
var z = ( { } /*:any*/ ) ;
z . r = blob . read _shift ( 2 ) ;
z . c = blob . read _shift ( 2 ) ;
z . cnt = blob . read _shift ( 2 ) - z . c ;
var miyRw = blob . read _shift ( 2 ) ;
blob . l += 4 ; // reserved(2), unused(2)
2017-02-03 20:50:45 +00:00
var flags = blob . read _shift ( 1 ) ; // various flags
2017-04-28 07:28:03 +00:00
blob . l += 3 ; // reserved(8), ixfe(12), flags(4)
2017-07-09 17:37:45 +00:00
if ( flags & 0x07 ) z . level = flags & 0x07 ;
// collapsed: flags & 0x10
2017-04-28 07:28:03 +00:00
if ( flags & 0x20 ) z . hidden = true ;
if ( flags & 0x40 ) z . hpt = miyRw / 20 ;
return z ;
2017-02-03 20:50:45 +00:00
}
2018-02-14 20:06:35 +00:00
/* [MS-XLS] 2.4.125 */
2018-01-23 09:07:51 +00:00
function parse _ForceFullCalculation ( blob ) {
2017-02-03 20:50:45 +00:00
var header = parse _frtHeader ( blob ) ;
2017-03-27 21:35:15 +00:00
if ( header . type != 0x08A3 ) throw new Error ( "Invalid Future Record " + header . type ) ;
2017-02-03 20:50:45 +00:00
var fullcalc = blob . read _shift ( 4 ) ;
return fullcalc !== 0x0 ;
}
2018-02-14 20:06:35 +00:00
/* [MS-XLS] 2.4.215 rt */
2018-01-23 09:07:51 +00:00
function parse _RecalcId ( blob ) {
2017-02-03 20:50:45 +00:00
blob . read _shift ( 2 ) ;
return blob . read _shift ( 4 ) ;
}
2018-02-14 20:06:35 +00:00
/* [MS-XLS] 2.4.87 */
2017-05-09 18:07:57 +00:00
function parse _DefaultRowHeight ( blob , length , opts ) {
var f = 0 ;
if ( ! ( opts && opts . biff == 2 ) ) {
f = blob . read _shift ( 2 ) ;
}
2017-03-20 09:02:25 +00:00
var miyRw = blob . read _shift ( 2 ) ;
2017-05-09 18:07:57 +00:00
if ( ( opts && opts . biff == 2 ) ) {
f = 1 - ( miyRw >> 15 ) ; miyRw &= 0x7fff ;
}
var fl = { Unsynced : f & 1 , DyZero : ( f & 2 ) >> 1 , ExAsc : ( f & 4 ) >> 2 , ExDsc : ( f & 8 ) >> 3 } ;
2017-02-03 20:50:45 +00:00
return [ fl , miyRw ] ;
}
2018-02-14 20:06:35 +00:00
/* [MS-XLS] 2.4.345 TODO */
2018-01-23 09:07:51 +00:00
function parse _Window1 ( blob ) {
2017-02-03 20:50:45 +00:00
var xWn = blob . read _shift ( 2 ) , yWn = blob . read _shift ( 2 ) , dxWn = blob . read _shift ( 2 ) , dyWn = blob . read _shift ( 2 ) ;
var flags = blob . read _shift ( 2 ) , iTabCur = blob . read _shift ( 2 ) , iTabFirst = blob . read _shift ( 2 ) ;
var ctabSel = blob . read _shift ( 2 ) , wTabRatio = blob . read _shift ( 2 ) ;
return { Pos : [ xWn , yWn ] , Dim : [ dxWn , dyWn ] , Flags : flags , CurTab : iTabCur ,
FirstTab : iTabFirst , Selected : ctabSel , TabRatio : wTabRatio } ;
}
2018-01-23 09:07:51 +00:00
function write _Window1 ( /*::opts*/ ) {
2017-09-22 22:18:51 +00:00
var o = new _buf ( 18 ) ;
o . write _shift ( 2 , 0 ) ;
o . write _shift ( 2 , 0 ) ;
o . write _shift ( 2 , 0x7260 ) ;
o . write _shift ( 2 , 0x44c0 ) ;
o . write _shift ( 2 , 0x38 ) ;
o . write _shift ( 2 , 0 ) ;
o . write _shift ( 2 , 0 ) ;
o . write _shift ( 2 , 1 ) ;
o . write _shift ( 2 , 0x01f4 ) ;
return o ;
}
2018-02-14 20:06:35 +00:00
/* [MS-XLS] 2.4.346 TODO */
2017-12-30 05:40:35 +00:00
function parse _Window2 ( blob , length , opts ) {
2020-03-15 07:42:05 +00:00
if ( opts && opts . biff >= 2 && opts . biff < 5 ) return { } ;
2017-12-30 05:40:35 +00:00
var f = blob . read _shift ( 2 ) ;
return { RTL : f & 0x40 } ;
}
function write _Window2 ( view ) {
var o = new _buf ( 18 ) , f = 0x6b6 ;
if ( view && view . RTL ) f |= 0x40 ;
o . write _shift ( 2 , f ) ;
o . write _shift ( 4 , 0 ) ;
o . write _shift ( 4 , 64 ) ;
o . write _shift ( 4 , 0 ) ;
o . write _shift ( 4 , 0 ) ;
return o ;
}
2017-02-03 20:50:45 +00:00
2019-11-15 01:46:49 +00:00
/* [MS-XLS] 2.4.189 TODO */
function parse _Pane ( /*blob, length, opts*/ ) {
}
2018-02-14 20:06:35 +00:00
/* [MS-XLS] 2.4.122 TODO */
2017-02-03 20:50:45 +00:00
function parse _Font ( blob , length , opts ) {
2017-05-13 18:21:22 +00:00
var o /*:any*/ = {
2017-05-09 18:07:57 +00:00
dyHeight : blob . read _shift ( 2 ) ,
fl : blob . read _shift ( 2 )
} ;
2018-02-14 20:06:35 +00:00
switch ( ( opts && opts . biff ) || 8 ) {
2017-05-09 18:07:57 +00:00
case 2 : break ;
case 3 : case 4 : blob . l += 2 ; break ;
default : blob . l += 10 ; break ;
}
o . name = parse _ShortXLUnicodeString ( blob , 0 , opts ) ;
return o ;
2017-02-03 20:50:45 +00:00
}
2018-02-14 20:06:35 +00:00
function write _Font ( data , opts ) {
var name = data . name || "Arial" ;
var b5 = ( opts && ( opts . biff == 5 ) ) , w = ( b5 ? ( 15 + name . length ) : ( 16 + 2 * name . length ) ) ;
var o = new _buf ( w ) ;
o . write _shift ( 2 , ( data . sz || 12 ) * 20 ) ;
o . write _shift ( 4 , 0 ) ;
o . write _shift ( 2 , 400 ) ;
o . write _shift ( 4 , 0 ) ;
o . write _shift ( 2 , 0 ) ;
o . write _shift ( 1 , name . length ) ;
if ( ! b5 ) o . write _shift ( 1 , 1 ) ;
o . write _shift ( ( b5 ? 1 : 2 ) * name . length , name , ( b5 ? "sbcs" : "utf16le" ) ) ;
return o ;
}
2017-02-03 20:50:45 +00:00
2018-02-14 20:06:35 +00:00
/* [MS-XLS] 2.4.149 */
2018-01-23 09:07:51 +00:00
function parse _LabelSst ( blob ) {
2017-02-03 20:50:45 +00:00
var cell = parse _XLSCell ( blob ) ;
cell . isst = blob . read _shift ( 4 ) ;
return cell ;
}
2020-06-29 08:07:23 +00:00
function write _LabelSst ( R /*:number*/ , C /*:number*/ , v /*:number*/ , os /*:number*/ /*::, opts*/ ) {
var o = new _buf ( 10 ) ;
write _XLSCell ( R , C , os , o ) ;
o . write _shift ( 4 , v ) ;
return o ;
}
2017-02-03 20:50:45 +00:00
2018-02-14 20:06:35 +00:00
/* [MS-XLS] 2.4.148 */
2017-02-03 20:50:45 +00:00
function parse _Label ( blob , length , opts ) {
2021-10-13 07:20:25 +00:00
if ( opts . biffguess && opts . biff == 2 ) opts . biff = 5 ;
2017-02-19 20:36:32 +00:00
var target = blob . l + length ;
2017-02-03 20:50:45 +00:00
var cell = parse _XLSCell ( blob , 6 ) ;
2017-02-19 20:36:32 +00:00
if ( opts . biff == 2 ) blob . l ++ ;
var str = parse _XLUnicodeString ( blob , target - blob . l , opts ) ;
2017-02-03 20:50:45 +00:00
cell . val = str ;
return cell ;
}
2018-02-08 18:21:39 +00:00
function write _Label ( R /*:number*/ , C /*:number*/ , v /*:string*/ , os /*:number*/ , opts ) {
2017-10-17 00:14:32 +00:00
var b8 = ! opts || opts . biff == 8 ;
var o = new _buf ( 6 + 2 + ( + b8 ) + ( 1 + b8 ) * v . length ) ;
2018-02-08 18:21:39 +00:00
write _XLSCell ( R , C , os , o ) ;
2017-09-22 22:18:51 +00:00
o . write _shift ( 2 , v . length ) ;
2017-10-17 00:14:32 +00:00
if ( b8 ) o . write _shift ( 1 , 1 ) ;
o . write _shift ( ( 1 + b8 ) * v . length , v , b8 ? 'utf16le' : 'sbcs' ) ;
2017-09-22 22:18:51 +00:00
return o ;
}
2017-02-03 20:50:45 +00:00
2018-02-14 20:06:35 +00:00
/* [MS-XLS] 2.4.126 Number Formats */
2017-02-03 20:50:45 +00:00
function parse _Format ( blob , length , opts ) {
2017-07-27 20:07:51 +00:00
var numFmtId = blob . read _shift ( 2 ) ;
2017-02-03 20:50:45 +00:00
var fmtstr = parse _XLUnicodeString2 ( blob , 0 , opts ) ;
2017-07-27 20:07:51 +00:00
return [ numFmtId , fmtstr ] ;
2017-02-03 20:50:45 +00:00
}
2018-02-14 20:06:35 +00:00
function write _Format ( i /*:number*/ , f /*:string*/ , opts , o ) {
var b5 = ( opts && ( opts . biff == 5 ) ) ;
if ( ! o ) o = new _buf ( b5 ? ( 3 + f . length ) : ( 5 + 2 * f . length ) ) ;
2018-02-08 18:21:39 +00:00
o . write _shift ( 2 , i ) ;
2018-02-14 20:06:35 +00:00
o . write _shift ( ( b5 ? 1 : 2 ) , f . length ) ;
if ( ! b5 ) o . write _shift ( 1 , 1 ) ;
o . write _shift ( ( b5 ? 1 : 2 ) * f . length , f , ( b5 ? 'sbcs' : 'utf16le' ) ) ;
2018-02-08 18:21:39 +00:00
var out = ( o . length > o . l ) ? o . slice ( 0 , o . l ) : o ;
2018-02-14 20:06:35 +00:00
if ( out . l == null ) out . l = out . length ;
2018-02-08 18:21:39 +00:00
return out ;
}
2017-02-10 19:23:01 +00:00
var parse _BIFF2Format = parse _XLUnicodeString2 ;
2017-02-03 20:50:45 +00:00
2018-02-14 20:06:35 +00:00
/* [MS-XLS] 2.4.90 */
2017-02-19 20:36:32 +00:00
function parse _Dimensions ( blob , length , opts ) {
var end = blob . l + length ;
var w = opts . biff == 8 || ! opts . biff ? 4 : 2 ;
2017-05-09 18:07:57 +00:00
var r = blob . read _shift ( w ) , R = blob . read _shift ( w ) ;
var c = blob . read _shift ( 2 ) , C = blob . read _shift ( 2 ) ;
2017-02-19 20:36:32 +00:00
blob . l = end ;
2017-02-03 20:50:45 +00:00
return { s : { r : r , c : c } , e : { r : R , c : C } } ;
}
2017-09-22 22:18:51 +00:00
function write _Dimensions ( range , opts ) {
2017-10-17 00:14:32 +00:00
var w = opts . biff == 8 || ! opts . biff ? 4 : 2 ;
var o = new _buf ( 2 * w + 6 ) ;
o . write _shift ( w , range . s . r ) ;
o . write _shift ( w , range . e . r + 1 ) ;
2017-09-22 22:18:51 +00:00
o . write _shift ( 2 , range . s . c ) ;
o . write _shift ( 2 , range . e . c + 1 ) ;
o . write _shift ( 2 , 0 ) ;
return o ;
}
2017-02-03 20:50:45 +00:00
2018-02-14 20:06:35 +00:00
/* [MS-XLS] 2.4.220 */
2018-01-23 09:07:51 +00:00
function parse _RK ( blob ) {
2017-02-03 20:50:45 +00:00
var rw = blob . read _shift ( 2 ) , col = blob . read _shift ( 2 ) ;
var rkrec = parse _RkRec ( blob ) ;
return { r : rw , c : col , ixfe : rkrec [ 0 ] , rknum : rkrec [ 1 ] } ;
}
2018-02-14 20:06:35 +00:00
/* [MS-XLS] 2.4.175 */
2017-02-03 20:50:45 +00:00
function parse _MulRk ( blob , length ) {
var target = blob . l + length - 2 ;
var rw = blob . read _shift ( 2 ) , col = blob . read _shift ( 2 ) ;
var rkrecs = [ ] ;
while ( blob . l < target ) rkrecs . push ( parse _RkRec ( blob ) ) ;
2017-03-27 21:35:15 +00:00
if ( blob . l !== target ) throw new Error ( "MulRK read error" ) ;
2017-02-03 20:50:45 +00:00
var lastcol = blob . read _shift ( 2 ) ;
2017-03-27 21:35:15 +00:00
if ( rkrecs . length != lastcol - col + 1 ) throw new Error ( "MulRK length mismatch" ) ;
2017-02-03 20:50:45 +00:00
return { r : rw , c : col , C : lastcol , rkrec : rkrecs } ;
}
2018-02-14 20:06:35 +00:00
/* [MS-XLS] 2.4.174 */
2017-03-15 08:19:02 +00:00
function parse _MulBlank ( blob , length ) {
var target = blob . l + length - 2 ;
var rw = blob . read _shift ( 2 ) , col = blob . read _shift ( 2 ) ;
var ixfes = [ ] ;
while ( blob . l < target ) ixfes . push ( blob . read _shift ( 2 ) ) ;
2017-03-27 21:35:15 +00:00
if ( blob . l !== target ) throw new Error ( "MulBlank read error" ) ;
2017-03-15 08:19:02 +00:00
var lastcol = blob . read _shift ( 2 ) ;
2017-03-27 21:35:15 +00:00
if ( ixfes . length != lastcol - col + 1 ) throw new Error ( "MulBlank length mismatch" ) ;
2017-03-15 08:19:02 +00:00
return { r : rw , c : col , C : lastcol , ixfe : ixfes } ;
}
2017-02-03 20:50:45 +00:00
2018-02-14 20:06:35 +00:00
/* [MS-XLS] 2.5.20 2.5.249 TODO: interpret values here */
2017-03-20 09:02:25 +00:00
function parse _CellStyleXF ( blob , length , style , opts ) {
2017-02-03 20:50:45 +00:00
var o = { } ;
var a = blob . read _shift ( 4 ) , b = blob . read _shift ( 4 ) ;
var c = blob . read _shift ( 4 ) , d = blob . read _shift ( 2 ) ;
o . patternType = XLSFillPattern [ c >> 26 ] ;
2017-03-14 08:19:51 +00:00
2017-03-20 09:02:25 +00:00
if ( ! opts . cellStyles ) return o ;
2017-03-14 08:19:51 +00:00
o . alc = a & 0x07 ;
o . fWrap = ( a >> 3 ) & 0x01 ;
o . alcV = ( a >> 4 ) & 0x07 ;
o . fJustLast = ( a >> 7 ) & 0x01 ;
o . trot = ( a >> 8 ) & 0xFF ;
o . cIndent = ( a >> 16 ) & 0x0F ;
o . fShrinkToFit = ( a >> 20 ) & 0x01 ;
o . iReadOrder = ( a >> 22 ) & 0x02 ;
o . fAtrNum = ( a >> 26 ) & 0x01 ;
o . fAtrFnt = ( a >> 27 ) & 0x01 ;
o . fAtrAlc = ( a >> 28 ) & 0x01 ;
o . fAtrBdr = ( a >> 29 ) & 0x01 ;
o . fAtrPat = ( a >> 30 ) & 0x01 ;
o . fAtrProt = ( a >> 31 ) & 0x01 ;
o . dgLeft = b & 0x0F ;
o . dgRight = ( b >> 4 ) & 0x0F ;
o . dgTop = ( b >> 8 ) & 0x0F ;
o . dgBottom = ( b >> 12 ) & 0x0F ;
o . icvLeft = ( b >> 16 ) & 0x7F ;
o . icvRight = ( b >> 23 ) & 0x7F ;
o . grbitDiag = ( b >> 30 ) & 0x03 ;
o . icvTop = c & 0x7F ;
o . icvBottom = ( c >> 7 ) & 0x7F ;
o . icvDiag = ( c >> 14 ) & 0x7F ;
o . dgDiag = ( c >> 21 ) & 0x0F ;
2017-02-03 20:50:45 +00:00
o . icvFore = d & 0x7F ;
o . icvBack = ( d >> 7 ) & 0x7F ;
2017-03-14 08:19:51 +00:00
o . fsxButton = ( d >> 14 ) & 0x01 ;
2017-02-03 20:50:45 +00:00
return o ;
}
2018-01-23 09:07:51 +00:00
//function parse_CellXF(blob, length, opts) {return parse_CellStyleXF(blob,length,0, opts);}
//function parse_StyleXF(blob, length, opts) {return parse_CellStyleXF(blob,length,1, opts);}
2017-02-03 20:50:45 +00:00
2018-02-14 20:06:35 +00:00
/* [MS-XLS] 2.4.353 TODO: actually do this right */
2017-03-20 09:02:25 +00:00
function parse _XF ( blob , length , opts ) {
2017-02-03 20:50:45 +00:00
var o = { } ;
2017-07-27 20:07:51 +00:00
o . ifnt = blob . read _shift ( 2 ) ; o . numFmtId = blob . read _shift ( 2 ) ; o . flags = blob . read _shift ( 2 ) ;
2017-02-03 20:50:45 +00:00
o . fStyle = ( o . flags >> 2 ) & 0x01 ;
length -= 6 ;
2017-03-20 09:02:25 +00:00
o . data = parse _CellStyleXF ( blob , length , o . fStyle , opts ) ;
2017-02-03 20:50:45 +00:00
return o ;
}
2018-02-14 20:06:35 +00:00
function write _XF ( data , ixfeP , opts , o ) {
var b5 = ( opts && ( opts . biff == 5 ) ) ;
if ( ! o ) o = new _buf ( b5 ? 16 : 20 ) ;
2018-02-08 18:21:39 +00:00
o . write _shift ( 2 , 0 ) ;
2018-02-14 20:06:35 +00:00
if ( data . style ) {
o . write _shift ( 2 , ( data . numFmtId || 0 ) ) ;
o . write _shift ( 2 , 0xFFF4 ) ;
} else {
o . write _shift ( 2 , ( data . numFmtId || 0 ) ) ;
o . write _shift ( 2 , ( ixfeP << 4 ) ) ;
}
2021-10-13 07:20:25 +00:00
var f = 0 ;
if ( data . numFmtId > 0 && b5 ) f |= 0x0400 ;
o . write _shift ( 4 , f ) ;
2018-02-08 18:21:39 +00:00
o . write _shift ( 4 , 0 ) ;
2018-02-14 20:06:35 +00:00
if ( ! b5 ) o . write _shift ( 4 , 0 ) ;
2018-02-08 18:21:39 +00:00
o . write _shift ( 2 , 0 ) ;
return o ;
}
2017-02-03 20:50:45 +00:00
2018-02-14 20:06:35 +00:00
/* [MS-XLS] 2.4.134 */
2018-01-23 09:07:51 +00:00
function parse _Guts ( blob ) {
2017-02-03 20:50:45 +00:00
blob . l += 4 ;
var out = [ blob . read _shift ( 2 ) , blob . read _shift ( 2 ) ] ;
if ( out [ 0 ] !== 0 ) out [ 0 ] -- ;
if ( out [ 1 ] !== 0 ) out [ 1 ] -- ;
2017-03-27 21:35:15 +00:00
if ( out [ 0 ] > 7 || out [ 1 ] > 7 ) throw new Error ( "Bad Gutters: " + out . join ( "|" ) ) ;
2017-02-03 20:50:45 +00:00
return out ;
}
2017-09-22 22:18:51 +00:00
function write _Guts ( guts /*:Array<number>*/ ) {
var o = new _buf ( 8 ) ;
o . write _shift ( 4 , 0 ) ;
o . write _shift ( 2 , guts [ 0 ] ? guts [ 0 ] + 1 : 0 ) ;
o . write _shift ( 2 , guts [ 1 ] ? guts [ 1 ] + 1 : 0 ) ;
return o ;
}
2017-02-03 20:50:45 +00:00
2018-02-14 20:06:35 +00:00
/* [MS-XLS] 2.4.24 */
2017-02-10 19:23:01 +00:00
function parse _BoolErr ( blob , length , opts ) {
2017-02-03 20:50:45 +00:00
var cell = parse _XLSCell ( blob , 6 ) ;
2021-10-13 07:20:25 +00:00
if ( opts . biff == 2 || length == 9 ) ++ blob . l ;
2017-02-03 20:50:45 +00:00
var val = parse _Bes ( blob , 2 ) ;
cell . val = val ;
cell . t = ( val === true || val === false ) ? 'b' : 'e' ;
return cell ;
}
2018-02-08 18:21:39 +00:00
function write _BoolErr ( R /*:number*/ , C /*:number*/ , v , os /*:number*/ , opts , t /*:string*/ ) {
2017-09-22 22:18:51 +00:00
var o = new _buf ( 8 ) ;
2018-02-08 18:21:39 +00:00
write _XLSCell ( R , C , os , o ) ;
2017-09-22 22:18:51 +00:00
write _Bes ( v , t , o ) ;
return o ;
}
2017-02-03 20:50:45 +00:00
2018-02-14 20:06:35 +00:00
/* [MS-XLS] 2.4.180 Number */
2021-10-13 07:20:25 +00:00
function parse _Number ( blob , length , opts ) {
if ( opts . biffguess && opts . biff == 2 ) opts . biff = 5 ;
2017-02-03 20:50:45 +00:00
var cell = parse _XLSCell ( blob , 6 ) ;
var xnum = parse _Xnum ( blob , 8 ) ;
cell . val = xnum ;
return cell ;
}
2018-02-08 18:21:39 +00:00
function write _Number ( R /*:number*/ , C /*:number*/ , v , os /*:: :number, opts*/ ) {
2017-09-22 22:18:51 +00:00
var o = new _buf ( 14 ) ;
2018-02-08 18:21:39 +00:00
write _XLSCell ( R , C , os , o ) ;
2017-09-22 22:18:51 +00:00
write _Xnum ( v , o ) ;
return o ;
}
2017-02-03 20:50:45 +00:00
var parse _XLHeaderFooter = parse _OptXLUnicodeString ; // TODO: parse 2.4.136
2018-02-14 20:06:35 +00:00
/* [MS-XLS] 2.4.271 */
2017-02-03 20:50:45 +00:00
function parse _SupBook ( blob , length , opts ) {
var end = blob . l + length ;
var ctab = blob . read _shift ( 2 ) ;
var cch = blob . read _shift ( 2 ) ;
opts . sbcch = cch ;
2017-06-10 01:47:42 +00:00
if ( cch == 0x0401 || cch == 0x3A01 ) return [ cch , ctab ] ;
if ( cch < 0x01 || cch > 0xff ) throw new Error ( "Unexpected SupBook type: " + cch ) ;
var virtPath = parse _XLUnicodeStringNoCch ( blob , cch ) ;
2017-07-27 20:07:51 +00:00
/* TODO: 2.5.277 Virtual Path */
var rgst = [ ] ;
while ( end > blob . l ) rgst . push ( parse _XLUnicodeString ( blob ) ) ;
2017-02-03 20:50:45 +00:00
return [ cch , ctab , virtPath , rgst ] ;
}
2018-02-14 20:06:35 +00:00
/* [MS-XLS] 2.4.105 TODO */
2017-02-03 20:50:45 +00:00
function parse _ExternName ( blob , length , opts ) {
var flags = blob . read _shift ( 2 ) ;
var body ;
2017-02-10 19:23:01 +00:00
var o = ( {
2017-02-03 20:50:45 +00:00
fBuiltIn : flags & 0x01 ,
fWantAdvise : ( flags >>> 1 ) & 0x01 ,
fWantPict : ( flags >>> 2 ) & 0x01 ,
fOle : ( flags >>> 3 ) & 0x01 ,
fOleLink : ( flags >>> 4 ) & 0x01 ,
cf : ( flags >>> 5 ) & 0x3FF ,
fIcon : flags >>> 15 & 0x01
2017-02-10 19:23:01 +00:00
} /*:any*/ ) ;
2017-02-19 20:36:32 +00:00
if ( opts . sbcch === 0x3A01 ) body = parse _AddinUdf ( blob , length - 2 , opts ) ;
2017-02-03 20:50:45 +00:00
//else throw new Error("unsupported SupBook cch: " + opts.sbcch);
o . body = body || blob . read _shift ( length - 2 ) ;
2017-04-11 22:15:36 +00:00
if ( typeof body === "string" ) o . Name = body ;
2017-02-03 20:50:45 +00:00
return o ;
}
2018-02-14 20:06:35 +00:00
/* [MS-XLS] 2.4.150 TODO */
2017-02-03 20:50:45 +00:00
function parse _Lbl ( blob , length , opts ) {
var target = blob . l + length ;
var flags = blob . read _shift ( 2 ) ;
var chKey = blob . read _shift ( 1 ) ;
var cch = blob . read _shift ( 1 ) ;
2017-02-19 20:36:32 +00:00
var cce = blob . read _shift ( opts && opts . biff == 2 ? 1 : 2 ) ;
2017-04-10 05:10:54 +00:00
var itab = 0 ;
2017-02-19 20:36:32 +00:00
if ( ! opts || opts . biff >= 5 ) {
2017-12-15 01:18:40 +00:00
if ( opts . biff != 5 ) blob . l += 2 ;
2017-04-10 05:10:54 +00:00
itab = blob . read _shift ( 2 ) ;
2017-12-15 01:18:40 +00:00
if ( opts . biff == 5 ) blob . l += 2 ;
2017-02-19 20:36:32 +00:00
blob . l += 4 ;
}
2017-02-03 20:50:45 +00:00
var name = parse _XLUnicodeStringNoCch ( blob , cch , opts ) ;
2017-06-10 01:47:42 +00:00
if ( flags & 0x20 ) name = XLSLblBuiltIn [ name . charCodeAt ( 0 ) ] ;
2017-02-19 20:36:32 +00:00
var npflen = target - blob . l ; if ( opts && opts . biff == 2 ) -- npflen ;
2022-01-10 18:45:50 +00:00
/*jshint -W018 */
2021-05-13 19:02:31 +00:00
var rgce = ( target == blob . l || cce === 0 || ! ( npflen > 0 ) ) ? [ ] : parse _NameParsedFormula ( blob , npflen , opts , cce ) ;
2022-01-10 18:45:50 +00:00
/*jshint +W018 */
2017-02-03 20:50:45 +00:00
return {
chKey : chKey ,
Name : name ,
2017-04-10 05:10:54 +00:00
itab : itab ,
2017-02-03 20:50:45 +00:00
rgce : rgce
} ;
}
2018-02-14 20:06:35 +00:00
/* [MS-XLS] 2.4.106 TODO: verify filename encoding */
2017-02-03 20:50:45 +00:00
function parse _ExternSheet ( blob , length , opts ) {
2017-07-27 20:07:51 +00:00
if ( opts . biff < 8 ) return parse _BIFF5ExternSheet ( blob , length , opts ) ;
var o = [ ] , target = blob . l + length , len = blob . read _shift ( opts . biff > 8 ? 4 : 2 ) ;
while ( len -- !== 0 ) o . push ( parse _XTI ( blob , opts . biff > 8 ? 12 : 6 , opts ) ) ;
2017-04-11 22:15:36 +00:00
// [iSupBook, itabFirst, itabLast];
2018-01-23 09:07:51 +00:00
if ( blob . l != target ) throw new Error ( "Bad ExternSheet: " + blob . l + " != " + target ) ;
2017-04-11 22:15:36 +00:00
return o ;
}
2017-07-27 20:07:51 +00:00
function parse _BIFF5ExternSheet ( blob , length , opts ) {
if ( blob [ blob . l + 1 ] == 0x03 ) blob [ blob . l ] ++ ;
var o = parse _ShortXLUnicodeString ( blob , length , opts ) ;
return o . charCodeAt ( 0 ) == 0x03 ? o . slice ( 1 ) : o ;
}
2017-04-11 22:15:36 +00:00
2018-02-14 20:06:35 +00:00
/* [MS-XLS] 2.4.176 TODO: check older biff */
2017-04-11 22:15:36 +00:00
function parse _NameCmt ( blob , length , opts ) {
if ( opts . biff < 8 ) { blob . l += length ; return ; }
var cchName = blob . read _shift ( 2 ) ;
var cchComment = blob . read _shift ( 2 ) ;
var name = parse _XLUnicodeStringNoCch ( blob , cchName , opts ) ;
var comment = parse _XLUnicodeStringNoCch ( blob , cchComment , opts ) ;
return [ name , comment ] ;
2017-02-03 20:50:45 +00:00
}
2018-02-14 20:06:35 +00:00
/* [MS-XLS] 2.4.260 */
2017-02-03 20:50:45 +00:00
function parse _ShrFmla ( blob , length , opts ) {
var ref = parse _RefU ( blob , 6 ) ;
blob . l ++ ;
var cUse = blob . read _shift ( 1 ) ;
length -= 8 ;
2018-01-09 07:36:02 +00:00
return [ parse _SharedParsedFormula ( blob , length , opts ) , cUse , ref ] ;
2017-02-03 20:50:45 +00:00
}
2018-02-14 20:06:35 +00:00
/* [MS-XLS] 2.4.4 TODO */
2017-02-03 20:50:45 +00:00
function parse _Array ( blob , length , opts ) {
var ref = parse _Ref ( blob , 6 ) ;
2017-02-19 20:36:32 +00:00
/* TODO: fAlwaysCalc */
switch ( opts . biff ) {
case 2 : blob . l ++ ; length -= 7 ; break ;
case 3 : case 4 : blob . l += 2 ; length -= 8 ; break ;
default : blob . l += 6 ; length -= 12 ;
}
2017-02-03 20:50:45 +00:00
return [ ref , parse _ArrayParsedFormula ( blob , length , opts , ref ) ] ;
}
2018-02-14 20:06:35 +00:00
/* [MS-XLS] 2.4.173 */
2018-01-23 09:07:51 +00:00
function parse _MTRSettings ( blob ) {
2017-02-03 20:50:45 +00:00
var fMTREnabled = blob . read _shift ( 4 ) !== 0x00 ;
var fUserSetThreadCount = blob . read _shift ( 4 ) !== 0x00 ;
var cUserThreadCount = blob . read _shift ( 4 ) ;
return [ fMTREnabled , fUserSetThreadCount , cUserThreadCount ] ;
}
2018-02-14 20:06:35 +00:00
/* [MS-XLS] 2.5.186 TODO: BIFF5 */
2017-02-03 20:50:45 +00:00
function parse _NoteSh ( blob , length , opts ) {
if ( opts . biff < 8 ) return ;
var row = blob . read _shift ( 2 ) , col = blob . read _shift ( 2 ) ;
var flags = blob . read _shift ( 2 ) , idObj = blob . read _shift ( 2 ) ;
var stAuthor = parse _XLUnicodeString2 ( blob , 0 , opts ) ;
if ( opts . biff < 8 ) blob . read _shift ( 1 ) ;
return [ { r : row , c : col } , stAuthor , idObj , flags ] ;
}
2018-02-14 20:06:35 +00:00
/* [MS-XLS] 2.4.179 */
2017-02-03 20:50:45 +00:00
function parse _Note ( blob , length , opts ) {
/* TODO: Support revisions */
return parse _NoteSh ( blob , length , opts ) ;
}
2018-02-14 20:06:35 +00:00
/* [MS-XLS] 2.4.168 */
2017-12-30 05:40:35 +00:00
function parse _MergeCells ( blob , length ) /*:Array<Range>*/ {
var merges /*:Array<Range>*/ = [ ] ;
2017-02-03 20:50:45 +00:00
var cmcs = blob . read _shift ( 2 ) ;
while ( cmcs -- ) merges . push ( parse _Ref8U ( blob , length ) ) ;
return merges ;
}
2017-12-30 05:40:35 +00:00
function write _MergeCells ( merges /*:Array<Range>*/ ) {
var o = new _buf ( 2 + merges . length * 8 ) ;
o . write _shift ( 2 , merges . length ) ;
for ( var i = 0 ; i < merges . length ; ++ i ) write _Ref8U ( merges [ i ] , o ) ;
return o ;
}
2017-02-03 20:50:45 +00:00
2018-02-14 20:06:35 +00:00
/* [MS-XLS] 2.4.181 TODO: parse all the things! */
2017-05-09 18:07:57 +00:00
function parse _Obj ( blob , length , opts ) {
if ( opts && opts . biff < 8 ) return parse _BIFF5Obj ( blob , length , opts ) ;
2017-02-03 20:50:45 +00:00
var cmo = parse _FtCmo ( blob , 22 ) ; // id, ot, flags
var fts = parse _FtArray ( blob , length - 22 , cmo [ 1 ] ) ;
return { cmo : cmo , ft : fts } ;
}
2017-05-09 18:07:57 +00:00
/* from older spec */
2022-03-12 14:05:57 +00:00
var parse _BIFF5OT = {
0x08 : function ( blob , length ) {
2017-05-09 18:07:57 +00:00
var tgt = blob . l + length ;
blob . l += 10 ; // todo
var cf = blob . read _shift ( 2 ) ;
blob . l += 4 ;
2018-01-23 09:07:51 +00:00
blob . l += 2 ; //var cbPictFmla = blob.read_shift(2);
2017-05-09 18:07:57 +00:00
blob . l += 2 ;
2018-01-23 09:07:51 +00:00
blob . l += 2 ; //var grbit = blob.read_shift(2);
2017-05-09 18:07:57 +00:00
blob . l += 4 ;
var cchName = blob . read _shift ( 1 ) ;
blob . l += cchName ; // TODO: stName
blob . l = tgt ; // TODO: fmla
return { fmt : cf } ;
2022-03-12 14:05:57 +00:00
}
2017-05-09 18:07:57 +00:00
} ;
function parse _BIFF5Obj ( blob , length , opts ) {
2018-01-23 09:07:51 +00:00
blob . l += 4 ; //var cnt = blob.read_shift(4);
2017-05-09 18:07:57 +00:00
var ot = blob . read _shift ( 2 ) ;
var id = blob . read _shift ( 2 ) ;
var grbit = blob . read _shift ( 2 ) ;
2018-01-23 09:07:51 +00:00
blob . l += 2 ; //var colL = blob.read_shift(2);
blob . l += 2 ; //var dxL = blob.read_shift(2);
blob . l += 2 ; //var rwT = blob.read_shift(2);
blob . l += 2 ; //var dyT = blob.read_shift(2);
blob . l += 2 ; //var colR = blob.read_shift(2);
blob . l += 2 ; //var dxR = blob.read_shift(2);
blob . l += 2 ; //var rwB = blob.read_shift(2);
blob . l += 2 ; //var dyB = blob.read_shift(2);
blob . l += 2 ; //var cbMacro = blob.read_shift(2);
2017-05-09 18:07:57 +00:00
blob . l += 6 ;
length -= 36 ;
var fts = [ ] ;
fts . push ( ( parse _BIFF5OT [ ot ] || parsenoop ) ( blob , length , opts ) ) ;
return { cmo : [ id , ot , grbit ] , ft : fts } ;
}
2017-02-03 20:50:45 +00:00
2018-02-14 20:06:35 +00:00
/* [MS-XLS] 2.4.329 TODO: parse properly */
2017-02-03 20:50:45 +00:00
function parse _TxO ( blob , length , opts ) {
var s = blob . l ;
2017-02-10 19:23:01 +00:00
var texts = "" ;
2017-02-03 20:50:45 +00:00
try {
blob . l += 4 ;
var ot = ( opts . lastobj || { cmo : [ 0 , 0 ] } ) . cmo [ 1 ] ;
2018-01-23 09:07:51 +00:00
var controlInfo ; // eslint-disable-line no-unused-vars
2017-02-03 20:50:45 +00:00
if ( [ 0 , 5 , 7 , 11 , 12 , 14 ] . indexOf ( ot ) == - 1 ) blob . l += 6 ;
2022-03-12 14:05:57 +00:00
else controlInfo = parse _ControlInfo ( blob , 6 , opts ) ; // eslint-disable-line no-unused-vars
2017-02-03 20:50:45 +00:00
var cchText = blob . read _shift ( 2 ) ;
2018-01-23 09:07:51 +00:00
/*var cbRuns = */ blob . read _shift ( 2 ) ;
/*var ifntEmpty = */ parseuint16 ( blob , 2 ) ;
2017-02-03 20:50:45 +00:00
var len = blob . read _shift ( 2 ) ;
blob . l += len ;
//var fmla = parse_ObjFmla(blob, s + length - blob.l);
for ( var i = 1 ; i < blob . lens . length - 1 ; ++ i ) {
2017-03-27 21:35:15 +00:00
if ( blob . l - s != blob . lens [ i ] ) throw new Error ( "TxO: bad continue record" ) ;
2017-02-03 20:50:45 +00:00
var hdr = blob [ blob . l ] ;
var t = parse _XLUnicodeStringNoCch ( blob , blob . lens [ i + 1 ] - blob . lens [ i ] - 1 ) ;
texts += t ;
if ( texts . length >= ( hdr ? cchText : 2 * cchText ) ) break ;
}
if ( texts . length !== cchText && texts . length !== cchText * 2 ) {
2017-03-27 21:35:15 +00:00
throw new Error ( "cchText: " + cchText + " != " + texts . length ) ;
2017-02-03 20:50:45 +00:00
}
blob . l = s + length ;
2018-02-14 20:06:35 +00:00
/* [MS-XLS] 2.5.272 TxORuns */
2017-02-03 20:50:45 +00:00
// var rgTxoRuns = [];
// for(var j = 0; j != cbRuns/8-1; ++j) blob.l += 8;
// var cchText2 = blob.read_shift(2);
2017-03-27 21:35:15 +00:00
// if(cchText2 !== cchText) throw new Error("TxOLastRun mismatch: " + cchText2 + " " + cchText);
2017-02-03 20:50:45 +00:00
// blob.l += 6;
2017-03-27 21:35:15 +00:00
// if(s + length != blob.l) throw new Error("TxO " + (s + length) + ", at " + blob.l);
2017-02-03 20:50:45 +00:00
return { t : texts } ;
2017-02-10 19:23:01 +00:00
} catch ( e ) { blob . l = s + length ; return { t : texts } ; }
2017-02-03 20:50:45 +00:00
}
2018-02-14 20:06:35 +00:00
/* [MS-XLS] 2.4.140 */
2017-09-22 22:18:51 +00:00
function parse _HLink ( blob , length ) {
2017-02-03 20:50:45 +00:00
var ref = parse _Ref8U ( blob , 8 ) ;
blob . l += 16 ; /* CLSID */
var hlink = parse _Hyperlink ( blob , length - 24 ) ;
return [ ref , hlink ] ;
2017-09-22 22:18:51 +00:00
}
2017-12-15 01:18:40 +00:00
function write _HLink ( hl ) {
var O = new _buf ( 24 ) ;
var ref = decode _cell ( hl [ 0 ] ) ;
O . write _shift ( 2 , ref . r ) ; O . write _shift ( 2 , ref . r ) ;
O . write _shift ( 2 , ref . c ) ; O . write _shift ( 2 , ref . c ) ;
var clsid = "d0 c9 ea 79 f9 ba ce 11 8c 82 00 aa 00 4b a9 0b" . split ( " " ) ;
for ( var i = 0 ; i < 16 ; ++ i ) O . write _shift ( 1 , parseInt ( clsid [ i ] , 16 ) ) ;
return bconcat ( [ O , write _Hyperlink ( hl [ 1 ] ) ] ) ;
}
2017-02-03 20:50:45 +00:00
2018-02-14 20:06:35 +00:00
/* [MS-XLS] 2.4.141 */
2017-09-22 22:18:51 +00:00
function parse _HLinkTooltip ( blob , length ) {
2017-02-03 20:50:45 +00:00
blob . read _shift ( 2 ) ;
var ref = parse _Ref8U ( blob , 8 ) ;
var wzTooltip = blob . read _shift ( ( length - 10 ) / 2 , 'dbcs-cont' ) ;
wzTooltip = wzTooltip . replace ( chr0 , "" ) ;
return [ ref , wzTooltip ] ;
2017-09-22 22:18:51 +00:00
}
2017-12-15 01:18:40 +00:00
function write _HLinkTooltip ( hl ) {
var TT = hl [ 1 ] . Tooltip ;
var O = new _buf ( 10 + 2 * ( TT . length + 1 ) ) ;
O . write _shift ( 2 , 0x0800 ) ;
var ref = decode _cell ( hl [ 0 ] ) ;
O . write _shift ( 2 , ref . r ) ; O . write _shift ( 2 , ref . r ) ;
O . write _shift ( 2 , ref . c ) ; O . write _shift ( 2 , ref . c ) ;
for ( var i = 0 ; i < TT . length ; ++ i ) O . write _shift ( 2 , TT . charCodeAt ( i ) ) ;
O . write _shift ( 2 , 0 ) ;
return O ;
}
2017-02-03 20:50:45 +00:00
2018-02-14 20:06:35 +00:00
/* [MS-XLS] 2.4.63 */
2018-01-23 09:07:51 +00:00
function parse _Country ( blob ) /*:[string|number, string|number]*/ {
2017-12-30 05:40:35 +00:00
var o = [ 0 , 0 ] , d ;
2017-02-03 20:50:45 +00:00
d = blob . read _shift ( 2 ) ; o [ 0 ] = CountryEnum [ d ] || d ;
d = blob . read _shift ( 2 ) ; o [ 1 ] = CountryEnum [ d ] || d ;
return o ;
}
2017-09-22 22:18:51 +00:00
function write _Country ( o ) {
if ( ! o ) o = new _buf ( 4 ) ;
o . write _shift ( 2 , 0x01 ) ;
o . write _shift ( 2 , 0x01 ) ;
return o ;
}
2017-02-03 20:50:45 +00:00
2018-02-14 20:06:35 +00:00
/* [MS-XLS] 2.4.50 ClrtClient */
2018-01-23 09:07:51 +00:00
function parse _ClrtClient ( blob ) {
2017-02-03 20:50:45 +00:00
var ccv = blob . read _shift ( 2 ) ;
var o = [ ] ;
while ( ccv -- > 0 ) o . push ( parse _LongRGB ( blob , 8 ) ) ;
return o ;
}
2018-02-14 20:06:35 +00:00
/* [MS-XLS] 2.4.188 */
2018-01-23 09:07:51 +00:00
function parse _Palette ( blob ) {
2017-02-03 20:50:45 +00:00
var ccv = blob . read _shift ( 2 ) ;
var o = [ ] ;
while ( ccv -- > 0 ) o . push ( parse _LongRGB ( blob , 8 ) ) ;
return o ;
}
2018-02-14 20:06:35 +00:00
/* [MS-XLS] 2.4.354 */
2018-01-23 09:07:51 +00:00
function parse _XFCRC ( blob ) {
2017-02-03 20:50:45 +00:00
blob . l += 2 ;
var o = { cxfs : 0 , crc : 0 } ;
o . cxfs = blob . read _shift ( 2 ) ;
o . crc = blob . read _shift ( 4 ) ;
return o ;
}
2018-02-14 20:06:35 +00:00
/* [MS-XLS] 2.4.53 TODO: parse flags */
2017-03-20 09:02:25 +00:00
/* [MS-XLSB] 2.4.323 TODO: parse flags */
function parse _ColInfo ( blob , length , opts ) {
if ( ! opts . cellStyles ) return parsenoop ( blob , length ) ;
var w = opts && opts . biff >= 12 ? 4 : 2 ;
var colFirst = blob . read _shift ( w ) ;
var colLast = blob . read _shift ( w ) ;
var coldx = blob . read _shift ( w ) ;
var ixfe = blob . read _shift ( w ) ;
var flags = blob . read _shift ( 2 ) ;
if ( w == 2 ) blob . l += 2 ;
2019-11-01 03:09:14 +00:00
var o = ( { s : colFirst , e : colLast , w : coldx , ixfe : ixfe , flags : flags } /*:any*/ ) ;
if ( opts . biff >= 5 || ! opts . biff ) o . level = ( flags >> 8 ) & 0x7 ;
return o ;
2017-03-20 09:02:25 +00:00
}
2021-09-16 01:50:33 +00:00
function write _ColInfo ( col , idx ) {
var o = new _buf ( 12 ) ;
o . write _shift ( 2 , idx ) ;
o . write _shift ( 2 , idx ) ;
o . write _shift ( 2 , col . width * 256 ) ;
o . write _shift ( 2 , 0 ) ;
var f = 0 ;
if ( col . hidden ) f |= 1 ;
o . write _shift ( 1 , f ) ;
f = col . level || 0 ;
o . write _shift ( 1 , f ) ;
o . write _shift ( 2 , 0 ) ;
return o ;
}
2017-03-20 09:02:25 +00:00
2018-02-14 20:06:35 +00:00
/* [MS-XLS] 2.4.257 */
function parse _Setup ( blob , length ) {
2017-04-13 01:29:38 +00:00
var o = { } ;
2018-02-14 20:06:35 +00:00
if ( length < 32 ) return o ;
2017-04-13 01:29:38 +00:00
blob . l += 16 ;
o . header = parse _Xnum ( blob , 8 ) ;
o . footer = parse _Xnum ( blob , 8 ) ;
blob . l += 2 ;
return o ;
}
2018-02-14 20:06:35 +00:00
/* [MS-XLS] 2.4.261 */
2017-03-27 21:35:15 +00:00
function parse _ShtProps ( blob , length , opts ) {
var def = { area : false } ;
if ( opts . biff != 5 ) { blob . l += length ; return def ; }
var d = blob . read _shift ( 1 ) ; blob . l += 3 ;
if ( ( d & 0x10 ) ) def . area = true ;
return def ;
}
2018-02-14 20:06:35 +00:00
/* [MS-XLS] 2.4.241 */
2017-09-22 22:18:51 +00:00
function write _RRTabId ( n /*:number*/ ) {
var out = new _buf ( 2 * n ) ;
for ( var i = 0 ; i < n ; ++ i ) out . write _shift ( 2 , i + 1 ) ;
return out ;
}
2017-02-03 20:50:45 +00:00
2018-02-14 20:06:35 +00:00
var parse _Blank = parse _XLSCell ; /* [MS-XLS] 2.4.20 Just the cell */
var parse _Scl = parseuint16a ; /* [MS-XLS] 2.4.247 num, den */
var parse _String = parse _XLUnicodeString ; /* [MS-XLS] 2.4.268 */
2017-02-03 20:50:45 +00:00
/* --- Specific to versions before BIFF8 --- */
2018-01-23 09:07:51 +00:00
function parse _ImData ( blob ) {
2017-05-09 18:07:57 +00:00
var cf = blob . read _shift ( 2 ) ;
var env = blob . read _shift ( 2 ) ;
var lcb = blob . read _shift ( 4 ) ;
var o = { fmt : cf , env : env , len : lcb , data : blob . slice ( blob . l , blob . l + lcb ) } ;
blob . l += lcb ;
return o ;
}
2017-02-03 20:50:45 +00:00
/* BIFF2_??? where ??? is the name from [XLS] */
function parse _BIFF2STR ( blob , length , opts ) {
2021-10-13 07:20:25 +00:00
if ( opts . biffguess && opts . biff == 5 ) opts . biff = 2 ;
2017-02-03 20:50:45 +00:00
var cell = parse _XLSCell ( blob , 6 ) ;
++ blob . l ;
var str = parse _XLUnicodeString2 ( blob , length - 7 , opts ) ;
2017-02-19 20:36:32 +00:00
cell . t = 'str' ;
2017-02-03 20:50:45 +00:00
cell . val = str ;
return cell ;
}
2018-01-23 09:07:51 +00:00
function parse _BIFF2NUM ( blob /*::, length*/ ) {
2017-02-03 20:50:45 +00:00
var cell = parse _XLSCell ( blob , 6 ) ;
++ blob . l ;
var num = parse _Xnum ( blob , 8 ) ;
2017-02-19 20:36:32 +00:00
cell . t = 'n' ;
2017-02-03 20:50:45 +00:00
cell . val = num ;
return cell ;
}
2017-09-22 22:18:51 +00:00
function write _BIFF2NUM ( r /*:number*/ , c /*:number*/ , val /*:number*/ ) {
var out = new _buf ( 15 ) ;
write _BIFF2Cell ( out , r , c ) ;
out . write _shift ( 8 , val , 'f' ) ;
return out ;
}
2017-02-03 20:50:45 +00:00
2018-01-23 09:07:51 +00:00
function parse _BIFF2INT ( blob ) {
2017-02-10 19:23:01 +00:00
var cell = parse _XLSCell ( blob , 6 ) ;
++ blob . l ;
var num = blob . read _shift ( 2 ) ;
2017-02-19 20:36:32 +00:00
cell . t = 'n' ;
2017-02-10 19:23:01 +00:00
cell . val = num ;
return cell ;
}
2017-09-22 22:18:51 +00:00
function write _BIFF2INT ( r /*:number*/ , c /*:number*/ , val /*:number*/ ) {
var out = new _buf ( 9 ) ;
write _BIFF2Cell ( out , r , c ) ;
out . write _shift ( 2 , val ) ;
return out ;
}
2017-02-10 19:23:01 +00:00
2018-01-23 09:07:51 +00:00
function parse _BIFF2STRING ( blob ) {
2017-02-10 19:23:01 +00:00
var cch = blob . read _shift ( 1 ) ;
if ( cch === 0 ) { blob . l ++ ; return "" ; }
return blob . read _shift ( cch , 'sbcs-cont' ) ;
}
/* TODO: convert to BIFF8 font struct */
function parse _BIFF2FONTXTRA ( blob , length ) {
blob . l += 6 ; // unknown
blob . l += 2 ; // font weight "bls"
blob . l += 1 ; // charset
blob . l += 3 ; // unknown
blob . l += 1 ; // font family
2017-05-09 18:07:57 +00:00
blob . l += length - 13 ;
2017-02-10 19:23:01 +00:00
}
2017-02-19 20:36:32 +00:00
/* TODO: parse rich text runs */
function parse _RString ( blob , length , opts ) {
var end = blob . l + length ;
var cell = parse _XLSCell ( blob , 6 ) ;
var cch = blob . read _shift ( 2 ) ;
var str = parse _XLUnicodeStringNoCch ( blob , cch , opts ) ;
blob . l = end ;
cell . t = 'str' ;
cell . val = str ;
return cell ;
}
2017-03-28 04:41:01 +00:00
/* from js-harb (C) 2014-present SheetJS */
2022-03-12 14:05:57 +00:00
var DBF _SUPPORTED _VERSIONS = [ 0x02 , 0x03 , 0x30 , 0x31 , 0x83 , 0x8B , 0x8C , 0xF5 ] ;
var DBF = /*#__PURE__*/ ( function ( ) {
2017-03-28 04:41:01 +00:00
var dbf _codepage _map = {
/* Code Pages Supported by Visual FoxPro */
/*::[*/ 0x01 /*::]*/ : 437 , /*::[*/ 0x02 /*::]*/ : 850 ,
/*::[*/ 0x03 /*::]*/ : 1252 , /*::[*/ 0x04 /*::]*/ : 10000 ,
/*::[*/ 0x64 /*::]*/ : 852 , /*::[*/ 0x65 /*::]*/ : 866 ,
/*::[*/ 0x66 /*::]*/ : 865 , /*::[*/ 0x67 /*::]*/ : 861 ,
/*::[*/ 0x68 /*::]*/ : 895 , /*::[*/ 0x69 /*::]*/ : 620 ,
/*::[*/ 0x6A /*::]*/ : 737 , /*::[*/ 0x6B /*::]*/ : 857 ,
/*::[*/ 0x78 /*::]*/ : 950 , /*::[*/ 0x79 /*::]*/ : 949 ,
/*::[*/ 0x7A /*::]*/ : 936 , /*::[*/ 0x7B /*::]*/ : 932 ,
/*::[*/ 0x7C /*::]*/ : 874 , /*::[*/ 0x7D /*::]*/ : 1255 ,
/*::[*/ 0x7E /*::]*/ : 1256 , /*::[*/ 0x96 /*::]*/ : 10007 ,
/*::[*/ 0x97 /*::]*/ : 10029 , /*::[*/ 0x98 /*::]*/ : 10006 ,
/*::[*/ 0xC8 /*::]*/ : 1250 , /*::[*/ 0xC9 /*::]*/ : 1251 ,
/*::[*/ 0xCA /*::]*/ : 1254 , /*::[*/ 0xCB /*::]*/ : 1253 ,
/* shapefile DBF extension */
/*::[*/ 0x00 /*::]*/ : 20127 , /*::[*/ 0x08 /*::]*/ : 865 ,
/*::[*/ 0x09 /*::]*/ : 437 , /*::[*/ 0x0A /*::]*/ : 850 ,
/*::[*/ 0x0B /*::]*/ : 437 , /*::[*/ 0x0D /*::]*/ : 437 ,
/*::[*/ 0x0E /*::]*/ : 850 , /*::[*/ 0x0F /*::]*/ : 437 ,
/*::[*/ 0x10 /*::]*/ : 850 , /*::[*/ 0x11 /*::]*/ : 437 ,
/*::[*/ 0x12 /*::]*/ : 850 , /*::[*/ 0x13 /*::]*/ : 932 ,
/*::[*/ 0x14 /*::]*/ : 850 , /*::[*/ 0x15 /*::]*/ : 437 ,
/*::[*/ 0x16 /*::]*/ : 850 , /*::[*/ 0x17 /*::]*/ : 865 ,
/*::[*/ 0x18 /*::]*/ : 437 , /*::[*/ 0x19 /*::]*/ : 437 ,
/*::[*/ 0x1A /*::]*/ : 850 , /*::[*/ 0x1B /*::]*/ : 437 ,
/*::[*/ 0x1C /*::]*/ : 863 , /*::[*/ 0x1D /*::]*/ : 850 ,
/*::[*/ 0x1F /*::]*/ : 852 , /*::[*/ 0x22 /*::]*/ : 852 ,
/*::[*/ 0x23 /*::]*/ : 852 , /*::[*/ 0x24 /*::]*/ : 860 ,
/*::[*/ 0x25 /*::]*/ : 850 , /*::[*/ 0x26 /*::]*/ : 866 ,
/*::[*/ 0x37 /*::]*/ : 850 , /*::[*/ 0x40 /*::]*/ : 852 ,
/*::[*/ 0x4D /*::]*/ : 936 , /*::[*/ 0x4E /*::]*/ : 949 ,
/*::[*/ 0x4F /*::]*/ : 950 , /*::[*/ 0x50 /*::]*/ : 874 ,
/*::[*/ 0x57 /*::]*/ : 1252 , /*::[*/ 0x58 /*::]*/ : 1252 ,
2021-08-11 02:53:38 +00:00
/*::[*/ 0x59 /*::]*/ : 1252 , /*::[*/ 0x6C /*::]*/ : 863 ,
/*::[*/ 0x86 /*::]*/ : 737 , /*::[*/ 0x87 /*::]*/ : 852 ,
/*::[*/ 0x88 /*::]*/ : 857 , /*::[*/ 0xCC /*::]*/ : 1257 ,
2017-03-28 04:41:01 +00:00
/*::[*/ 0xFF /*::]*/ : 16969
} ;
2019-07-21 03:32:02 +00:00
var dbf _reverse _map = evert ( {
/*::[*/ 0x01 /*::]*/ : 437 , /*::[*/ 0x02 /*::]*/ : 850 ,
/*::[*/ 0x03 /*::]*/ : 1252 , /*::[*/ 0x04 /*::]*/ : 10000 ,
/*::[*/ 0x64 /*::]*/ : 852 , /*::[*/ 0x65 /*::]*/ : 866 ,
/*::[*/ 0x66 /*::]*/ : 865 , /*::[*/ 0x67 /*::]*/ : 861 ,
/*::[*/ 0x68 /*::]*/ : 895 , /*::[*/ 0x69 /*::]*/ : 620 ,
/*::[*/ 0x6A /*::]*/ : 737 , /*::[*/ 0x6B /*::]*/ : 857 ,
/*::[*/ 0x78 /*::]*/ : 950 , /*::[*/ 0x79 /*::]*/ : 949 ,
/*::[*/ 0x7A /*::]*/ : 936 , /*::[*/ 0x7B /*::]*/ : 932 ,
/*::[*/ 0x7C /*::]*/ : 874 , /*::[*/ 0x7D /*::]*/ : 1255 ,
/*::[*/ 0x7E /*::]*/ : 1256 , /*::[*/ 0x96 /*::]*/ : 10007 ,
/*::[*/ 0x97 /*::]*/ : 10029 , /*::[*/ 0x98 /*::]*/ : 10006 ,
/*::[*/ 0xC8 /*::]*/ : 1250 , /*::[*/ 0xC9 /*::]*/ : 1251 ,
/*::[*/ 0xCA /*::]*/ : 1254 , /*::[*/ 0xCB /*::]*/ : 1253 ,
/*::[*/ 0x00 /*::]*/ : 20127
} ) ;
2017-03-28 04:41:01 +00:00
/* TODO: find an actual specification */
function dbf _to _aoa ( buf , opts ) /*:AOA*/ {
var out /*:AOA*/ = [ ] ;
var d /*:Block*/ = ( new _raw _buf ( 1 ) /*:any*/ ) ;
switch ( opts . type ) {
2022-03-22 20:08:08 +00:00
case 'base64' : d = s2a ( Base64 _decode ( buf ) ) ; break ;
2017-03-28 04:41:01 +00:00
case 'binary' : d = s2a ( buf ) ; break ;
case 'buffer' :
case 'array' : d = buf ; break ;
}
prep _blob ( d , 0 ) ;
2021-08-11 02:53:38 +00:00
2017-03-28 04:41:01 +00:00
/* header */
var ft = d . read _shift ( 1 ) ;
2021-08-11 02:53:38 +00:00
var memo = ! ! ( ft & 0x88 ) ;
2017-10-17 00:14:32 +00:00
var vfp = false , l7 = false ;
2017-03-28 04:41:01 +00:00
switch ( ft ) {
2021-08-11 02:53:38 +00:00
case 0x02 : break ; // dBASE II
case 0x03 : break ; // dBASE III
case 0x30 : vfp = true ; memo = true ; break ; // VFP
case 0x31 : vfp = true ; memo = true ; break ; // VFP with autoincrement
// 0x43 dBASE IV SQL table files
// 0x63 dBASE IV SQL system files
case 0x83 : break ; // dBASE III with memo
case 0x8B : break ; // dBASE IV with memo
case 0x8C : l7 = true ; break ; // dBASE Level 7 with memo
// case 0xCB dBASE IV SQL table files with memo
case 0xF5 : break ; // FoxPro 2.x with memo
// case 0xFB FoxBASE
2017-03-31 00:47:35 +00:00
default : throw new Error ( "DBF Unsupported Version: " + ft . toString ( 16 ) ) ;
2017-03-28 04:41:01 +00:00
}
2021-08-11 02:53:38 +00:00
var nrow = 0 , fpos = 0x0209 ;
2017-04-03 00:16:03 +00:00
if ( ft == 0x02 ) nrow = d . read _shift ( 2 ) ;
2021-08-11 02:53:38 +00:00
d . l += 3 ; // dBASE II stores DDMMYY date, others use YYMMDD
if ( ft != 0x02 ) nrow = d . read _shift ( 4 ) ;
if ( nrow > 1048576 ) nrow = 1e6 ;
2017-03-28 04:41:01 +00:00
2021-08-11 02:53:38 +00:00
if ( ft != 0x02 ) fpos = d . read _shift ( 2 ) ; // header length
var rlen = d . read _shift ( 2 ) ; // record length
2017-03-28 04:41:01 +00:00
2021-08-11 02:53:38 +00:00
var /*flags = 0,*/ current _cp = opts . codepage || 1252 ;
if ( ft != 0x02 ) { // 20 reserved bytes
d . l += 16 ;
/*flags = */ d . read _shift ( 1 ) ;
//if(memo && ((flags & 0x02) === 0)) throw new Error("DBF Flags " + flags.toString(16) + " ft " + ft.toString(16));
2017-03-28 04:41:01 +00:00
2021-08-11 02:53:38 +00:00
/* codepage present in FoxPro and dBASE Level 7 */
if ( d [ d . l ] !== 0 ) current _cp = dbf _codepage _map [ d [ d . l ] ] ;
d . l += 1 ;
d . l += 2 ;
2017-04-03 00:16:03 +00:00
}
2021-08-11 02:53:38 +00:00
if ( l7 ) d . l += 36 ; // Level 7: 32 byte "Language driver name", 4 byte reserved
2017-12-30 05:40:35 +00:00
/*:: type DBFField = { name:string; len:number; type:string; } */
var fields /*:Array<DBFField>*/ = [ ] , field /*:DBFField*/ = ( { } /*:any*/ ) ;
2021-08-11 02:53:38 +00:00
var hend = Math . min ( d . length , ( ft == 0x02 ? 0x209 : ( fpos - 10 - ( vfp ? 264 : 0 ) ) ) ) ;
var ww = l7 ? 32 : 11 ;
while ( d . l < hend && d [ d . l ] != 0x0d ) {
2017-12-30 05:40:35 +00:00
field = ( { } /*:any*/ ) ;
2022-03-12 14:05:57 +00:00
field . name = $cptable . utils . decode ( current _cp , d . slice ( d . l , d . l + ww ) ) . replace ( /[\u0000\r\n].*$/g , "" ) ;
2017-10-17 00:14:32 +00:00
d . l += ww ;
2017-03-28 04:41:01 +00:00
field . type = String . fromCharCode ( d . read _shift ( 1 ) ) ;
2017-10-17 00:14:32 +00:00
if ( ft != 0x02 && ! l7 ) field . offset = d . read _shift ( 4 ) ;
2017-03-28 04:41:01 +00:00
field . len = d . read _shift ( 1 ) ;
2017-04-03 00:16:03 +00:00
if ( ft == 0x02 ) field . offset = d . read _shift ( 2 ) ;
2017-03-28 04:41:01 +00:00
field . dec = d . read _shift ( 1 ) ;
if ( field . name . length ) fields . push ( field ) ;
2017-10-17 00:14:32 +00:00
if ( ft != 0x02 ) d . l += l7 ? 13 : 14 ;
2017-03-28 04:41:01 +00:00
switch ( field . type ) {
2021-08-11 02:53:38 +00:00
case 'B' : // Double (VFP) / Binary (dBASE L7)
2017-10-17 00:14:32 +00:00
if ( ( ! vfp || field . len != 8 ) && opts . WTF ) console . log ( 'Skipping ' + field . name + ':' + field . type ) ;
break ;
2021-08-11 02:53:38 +00:00
case 'G' : // General (FoxPro and dBASE L7)
case 'P' : // Picture (FoxPro and dBASE L7)
2017-10-17 00:14:32 +00:00
if ( opts . WTF ) console . log ( 'Skipping ' + field . name + ':' + field . type ) ;
break ;
2021-08-11 02:53:38 +00:00
case '+' : // Autoincrement (dBASE L7 only)
case '0' : // _NullFlags (VFP only)
case '@' : // Timestamp (dBASE L7 only)
case 'C' : // Character (dBASE II)
case 'D' : // Date (dBASE III)
case 'F' : // Float (dBASE IV)
case 'I' : // Long (VFP and dBASE L7)
case 'L' : // Logical (dBASE II)
case 'M' : // Memo (dBASE III)
case 'N' : // Number (dBASE II)
case 'O' : // Double (dBASE L7 only)
case 'T' : // Datetime (VFP only)
case 'Y' : // Currency (VFP only)
2017-10-17 00:14:32 +00:00
break ;
2017-03-28 04:41:01 +00:00
default : throw new Error ( 'Unknown Field Type: ' + field . type ) ;
}
}
2021-08-11 02:53:38 +00:00
2017-03-28 04:41:01 +00:00
if ( d [ d . l ] !== 0x0D ) d . l = fpos - 1 ;
2021-08-11 02:53:38 +00:00
if ( d . read _shift ( 1 ) !== 0x0D ) throw new Error ( "DBF Terminator not found " + d . l + " " + d [ d . l ] ) ;
d . l = fpos ;
2017-03-28 04:41:01 +00:00
/* data */
var R = 0 , C = 0 ;
out [ 0 ] = [ ] ;
for ( C = 0 ; C != fields . length ; ++ C ) out [ 0 ] [ C ] = fields [ C ] . name ;
while ( nrow -- > 0 ) {
2021-08-11 02:53:38 +00:00
if ( d [ d . l ] === 0x2A ) {
// TODO: record marked as deleted -- create a hidden row?
d . l += rlen ;
continue ;
}
2017-03-28 04:41:01 +00:00
++ d . l ;
out [ ++ R ] = [ ] ; C = 0 ;
for ( C = 0 ; C != fields . length ; ++ C ) {
var dd = d . slice ( d . l , d . l + fields [ C ] . len ) ; d . l += fields [ C ] . len ;
prep _blob ( dd , 0 ) ;
2022-03-12 14:05:57 +00:00
var s = $cptable . utils . decode ( current _cp , dd ) ;
2017-03-28 04:41:01 +00:00
switch ( fields [ C ] . type ) {
case 'C' :
2021-08-11 02:53:38 +00:00
// NOTE: it is conventional to write ' / / ' for empty dates
if ( s . trim ( ) . length ) out [ R ] [ C ] = s . replace ( /\s+$/ , "" ) ;
2017-03-28 04:41:01 +00:00
break ;
case 'D' :
2018-01-11 08:01:25 +00:00
if ( s . length === 8 ) out [ R ] [ C ] = new Date ( + s . slice ( 0 , 4 ) , + s . slice ( 4 , 6 ) - 1 , + s . slice ( 6 , 8 ) ) ;
2017-03-28 04:41:01 +00:00
else out [ R ] [ C ] = s ;
break ;
case 'F' : out [ R ] [ C ] = parseFloat ( s . trim ( ) ) ; break ;
2017-10-17 00:14:32 +00:00
case '+' : case 'I' : out [ R ] [ C ] = l7 ? dd . read _shift ( - 4 , 'i' ) ^ 0x80000000 : dd . read _shift ( 4 , 'i' ) ; break ;
2021-08-11 02:53:38 +00:00
case 'L' : switch ( s . trim ( ) . toUpperCase ( ) ) {
2017-03-28 04:41:01 +00:00
case 'Y' : case 'T' : out [ R ] [ C ] = true ; break ;
case 'N' : case 'F' : out [ R ] [ C ] = false ; break ;
2021-08-11 02:53:38 +00:00
case '' : case '?' : break ;
2017-03-28 04:41:01 +00:00
default : throw new Error ( "DBF Unrecognized L:|" + s + "|" ) ;
} break ;
case 'M' : /* TODO: handle memo files */
if ( ! memo ) throw new Error ( "DBF Unexpected MEMO for type " + ft . toString ( 16 ) ) ;
2017-10-17 00:14:32 +00:00
out [ R ] [ C ] = "##MEMO##" + ( l7 ? parseInt ( s . trim ( ) , 10 ) : dd . read _shift ( 4 ) ) ;
2017-03-28 04:41:01 +00:00
break ;
2021-08-11 02:53:38 +00:00
case 'N' :
s = s . replace ( /\u0000/g , "" ) . trim ( ) ;
// NOTE: dBASE II interprets " . " as 0
if ( s && s != "." ) out [ R ] [ C ] = + s || 0 ; break ;
case '@' :
// NOTE: dBASE specs appear to be incorrect
out [ R ] [ C ] = new Date ( dd . read _shift ( - 8 , 'f' ) - 0x388317533400 ) ;
break ;
2017-10-17 00:14:32 +00:00
case 'T' : out [ R ] [ C ] = new Date ( ( dd . read _shift ( 4 ) - 0x253D8C ) * 0x5265C00 + dd . read _shift ( 4 ) ) ; break ;
2022-03-10 05:31:13 +00:00
case 'Y' : out [ R ] [ C ] = dd . read _shift ( 4 , 'i' ) / 1e4 + ( dd . read _shift ( 4 , 'i' ) / 1e4 ) * Math . pow ( 2 , 32 ) ; break ;
2017-10-17 00:14:32 +00:00
case 'O' : out [ R ] [ C ] = - dd . read _shift ( - 8 , 'f' ) ; break ;
case 'B' : if ( vfp && fields [ C ] . len == 8 ) { out [ R ] [ C ] = dd . read _shift ( 8 , 'f' ) ; break ; }
/* falls through */
case 'G' : case 'P' : dd . l += fields [ C ] . len ; break ;
2017-03-28 04:41:01 +00:00
case '0' :
if ( fields [ C ] . name === '_NullFlags' ) break ;
/* falls through */
default : throw new Error ( "DBF Unsupported data type " + fields [ C ] . type ) ;
}
}
}
2017-04-03 00:16:03 +00:00
if ( ft != 0x02 ) if ( d . l < d . length && d [ d . l ++ ] != 0x1A ) throw new Error ( "DBF EOF Marker missing " + ( d . l - 1 ) + " of " + d . length + " " + d [ d . l - 1 ] . toString ( 16 ) ) ;
2018-04-06 06:39:48 +00:00
if ( opts && opts . sheetRows ) out = out . slice ( 0 , opts . sheetRows ) ;
2022-03-10 05:31:13 +00:00
opts . DBF = fields ;
2017-03-28 04:41:01 +00:00
return out ;
}
function dbf _to _sheet ( buf , opts ) /*:Worksheet*/ {
var o = opts || { } ;
if ( ! o . dateNF ) o . dateNF = "yyyymmdd" ;
2022-03-10 05:31:13 +00:00
var ws = aoa _to _sheet ( dbf _to _aoa ( buf , o ) , o ) ;
ws [ "!cols" ] = o . DBF . map ( function ( field ) { return {
wch : field . len ,
DBF : field
2022-03-12 14:05:57 +00:00
} ; } ) ;
2022-03-10 05:31:13 +00:00
delete o . DBF ;
return ws ;
2017-03-28 04:41:01 +00:00
}
function dbf _to _workbook ( buf , opts ) /*:Workbook*/ {
try { return sheet _to _workbook ( dbf _to _sheet ( buf , opts ) , opts ) ; }
catch ( e ) { if ( opts && opts . WTF ) throw e ; }
return ( { SheetNames : [ ] , Sheets : { } } ) ;
}
2017-10-27 16:25:54 +00:00
var _RLEN = { 'B' : 8 , 'C' : 250 , 'L' : 1 , 'D' : 8 , '?' : 0 , '' : 0 } ;
function sheet _to _dbf ( ws /*:Worksheet*/ , opts /*:WriteOpts*/ ) {
var o = opts || { } ;
2019-07-21 03:32:02 +00:00
if ( + o . codepage >= 0 ) set _cp ( + o . codepage ) ;
2017-10-27 16:25:54 +00:00
if ( o . type == "string" ) throw new Error ( "Cannot write DBF to JS string" ) ;
var ba = buf _array ( ) ;
2019-07-21 03:32:02 +00:00
var aoa /*:AOA*/ = sheet _to _json ( ws , { header : 1 , raw : true , cellDates : true } ) ;
2022-03-10 05:31:13 +00:00
var headers = aoa [ 0 ] , data = aoa . slice ( 1 ) , cols = ws [ "!cols" ] || [ ] ;
2017-10-27 16:25:54 +00:00
var i = 0 , j = 0 , hcnt = 0 , rlen = 1 ;
for ( i = 0 ; i < headers . length ; ++ i ) {
2022-03-10 05:31:13 +00:00
if ( ( ( cols [ i ] || { } ) . DBF || { } ) . name ) { headers [ i ] = cols [ i ] . DBF . name ; ++ hcnt ; continue ; }
if ( headers [ i ] == null ) continue ;
2017-10-27 16:25:54 +00:00
++ hcnt ;
2018-04-06 06:39:48 +00:00
if ( typeof headers [ i ] === 'number' ) headers [ i ] = headers [ i ] . toString ( 10 ) ;
if ( typeof headers [ i ] !== 'string' ) throw new Error ( "DBF Invalid column name " + headers [ i ] + " |" + ( typeof headers [ i ] ) + "|" ) ;
2017-10-27 16:25:54 +00:00
if ( headers . indexOf ( headers [ i ] ) !== i ) for ( j = 0 ; j < 1024 ; ++ j )
if ( headers . indexOf ( headers [ i ] + "_" + j ) == - 1 ) { headers [ i ] += "_" + j ; break ; }
}
var range = safe _decode _range ( ws [ '!ref' ] ) ;
2017-12-30 05:40:35 +00:00
var coltypes /*:Array<string>*/ = [ ] ;
2022-03-10 05:31:13 +00:00
var colwidths /*:Array<number>*/ = [ ] ;
var coldecimals /*:Array<number>*/ = [ ] ;
2017-10-27 16:25:54 +00:00
for ( i = 0 ; i <= range . e . c - range . s . c ; ++ i ) {
2022-03-10 05:31:13 +00:00
var guess = '' , _guess = '' , maxlen = 0 ;
2017-10-27 16:25:54 +00:00
var col /*:Array<any>*/ = [ ] ;
for ( j = 0 ; j < data . length ; ++ j ) {
if ( data [ j ] [ i ] != null ) col . push ( data [ j ] [ i ] ) ;
}
if ( col . length == 0 || headers [ i ] == null ) { coltypes [ i ] = '?' ; continue ; }
for ( j = 0 ; j < col . length ; ++ j ) {
switch ( typeof col [ j ] ) {
/* TODO: check if L2 compat is desired */
case 'number' : _guess = 'B' ; break ;
case 'string' : _guess = 'C' ; break ;
case 'boolean' : _guess = 'L' ; break ;
case 'object' : _guess = col [ j ] instanceof Date ? 'D' : 'C' ; break ;
default : _guess = 'C' ;
}
2022-03-10 05:31:13 +00:00
maxlen = Math . max ( maxlen , String ( col [ j ] ) . length ) ;
2017-10-27 16:25:54 +00:00
guess = guess && guess != _guess ? 'C' : _guess ;
2022-03-10 05:31:13 +00:00
//if(guess == 'C') break;
}
if ( maxlen > 250 ) maxlen = 250 ;
_guess = ( ( cols [ i ] || { } ) . DBF || { } ) . type ;
/* TODO: more fine grained control over DBF type resolution */
if ( _guess == 'C' ) {
if ( cols [ i ] . DBF . len > maxlen ) maxlen = cols [ i ] . DBF . len ;
}
if ( guess == 'B' && _guess == 'N' ) {
guess = 'N' ;
coldecimals [ i ] = cols [ i ] . DBF . dec ;
maxlen = cols [ i ] . DBF . len ;
2017-10-27 16:25:54 +00:00
}
2022-03-10 05:31:13 +00:00
colwidths [ i ] = guess == 'C' || _guess == 'N' ? maxlen : ( _RLEN [ guess ] || 0 ) ;
rlen += colwidths [ i ] ;
2017-10-27 16:25:54 +00:00
coltypes [ i ] = guess ;
}
var h = ba . next ( 32 ) ;
h . write _shift ( 4 , 0x13021130 ) ;
h . write _shift ( 4 , data . length ) ;
h . write _shift ( 2 , 296 + 32 * hcnt ) ;
h . write _shift ( 2 , rlen ) ;
for ( i = 0 ; i < 4 ; ++ i ) h . write _shift ( 4 , 0 ) ;
2019-11-01 03:09:14 +00:00
h . write _shift ( 4 , 0x00000000 | ( ( + dbf _reverse _map [ /*::String(*/ current _ansi /*::)*/ ] || 0x03 ) << 8 ) ) ;
2017-10-27 16:25:54 +00:00
for ( i = 0 , j = 0 ; i < headers . length ; ++ i ) {
if ( headers [ i ] == null ) continue ;
var hf = ba . next ( 32 ) ;
var _f = ( headers [ i ] . slice ( - 10 ) + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" ) . slice ( 0 , 11 ) ;
hf . write _shift ( 1 , _f , "sbcs" ) ;
hf . write _shift ( 1 , coltypes [ i ] == '?' ? 'C' : coltypes [ i ] , "sbcs" ) ;
hf . write _shift ( 4 , j ) ;
2022-03-10 05:31:13 +00:00
hf . write _shift ( 1 , colwidths [ i ] || _RLEN [ coltypes [ i ] ] || 0 ) ;
hf . write _shift ( 1 , coldecimals [ i ] || 0 ) ;
2017-10-27 16:25:54 +00:00
hf . write _shift ( 1 , 0x02 ) ;
hf . write _shift ( 4 , 0 ) ;
hf . write _shift ( 1 , 0 ) ;
hf . write _shift ( 4 , 0 ) ;
hf . write _shift ( 4 , 0 ) ;
2022-03-10 05:31:13 +00:00
j += ( colwidths [ i ] || _RLEN [ coltypes [ i ] ] || 0 ) ;
2017-10-27 16:25:54 +00:00
}
var hb = ba . next ( 264 ) ;
hb . write _shift ( 4 , 0x0000000D ) ;
for ( i = 0 ; i < 65 ; ++ i ) hb . write _shift ( 4 , 0x00000000 ) ;
for ( i = 0 ; i < data . length ; ++ i ) {
var rout = ba . next ( rlen ) ;
rout . write _shift ( 1 , 0 ) ;
for ( j = 0 ; j < headers . length ; ++ j ) {
if ( headers [ j ] == null ) continue ;
switch ( coltypes [ j ] ) {
case 'L' : rout . write _shift ( 1 , data [ i ] [ j ] == null ? 0x3F : data [ i ] [ j ] ? 0x54 : 0x46 ) ; break ;
case 'B' : rout . write _shift ( 8 , data [ i ] [ j ] || 0 , 'f' ) ; break ;
2022-03-10 05:31:13 +00:00
case 'N' :
var _n = "0" ;
if ( typeof data [ i ] [ j ] == "number" ) _n = data [ i ] [ j ] . toFixed ( coldecimals [ j ] || 0 ) ;
for ( hcnt = 0 ; hcnt < colwidths [ j ] - _n . length ; ++ hcnt ) rout . write _shift ( 1 , 0x20 ) ;
rout . write _shift ( 1 , _n , "sbcs" ) ;
break ;
2017-10-27 16:25:54 +00:00
case 'D' :
if ( ! data [ i ] [ j ] ) rout . write _shift ( 8 , "00000000" , "sbcs" ) ;
else {
rout . write _shift ( 4 , ( "0000" + data [ i ] [ j ] . getFullYear ( ) ) . slice ( - 4 ) , "sbcs" ) ;
rout . write _shift ( 2 , ( "00" + ( data [ i ] [ j ] . getMonth ( ) + 1 ) ) . slice ( - 2 ) , "sbcs" ) ;
rout . write _shift ( 2 , ( "00" + data [ i ] [ j ] . getDate ( ) ) . slice ( - 2 ) , "sbcs" ) ;
} break ;
case 'C' :
2022-03-10 05:31:13 +00:00
var _s = String ( data [ i ] [ j ] != null ? data [ i ] [ j ] : "" ) . slice ( 0 , colwidths [ j ] ) ;
2017-10-27 16:25:54 +00:00
rout . write _shift ( 1 , _s , "sbcs" ) ;
2022-03-10 05:31:13 +00:00
for ( hcnt = 0 ; hcnt < colwidths [ j ] - _s . length ; ++ hcnt ) rout . write _shift ( 1 , 0x20 ) ; break ;
2017-10-27 16:25:54 +00:00
}
}
// data
}
ba . next ( 1 ) . write _shift ( 1 , 0x1A ) ;
return ba . end ( ) ;
}
2017-03-28 04:41:01 +00:00
return {
to _workbook : dbf _to _workbook ,
2017-10-27 16:25:54 +00:00
to _sheet : dbf _to _sheet ,
from _sheet : sheet _to _dbf
2017-03-28 04:41:01 +00:00
} ;
} ) ( ) ;
2017-04-01 07:32:12 +00:00
2022-03-12 14:05:57 +00:00
var SYLK = /*#__PURE__*/ ( function ( ) {
2019-07-21 03:32:02 +00:00
/* TODO: stress test sequences */
2019-11-01 03:09:14 +00:00
var sylk _escapes = ( {
2019-07-21 03:32:02 +00:00
AA : 'À' , BA : 'Á' , CA : 'Â' , DA : 195 , HA : 'Ä' , JA : 197 ,
AE : 'È' , BE : 'É' , CE : 'Ê' , HE : 'Ë' ,
AI : 'Ì' , BI : 'Í' , CI : 'Î' , HI : 'Ï' ,
AO : 'Ò' , BO : 'Ó' , CO : 'Ô' , DO : 213 , HO : 'Ö' ,
AU : 'Ù' , BU : 'Ú' , CU : 'Û' , HU : 'Ü' ,
Aa : 'à' , Ba : 'á' , Ca : 'â' , Da : 227 , Ha : 'ä' , Ja : 229 ,
Ae : 'è' , Be : 'é' , Ce : 'ê' , He : 'ë' ,
Ai : 'ì' , Bi : 'í' , Ci : 'î' , Hi : 'ï' ,
Ao : 'ò' , Bo : 'ó' , Co : 'ô' , Do : 245 , Ho : 'ö' ,
Au : 'ù' , Bu : 'ú' , Cu : 'û' , Hu : 'ü' ,
KC : 'Ç' , Kc : 'ç' , q : 'æ' , z : 'œ' , a : 'Æ' , j : 'Œ' ,
DN : 209 , Dn : 241 , Hy : 255 ,
2021-10-13 07:20:25 +00:00
S : 169 , c : 170 , R : 174 , "B " : 180 ,
2019-11-01 03:09:14 +00:00
/*::[*/ 0 /*::]*/ : 176 , /*::[*/ 1 /*::]*/ : 177 , /*::[*/ 2 /*::]*/ : 178 ,
/*::[*/ 3 /*::]*/ : 179 , /*::[*/ 5 /*::]*/ : 181 , /*::[*/ 6 /*::]*/ : 182 ,
/*::[*/ 7 /*::]*/ : 183 , Q : 185 , k : 186 , b : 208 , i : 216 , l : 222 , s : 240 , y : 248 ,
2019-07-21 03:32:02 +00:00
"!" : 161 , '"' : 162 , "#" : 163 , "(" : 164 , "%" : 165 , "'" : 167 , "H " : 168 ,
"+" : 171 , ";" : 187 , "<" : 188 , "=" : 189 , ">" : 190 , "?" : 191 , "{" : 223
2019-11-01 03:09:14 +00:00
} /*:any*/ ) ;
2019-07-21 03:32:02 +00:00
var sylk _char _regex = new RegExp ( "\u001BN(" + keys ( sylk _escapes ) . join ( "|" ) . replace ( /\|\|\|/ , "|\\||" ) . replace ( /([?()+])/g , "\\$1" ) + "|\\|)" , "gm" ) ;
2019-08-03 22:37:04 +00:00
var sylk _char _fn = function ( _ , $1 ) { var o = sylk _escapes [ $1 ] ; return typeof o == "number" ? _getansi ( o ) : o ; } ;
var decode _sylk _char = function ( $$ , $1 , $2 ) { var newcc = ( ( $1 . charCodeAt ( 0 ) - 0x20 ) << 4 ) | ( $2 . charCodeAt ( 0 ) - 0x30 ) ; return newcc == 59 ? $$ : _getansi ( newcc ) ; } ;
2019-07-21 03:32:02 +00:00
sylk _escapes [ "|" ] = 254 ;
2022-05-09 06:49:17 +00:00
/* https://oss.sheetjs.com/notes/sylk/ for more details */
2017-05-13 18:21:22 +00:00
function sylk _to _aoa ( d /*:RawData*/ , opts ) /*:[AOA, Worksheet]*/ {
2017-04-01 07:32:12 +00:00
switch ( opts . type ) {
2022-03-22 20:08:08 +00:00
case 'base64' : return sylk _to _aoa _str ( Base64 _decode ( d ) , opts ) ;
2017-04-01 07:32:12 +00:00
case 'binary' : return sylk _to _aoa _str ( d , opts ) ;
2021-10-13 07:20:25 +00:00
case 'buffer' : return sylk _to _aoa _str ( has _buf && Buffer . isBuffer ( d ) ? d . toString ( 'binary' ) : a2s ( d ) , opts ) ;
2017-04-01 07:32:12 +00:00
case 'array' : return sylk _to _aoa _str ( cc2str ( d ) , opts ) ;
}
throw new Error ( "Unrecognized type " + opts . type ) ;
}
2017-05-13 18:21:22 +00:00
function sylk _to _aoa _str ( str /*:string*/ , opts ) /*:[AOA, Worksheet]*/ {
2017-12-30 05:40:35 +00:00
var records = str . split ( /[\n\r]+/ ) , R = - 1 , C = - 1 , ri = 0 , rj = 0 , arr /*:AOA*/ = [ ] ;
var formats /*:Array<string>*/ = [ ] ;
var next _cell _format /*:string|null*/ = null ;
var sht = { } , rowinfo /*:Array<RowInfo>*/ = [ ] , colinfo /*:Array<ColInfo>*/ = [ ] , cw /*:Array<string>*/ = [ ] ;
2017-04-28 07:28:03 +00:00
var Mval = 0 , j ;
2022-05-09 06:49:17 +00:00
var wb = { Workbook : { WBProps : { } , Names : [ ] } } ;
2019-07-21 03:32:02 +00:00
if ( + opts . codepage >= 0 ) set _cp ( + opts . codepage ) ;
2017-04-01 07:32:12 +00:00
for ( ; ri !== records . length ; ++ ri ) {
2017-04-28 07:28:03 +00:00
Mval = 0 ;
2019-08-03 22:37:04 +00:00
var rstr = records [ ri ] . trim ( ) . replace ( /\x1B([\x20-\x2F])([\x30-\x3F])/g , decode _sylk _char ) . replace ( sylk _char _regex , sylk _char _fn ) ;
2019-07-21 03:32:02 +00:00
var record = rstr . replace ( /;;/g , "\u0000" ) . split ( ";" ) . map ( function ( x ) { return x . replace ( /\u0000/g , ";" ) ; } ) ;
2017-05-11 07:29:59 +00:00
var RT = record [ 0 ] , val ;
2017-05-09 18:07:57 +00:00
if ( rstr . length > 0 ) switch ( RT ) {
case 'ID' : break ; /* header */
case 'E' : break ; /* EOF */
case 'B' : break ; /* dimensions */
2022-04-27 08:26:35 +00:00
case 'O' : /* workbook options */
for ( rj = 1 ; rj < record . length ; ++ rj ) switch ( record [ rj ] . charAt ( 0 ) ) {
case 'V' : {
var d1904 = parseInt ( record [ rj ] . slice ( 1 ) , 10 ) ;
// NOTE: it is technically an error if d1904 >= 5 or < 0
if ( d1904 >= 1 && d1904 <= 4 ) wb . Workbook . WBProps . date1904 = true ;
} break ;
} break ;
2022-05-09 06:49:17 +00:00
case 'W' : break ; /* window */
2017-05-09 18:07:57 +00:00
case 'P' :
2022-05-22 23:51:41 +00:00
switch ( record [ 1 ] . charAt ( 0 ) ) {
case 'P' : formats . push ( rstr . slice ( 3 ) . replace ( /;;/g , ";" ) ) ; break ;
} break ;
2022-05-09 06:49:17 +00:00
case 'NN' : { /* defined name */
var nn = { Sheet : 0 } ;
for ( rj = 1 ; rj < record . length ; ++ rj ) switch ( record [ rj ] . charAt ( 0 ) ) {
case 'N' : nn . Name = record [ rj ] . slice ( 1 ) ; break ;
case 'E' : nn . Ref = ( opts && opts . sheet || "Sheet1" ) + "!" + rc _to _a1 ( record [ rj ] . slice ( 1 ) ) ; break ;
}
wb . Workbook . Names . push ( nn ) ;
} break ;
case 'C' : /* cell */
2022-06-06 23:05:27 +00:00
var C _seen _K = false , C _seen _X = false , C _seen _S = false , C _seen _E = false , _R = - 1 , _C = - 1 , formula = "" , cell _t = "z" ;
2017-05-09 18:07:57 +00:00
for ( rj = 1 ; rj < record . length ; ++ rj ) switch ( record [ rj ] . charAt ( 0 ) ) {
2021-08-18 18:34:02 +00:00
case 'A' : break ; // TODO: comment
2022-04-27 08:26:35 +00:00
case 'X' : C = parseInt ( record [ rj ] . slice ( 1 ) , 10 ) - 1 ; C _seen _X = true ; break ;
2017-04-01 07:32:12 +00:00
case 'Y' :
2022-04-27 08:26:35 +00:00
R = parseInt ( record [ rj ] . slice ( 1 ) , 10 ) - 1 ; if ( ! C _seen _X ) C = 0 ;
2017-04-28 07:28:03 +00:00
for ( j = arr . length ; j <= R ; ++ j ) arr [ j ] = [ ] ;
2017-04-01 07:32:12 +00:00
break ;
case 'K' :
2018-01-11 08:01:25 +00:00
val = record [ rj ] . slice ( 1 ) ;
2022-06-06 23:05:27 +00:00
if ( val . charAt ( 0 ) === '"' ) { val = val . slice ( 1 , val . length - 1 ) ; cell _t = "s" ; }
else if ( val === 'TRUE' || val === 'FALSE' ) { val = val === 'TRUE' ; cell _t = "b" ; }
2017-08-09 22:38:23 +00:00
else if ( ! isNaN ( fuzzynum ( val ) ) ) {
2022-06-06 23:05:27 +00:00
val = fuzzynum ( val ) ; cell _t = "n" ;
if ( next _cell _format !== null && fmt _is _date ( next _cell _format ) && opts . cellDates ) { val = numdate ( wb . Workbook . WBProps . date1904 ? val + 1462 : val ) ; cell _t = "d" ; }
2017-05-17 04:23:36 +00:00
} else if ( ! isNaN ( fuzzydate ( val ) . getDate ( ) ) ) {
2022-06-06 23:05:27 +00:00
val = parseDate ( val ) ; cell _t = "d" ;
if ( ! opts . cellDates ) { cell _t = "n" ; val = datenum ( val , wb . Workbook . WBProps . date1904 ) ; }
2017-04-01 07:32:12 +00:00
}
2022-03-12 14:05:57 +00:00
if ( typeof $cptable !== 'undefined' && typeof val == "string" && ( ( opts || { } ) . type != "string" ) && ( opts || { } ) . codepage ) val = $cptable . utils . decode ( opts . codepage , val ) ;
2018-05-05 06:34:37 +00:00
C _seen _K = true ;
2017-04-01 07:32:12 +00:00
break ;
2017-05-09 18:07:57 +00:00
case 'E' :
2021-08-11 02:53:38 +00:00
C _seen _E = true ;
2022-06-06 23:05:27 +00:00
formula = rc _to _a1 ( record [ rj ] . slice ( 1 ) , { r : R , c : C } ) ;
2017-05-11 07:29:59 +00:00
break ;
2021-08-11 02:53:38 +00:00
case 'S' :
C _seen _S = true ;
break ;
case 'G' : break ; // unknown
2022-04-27 08:26:35 +00:00
case 'R' : _R = parseInt ( record [ rj ] . slice ( 1 ) , 10 ) - 1 ; break ;
case 'C' : _C = parseInt ( record [ rj ] . slice ( 1 ) , 10 ) - 1 ; break ;
2017-05-09 18:07:57 +00:00
default : if ( opts && opts . WTF ) throw new Error ( "SYLK bad record " + rstr ) ;
2018-05-05 06:34:37 +00:00
}
2021-08-11 02:53:38 +00:00
if ( C _seen _K ) {
2022-06-06 23:05:27 +00:00
if ( ! arr [ R ] [ C ] ) arr [ R ] [ C ] = { t : cell _t , v : val } ;
else { arr [ R ] [ C ] . t = cell _t ; arr [ R ] [ C ] . v = val ; }
if ( next _cell _format ) arr [ R ] [ C ] . z = next _cell _format ;
if ( opts . cellText !== false && next _cell _format ) arr [ R ] [ C ] . w = SSF _format ( arr [ R ] [ C ] . z , arr [ R ] [ C ] . v , { date1904 : wb . Workbook . WBProps . date1904 } ) ;
2021-08-11 02:53:38 +00:00
next _cell _format = null ;
}
if ( C _seen _S ) {
if ( C _seen _E ) throw new Error ( "SYLK shared formula cannot have own formula" ) ;
var shrbase = _R > - 1 && arr [ _R ] [ _C ] ;
if ( ! shrbase || ! shrbase [ 1 ] ) throw new Error ( "SYLK shared formula cannot find base" ) ;
2022-06-06 23:05:27 +00:00
formula = shift _formula _str ( shrbase [ 1 ] , { r : R - _R , c : C - _C } ) ;
}
if ( formula ) {
if ( ! arr [ R ] [ C ] ) arr [ R ] [ C ] = { t : 'n' , f : formula } ;
else arr [ R ] [ C ] . f = formula ;
2021-08-11 02:53:38 +00:00
}
2018-05-05 06:34:37 +00:00
break ;
2022-05-09 06:49:17 +00:00
case 'F' : /* Format */
2017-05-11 07:29:59 +00:00
var F _seen = 0 ;
2017-05-09 18:07:57 +00:00
for ( rj = 1 ; rj < record . length ; ++ rj ) switch ( record [ rj ] . charAt ( 0 ) ) {
2022-04-27 08:26:35 +00:00
case 'X' : C = parseInt ( record [ rj ] . slice ( 1 ) , 10 ) - 1 ; ++ F _seen ; break ;
2017-05-09 18:07:57 +00:00
case 'Y' :
2022-04-27 08:26:35 +00:00
R = parseInt ( record [ rj ] . slice ( 1 ) , 10 ) - 1 ; /*C = 0;*/
2017-05-09 18:07:57 +00:00
for ( j = arr . length ; j <= R ; ++ j ) arr [ j ] = [ ] ;
2017-05-17 04:23:36 +00:00
break ;
2022-04-27 08:26:35 +00:00
case 'M' : Mval = parseInt ( record [ rj ] . slice ( 1 ) , 10 ) / 20 ; break ;
2017-05-09 18:07:57 +00:00
case 'F' : break ; /* ??? */
2018-05-05 06:34:37 +00:00
case 'G' : break ; /* hide grid */
2017-04-01 07:32:12 +00:00
case 'P' :
2022-04-27 08:26:35 +00:00
next _cell _format = formats [ parseInt ( record [ rj ] . slice ( 1 ) , 10 ) ] ;
2017-04-28 07:28:03 +00:00
break ;
2017-05-09 18:07:57 +00:00
case 'S' : break ; /* cell style */
case 'D' : break ; /* column */
case 'N' : break ; /* font */
2017-04-28 07:28:03 +00:00
case 'W' :
2018-01-11 08:01:25 +00:00
cw = record [ rj ] . slice ( 1 ) . split ( " " ) ;
2017-04-28 07:28:03 +00:00
for ( j = parseInt ( cw [ 0 ] , 10 ) ; j <= parseInt ( cw [ 1 ] , 10 ) ; ++ j ) {
Mval = parseInt ( cw [ 2 ] , 10 ) ;
2022-05-22 23:51:41 +00:00
colinfo [ j - 1 ] = Mval === 0 ? { hidden : true } : { wch : Mval } ;
2017-04-28 07:28:03 +00:00
} break ;
2017-05-11 07:29:59 +00:00
case 'C' : /* default column format */
2022-04-27 08:26:35 +00:00
C = parseInt ( record [ rj ] . slice ( 1 ) , 10 ) - 1 ;
2017-05-11 07:29:59 +00:00
if ( ! colinfo [ C ] ) colinfo [ C ] = { } ;
break ;
case 'R' : /* row properties */
2022-04-27 08:26:35 +00:00
R = parseInt ( record [ rj ] . slice ( 1 ) , 10 ) - 1 ;
2017-05-11 07:29:59 +00:00
if ( ! rowinfo [ R ] ) rowinfo [ R ] = { } ;
2017-04-28 07:28:03 +00:00
if ( Mval > 0 ) { rowinfo [ R ] . hpt = Mval ; rowinfo [ R ] . hpx = pt2px ( Mval ) ; }
2017-10-17 00:14:32 +00:00
else if ( Mval === 0 ) rowinfo [ R ] . hidden = true ;
2017-05-09 18:07:57 +00:00
break ;
default : if ( opts && opts . WTF ) throw new Error ( "SYLK bad record " + rstr ) ;
2017-05-11 07:29:59 +00:00
}
2017-05-17 04:23:36 +00:00
if ( F _seen < 1 ) next _cell _format = null ; break ;
2017-05-09 18:07:57 +00:00
default : if ( opts && opts . WTF ) throw new Error ( "SYLK bad record " + rstr ) ;
2017-04-01 07:32:12 +00:00
}
}
2017-04-28 07:28:03 +00:00
if ( rowinfo . length > 0 ) sht [ '!rows' ] = rowinfo ;
if ( colinfo . length > 0 ) sht [ '!cols' ] = colinfo ;
2022-05-22 23:51:41 +00:00
colinfo . forEach ( function ( col ) { process _col ( col ) ; } ) ;
2018-04-06 06:39:48 +00:00
if ( opts && opts . sheetRows ) arr = arr . slice ( 0 , opts . sheetRows ) ;
2022-04-27 08:26:35 +00:00
return [ arr , sht , wb ] ;
2017-04-01 07:32:12 +00:00
}
2022-04-27 08:26:35 +00:00
function sylk _to _workbook ( d /*:RawData*/ , opts ) /*:Workbook*/ {
2017-07-05 22:27:54 +00:00
var aoasht = sylk _to _aoa ( d , opts ) ;
2022-04-27 08:26:35 +00:00
var aoa = aoasht [ 0 ] , ws = aoasht [ 1 ] , wb = aoasht [ 2 ] ;
2022-06-06 23:05:27 +00:00
var _opts = dup ( opts ) ; _opts . date1904 = ( ( ( wb || { } ) . Workbook || { } ) . WBProps || { } ) . date1904 ;
var o = aoa _to _sheet ( aoa , _opts ) ;
2017-04-28 07:28:03 +00:00
keys ( ws ) . forEach ( function ( k ) { o [ k ] = ws [ k ] ; } ) ;
2022-04-27 08:26:35 +00:00
var outwb = sheet _to _workbook ( o , opts ) ;
keys ( wb ) . forEach ( function ( k ) { outwb [ k ] = wb [ k ] ; } ) ;
return outwb ;
2017-04-28 07:28:03 +00:00
}
2017-04-01 07:32:12 +00:00
2018-01-23 09:07:51 +00:00
function write _ws _cell _sylk ( cell /*:Cell*/ , ws /*:Worksheet*/ , R /*:number*/ , C /*:number*/ /*::, opts*/ ) /*:string*/ {
2017-04-01 07:32:12 +00:00
var o = "C;Y" + ( R + 1 ) + ";X" + ( C + 1 ) + ";K" ;
switch ( cell . t ) {
2017-04-30 16:27:03 +00:00
case 'n' :
o += ( cell . v || 0 ) ;
if ( cell . f && ! cell . F ) o += ";E" + a1 _to _rc ( cell . f , { r : R , c : C } ) ; break ;
2017-04-01 07:32:12 +00:00
case 'b' : o += cell . v ? "TRUE" : "FALSE" ; break ;
case 'e' : o += cell . w || cell . v ; break ;
case 'd' : o += '"' + ( cell . w || cell . v ) + '"' ; break ;
2022-02-14 01:28:13 +00:00
case 's' : o += '"' + cell . v . replace ( /"/g , "" ) . replace ( /;/g , ";;" ) + '"' ; break ;
2017-04-01 07:32:12 +00:00
}
return o ;
}
2017-04-28 07:28:03 +00:00
function write _ws _cols _sylk ( out , cols ) {
cols . forEach ( function ( col , i ) {
var rec = "F;W" + ( i + 1 ) + " " + ( i + 1 ) + " " ;
if ( col . hidden ) rec += "0" ;
else {
2021-10-13 07:20:25 +00:00
if ( typeof col . width == 'number' && ! col . wpx ) col . wpx = width2px ( col . width ) ;
if ( typeof col . wpx == 'number' && ! col . wch ) col . wch = px2char ( col . wpx ) ;
2017-04-28 07:28:03 +00:00
if ( typeof col . wch == 'number' ) rec += Math . round ( col . wch ) ;
}
if ( rec . charAt ( rec . length - 1 ) != " " ) out . push ( rec ) ;
} ) ;
}
2017-05-09 18:07:57 +00:00
function write _ws _rows _sylk ( out /*:Array<string>*/ , rows /*:Array<RowInfo>*/ ) {
2017-04-28 07:28:03 +00:00
rows . forEach ( function ( row , i ) {
var rec = "F;" ;
if ( row . hidden ) rec += "M0;" ;
else if ( row . hpt ) rec += "M" + 20 * row . hpt + ";" ;
else if ( row . hpx ) rec += "M" + 20 * px2pt ( row . hpx ) + ";" ;
if ( rec . length > 2 ) out . push ( rec + "R" + ( i + 1 ) ) ;
} ) ;
}
2022-06-06 23:05:27 +00:00
function sheet _to _sylk ( ws /*:Worksheet*/ , opts /*:?any*/ , wb /*:?WorkBook*/ ) /*:string*/ {
2022-04-27 08:26:35 +00:00
var preamble /*:Array<string>*/ = [ "ID;PSheetJS;N;E" ] , o /*:Array<string>*/ = [ ] ;
2017-09-30 06:18:11 +00:00
var r = safe _decode _range ( ws [ '!ref' ] ) , cell /*:Cell*/ ;
2017-04-08 06:55:35 +00:00
var dense = Array . isArray ( ws ) ;
2017-04-28 07:28:03 +00:00
var RS = "\r\n" ;
2022-06-06 23:05:27 +00:00
var d1904 = ( ( ( wb || { } ) . Workbook || { } ) . WBProps || { } ) . date1904 ;
2017-04-28 07:28:03 +00:00
preamble . push ( "P;PGeneral" ) ;
preamble . push ( "F;P0;DG0G8;M255" ) ;
if ( ws [ '!cols' ] ) write _ws _cols _sylk ( preamble , ws [ '!cols' ] ) ;
if ( ws [ '!rows' ] ) write _ws _rows _sylk ( preamble , ws [ '!rows' ] ) ;
2017-05-09 18:07:57 +00:00
preamble . push ( "B;Y" + ( r . e . r - r . s . r + 1 ) + ";X" + ( r . e . c - r . s . c + 1 ) + ";D" + [ r . s . c , r . s . r , r . e . c , r . e . r ] . join ( " " ) ) ;
2022-06-06 23:05:27 +00:00
preamble . push ( "O;L;D;B" + ( d1904 ? ";V4" : "" ) + ";K47;G100 0.001" ) ;
2017-04-01 07:32:12 +00:00
for ( var R = r . s . r ; R <= r . e . r ; ++ R ) {
for ( var C = r . s . c ; C <= r . e . c ; ++ C ) {
var coord = encode _cell ( { r : R , c : C } ) ;
2017-04-08 06:55:35 +00:00
cell = dense ? ( ws [ R ] || [ ] ) [ C ] : ws [ coord ] ;
2018-02-08 18:21:39 +00:00
if ( ! cell || ( cell . v == null && ( ! cell . f || cell . F ) ) ) continue ;
2022-06-06 23:05:27 +00:00
o . push ( write _ws _cell _sylk ( cell , ws , R , C , opts ) ) ; // TODO: pass date1904 info
2017-04-01 07:32:12 +00:00
}
}
return preamble . join ( RS ) + RS + o . join ( RS ) + RS + "E" + RS ;
}
return {
to _workbook : sylk _to _workbook ,
from _sheet : sheet _to _sylk
} ;
} ) ( ) ;
2022-03-12 14:05:57 +00:00
var DIF = /*#__PURE__*/ ( function ( ) {
2017-04-01 07:32:12 +00:00
function dif _to _aoa ( d /*:RawData*/ , opts ) /*:AOA*/ {
switch ( opts . type ) {
2022-03-22 20:08:08 +00:00
case 'base64' : return dif _to _aoa _str ( Base64 _decode ( d ) , opts ) ;
2017-04-01 07:32:12 +00:00
case 'binary' : return dif _to _aoa _str ( d , opts ) ;
2021-10-13 07:20:25 +00:00
case 'buffer' : return dif _to _aoa _str ( has _buf && Buffer . isBuffer ( d ) ? d . toString ( 'binary' ) : a2s ( d ) , opts ) ;
2017-04-01 07:32:12 +00:00
case 'array' : return dif _to _aoa _str ( cc2str ( d ) , opts ) ;
}
throw new Error ( "Unrecognized type " + opts . type ) ;
}
2018-04-06 06:39:48 +00:00
function dif _to _aoa _str ( str /*:string*/ , opts ) /*:AOA*/ {
2017-12-30 05:40:35 +00:00
var records = str . split ( '\n' ) , R = - 1 , C = - 1 , ri = 0 , arr /*:AOA*/ = [ ] ;
2017-04-01 07:32:12 +00:00
for ( ; ri !== records . length ; ++ ri ) {
if ( records [ ri ] . trim ( ) === 'BOT' ) { arr [ ++ R ] = [ ] ; C = 0 ; continue ; }
if ( R < 0 ) continue ;
var metadata = records [ ri ] . trim ( ) . split ( "," ) ;
var type = metadata [ 0 ] , value = metadata [ 1 ] ;
++ ri ;
2021-10-13 07:20:25 +00:00
var data = records [ ri ] || "" ;
while ( ( ( data . match ( /["]/g ) || [ ] ) . length & 1 ) && ri < records . length - 1 ) data += "\n" + records [ ++ ri ] ;
data = data . trim ( ) ;
2017-04-01 07:32:12 +00:00
switch ( + type ) {
case - 1 :
if ( data === 'BOT' ) { arr [ ++ R ] = [ ] ; C = 0 ; continue ; }
else if ( data !== 'EOD' ) throw new Error ( "Unrecognized DIF special command " + data ) ;
break ;
case 0 :
if ( data === 'TRUE' ) arr [ R ] [ C ] = true ;
else if ( data === 'FALSE' ) arr [ R ] [ C ] = false ;
2017-08-09 22:38:23 +00:00
else if ( ! isNaN ( fuzzynum ( value ) ) ) arr [ R ] [ C ] = fuzzynum ( value ) ;
2017-05-11 07:29:59 +00:00
else if ( ! isNaN ( fuzzydate ( value ) . getDate ( ) ) ) arr [ R ] [ C ] = parseDate ( value ) ;
2017-04-01 07:32:12 +00:00
else arr [ R ] [ C ] = value ;
++ C ; break ;
case 1 :
2018-01-11 08:01:25 +00:00
data = data . slice ( 1 , data . length - 1 ) ;
2021-10-13 07:20:25 +00:00
data = data . replace ( /""/g , '"' ) ;
if ( DIF _XL && data && data . match ( /^=".*"$/ ) ) data = data . slice ( 2 , - 1 ) ;
2017-04-01 07:32:12 +00:00
arr [ R ] [ C ++ ] = data !== '' ? data : null ;
break ;
}
if ( data === 'EOD' ) break ;
}
2018-04-06 06:39:48 +00:00
if ( opts && opts . sheetRows ) arr = arr . slice ( 0 , opts . sheetRows ) ;
2017-04-01 07:32:12 +00:00
return arr ;
}
function dif _to _sheet ( str /*:string*/ , opts ) /*:Worksheet*/ { return aoa _to _sheet ( dif _to _aoa ( str , opts ) , opts ) ; }
function dif _to _workbook ( str /*:string*/ , opts ) /*:Workbook*/ { return sheet _to _workbook ( dif _to _sheet ( str , opts ) , opts ) ; }
2022-03-12 14:05:57 +00:00
var sheet _to _dif = /*#__PURE__*/ ( function ( ) {
2017-04-01 07:32:12 +00:00
var push _field = function pf ( o /*:Array<string>*/ , topic /*:string*/ , v /*:number*/ , n /*:number*/ , s /*:string*/ ) {
o . push ( topic ) ;
o . push ( v + "," + n ) ;
o . push ( '"' + s . replace ( /"/g , '""' ) + '"' ) ;
} ;
2017-05-13 18:21:22 +00:00
var push _value = function po ( o /*:Array<string>*/ , type /*:number*/ , v /*:any*/ , s /*:string*/ ) {
2017-04-01 07:32:12 +00:00
o . push ( type + "," + v ) ;
o . push ( type == 1 ? '"' + s . replace ( /"/g , '""' ) + '"' : s ) ;
} ;
2018-01-23 09:07:51 +00:00
return function sheet _to _dif ( ws /*:Worksheet*/ /*::, opts:?any*/ ) /*:string*/ {
2017-04-01 07:32:12 +00:00
var o /*:Array<string>*/ = [ ] ;
2017-09-30 06:18:11 +00:00
var r = safe _decode _range ( ws [ '!ref' ] ) , cell /*:Cell*/ ;
2017-04-08 06:55:35 +00:00
var dense = Array . isArray ( ws ) ;
2017-04-01 07:32:12 +00:00
push _field ( o , "TABLE" , 0 , 1 , "sheetjs" ) ;
push _field ( o , "VECTORS" , 0 , r . e . r - r . s . r + 1 , "" ) ;
push _field ( o , "TUPLES" , 0 , r . e . c - r . s . c + 1 , "" ) ;
push _field ( o , "DATA" , 0 , 0 , "" ) ;
for ( var R = r . s . r ; R <= r . e . r ; ++ R ) {
push _value ( o , - 1 , 0 , "BOT" ) ;
for ( var C = r . s . c ; C <= r . e . c ; ++ C ) {
var coord = encode _cell ( { r : R , c : C } ) ;
2017-04-08 06:55:35 +00:00
cell = dense ? ( ws [ R ] || [ ] ) [ C ] : ws [ coord ] ;
2017-04-30 16:27:03 +00:00
if ( ! cell ) { push _value ( o , 1 , 0 , "" ) ; continue ; }
2017-04-01 07:32:12 +00:00
switch ( cell . t ) {
2017-04-30 16:27:03 +00:00
case 'n' :
var val = DIF _XL ? cell . w : cell . v ;
if ( ! val && cell . v != null ) val = cell . v ;
if ( val == null ) {
if ( DIF _XL && cell . f && ! cell . F ) push _value ( o , 1 , 0 , "=" + cell . f ) ;
else push _value ( o , 1 , 0 , "" ) ;
}
else push _value ( o , 0 , val , "V" ) ;
break ;
case 'b' :
push _value ( o , 0 , cell . v ? 1 : 0 , cell . v ? "TRUE" : "FALSE" ) ;
break ;
case 's' :
push _value ( o , 1 , 0 , ( ! DIF _XL || isNaN ( cell . v ) ) ? cell . v : '="' + cell . v + '"' ) ;
break ;
case 'd' :
2022-03-20 05:29:24 +00:00
if ( ! cell . w ) cell . w = SSF _format ( cell . z || table _fmt [ 14 ] , datenum ( parseDate ( cell . v ) ) ) ;
2017-04-30 16:27:03 +00:00
if ( DIF _XL ) push _value ( o , 0 , cell . w , "V" ) ;
else push _value ( o , 1 , 0 , cell . w ) ;
break ;
2017-04-01 07:32:12 +00:00
default : push _value ( o , 1 , 0 , "" ) ;
}
}
}
push _value ( o , - 1 , 0 , "EOD" ) ;
var RS = "\r\n" ;
var oo = o . join ( RS ) ;
//while((oo.length & 0x7F) != 0) oo += "\0";
return oo ;
} ;
} ) ( ) ;
return {
to _workbook : dif _to _workbook ,
to _sheet : dif _to _sheet ,
from _sheet : sheet _to _dif
} ;
} ) ( ) ;
2017-04-02 06:47:25 +00:00
2022-03-12 14:05:57 +00:00
var ETH = /*#__PURE__*/ ( function ( ) {
2017-12-04 04:41:41 +00:00
function decode ( s /*:string*/ ) /*:string*/ { return s . replace ( /\\b/g , "\\" ) . replace ( /\\c/g , ":" ) . replace ( /\\n/g , "\n" ) ; }
function encode ( s /*:string*/ ) /*:string*/ { return s . replace ( /\\/g , "\\b" ) . replace ( /:/g , "\\c" ) . replace ( /\n/g , "\\n" ) ; }
2018-04-06 06:39:48 +00:00
function eth _to _aoa ( str /*:string*/ , opts ) /*:AOA*/ {
2017-12-30 05:40:35 +00:00
var records = str . split ( '\n' ) , R = - 1 , C = - 1 , ri = 0 , arr /*:AOA*/ = [ ] ;
2017-12-04 04:41:41 +00:00
for ( ; ri !== records . length ; ++ ri ) {
var record = records [ ri ] . trim ( ) . split ( ":" ) ;
if ( record [ 0 ] !== 'cell' ) continue ;
var addr = decode _cell ( record [ 1 ] ) ;
if ( arr . length <= addr . r ) for ( R = arr . length ; R <= addr . r ; ++ R ) if ( ! arr [ R ] ) arr [ R ] = [ ] ;
R = addr . r ; C = addr . c ;
switch ( record [ 2 ] ) {
case 't' : arr [ R ] [ C ] = decode ( record [ 3 ] ) ; break ;
case 'v' : arr [ R ] [ C ] = + record [ 3 ] ; break ;
case 'vtf' : var _f = record [ record . length - 1 ] ;
/* falls through */
case 'vtc' :
switch ( record [ 3 ] ) {
case 'nl' : arr [ R ] [ C ] = + record [ 4 ] ? true : false ; break ;
default : arr [ R ] [ C ] = + record [ 4 ] ; break ;
}
if ( record [ 2 ] == 'vtf' ) arr [ R ] [ C ] = [ arr [ R ] [ C ] , _f ] ;
}
}
2018-04-06 06:39:48 +00:00
if ( opts && opts . sheetRows ) arr = arr . slice ( 0 , opts . sheetRows ) ;
2017-12-04 04:41:41 +00:00
return arr ;
}
function eth _to _sheet ( d /*:string*/ , opts ) /*:Worksheet*/ { return aoa _to _sheet ( eth _to _aoa ( d , opts ) , opts ) ; }
function eth _to _workbook ( d /*:string*/ , opts ) /*:Workbook*/ { return sheet _to _workbook ( eth _to _sheet ( d , opts ) , opts ) ; }
var header = [
"socialcalc:version:1.5" ,
"MIME-Version: 1.0" ,
"Content-Type: multipart/mixed; boundary=SocialCalcSpreadsheetControlSave"
] . join ( "\n" ) ;
var sep = [
"--SocialCalcSpreadsheetControlSave" ,
"Content-type: text/plain; charset=UTF-8"
] . join ( "\n" ) + "\n" ;
/* TODO: the other parts */
var meta = [
"# SocialCalc Spreadsheet Control Save" ,
"part:sheet"
] . join ( "\n" ) ;
var end = "--SocialCalcSpreadsheetControlSave--" ;
function sheet _to _eth _data ( ws /*:Worksheet*/ ) /*:string*/ {
if ( ! ws || ! ws [ '!ref' ] ) return "" ;
2017-12-30 05:40:35 +00:00
var o /*:Array<string>*/ = [ ] , oo /*:Array<string>*/ = [ ] , cell , coord = "" ;
2017-12-04 04:41:41 +00:00
var r = decode _range ( ws [ '!ref' ] ) ;
var dense = Array . isArray ( ws ) ;
for ( var R = r . s . r ; R <= r . e . r ; ++ R ) {
for ( var C = r . s . c ; C <= r . e . c ; ++ C ) {
coord = encode _cell ( { r : R , c : C } ) ;
cell = dense ? ( ws [ R ] || [ ] ) [ C ] : ws [ coord ] ;
if ( ! cell || cell . v == null || cell . t === 'z' ) continue ;
oo = [ "cell" , coord , 't' ] ;
switch ( cell . t ) {
case 's' : case 'str' : oo . push ( encode ( cell . v ) ) ; break ;
case 'n' :
if ( ! cell . f ) { oo [ 2 ] = 'v' ; oo [ 3 ] = cell . v ; }
else { oo [ 2 ] = 'vtf' ; oo [ 3 ] = 'n' ; oo [ 4 ] = cell . v ; oo [ 5 ] = encode ( cell . f ) ; }
break ;
case 'b' :
2017-12-30 05:40:35 +00:00
oo [ 2 ] = 'vt' + ( cell . f ? 'f' : 'c' ) ; oo [ 3 ] = 'nl' ; oo [ 4 ] = cell . v ? "1" : "0" ;
2017-12-04 04:41:41 +00:00
oo [ 5 ] = encode ( cell . f || ( cell . v ? 'TRUE' : 'FALSE' ) ) ;
break ;
case 'd' :
var t = datenum ( parseDate ( cell . v ) ) ;
2017-12-30 05:40:35 +00:00
oo [ 2 ] = 'vtc' ; oo [ 3 ] = 'nd' ; oo [ 4 ] = "" + t ;
2022-03-20 05:29:24 +00:00
oo [ 5 ] = cell . w || SSF _format ( cell . z || table _fmt [ 14 ] , t ) ;
2017-12-04 04:41:41 +00:00
break ;
case 'e' : continue ;
}
o . push ( oo . join ( ":" ) ) ;
}
}
o . push ( "sheet:c:" + ( r . e . c - r . s . c + 1 ) + ":r:" + ( r . e . r - r . s . r + 1 ) + ":tvf:1" ) ;
o . push ( "valueformat:1:text-wiki" ) ;
//o.push("copiedfrom:" + ws['!ref']); // clipboard only
return o . join ( "\n" ) ;
}
2018-01-23 09:07:51 +00:00
function sheet _to _eth ( ws /*:Worksheet*/ /*::, opts:?any*/ ) /*:string*/ {
2017-12-04 04:41:41 +00:00
return [ header , sep , meta , sep , sheet _to _eth _data ( ws ) , end ] . join ( "\n" ) ;
// return ["version:1.5", sheet_to_eth_data(ws)].join("\n"); // clipboard form
}
return {
to _workbook : eth _to _workbook ,
to _sheet : eth _to _sheet ,
from _sheet : sheet _to _eth
} ;
} ) ( ) ;
2022-03-12 14:05:57 +00:00
var PRN = /*#__PURE__*/ ( function ( ) {
2017-07-26 08:35:28 +00:00
function set _text _arr ( data /*:string*/ , arr /*:AOA*/ , R /*:number*/ , C /*:number*/ , o /*:any*/ ) {
if ( o . raw ) arr [ R ] [ C ] = data ;
2021-08-11 02:53:38 +00:00
else if ( data === "" ) { /* empty */ }
2017-07-26 08:35:28 +00:00
else if ( data === 'TRUE' ) arr [ R ] [ C ] = true ;
2017-04-02 06:47:25 +00:00
else if ( data === 'FALSE' ) arr [ R ] [ C ] = false ;
2017-08-09 22:38:23 +00:00
else if ( ! isNaN ( fuzzynum ( data ) ) ) arr [ R ] [ C ] = fuzzynum ( data ) ;
2017-05-17 04:23:36 +00:00
else if ( ! isNaN ( fuzzydate ( data ) . getDate ( ) ) ) arr [ R ] [ C ] = parseDate ( data ) ;
2017-04-03 00:16:03 +00:00
else arr [ R ] [ C ] = data ;
2017-04-02 06:47:25 +00:00
}
function prn _to _aoa _str ( f /*:string*/ , opts ) /*:AOA*/ {
2017-07-26 08:35:28 +00:00
var o = opts || { } ;
2017-04-02 06:47:25 +00:00
var arr /*:AOA*/ = ( [ ] /*:any*/ ) ;
if ( ! f || f . length === 0 ) return arr ;
var lines = f . split ( /[\r\n]/ ) ;
var L = lines . length - 1 ;
while ( L >= 0 && lines [ L ] . length === 0 ) -- L ;
var start = 10 , idx = 0 ;
var R = 0 ;
for ( ; R <= L ; ++ R ) {
idx = lines [ R ] . indexOf ( " " ) ;
if ( idx == - 1 ) idx = lines [ R ] . length ; else idx ++ ;
start = Math . max ( start , idx ) ;
}
for ( R = 0 ; R <= L ; ++ R ) {
arr [ R ] = [ ] ;
/* TODO: confirm that widths are always 10 */
var C = 0 ;
2017-07-26 08:35:28 +00:00
set _text _arr ( lines [ R ] . slice ( 0 , start ) . trim ( ) , arr , R , C , o ) ;
2017-04-02 06:47:25 +00:00
for ( C = 1 ; C <= ( lines [ R ] . length - start ) / 10 + 1 ; ++ C )
2017-07-26 08:35:28 +00:00
set _text _arr ( lines [ R ] . slice ( start + ( C - 1 ) * 10 , start + C * 10 ) . trim ( ) , arr , R , C , o ) ;
2017-04-02 06:47:25 +00:00
}
2018-04-06 06:39:48 +00:00
if ( o . sheetRows ) arr = arr . slice ( 0 , o . sheetRows ) ;
2017-04-02 06:47:25 +00:00
return arr ;
}
2017-10-16 11:47:13 +00:00
// List of accepted CSV separators
var guess _seps = {
2017-10-17 00:14:32 +00:00
/*::[*/ 0x2C /*::]*/ : ',' ,
/*::[*/ 0x09 /*::]*/ : "\t" ,
2021-10-13 07:20:25 +00:00
/*::[*/ 0x3B /*::]*/ : ';' ,
/*::[*/ 0x7C /*::]*/ : '|'
2017-10-16 11:47:13 +00:00
} ;
// CSV separator weights to be used in case of equal numbers
var guess _sep _weights = {
2017-10-17 00:14:32 +00:00
/*::[*/ 0x2C /*::]*/ : 3 ,
/*::[*/ 0x09 /*::]*/ : 2 ,
2021-10-13 07:20:25 +00:00
/*::[*/ 0x3B /*::]*/ : 1 ,
/*::[*/ 0x7C /*::]*/ : 0
2017-10-16 11:47:13 +00:00
} ;
2017-08-18 18:10:18 +00:00
function guess _sep ( str ) {
2017-10-16 11:47:13 +00:00
var cnt = { } , instr = false , end = 0 , cc = 0 ;
2017-08-18 18:10:18 +00:00
for ( ; end < str . length ; ++ end ) {
if ( ( cc = str . charCodeAt ( end ) ) == 0x22 ) instr = ! instr ;
2017-10-16 11:47:13 +00:00
else if ( ! instr && cc in guess _seps ) cnt [ cc ] = ( cnt [ cc ] || 0 ) + 1 ;
}
cc = [ ] ;
2020-03-15 07:42:05 +00:00
for ( end in cnt ) if ( Object . prototype . hasOwnProperty . call ( cnt , end ) ) {
2017-10-16 11:47:13 +00:00
cc . push ( [ cnt [ end ] , end ] ) ;
2017-08-18 18:10:18 +00:00
}
2017-10-16 11:47:13 +00:00
if ( ! cc . length ) {
cnt = guess _sep _weights ;
2020-03-15 07:42:05 +00:00
for ( end in cnt ) if ( Object . prototype . hasOwnProperty . call ( cnt , end ) ) {
2017-10-16 11:47:13 +00:00
cc . push ( [ cnt [ end ] , end ] ) ;
}
}
cc . sort ( function ( a , b ) { return a [ 0 ] - b [ 0 ] || guess _sep _weights [ a [ 1 ] ] - guess _sep _weights [ b [ 1 ] ] ; } ) ;
2021-10-13 07:20:25 +00:00
return guess _seps [ cc . pop ( ) [ 1 ] ] || 0x2C ;
2017-08-18 18:10:18 +00:00
}
2017-04-03 06:02:02 +00:00
function dsv _to _sheet _str ( str /*:string*/ , opts ) /*:Worksheet*/ {
2017-04-08 06:55:35 +00:00
var o = opts || { } ;
2017-04-03 06:02:02 +00:00
var sep = "" ;
2017-04-09 04:03:19 +00:00
if ( DENSE != null && o . dense == null ) o . dense = DENSE ;
2017-04-08 06:55:35 +00:00
var ws /*:Worksheet*/ = o . dense ? ( [ ] /*:any*/ ) : ( { } /*:any*/ ) ;
2017-04-03 06:02:02 +00:00
var range /*:Range*/ = ( { s : { c : 0 , r : 0 } , e : { c : 0 , r : 0 } } /*:any*/ ) ;
2020-06-12 20:05:05 +00:00
if ( str . slice ( 0 , 4 ) == "sep=" ) {
// If the line ends in \r\n
if ( str . charCodeAt ( 5 ) == 13 && str . charCodeAt ( 6 ) == 10 ) {
sep = str . charAt ( 4 ) ; str = str . slice ( 7 ) ;
}
// If line ends in \r OR \n
else if ( str . charCodeAt ( 5 ) == 13 || str . charCodeAt ( 5 ) == 10 ) {
sep = str . charAt ( 4 ) ; str = str . slice ( 6 ) ;
}
2021-08-18 18:34:02 +00:00
else sep = guess _sep ( str . slice ( 0 , 1024 ) ) ;
2020-06-12 20:05:05 +00:00
}
2021-11-14 04:38:00 +00:00
else if ( o && o . FS ) sep = o . FS ;
2018-01-11 08:01:25 +00:00
else sep = guess _sep ( str . slice ( 0 , 1024 ) ) ;
2017-04-03 06:02:02 +00:00
var R = 0 , C = 0 , v = 0 ;
2021-09-16 01:50:33 +00:00
var start = 0 , end = 0 , sepcc = sep . charCodeAt ( 0 ) , instr = false , cc = 0 , startcc = str . charCodeAt ( 0 ) ;
2017-06-01 21:22:11 +00:00
var _re /*:?RegExp*/ = o . dateNF != null ? dateNF _regex ( o . dateNF ) : null ;
2017-05-09 18:07:57 +00:00
function finish _cell ( ) {
2022-04-25 09:02:14 +00:00
var s = str . slice ( start , end ) ; if ( s . slice ( - 1 ) == "\r" ) s = s . slice ( 0 , - 1 ) ;
2017-04-04 16:09:41 +00:00
var cell = ( { } /*:any*/ ) ;
2017-08-18 18:10:18 +00:00
if ( s . charAt ( 0 ) == '"' && s . charAt ( s . length - 1 ) == '"' ) s = s . slice ( 1 , - 1 ) . replace ( /""/g , '"' ) ;
2017-10-17 00:14:32 +00:00
if ( s . length === 0 ) cell . t = 'z' ;
2017-08-18 18:10:18 +00:00
else if ( o . raw ) { cell . t = 's' ; cell . v = s ; }
2017-10-17 00:14:32 +00:00
else if ( s . trim ( ) . length === 0 ) { cell . t = 's' ; cell . v = s ; }
2017-08-18 18:10:18 +00:00
else if ( s . charCodeAt ( 0 ) == 0x3D ) {
if ( s . charCodeAt ( 1 ) == 0x22 && s . charCodeAt ( s . length - 1 ) == 0x22 ) { cell . t = 's' ; cell . v = s . slice ( 2 , - 1 ) . replace ( /""/g , '"' ) ; }
2018-01-11 08:01:25 +00:00
else if ( fuzzyfmla ( s ) ) { cell . t = 'n' ; cell . f = s . slice ( 1 ) ; }
2017-08-18 18:10:18 +00:00
else { cell . t = 's' ; cell . v = s ; } }
2017-04-03 06:02:02 +00:00
else if ( s == "TRUE" ) { cell . t = 'b' ; cell . v = true ; }
else if ( s == "FALSE" ) { cell . t = 'b' ; cell . v = false ; }
2017-08-18 18:10:18 +00:00
else if ( ! isNaN ( v = fuzzynum ( s ) ) ) { cell . t = 'n' ; if ( o . cellText !== false ) cell . w = s ; cell . v = v ; }
2017-06-01 21:22:11 +00:00
else if ( ! isNaN ( fuzzydate ( s ) . getDate ( ) ) || _re && s . match ( _re ) ) {
2022-03-20 05:29:24 +00:00
cell . z = o . dateNF || table _fmt [ 14 ] ;
2017-06-01 21:22:11 +00:00
var k = 0 ;
if ( _re && s . match ( _re ) ) { s = dateNF _fix ( s , o . dateNF , ( s . match ( _re ) || [ ] ) ) ; k = 1 ; }
if ( o . cellDates ) { cell . t = 'd' ; cell . v = parseDate ( s , k ) ; }
else { cell . t = 'n' ; cell . v = datenum ( parseDate ( s , k ) ) ; }
2022-03-20 05:29:24 +00:00
if ( o . cellText !== false ) cell . w = SSF _format ( cell . z , cell . v instanceof Date ? datenum ( cell . v ) : cell . v ) ;
2017-08-18 18:10:18 +00:00
if ( ! o . cellNF ) delete cell . z ;
2017-05-13 18:21:22 +00:00
} else {
2017-05-09 18:07:57 +00:00
cell . t = 's' ;
cell . v = s ;
}
2017-08-18 18:10:18 +00:00
if ( cell . t == 'z' ) { }
else if ( o . dense ) { if ( ! ws [ R ] ) ws [ R ] = [ ] ; ws [ R ] [ C ] = cell ; }
2017-04-08 06:55:35 +00:00
else ws [ encode _cell ( { c : C , r : R } ) ] = cell ;
2021-09-16 01:50:33 +00:00
start = end + 1 ; startcc = str . charCodeAt ( start ) ;
2017-04-03 06:02:02 +00:00
if ( range . e . c < C ) range . e . c = C ;
if ( range . e . r < R ) range . e . r = R ;
2018-04-06 06:39:48 +00:00
if ( cc == sepcc ) ++ C ; else { C = 0 ; ++ R ; if ( o . sheetRows && o . sheetRows <= R ) return true ; }
2017-05-09 18:07:57 +00:00
}
2018-04-06 06:39:48 +00:00
outer : for ( ; end < str . length ; ++ end ) switch ( ( cc = str . charCodeAt ( end ) ) ) {
2021-09-16 01:50:33 +00:00
case 0x22 : if ( startcc === 0x22 ) instr = ! instr ; break ;
2022-04-25 09:02:14 +00:00
case 0x0d :
if ( instr ) break ;
if ( str . charCodeAt ( end + 1 ) == 0x0a ) ++ end ;
/* falls through */
case sepcc : case 0x0a : if ( ! instr && finish _cell ( ) ) break outer ; break ;
2017-04-03 06:02:02 +00:00
default : break ;
}
2017-05-09 18:07:57 +00:00
if ( end - start > 0 ) finish _cell ( ) ;
2017-04-03 06:02:02 +00:00
ws [ '!ref' ] = encode _range ( range ) ;
return ws ;
}
function prn _to _sheet _str ( str /*:string*/ , opts ) /*:Worksheet*/ {
2020-06-04 04:11:31 +00:00
if ( ! ( opts && opts . PRN ) ) return dsv _to _sheet _str ( str , opts ) ;
2021-11-14 04:38:00 +00:00
if ( opts . FS ) return dsv _to _sheet _str ( str , opts ) ;
2017-12-04 04:41:41 +00:00
if ( str . slice ( 0 , 4 ) == "sep=" ) return dsv _to _sheet _str ( str , opts ) ;
2017-11-15 18:14:02 +00:00
if ( str . indexOf ( "\t" ) >= 0 || str . indexOf ( "," ) >= 0 || str . indexOf ( ";" ) >= 0 ) return dsv _to _sheet _str ( str , opts ) ;
2017-04-03 06:02:02 +00:00
return aoa _to _sheet ( prn _to _aoa _str ( str , opts ) , opts ) ;
}
function prn _to _sheet ( d /*:RawData*/ , opts ) /*:Worksheet*/ {
2017-09-30 06:18:11 +00:00
var str = "" , bytes = opts . type == 'string' ? [ 0 , 0 , 0 , 0 ] : firstbyte ( d , opts ) ;
2017-04-03 06:02:02 +00:00
switch ( opts . type ) {
2022-03-22 20:08:08 +00:00
case 'base64' : str = Base64 _decode ( d ) ; break ;
2017-05-11 07:29:59 +00:00
case 'binary' : str = d ; break ;
2018-08-15 19:22:47 +00:00
case 'buffer' :
2021-10-13 07:20:25 +00:00
if ( opts . codepage == 65001 ) str = d . toString ( 'utf8' ) ; // TODO: test if buf
2022-03-12 14:05:57 +00:00
else if ( opts . codepage && typeof $cptable !== 'undefined' ) str = $cptable . utils . decode ( opts . codepage , d ) ;
2021-10-13 07:20:25 +00:00
else str = has _buf && Buffer . isBuffer ( d ) ? d . toString ( 'binary' ) : a2s ( d ) ;
2018-08-15 19:22:47 +00:00
break ;
2017-05-11 07:29:59 +00:00
case 'array' : str = cc2str ( d ) ; break ;
2017-09-30 06:18:11 +00:00
case 'string' : str = d ; break ;
2017-05-11 07:29:59 +00:00
default : throw new Error ( "Unrecognized type " + opts . type ) ;
2017-04-03 06:02:02 +00:00
}
2017-08-18 18:10:18 +00:00
if ( bytes [ 0 ] == 0xEF && bytes [ 1 ] == 0xBB && bytes [ 2 ] == 0xBF ) str = utf8read ( str . slice ( 3 ) ) ;
2022-02-10 12:40:50 +00:00
else if ( opts . type != 'string' && opts . type != 'buffer' && opts . codepage == 65001 ) str = utf8read ( str ) ;
2022-03-12 14:05:57 +00:00
else if ( ( opts . type == 'binary' ) && typeof $cptable !== 'undefined' && opts . codepage ) str = $cptable . utils . decode ( opts . codepage , $cptable . utils . encode ( 28591 , str ) ) ;
2017-12-04 04:41:41 +00:00
if ( str . slice ( 0 , 19 ) == "socialcalc:version:" ) return ETH . to _sheet ( opts . type == 'string' ? str : utf8read ( str ) , opts ) ;
2017-05-11 07:29:59 +00:00
return prn _to _sheet _str ( str , opts ) ;
2017-04-03 06:02:02 +00:00
}
2017-04-02 06:47:25 +00:00
2017-07-05 22:27:54 +00:00
function prn _to _workbook ( d /*:RawData*/ , opts ) /*:Workbook*/ { return sheet _to _workbook ( prn _to _sheet ( d , opts ) , opts ) ; }
2017-04-02 06:47:25 +00:00
2018-01-23 09:07:51 +00:00
function sheet _to _prn ( ws /*:Worksheet*/ /*::, opts:?any*/ ) /*:string*/ {
2017-04-03 00:16:03 +00:00
var o /*:Array<string>*/ = [ ] ;
2017-09-30 06:18:11 +00:00
var r = safe _decode _range ( ws [ '!ref' ] ) , cell /*:Cell*/ ;
2017-04-08 06:55:35 +00:00
var dense = Array . isArray ( ws ) ;
2017-04-03 00:16:03 +00:00
for ( var R = r . s . r ; R <= r . e . r ; ++ R ) {
2017-12-30 05:40:35 +00:00
var oo /*:Array<string>*/ = [ ] ;
2017-04-03 00:16:03 +00:00
for ( var C = r . s . c ; C <= r . e . c ; ++ C ) {
var coord = encode _cell ( { r : R , c : C } ) ;
2017-04-08 06:55:35 +00:00
cell = dense ? ( ws [ R ] || [ ] ) [ C ] : ws [ coord ] ;
if ( ! cell || cell . v == null ) { oo . push ( " " ) ; continue ; }
2018-01-11 08:01:25 +00:00
var w = ( cell . w || ( format _cell ( cell ) , cell . w ) || "" ) . slice ( 0 , 10 ) ;
2017-04-03 00:16:03 +00:00
while ( w . length < 10 ) w += " " ;
2017-10-17 00:14:32 +00:00
oo . push ( w + ( C === 0 ? " " : "" ) ) ;
2017-04-03 00:16:03 +00:00
}
o . push ( oo . join ( "" ) ) ;
}
return o . join ( "\n" ) ;
}
2017-04-02 06:47:25 +00:00
return {
to _workbook : prn _to _workbook ,
2017-04-03 00:16:03 +00:00
to _sheet : prn _to _sheet ,
from _sheet : sheet _to _prn
2017-04-02 06:47:25 +00:00
} ;
} ) ( ) ;
2017-05-11 18:23:21 +00:00
/* Excel defaults to SYLK but warns if data is not valid */
function read _wb _ID ( d , opts ) {
var o = opts || { } , OLD _WTF = ! ! o . WTF ; o . WTF = true ;
try {
var out = SYLK . to _workbook ( d , o ) ;
o . WTF = OLD _WTF ;
return out ;
} catch ( e ) {
o . WTF = OLD _WTF ;
if ( ! e . message . match ( /SYLK bad record ID/ ) && OLD _WTF ) throw e ;
return PRN . to _workbook ( d , opts ) ;
}
}
2019-07-21 03:32:02 +00:00
2022-03-12 14:05:57 +00:00
var WK _ = /*#__PURE__*/ ( function ( ) {
2017-04-04 16:09:41 +00:00
function lotushopper ( data , cb /*:RecordHopperCB*/ , opts /*:any*/ ) {
if ( ! data ) return ;
prep _blob ( data , data . l || 0 ) ;
var Enum = opts . Enum || WK1Enum ;
while ( data . l < data . length ) {
var RT = data . read _shift ( 2 ) ;
2021-11-14 04:38:00 +00:00
var R = Enum [ RT ] || Enum [ 0xFFFF ] ;
2017-04-04 16:09:41 +00:00
var length = data . read _shift ( 2 ) ;
var tgt = data . l + length ;
2021-11-14 04:38:00 +00:00
var d = R . f && R . f ( data , length , opts ) ;
2017-04-04 16:09:41 +00:00
data . l = tgt ;
2021-11-14 04:38:00 +00:00
if ( cb ( d , R , RT ) ) return ;
2017-04-04 16:09:41 +00:00
}
}
function lotus _to _workbook ( d /*:RawData*/ , opts ) {
switch ( opts . type ) {
2022-03-22 20:08:08 +00:00
case 'base64' : return lotus _to _workbook _buf ( s2a ( Base64 _decode ( d ) ) , opts ) ;
2017-04-04 16:09:41 +00:00
case 'binary' : return lotus _to _workbook _buf ( s2a ( d ) , opts ) ;
case 'buffer' :
case 'array' : return lotus _to _workbook _buf ( d , opts ) ;
}
throw "Unsupported type " + opts . type ;
}
2018-04-06 06:39:48 +00:00
function lotus _to _workbook _buf ( d , opts ) /*:Workbook*/ {
2017-04-04 16:09:41 +00:00
if ( ! d ) return d ;
var o = opts || { } ;
2017-04-09 04:03:19 +00:00
if ( DENSE != null && o . dense == null ) o . dense = DENSE ;
2022-01-10 18:45:50 +00:00
var s /*:Worksheet*/ = ( ( o . dense ? [ ] : { } ) /*:any*/ ) , n = "Sheet1" , next _n = "" , sidx = 0 ;
var sheets = { } , snames = [ ] , realnames = [ ] ;
2017-04-04 16:09:41 +00:00
var refguess = { s : { r : 0 , c : 0 } , e : { r : 0 , c : 0 } } ;
2018-04-06 06:39:48 +00:00
var sheetRows = o . sheetRows || 0 ;
2017-04-04 16:09:41 +00:00
2022-04-25 09:02:14 +00:00
if ( d [ 4 ] == 0x51 && d [ 5 ] == 0x50 && d [ 6 ] == 0x57 ) return qpw _to _workbook _buf ( d , opts ) ;
2022-01-10 18:45:50 +00:00
if ( d [ 2 ] == 0x00 ) {
if ( d [ 3 ] == 0x08 || d [ 3 ] == 0x09 ) {
if ( d . length >= 16 && d [ 14 ] == 0x05 && d [ 15 ] === 0x6c ) throw new Error ( "Unsupported Works 3 for Mac file" ) ;
}
}
2021-11-14 04:38:00 +00:00
if ( d [ 2 ] == 0x02 ) {
o . Enum = WK1Enum ;
lotushopper ( d , function ( val , R , RT ) { switch ( RT ) {
case 0x00 : /* BOF */
2017-04-04 16:09:41 +00:00
o . vers = val ;
if ( val >= 0x1000 ) o . qpro = true ;
break ;
2022-04-25 09:02:14 +00:00
case 0xFF : /* BOF (works 3+) */
o . vers = val ;
o . works = true ;
break ;
2017-04-04 16:09:41 +00:00
case 0x06 : refguess = val ; break ; /* RANGE */
2022-01-10 18:45:50 +00:00
case 0xCC : if ( val ) next _n = val ; break ; /* SHEETNAMECS */
case 0xDE : next _n = val ; break ; /* SHEETNAMELP */
2017-04-04 16:09:41 +00:00
case 0x0F : /* LABEL */
2021-11-14 04:38:00 +00:00
case 0x33 : /* STRING */
2022-04-25 09:02:14 +00:00
if ( ( ! o . qpro && ! o . works || RT == 0x33 ) && val [ 1 ] . v . charCodeAt ( 0 ) < 0x30 ) val [ 1 ] . v = val [ 1 ] . v . slice ( 1 ) ;
if ( o . works || o . works2 ) val [ 1 ] . v = val [ 1 ] . v . replace ( /\r\n/g , "\n" ) ;
2017-04-04 16:09:41 +00:00
/* falls through */
case 0x0D : /* INTEGER */
case 0x0E : /* NUMBER */
case 0x10 : /* FORMULA */
2017-05-17 04:23:36 +00:00
/* TODO: actual translation of the format code */
if ( RT == 0x0E && ( val [ 2 ] & 0x70 ) == 0x70 && ( val [ 2 ] & 0x0F ) > 1 && ( val [ 2 ] & 0x0F ) < 15 ) {
2022-03-20 05:29:24 +00:00
val [ 1 ] . z = o . dateNF || table _fmt [ 14 ] ;
2017-05-17 04:23:36 +00:00
if ( o . cellDates ) { val [ 1 ] . t = 'd' ; val [ 1 ] . v = numdate ( val [ 1 ] . v ) ; }
}
2022-01-10 18:45:50 +00:00
if ( o . qpro ) {
if ( val [ 3 ] > sidx ) {
s [ "!ref" ] = encode _range ( refguess ) ;
sheets [ n ] = s ;
snames . push ( n ) ;
s = ( o . dense ? [ ] : { } ) ;
refguess = { s : { r : 0 , c : 0 } , e : { r : 0 , c : 0 } } ;
sidx = val [ 3 ] ; n = next _n || "Sheet" + ( sidx + 1 ) ; next _n = "" ;
}
}
2021-11-14 04:38:00 +00:00
var tmpcell = o . dense ? ( s [ val [ 0 ] . r ] || [ ] ) [ val [ 0 ] . c ] : s [ encode _cell ( val [ 0 ] ) ] ;
if ( tmpcell ) {
tmpcell . t = val [ 1 ] . t ; tmpcell . v = val [ 1 ] . v ;
if ( val [ 1 ] . z != null ) tmpcell . z = val [ 1 ] . z ;
if ( val [ 1 ] . f != null ) tmpcell . f = val [ 1 ] . f ;
break ;
}
2017-04-08 06:55:35 +00:00
if ( o . dense ) {
if ( ! s [ val [ 0 ] . r ] ) s [ val [ 0 ] . r ] = [ ] ;
s [ val [ 0 ] . r ] [ val [ 0 ] . c ] = val [ 1 ] ;
} else s [ encode _cell ( val [ 0 ] ) ] = val [ 1 ] ;
2017-04-04 16:09:41 +00:00
break ;
2022-04-25 09:02:14 +00:00
case 0x5405 : o . works2 = true ; break ;
2021-11-14 04:38:00 +00:00
default :
} } , o ) ;
} else if ( d [ 2 ] == 0x1A || d [ 2 ] == 0x0E ) {
o . Enum = WK3Enum ;
if ( d [ 2 ] == 0x0E ) { o . qpro = true ; d . l = 0 ; }
lotushopper ( d , function ( val , R , RT ) { switch ( RT ) {
2022-01-10 18:45:50 +00:00
case 0xCC : n = val ; break ; /* SHEETNAMECS */
2017-04-04 16:09:41 +00:00
case 0x16 : /* LABEL16 */
2022-04-25 09:02:14 +00:00
if ( val [ 1 ] . v . charCodeAt ( 0 ) < 0x30 ) val [ 1 ] . v = val [ 1 ] . v . slice ( 1 ) ;
// TODO: R9 appears to encode control codes this way -- verify against other versions
val [ 1 ] . v = val [ 1 ] . v . replace ( /\x0F./g , function ( $$ ) { return String . fromCharCode ( $$ . charCodeAt ( 1 ) - 0x20 ) ; } ) . replace ( /\r\n/g , "\n" ) ;
2017-04-04 16:09:41 +00:00
/* falls through */
case 0x17 : /* NUMBER17 */
case 0x18 : /* NUMBER18 */
case 0x19 : /* FORMULA19 */
case 0x25 : /* NUMBER25 */
case 0x27 : /* NUMBER27 */
case 0x28 : /* FORMULA28 */
if ( val [ 3 ] > sidx ) {
s [ "!ref" ] = encode _range ( refguess ) ;
sheets [ n ] = s ;
2022-01-10 18:45:50 +00:00
snames . push ( n ) ;
2017-04-08 06:55:35 +00:00
s = ( o . dense ? [ ] : { } ) ;
2017-04-04 16:09:41 +00:00
refguess = { s : { r : 0 , c : 0 } , e : { r : 0 , c : 0 } } ;
sidx = val [ 3 ] ; n = "Sheet" + ( sidx + 1 ) ;
}
2018-04-06 06:39:48 +00:00
if ( sheetRows > 0 && val [ 0 ] . r >= sheetRows ) break ;
2017-11-20 01:51:14 +00:00
if ( o . dense ) {
if ( ! s [ val [ 0 ] . r ] ) s [ val [ 0 ] . r ] = [ ] ;
s [ val [ 0 ] . r ] [ val [ 0 ] . c ] = val [ 1 ] ;
} else s [ encode _cell ( val [ 0 ] ) ] = val [ 1 ] ;
2017-04-04 16:09:41 +00:00
if ( refguess . e . c < val [ 0 ] . c ) refguess . e . c = val [ 0 ] . c ;
if ( refguess . e . r < val [ 0 ] . r ) refguess . e . r = val [ 0 ] . r ;
break ;
2021-11-14 04:38:00 +00:00
case 0x1B : /* XFORMAT */
if ( val [ 0x36b0 ] ) realnames [ val [ 0x36b0 ] [ 0 ] ] = val [ 0x36b0 ] [ 1 ] ;
break ;
2022-01-10 18:45:50 +00:00
case 0x0601 : /* SHEETINFOQP */
realnames [ val [ 0 ] ] = val [ 1 ] ; if ( val [ 0 ] == sidx ) n = val [ 1 ] ; break ;
2017-04-04 16:09:41 +00:00
default : break ;
2021-11-14 04:38:00 +00:00
} } , o ) ;
} else throw new Error ( "Unrecognized LOTUS BOF " + d [ 2 ] ) ;
2017-04-04 16:09:41 +00:00
s [ "!ref" ] = encode _range ( refguess ) ;
2022-01-10 18:45:50 +00:00
sheets [ next _n || n ] = s ;
snames . push ( next _n || n ) ;
2021-11-14 04:38:00 +00:00
if ( ! realnames . length ) return { SheetNames : snames , Sheets : sheets } ;
var osheets = { } , rnames = [ ] ;
2022-01-10 18:45:50 +00:00
/* TODO: verify no collisions */
2021-11-14 04:38:00 +00:00
for ( var i = 0 ; i < realnames . length ; ++ i ) if ( sheets [ snames [ i ] ] ) {
2022-01-10 18:45:50 +00:00
rnames . push ( realnames [ i ] || snames [ i ] ) ;
osheets [ realnames [ i ] ] = sheets [ realnames [ i ] ] || sheets [ snames [ i ] ] ;
} else {
2021-11-14 04:38:00 +00:00
rnames . push ( realnames [ i ] ) ;
2022-01-10 18:45:50 +00:00
osheets [ realnames [ i ] ] = ( { "!ref" : "A1" } ) ;
2021-11-14 04:38:00 +00:00
}
return { SheetNames : rnames , Sheets : osheets } ;
}
function sheet _to _wk1 ( ws /*:Worksheet*/ , opts /*:WriteOpts*/ ) {
var o = opts || { } ;
if ( + o . codepage >= 0 ) set _cp ( + o . codepage ) ;
if ( o . type == "string" ) throw new Error ( "Cannot write WK1 to JS string" ) ;
var ba = buf _array ( ) ;
var range = safe _decode _range ( ws [ "!ref" ] ) ;
var dense = Array . isArray ( ws ) ;
var cols = [ ] ;
write _biff _rec ( ba , 0x00 , write _BOF _WK1 ( 0x0406 ) ) ;
write _biff _rec ( ba , 0x06 , write _RANGE ( range ) ) ;
2022-01-10 18:45:50 +00:00
var max _R = Math . min ( range . e . r , 8191 ) ;
for ( var R = range . s . r ; R <= max _R ; ++ R ) {
2021-11-14 04:38:00 +00:00
var rr = encode _row ( R ) ;
for ( var C = range . s . c ; C <= range . e . c ; ++ C ) {
if ( R === range . s . r ) cols [ C ] = encode _col ( C ) ;
var ref = cols [ C ] + rr ;
var cell = dense ? ( ws [ R ] || [ ] ) [ C ] : ws [ ref ] ;
if ( ! cell || cell . t == "z" ) continue ;
/* TODO: formula records */
if ( cell . t == "n" ) {
if ( ( cell . v | 0 ) == cell . v && cell . v >= - 32768 && cell . v <= 32767 ) write _biff _rec ( ba , 0x0d , write _INTEGER ( R , C , cell . v ) ) ;
else write _biff _rec ( ba , 0x0e , write _NUMBER ( R , C , cell . v ) ) ;
} else {
var str = format _cell ( cell ) ;
write _biff _rec ( ba , 0x0F , write _LABEL ( R , C , str . slice ( 0 , 239 ) ) ) ;
}
}
}
write _biff _rec ( ba , 0x01 ) ;
return ba . end ( ) ;
}
function book _to _wk3 ( wb /*:Workbook*/ , opts /*:WriteOpts*/ ) {
var o = opts || { } ;
if ( + o . codepage >= 0 ) set _cp ( + o . codepage ) ;
if ( o . type == "string" ) throw new Error ( "Cannot write WK3 to JS string" ) ;
var ba = buf _array ( ) ;
write _biff _rec ( ba , 0x00 , write _BOF _WK3 ( wb ) ) ;
for ( var i = 0 , cnt = 0 ; i < wb . SheetNames . length ; ++ i ) if ( ( wb . Sheets [ wb . SheetNames [ i ] ] || { } ) [ "!ref" ] ) write _biff _rec ( ba , 0x1b , write _XFORMAT _SHEETNAME ( wb . SheetNames [ i ] , cnt ++ ) ) ;
var wsidx = 0 ;
for ( i = 0 ; i < wb . SheetNames . length ; ++ i ) {
var ws = wb . Sheets [ wb . SheetNames [ i ] ] ;
if ( ! ws || ! ws [ "!ref" ] ) continue ;
var range = safe _decode _range ( ws [ "!ref" ] ) ;
var dense = Array . isArray ( ws ) ;
var cols = [ ] ;
2022-01-10 18:45:50 +00:00
var max _R = Math . min ( range . e . r , 8191 ) ;
for ( var R = range . s . r ; R <= max _R ; ++ R ) {
2021-11-14 04:38:00 +00:00
var rr = encode _row ( R ) ;
for ( var C = range . s . c ; C <= range . e . c ; ++ C ) {
if ( R === range . s . r ) cols [ C ] = encode _col ( C ) ;
var ref = cols [ C ] + rr ;
var cell = dense ? ( ws [ R ] || [ ] ) [ C ] : ws [ ref ] ;
if ( ! cell || cell . t == "z" ) continue ;
/* TODO: FORMULA19 NUMBER18 records */
if ( cell . t == "n" ) {
write _biff _rec ( ba , 0x17 , write _NUMBER _17 ( R , C , wsidx , cell . v ) ) ;
} else {
var str = format _cell ( cell ) ;
/* TODO: max len? */
write _biff _rec ( ba , 0x16 , write _LABEL _16 ( R , C , wsidx , str . slice ( 0 , 239 ) ) ) ;
}
}
}
++ wsidx ;
}
write _biff _rec ( ba , 0x01 ) ;
return ba . end ( ) ;
}
function write _BOF _WK1 ( v /*:number*/ ) {
var out = new _buf ( 2 ) ;
out . write _shift ( 2 , v ) ;
return out ;
}
function write _BOF _WK3 ( wb /*:Workbook*/ ) {
var out = new _buf ( 26 ) ;
out . write _shift ( 2 , 0x1000 ) ;
out . write _shift ( 2 , 0x0004 ) ;
out . write _shift ( 4 , 0x0000 ) ;
var rows = 0 , cols = 0 , wscnt = 0 ;
for ( var i = 0 ; i < wb . SheetNames . length ; ++ i ) {
var name = wb . SheetNames [ i ] ;
var ws = wb . Sheets [ name ] ;
if ( ! ws || ! ws [ "!ref" ] ) continue ;
++ wscnt ;
var range = decode _range ( ws [ "!ref" ] ) ;
if ( rows < range . e . r ) rows = range . e . r ;
if ( cols < range . e . c ) cols = range . e . c ;
}
2022-01-10 18:45:50 +00:00
if ( rows > 8191 ) rows = 8191 ;
2021-11-14 04:38:00 +00:00
out . write _shift ( 2 , rows ) ;
out . write _shift ( 1 , wscnt ) ;
out . write _shift ( 1 , cols ) ;
out . write _shift ( 2 , 0x00 ) ;
out . write _shift ( 2 , 0x00 ) ;
out . write _shift ( 1 , 0x01 ) ;
out . write _shift ( 1 , 0x02 ) ;
out . write _shift ( 4 , 0 ) ;
out . write _shift ( 4 , 0 ) ;
return out ;
2017-04-04 16:09:41 +00:00
}
2022-01-10 18:45:50 +00:00
function parse _RANGE ( blob , length , opts ) {
2017-04-04 16:09:41 +00:00
var o = { s : { c : 0 , r : 0 } , e : { c : 0 , r : 0 } } ;
2022-01-10 18:45:50 +00:00
if ( length == 8 && opts . qpro ) {
o . s . c = blob . read _shift ( 1 ) ;
blob . l ++ ;
o . s . r = blob . read _shift ( 2 ) ;
o . e . c = blob . read _shift ( 1 ) ;
blob . l ++ ;
o . e . r = blob . read _shift ( 2 ) ;
return o ;
}
2017-04-04 16:09:41 +00:00
o . s . c = blob . read _shift ( 2 ) ;
o . s . r = blob . read _shift ( 2 ) ;
2022-01-10 18:45:50 +00:00
if ( length == 12 && opts . qpro ) blob . l += 2 ;
2017-04-04 16:09:41 +00:00
o . e . c = blob . read _shift ( 2 ) ;
o . e . r = blob . read _shift ( 2 ) ;
2022-01-10 18:45:50 +00:00
if ( length == 12 && opts . qpro ) blob . l += 2 ;
2017-04-04 16:09:41 +00:00
if ( o . s . c == 0xFFFF ) o . s . c = o . e . c = o . s . r = o . e . r = 0 ;
return o ;
}
2021-11-14 04:38:00 +00:00
function write _RANGE ( range ) {
var out = new _buf ( 8 ) ;
out . write _shift ( 2 , range . s . c ) ;
out . write _shift ( 2 , range . s . r ) ;
out . write _shift ( 2 , range . e . c ) ;
out . write _shift ( 2 , range . e . r ) ;
return out ;
}
2017-04-04 16:09:41 +00:00
function parse _cell ( blob , length , opts ) {
2022-01-10 18:45:50 +00:00
var o = [ { c : 0 , r : 0 } , { t : 'n' , v : 0 } , 0 , 0 ] ;
2017-04-04 16:09:41 +00:00
if ( opts . qpro && opts . vers != 0x5120 ) {
o [ 0 ] . c = blob . read _shift ( 1 ) ;
2022-01-10 18:45:50 +00:00
o [ 3 ] = blob . read _shift ( 1 ) ;
2017-04-04 16:09:41 +00:00
o [ 0 ] . r = blob . read _shift ( 2 ) ;
blob . l += 2 ;
2022-04-25 09:02:14 +00:00
} else if ( opts . works ) { // TODO: verify with more complex works3-4 examples
o [ 0 ] . c = blob . read _shift ( 2 ) ; o [ 0 ] . r = blob . read _shift ( 2 ) ;
o [ 2 ] = blob . read _shift ( 2 ) ;
2017-04-04 16:09:41 +00:00
} else {
o [ 2 ] = blob . read _shift ( 1 ) ;
o [ 0 ] . c = blob . read _shift ( 2 ) ; o [ 0 ] . r = blob . read _shift ( 2 ) ;
}
return o ;
}
function parse _LABEL ( blob , length , opts ) {
var tgt = blob . l + length ;
var o = parse _cell ( blob , length , opts ) ;
o [ 1 ] . t = 's' ;
if ( opts . vers == 0x5120 ) {
blob . l ++ ;
var len = blob . read _shift ( 1 ) ;
o [ 1 ] . v = blob . read _shift ( len , 'utf8' ) ;
return o ;
}
if ( opts . qpro ) blob . l ++ ;
o [ 1 ] . v = blob . read _shift ( tgt - blob . l , 'cstr' ) ;
return o ;
}
2021-11-14 04:38:00 +00:00
function write _LABEL ( R , C , s ) {
/* TODO: encoding */
var o = new _buf ( 7 + s . length ) ;
o . write _shift ( 1 , 0xFF ) ;
o . write _shift ( 2 , C ) ;
o . write _shift ( 2 , R ) ;
o . write _shift ( 1 , 0x27 ) ; // ??
for ( var i = 0 ; i < o . length ; ++ i ) {
var cc = s . charCodeAt ( i ) ;
o . write _shift ( 1 , cc >= 0x80 ? 0x5F : cc ) ;
}
o . write _shift ( 1 , 0 ) ;
return o ;
}
2022-04-25 09:02:14 +00:00
function parse _STRING ( blob , length , opts ) {
var tgt = blob . l + length ;
var o = parse _cell ( blob , length , opts ) ;
o [ 1 ] . t = 's' ;
if ( opts . vers == 0x5120 ) {
var len = blob . read _shift ( 1 ) ;
o [ 1 ] . v = blob . read _shift ( len , 'utf8' ) ;
return o ;
}
o [ 1 ] . v = blob . read _shift ( tgt - blob . l , 'cstr' ) ;
return o ;
}
2017-04-04 16:09:41 +00:00
function parse _INTEGER ( blob , length , opts ) {
var o = parse _cell ( blob , length , opts ) ;
o [ 1 ] . v = blob . read _shift ( 2 , 'i' ) ;
return o ;
}
2021-11-14 04:38:00 +00:00
function write _INTEGER ( R , C , v ) {
var o = new _buf ( 7 ) ;
o . write _shift ( 1 , 0xFF ) ;
o . write _shift ( 2 , C ) ;
o . write _shift ( 2 , R ) ;
o . write _shift ( 2 , v , 'i' ) ;
return o ;
}
2017-04-04 16:09:41 +00:00
function parse _NUMBER ( blob , length , opts ) {
var o = parse _cell ( blob , length , opts ) ;
o [ 1 ] . v = blob . read _shift ( 8 , 'f' ) ;
return o ;
}
2021-11-14 04:38:00 +00:00
function write _NUMBER ( R , C , v ) {
var o = new _buf ( 13 ) ;
o . write _shift ( 1 , 0xFF ) ;
o . write _shift ( 2 , C ) ;
o . write _shift ( 2 , R ) ;
o . write _shift ( 8 , v , 'f' ) ;
return o ;
}
2017-04-04 16:09:41 +00:00
function parse _FORMULA ( blob , length , opts ) {
var tgt = blob . l + length ;
var o = parse _cell ( blob , length , opts ) ;
/* TODO: formula */
o [ 1 ] . v = blob . read _shift ( 8 , 'f' ) ;
if ( opts . qpro ) blob . l = tgt ;
else {
var flen = blob . read _shift ( 2 ) ;
2021-11-14 04:38:00 +00:00
wk1 _fmla _to _csf ( blob . slice ( blob . l , blob . l + flen ) , o ) ;
2017-04-04 16:09:41 +00:00
blob . l += flen ;
}
return o ;
}
2021-11-14 04:38:00 +00:00
function wk1 _parse _rc ( B , V , col ) {
var rel = V & 0x8000 ;
V &= ~ 0x8000 ;
V = ( rel ? B : 0 ) + ( ( V >= 0x2000 ) ? V - 0x4000 : V ) ;
return ( rel ? "" : "$" ) + ( col ? encode _col ( V ) : encode _row ( V ) ) ;
}
2022-03-16 03:18:09 +00:00
/ * v a r o p r e c = [
2021-11-14 04:38:00 +00:00
8 , 8 , 8 , 8 , 8 , 8 , 8 , 8 , 6 , 4 , 4 , 5 , 5 , 7 , 3 , 3 ,
3 , 3 , 3 , 3 , 1 , 1 , 2 , 6 , 8 , 8 , 8 , 8 , 8 , 8 , 8 , 8
2022-03-16 03:18:09 +00:00
] ; * /
2021-11-14 04:38:00 +00:00
/* TODO: flesh out */
var FuncTab = {
2022-05-17 01:26:22 +00:00
0x1F : [ "NA" , 0 ] ,
// 0x20: ["ERR", 0],
0x21 : [ "ABS" , 1 ] ,
0x22 : [ "TRUNC" , 1 ] ,
0x23 : [ "SQRT" , 1 ] ,
0x24 : [ "LOG" , 1 ] ,
0x25 : [ "LN" , 1 ] ,
0x26 : [ "PI" , 0 ] ,
0x27 : [ "SIN" , 1 ] ,
0x28 : [ "COS" , 1 ] ,
0x29 : [ "TAN" , 1 ] ,
0x2A : [ "ATAN2" , 2 ] ,
0x2B : [ "ATAN" , 1 ] ,
0x2C : [ "ASIN" , 1 ] ,
0x2D : [ "ACOS" , 1 ] ,
0x2E : [ "EXP" , 1 ] ,
0x2F : [ "MOD" , 2 ] ,
// 0x30
0x31 : [ "ISNA" , 1 ] ,
0x32 : [ "ISERR" , 1 ] ,
2021-11-14 04:38:00 +00:00
0x33 : [ "FALSE" , 0 ] ,
0x34 : [ "TRUE" , 0 ] ,
2022-05-17 01:26:22 +00:00
0x35 : [ "RAND" , 0 ] ,
// 0x36 DATE
// 0x37 NOW
// 0x38 PMT
// 0x39 PV
// 0x3A FV
// 0x3B IF
// 0x3C DAY
// 0x3D MONTH
// 0x3E YEAR
0x3F : [ "ROUND" , 2 ] ,
// 0x40 TIME
// 0x41 HOUR
// 0x42 MINUTE
// 0x43 SECOND
0x44 : [ "ISNUMBER" , 1 ] ,
0x45 : [ "ISTEXT" , 1 ] ,
2021-11-14 04:38:00 +00:00
0x46 : [ "LEN" , 1 ] ,
2022-05-17 01:26:22 +00:00
0x47 : [ "VALUE" , 1 ] ,
// 0x48: ["FIXED", ?? 1],
0x49 : [ "MID" , 3 ] ,
2022-04-25 09:02:14 +00:00
0x4A : [ "CHAR" , 1 ] ,
2022-05-17 01:26:22 +00:00
// 0x4B
// 0x4C FIND
// 0x4D DATEVALUE
// 0x4E TIMEVALUE
// 0x4F CELL
2021-11-14 04:38:00 +00:00
0x50 : [ "SUM" , 69 ] ,
0x51 : [ "AVERAGEA" , 69 ] ,
0x52 : [ "COUNTA" , 69 ] ,
0x53 : [ "MINA" , 69 ] ,
0x54 : [ "MAXA" , 69 ] ,
2022-05-17 01:26:22 +00:00
// 0x55 VLOOKUP
// 0x56 NPV
// 0x57 VAR
// 0x58 STD
// 0x59 IRR
// 0x5A HLOOKUP
// 0x5B DSUM
// 0x5C DAVERAGE
// 0x5D DCOUNTA
// 0x5E DMIN
// 0x5F DMAX
// 0x60 DVARP
// 0x61 DSTDEVP
// 0x62 INDEX
// 0x63 COLS
// 0x64 ROWS
// 0x65 REPEAT
0x66 : [ "UPPER" , 1 ] ,
0x67 : [ "LOWER" , 1 ] ,
// 0x68 LEFT
// 0x69 RIGHT
// 0x6A REPLACE
0x6B : [ "PROPER" , 1 ] ,
// 0x6C CELL
0x6D : [ "TRIM" , 1 ] ,
// 0x6E CLEAN
2021-11-14 04:38:00 +00:00
0x6F : [ "T" , 1 ]
2022-05-17 01:26:22 +00:00
// 0x70 V
2021-11-14 04:38:00 +00:00
} ;
var BinOpTab = [
2022-03-16 03:18:09 +00:00
"" , "" , "" , "" , "" , "" , "" , "" , // eslint-disable-line no-mixed-spaces-and-tabs
"" , "+" , "-" , "*" , "/" , "^" , "=" , "<>" , // eslint-disable-line no-mixed-spaces-and-tabs
"<=" , ">=" , "<" , ">" , "" , "" , "" , "" , // eslint-disable-line no-mixed-spaces-and-tabs
"&" , "" , "" , "" , "" , "" , "" , "" // eslint-disable-line no-mixed-spaces-and-tabs
2021-11-14 04:38:00 +00:00
] ;
function wk1 _fmla _to _csf ( blob , o ) {
prep _blob ( blob , 0 ) ;
2022-01-10 18:45:50 +00:00
var out = [ ] , argc = 0 , R = "" , C = "" , argL = "" , argR = "" ;
2021-11-14 04:38:00 +00:00
while ( blob . l < blob . length ) {
var cc = blob [ blob . l ++ ] ;
switch ( cc ) {
case 0x00 : out . push ( blob . read _shift ( 8 , 'f' ) ) ; break ;
case 0x01 : {
C = wk1 _parse _rc ( o [ 0 ] . c , blob . read _shift ( 2 ) , true ) ;
R = wk1 _parse _rc ( o [ 0 ] . r , blob . read _shift ( 2 ) , false ) ;
out . push ( C + R ) ;
} break ;
case 0x02 : {
var c = wk1 _parse _rc ( o [ 0 ] . c , blob . read _shift ( 2 ) , true ) ;
var r = wk1 _parse _rc ( o [ 0 ] . r , blob . read _shift ( 2 ) , false ) ;
C = wk1 _parse _rc ( o [ 0 ] . c , blob . read _shift ( 2 ) , true ) ;
R = wk1 _parse _rc ( o [ 0 ] . r , blob . read _shift ( 2 ) , false ) ;
out . push ( c + r + ":" + C + R ) ;
} break ;
case 0x03 :
if ( blob . l < blob . length ) { console . error ( "WK1 premature formula end" ) ; return ; }
break ;
case 0x04 : out . push ( "(" + out . pop ( ) + ")" ) ; break ;
case 0x05 : out . push ( blob . read _shift ( 2 ) ) ; break ;
case 0x06 : {
/* TODO: text encoding */
var Z = "" ; while ( ( cc = blob [ blob . l ++ ] ) ) Z += String . fromCharCode ( cc ) ;
2022-03-12 14:05:57 +00:00
out . push ( '"' + Z . replace ( /"/g , '""' ) + '"' ) ;
2021-11-14 04:38:00 +00:00
} break ;
case 0x08 : out . push ( "-" + out . pop ( ) ) ; break ;
case 0x17 : out . push ( "+" + out . pop ( ) ) ; break ;
case 0x16 : out . push ( "NOT(" + out . pop ( ) + ")" ) ; break ;
case 0x14 : case 0x15 : {
2022-01-10 18:45:50 +00:00
argR = out . pop ( ) ; argL = out . pop ( ) ;
2021-11-14 04:38:00 +00:00
out . push ( [ "AND" , "OR" ] [ cc - 0x14 ] + "(" + argL + "," + argR + ")" ) ;
} break ;
default :
if ( cc < 0x20 && BinOpTab [ cc ] ) {
argR = out . pop ( ) ; argL = out . pop ( ) ;
out . push ( argL + BinOpTab [ cc ] + argR ) ;
} else if ( FuncTab [ cc ] ) {
argc = FuncTab [ cc ] [ 1 ] ;
if ( argc == 69 ) argc = blob [ blob . l ++ ] ;
if ( argc > out . length ) { console . error ( "WK1 bad formula parse 0x" + cc . toString ( 16 ) + ":|" + out . join ( "|" ) + "|" ) ; return ; }
var args = out . slice ( - argc ) ;
out . length -= argc ;
out . push ( FuncTab [ cc ] [ 0 ] + "(" + args . join ( "," ) + ")" ) ;
}
else if ( cc <= 0x07 ) return console . error ( "WK1 invalid opcode " + cc . toString ( 16 ) ) ;
else if ( cc <= 0x18 ) return console . error ( "WK1 unsupported op " + cc . toString ( 16 ) ) ;
else if ( cc <= 0x1E ) return console . error ( "WK1 invalid opcode " + cc . toString ( 16 ) ) ;
else if ( cc <= 0x73 ) return console . error ( "WK1 unsupported function opcode " + cc . toString ( 16 ) ) ;
// possible future functions ??
else return console . error ( "WK1 unrecognized opcode " + cc . toString ( 16 ) ) ;
}
}
if ( out . length == 1 ) o [ 1 ] . f = "" + out [ 0 ] ;
else console . error ( "WK1 bad formula parse |" + out . join ( "|" ) + "|" ) ;
}
2018-01-23 09:07:51 +00:00
function parse _cell _3 ( blob /*::, length*/ ) {
2017-04-04 16:09:41 +00:00
var o = [ { c : 0 , r : 0 } , { t : 'n' , v : 0 } , 0 ] ;
o [ 0 ] . r = blob . read _shift ( 2 ) ; o [ 3 ] = blob [ blob . l ++ ] ; o [ 0 ] . c = blob [ blob . l ++ ] ;
return o ;
}
function parse _LABEL _16 ( blob , length ) {
var o = parse _cell _3 ( blob , length ) ;
o [ 1 ] . t = 's' ;
o [ 1 ] . v = blob . read _shift ( length - 4 , 'cstr' ) ;
return o ;
}
2021-11-14 04:38:00 +00:00
function write _LABEL _16 ( R , C , wsidx , s ) {
/* TODO: encoding */
var o = new _buf ( 6 + s . length ) ;
o . write _shift ( 2 , R ) ;
o . write _shift ( 1 , wsidx ) ;
o . write _shift ( 1 , C ) ;
o . write _shift ( 1 , 0x27 ) ;
for ( var i = 0 ; i < s . length ; ++ i ) {
var cc = s . charCodeAt ( i ) ;
o . write _shift ( 1 , cc >= 0x80 ? 0x5F : cc ) ;
}
o . write _shift ( 1 , 0 ) ;
return o ;
}
2017-04-04 16:09:41 +00:00
function parse _NUMBER _18 ( blob , length ) {
var o = parse _cell _3 ( blob , length ) ;
o [ 1 ] . v = blob . read _shift ( 2 ) ;
var v = o [ 1 ] . v >> 1 ;
if ( o [ 1 ] . v & 0x1 ) {
switch ( v & 0x07 ) {
2021-11-14 04:38:00 +00:00
case 0 : v = ( v >> 3 ) * 5000 ; break ;
2017-04-04 16:09:41 +00:00
case 1 : v = ( v >> 3 ) * 500 ; break ;
case 2 : v = ( v >> 3 ) / 20 ; break ;
2021-11-14 04:38:00 +00:00
case 3 : v = ( v >> 3 ) / 200 ; break ;
2017-04-04 16:09:41 +00:00
case 4 : v = ( v >> 3 ) / 2000 ; break ;
2021-11-14 04:38:00 +00:00
case 5 : v = ( v >> 3 ) / 20000 ; break ;
2017-04-04 16:09:41 +00:00
case 6 : v = ( v >> 3 ) / 16 ; break ;
case 7 : v = ( v >> 3 ) / 64 ; break ;
}
}
o [ 1 ] . v = v ;
return o ;
}
function parse _NUMBER _17 ( blob , length ) {
var o = parse _cell _3 ( blob , length ) ;
var v1 = blob . read _shift ( 4 ) ;
var v2 = blob . read _shift ( 4 ) ;
var e = blob . read _shift ( 2 ) ;
2021-11-14 04:38:00 +00:00
if ( e == 0xFFFF ) {
if ( v1 === 0 && v2 === 0xC0000000 ) { o [ 1 ] . t = "e" ; o [ 1 ] . v = 0x0F ; } // ERR -> #VALUE!
else if ( v1 === 0 && v2 === 0xD0000000 ) { o [ 1 ] . t = "e" ; o [ 1 ] . v = 0x2A ; } // NA -> #N/A
else o [ 1 ] . v = 0 ;
return o ;
}
2017-04-04 16:09:41 +00:00
var s = e & 0x8000 ; e = ( e & 0x7FFF ) - 16446 ;
2021-11-14 04:38:00 +00:00
o [ 1 ] . v = ( 1 - s * 2 ) * ( v2 * Math . pow ( 2 , e + 32 ) + v1 * Math . pow ( 2 , e ) ) ;
return o ;
}
function write _NUMBER _17 ( R , C , wsidx , v ) {
var o = new _buf ( 14 ) ;
o . write _shift ( 2 , R ) ;
o . write _shift ( 1 , wsidx ) ;
o . write _shift ( 1 , C ) ;
if ( v == 0 ) {
o . write _shift ( 4 , 0 ) ;
o . write _shift ( 4 , 0 ) ;
o . write _shift ( 2 , 0xFFFF ) ;
return o ;
}
var s = 0 , e = 0 , v1 = 0 , v2 = 0 ;
if ( v < 0 ) { s = 1 ; v = - v ; }
e = Math . log2 ( v ) | 0 ;
v /= Math . pow ( 2 , e - 31 ) ;
v2 = ( v ) >>> 0 ;
if ( ( v2 & 0x80000000 ) == 0 ) { v /= 2 ; ++ e ; v2 = v >>> 0 ; }
v -= v2 ;
v2 |= 0x80000000 ;
v2 >>>= 0 ;
v *= Math . pow ( 2 , 32 ) ;
v1 = v >>> 0 ;
o . write _shift ( 4 , v1 ) ;
o . write _shift ( 4 , v2 ) ;
e += 0x3FFF + ( s ? 0x8000 : 0 ) ;
o . write _shift ( 2 , e ) ;
2017-04-04 16:09:41 +00:00
return o ;
}
function parse _FORMULA _19 ( blob , length ) {
var o = parse _NUMBER _17 ( blob , 14 ) ;
2021-11-14 04:38:00 +00:00
blob . l += length - 14 ; /* TODO: WK3 formula */
2017-04-04 16:09:41 +00:00
return o ;
}
function parse _NUMBER _25 ( blob , length ) {
var o = parse _cell _3 ( blob , length ) ;
var v1 = blob . read _shift ( 4 ) ;
o [ 1 ] . v = v1 >> 6 ;
return o ;
}
function parse _NUMBER _27 ( blob , length ) {
var o = parse _cell _3 ( blob , length ) ;
var v1 = blob . read _shift ( 8 , 'f' ) ;
o [ 1 ] . v = v1 ;
return o ;
}
function parse _FORMULA _28 ( blob , length ) {
2022-04-25 09:02:14 +00:00
var o = parse _NUMBER _27 ( blob , 12 ) ;
blob . l += length - 12 ; /* TODO: formula */
2017-04-04 16:09:41 +00:00
return o ;
}
2022-01-10 18:45:50 +00:00
function parse _SHEETNAMECS ( blob , length ) {
return blob [ blob . l + length - 1 ] == 0 ? blob . read _shift ( length , 'cstr' ) : "" ;
}
function parse _SHEETNAMELP ( blob , length ) {
var len = blob [ blob . l ++ ] ;
if ( len > length - 1 ) len = length - 1 ;
var o = "" ; while ( o . length < len ) o += String . fromCharCode ( blob [ blob . l ++ ] ) ;
return o ;
}
function parse _SHEETINFOQP ( blob , length , opts ) {
if ( ! opts . qpro || length < 21 ) return ;
var id = blob . read _shift ( 1 ) ;
blob . l += 17 ;
2022-03-16 03:18:09 +00:00
blob . l += 1 ; //var len = blob.read_shift(1);
2022-01-10 18:45:50 +00:00
blob . l += 2 ;
var nm = blob . read _shift ( length - 21 , 'cstr' ) ;
return [ id , nm ] ;
}
2021-11-14 04:38:00 +00:00
function parse _XFORMAT ( blob , length ) {
var o = { } , tgt = blob . l + length ;
while ( blob . l < tgt ) {
var dt = blob . read _shift ( 2 ) ;
if ( dt == 0x36b0 ) {
o [ dt ] = [ 0 , "" ] ;
o [ dt ] [ 0 ] = blob . read _shift ( 2 ) ;
while ( blob [ blob . l ] ) { o [ dt ] [ 1 ] += String . fromCharCode ( blob [ blob . l ] ) ; blob . l ++ ; } blob . l ++ ;
}
// TODO: 0x3a99 ??
}
return o ;
}
function write _XFORMAT _SHEETNAME ( name , wsidx ) {
var out = new _buf ( 5 + name . length ) ;
out . write _shift ( 2 , 0x36b0 ) ;
out . write _shift ( 2 , wsidx ) ;
for ( var i = 0 ; i < name . length ; ++ i ) {
var cc = name . charCodeAt ( i ) ;
out [ out . l ++ ] = cc > 0x7F ? 0x5F : cc ;
}
out [ out . l ++ ] = 0 ;
return out ;
}
2017-04-04 16:09:41 +00:00
var WK1Enum = {
/*::[*/ 0x0000 /*::]*/ : { n : "BOF" , f : parseuint16 } ,
2017-11-20 01:51:14 +00:00
/*::[*/ 0x0001 /*::]*/ : { n : "EOF" } ,
/*::[*/ 0x0002 /*::]*/ : { n : "CALCMODE" } ,
/*::[*/ 0x0003 /*::]*/ : { n : "CALCORDER" } ,
/*::[*/ 0x0004 /*::]*/ : { n : "SPLIT" } ,
/*::[*/ 0x0005 /*::]*/ : { n : "SYNC" } ,
2017-04-04 16:09:41 +00:00
/*::[*/ 0x0006 /*::]*/ : { n : "RANGE" , f : parse _RANGE } ,
2017-11-20 01:51:14 +00:00
/*::[*/ 0x0007 /*::]*/ : { n : "WINDOW1" } ,
/*::[*/ 0x0008 /*::]*/ : { n : "COLW1" } ,
/*::[*/ 0x0009 /*::]*/ : { n : "WINTWO" } ,
/*::[*/ 0x000A /*::]*/ : { n : "COLW2" } ,
/*::[*/ 0x000B /*::]*/ : { n : "NAME" } ,
/*::[*/ 0x000C /*::]*/ : { n : "BLANK" } ,
2017-04-04 16:09:41 +00:00
/*::[*/ 0x000D /*::]*/ : { n : "INTEGER" , f : parse _INTEGER } ,
/*::[*/ 0x000E /*::]*/ : { n : "NUMBER" , f : parse _NUMBER } ,
/*::[*/ 0x000F /*::]*/ : { n : "LABEL" , f : parse _LABEL } ,
/*::[*/ 0x0010 /*::]*/ : { n : "FORMULA" , f : parse _FORMULA } ,
2017-11-20 01:51:14 +00:00
/*::[*/ 0x0018 /*::]*/ : { n : "TABLE" } ,
/*::[*/ 0x0019 /*::]*/ : { n : "ORANGE" } ,
/*::[*/ 0x001A /*::]*/ : { n : "PRANGE" } ,
/*::[*/ 0x001B /*::]*/ : { n : "SRANGE" } ,
/*::[*/ 0x001C /*::]*/ : { n : "FRANGE" } ,
/*::[*/ 0x001D /*::]*/ : { n : "KRANGE1" } ,
/*::[*/ 0x0020 /*::]*/ : { n : "HRANGE" } ,
/*::[*/ 0x0023 /*::]*/ : { n : "KRANGE2" } ,
/*::[*/ 0x0024 /*::]*/ : { n : "PROTEC" } ,
/*::[*/ 0x0025 /*::]*/ : { n : "FOOTER" } ,
/*::[*/ 0x0026 /*::]*/ : { n : "HEADER" } ,
/*::[*/ 0x0027 /*::]*/ : { n : "SETUP" } ,
/*::[*/ 0x0028 /*::]*/ : { n : "MARGINS" } ,
/*::[*/ 0x0029 /*::]*/ : { n : "LABELFMT" } ,
/*::[*/ 0x002A /*::]*/ : { n : "TITLES" } ,
/*::[*/ 0x002B /*::]*/ : { n : "SHEETJS" } ,
/*::[*/ 0x002D /*::]*/ : { n : "GRAPH" } ,
/*::[*/ 0x002E /*::]*/ : { n : "NGRAPH" } ,
/*::[*/ 0x002F /*::]*/ : { n : "CALCCOUNT" } ,
/*::[*/ 0x0030 /*::]*/ : { n : "UNFORMATTED" } ,
/*::[*/ 0x0031 /*::]*/ : { n : "CURSORW12" } ,
/*::[*/ 0x0032 /*::]*/ : { n : "WINDOW" } ,
2022-04-25 09:02:14 +00:00
/*::[*/ 0x0033 /*::]*/ : { n : "STRING" , f : parse _STRING } ,
2017-11-20 01:51:14 +00:00
/*::[*/ 0x0037 /*::]*/ : { n : "PASSWORD" } ,
/*::[*/ 0x0038 /*::]*/ : { n : "LOCKED" } ,
/*::[*/ 0x003C /*::]*/ : { n : "QUERY" } ,
/*::[*/ 0x003D /*::]*/ : { n : "QUERYNAME" } ,
/*::[*/ 0x003E /*::]*/ : { n : "PRINT" } ,
/*::[*/ 0x003F /*::]*/ : { n : "PRINTNAME" } ,
/*::[*/ 0x0040 /*::]*/ : { n : "GRAPH2" } ,
/*::[*/ 0x0041 /*::]*/ : { n : "GRAPHNAME" } ,
/*::[*/ 0x0042 /*::]*/ : { n : "ZOOM" } ,
/*::[*/ 0x0043 /*::]*/ : { n : "SYMSPLIT" } ,
/*::[*/ 0x0044 /*::]*/ : { n : "NSROWS" } ,
/*::[*/ 0x0045 /*::]*/ : { n : "NSCOLS" } ,
/*::[*/ 0x0046 /*::]*/ : { n : "RULER" } ,
/*::[*/ 0x0047 /*::]*/ : { n : "NNAME" } ,
/*::[*/ 0x0048 /*::]*/ : { n : "ACOMM" } ,
/*::[*/ 0x0049 /*::]*/ : { n : "AMACRO" } ,
/*::[*/ 0x004A /*::]*/ : { n : "PARSE" } ,
2021-11-14 04:38:00 +00:00
/*::[*/ 0x0066 /*::]*/ : { n : "PRANGES??" } ,
/*::[*/ 0x0067 /*::]*/ : { n : "RRANGES??" } ,
/*::[*/ 0x0068 /*::]*/ : { n : "FNAME??" } ,
/*::[*/ 0x0069 /*::]*/ : { n : "MRANGES??" } ,
2022-01-10 18:45:50 +00:00
/*::[*/ 0x00CC /*::]*/ : { n : "SHEETNAMECS" , f : parse _SHEETNAMECS } ,
/*::[*/ 0x00DE /*::]*/ : { n : "SHEETNAMELP" , f : parse _SHEETNAMELP } ,
2022-04-25 09:02:14 +00:00
/*::[*/ 0x00FF /*::]*/ : { n : "BOF" , f : parseuint16 } ,
2021-11-14 04:38:00 +00:00
/*::[*/ 0xFFFF /*::]*/ : { n : "" }
2017-04-04 16:09:41 +00:00
} ;
var WK3Enum = {
2017-11-20 01:51:14 +00:00
/*::[*/ 0x0000 /*::]*/ : { n : "BOF" } ,
/*::[*/ 0x0001 /*::]*/ : { n : "EOF" } ,
2021-11-14 04:38:00 +00:00
/*::[*/ 0x0002 /*::]*/ : { n : "PASSWORD" } ,
/*::[*/ 0x0003 /*::]*/ : { n : "CALCSET" } ,
/*::[*/ 0x0004 /*::]*/ : { n : "WINDOWSET" } ,
/*::[*/ 0x0005 /*::]*/ : { n : "SHEETCELLPTR" } ,
/*::[*/ 0x0006 /*::]*/ : { n : "SHEETLAYOUT" } ,
/*::[*/ 0x0007 /*::]*/ : { n : "COLUMNWIDTH" } ,
/*::[*/ 0x0008 /*::]*/ : { n : "HIDDENCOLUMN" } ,
/*::[*/ 0x0009 /*::]*/ : { n : "USERRANGE" } ,
/*::[*/ 0x000A /*::]*/ : { n : "SYSTEMRANGE" } ,
/*::[*/ 0x000B /*::]*/ : { n : "ZEROFORCE" } ,
/*::[*/ 0x000C /*::]*/ : { n : "SORTKEYDIR" } ,
/*::[*/ 0x000D /*::]*/ : { n : "FILESEAL" } ,
/*::[*/ 0x000E /*::]*/ : { n : "DATAFILLNUMS" } ,
/*::[*/ 0x000F /*::]*/ : { n : "PRINTMAIN" } ,
/*::[*/ 0x0010 /*::]*/ : { n : "PRINTSTRING" } ,
/*::[*/ 0x0011 /*::]*/ : { n : "GRAPHMAIN" } ,
/*::[*/ 0x0012 /*::]*/ : { n : "GRAPHSTRING" } ,
2017-11-20 01:51:14 +00:00
/*::[*/ 0x0013 /*::]*/ : { n : "??" } ,
2021-11-14 04:38:00 +00:00
/*::[*/ 0x0014 /*::]*/ : { n : "ERRCELL" } ,
/*::[*/ 0x0015 /*::]*/ : { n : "NACELL" } ,
2017-04-04 16:09:41 +00:00
/*::[*/ 0x0016 /*::]*/ : { n : "LABEL16" , f : parse _LABEL _16 } ,
/*::[*/ 0x0017 /*::]*/ : { n : "NUMBER17" , f : parse _NUMBER _17 } ,
/*::[*/ 0x0018 /*::]*/ : { n : "NUMBER18" , f : parse _NUMBER _18 } ,
/*::[*/ 0x0019 /*::]*/ : { n : "FORMULA19" , f : parse _FORMULA _19 } ,
2021-11-14 04:38:00 +00:00
/*::[*/ 0x001A /*::]*/ : { n : "FORMULA1A" } ,
/*::[*/ 0x001B /*::]*/ : { n : "XFORMAT" , f : parse _XFORMAT } ,
/*::[*/ 0x001C /*::]*/ : { n : "DTLABELMISC" } ,
/*::[*/ 0x001D /*::]*/ : { n : "DTLABELCELL" } ,
/*::[*/ 0x001E /*::]*/ : { n : "GRAPHWINDOW" } ,
/*::[*/ 0x001F /*::]*/ : { n : "CPA" } ,
/*::[*/ 0x0020 /*::]*/ : { n : "LPLAUTO" } ,
/*::[*/ 0x0021 /*::]*/ : { n : "QUERY" } ,
/*::[*/ 0x0022 /*::]*/ : { n : "HIDDENSHEET" } ,
/*::[*/ 0x0023 /*::]*/ : { n : "??" } ,
2017-04-04 16:09:41 +00:00
/*::[*/ 0x0025 /*::]*/ : { n : "NUMBER25" , f : parse _NUMBER _25 } ,
2021-11-14 04:38:00 +00:00
/*::[*/ 0x0026 /*::]*/ : { n : "??" } ,
2017-04-04 16:09:41 +00:00
/*::[*/ 0x0027 /*::]*/ : { n : "NUMBER27" , f : parse _NUMBER _27 } ,
/*::[*/ 0x0028 /*::]*/ : { n : "FORMULA28" , f : parse _FORMULA _28 } ,
2021-11-14 04:38:00 +00:00
/*::[*/ 0x008E /*::]*/ : { n : "??" } ,
/*::[*/ 0x0093 /*::]*/ : { n : "??" } ,
/*::[*/ 0x0096 /*::]*/ : { n : "??" } ,
/*::[*/ 0x0097 /*::]*/ : { n : "??" } ,
/*::[*/ 0x0098 /*::]*/ : { n : "??" } ,
/*::[*/ 0x0099 /*::]*/ : { n : "??" } ,
/*::[*/ 0x009A /*::]*/ : { n : "??" } ,
/*::[*/ 0x009B /*::]*/ : { n : "??" } ,
/*::[*/ 0x009C /*::]*/ : { n : "??" } ,
/*::[*/ 0x00A3 /*::]*/ : { n : "??" } ,
/*::[*/ 0x00AE /*::]*/ : { n : "??" } ,
/*::[*/ 0x00AF /*::]*/ : { n : "??" } ,
/*::[*/ 0x00B0 /*::]*/ : { n : "??" } ,
/*::[*/ 0x00B1 /*::]*/ : { n : "??" } ,
/*::[*/ 0x00B8 /*::]*/ : { n : "??" } ,
/*::[*/ 0x00B9 /*::]*/ : { n : "??" } ,
/*::[*/ 0x00BA /*::]*/ : { n : "??" } ,
/*::[*/ 0x00BB /*::]*/ : { n : "??" } ,
/*::[*/ 0x00BC /*::]*/ : { n : "??" } ,
/*::[*/ 0x00C3 /*::]*/ : { n : "??" } ,
/*::[*/ 0x00C9 /*::]*/ : { n : "??" } ,
2022-01-10 18:45:50 +00:00
/*::[*/ 0x00CC /*::]*/ : { n : "SHEETNAMECS" , f : parse _SHEETNAMECS } ,
2021-11-14 04:38:00 +00:00
/*::[*/ 0x00CD /*::]*/ : { n : "??" } ,
/*::[*/ 0x00CE /*::]*/ : { n : "??" } ,
/*::[*/ 0x00CF /*::]*/ : { n : "??" } ,
/*::[*/ 0x00D0 /*::]*/ : { n : "??" } ,
/*::[*/ 0x0100 /*::]*/ : { n : "??" } ,
/*::[*/ 0x0103 /*::]*/ : { n : "??" } ,
/*::[*/ 0x0104 /*::]*/ : { n : "??" } ,
/*::[*/ 0x0105 /*::]*/ : { n : "??" } ,
/*::[*/ 0x0106 /*::]*/ : { n : "??" } ,
/*::[*/ 0x0107 /*::]*/ : { n : "??" } ,
/*::[*/ 0x0109 /*::]*/ : { n : "??" } ,
/*::[*/ 0x010A /*::]*/ : { n : "??" } ,
/*::[*/ 0x010B /*::]*/ : { n : "??" } ,
/*::[*/ 0x010C /*::]*/ : { n : "??" } ,
/*::[*/ 0x010E /*::]*/ : { n : "??" } ,
/*::[*/ 0x010F /*::]*/ : { n : "??" } ,
/*::[*/ 0x0180 /*::]*/ : { n : "??" } ,
/*::[*/ 0x0185 /*::]*/ : { n : "??" } ,
/*::[*/ 0x0186 /*::]*/ : { n : "??" } ,
/*::[*/ 0x0189 /*::]*/ : { n : "??" } ,
/*::[*/ 0x018C /*::]*/ : { n : "??" } ,
/*::[*/ 0x0200 /*::]*/ : { n : "??" } ,
/*::[*/ 0x0202 /*::]*/ : { n : "??" } ,
/*::[*/ 0x0201 /*::]*/ : { n : "??" } ,
/*::[*/ 0x0204 /*::]*/ : { n : "??" } ,
/*::[*/ 0x0205 /*::]*/ : { n : "??" } ,
/*::[*/ 0x0280 /*::]*/ : { n : "??" } ,
/*::[*/ 0x0281 /*::]*/ : { n : "??" } ,
/*::[*/ 0x0282 /*::]*/ : { n : "??" } ,
/*::[*/ 0x0283 /*::]*/ : { n : "??" } ,
/*::[*/ 0x0284 /*::]*/ : { n : "??" } ,
/*::[*/ 0x0285 /*::]*/ : { n : "??" } ,
/*::[*/ 0x0286 /*::]*/ : { n : "??" } ,
/*::[*/ 0x0287 /*::]*/ : { n : "??" } ,
/*::[*/ 0x0288 /*::]*/ : { n : "??" } ,
/*::[*/ 0x0292 /*::]*/ : { n : "??" } ,
/*::[*/ 0x0293 /*::]*/ : { n : "??" } ,
/*::[*/ 0x0294 /*::]*/ : { n : "??" } ,
/*::[*/ 0x0295 /*::]*/ : { n : "??" } ,
/*::[*/ 0x0296 /*::]*/ : { n : "??" } ,
/*::[*/ 0x0299 /*::]*/ : { n : "??" } ,
/*::[*/ 0x029A /*::]*/ : { n : "??" } ,
/*::[*/ 0x0300 /*::]*/ : { n : "??" } ,
/*::[*/ 0x0304 /*::]*/ : { n : "??" } ,
2022-01-10 18:45:50 +00:00
/*::[*/ 0x0601 /*::]*/ : { n : "SHEETINFOQP" , f : parse _SHEETINFOQP } ,
2021-11-14 04:38:00 +00:00
/*::[*/ 0x0640 /*::]*/ : { n : "??" } ,
/*::[*/ 0x0642 /*::]*/ : { n : "??" } ,
/*::[*/ 0x0701 /*::]*/ : { n : "??" } ,
/*::[*/ 0x0702 /*::]*/ : { n : "??" } ,
/*::[*/ 0x0703 /*::]*/ : { n : "??" } ,
/*::[*/ 0x0704 /*::]*/ : { n : "??" } ,
/*::[*/ 0x0780 /*::]*/ : { n : "??" } ,
/*::[*/ 0x0800 /*::]*/ : { n : "??" } ,
/*::[*/ 0x0801 /*::]*/ : { n : "??" } ,
/*::[*/ 0x0804 /*::]*/ : { n : "??" } ,
/*::[*/ 0x0A80 /*::]*/ : { n : "??" } ,
/*::[*/ 0x2AF6 /*::]*/ : { n : "??" } ,
/*::[*/ 0x3231 /*::]*/ : { n : "??" } ,
/*::[*/ 0x6E49 /*::]*/ : { n : "??" } ,
/*::[*/ 0x6F44 /*::]*/ : { n : "??" } ,
/*::[*/ 0xFFFF /*::]*/ : { n : "" }
2017-04-04 16:09:41 +00:00
} ;
2022-04-25 09:02:14 +00:00
/* QPW uses a different set of record types */
function qpw _to _workbook _buf ( d , opts ) /*:Workbook*/ {
prep _blob ( d , 0 ) ;
var o = opts || { } ;
if ( DENSE != null && o . dense == null ) o . dense = DENSE ;
var s /*:Worksheet*/ = ( ( o . dense ? [ ] : { } ) /*:any*/ ) ;
var SST = [ ] , sname = "" , formulae = [ ] ;
var range = { s : { r : - 1 , c : - 1 } , e : { r : - 1 , c : - 1 } } ;
var cnt = 0 , type = 0 , C = 0 , R = 0 ;
var wb = { SheetNames : [ ] , Sheets : { } } ;
outer : while ( d . l < d . length ) {
var RT = d . read _shift ( 2 ) , length = d . read _shift ( 2 ) ;
var p = d . slice ( d . l , d . l + length ) ;
prep _blob ( p , 0 ) ;
switch ( RT ) {
case 0x01 : /* BOF */
if ( p . read _shift ( 4 ) != 0x39575051 ) throw "Bad QPW9 BOF!" ;
break ;
case 0x02 : /* EOF */ break outer ;
2022-05-09 06:49:17 +00:00
/* TODO: The behavior here should be consistent with Numbers: QP Notebook ~ .TN.SheetArchive, QP Sheet ~ .TST.TableModelArchive */
2022-04-25 09:02:14 +00:00
case 0x0401 : /* BON */ break ;
case 0x0402 : /* EON */ /* TODO: backfill missing sheets based on BON cnt */ break ;
case 0x0407 : { /* SST */
p . l += 12 ;
while ( p . l < p . length ) {
cnt = p . read _shift ( 2 ) ;
type = p . read _shift ( 1 ) ;
SST . push ( p . read _shift ( cnt , 'cstr' ) ) ;
}
} break ;
case 0x0408 : { /* FORMULAE */
//p.l += 12;
//while(p.l < p.length) {
// cnt = p.read_shift(2);
// formulae.push(p.slice(p.l, p.l + cnt + 1)); p.l += cnt + 1;
//}
} break ;
case 0x0601 : { /* BOS */
var sidx = p . read _shift ( 2 ) ;
s = ( ( o . dense ? [ ] : { } ) /*:any*/ ) ;
range . s . c = p . read _shift ( 2 ) ;
range . e . c = p . read _shift ( 2 ) ;
range . s . r = p . read _shift ( 4 ) ;
range . e . r = p . read _shift ( 4 ) ;
p . l += 4 ;
if ( p . l + 2 < p . length ) {
cnt = p . read _shift ( 2 ) ;
type = p . read _shift ( 1 ) ;
sname = cnt == 0 ? "" : p . read _shift ( cnt , 'cstr' ) ;
}
2022-04-27 08:26:35 +00:00
if ( ! sname ) sname = encode _col ( sidx ) ;
2022-04-25 09:02:14 +00:00
/* TODO: backfill empty sheets */
} break ;
case 0x0602 : { /* EOS */
/* NOTE: QP valid range A1:IV1000000 */
if ( range . s . c > 0xFF || range . s . r > 999999 ) break ;
if ( range . e . c < range . s . c ) range . e . c = range . s . c ;
if ( range . e . r < range . s . r ) range . e . r = range . s . r ;
s [ "!ref" ] = encode _range ( range ) ;
book _append _sheet ( wb , s , sname ) ; // TODO: a barrel roll
} break ;
case 0x0A01 : { /* COL (like XLS Row, modulo the layout transposition) */
C = p . read _shift ( 2 ) ;
if ( range . e . c < C ) range . e . c = C ;
if ( range . s . c > C ) range . s . c = C ;
R = p . read _shift ( 4 ) ;
if ( range . s . r > R ) range . s . r = R ;
R = p . read _shift ( 4 ) ;
if ( range . e . r < R ) range . e . r = R ;
} break ;
case 0x0C01 : { /* MulCells (like XLS MulRK, but takes advantage of common column data patterns) */
R = p . read _shift ( 4 ) , cnt = p . read _shift ( 4 ) ;
if ( range . s . r > R ) range . s . r = R ;
if ( range . e . r < R + cnt - 1 ) range . e . r = R + cnt - 1 ;
while ( p . l < p . length ) {
var cell = { t : "z" } ;
var flags = p . read _shift ( 1 ) ;
if ( flags & 0x80 ) p . l += 2 ;
var mul = ( flags & 0x40 ) ? p . read _shift ( 2 ) - 1 : 0 ;
switch ( flags & 0x1F ) {
case 1 : break ;
case 2 : cell = { t : "n" , v : p . read _shift ( 2 ) } ; break ;
case 3 : cell = { t : "n" , v : p . read _shift ( 2 , 'i' ) } ; break ;
case 5 : cell = { t : "n" , v : p . read _shift ( 8 , 'f' ) } ; break ;
case 7 : cell = { t : "s" , v : SST [ type = p . read _shift ( 4 ) - 1 ] } ; break ;
case 8 : cell = { t : "n" , v : p . read _shift ( 8 , 'f' ) } ; p . l += 2 ; /* cell.f = formulae[p.read_shift(4)]; */ p . l += 4 ; break ;
default : throw "Unrecognized QPW cell type " + ( flags & 0x1F ) ;
}
var delta = 0 ;
if ( flags & 0x20 ) switch ( flags & 0x1F ) {
case 2 : delta = p . read _shift ( 2 ) ; break ;
case 3 : delta = p . read _shift ( 2 , 'i' ) ; break ;
case 7 : delta = p . read _shift ( 2 ) ; break ;
default : throw "Unsupported delta for QPW cell type " + ( flags & 0x1F ) ;
}
if ( ! ( ! o . sheetStubs && cell . t == "z" ) ) {
if ( Array . isArray ( s ) ) {
if ( ! s [ R ] ) s [ R ] = [ ] ;
s [ R ] [ C ] = cell ;
} else s [ encode _cell ( { r : R , c : C } ) ] = cell ;
}
++ R ; -- cnt ;
while ( mul -- > 0 && cnt >= 0 ) {
if ( flags & 0x20 ) switch ( flags & 0x1F ) {
case 2 : cell = { t : "n" , v : ( cell . v + delta ) & 0xFFFF } ; break ;
case 3 : cell = { t : "n" , v : ( cell . v + delta ) & 0xFFFF } ; if ( cell . v > 0x7FFF ) cell . v -= 0x10000 ; break ;
case 7 : cell = { t : "s" , v : SST [ type = ( type + delta ) >>> 0 ] } ; break ;
default : throw "Cannot apply delta for QPW cell type " + ( flags & 0x1F ) ;
} else switch ( flags & 0x1F ) {
case 1 : cell = { t : "z" } ; break ;
case 2 : cell = { t : "n" , v : p . read _shift ( 2 ) } ; break ;
case 7 : cell = { t : "s" , v : SST [ type = p . read _shift ( 4 ) - 1 ] } ; break ;
default : throw "Cannot apply repeat for QPW cell type " + ( flags & 0x1F ) ;
}
if ( ! ( ! o . sheetStubs && cell . t == "z" ) ) {
if ( Array . isArray ( s ) ) {
if ( ! s [ R ] ) s [ R ] = [ ] ;
s [ R ] [ C ] = cell ;
} else s [ encode _cell ( { r : R , c : C } ) ] = cell ;
}
++ R ; -- cnt ;
}
}
} break ;
default : break ;
}
d . l += length ;
}
return wb ;
}
2017-04-04 16:09:41 +00:00
return {
2021-11-14 04:38:00 +00:00
sheet _to _wk1 : sheet _to _wk1 ,
book _to _wk3 : book _to _wk3 ,
2017-04-04 16:09:41 +00:00
to _workbook : lotus _to _workbook
} ;
} ) ( ) ;
2019-11-15 01:46:49 +00:00
/* 18.4.7 rPr CT_RPrElt */
function parse _rpr ( rpr ) {
var font = { } , m = rpr . match ( tagregex ) , i = 0 ;
var pass = false ;
if ( m ) for ( ; i != m . length ; ++ i ) {
var y = parsexmltag ( m [ i ] ) ;
switch ( y [ 0 ] . replace ( /\w*:/g , "" ) ) {
/* 18.8.12 condense CT_BooleanProperty */
/* ** not required . */
case '<condense' : break ;
/* 18.8.17 extend CT_BooleanProperty */
/* ** not required . */
case '<extend' : break ;
/* 18.8.36 shadow CT_BooleanProperty */
/* ** not required . */
case '<shadow' :
if ( ! y . val ) break ;
/* falls through */
case '<shadow>' :
case '<shadow/>' : font . shadow = 1 ; break ;
case '</shadow>' : break ;
2017-02-03 20:50:45 +00:00
2019-11-15 01:46:49 +00:00
/* 18.4.1 charset CT_IntProperty TODO */
case '<charset' :
if ( y . val == '1' ) break ;
font . cp = CS2CP [ parseInt ( y . val , 10 ) ] ;
break ;
2017-02-03 20:50:45 +00:00
2019-11-15 01:46:49 +00:00
/* 18.4.2 outline CT_BooleanProperty TODO */
case '<outline' :
if ( ! y . val ) break ;
/* falls through */
case '<outline>' :
case '<outline/>' : font . outline = 1 ; break ;
case '</outline>' : break ;
2017-02-03 20:50:45 +00:00
2019-11-15 01:46:49 +00:00
/* 18.4.5 rFont CT_FontName */
case '<rFont' : font . name = y . val ; break ;
2017-02-03 20:50:45 +00:00
2019-11-15 01:46:49 +00:00
/* 18.4.11 sz CT_FontSize */
case '<sz' : font . sz = y . val ; break ;
2017-02-03 20:50:45 +00:00
2019-11-15 01:46:49 +00:00
/* 18.4.10 strike CT_BooleanProperty */
case '<strike' :
if ( ! y . val ) break ;
/* falls through */
case '<strike>' :
case '<strike/>' : font . strike = 1 ; break ;
case '</strike>' : break ;
2017-02-03 20:50:45 +00:00
2019-11-15 01:46:49 +00:00
/* 18.4.13 u CT_UnderlineProperty */
case '<u' :
if ( ! y . val ) break ;
switch ( y . val ) {
case 'double' : font . uval = "double" ; break ;
case 'singleAccounting' : font . uval = "single-accounting" ; break ;
case 'doubleAccounting' : font . uval = "double-accounting" ; break ;
}
/* falls through */
case '<u>' :
case '<u/>' : font . u = 1 ; break ;
case '</u>' : break ;
2017-02-03 20:50:45 +00:00
2019-11-15 01:46:49 +00:00
/* 18.8.2 b */
case '<b' :
if ( y . val == '0' ) break ;
/* falls through */
case '<b>' :
case '<b/>' : font . b = 1 ; break ;
case '</b>' : break ;
2017-02-03 20:50:45 +00:00
2019-11-15 01:46:49 +00:00
/* 18.8.26 i */
case '<i' :
if ( y . val == '0' ) break ;
/* falls through */
case '<i>' :
case '<i/>' : font . i = 1 ; break ;
case '</i>' : break ;
2017-02-03 20:50:45 +00:00
2019-11-15 01:46:49 +00:00
/* 18.3.1.15 color CT_Color TODO: tint, theme, auto, indexed */
case '<color' :
if ( y . rgb ) font . color = y . rgb . slice ( 2 , 8 ) ;
break ;
2022-02-01 05:58:45 +00:00
case '<color>' : case '<color/>' : case '</color>' : break ;
2017-02-03 20:50:45 +00:00
2019-11-15 01:46:49 +00:00
/* 18.8.18 family ST_FontFamily */
case '<family' : font . family = y . val ; break ;
2022-02-01 05:58:45 +00:00
case '<family>' : case '<family/>' : case '</family>' : break ;
2017-02-03 20:50:45 +00:00
2019-11-15 01:46:49 +00:00
/* 18.4.14 vertAlign CT_VerticalAlignFontProperty TODO */
case '<vertAlign' : font . valign = y . val ; break ;
2022-02-01 05:58:45 +00:00
case '<vertAlign>' : case '<vertAlign/>' : case '</vertAlign>' : break ;
2019-11-15 01:46:49 +00:00
/* 18.8.35 scheme CT_FontScheme TODO */
case '<scheme' : break ;
2022-02-01 05:58:45 +00:00
case '<scheme>' : case '<scheme/>' : case '</scheme>' : break ;
2019-11-15 01:46:49 +00:00
/* 18.2.10 extLst CT_ExtensionList ? */
case '<extLst' : case '<extLst>' : case '</extLst>' : break ;
case '<ext' : pass = true ; break ;
case '</ext>' : pass = false ; break ;
default :
if ( y [ 0 ] . charCodeAt ( 1 ) !== 47 && ! pass ) throw new Error ( 'Unrecognized rich format ' + y [ 0 ] ) ;
2017-02-03 20:50:45 +00:00
}
2019-11-15 01:46:49 +00:00
}
return font ;
}
2022-03-12 14:05:57 +00:00
var parse _rs = /*#__PURE__*/ ( function ( ) {
2019-11-15 01:46:49 +00:00
var tregex = matchtag ( "t" ) , rpregex = matchtag ( "rPr" ) ;
/* 18.4.4 r CT_RElt */
function parse _r ( r ) {
/* 18.4.12 t ST_Xstring */
var t = r . match ( tregex ) /*, cp = 65001*/ ;
if ( ! t ) return { t : "s" , v : "" } ;
var o /*:Cell*/ = ( { t : 's' , v : unescapexml ( t [ 1 ] ) } /*:any*/ ) ;
var rpr = r . match ( rpregex ) ;
if ( rpr ) o . s = parse _rpr ( rpr [ 1 ] ) ;
return o ;
}
var rregex = /<(?:\w+:)?r>/g , rend = /<\/(?:\w+:)?r>/ ;
return function parse _rs ( rs ) {
return rs . replace ( rregex , "" ) . split ( rend ) . map ( parse _r ) . filter ( function ( r ) { return r . v ; } ) ;
} ;
} ) ( ) ;
/* Parse a list of <r> tags */
2022-03-12 14:05:57 +00:00
var rs _to _html = /*#__PURE__*/ ( function parse _rs _factory ( ) {
2019-11-15 01:46:49 +00:00
var nlregex = /(\r\n|\n)/g ;
function parse _rpr2 ( font , intro , outro ) {
2017-12-30 05:40:35 +00:00
var style /*:Array<string>*/ = [ ] ;
2017-04-20 03:24:48 +00:00
if ( font . u ) style . push ( "text-decoration: underline;" ) ;
if ( font . uval ) style . push ( "text-underline-style:" + font . uval + ";" ) ;
2018-04-17 20:01:57 +00:00
if ( font . sz ) style . push ( "font-size:" + font . sz + "pt;" ) ;
2017-04-20 03:24:48 +00:00
if ( font . outline ) style . push ( "text-effect: outline;" ) ;
if ( font . shadow ) style . push ( "text-shadow: auto;" ) ;
2017-02-03 20:50:45 +00:00
intro . push ( '<span style="' + style . join ( "" ) + '">' ) ;
2017-04-20 03:24:48 +00:00
if ( font . b ) { intro . push ( "<b>" ) ; outro . push ( "</b>" ) ; }
if ( font . i ) { intro . push ( "<i>" ) ; outro . push ( "</i>" ) ; }
if ( font . strike ) { intro . push ( "<s>" ) ; outro . push ( "</s>" ) ; }
2019-11-15 01:46:49 +00:00
var align = font . valign || "" ;
if ( align == "superscript" || align == "super" ) align = "sup" ;
2017-04-20 03:24:48 +00:00
else if ( align == "subscript" ) align = "sub" ;
if ( align != "" ) { intro . push ( "<" + align + ">" ) ; outro . push ( "</" + align + ">" ) ; }
2017-02-03 20:50:45 +00:00
outro . push ( "</span>" ) ;
2019-11-15 01:46:49 +00:00
return font ;
}
2017-02-03 20:50:45 +00:00
/* 18.4.4 r CT_RElt */
2019-11-15 01:46:49 +00:00
function r _to _html ( r ) {
var terms /*:[Array<string>, string, Array<string>]*/ = [ [ ] , r . v , [ ] ] ;
if ( ! r . v ) return "" ;
2017-02-03 20:50:45 +00:00
2019-11-15 01:46:49 +00:00
if ( r . s ) parse _rpr2 ( r . s , terms [ 0 ] , terms [ 2 ] ) ;
2017-02-03 20:50:45 +00:00
return terms [ 0 ] . join ( "" ) + terms [ 1 ] . replace ( nlregex , '<br/>' ) + terms [ 2 ] . join ( "" ) ;
}
2019-11-15 01:46:49 +00:00
2017-02-03 20:50:45 +00:00
return function parse _rs ( rs ) {
2019-11-15 01:46:49 +00:00
return rs . map ( r _to _html ) . join ( "" ) ;
2017-02-03 20:50:45 +00:00
} ;
} ) ( ) ;
/* 18.4.8 si CT_Rst */
2017-02-10 19:23:01 +00:00
var sitregex = /<(?:\w+:)?t[^>]*>([^<]*)<\/(?:\w+:)?t>/g , sirregex = /<(?:\w+:)?r>/ ;
2017-07-05 22:27:54 +00:00
var sirphregex = /<(?:\w+:)?rPh.*?>([\s\S]*?)<\/(?:\w+:)?rPh>/g ;
2017-02-03 20:50:45 +00:00
function parse _si ( x , opts ) {
var html = opts ? opts . cellHTML : true ;
var z = { } ;
2020-08-12 21:58:02 +00:00
if ( ! x ) return { t : "" } ;
2018-01-23 09:07:51 +00:00
//var y;
2017-02-03 20:50:45 +00:00
/* 18.4.12 t ST_Xstring (Plaintext String) */
2017-02-19 20:36:32 +00:00
// TODO: is whitespace actually valid here?
if ( x . match ( /^\s*<(?:\w+:)?t[^>]*>/ ) ) {
2022-04-25 09:02:14 +00:00
z . t = unescapexml ( utf8read ( x . slice ( x . indexOf ( ">" ) + 1 ) . split ( /<\/(?:\w+:)?t>/ ) [ 0 ] || "" ) , true ) ;
2017-02-19 20:36:32 +00:00
z . r = utf8read ( x ) ;
2017-04-13 18:28:16 +00:00
if ( html ) z . h = escapehtml ( z . t ) ;
2017-02-03 20:50:45 +00:00
}
/* 18.4.4 r CT_RElt (Rich Text Run) */
2018-01-23 09:07:51 +00:00
else if ( ( /*y = */ x . match ( sirregex ) ) ) {
2017-02-19 20:36:32 +00:00
z . r = utf8read ( x ) ;
2022-04-25 09:02:14 +00:00
z . t = unescapexml ( utf8read ( ( x . replace ( sirphregex , '' ) . match ( sitregex ) || [ ] ) . join ( "" ) . replace ( tagregex , "" ) ) , true ) ;
2019-11-15 01:46:49 +00:00
if ( html ) z . h = rs _to _html ( parse _rs ( z . r ) ) ;
2017-02-03 20:50:45 +00:00
}
/* 18.4.3 phoneticPr CT_PhoneticPr (TODO: needed for Asian support) */
/* 18.4.6 rPh CT_PhoneticRun (TODO: needed for Asian support) */
return z ;
}
/* 18.4 Shared String Table */
2017-02-10 19:23:01 +00:00
var sstr0 = /<(?:\w+:)?sst([^>]*)>([\s\S]*)<\/(?:\w+:)?sst>/ ;
var sstr1 = /<(?:\w+:)?(?:si|sstItem)>/g ;
var sstr2 = /<\/(?:\w+:)?(?:si|sstItem)>/ ;
function parse _sst _xml ( data /*:string*/ , opts ) /*:SST*/ {
var s /*:SST*/ = ( [ ] /*:any*/ ) , ss = "" ;
if ( ! data ) return s ;
2017-02-03 20:50:45 +00:00
/* 18.4.9 sst CT_Sst */
var sst = data . match ( sstr0 ) ;
2017-12-30 05:40:35 +00:00
if ( sst ) {
2017-02-03 20:50:45 +00:00
ss = sst [ 2 ] . replace ( sstr1 , "" ) . split ( sstr2 ) ;
for ( var i = 0 ; i != ss . length ; ++ i ) {
2017-02-19 20:36:32 +00:00
var o = parse _si ( ss [ i ] . trim ( ) , opts ) ;
2017-02-03 20:50:45 +00:00
if ( o != null ) s [ s . length ] = o ;
}
sst = parsexmltag ( sst [ 1 ] ) ; s . Count = sst . count ; s . Unique = sst . uniqueCount ;
}
return s ;
}
var straywsregex = /^\s|\s$|[\t\n\r]/ ;
2017-02-10 19:23:01 +00:00
function write _sst _xml ( sst /*:SST*/ , opts ) /*:string*/ {
2017-02-03 20:50:45 +00:00
if ( ! opts . bookSST ) return "" ;
var o = [ XML _HEADER ] ;
o [ o . length ] = ( writextag ( 'sst' , null , {
2022-03-12 14:05:57 +00:00
xmlns : XMLNS _main [ 0 ] ,
2017-02-03 20:50:45 +00:00
count : sst . Count ,
uniqueCount : sst . Unique
} ) ) ;
for ( var i = 0 ; i != sst . length ; ++ i ) { if ( sst [ i ] == null ) continue ;
2017-03-12 18:02:43 +00:00
var s /*:XLString*/ = sst [ i ] ;
2017-02-03 20:50:45 +00:00
var sitag = "<si>" ;
if ( s . r ) sitag += s . r ;
else {
sitag += "<t" ;
2017-03-22 15:21:01 +00:00
if ( ! s . t ) s . t = "" ;
2017-02-03 20:50:45 +00:00
if ( s . t . match ( straywsregex ) ) sitag += ' xml:space="preserve"' ;
sitag += ">" + escapexml ( s . t ) + "</t>" ;
}
sitag += "</si>" ;
o [ o . length ] = ( sitag ) ;
}
if ( o . length > 2 ) { o [ o . length ] = ( '</sst>' ) ; o [ 1 ] = o [ 1 ] . replace ( "/>" , ">" ) ; }
return o . join ( "" ) ;
}
2018-02-14 20:06:35 +00:00
/* [MS-XLSB] 2.4.221 BrtBeginSst */
2018-01-23 09:07:51 +00:00
function parse _BrtBeginSst ( data ) {
2017-02-03 20:50:45 +00:00
return [ data . read _shift ( 4 ) , data . read _shift ( 4 ) ] ;
}
/* [MS-XLSB] 2.1.7.45 Shared Strings */
2017-03-12 18:02:43 +00:00
function parse _sst _bin ( data , opts ) /*:SST*/ {
var s /*:SST*/ = ( [ ] /*:any*/ ) ;
2017-02-03 20:50:45 +00:00
var pass = false ;
2022-03-12 14:05:57 +00:00
recordhopper ( data , function hopper _sst ( val , R , RT ) {
2017-04-09 04:03:19 +00:00
switch ( RT ) {
2022-03-12 14:05:57 +00:00
case 0x009F : /* BrtBeginSst */
2017-04-09 04:03:19 +00:00
s . Count = val [ 0 ] ; s . Unique = val [ 1 ] ; break ;
2022-03-12 14:05:57 +00:00
case 0x0013 : /* BrtSSTItem */
2017-04-09 04:03:19 +00:00
s . push ( val ) ; break ;
2022-03-12 14:05:57 +00:00
case 0x00A0 : /* BrtEndSst */
2017-04-09 04:03:19 +00:00
return true ;
2022-03-12 14:05:57 +00:00
case 0x0023 : /* BrtFRTBegin */
2017-04-09 04:03:19 +00:00
pass = true ; break ;
2022-03-12 14:05:57 +00:00
case 0x0024 : /* BrtFRTEnd */
2017-04-09 04:03:19 +00:00
pass = false ; break ;
default :
2022-03-12 14:05:57 +00:00
if ( R . T ) { }
if ( ! pass || opts . WTF ) throw new Error ( "Unexpected record 0x" + RT . toString ( 16 ) ) ;
2017-02-03 20:50:45 +00:00
}
} ) ;
return s ;
}
function write _BrtBeginSst ( sst , o ) {
if ( ! o ) o = new _buf ( 8 ) ;
o . write _shift ( 4 , sst . Count ) ;
o . write _shift ( 4 , sst . Unique ) ;
return o ;
}
var write _BrtSSTItem = write _RichStr ;
2018-01-23 09:07:51 +00:00
function write _sst _bin ( sst /*::, opts*/ ) {
2017-02-03 20:50:45 +00:00
var ba = buf _array ( ) ;
2022-03-12 14:05:57 +00:00
write _record ( ba , 0x009F /* BrtBeginSst */ , write _BrtBeginSst ( sst ) ) ;
for ( var i = 0 ; i < sst . length ; ++ i ) write _record ( ba , 0x0013 /* BrtSSTItem */ , write _BrtSSTItem ( sst [ i ] ) ) ;
2017-04-08 06:55:35 +00:00
/* FRTSST */
2022-03-12 14:05:57 +00:00
write _record ( ba , 0x00A0 /* BrtEndSst */ ) ;
2017-02-03 20:50:45 +00:00
return ba . end ( ) ;
}
2017-02-10 19:23:01 +00:00
function _JS2ANSI ( str /*:string*/ ) /*:Array<number>*/ {
2022-03-12 14:05:57 +00:00
if ( typeof $cptable !== 'undefined' ) return $cptable . utils . encode ( current _ansi , str ) ;
2017-12-30 05:40:35 +00:00
var o /*:Array<number>*/ = [ ] , oo = str . split ( "" ) ;
2017-02-10 19:23:01 +00:00
for ( var i = 0 ; i < oo . length ; ++ i ) o [ i ] = oo [ i ] . charCodeAt ( 0 ) ;
return o ;
}
2017-02-03 20:50:45 +00:00
/* [MS-OFFCRYPTO] 2.1.4 Version */
2017-05-13 18:21:22 +00:00
function parse _CRYPTOVersion ( blob , length /*:?number*/ ) {
var o /*:any*/ = { } ;
2017-02-03 20:50:45 +00:00
o . Major = blob . read _shift ( 2 ) ;
o . Minor = blob . read _shift ( 2 ) ;
2017-05-13 18:21:22 +00:00
/*:: if(length == null) return o; */
if ( length >= 4 ) blob . l += length - 4 ;
2017-02-03 20:50:45 +00:00
return o ;
}
2017-04-13 01:29:38 +00:00
/* [MS-OFFCRYPTO] 2.1.5 DataSpaceVersionInfo */
2018-01-23 09:07:51 +00:00
function parse _DataSpaceVersionInfo ( blob ) {
2017-04-13 01:29:38 +00:00
var o = { } ;
o . id = blob . read _shift ( 0 , 'lpp4' ) ;
o . R = parse _CRYPTOVersion ( blob , 4 ) ;
o . U = parse _CRYPTOVersion ( blob , 4 ) ;
o . W = parse _CRYPTOVersion ( blob , 4 ) ;
return o ;
}
/* [MS-OFFCRYPTO] 2.1.6.1 DataSpaceMapEntry Structure */
function parse _DataSpaceMapEntry ( blob ) {
var len = blob . read _shift ( 4 ) ;
var end = blob . l + len - 4 ;
var o = { } ;
var cnt = blob . read _shift ( 4 ) ;
2017-12-30 05:40:35 +00:00
var comps /*:Array<{t:number, v:string}>*/ = [ ] ;
/* [MS-OFFCRYPTO] 2.1.6.2 DataSpaceReferenceComponent Structure */
while ( cnt -- > 0 ) comps . push ( { t : blob . read _shift ( 4 ) , v : blob . read _shift ( 0 , 'lpp4' ) } ) ;
2017-04-13 01:29:38 +00:00
o . name = blob . read _shift ( 0 , 'lpp4' ) ;
o . comps = comps ;
2017-12-01 05:48:10 +00:00
if ( blob . l != end ) throw new Error ( "Bad DataSpaceMapEntry: " + blob . l + " != " + end ) ;
2017-04-13 01:29:38 +00:00
return o ;
}
/* [MS-OFFCRYPTO] 2.1.6 DataSpaceMap */
2018-01-23 09:07:51 +00:00
function parse _DataSpaceMap ( blob ) {
2017-04-13 01:29:38 +00:00
var o = [ ] ;
blob . l += 4 ; // must be 0x8
var cnt = blob . read _shift ( 4 ) ;
while ( cnt -- > 0 ) o . push ( parse _DataSpaceMapEntry ( blob ) ) ;
return o ;
}
/* [MS-OFFCRYPTO] 2.1.7 DataSpaceDefinition */
2018-01-23 09:07:51 +00:00
function parse _DataSpaceDefinition ( blob ) /*:Array<string>*/ {
2017-12-30 05:40:35 +00:00
var o /*:Array<string>*/ = [ ] ;
2017-04-13 01:29:38 +00:00
blob . l += 4 ; // must be 0x8
var cnt = blob . read _shift ( 4 ) ;
while ( cnt -- > 0 ) o . push ( blob . read _shift ( 0 , 'lpp4' ) ) ;
return o ;
}
/* [MS-OFFCRYPTO] 2.1.8 DataSpaceDefinition */
2018-01-23 09:07:51 +00:00
function parse _TransformInfoHeader ( blob ) {
2017-02-03 20:50:45 +00:00
var o = { } ;
2018-01-23 09:07:51 +00:00
/*var len = */ blob . read _shift ( 4 ) ;
2017-04-13 01:29:38 +00:00
blob . l += 4 ; // must be 0x1
o . id = blob . read _shift ( 0 , 'lpp4' ) ;
o . name = blob . read _shift ( 0 , 'lpp4' ) ;
o . R = parse _CRYPTOVersion ( blob , 4 ) ;
o . U = parse _CRYPTOVersion ( blob , 4 ) ;
o . W = parse _CRYPTOVersion ( blob , 4 ) ;
return o ;
}
2017-02-03 20:50:45 +00:00
2018-01-23 09:07:51 +00:00
function parse _Primary ( blob ) {
2017-04-13 01:29:38 +00:00
/* [MS-OFFCRYPTO] 2.2.6 IRMDSTransformInfo */
var hdr = parse _TransformInfoHeader ( blob ) ;
/* [MS-OFFCRYPTO] 2.1.9 EncryptionTransformInfo */
hdr . ename = blob . read _shift ( 0 , '8lpp4' ) ;
hdr . blksz = blob . read _shift ( 4 ) ;
hdr . cmode = blob . read _shift ( 4 ) ;
if ( blob . read _shift ( 4 ) != 0x04 ) throw new Error ( "Bad !Primary record" ) ;
return hdr ;
}
2017-02-03 20:50:45 +00:00
2017-04-13 01:29:38 +00:00
/* [MS-OFFCRYPTO] 2.3.2 Encryption Header */
function parse _EncryptionHeader ( blob , length /*:number*/ ) {
var tgt = blob . l + length ;
var o = { } ;
o . Flags = ( blob . read _shift ( 4 ) & 0x3F ) ;
blob . l += 4 ;
2017-02-03 20:50:45 +00:00
o . AlgID = blob . read _shift ( 4 ) ;
2017-04-13 01:29:38 +00:00
var valid = false ;
2017-02-03 20:50:45 +00:00
switch ( o . AlgID ) {
2017-04-13 01:29:38 +00:00
case 0x660E : case 0x660F : case 0x6610 : valid = ( o . Flags == 0x24 ) ; break ;
case 0x6801 : valid = ( o . Flags == 0x04 ) ; break ;
case 0 : valid = ( o . Flags == 0x10 || o . Flags == 0x04 || o . Flags == 0x24 ) ; break ;
2017-02-03 20:50:45 +00:00
default : throw 'Unrecognized encryption algorithm: ' + o . AlgID ;
}
2017-04-13 01:29:38 +00:00
if ( ! valid ) throw new Error ( "Encryption Flags/AlgID mismatch" ) ;
o . AlgIDHash = blob . read _shift ( 4 ) ;
o . KeySize = blob . read _shift ( 4 ) ;
o . ProviderType = blob . read _shift ( 4 ) ;
blob . l += 8 ;
2017-12-15 01:18:40 +00:00
o . CSPName = blob . read _shift ( ( tgt - blob . l ) >> 1 , 'utf16le' ) ;
2017-04-13 01:29:38 +00:00
blob . l = tgt ;
2017-02-03 20:50:45 +00:00
return o ;
}
/* [MS-OFFCRYPTO] 2.3.3 Encryption Verifier */
2017-02-10 19:23:01 +00:00
function parse _EncryptionVerifier ( blob , length /*:number*/ ) {
2017-12-15 01:18:40 +00:00
var o = { } , tgt = blob . l + length ;
2017-04-13 01:29:38 +00:00
blob . l += 4 ; // SaltSize must be 0x10
o . Salt = blob . slice ( blob . l , blob . l + 16 ) ; blob . l += 16 ;
o . Verifier = blob . slice ( blob . l , blob . l + 16 ) ; blob . l += 16 ;
2018-01-23 09:07:51 +00:00
/*var sz = */ blob . read _shift ( 4 ) ;
2017-12-15 01:18:40 +00:00
o . VerifierHash = blob . slice ( blob . l , tgt ) ; blob . l = tgt ;
2017-04-13 01:29:38 +00:00
return o ;
}
/* [MS-OFFCRYPTO] 2.3.4.* EncryptionInfo Stream */
2018-01-23 09:07:51 +00:00
function parse _EncryptionInfo ( blob ) {
2017-04-13 01:29:38 +00:00
var vers = parse _CRYPTOVersion ( blob ) ;
switch ( vers . Minor ) {
2017-10-17 00:14:32 +00:00
case 0x02 : return [ vers . Minor , parse _EncInfoStd ( blob , vers ) ] ;
case 0x03 : return [ vers . Minor , parse _EncInfoExt ( blob , vers ) ] ;
case 0x04 : return [ vers . Minor , parse _EncInfoAgl ( blob , vers ) ] ;
2017-04-13 01:29:38 +00:00
}
2017-09-05 05:26:50 +00:00
throw new Error ( "ECMA-376 Encrypted file unrecognized Version: " + vers . Minor ) ;
2017-02-03 20:50:45 +00:00
}
2017-04-13 01:29:38 +00:00
/* [MS-OFFCRYPTO] 2.3.4.5 EncryptionInfo Stream (Standard Encryption) */
2018-01-23 09:07:51 +00:00
function parse _EncInfoStd ( blob /*::, vers*/ ) {
2017-04-13 01:29:38 +00:00
var flags = blob . read _shift ( 4 ) ;
if ( ( flags & 0x3F ) != 0x24 ) throw new Error ( "EncryptionInfo mismatch" ) ;
var sz = blob . read _shift ( 4 ) ;
2018-01-23 09:07:51 +00:00
//var tgt = blob.l + sz;
2017-04-13 01:29:38 +00:00
var hdr = parse _EncryptionHeader ( blob , sz ) ;
var verifier = parse _EncryptionVerifier ( blob , blob . length - blob . l ) ;
return { t : "Std" , h : hdr , v : verifier } ;
}
/* [MS-OFFCRYPTO] 2.3.4.6 EncryptionInfo Stream (Extensible Encryption) */
2018-01-23 09:07:51 +00:00
function parse _EncInfoExt ( /*::blob, vers*/ ) { throw new Error ( "File is password-protected: ECMA-376 Extensible" ) ; }
2017-04-13 01:29:38 +00:00
/* [MS-OFFCRYPTO] 2.3.4.10 EncryptionInfo Stream (Agile Encryption) */
2018-01-23 09:07:51 +00:00
function parse _EncInfoAgl ( blob /*::, vers*/ ) {
2017-12-01 05:48:10 +00:00
var KeyData = [ "saltSize" , "blockSize" , "keyBits" , "hashSize" , "cipherAlgorithm" , "cipherChaining" , "hashAlgorithm" , "saltValue" ] ;
2017-10-17 00:14:32 +00:00
blob . l += 4 ;
2017-12-01 05:48:10 +00:00
var xml = blob . read _shift ( blob . length - blob . l , 'utf8' ) ;
var o = { } ;
2018-01-23 09:07:51 +00:00
xml . replace ( tagregex , function xml _agile ( x ) {
2017-12-01 05:48:10 +00:00
var y /*:any*/ = parsexmltag ( x ) ;
switch ( strip _ns ( y [ 0 ] ) ) {
case '<?xml' : break ;
case '<encryption' : case '</encryption>' : break ;
case '<keyData' : KeyData . forEach ( function ( k ) { o [ k ] = y [ k ] ; } ) ; break ;
case '<dataIntegrity' : o . encryptedHmacKey = y . encryptedHmacKey ; o . encryptedHmacValue = y . encryptedHmacValue ; break ;
case '<keyEncryptors>' : case '<keyEncryptors' : o . encs = [ ] ; break ;
case '</keyEncryptors>' : break ;
case '<keyEncryptor' : o . uri = y . uri ; break ;
case '</keyEncryptor>' : break ;
case '<encryptedKey' : o . encs . push ( y ) ; break ;
default : throw y [ 0 ] ;
}
} ) ;
return o ;
2017-10-17 00:14:32 +00:00
}
2017-04-13 01:29:38 +00:00
2017-02-03 20:50:45 +00:00
/* [MS-OFFCRYPTO] 2.3.5.1 RC4 CryptoAPI Encryption Header */
2017-02-10 19:23:01 +00:00
function parse _RC4CryptoHeader ( blob , length /*:number*/ ) {
2017-02-03 20:50:45 +00:00
var o = { } ;
2017-04-13 01:29:38 +00:00
var vers = o . EncryptionVersionInfo = parse _CRYPTOVersion ( blob , 4 ) ; length -= 4 ;
2017-07-26 08:35:28 +00:00
if ( vers . Minor != 2 ) throw new Error ( 'unrecognized minor version code: ' + vers . Minor ) ;
if ( vers . Major > 4 || vers . Major < 2 ) throw new Error ( 'unrecognized major version code: ' + vers . Major ) ;
2017-02-03 20:50:45 +00:00
o . Flags = blob . read _shift ( 4 ) ; length -= 4 ;
var sz = blob . read _shift ( 4 ) ; length -= 4 ;
o . EncryptionHeader = parse _EncryptionHeader ( blob , sz ) ; length -= sz ;
o . EncryptionVerifier = parse _EncryptionVerifier ( blob , length ) ;
return o ;
}
/* [MS-OFFCRYPTO] 2.3.6.1 RC4 Encryption Header */
2018-01-23 09:07:51 +00:00
function parse _RC4Header ( blob /*::, length*/ ) {
2017-02-03 20:50:45 +00:00
var o = { } ;
2018-01-23 09:07:51 +00:00
var vers = o . EncryptionVersionInfo = parse _CRYPTOVersion ( blob , 4 ) ;
2017-02-03 20:50:45 +00:00
if ( vers . Major != 1 || vers . Minor != 1 ) throw 'unrecognized version code ' + vers . Major + ' : ' + vers . Minor ;
o . Salt = blob . read _shift ( 16 ) ;
o . EncryptedVerifier = blob . read _shift ( 16 ) ;
o . EncryptedVerifierHash = blob . read _shift ( 16 ) ;
return o ;
}
/* [MS-OFFCRYPTO] 2.3.7.1 Binary Document Password Verifier Derivation */
2017-02-10 19:23:01 +00:00
function crypto _CreatePasswordVerifier _Method1 ( Password /*:string*/ ) {
2017-02-03 20:50:45 +00:00
var Verifier = 0x0000 , PasswordArray ;
var PasswordDecoded = _JS2ANSI ( Password ) ;
var len = PasswordDecoded . length + 1 , i , PasswordByte ;
var Intermediate1 , Intermediate2 , Intermediate3 ;
PasswordArray = new _raw _buf ( len ) ;
PasswordArray [ 0 ] = PasswordDecoded . length ;
for ( i = 1 ; i != len ; ++ i ) PasswordArray [ i ] = PasswordDecoded [ i - 1 ] ;
for ( i = len - 1 ; i >= 0 ; -- i ) {
PasswordByte = PasswordArray [ i ] ;
Intermediate1 = ( ( Verifier & 0x4000 ) === 0x0000 ) ? 0 : 1 ;
Intermediate2 = ( Verifier << 1 ) & 0x7FFF ;
Intermediate3 = Intermediate1 | Intermediate2 ;
Verifier = Intermediate3 ^ PasswordByte ;
}
return Verifier ^ 0xCE4B ;
}
/* [MS-OFFCRYPTO] 2.3.7.2 Binary Document XOR Array Initialization */
2022-03-12 14:05:57 +00:00
var crypto _CreateXorArray _Method1 = /*#__PURE__*/ ( function ( ) {
2017-02-03 20:50:45 +00:00
var PadArray = [ 0xBB , 0xFF , 0xFF , 0xBA , 0xFF , 0xFF , 0xB9 , 0x80 , 0x00 , 0xBE , 0x0F , 0x00 , 0xBF , 0x0F , 0x00 ] ;
var InitialCode = [ 0xE1F0 , 0x1D0F , 0xCC9C , 0x84C0 , 0x110C , 0x0E10 , 0xF1CE , 0x313E , 0x1872 , 0xE139 , 0xD40F , 0x84F9 , 0x280C , 0xA96A , 0x4EC3 ] ;
var XorMatrix = [ 0xAEFC , 0x4DD9 , 0x9BB2 , 0x2745 , 0x4E8A , 0x9D14 , 0x2A09 , 0x7B61 , 0xF6C2 , 0xFDA5 , 0xEB6B , 0xC6F7 , 0x9DCF , 0x2BBF , 0x4563 , 0x8AC6 , 0x05AD , 0x0B5A , 0x16B4 , 0x2D68 , 0x5AD0 , 0x0375 , 0x06EA , 0x0DD4 , 0x1BA8 , 0x3750 , 0x6EA0 , 0xDD40 , 0xD849 , 0xA0B3 , 0x5147 , 0xA28E , 0x553D , 0xAA7A , 0x44D5 , 0x6F45 , 0xDE8A , 0xAD35 , 0x4A4B , 0x9496 , 0x390D , 0x721A , 0xEB23 , 0xC667 , 0x9CEF , 0x29FF , 0x53FE , 0xA7FC , 0x5FD9 , 0x47D3 , 0x8FA6 , 0x0F6D , 0x1EDA , 0x3DB4 , 0x7B68 , 0xF6D0 , 0xB861 , 0x60E3 , 0xC1C6 , 0x93AD , 0x377B , 0x6EF6 , 0xDDEC , 0x45A0 , 0x8B40 , 0x06A1 , 0x0D42 , 0x1A84 , 0x3508 , 0x6A10 , 0xAA51 , 0x4483 , 0x8906 , 0x022D , 0x045A , 0x08B4 , 0x1168 , 0x76B4 , 0xED68 , 0xCAF1 , 0x85C3 , 0x1BA7 , 0x374E , 0x6E9C , 0x3730 , 0x6E60 , 0xDCC0 , 0xA9A1 , 0x4363 , 0x86C6 , 0x1DAD , 0x3331 , 0x6662 , 0xCCC4 , 0x89A9 , 0x0373 , 0x06E6 , 0x0DCC , 0x1021 , 0x2042 , 0x4084 , 0x8108 , 0x1231 , 0x2462 , 0x48C4 ] ;
var Ror = function ( Byte ) { return ( ( Byte / 2 ) | ( Byte * 128 ) ) & 0xFF ; } ;
var XorRor = function ( byte1 , byte2 ) { return Ror ( byte1 ^ byte2 ) ; } ;
var CreateXorKey _Method1 = function ( Password ) {
var XorKey = InitialCode [ Password . length - 1 ] ;
var CurrentElement = 0x68 ;
for ( var i = Password . length - 1 ; i >= 0 ; -- i ) {
var Char = Password [ i ] ;
for ( var j = 0 ; j != 7 ; ++ j ) {
if ( Char & 0x40 ) XorKey ^= XorMatrix [ CurrentElement ] ;
Char *= 2 ; -- CurrentElement ;
}
}
return XorKey ;
} ;
2017-02-10 19:23:01 +00:00
return function ( password /*:string*/ ) {
2017-02-03 20:50:45 +00:00
var Password = _JS2ANSI ( password ) ;
var XorKey = CreateXorKey _Method1 ( Password ) ;
var Index = Password . length ;
var ObfuscationArray = new _raw _buf ( 16 ) ;
for ( var i = 0 ; i != 16 ; ++ i ) ObfuscationArray [ i ] = 0x00 ;
var Temp , PasswordLastChar , PadIndex ;
if ( ( Index & 1 ) === 1 ) {
Temp = XorKey >> 8 ;
ObfuscationArray [ Index ] = XorRor ( PadArray [ 0 ] , Temp ) ;
-- Index ;
Temp = XorKey & 0xFF ;
PasswordLastChar = Password [ Password . length - 1 ] ;
ObfuscationArray [ Index ] = XorRor ( PasswordLastChar , Temp ) ;
}
while ( Index > 0 ) {
-- Index ;
Temp = XorKey >> 8 ;
ObfuscationArray [ Index ] = XorRor ( Password [ Index ] , Temp ) ;
-- Index ;
Temp = XorKey & 0xFF ;
ObfuscationArray [ Index ] = XorRor ( Password [ Index ] , Temp ) ;
}
Index = 15 ;
PadIndex = 15 - Password . length ;
while ( PadIndex > 0 ) {
Temp = XorKey >> 8 ;
ObfuscationArray [ Index ] = XorRor ( PadArray [ PadIndex ] , Temp ) ;
-- Index ;
-- PadIndex ;
Temp = XorKey & 0xFF ;
ObfuscationArray [ Index ] = XorRor ( Password [ Index ] , Temp ) ;
-- Index ;
-- PadIndex ;
}
return ObfuscationArray ;
} ;
} ) ( ) ;
/* [MS-OFFCRYPTO] 2.3.7.3 Binary Document XOR Data Transformation Method 1 */
2017-02-10 19:23:01 +00:00
var crypto _DecryptData _Method1 = function ( password /*:string*/ , Data , XorArrayIndex , XorArray , O ) {
2017-02-03 20:50:45 +00:00
/* If XorArray is set, use it; if O is not set, make changes in-place */
if ( ! O ) O = Data ;
if ( ! XorArray ) XorArray = crypto _CreateXorArray _Method1 ( password ) ;
var Index , Value ;
for ( Index = 0 ; Index != Data . length ; ++ Index ) {
Value = Data [ Index ] ;
Value ^= XorArray [ XorArrayIndex ] ;
Value = ( ( Value >> 5 ) | ( Value << 3 ) ) & 0xFF ;
O [ Index ] = Value ;
++ XorArrayIndex ;
}
return [ O , XorArrayIndex , XorArray ] ;
} ;
2017-02-10 19:23:01 +00:00
var crypto _MakeXorDecryptor = function ( password /*:string*/ ) {
2017-02-03 20:50:45 +00:00
var XorArrayIndex = 0 , XorArray = crypto _CreateXorArray _Method1 ( password ) ;
return function ( Data ) {
2017-02-10 19:23:01 +00:00
var O = crypto _DecryptData _Method1 ( "" , Data , XorArrayIndex , XorArray ) ;
2017-02-03 20:50:45 +00:00
XorArrayIndex = O [ 1 ] ;
return O [ 0 ] ;
} ;
} ;
/* 2.5.343 */
function parse _XORObfuscation ( blob , length , opts , out ) {
2017-02-10 19:23:01 +00:00
var o = ( { key : parseuint16 ( blob ) , verificationBytes : parseuint16 ( blob ) } /*:any*/ ) ;
2017-02-03 20:50:45 +00:00
if ( opts . password ) o . verifier = crypto _CreatePasswordVerifier _Method1 ( opts . password ) ;
out . valid = o . verificationBytes === o . verifier ;
2017-10-17 00:14:32 +00:00
if ( out . valid ) out . insitu = crypto _MakeXorDecryptor ( opts . password ) ;
2017-02-03 20:50:45 +00:00
return o ;
}
/* 2.4.117 */
2017-02-10 19:23:01 +00:00
function parse _FilePassHeader ( blob , length /*:number*/ , oo ) {
2017-02-03 20:50:45 +00:00
var o = oo || { } ; o . Info = blob . read _shift ( 2 ) ; blob . l -= 2 ;
if ( o . Info === 1 ) o . Data = parse _RC4Header ( blob , length ) ;
else o . Data = parse _RC4CryptoHeader ( blob , length ) ;
return o ;
}
2017-02-10 19:23:01 +00:00
function parse _FilePass ( blob , length /*:number*/ , opts ) {
2017-08-05 06:32:57 +00:00
var o = ( { Type : opts . biff >= 8 ? blob . read _shift ( 2 ) : 0 } /*:any*/ ) ; /* wEncryptionType */
2017-02-03 20:50:45 +00:00
if ( o . Type ) parse _FilePassHeader ( blob , length - 2 , o ) ;
2018-02-21 07:01:34 +00:00
else parse _XORObfuscation ( blob , opts . biff >= 8 ? length : length - 2 , opts , o ) ;
2017-02-03 20:50:45 +00:00
return o ;
}
2022-03-12 14:05:57 +00:00
var RTF = /*#__PURE__*/ ( function ( ) {
2017-08-05 06:32:57 +00:00
function rtf _to _sheet ( d /*:RawData*/ , opts ) /*:Worksheet*/ {
switch ( opts . type ) {
2022-03-22 20:08:08 +00:00
case 'base64' : return rtf _to _sheet _str ( Base64 _decode ( d ) , opts ) ;
2017-08-05 06:32:57 +00:00
case 'binary' : return rtf _to _sheet _str ( d , opts ) ;
2021-10-13 07:20:25 +00:00
case 'buffer' : return rtf _to _sheet _str ( has _buf && Buffer . isBuffer ( d ) ? d . toString ( 'binary' ) : a2s ( d ) , opts ) ;
2017-08-05 06:32:57 +00:00
case 'array' : return rtf _to _sheet _str ( cc2str ( d ) , opts ) ;
}
throw new Error ( "Unrecognized type " + opts . type ) ;
}
2021-10-13 07:20:25 +00:00
/* TODO: this is a stub */
2017-08-05 06:32:57 +00:00
function rtf _to _sheet _str ( str /*:string*/ , opts ) /*:Worksheet*/ {
2017-10-02 08:15:36 +00:00
var o = opts || { } ;
2017-11-20 01:51:14 +00:00
var ws /*:Worksheet*/ = o . dense ? ( [ ] /*:any*/ ) : ( { } /*:any*/ ) ;
2017-10-02 08:15:36 +00:00
2022-04-25 09:02:14 +00:00
var rows = str . match ( /\\trowd[\s\S]*?\\row\b/g ) ;
2021-10-13 07:20:25 +00:00
if ( ! rows . length ) throw new Error ( "RTF missing table" ) ;
var range /*:Range*/ = ( { s : { c : 0 , r : 0 } , e : { c : 0 , r : rows . length - 1 } } /*:any*/ ) ;
rows . forEach ( function ( rowtf , R ) {
if ( Array . isArray ( ws ) ) ws [ R ] = [ ] ;
2022-04-25 09:02:14 +00:00
var rtfre = /\\[\w\-]+\b/g ;
2021-10-13 07:20:25 +00:00
var last _index = 0 ;
var res ;
var C = - 1 ;
2022-04-25 09:02:14 +00:00
var payload = [ ] ;
2021-10-13 07:20:25 +00:00
while ( ( res = rtfre . exec ( rowtf ) ) ) {
2022-04-25 09:02:14 +00:00
var data = rowtf . slice ( last _index , rtfre . lastIndex - res [ 0 ] . length ) ;
if ( data . charCodeAt ( 0 ) == 0x20 ) data = data . slice ( 1 ) ;
if ( data . length ) payload . push ( data ) ;
2021-10-13 07:20:25 +00:00
switch ( res [ 0 ] ) {
case "\\cell" :
++ C ;
2022-04-25 09:02:14 +00:00
if ( payload . length ) {
2021-10-13 07:20:25 +00:00
// TODO: value parsing, including codepage adjustments
2022-04-25 09:02:14 +00:00
var cell = { v : payload . join ( "" ) , t : "s" } ;
2021-10-13 07:20:25 +00:00
if ( Array . isArray ( ws ) ) ws [ R ] [ C ] = cell ;
else ws [ encode _cell ( { r : R , c : C } ) ] = cell ;
}
2022-04-25 09:02:14 +00:00
payload = [ ] ;
break ;
case "\\par" : // NOTE: Excel serializes both "\r" and "\n" as "\\par"
payload . push ( "\n" ) ;
2021-10-13 07:20:25 +00:00
break ;
}
last _index = rtfre . lastIndex ;
}
if ( C > range . e . c ) range . e . c = C ;
} ) ;
2017-10-02 08:15:36 +00:00
ws [ '!ref' ] = encode _range ( range ) ;
return ws ;
2017-08-05 06:32:57 +00:00
}
function rtf _to _workbook ( d /*:RawData*/ , opts ) /*:Workbook*/ { return sheet _to _workbook ( rtf _to _sheet ( d , opts ) , opts ) ; }
2017-10-02 08:15:36 +00:00
/* TODO: this is a stub */
2018-01-23 09:07:51 +00:00
function sheet _to _rtf ( ws /*:Worksheet*/ /*::, opts*/ ) /*:string*/ {
2017-10-02 08:15:36 +00:00
var o = [ "{\\rtf1\\ansi" ] ;
var r = safe _decode _range ( ws [ '!ref' ] ) , cell /*:Cell*/ ;
var dense = Array . isArray ( ws ) ;
for ( var R = r . s . r ; R <= r . e . r ; ++ R ) {
o . push ( "\\trowd\\trautofit1" ) ;
for ( var C = r . s . c ; C <= r . e . c ; ++ C ) o . push ( "\\cellx" + ( C + 1 ) ) ;
o . push ( "\\pard\\intbl" ) ;
for ( C = r . s . c ; C <= r . e . c ; ++ C ) {
var coord = encode _cell ( { r : R , c : C } ) ;
cell = dense ? ( ws [ R ] || [ ] ) [ C ] : ws [ coord ] ;
if ( ! cell || cell . v == null && ( ! cell . f || cell . F ) ) continue ;
2022-04-25 09:02:14 +00:00
o . push ( " " + ( cell . w || ( format _cell ( cell ) , cell . w ) ) . replace ( /[\r\n]/g , "\\par " ) ) ;
2017-10-02 08:15:36 +00:00
o . push ( "\\cell" ) ;
}
o . push ( "\\pard\\intbl\\row" ) ;
}
return o . join ( "" ) + "}" ;
}
2017-08-05 06:32:57 +00:00
return {
to _workbook : rtf _to _workbook ,
to _sheet : rtf _to _sheet ,
from _sheet : sheet _to _rtf
} ;
} ) ( ) ;
2017-02-03 20:50:45 +00:00
function hex2RGB ( h ) {
2018-01-11 08:01:25 +00:00
var o = h . slice ( h [ 0 ] === "#" ? 1 : 0 ) . slice ( 0 , 6 ) ;
return [ parseInt ( o . slice ( 0 , 2 ) , 16 ) , parseInt ( o . slice ( 2 , 4 ) , 16 ) , parseInt ( o . slice ( 4 , 6 ) , 16 ) ] ;
2017-02-03 20:50:45 +00:00
}
function rgb2Hex ( rgb ) {
for ( var i = 0 , o = 1 ; i != 3 ; ++ i ) o = o * 256 + ( rgb [ i ] > 255 ? 255 : rgb [ i ] < 0 ? 0 : rgb [ i ] ) ;
2018-01-11 08:01:25 +00:00
return o . toString ( 16 ) . toUpperCase ( ) . slice ( 1 ) ;
2017-02-03 20:50:45 +00:00
}
function rgb2HSL ( rgb ) {
var R = rgb [ 0 ] / 255 , G = rgb [ 1 ] / 255 , B = rgb [ 2 ] / 255 ;
var M = Math . max ( R , G , B ) , m = Math . min ( R , G , B ) , C = M - m ;
if ( C === 0 ) return [ 0 , 0 , R ] ;
var H6 = 0 , S = 0 , L2 = ( M + m ) ;
S = C / ( L2 > 1 ? 2 - L2 : L2 ) ;
switch ( M ) {
case R : H6 = ( ( G - B ) / C + 6 ) % 6 ; break ;
case G : H6 = ( ( B - R ) / C + 2 ) ; break ;
case B : H6 = ( ( R - G ) / C + 4 ) ; break ;
}
return [ H6 / 6 , S , L2 / 2 ] ;
}
function hsl2RGB ( hsl ) {
var H = hsl [ 0 ] , S = hsl [ 1 ] , L = hsl [ 2 ] ;
var C = S * 2 * ( L < 0.5 ? L : 1 - L ) , m = L - C / 2 ;
var rgb = [ m , m , m ] , h6 = 6 * H ;
var X ;
if ( S !== 0 ) switch ( h6 | 0 ) {
case 0 : case 6 : X = C * h6 ; rgb [ 0 ] += C ; rgb [ 1 ] += X ; break ;
case 1 : X = C * ( 2 - h6 ) ; rgb [ 0 ] += X ; rgb [ 1 ] += C ; break ;
case 2 : X = C * ( h6 - 2 ) ; rgb [ 1 ] += C ; rgb [ 2 ] += X ; break ;
case 3 : X = C * ( 4 - h6 ) ; rgb [ 1 ] += X ; rgb [ 2 ] += C ; break ;
case 4 : X = C * ( h6 - 4 ) ; rgb [ 2 ] += C ; rgb [ 0 ] += X ; break ;
case 5 : X = C * ( 6 - h6 ) ; rgb [ 2 ] += X ; rgb [ 0 ] += C ; break ;
}
for ( var i = 0 ; i != 3 ; ++ i ) rgb [ i ] = Math . round ( rgb [ i ] * 255 ) ;
return rgb ;
}
/* 18.8.3 bgColor tint algorithm */
function rgb _tint ( hex , tint ) {
if ( tint === 0 ) return hex ;
var hsl = rgb2HSL ( hex2RGB ( hex ) ) ;
if ( tint < 0 ) hsl [ 2 ] = hsl [ 2 ] * ( 1 + tint ) ;
else hsl [ 2 ] = 1 - ( 1 - hsl [ 2 ] ) * ( 1 - tint ) ;
return rgb2Hex ( hsl2RGB ( hsl ) ) ;
}
/* 18.3.1.13 width calculations */
2017-03-20 09:02:25 +00:00
/* [MS-OI29500] 2.1.595 Column Width & Formatting */
2017-03-28 22:03:03 +00:00
var DEF _MDW = 6 , MAX _MDW = 15 , MIN _MDW = 1 , MDW = DEF _MDW ;
2017-03-20 09:02:25 +00:00
function width2px ( width ) { return Math . floor ( ( width + ( Math . round ( 128 / MDW ) ) / 256 ) * MDW ) ; }
function px2char ( px ) { return ( Math . floor ( ( px - 5 ) / MDW * 100 + 0.5 ) ) / 100 ; }
function char2width ( chr ) { return ( Math . round ( ( chr * MDW + 5 ) / MDW * 256 ) ) / 256 ; }
2018-01-23 09:07:51 +00:00
//function px2char_(px) { return (((px - 5)/MDW * 100 + 0.5))/100; }
//function char2width_(chr) { return (((chr * MDW + 5)/MDW*256))/256; }
2017-02-03 20:50:45 +00:00
function cycle _width ( collw ) { return char2width ( px2char ( width2px ( collw ) ) ) ; }
2017-03-20 09:02:25 +00:00
/* XLSX/XLSB/XLS specify width in units of MDW */
function find _mdw _colw ( collw ) {
2017-06-10 01:47:42 +00:00
var delta = Math . abs ( collw - cycle _width ( collw ) ) , _MDW = MDW ;
if ( delta > 0.005 ) for ( MDW = MIN _MDW ; MDW < MAX _MDW ; ++ MDW ) if ( Math . abs ( collw - cycle _width ( collw ) ) <= delta ) { delta = Math . abs ( collw - cycle _width ( collw ) ) ; _MDW = MDW ; }
2017-03-20 09:02:25 +00:00
MDW = _MDW ;
}
/* XLML specifies width in terms of pixels */
2018-01-23 09:07:51 +00:00
/ * f u n c t i o n f i n d _ m d w _ w p x ( w p x ) {
2017-03-20 09:02:25 +00:00
var delta = Infinity , guess = 0 , _MDW = MIN _MDW ;
for ( MDW = MIN _MDW ; MDW < MAX _MDW ; ++ MDW ) {
guess = char2width _ ( px2char _ ( wpx ) ) * 256 ;
guess = ( guess ) % 1 ;
if ( guess > 0.5 ) guess -- ;
if ( Math . abs ( guess ) < delta ) { delta = Math . abs ( guess ) ; _MDW = MDW ; }
2017-02-03 20:50:45 +00:00
}
2017-03-20 09:02:25 +00:00
MDW = _MDW ;
2018-01-23 09:07:51 +00:00
} * /
2017-03-20 09:02:25 +00:00
function process _col ( coll /*:ColInfo*/ ) {
if ( coll . width ) {
coll . wpx = width2px ( coll . width ) ;
coll . wch = px2char ( coll . wpx ) ;
coll . MDW = MDW ;
} else if ( coll . wpx ) {
coll . wch = px2char ( coll . wpx ) ;
coll . width = char2width ( coll . wch ) ;
coll . MDW = MDW ;
2017-04-28 07:28:03 +00:00
} else if ( typeof coll . wch == 'number' ) {
coll . width = char2width ( coll . wch ) ;
coll . wpx = width2px ( coll . width ) ;
coll . MDW = MDW ;
2017-03-20 09:02:25 +00:00
}
if ( coll . customWidth ) delete coll . customWidth ;
2017-02-03 20:50:45 +00:00
}
2017-04-28 07:28:03 +00:00
var DEF _PPI = 96 , PPI = DEF _PPI ;
function px2pt ( px ) { return px * 96 / PPI ; }
function pt2px ( pt ) { return pt * PPI / 96 ; }
2017-03-31 03:57:11 +00:00
2017-02-03 20:50:45 +00:00
/* [MS-EXSPXML3] 2.4.54 ST_enmPattern */
var XLMLPatternTypeMap = {
"None" : "none" ,
"Solid" : "solid" ,
"Gray50" : "mediumGray" ,
"Gray75" : "darkGray" ,
"Gray25" : "lightGray" ,
"HorzStripe" : "darkHorizontal" ,
"VertStripe" : "darkVertical" ,
"ReverseDiagStripe" : "darkDown" ,
"DiagStripe" : "darkUp" ,
"DiagCross" : "darkGrid" ,
"ThickDiagCross" : "darkTrellis" ,
"ThinHorzStripe" : "lightHorizontal" ,
"ThinVertStripe" : "lightVertical" ,
"ThinReverseDiagStripe" : "lightDown" ,
"ThinHorzCross" : "lightGrid"
} ;
2017-03-19 06:50:30 +00:00
/* 18.8.5 borders CT_Borders */
function parse _borders ( t , styles , themes , opts ) {
styles . Borders = [ ] ;
2019-11-15 01:46:49 +00:00
var border = { } ;
2018-05-05 06:34:37 +00:00
var pass = false ;
2019-11-01 03:09:14 +00:00
( t [ 0 ] . match ( tagregex ) || [ ] ) . forEach ( function ( x ) {
2017-03-19 06:50:30 +00:00
var y = parsexmltag ( x ) ;
2018-05-22 00:59:54 +00:00
switch ( strip _ns ( y [ 0 ] ) ) {
2017-03-19 06:50:30 +00:00
case '<borders' : case '<borders>' : case '</borders>' : break ;
/* 18.8.4 border CT_Border */
2017-07-26 08:35:28 +00:00
case '<border' : case '<border>' : case '<border/>' :
2019-11-15 01:46:49 +00:00
border = /*::(*/ { } /*:: :any)*/ ;
2019-11-01 03:09:14 +00:00
if ( y . diagonalUp ) border . diagonalUp = parsexmlbool ( y . diagonalUp ) ;
if ( y . diagonalDown ) border . diagonalDown = parsexmlbool ( y . diagonalDown ) ;
2017-03-19 06:50:30 +00:00
styles . Borders . push ( border ) ;
break ;
case '</border>' : break ;
/* note: not in spec, appears to be CT_BorderPr */
2017-07-05 22:27:54 +00:00
case '<left/>' : break ;
case '<left' : case '<left>' : break ;
2017-03-19 06:50:30 +00:00
case '</left>' : break ;
/* note: not in spec, appears to be CT_BorderPr */
2017-07-05 22:27:54 +00:00
case '<right/>' : break ;
case '<right' : case '<right>' : break ;
2017-03-19 06:50:30 +00:00
case '</right>' : break ;
/* 18.8.43 top CT_BorderPr */
2017-07-05 22:27:54 +00:00
case '<top/>' : break ;
case '<top' : case '<top>' : break ;
2017-03-19 06:50:30 +00:00
case '</top>' : break ;
/* 18.8.6 bottom CT_BorderPr */
2017-07-05 22:27:54 +00:00
case '<bottom/>' : break ;
case '<bottom' : case '<bottom>' : break ;
2017-03-19 06:50:30 +00:00
case '</bottom>' : break ;
/* 18.8.13 diagonal CT_BorderPr */
2017-07-05 22:27:54 +00:00
case '<diagonal' : case '<diagonal>' : case '<diagonal/>' : break ;
2017-03-19 06:50:30 +00:00
case '</diagonal>' : break ;
/* 18.8.25 horizontal CT_BorderPr */
2017-07-05 22:27:54 +00:00
case '<horizontal' : case '<horizontal>' : case '<horizontal/>' : break ;
2017-03-19 06:50:30 +00:00
case '</horizontal>' : break ;
/* 18.8.44 vertical CT_BorderPr */
2017-07-05 22:27:54 +00:00
case '<vertical' : case '<vertical>' : case '<vertical/>' : break ;
2017-03-19 06:50:30 +00:00
case '</vertical>' : break ;
/* 18.8.37 start CT_BorderPr */
2017-07-05 22:27:54 +00:00
case '<start' : case '<start>' : case '<start/>' : break ;
2017-03-19 06:50:30 +00:00
case '</start>' : break ;
/* 18.8.16 end CT_BorderPr */
2017-07-05 22:27:54 +00:00
case '<end' : case '<end>' : case '<end/>' : break ;
2017-03-19 06:50:30 +00:00
case '</end>' : break ;
/* 18.8.? color CT_Color */
2019-11-01 03:09:14 +00:00
case '<color' : case '<color>' :
break ;
2017-07-05 22:27:54 +00:00
case '<color/>' : case '</color>' : break ;
2017-03-19 06:50:30 +00:00
2018-05-05 06:34:37 +00:00
/* 18.2.10 extLst CT_ExtensionList ? */
case '<extLst' : case '<extLst>' : case '</extLst>' : break ;
case '<ext' : pass = true ; break ;
case '</ext>' : pass = false ; break ;
default : if ( opts && opts . WTF ) {
if ( ! pass ) throw new Error ( 'unrecognized ' + y [ 0 ] + ' in borders' ) ;
}
2017-03-19 06:50:30 +00:00
}
} ) ;
}
2017-02-03 20:50:45 +00:00
/* 18.8.21 fills CT_Fills */
2017-03-19 06:50:30 +00:00
function parse _fills ( t , styles , themes , opts ) {
2017-02-03 20:50:45 +00:00
styles . Fills = [ ] ;
var fill = { } ;
2018-05-05 06:34:37 +00:00
var pass = false ;
2019-11-01 03:09:14 +00:00
( t [ 0 ] . match ( tagregex ) || [ ] ) . forEach ( function ( x ) {
2017-02-03 20:50:45 +00:00
var y = parsexmltag ( x ) ;
2018-05-22 00:59:54 +00:00
switch ( strip _ns ( y [ 0 ] ) ) {
2017-02-03 20:50:45 +00:00
case '<fills' : case '<fills>' : case '</fills>' : break ;
/* 18.8.20 fill CT_Fill */
2017-08-05 06:32:57 +00:00
case '<fill>' : case '<fill' : case '<fill/>' :
fill = { } ; styles . Fills . push ( fill ) ; break ;
case '</fill>' : break ;
2017-02-03 20:50:45 +00:00
2017-03-19 06:50:30 +00:00
/* 18.8.24 gradientFill CT_GradientFill */
2017-03-28 22:03:03 +00:00
case '<gradientFill>' : break ;
2017-07-26 08:35:28 +00:00
case '<gradientFill' :
2017-03-28 22:03:03 +00:00
case '</gradientFill>' : styles . Fills . push ( fill ) ; fill = { } ; break ;
2017-03-19 06:50:30 +00:00
2017-02-03 20:50:45 +00:00
/* 18.8.32 patternFill CT_PatternFill */
2017-03-19 06:50:30 +00:00
case '<patternFill' : case '<patternFill>' :
2017-02-03 20:50:45 +00:00
if ( y . patternType ) fill . patternType = y . patternType ;
break ;
case '<patternFill/>' : case '</patternFill>' : break ;
/* 18.8.3 bgColor CT_Color */
case '<bgColor' :
if ( ! fill . bgColor ) fill . bgColor = { } ;
if ( y . indexed ) fill . bgColor . indexed = parseInt ( y . indexed , 10 ) ;
if ( y . theme ) fill . bgColor . theme = parseInt ( y . theme , 10 ) ;
if ( y . tint ) fill . bgColor . tint = parseFloat ( y . tint ) ;
/* Excel uses ARGB strings */
2017-03-19 06:50:30 +00:00
if ( y . rgb ) fill . bgColor . rgb = y . rgb . slice ( - 6 ) ;
2017-02-03 20:50:45 +00:00
break ;
case '<bgColor/>' : case '</bgColor>' : break ;
/* 18.8.19 fgColor CT_Color */
case '<fgColor' :
if ( ! fill . fgColor ) fill . fgColor = { } ;
if ( y . theme ) fill . fgColor . theme = parseInt ( y . theme , 10 ) ;
if ( y . tint ) fill . fgColor . tint = parseFloat ( y . tint ) ;
/* Excel uses ARGB strings */
2019-11-01 03:09:14 +00:00
if ( y . rgb != null ) fill . fgColor . rgb = y . rgb . slice ( - 6 ) ;
2017-02-03 20:50:45 +00:00
break ;
case '<fgColor/>' : case '</fgColor>' : break ;
2017-03-19 06:50:30 +00:00
/* 18.8.38 stop CT_GradientStop */
case '<stop' : case '<stop/>' : break ;
case '</stop>' : break ;
/* 18.8.? color CT_Color */
case '<color' : case '<color/>' : break ;
case '</color>' : break ;
2018-05-05 06:34:37 +00:00
/* 18.2.10 extLst CT_ExtensionList ? */
case '<extLst' : case '<extLst>' : case '</extLst>' : break ;
case '<ext' : pass = true ; break ;
case '</ext>' : pass = false ; break ;
default : if ( opts && opts . WTF ) {
if ( ! pass ) throw new Error ( 'unrecognized ' + y [ 0 ] + ' in fills' ) ;
}
2017-02-03 20:50:45 +00:00
}
} ) ;
}
2017-03-19 06:50:30 +00:00
/* 18.8.23 fonts CT_Fonts */
function parse _fonts ( t , styles , themes , opts ) {
styles . Fonts = [ ] ;
var font = { } ;
2018-05-05 06:34:37 +00:00
var pass = false ;
2019-11-01 03:09:14 +00:00
( t [ 0 ] . match ( tagregex ) || [ ] ) . forEach ( function ( x ) {
2017-03-19 06:50:30 +00:00
var y = parsexmltag ( x ) ;
2018-05-22 00:59:54 +00:00
switch ( strip _ns ( y [ 0 ] ) ) {
2017-03-19 06:50:30 +00:00
case '<fonts' : case '<fonts>' : case '</fonts>' : break ;
/* 18.8.22 font CT_Font */
case '<font' : case '<font>' : break ;
case '</font>' : case '<font/>' :
styles . Fonts . push ( font ) ;
font = { } ;
break ;
/* 18.8.29 name CT_FontName */
2020-03-15 07:42:05 +00:00
case '<name' : if ( y . val ) font . name = utf8read ( y . val ) ; break ;
2017-03-19 06:50:30 +00:00
case '<name/>' : case '</name>' : break ;
2017-05-09 18:07:57 +00:00
/* 18.8.2 b CT_BooleanProperty */
case '<b' : font . bold = y . val ? parsexmlbool ( y . val ) : 1 ; break ;
case '<b/>' : font . bold = 1 ; break ;
2017-03-19 06:50:30 +00:00
/* 18.8.26 i CT_BooleanProperty */
2017-05-09 18:07:57 +00:00
case '<i' : font . italic = y . val ? parsexmlbool ( y . val ) : 1 ; break ;
case '<i/>' : font . italic = 1 ; break ;
2017-03-19 06:50:30 +00:00
/* 18.4.13 u CT_UnderlineProperty */
2017-05-09 18:07:57 +00:00
case '<u' :
switch ( y . val ) {
case "none" : font . underline = 0x00 ; break ;
case "single" : font . underline = 0x01 ; break ;
case "double" : font . underline = 0x02 ; break ;
case "singleAccounting" : font . underline = 0x21 ; break ;
case "doubleAccounting" : font . underline = 0x22 ; break ;
} break ;
case '<u/>' : font . underline = 1 ; break ;
2017-03-19 06:50:30 +00:00
/* 18.4.10 strike CT_BooleanProperty */
2017-05-09 18:07:57 +00:00
case '<strike' : font . strike = y . val ? parsexmlbool ( y . val ) : 1 ; break ;
case '<strike/>' : font . strike = 1 ; break ;
2017-03-19 06:50:30 +00:00
2017-05-09 18:07:57 +00:00
/* 18.4.2 outline CT_BooleanProperty */
case '<outline' : font . outline = y . val ? parsexmlbool ( y . val ) : 1 ; break ;
case '<outline/>' : font . outline = 1 ; break ;
2017-03-19 06:50:30 +00:00
/* 18.8.36 shadow CT_BooleanProperty */
2017-05-09 18:07:57 +00:00
case '<shadow' : font . shadow = y . val ? parsexmlbool ( y . val ) : 1 ; break ;
case '<shadow/>' : font . shadow = 1 ; break ;
/* 18.8.12 condense CT_BooleanProperty */
case '<condense' : font . condense = y . val ? parsexmlbool ( y . val ) : 1 ; break ;
case '<condense/>' : font . condense = 1 ; break ;
/* 18.8.17 extend CT_BooleanProperty */
case '<extend' : font . extend = y . val ? parsexmlbool ( y . val ) : 1 ; break ;
case '<extend/>' : font . extend = 1 ; break ;
2017-03-19 06:50:30 +00:00
/* 18.4.11 sz CT_FontSize */
2017-05-09 18:07:57 +00:00
case '<sz' : if ( y . val ) font . sz = + y . val ; break ;
2017-03-19 06:50:30 +00:00
case '<sz/>' : case '</sz>' : break ;
/* 18.4.14 vertAlign CT_VerticalAlignFontProperty */
case '<vertAlign' : if ( y . val ) font . vertAlign = y . val ; break ;
case '<vertAlign/>' : case '</vertAlign>' : break ;
/* 18.8.18 family CT_FontFamily */
2017-05-09 18:07:57 +00:00
case '<family' : if ( y . val ) font . family = parseInt ( y . val , 10 ) ; break ;
2017-03-19 06:50:30 +00:00
case '<family/>' : case '</family>' : break ;
/* 18.8.35 scheme CT_FontScheme */
case '<scheme' : if ( y . val ) font . scheme = y . val ; break ;
case '<scheme/>' : case '</scheme>' : break ;
2017-05-09 18:07:57 +00:00
/* 18.4.1 charset CT_IntProperty */
2017-03-19 06:50:30 +00:00
case '<charset' :
if ( y . val == '1' ) break ;
y . codepage = CS2CP [ parseInt ( y . val , 10 ) ] ;
break ;
2017-05-09 18:07:57 +00:00
/* 18.?.? color CT_Color */
2017-03-19 06:50:30 +00:00
case '<color' :
if ( ! font . color ) font . color = { } ;
2017-05-09 18:07:57 +00:00
if ( y . auto ) font . color . auto = parsexmlbool ( y . auto ) ;
2017-07-05 22:27:54 +00:00
if ( y . rgb ) font . color . rgb = y . rgb . slice ( - 6 ) ;
2017-05-09 18:07:57 +00:00
else if ( y . indexed ) {
font . color . index = parseInt ( y . indexed , 10 ) ;
var icv = XLSIcv [ font . color . index ] ;
if ( font . color . index == 81 ) icv = XLSIcv [ 1 ] ;
2021-10-13 07:20:25 +00:00
if ( ! icv ) icv = XLSIcv [ 1 ] ; //throw new Error(x); // note: 206 is valid
2017-05-09 18:07:57 +00:00
font . color . rgb = icv [ 0 ] . toString ( 16 ) + icv [ 1 ] . toString ( 16 ) + icv [ 2 ] . toString ( 16 ) ;
} else if ( y . theme ) {
font . color . theme = parseInt ( y . theme , 10 ) ;
if ( y . tint ) font . color . tint = parseFloat ( y . tint ) ;
if ( y . theme && themes . themeElements && themes . themeElements . clrScheme ) {
font . color . rgb = rgb _tint ( themes . themeElements . clrScheme [ font . color . theme ] . rgb , font . color . tint || 0 ) ;
}
}
2017-03-19 06:50:30 +00:00
break ;
case '<color/>' : case '</color>' : break ;
2019-11-01 03:09:14 +00:00
/* note: sometimes mc:AlternateContent appears bare */
case '<AlternateContent' : pass = true ; break ;
case '</AlternateContent>' : pass = false ; break ;
2018-05-05 06:34:37 +00:00
/* 18.2.10 extLst CT_ExtensionList ? */
case '<extLst' : case '<extLst>' : case '</extLst>' : break ;
case '<ext' : pass = true ; break ;
case '</ext>' : pass = false ; break ;
default : if ( opts && opts . WTF ) {
if ( ! pass ) throw new Error ( 'unrecognized ' + y [ 0 ] + ' in fonts' ) ;
}
2017-03-19 06:50:30 +00:00
}
} ) ;
}
2017-02-03 20:50:45 +00:00
/* 18.8.31 numFmts CT_NumFmts */
2017-03-18 23:25:50 +00:00
function parse _numFmts ( t , styles , opts ) {
2017-02-03 20:50:45 +00:00
styles . NumberFmt = [ ] ;
2022-03-20 05:29:24 +00:00
var k /*Array<number>*/ = ( keys ( table _fmt ) /*:any*/ ) ;
for ( var i = 0 ; i < k . length ; ++ i ) styles . NumberFmt [ k [ i ] ] = table _fmt [ k [ i ] ] ;
2017-02-03 20:50:45 +00:00
var m = t [ 0 ] . match ( tagregex ) ;
2017-02-10 19:23:01 +00:00
if ( ! m ) return ;
2017-02-03 20:50:45 +00:00
for ( i = 0 ; i < m . length ; ++ i ) {
var y = parsexmltag ( m [ i ] ) ;
2018-05-22 00:59:54 +00:00
switch ( strip _ns ( y [ 0 ] ) ) {
2017-02-03 20:50:45 +00:00
case '<numFmts' : case '</numFmts>' : case '<numFmts/>' : case '<numFmts>' : break ;
case '<numFmt' : {
var f = unescapexml ( utf8read ( y . formatCode ) ) , j = parseInt ( y . numFmtId , 10 ) ;
2017-07-05 22:27:54 +00:00
styles . NumberFmt [ j ] = f ;
if ( j > 0 ) {
if ( j > 0x188 ) {
for ( j = 0x188 ; j > 0x3c ; -- j ) if ( styles . NumberFmt [ j ] == null ) break ;
styles . NumberFmt [ j ] = f ;
}
2022-04-11 04:11:47 +00:00
SSF _ _load ( f , j ) ;
2017-07-05 22:27:54 +00:00
}
2017-02-03 20:50:45 +00:00
} break ;
2017-03-10 08:39:51 +00:00
case '</numFmt>' : break ;
2017-02-10 19:23:01 +00:00
default : if ( opts . WTF ) throw new Error ( 'unrecognized ' + y [ 0 ] + ' in numFmts' ) ;
2017-02-03 20:50:45 +00:00
}
}
}
2018-01-23 09:07:51 +00:00
function write _numFmts ( NF /*:{[n:number|string]:string}*/ /*::, opts*/ ) {
2017-02-03 20:50:45 +00:00
var o = [ "<numFmts>" ] ;
2017-03-25 01:36:40 +00:00
[ [ 5 , 8 ] , [ 23 , 26 ] , [ 41 , 44 ] , [ /*63*/ 50 , /*66],[164,*/ 392 ] ] . forEach ( function ( r ) {
2017-03-19 06:50:30 +00:00
for ( var i = r [ 0 ] ; i <= r [ 1 ] ; ++ i ) if ( NF [ i ] != null ) o [ o . length ] = ( writextag ( 'numFmt' , null , { numFmtId : i , formatCode : escapexml ( NF [ i ] ) } ) ) ;
2017-02-03 20:50:45 +00:00
} ) ;
if ( o . length === 1 ) return "" ;
o [ o . length ] = ( "</numFmts>" ) ;
o [ 0 ] = writextag ( 'numFmts' , null , { count : o . length - 2 } ) . replace ( "/>" , ">" ) ;
return o . join ( "" ) ;
}
/* 18.8.10 cellXfs CT_CellXfs */
2017-06-10 01:47:42 +00:00
var cellXF _uint = [ "numFmtId" , "fillId" , "fontId" , "borderId" , "xfId" ] ;
var cellXF _bool = [ "applyAlignment" , "applyBorder" , "applyFill" , "applyFont" , "applyNumberFormat" , "applyProtection" , "pivotButton" , "quotePrefix" ] ;
2017-03-18 23:25:50 +00:00
function parse _cellXfs ( t , styles , opts ) {
2017-02-03 20:50:45 +00:00
styles . CellXf = [ ] ;
2017-03-19 06:50:30 +00:00
var xf ;
2018-05-05 06:34:37 +00:00
var pass = false ;
2019-11-01 03:09:14 +00:00
( t [ 0 ] . match ( tagregex ) || [ ] ) . forEach ( function ( x ) {
2017-06-10 01:47:42 +00:00
var y = parsexmltag ( x ) , i = 0 ;
2018-05-22 00:59:54 +00:00
switch ( strip _ns ( y [ 0 ] ) ) {
2017-02-03 20:50:45 +00:00
case '<cellXfs' : case '<cellXfs>' : case '<cellXfs/>' : case '</cellXfs>' : break ;
/* 18.8.45 xf CT_Xf */
2017-07-05 22:27:54 +00:00
case '<xf' : case '<xf/>' :
2017-03-19 06:50:30 +00:00
xf = y ;
delete xf [ 0 ] ;
2017-06-10 01:47:42 +00:00
for ( i = 0 ; i < cellXF _uint . length ; ++ i ) if ( xf [ cellXF _uint [ i ] ] )
xf [ cellXF _uint [ i ] ] = parseInt ( xf [ cellXF _uint [ i ] ] , 10 ) ;
for ( i = 0 ; i < cellXF _bool . length ; ++ i ) if ( xf [ cellXF _bool [ i ] ] )
2018-01-23 09:07:51 +00:00
xf [ cellXF _bool [ i ] ] = parsexmlbool ( xf [ cellXF _bool [ i ] ] ) ;
2021-09-16 01:50:33 +00:00
if ( styles . NumberFmt && xf . numFmtId > 0x188 ) {
2017-07-05 22:27:54 +00:00
for ( i = 0x188 ; i > 0x3c ; -- i ) if ( styles . NumberFmt [ xf . numFmtId ] == styles . NumberFmt [ i ] ) { xf . numFmtId = i ; break ; }
}
2017-03-19 06:50:30 +00:00
styles . CellXf . push ( xf ) ; break ;
2017-02-03 20:50:45 +00:00
case '</xf>' : break ;
/* 18.8.1 alignment CT_CellAlignment */
2017-03-19 06:50:30 +00:00
case '<alignment' : case '<alignment/>' :
var alignment = { } ;
if ( y . vertical ) alignment . vertical = y . vertical ;
if ( y . horizontal ) alignment . horizontal = y . horizontal ;
if ( y . textRotation != null ) alignment . textRotation = y . textRotation ;
if ( y . indent ) alignment . indent = y . indent ;
2019-11-01 03:09:14 +00:00
if ( y . wrapText ) alignment . wrapText = parsexmlbool ( y . wrapText ) ;
2017-03-19 06:50:30 +00:00
xf . alignment = alignment ;
break ;
case '</alignment>' : break ;
2017-02-03 20:50:45 +00:00
/* 18.8.33 protection CT_CellProtection */
2019-11-01 03:09:14 +00:00
case '<protection' :
break ;
case '</protection>' : case '<protection/>' : break ;
/* note: sometimes mc:AlternateContent appears bare */
case '<AlternateContent' : pass = true ; break ;
case '</AlternateContent>' : pass = false ; break ;
2017-02-03 20:50:45 +00:00
2017-03-19 06:50:30 +00:00
/* 18.2.10 extLst CT_ExtensionList ? */
2018-05-05 06:34:37 +00:00
case '<extLst' : case '<extLst>' : case '</extLst>' : break ;
case '<ext' : pass = true ; break ;
case '</ext>' : pass = false ; break ;
default : if ( opts && opts . WTF ) {
if ( ! pass ) throw new Error ( 'unrecognized ' + y [ 0 ] + ' in cellXfs' ) ;
}
2017-02-03 20:50:45 +00:00
}
} ) ;
}
2017-02-10 19:23:01 +00:00
function write _cellXfs ( cellXfs ) /*:string*/ {
2017-12-30 05:40:35 +00:00
var o /*:Array<string>*/ = [ ] ;
2017-02-03 20:50:45 +00:00
o [ o . length ] = ( writextag ( 'cellXfs' , null ) ) ;
2019-11-01 03:09:14 +00:00
cellXfs . forEach ( function ( c ) {
o [ o . length ] = ( writextag ( 'xf' , null , c ) ) ;
} ) ;
2017-02-03 20:50:45 +00:00
o [ o . length ] = ( "</cellXfs>" ) ;
if ( o . length === 2 ) return "" ;
o [ 0 ] = writextag ( 'cellXfs' , null , { count : o . length - 2 } ) . replace ( "/>" , ">" ) ;
return o . join ( "" ) ;
}
/* 18.8 Styles CT_Stylesheet*/
2022-03-12 14:05:57 +00:00
var parse _sty _xml = /*#__PURE__*/ ( function make _pstyx ( ) {
2018-05-22 00:59:54 +00:00
var numFmtRegex = /<(?:\w+:)?numFmts([^>]*)>[\S\s]*?<\/(?:\w+:)?numFmts>/ ;
var cellXfRegex = /<(?:\w+:)?cellXfs([^>]*)>[\S\s]*?<\/(?:\w+:)?cellXfs>/ ;
var fillsRegex = /<(?:\w+:)?fills([^>]*)>[\S\s]*?<\/(?:\w+:)?fills>/ ;
var fontsRegex = /<(?:\w+:)?fonts([^>]*)>[\S\s]*?<\/(?:\w+:)?fonts>/ ;
var bordersRegex = /<(?:\w+:)?borders([^>]*)>[\S\s]*?<\/(?:\w+:)?borders>/ ;
2017-02-03 20:50:45 +00:00
2017-03-19 06:50:30 +00:00
return function parse _sty _xml ( data , themes , opts ) {
2017-03-18 23:25:50 +00:00
var styles = { } ;
2017-02-10 19:23:01 +00:00
if ( ! data ) return styles ;
2017-07-05 22:27:54 +00:00
data = data . replace ( /<!--([\s\S]*?)-->/mg , "" ) . replace ( /<!DOCTYPE[^\[]*\[[^\]]*\]>/gm , "" ) ;
2017-02-03 20:50:45 +00:00
/* 18.8.39 styleSheet CT_Stylesheet */
var t ;
2017-03-19 06:50:30 +00:00
/* 18.8.31 numFmts CT_NumFmts ? */
2017-03-18 23:25:50 +00:00
if ( ( t = data . match ( numFmtRegex ) ) ) parse _numFmts ( t , styles , opts ) ;
2017-02-03 20:50:45 +00:00
2017-03-19 06:50:30 +00:00
/* 18.8.23 fonts CT_Fonts ? */
if ( ( t = data . match ( fontsRegex ) ) ) parse _fonts ( t , styles , themes , opts ) ;
2017-02-03 20:50:45 +00:00
2017-05-09 18:07:57 +00:00
/* 18.8.21 fills CT_Fills ? */
2017-03-19 06:50:30 +00:00
if ( ( t = data . match ( fillsRegex ) ) ) parse _fills ( t , styles , themes , opts ) ;
2017-02-03 20:50:45 +00:00
2017-05-09 18:07:57 +00:00
/* 18.8.5 borders CT_Borders ? */
2017-03-19 06:50:30 +00:00
if ( ( t = data . match ( bordersRegex ) ) ) parse _borders ( t , styles , themes , opts ) ;
2017-02-03 20:50:45 +00:00
2017-05-09 18:07:57 +00:00
/* 18.8.9 cellStyleXfs CT_CellStyleXfs ? */
2020-03-15 07:42:05 +00:00
/* 18.8.8 cellStyles CT_CellStyles ? */
2017-03-19 06:50:30 +00:00
/* 18.8.10 cellXfs CT_CellXfs ? */
2017-03-18 23:25:50 +00:00
if ( ( t = data . match ( cellXfRegex ) ) ) parse _cellXfs ( t , styles , opts ) ;
2017-02-03 20:50:45 +00:00
2017-03-19 06:50:30 +00:00
/* 18.8.15 dxfs CT_Dxfs ? */
/* 18.8.42 tableStyles CT_TableStyles ? */
/* 18.8.11 colors CT_Colors ? */
/* 18.2.10 extLst CT_ExtensionList ? */
2017-02-03 20:50:45 +00:00
return styles ;
} ;
} ) ( ) ;
2017-02-10 19:23:01 +00:00
function write _sty _xml ( wb /*:Workbook*/ , opts ) /*:string*/ {
2022-03-12 14:05:57 +00:00
var o = [ XML _HEADER , writextag ( 'styleSheet' , null , {
'xmlns' : XMLNS _main [ 0 ] ,
'xmlns:vt' : XMLNS . vt
} ) ] , w ;
2017-03-12 18:02:43 +00:00
if ( wb . SSF && ( w = write _numFmts ( wb . SSF ) ) != null ) o [ o . length ] = w ;
2017-02-03 20:50:45 +00:00
o [ o . length ] = ( '<fonts count="1"><font><sz val="12"/><color theme="1"/><name val="Calibri"/><family val="2"/><scheme val="minor"/></font></fonts>' ) ;
o [ o . length ] = ( '<fills count="2"><fill><patternFill patternType="none"/></fill><fill><patternFill patternType="gray125"/></fill></fills>' ) ;
o [ o . length ] = ( '<borders count="1"><border><left/><right/><top/><bottom/><diagonal/></border></borders>' ) ;
o [ o . length ] = ( '<cellStyleXfs count="1"><xf numFmtId="0" fontId="0" fillId="0" borderId="0"/></cellStyleXfs>' ) ;
if ( ( w = write _cellXfs ( opts . cellXfs ) ) ) o [ o . length ] = ( w ) ;
o [ o . length ] = ( '<cellStyles count="1"><cellStyle name="Normal" xfId="0" builtinId="0"/></cellStyles>' ) ;
o [ o . length ] = ( '<dxfs count="0"/>' ) ;
o [ o . length ] = ( '<tableStyles count="0" defaultTableStyle="TableStyleMedium9" defaultPivotStyle="PivotStyleMedium4"/>' ) ;
if ( o . length > 2 ) { o [ o . length ] = ( '</styleSheet>' ) ; o [ 1 ] = o [ 1 ] . replace ( "/>" , ">" ) ; }
return o . join ( "" ) ;
}
2018-02-14 20:06:35 +00:00
/* [MS-XLSB] 2.4.657 BrtFmt */
2017-02-10 19:23:01 +00:00
function parse _BrtFmt ( data , length /*:number*/ ) {
2017-07-27 20:07:51 +00:00
var numFmtId = data . read _shift ( 2 ) ;
2017-02-03 20:50:45 +00:00
var stFmtCode = parse _XLWideString ( data , length - 2 ) ;
2017-07-27 20:07:51 +00:00
return [ numFmtId , stFmtCode ] ;
2017-02-03 20:50:45 +00:00
}
2017-05-09 18:07:57 +00:00
function write _BrtFmt ( i /*:number*/ , f /*:string*/ , o ) {
if ( ! o ) o = new _buf ( 6 + 4 * f . length ) ;
o . write _shift ( 2 , i ) ;
write _XLWideString ( f , o ) ;
2018-02-08 18:21:39 +00:00
var out = ( o . length > o . l ) ? o . slice ( 0 , o . l ) : o ;
if ( o . l == null ) o . l = o . length ;
return out ;
2017-05-09 18:07:57 +00:00
}
2017-02-03 20:50:45 +00:00
2018-02-14 20:06:35 +00:00
/* [MS-XLSB] 2.4.659 BrtFont TODO */
2017-05-09 18:07:57 +00:00
function parse _BrtFont ( data , length /*:number*/ , opts ) {
var out = ( { } /*:any*/ ) ;
out . sz = data . read _shift ( 2 ) / 20 ;
var grbit = parse _FontFlags ( data , 2 , opts ) ;
2019-11-15 01:46:49 +00:00
if ( grbit . fItalic ) out . italic = 1 ;
2017-05-09 18:07:57 +00:00
if ( grbit . fCondense ) out . condense = 1 ;
if ( grbit . fExtend ) out . extend = 1 ;
if ( grbit . fShadow ) out . shadow = 1 ;
if ( grbit . fOutline ) out . outline = 1 ;
if ( grbit . fStrikeout ) out . strike = 1 ;
var bls = data . read _shift ( 2 ) ;
if ( bls === 0x02BC ) out . bold = 1 ;
switch ( data . read _shift ( 2 ) ) {
/* case 0: out.vertAlign = "baseline"; break; */
case 1 : out . vertAlign = "superscript" ; break ;
case 2 : out . vertAlign = "subscript" ; break ;
}
var underline = data . read _shift ( 1 ) ;
if ( underline != 0 ) out . underline = underline ;
var family = data . read _shift ( 1 ) ;
if ( family > 0 ) out . family = family ;
var bCharSet = data . read _shift ( 1 ) ;
if ( bCharSet > 0 ) out . charset = bCharSet ;
2017-02-03 20:50:45 +00:00
data . l ++ ;
2017-05-09 18:07:57 +00:00
out . color = parse _BrtColor ( data , 8 ) ;
switch ( data . read _shift ( 1 ) ) {
/* case 0: out.scheme = "none": break; */
case 1 : out . scheme = "major" ; break ;
case 2 : out . scheme = "minor" ; break ;
}
2017-02-03 20:50:45 +00:00
out . name = parse _XLWideString ( data , length - 21 ) ;
return out ;
}
2018-04-21 15:16:37 +00:00
function write _BrtFont ( font /*:any*/ , o ) {
2017-05-09 18:07:57 +00:00
if ( ! o ) o = new _buf ( 25 + 4 * 32 ) ;
o . write _shift ( 2 , font . sz * 20 ) ;
write _FontFlags ( font , o ) ;
o . write _shift ( 2 , font . bold ? 0x02BC : 0x0190 ) ;
var sss = 0 ;
if ( font . vertAlign == "superscript" ) sss = 1 ;
else if ( font . vertAlign == "subscript" ) sss = 2 ;
o . write _shift ( 2 , sss ) ;
o . write _shift ( 1 , font . underline || 0 ) ;
o . write _shift ( 1 , font . family || 0 ) ;
o . write _shift ( 1 , font . charset || 0 ) ;
o . write _shift ( 1 , 0 ) ;
write _BrtColor ( font . color , o ) ;
var scheme = 0 ;
if ( font . scheme == "major" ) scheme = 1 ;
if ( font . scheme == "minor" ) scheme = 2 ;
o . write _shift ( 1 , scheme ) ;
write _XLWideString ( font . name , o ) ;
return o . length > o . l ? o . slice ( 0 , o . l ) : o ;
}
2018-02-14 20:06:35 +00:00
/* [MS-XLSB] 2.4.650 BrtFill */
2017-05-09 18:07:57 +00:00
var XLSBFillPTNames = [
"none" ,
"solid" ,
"mediumGray" ,
"darkGray" ,
"lightGray" ,
"darkHorizontal" ,
"darkVertical" ,
"darkDown" ,
"darkUp" ,
"darkGrid" ,
"darkTrellis" ,
"lightHorizontal" ,
"lightVertical" ,
"lightDown" ,
"lightUp" ,
"lightGrid" ,
"lightTrellis" ,
"gray125" ,
"gray0625"
] ;
2022-03-16 03:18:09 +00:00
var rev _XLSBFillPTNames /*:EvertNumType*/ ;
2017-05-09 18:07:57 +00:00
/* TODO: gradient fill representation */
2017-08-05 06:32:57 +00:00
var parse _BrtFill = parsenoop ;
2017-05-09 18:07:57 +00:00
function write _BrtFill ( fill , o ) {
if ( ! o ) o = new _buf ( 4 * 3 + 8 * 7 + 16 * 1 ) ;
2022-03-16 03:18:09 +00:00
if ( ! rev _XLSBFillPTNames ) rev _XLSBFillPTNames = ( evert ( XLSBFillPTNames ) /*:any*/ ) ;
2017-05-13 18:21:22 +00:00
var fls /*:number*/ = rev _XLSBFillPTNames [ fill . patternType ] ;
2017-05-09 18:07:57 +00:00
if ( fls == null ) fls = 0x28 ;
o . write _shift ( 4 , fls ) ;
var j = 0 ;
if ( fls != 0x28 ) {
/* TODO: custom FG Color */
write _BrtColor ( { auto : 1 } , o ) ;
/* TODO: custom BG Color */
write _BrtColor ( { auto : 1 } , o ) ;
for ( ; j < 12 ; ++ j ) o . write _shift ( 4 , 0 ) ;
} else {
for ( ; j < 4 ; ++ j ) o . write _shift ( 4 , 0 ) ;
for ( ; j < 12 ; ++ j ) o . write _shift ( 4 , 0 ) ; /* TODO */
/* iGradientType */
/* xnumDegree */
/* xnumFillToLeft */
/* xnumFillToRight */
/* xnumFillToTop */
/* xnumFillToBottom */
/* cNumStop */
/* xfillGradientStop */
}
return o . length > o . l ? o . slice ( 0 , o . l ) : o ;
}
2017-02-03 20:50:45 +00:00
2018-02-14 20:06:35 +00:00
/* [MS-XLSB] 2.4.824 BrtXF */
2017-02-10 19:23:01 +00:00
function parse _BrtXF ( data , length /*:number*/ ) {
2017-11-20 01:51:14 +00:00
var tgt = data . l + length ;
2017-02-03 20:50:45 +00:00
var ixfeParent = data . read _shift ( 2 ) ;
var ifmt = data . read _shift ( 2 ) ;
2017-11-20 01:51:14 +00:00
data . l = tgt ;
2017-07-27 20:07:51 +00:00
return { ixfe : ixfeParent , numFmtId : ifmt } ;
2017-02-03 20:50:45 +00:00
}
2017-05-09 18:07:57 +00:00
function write _BrtXF ( data , ixfeP , o ) {
if ( ! o ) o = new _buf ( 16 ) ;
o . write _shift ( 2 , ixfeP || 0 ) ;
o . write _shift ( 2 , data . numFmtId || 0 ) ;
o . write _shift ( 2 , 0 ) ; /* iFont */
o . write _shift ( 2 , 0 ) ; /* iFill */
o . write _shift ( 2 , 0 ) ; /* ixBorder */
o . write _shift ( 1 , 0 ) ; /* trot */
o . write _shift ( 1 , 0 ) ; /* indent */
2019-11-01 03:09:14 +00:00
var flow = 0 ;
o . write _shift ( 1 , flow ) ; /* flags */
2017-05-09 18:07:57 +00:00
o . write _shift ( 1 , 0 ) ; /* flags */
o . write _shift ( 1 , 0 ) ; /* xfGrbitAtr */
o . write _shift ( 1 , 0 ) ;
return o ;
}
/* [MS-XLSB] 2.5.4 Blxf TODO */
function write _Blxf ( data , o ) {
if ( ! o ) o = new _buf ( 10 ) ;
o . write _shift ( 1 , 0 ) ; /* dg */
o . write _shift ( 1 , 0 ) ;
o . write _shift ( 4 , 0 ) ; /* color */
o . write _shift ( 4 , 0 ) ; /* color */
return o ;
}
2018-02-14 20:06:35 +00:00
/* [MS-XLSB] 2.4.302 BrtBorder TODO */
2017-08-05 06:32:57 +00:00
var parse _BrtBorder = parsenoop ;
2017-05-09 18:07:57 +00:00
function write _BrtBorder ( border , o ) {
if ( ! o ) o = new _buf ( 51 ) ;
o . write _shift ( 1 , 0 ) ; /* diagonal */
write _Blxf ( null , o ) ; /* top */
write _Blxf ( null , o ) ; /* bottom */
write _Blxf ( null , o ) ; /* left */
write _Blxf ( null , o ) ; /* right */
write _Blxf ( null , o ) ; /* diag */
return o . length > o . l ? o . slice ( 0 , o . l ) : o ;
}
2018-02-14 20:06:35 +00:00
/* [MS-XLSB] 2.4.763 BrtStyle TODO */
2017-05-09 18:07:57 +00:00
function write _BrtStyle ( style , o ) {
if ( ! o ) o = new _buf ( 12 + 4 * 10 ) ;
o . write _shift ( 4 , style . xfId ) ;
o . write _shift ( 2 , 1 ) ;
o . write _shift ( 1 , + style . builtinId ) ;
o . write _shift ( 1 , 0 ) ; /* iLevel */
write _XLNullableWideString ( style . name || "" , o ) ;
return o . length > o . l ? o . slice ( 0 , o . l ) : o ;
}
2018-02-14 20:06:35 +00:00
/* [MS-XLSB] 2.4.272 BrtBeginTableStyles */
2017-05-09 18:07:57 +00:00
function write _BrtBeginTableStyles ( cnt , defTableStyle , defPivotStyle ) {
var o = new _buf ( 4 + 256 * 2 * 4 ) ;
o . write _shift ( 4 , cnt ) ;
write _XLNullableWideString ( defTableStyle , o ) ;
write _XLNullableWideString ( defPivotStyle , o ) ;
return o . length > o . l ? o . slice ( 0 , o . l ) : o ;
}
2017-02-03 20:50:45 +00:00
/* [MS-XLSB] 2.1.7.50 Styles */
2017-03-19 06:50:30 +00:00
function parse _sty _bin ( data , themes , opts ) {
2017-03-18 23:25:50 +00:00
var styles = { } ;
2017-02-10 19:23:01 +00:00
styles . NumberFmt = ( [ ] /*:any*/ ) ;
2022-03-20 05:29:24 +00:00
for ( var y in table _fmt ) styles . NumberFmt [ y ] = table _fmt [ y ] ;
2017-02-03 20:50:45 +00:00
styles . CellXf = [ ] ;
2017-04-20 03:24:48 +00:00
styles . Fonts = [ ] ;
2017-12-30 05:40:35 +00:00
var state /*:Array<string>*/ = [ ] ;
2017-02-03 20:50:45 +00:00
var pass = false ;
2022-03-12 14:05:57 +00:00
recordhopper ( data , function hopper _sty ( val , R , RT ) {
2017-04-09 04:03:19 +00:00
switch ( RT ) {
2022-03-12 14:05:57 +00:00
case 0x002C : /* BrtFmt */
2022-04-11 04:11:47 +00:00
styles . NumberFmt [ val [ 0 ] ] = val [ 1 ] ; SSF _ _load ( val [ 1 ] , val [ 0 ] ) ;
2017-02-03 20:50:45 +00:00
break ;
2022-03-12 14:05:57 +00:00
case 0x002B : /* BrtFont */
2017-04-20 03:24:48 +00:00
styles . Fonts . push ( val ) ;
2017-05-09 18:07:57 +00:00
if ( val . color . theme != null && themes && themes . themeElements && themes . themeElements . clrScheme ) {
val . color . rgb = rgb _tint ( themes . themeElements . clrScheme [ val . color . theme ] . rgb , val . color . tint || 0 ) ;
}
2017-04-20 03:24:48 +00:00
break ;
2022-03-12 14:05:57 +00:00
case 0x0401 : /* BrtKnownFonts */ break ;
case 0x002D : /* BrtFill */
2019-11-01 03:09:14 +00:00
break ;
2022-03-12 14:05:57 +00:00
case 0x002E : /* BrtBorder */
2019-11-01 03:09:14 +00:00
break ;
2022-03-12 14:05:57 +00:00
case 0x002F : /* BrtXF */
if ( state [ state . length - 1 ] == 0x0269 /* BrtBeginCellXFs */ ) {
2017-02-03 20:50:45 +00:00
styles . CellXf . push ( val ) ;
}
2017-04-09 04:03:19 +00:00
break ;
2022-03-12 14:05:57 +00:00
case 0x0030 : /* BrtStyle */
case 0x01FB : /* BrtDXF */
case 0x023C : /* BrtMRUColor */
case 0x01DB : /* BrtIndexedColor */
2017-04-09 04:03:19 +00:00
break ;
2022-03-12 14:05:57 +00:00
case 0x0493 : /* BrtDXF14 */
case 0x0836 : /* BrtDXF15 */
case 0x046A : /* BrtSlicerStyleElement */
case 0x0200 : /* BrtTableStyleElement */
case 0x082F : /* BrtTimelineStyleElement */
case 0x0C00 : /* BrtUid */
2017-04-09 04:03:19 +00:00
break ;
2022-03-12 14:05:57 +00:00
case 0x0023 : /* BrtFRTBegin */
2017-04-09 04:03:19 +00:00
pass = true ; break ;
2022-03-12 14:05:57 +00:00
case 0x0024 : /* BrtFRTEnd */
2017-04-09 04:03:19 +00:00
pass = false ; break ;
2022-03-12 14:05:57 +00:00
case 0x0025 : /* BrtACBegin */
state . push ( RT ) ; pass = true ; break ;
case 0x0026 : /* BrtACEnd */
2019-11-01 03:09:14 +00:00
state . pop ( ) ; pass = false ; break ;
2017-04-08 06:55:35 +00:00
default :
2022-03-12 14:05:57 +00:00
if ( R . T > 0 ) state . push ( RT ) ;
else if ( R . T < 0 ) state . pop ( ) ;
else if ( ! pass || ( opts . WTF && state [ state . length - 1 ] != 0x0025 /* BrtACBegin */ ) ) throw new Error ( "Unexpected record 0x" + RT . toString ( 16 ) ) ;
2017-02-03 20:50:45 +00:00
}
} ) ;
return styles ;
}
2017-05-13 18:21:22 +00:00
function write _FMTS _bin ( ba , NF /*:?SSFTable*/ ) {
2017-05-09 18:07:57 +00:00
if ( ! NF ) return ;
var cnt = 0 ;
2017-07-05 22:27:54 +00:00
[ [ 5 , 8 ] , [ 23 , 26 ] , [ 41 , 44 ] , [ /*63*/ 50 , /*66],[164,*/ 392 ] ] . forEach ( function ( r ) {
2017-05-13 18:21:22 +00:00
/*:: if(!NF) return; */
2017-05-09 18:07:57 +00:00
for ( var i = r [ 0 ] ; i <= r [ 1 ] ; ++ i ) if ( NF [ i ] != null ) ++ cnt ;
} ) ;
if ( cnt == 0 ) return ;
2022-03-12 14:05:57 +00:00
write _record ( ba , 0x0267 /* BrtBeginFmts */ , write _UInt32LE ( cnt ) ) ;
2017-07-05 22:27:54 +00:00
[ [ 5 , 8 ] , [ 23 , 26 ] , [ 41 , 44 ] , [ /*63*/ 50 , /*66],[164,*/ 392 ] ] . forEach ( function ( r ) {
2017-05-13 18:21:22 +00:00
/*:: if(!NF) return; */
2022-03-12 14:05:57 +00:00
for ( var i = r [ 0 ] ; i <= r [ 1 ] ; ++ i ) if ( NF [ i ] != null ) write _record ( ba , 0x002C /* BrtFmt */ , write _BrtFmt ( i , NF [ i ] ) ) ;
2017-05-09 18:07:57 +00:00
} ) ;
2022-03-12 14:05:57 +00:00
write _record ( ba , 0x0268 /* BrtEndFmts */ ) ;
2017-05-09 18:07:57 +00:00
}
2018-01-23 09:07:51 +00:00
function write _FONTS _bin ( ba /*::, data*/ ) {
2017-05-09 18:07:57 +00:00
var cnt = 1 ;
if ( cnt == 0 ) return ;
2022-03-12 14:05:57 +00:00
write _record ( ba , 0x0263 /* BrtBeginFonts */ , write _UInt32LE ( cnt ) ) ;
write _record ( ba , 0x002B /* BrtFont */ , write _BrtFont ( {
2017-05-09 18:07:57 +00:00
sz : 12 ,
color : { theme : 1 } ,
name : "Calibri" ,
family : 2 ,
scheme : "minor"
} ) ) ;
/* 1*65491BrtFont [ACFONTS] */
2022-03-12 14:05:57 +00:00
write _record ( ba , 0x0264 /* BrtEndFonts */ ) ;
2017-05-09 18:07:57 +00:00
}
2018-01-23 09:07:51 +00:00
function write _FILLS _bin ( ba /*::, data*/ ) {
2017-05-09 18:07:57 +00:00
var cnt = 2 ;
if ( cnt == 0 ) return ;
2022-03-12 14:05:57 +00:00
write _record ( ba , 0x025B /* BrtBeginFills */ , write _UInt32LE ( cnt ) ) ;
write _record ( ba , 0x002D /* BrtFill */ , write _BrtFill ( { patternType : "none" } ) ) ;
write _record ( ba , 0x002D /* BrtFill */ , write _BrtFill ( { patternType : "gray125" } ) ) ;
2017-05-09 18:07:57 +00:00
/* 1*65431BrtFill */
2022-03-12 14:05:57 +00:00
write _record ( ba , 0x025C /* BrtEndFills */ ) ;
2017-05-09 18:07:57 +00:00
}
2018-01-23 09:07:51 +00:00
function write _BORDERS _bin ( ba /*::, data*/ ) {
2017-05-09 18:07:57 +00:00
var cnt = 1 ;
if ( cnt == 0 ) return ;
2022-03-12 14:05:57 +00:00
write _record ( ba , 0x0265 /* BrtBeginBorders */ , write _UInt32LE ( cnt ) ) ;
write _record ( ba , 0x002E /* BrtBorder */ , write _BrtBorder ( { } ) ) ;
2017-05-09 18:07:57 +00:00
/* 1*65430BrtBorder */
2022-03-12 14:05:57 +00:00
write _record ( ba , 0x0266 /* BrtEndBorders */ ) ;
2017-05-09 18:07:57 +00:00
}
2018-01-23 09:07:51 +00:00
function write _CELLSTYLEXFS _bin ( ba /*::, data*/ ) {
2017-05-09 18:07:57 +00:00
var cnt = 1 ;
2022-03-12 14:05:57 +00:00
write _record ( ba , 0x0272 /* BrtBeginCellStyleXFs */ , write _UInt32LE ( cnt ) ) ;
write _record ( ba , 0x002F /* BrtXF */ , write _BrtXF ( {
2019-11-01 03:09:14 +00:00
numFmtId : 0 ,
fontId : 0 ,
fillId : 0 ,
borderId : 0
2017-05-09 18:07:57 +00:00
} , 0xFFFF ) ) ;
/* 1*65430(BrtXF *FRT) */
2022-03-12 14:05:57 +00:00
write _record ( ba , 0x0273 /* BrtEndCellStyleXFs */ ) ;
2017-05-09 18:07:57 +00:00
}
function write _CELLXFS _bin ( ba , data ) {
2022-03-12 14:05:57 +00:00
write _record ( ba , 0x0269 /* BrtBeginCellXFs */ , write _UInt32LE ( data . length ) ) ;
data . forEach ( function ( c ) { write _record ( ba , 0x002F /* BrtXF */ , write _BrtXF ( c , 0 ) ) ; } ) ;
2017-05-09 18:07:57 +00:00
/* 1*65430(BrtXF *FRT) */
2022-03-12 14:05:57 +00:00
write _record ( ba , 0x026A /* BrtEndCellXFs */ ) ;
2017-05-09 18:07:57 +00:00
}
2018-01-23 09:07:51 +00:00
function write _STYLES _bin ( ba /*::, data*/ ) {
2017-05-09 18:07:57 +00:00
var cnt = 1 ;
2022-03-12 14:05:57 +00:00
write _record ( ba , 0x026B /* BrtBeginStyles */ , write _UInt32LE ( cnt ) ) ;
write _record ( ba , 0x0030 /* BrtStyle */ , write _BrtStyle ( {
2017-05-09 18:07:57 +00:00
xfId : 0 ,
builtinId : 0 ,
name : "Normal"
} ) ) ;
/* 1*65430(BrtStyle *FRT) */
2022-03-12 14:05:57 +00:00
write _record ( ba , 0x026C /* BrtEndStyles */ ) ;
2017-05-09 18:07:57 +00:00
}
2018-01-23 09:07:51 +00:00
function write _DXFS _bin ( ba /*::, data*/ ) {
2017-05-09 18:07:57 +00:00
var cnt = 0 ;
2022-03-12 14:05:57 +00:00
write _record ( ba , 0x01F9 /* BrtBeginDXFs */ , write _UInt32LE ( cnt ) ) ;
2017-05-09 18:07:57 +00:00
/* *2147483647(BrtDXF *FRT) */
2022-03-12 14:05:57 +00:00
write _record ( ba , 0x01FA /* BrtEndDXFs */ ) ;
2017-05-09 18:07:57 +00:00
}
2018-01-23 09:07:51 +00:00
function write _TABLESTYLES _bin ( ba /*::, data*/ ) {
2017-05-09 18:07:57 +00:00
var cnt = 0 ;
2022-03-12 14:05:57 +00:00
write _record ( ba , 0x01FC /* BrtBeginTableStyles */ , write _BrtBeginTableStyles ( cnt , "TableStyleMedium9" , "PivotStyleMedium4" ) ) ;
2017-05-09 18:07:57 +00:00
/* *TABLESTYLE */
2022-03-12 14:05:57 +00:00
write _record ( ba , 0x01FD /* BrtEndTableStyles */ ) ;
2017-05-09 18:07:57 +00:00
}
2018-01-23 09:07:51 +00:00
function write _COLORPALETTE _bin ( /*::ba, data*/ ) {
2017-05-09 18:07:57 +00:00
return ;
/* BrtBeginColorPalette [INDEXEDCOLORS] [MRUCOLORS] BrtEndColorPalette */
}
2017-02-03 20:50:45 +00:00
/* [MS-XLSB] 2.1.7.50 Styles */
2017-05-09 18:07:57 +00:00
function write _sty _bin ( wb , opts ) {
2017-02-03 20:50:45 +00:00
var ba = buf _array ( ) ;
2022-03-12 14:05:57 +00:00
write _record ( ba , 0x0116 /* BrtBeginStyleSheet */ ) ;
2017-05-09 18:07:57 +00:00
write _FMTS _bin ( ba , wb . SSF ) ;
write _FONTS _bin ( ba , wb ) ;
write _FILLS _bin ( ba , wb ) ;
write _BORDERS _bin ( ba , wb ) ;
write _CELLSTYLEXFS _bin ( ba , wb ) ;
write _CELLXFS _bin ( ba , opts . cellXfs ) ;
write _STYLES _bin ( ba , wb ) ;
write _DXFS _bin ( ba , wb ) ;
write _TABLESTYLES _bin ( ba , wb ) ;
write _COLORPALETTE _bin ( ba , wb ) ;
2017-02-03 20:50:45 +00:00
/* FRTSTYLESHEET*/
2022-03-12 14:05:57 +00:00
write _record ( ba , 0x0117 /* BrtEndStyleSheet */ ) ;
2017-02-03 20:50:45 +00:00
return ba . end ( ) ;
}
2020-03-15 07:42:05 +00:00
/* Even though theme layout is dk1 lt1 dk2 lt2, true order is lt1 dk1 lt2 dk2 */
var XLSXThemeClrScheme = [
'</a:lt1>' , '</a:dk1>' , '</a:lt2>' , '</a:dk2>' ,
'</a:accent1>' , '</a:accent2>' , '</a:accent3>' ,
'</a:accent4>' , '</a:accent5>' , '</a:accent6>' ,
'</a:hlink>' , '</a:folHlink>'
] ;
2017-02-03 20:50:45 +00:00
/* 20.1.6.2 clrScheme CT_ColorScheme */
2017-03-18 23:25:50 +00:00
function parse _clrScheme ( t , themes , opts ) {
2017-02-03 20:50:45 +00:00
themes . themeElements . clrScheme = [ ] ;
var color = { } ;
2017-02-10 19:23:01 +00:00
( t [ 0 ] . match ( tagregex ) || [ ] ) . forEach ( function ( x ) {
2017-02-03 20:50:45 +00:00
var y = parsexmltag ( x ) ;
switch ( y [ 0 ] ) {
2017-05-09 18:07:57 +00:00
/* 20.1.6.2 clrScheme (Color Scheme) CT_ColorScheme */
2017-02-03 20:50:45 +00:00
case '<a:clrScheme' : case '</a:clrScheme>' : break ;
/* 20.1.2.3.32 srgbClr CT_SRgbColor */
2017-05-09 18:07:57 +00:00
case '<a:srgbClr' :
color . rgb = y . val ; break ;
2017-02-03 20:50:45 +00:00
/* 20.1.2.3.33 sysClr CT_SystemColor */
2017-05-09 18:07:57 +00:00
case '<a:sysClr' :
color . rgb = y . lastClr ; break ;
2017-02-03 20:50:45 +00:00
/* 20.1.4.1.1 accent1 (Accent 1) */
/* 20.1.4.1.2 accent2 (Accent 2) */
/* 20.1.4.1.3 accent3 (Accent 3) */
/* 20.1.4.1.4 accent4 (Accent 4) */
/* 20.1.4.1.5 accent5 (Accent 5) */
/* 20.1.4.1.6 accent6 (Accent 6) */
2017-05-09 18:07:57 +00:00
/* 20.1.4.1.9 dk1 (Dark 1) */
/* 20.1.4.1.10 dk2 (Dark 2) */
2017-02-03 20:50:45 +00:00
/* 20.1.4.1.15 folHlink (Followed Hyperlink) */
2017-05-09 18:07:57 +00:00
/* 20.1.4.1.19 hlink (Hyperlink) */
/* 20.1.4.1.22 lt1 (Light 1) */
/* 20.1.4.1.23 lt2 (Light 2) */
case '<a:dk1>' : case '</a:dk1>' :
case '<a:lt1>' : case '</a:lt1>' :
case '<a:dk2>' : case '</a:dk2>' :
case '<a:lt2>' : case '</a:lt2>' :
case '<a:accent1>' : case '</a:accent1>' :
case '<a:accent2>' : case '</a:accent2>' :
case '<a:accent3>' : case '</a:accent3>' :
case '<a:accent4>' : case '</a:accent4>' :
case '<a:accent5>' : case '</a:accent5>' :
case '<a:accent6>' : case '</a:accent6>' :
case '<a:hlink>' : case '</a:hlink>' :
case '<a:folHlink>' : case '</a:folHlink>' :
2017-07-10 22:18:18 +00:00
if ( y [ 0 ] . charAt ( 1 ) === '/' ) {
2020-03-15 07:42:05 +00:00
themes . themeElements . clrScheme [ XLSXThemeClrScheme . indexOf ( y [ 0 ] ) ] = color ;
2017-02-03 20:50:45 +00:00
color = { } ;
} else {
2018-01-11 08:01:25 +00:00
color . name = y [ 0 ] . slice ( 3 , y [ 0 ] . length - 1 ) ;
2017-02-03 20:50:45 +00:00
}
break ;
2017-03-18 23:25:50 +00:00
default : if ( opts && opts . WTF ) throw new Error ( 'Unrecognized ' + y [ 0 ] + ' in clrScheme' ) ;
2017-02-03 20:50:45 +00:00
}
} ) ;
}
/* 20.1.4.1.18 fontScheme CT_FontScheme */
2018-01-23 09:07:51 +00:00
function parse _fontScheme ( /*::t, themes, opts*/ ) { }
2017-02-03 20:50:45 +00:00
/* 20.1.4.1.15 fmtScheme CT_StyleMatrix */
2018-01-23 09:07:51 +00:00
function parse _fmtScheme ( /*::t, themes, opts*/ ) { }
2017-02-03 20:50:45 +00:00
2017-06-24 06:51:37 +00:00
var clrsregex = /<a:clrScheme([^>]*)>[\s\S]*<\/a:clrScheme>/ ;
var fntsregex = /<a:fontScheme([^>]*)>[\s\S]*<\/a:fontScheme>/ ;
var fmtsregex = /<a:fmtScheme([^>]*)>[\s\S]*<\/a:fmtScheme>/ ;
2017-02-03 20:50:45 +00:00
/* 20.1.6.10 themeElements CT_BaseStyles */
2017-03-18 23:25:50 +00:00
function parse _themeElements ( data , themes , opts ) {
2017-02-03 20:50:45 +00:00
themes . themeElements = { } ;
var t ;
[
/* clrScheme CT_ColorScheme */
[ 'clrScheme' , clrsregex , parse _clrScheme ] ,
/* fontScheme CT_FontScheme */
[ 'fontScheme' , fntsregex , parse _fontScheme ] ,
/* fmtScheme CT_StyleMatrix */
[ 'fmtScheme' , fmtsregex , parse _fmtScheme ]
] . forEach ( function ( m ) {
2017-02-10 19:23:01 +00:00
if ( ! ( t = data . match ( m [ 1 ] ) ) ) throw new Error ( m [ 0 ] + ' not found in themeElements' ) ;
2017-03-18 23:25:50 +00:00
m [ 2 ] ( t , themes , opts ) ;
2017-02-03 20:50:45 +00:00
} ) ;
}
2017-06-24 06:51:37 +00:00
var themeltregex = /<a:themeElements([^>]*)>[\s\S]*<\/a:themeElements>/ ;
2017-02-03 20:50:45 +00:00
/* 14.2.7 Theme Part */
2017-03-12 18:02:43 +00:00
function parse _theme _xml ( data /*:string*/ , opts ) {
2017-02-03 20:50:45 +00:00
/* 20.1.6.9 theme CT_OfficeStyleSheet */
2022-03-12 14:05:57 +00:00
if ( ! data || data . length === 0 ) data = write _theme ( ) ;
2017-02-03 20:50:45 +00:00
var t ;
2017-03-18 23:25:50 +00:00
var themes = { } ;
2017-02-03 20:50:45 +00:00
/* themeElements CT_BaseStyles */
2017-03-27 21:35:15 +00:00
if ( ! ( t = data . match ( themeltregex ) ) ) throw new Error ( 'themeElements not found in theme' ) ;
2017-03-18 23:25:50 +00:00
parse _themeElements ( t [ 0 ] , themes , opts ) ;
2019-11-15 01:46:49 +00:00
themes . raw = data ;
2017-02-03 20:50:45 +00:00
return themes ;
}
2017-03-18 23:25:50 +00:00
function write _theme ( Themes , opts ) /*:string*/ {
2017-04-17 02:08:23 +00:00
if ( opts && opts . themeXLSX ) return opts . themeXLSX ;
2019-11-01 03:09:14 +00:00
if ( Themes && typeof Themes . raw == "string" ) return Themes . raw ;
2017-02-10 19:23:01 +00:00
var o = [ XML _HEADER ] ;
o [ o . length ] = '<a:theme xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" name="Office Theme">' ;
o [ o . length ] = '<a:themeElements>' ;
o [ o . length ] = '<a:clrScheme name="Office">' ;
o [ o . length ] = '<a:dk1><a:sysClr val="windowText" lastClr="000000"/></a:dk1>' ;
o [ o . length ] = '<a:lt1><a:sysClr val="window" lastClr="FFFFFF"/></a:lt1>' ;
o [ o . length ] = '<a:dk2><a:srgbClr val="1F497D"/></a:dk2>' ;
o [ o . length ] = '<a:lt2><a:srgbClr val="EEECE1"/></a:lt2>' ;
o [ o . length ] = '<a:accent1><a:srgbClr val="4F81BD"/></a:accent1>' ;
o [ o . length ] = '<a:accent2><a:srgbClr val="C0504D"/></a:accent2>' ;
o [ o . length ] = '<a:accent3><a:srgbClr val="9BBB59"/></a:accent3>' ;
o [ o . length ] = '<a:accent4><a:srgbClr val="8064A2"/></a:accent4>' ;
o [ o . length ] = '<a:accent5><a:srgbClr val="4BACC6"/></a:accent5>' ;
o [ o . length ] = '<a:accent6><a:srgbClr val="F79646"/></a:accent6>' ;
o [ o . length ] = '<a:hlink><a:srgbClr val="0000FF"/></a:hlink>' ;
o [ o . length ] = '<a:folHlink><a:srgbClr val="800080"/></a:folHlink>' ;
o [ o . length ] = '</a:clrScheme>' ;
o [ o . length ] = '<a:fontScheme name="Office">' ;
o [ o . length ] = '<a:majorFont>' ;
o [ o . length ] = '<a:latin typeface="Cambria"/>' ;
o [ o . length ] = '<a:ea typeface=""/>' ;
o [ o . length ] = '<a:cs typeface=""/>' ;
o [ o . length ] = '<a:font script="Jpan" typeface="M S Pゴシック"/>' ;
o [ o . length ] = '<a:font script="Hang" typeface="맑은 고딕"/>' ;
o [ o . length ] = '<a:font script="Hans" typeface="宋体"/>' ;
o [ o . length ] = '<a:font script="Hant" typeface="新細明體"/>' ;
o [ o . length ] = '<a:font script="Arab" typeface="Times New Roman"/>' ;
o [ o . length ] = '<a:font script="Hebr" typeface="Times New Roman"/>' ;
o [ o . length ] = '<a:font script="Thai" typeface="Tahoma"/>' ;
o [ o . length ] = '<a:font script="Ethi" typeface="Nyala"/>' ;
o [ o . length ] = '<a:font script="Beng" typeface="Vrinda"/>' ;
o [ o . length ] = '<a:font script="Gujr" typeface="Shruti"/>' ;
o [ o . length ] = '<a:font script="Khmr" typeface="MoolBoran"/>' ;
o [ o . length ] = '<a:font script="Knda" typeface="Tunga"/>' ;
o [ o . length ] = '<a:font script="Guru" typeface="Raavi"/>' ;
o [ o . length ] = '<a:font script="Cans" typeface="Euphemia"/>' ;
o [ o . length ] = '<a:font script="Cher" typeface="Plantagenet Cherokee"/>' ;
o [ o . length ] = '<a:font script="Yiii" typeface="Microsoft Yi Baiti"/>' ;
o [ o . length ] = '<a:font script="Tibt" typeface="Microsoft Himalaya"/>' ;
o [ o . length ] = '<a:font script="Thaa" typeface="MV Boli"/>' ;
o [ o . length ] = '<a:font script="Deva" typeface="Mangal"/>' ;
o [ o . length ] = '<a:font script="Telu" typeface="Gautami"/>' ;
o [ o . length ] = '<a:font script="Taml" typeface="Latha"/>' ;
o [ o . length ] = '<a:font script="Syrc" typeface="Estrangelo Edessa"/>' ;
o [ o . length ] = '<a:font script="Orya" typeface="Kalinga"/>' ;
o [ o . length ] = '<a:font script="Mlym" typeface="Kartika"/>' ;
o [ o . length ] = '<a:font script="Laoo" typeface="DokChampa"/>' ;
o [ o . length ] = '<a:font script="Sinh" typeface="Iskoola Pota"/>' ;
o [ o . length ] = '<a:font script="Mong" typeface="Mongolian Baiti"/>' ;
o [ o . length ] = '<a:font script="Viet" typeface="Times New Roman"/>' ;
o [ o . length ] = '<a:font script="Uigh" typeface="Microsoft Uighur"/>' ;
o [ o . length ] = '<a:font script="Geor" typeface="Sylfaen"/>' ;
o [ o . length ] = '</a:majorFont>' ;
o [ o . length ] = '<a:minorFont>' ;
o [ o . length ] = '<a:latin typeface="Calibri"/>' ;
o [ o . length ] = '<a:ea typeface=""/>' ;
o [ o . length ] = '<a:cs typeface=""/>' ;
o [ o . length ] = '<a:font script="Jpan" typeface="M S Pゴシック"/>' ;
o [ o . length ] = '<a:font script="Hang" typeface="맑은 고딕"/>' ;
o [ o . length ] = '<a:font script="Hans" typeface="宋体"/>' ;
o [ o . length ] = '<a:font script="Hant" typeface="新細明體"/>' ;
o [ o . length ] = '<a:font script="Arab" typeface="Arial"/>' ;
o [ o . length ] = '<a:font script="Hebr" typeface="Arial"/>' ;
o [ o . length ] = '<a:font script="Thai" typeface="Tahoma"/>' ;
o [ o . length ] = '<a:font script="Ethi" typeface="Nyala"/>' ;
o [ o . length ] = '<a:font script="Beng" typeface="Vrinda"/>' ;
o [ o . length ] = '<a:font script="Gujr" typeface="Shruti"/>' ;
o [ o . length ] = '<a:font script="Khmr" typeface="DaunPenh"/>' ;
o [ o . length ] = '<a:font script="Knda" typeface="Tunga"/>' ;
o [ o . length ] = '<a:font script="Guru" typeface="Raavi"/>' ;
o [ o . length ] = '<a:font script="Cans" typeface="Euphemia"/>' ;
o [ o . length ] = '<a:font script="Cher" typeface="Plantagenet Cherokee"/>' ;
o [ o . length ] = '<a:font script="Yiii" typeface="Microsoft Yi Baiti"/>' ;
o [ o . length ] = '<a:font script="Tibt" typeface="Microsoft Himalaya"/>' ;
o [ o . length ] = '<a:font script="Thaa" typeface="MV Boli"/>' ;
o [ o . length ] = '<a:font script="Deva" typeface="Mangal"/>' ;
o [ o . length ] = '<a:font script="Telu" typeface="Gautami"/>' ;
o [ o . length ] = '<a:font script="Taml" typeface="Latha"/>' ;
o [ o . length ] = '<a:font script="Syrc" typeface="Estrangelo Edessa"/>' ;
o [ o . length ] = '<a:font script="Orya" typeface="Kalinga"/>' ;
o [ o . length ] = '<a:font script="Mlym" typeface="Kartika"/>' ;
o [ o . length ] = '<a:font script="Laoo" typeface="DokChampa"/>' ;
o [ o . length ] = '<a:font script="Sinh" typeface="Iskoola Pota"/>' ;
o [ o . length ] = '<a:font script="Mong" typeface="Mongolian Baiti"/>' ;
o [ o . length ] = '<a:font script="Viet" typeface="Arial"/>' ;
o [ o . length ] = '<a:font script="Uigh" typeface="Microsoft Uighur"/>' ;
o [ o . length ] = '<a:font script="Geor" typeface="Sylfaen"/>' ;
o [ o . length ] = '</a:minorFont>' ;
o [ o . length ] = '</a:fontScheme>' ;
o [ o . length ] = '<a:fmtScheme name="Office">' ;
o [ o . length ] = '<a:fillStyleLst>' ;
o [ o . length ] = '<a:solidFill><a:schemeClr val="phClr"/></a:solidFill>' ;
o [ o . length ] = '<a:gradFill rotWithShape="1">' ;
o [ o . length ] = '<a:gsLst>' ;
o [ o . length ] = '<a:gs pos="0"><a:schemeClr val="phClr"><a:tint val="50000"/><a:satMod val="300000"/></a:schemeClr></a:gs>' ;
o [ o . length ] = '<a:gs pos="35000"><a:schemeClr val="phClr"><a:tint val="37000"/><a:satMod val="300000"/></a:schemeClr></a:gs>' ;
o [ o . length ] = '<a:gs pos="100000"><a:schemeClr val="phClr"><a:tint val="15000"/><a:satMod val="350000"/></a:schemeClr></a:gs>' ;
o [ o . length ] = '</a:gsLst>' ;
o [ o . length ] = '<a:lin ang="16200000" scaled="1"/>' ;
o [ o . length ] = '</a:gradFill>' ;
o [ o . length ] = '<a:gradFill rotWithShape="1">' ;
o [ o . length ] = '<a:gsLst>' ;
o [ o . length ] = '<a:gs pos="0"><a:schemeClr val="phClr"><a:tint val="100000"/><a:shade val="100000"/><a:satMod val="130000"/></a:schemeClr></a:gs>' ;
o [ o . length ] = '<a:gs pos="100000"><a:schemeClr val="phClr"><a:tint val="50000"/><a:shade val="100000"/><a:satMod val="350000"/></a:schemeClr></a:gs>' ;
o [ o . length ] = '</a:gsLst>' ;
o [ o . length ] = '<a:lin ang="16200000" scaled="0"/>' ;
o [ o . length ] = '</a:gradFill>' ;
o [ o . length ] = '</a:fillStyleLst>' ;
o [ o . length ] = '<a:lnStyleLst>' ;
o [ o . length ] = '<a:ln w="9525" cap="flat" cmpd="sng" algn="ctr"><a:solidFill><a:schemeClr val="phClr"><a:shade val="95000"/><a:satMod val="105000"/></a:schemeClr></a:solidFill><a:prstDash val="solid"/></a:ln>' ;
o [ o . length ] = '<a:ln w="25400" cap="flat" cmpd="sng" algn="ctr"><a:solidFill><a:schemeClr val="phClr"/></a:solidFill><a:prstDash val="solid"/></a:ln>' ;
o [ o . length ] = '<a:ln w="38100" cap="flat" cmpd="sng" algn="ctr"><a:solidFill><a:schemeClr val="phClr"/></a:solidFill><a:prstDash val="solid"/></a:ln>' ;
o [ o . length ] = '</a:lnStyleLst>' ;
o [ o . length ] = '<a:effectStyleLst>' ;
o [ o . length ] = '<a:effectStyle>' ;
o [ o . length ] = '<a:effectLst>' ;
o [ o . length ] = '<a:outerShdw blurRad="40000" dist="20000" dir="5400000" rotWithShape="0"><a:srgbClr val="000000"><a:alpha val="38000"/></a:srgbClr></a:outerShdw>' ;
o [ o . length ] = '</a:effectLst>' ;
o [ o . length ] = '</a:effectStyle>' ;
o [ o . length ] = '<a:effectStyle>' ;
o [ o . length ] = '<a:effectLst>' ;
o [ o . length ] = '<a:outerShdw blurRad="40000" dist="23000" dir="5400000" rotWithShape="0"><a:srgbClr val="000000"><a:alpha val="35000"/></a:srgbClr></a:outerShdw>' ;
o [ o . length ] = '</a:effectLst>' ;
o [ o . length ] = '</a:effectStyle>' ;
o [ o . length ] = '<a:effectStyle>' ;
o [ o . length ] = '<a:effectLst>' ;
o [ o . length ] = '<a:outerShdw blurRad="40000" dist="23000" dir="5400000" rotWithShape="0"><a:srgbClr val="000000"><a:alpha val="35000"/></a:srgbClr></a:outerShdw>' ;
o [ o . length ] = '</a:effectLst>' ;
o [ o . length ] = '<a:scene3d><a:camera prst="orthographicFront"><a:rot lat="0" lon="0" rev="0"/></a:camera><a:lightRig rig="threePt" dir="t"><a:rot lat="0" lon="0" rev="1200000"/></a:lightRig></a:scene3d>' ;
o [ o . length ] = '<a:sp3d><a:bevelT w="63500" h="25400"/></a:sp3d>' ;
o [ o . length ] = '</a:effectStyle>' ;
o [ o . length ] = '</a:effectStyleLst>' ;
o [ o . length ] = '<a:bgFillStyleLst>' ;
o [ o . length ] = '<a:solidFill><a:schemeClr val="phClr"/></a:solidFill>' ;
o [ o . length ] = '<a:gradFill rotWithShape="1">' ;
o [ o . length ] = '<a:gsLst>' ;
o [ o . length ] = '<a:gs pos="0"><a:schemeClr val="phClr"><a:tint val="40000"/><a:satMod val="350000"/></a:schemeClr></a:gs>' ;
o [ o . length ] = '<a:gs pos="40000"><a:schemeClr val="phClr"><a:tint val="45000"/><a:shade val="99000"/><a:satMod val="350000"/></a:schemeClr></a:gs>' ;
o [ o . length ] = '<a:gs pos="100000"><a:schemeClr val="phClr"><a:shade val="20000"/><a:satMod val="255000"/></a:schemeClr></a:gs>' ;
o [ o . length ] = '</a:gsLst>' ;
o [ o . length ] = '<a:path path="circle"><a:fillToRect l="50000" t="-80000" r="50000" b="180000"/></a:path>' ;
o [ o . length ] = '</a:gradFill>' ;
o [ o . length ] = '<a:gradFill rotWithShape="1">' ;
o [ o . length ] = '<a:gsLst>' ;
o [ o . length ] = '<a:gs pos="0"><a:schemeClr val="phClr"><a:tint val="80000"/><a:satMod val="300000"/></a:schemeClr></a:gs>' ;
o [ o . length ] = '<a:gs pos="100000"><a:schemeClr val="phClr"><a:shade val="30000"/><a:satMod val="200000"/></a:schemeClr></a:gs>' ;
o [ o . length ] = '</a:gsLst>' ;
o [ o . length ] = '<a:path path="circle"><a:fillToRect l="50000" t="50000" r="50000" b="50000"/></a:path>' ;
o [ o . length ] = '</a:gradFill>' ;
o [ o . length ] = '</a:bgFillStyleLst>' ;
o [ o . length ] = '</a:fmtScheme>' ;
o [ o . length ] = '</a:themeElements>' ;
2017-03-18 23:25:50 +00:00
2017-02-10 19:23:01 +00:00
o [ o . length ] = '<a:objectDefaults>' ;
o [ o . length ] = '<a:spDef>' ;
o [ o . length ] = '<a:spPr/><a:bodyPr/><a:lstStyle/><a:style><a:lnRef idx="1"><a:schemeClr val="accent1"/></a:lnRef><a:fillRef idx="3"><a:schemeClr val="accent1"/></a:fillRef><a:effectRef idx="2"><a:schemeClr val="accent1"/></a:effectRef><a:fontRef idx="minor"><a:schemeClr val="lt1"/></a:fontRef></a:style>' ;
o [ o . length ] = '</a:spDef>' ;
o [ o . length ] = '<a:lnDef>' ;
o [ o . length ] = '<a:spPr/><a:bodyPr/><a:lstStyle/><a:style><a:lnRef idx="2"><a:schemeClr val="accent1"/></a:lnRef><a:fillRef idx="0"><a:schemeClr val="accent1"/></a:fillRef><a:effectRef idx="1"><a:schemeClr val="accent1"/></a:effectRef><a:fontRef idx="minor"><a:schemeClr val="tx1"/></a:fontRef></a:style>' ;
2017-03-18 23:25:50 +00:00
o [ o . length ] = '</a:lnDef>' ;
2017-02-10 19:23:01 +00:00
o [ o . length ] = '</a:objectDefaults>' ;
o [ o . length ] = '<a:extraClrSchemeLst/>' ;
o [ o . length ] = '</a:theme>' ;
return o . join ( "" ) ;
}
2017-02-03 20:50:45 +00:00
/* [MS-XLS] 2.4.326 TODO: payload is a zip file */
2017-03-18 23:25:50 +00:00
function parse _Theme ( blob , length , opts ) {
2017-12-30 05:40:35 +00:00
var end = blob . l + length ;
2017-02-03 20:50:45 +00:00
var dwThemeVersion = blob . read _shift ( 4 ) ;
if ( dwThemeVersion === 124226 ) return ;
2021-10-13 07:20:25 +00:00
if ( ! opts . cellStyles ) { blob . l = end ; return ; }
2017-12-30 05:40:35 +00:00
var data = blob . slice ( blob . l ) ;
blob . l = end ;
2021-10-13 07:20:25 +00:00
var zip ; try { zip = zip _read ( data , { type : "array" } ) ; } catch ( e ) { return ; }
2017-12-30 05:40:35 +00:00
var themeXML = getzipstr ( zip , "theme/theme/theme1.xml" , true ) ;
if ( ! themeXML ) return ;
return parse _theme _xml ( themeXML , opts ) ;
2017-02-03 20:50:45 +00:00
}
/* 2.5.49 */
2018-01-23 09:07:51 +00:00
function parse _ColorTheme ( blob /*::, length*/ ) { return blob . read _shift ( 4 ) ; }
2017-02-03 20:50:45 +00:00
/* 2.5.155 */
2018-01-23 09:07:51 +00:00
function parse _FullColorExt ( blob /*::, length*/ ) {
2017-02-03 20:50:45 +00:00
var o = { } ;
o . xclrType = blob . read _shift ( 2 ) ;
o . nTintShade = blob . read _shift ( 2 ) ;
switch ( o . xclrType ) {
case 0 : blob . l += 4 ; break ;
case 1 : o . xclrValue = parse _IcvXF ( blob , 4 ) ; break ;
case 2 : o . xclrValue = parse _LongRGBA ( blob , 4 ) ; break ;
case 3 : o . xclrValue = parse _ColorTheme ( blob , 4 ) ; break ;
case 4 : blob . l += 4 ; break ;
}
blob . l += 8 ;
return o ;
}
/* 2.5.164 TODO: read 7 bits*/
function parse _IcvXF ( blob , length ) {
return parsenoop ( blob , length ) ;
}
/* 2.5.280 */
function parse _XFExtGradient ( blob , length ) {
return parsenoop ( blob , length ) ;
}
2018-02-14 20:06:35 +00:00
/* [MS-XLS] 2.5.108 */
2018-01-23 09:07:51 +00:00
function parse _ExtProp ( blob /*::, length*/ ) /*:Array<any>*/ {
2017-02-03 20:50:45 +00:00
var extType = blob . read _shift ( 2 ) ;
2018-02-14 20:06:35 +00:00
var cb = blob . read _shift ( 2 ) - 4 ;
2017-02-03 20:50:45 +00:00
var o = [ extType ] ;
switch ( extType ) {
case 0x04 : case 0x05 : case 0x07 : case 0x08 :
case 0x09 : case 0x0A : case 0x0B : case 0x0D :
o [ 1 ] = parse _FullColorExt ( blob , cb ) ; break ;
case 0x06 : o [ 1 ] = parse _XFExtGradient ( blob , cb ) ; break ;
2018-02-14 20:06:35 +00:00
case 0x0E : case 0x0F : o [ 1 ] = blob . read _shift ( cb === 1 ? 1 : 2 ) ; break ;
2017-02-03 20:50:45 +00:00
default : throw new Error ( "Unrecognized ExtProp type: " + extType + " " + cb ) ;
}
return o ;
}
/* 2.4.355 */
function parse _XFExt ( blob , length ) {
var end = blob . l + length ;
blob . l += 2 ;
var ixfe = blob . read _shift ( 2 ) ;
blob . l += 2 ;
var cexts = blob . read _shift ( 2 ) ;
2017-12-30 05:40:35 +00:00
var ext /*:AOA*/ = [ ] ;
2017-02-03 20:50:45 +00:00
while ( cexts -- > 0 ) ext . push ( parse _ExtProp ( blob , end - blob . l ) ) ;
return { ixfe : ixfe , ext : ext } ;
}
/* xf is an XF, see parse_XFExt for xfext */
function update _xfext ( xf , xfext ) {
xfext . forEach ( function ( xfe ) {
switch ( xfe [ 0 ] ) { /* 2.5.108 extPropData */
case 0x04 : break ; /* foreground color */
case 0x05 : break ; /* background color */
2017-03-13 06:46:37 +00:00
case 0x06 : break ; /* gradient fill */
case 0x07 : break ; /* top cell border color */
case 0x08 : break ; /* bottom cell border color */
case 0x09 : break ; /* left cell border color */
case 0x0a : break ; /* right cell border color */
case 0x0b : break ; /* diagonal cell border color */
2019-11-15 01:46:49 +00:00
case 0x0d : /* text color */
break ;
2017-02-03 20:50:45 +00:00
case 0x0e : break ; /* font scheme */
2017-03-13 06:46:37 +00:00
case 0x0f : break ; /* indentation level */
2017-02-03 20:50:45 +00:00
}
} ) ;
}
2022-03-03 08:35:39 +00:00
function parse _BrtMdtinfo ( data , length ) {
return {
flags : data . read _shift ( 4 ) ,
version : data . read _shift ( 4 ) ,
name : parse _XLWideString ( data , length - 8 )
} ;
}
function write _BrtMdtinfo ( data ) {
var o = new _buf ( 12 + 2 * data . name . length ) ;
o . write _shift ( 4 , data . flags ) ;
o . write _shift ( 4 , data . version ) ;
write _XLWideString ( data . name , o ) ;
return o . slice ( 0 , o . l ) ;
}
2022-03-16 03:18:09 +00:00
function parse _BrtMdb ( data ) {
var out = [ ] ;
var cnt = data . read _shift ( 4 ) ;
while ( cnt -- > 0 )
out . push ( [ data . read _shift ( 4 ) , data . read _shift ( 4 ) ] ) ;
return out ;
}
2022-03-03 08:35:39 +00:00
function write _BrtMdb ( mdb ) {
var o = new _buf ( 4 + 8 * mdb . length ) ;
o . write _shift ( 4 , mdb . length ) ;
for ( var i = 0 ; i < mdb . length ; ++ i ) {
o . write _shift ( 4 , mdb [ i ] [ 0 ] ) ;
o . write _shift ( 4 , mdb [ i ] [ 1 ] ) ;
}
return o ;
}
function write _BrtBeginEsfmd ( cnt , name ) {
var o = new _buf ( 8 + 2 * name . length ) ;
o . write _shift ( 4 , cnt ) ;
write _XLWideString ( name , o ) ;
return o . slice ( 0 , o . l ) ;
}
2022-03-16 03:18:09 +00:00
function parse _BrtBeginEsmdb ( data ) {
data . l += 4 ;
return data . read _shift ( 4 ) != 0 ;
}
2022-03-03 08:35:39 +00:00
function write _BrtBeginEsmdb ( cnt , cm ) {
var o = new _buf ( 8 ) ;
o . write _shift ( 4 , cnt ) ;
o . write _shift ( 4 , cm ? 1 : 0 ) ;
return o ;
}
function parse _xlmeta _bin ( data , name , _opts ) {
2022-03-16 03:18:09 +00:00
var out = { Types : [ ] , Cell : [ ] , Value : [ ] } ;
2022-03-03 08:35:39 +00:00
var opts = _opts || { } ;
var state = [ ] ;
var pass = false ;
2022-03-16 03:18:09 +00:00
var metatype = 2 ;
2022-03-12 14:05:57 +00:00
recordhopper ( data , function ( val , R , RT ) {
2022-03-03 08:35:39 +00:00
switch ( RT ) {
case 335 :
out . Types . push ( { name : val . name } ) ;
break ;
case 51 :
2022-03-16 03:18:09 +00:00
val . forEach ( function ( r ) {
if ( metatype == 1 )
out . Cell . push ( { type : out . Types [ r [ 0 ] - 1 ] . name , index : r [ 1 ] } ) ;
else if ( metatype == 0 )
out . Value . push ( { type : out . Types [ r [ 0 ] - 1 ] . name , index : r [ 1 ] } ) ;
} ) ;
break ;
case 337 :
metatype = val ? 1 : 0 ;
break ;
case 338 :
metatype = 2 ;
2022-03-03 08:35:39 +00:00
break ;
case 35 :
2022-03-12 14:05:57 +00:00
state . push ( RT ) ;
2022-03-03 08:35:39 +00:00
pass = true ;
break ;
case 36 :
state . pop ( ) ;
pass = false ;
break ;
default :
2022-03-12 14:05:57 +00:00
if ( R . T ) {
} else if ( ! pass || opts . WTF && state [ state . length - 1 ] != 35 )
throw new Error ( "Unexpected record 0x" + RT . toString ( 16 ) ) ;
2022-03-03 08:35:39 +00:00
}
} ) ;
return out ;
}
function write _xlmeta _bin ( ) {
var ba = buf _array ( ) ;
2022-03-12 14:05:57 +00:00
write _record ( ba , 332 ) ;
write _record ( ba , 334 , write _UInt32LE ( 1 ) ) ;
write _record ( ba , 335 , write _BrtMdtinfo ( {
2022-03-03 08:35:39 +00:00
name : "XLDAPR" ,
version : 12e4 ,
flags : 3496657072
} ) ) ;
2022-03-12 14:05:57 +00:00
write _record ( ba , 336 ) ;
write _record ( ba , 339 , write _BrtBeginEsfmd ( 1 , "XLDAPR" ) ) ;
write _record ( ba , 52 ) ;
write _record ( ba , 35 , write _UInt32LE ( 514 ) ) ;
write _record ( ba , 4096 , write _UInt32LE ( 0 ) ) ;
write _record ( ba , 4097 , writeuint16 ( 1 ) ) ;
write _record ( ba , 36 ) ;
write _record ( ba , 53 ) ;
write _record ( ba , 340 ) ;
write _record ( ba , 337 , write _BrtBeginEsmdb ( 1 , true ) ) ;
write _record ( ba , 51 , write _BrtMdb ( [ [ 1 , 0 ] ] ) ) ;
write _record ( ba , 338 ) ;
write _record ( ba , 333 ) ;
2022-03-03 08:35:39 +00:00
return ba . end ( ) ;
}
2022-03-16 03:18:09 +00:00
function parse _xlmeta _xml ( data , name , opts ) {
var out = { Types : [ ] , Cell : [ ] , Value : [ ] } ;
if ( ! data )
return out ;
var pass = false ;
var metatype = 2 ;
2022-03-21 01:39:16 +00:00
var lastmeta ;
2022-03-16 03:18:09 +00:00
data . replace ( tagregex , function ( x ) {
var y = parsexmltag ( x ) ;
switch ( strip _ns ( y [ 0 ] ) ) {
case "<?xml" :
break ;
case "<metadata" :
case "</metadata>" :
break ;
case "<metadataTypes" :
case "</metadataTypes>" :
break ;
case "<metadataType" :
out . Types . push ( { name : y . name } ) ;
break ;
case "</metadataType>" :
break ;
case "<futureMetadata" :
2022-03-21 01:39:16 +00:00
for ( var j = 0 ; j < out . Types . length ; ++ j )
if ( out . Types [ j ] . name == y . name )
lastmeta = out . Types [ j ] ;
2022-03-16 03:18:09 +00:00
break ;
case "</futureMetadata>" :
break ;
case "<bk>" :
break ;
case "</bk>" :
break ;
case "<rc" :
if ( metatype == 1 )
out . Cell . push ( { type : out . Types [ y . t - 1 ] . name , index : + y . v } ) ;
else if ( metatype == 0 )
out . Value . push ( { type : out . Types [ y . t - 1 ] . name , index : + y . v } ) ;
break ;
case "</rc>" :
break ;
case "<cellMetadata" :
metatype = 1 ;
break ;
case "</cellMetadata>" :
metatype = 2 ;
break ;
case "<valueMetadata" :
metatype = 0 ;
break ;
case "</valueMetadata>" :
metatype = 2 ;
break ;
case "<extLst" :
case "<extLst>" :
case "</extLst>" :
case "<extLst/>" :
break ;
case "<ext" :
pass = true ;
break ;
case "</ext>" :
pass = false ;
break ;
2022-03-21 01:39:16 +00:00
case "<rvb" :
if ( ! lastmeta )
break ;
if ( ! lastmeta . offsets )
lastmeta . offsets = [ ] ;
lastmeta . offsets . push ( + y . i ) ;
break ;
2022-03-16 03:18:09 +00:00
default :
if ( ! pass && opts . WTF )
throw new Error ( "unrecognized " + y [ 0 ] + " in metadata" ) ;
}
return x ;
} ) ;
return out ;
}
function write _xlmeta _xml ( ) {
var o = [ XML _HEADER ] ;
o . push ( '<metadata xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" xmlns:xlrd="http://schemas.microsoft.com/office/spreadsheetml/2017/richdata" xmlns:xda="http://schemas.microsoft.com/office/spreadsheetml/2017/dynamicarray">\n <metadataTypes count="1">\n <metadataType name="XLDAPR" minSupportedVersion="120000" copy="1" pasteAll="1" pasteValues="1" merge="1" splitFirst="1" rowColShift="1" clearFormats="1" clearComments="1" assign="1" coerce="1" cellMeta="1"/>\n </metadataTypes>\n <futureMetadata name="XLDAPR" count="1">\n <bk>\n <extLst>\n <ext uri="{bdbb8cdc-fa1e-496e-a857-3c3f30c029c3}">\n <xda:dynamicArrayProperties fDynamic="1" fCollapsed="0"/>\n </ext>\n </extLst>\n </bk>\n </futureMetadata>\n <cellMetadata count="1">\n <bk>\n <rc t="1" v="0"/>\n </bk>\n </cellMetadata>\n</metadata>' ) ;
return o . join ( "" ) ;
}
2017-02-03 20:50:45 +00:00
/* 18.6 Calculation Chain */
2018-01-23 09:07:51 +00:00
function parse _cc _xml ( data /*::, name, opts*/ ) /*:Array<any>*/ {
2017-02-03 20:50:45 +00:00
var d = [ ] ;
2017-02-10 19:23:01 +00:00
if ( ! data ) return d ;
2018-01-23 09:07:51 +00:00
var i = 1 ;
2017-02-03 20:50:45 +00:00
( data . match ( tagregex ) || [ ] ) . forEach ( function ( x ) {
var y = parsexmltag ( x ) ;
switch ( y [ 0 ] ) {
case '<?xml' : break ;
/* 18.6.2 calcChain CT_CalcChain 1 */
case '<calcChain' : case '<calcChain>' : case '</calcChain>' : break ;
/* 18.6.1 c CT_CalcCell 1 */
case '<c' : delete y [ 0 ] ; if ( y . i ) i = y . i ; else y . i = i ; d . push ( y ) ; break ;
}
} ) ;
return d ;
}
2018-01-23 09:07:51 +00:00
//function write_cc_xml(data, opts) { }
2017-08-19 23:06:34 +00:00
2017-02-03 20:50:45 +00:00
/* [MS-XLSB] 2.6.4.1 */
2018-01-23 09:07:51 +00:00
function parse _BrtCalcChainItem$ ( data ) {
2017-02-03 20:50:45 +00:00
var out = { } ;
out . i = data . read _shift ( 4 ) ;
var cell = { } ;
cell . r = data . read _shift ( 4 ) ;
cell . c = data . read _shift ( 4 ) ;
out . r = encode _cell ( cell ) ;
var flags = data . read _shift ( 1 ) ;
if ( flags & 0x2 ) out . l = '1' ;
if ( flags & 0x8 ) out . a = '1' ;
return out ;
}
/* 18.6 Calculation Chain */
2017-08-19 23:06:34 +00:00
function parse _cc _bin ( data , name , opts ) {
2017-02-03 20:50:45 +00:00
var out = [ ] ;
var pass = false ;
2022-03-12 14:05:57 +00:00
recordhopper ( data , function hopper _cc ( val , R , RT ) {
2017-04-09 04:03:19 +00:00
switch ( RT ) {
case 0x003F : /* 'BrtCalcChainItem$' */
out . push ( val ) ; break ;
default :
2022-03-12 14:05:57 +00:00
if ( R . T ) { /* empty */ }
else if ( ! pass || opts . WTF ) throw new Error ( "Unexpected record 0x" + RT . toString ( 16 ) ) ;
2017-02-03 20:50:45 +00:00
}
} ) ;
return out ;
}
2018-01-23 09:07:51 +00:00
//function write_cc_bin(data, opts) { }
2017-08-19 23:06:34 +00:00
/* 18.14 Supplementary Workbook Data */
2019-11-01 03:09:14 +00:00
function parse _xlink _xml ( /*::data, rel, name:string, _opts*/ ) {
2018-01-23 09:07:51 +00:00
//var opts = _opts || {};
2017-08-19 23:06:34 +00:00
//if(opts.WTF) throw "XLSX External Link";
}
/* [MS-XLSB] 2.1.7.25 External Link */
2019-11-01 03:09:14 +00:00
function parse _xlink _bin ( data , rel , name /*:string*/ , _opts ) {
2017-08-19 23:06:34 +00:00
if ( ! data ) return data ;
var opts = _opts || { } ;
var pass = false , end = false ;
2022-03-12 14:05:57 +00:00
recordhopper ( data , function xlink _parse ( val , R , RT ) {
2017-08-19 23:06:34 +00:00
if ( end ) return ;
switch ( RT ) {
case 0x0167 : /* 'BrtSupTabs' */
case 0x016B : /* 'BrtExternTableStart' */
case 0x016C : /* 'BrtExternTableEnd' */
case 0x016E : /* 'BrtExternRowHdr' */
case 0x016F : /* 'BrtExternCellBlank' */
case 0x0170 : /* 'BrtExternCellReal' */
case 0x0171 : /* 'BrtExternCellBool' */
case 0x0172 : /* 'BrtExternCellError' */
case 0x0173 : /* 'BrtExternCellString' */
case 0x01D8 : /* 'BrtExternValueMeta' */
case 0x0241 : /* 'BrtSupNameStart' */
case 0x0242 : /* 'BrtSupNameValueStart' */
case 0x0243 : /* 'BrtSupNameValueEnd' */
case 0x0244 : /* 'BrtSupNameNum' */
case 0x0245 : /* 'BrtSupNameErr' */
case 0x0246 : /* 'BrtSupNameSt' */
case 0x0247 : /* 'BrtSupNameNil' */
case 0x0248 : /* 'BrtSupNameBool' */
case 0x0249 : /* 'BrtSupNameFmla' */
case 0x024A : /* 'BrtSupNameBits' */
case 0x024B : /* 'BrtSupNameEnd' */
break ;
case 0x0023 : /* 'BrtFRTBegin' */
pass = true ; break ;
case 0x0024 : /* 'BrtFRTEnd' */
pass = false ; break ;
default :
2022-03-12 14:05:57 +00:00
if ( R . T ) { /* empty */ }
else if ( ! pass || opts . WTF ) throw new Error ( "Unexpected record 0x" + RT . toString ( 16 ) ) ;
2017-08-19 23:06:34 +00:00
}
} , opts ) ;
}
2019-11-01 03:09:14 +00:00
/* 20.5 DrawingML - SpreadsheetML Drawing */
/* 20.5.2.35 wsDr CT_Drawing */
2017-03-27 21:35:15 +00:00
function parse _drawing ( data , rels /*:any*/ ) {
if ( ! data ) return "??" ;
/ *
Chartsheet Drawing :
- 20.5 . 2.35 wsDr CT _Drawing
- 20.5 . 2.1 absoluteAnchor CT _AbsoluteAnchor
- 20.5 . 2.16 graphicFrame CT _GraphicalObjectFrame
- 20.1 . 2.2 . 16 graphic CT _GraphicalObject
- 20.1 . 2.2 . 17 graphicData CT _GraphicalObjectData
2017-03-28 04:41:01 +00:00
- chart reference
the actual type is based on the URI of the graphicData
2017-03-27 21:35:15 +00:00
TODO : handle embedded charts and other types of graphics
* /
var id = ( data . match ( /<c:chart [^>]*r:id="([^"]*)"/ ) || [ "" , "" ] ) [ 1 ] ;
return rels [ '!id' ] [ id ] . Target ;
}
2017-04-08 06:55:35 +00:00
2017-04-02 06:47:25 +00:00
/* L.5.5.2 SpreadsheetML Comments + VML Schema */
2022-05-22 23:51:41 +00:00
function write _vml ( rId /*:number*/ , comments ) {
2017-04-02 06:47:25 +00:00
var csize = [ 21600 , 21600 ] ;
/* L.5.2.1.2 Path Attribute */
var bbox = [ "m0,0l0" , csize [ 1 ] , csize [ 0 ] , csize [ 1 ] , csize [ 0 ] , "0xe" ] . join ( "," ) ;
var o = [
writextag ( "xml" , null , { 'xmlns:v' : XLMLNS . v , 'xmlns:o' : XLMLNS . o , 'xmlns:x' : XLMLNS . x , 'xmlns:mv' : XLMLNS . mv } ) . replace ( /\/>/ , ">" ) ,
2022-05-22 23:51:41 +00:00
writextag ( "o:shapelayout" , writextag ( "o:idmap" , null , { 'v:ext' : "edit" , 'data' : rId } ) , { 'v:ext' : "edit" } )
2017-04-02 06:47:25 +00:00
] ;
2022-05-22 23:51:41 +00:00
var _shapeid = 65536 * rId ;
var _comments = comments || [ ] ;
if ( _comments . length > 0 ) o . push ( writextag ( "v:shapetype" , [
writextag ( "v:stroke" , null , { joinstyle : "miter" } ) ,
writextag ( "v:path" , null , { gradientshapeok : "t" , 'o:connecttype' : "rect" } )
] . join ( "" ) , { id : "_x0000_t202" , coordsize : csize . join ( "," ) , 'o:spt' : 202 , path : bbox } ) ) ;
_comments . forEach ( function ( x ) { ++ _shapeid ; o . push ( write _vml _comment ( x , _shapeid ) ) ; } ) ;
o . push ( '</xml>' ) ;
return o . join ( "" ) ;
}
function write _vml _comment ( x , _shapeid ) /*:string*/ {
2019-11-15 01:46:49 +00:00
var c = decode _cell ( x [ 0 ] ) ;
var fillopts = /*::(*/ { 'color2' : "#BEFF82" , 'type' : "gradient" } /*:: :any)*/ ;
if ( fillopts . type == "gradient" ) fillopts . angle = "-180" ;
var fillparm = fillopts . type == "gradient" ? writextag ( "o:fill" , null , { type : "gradientUnscaled" , 'v:ext' : "view" } ) : null ;
var fillxml = writextag ( 'v:fill' , fillparm , fillopts ) ;
var shadata = ( { on : "t" , 'obscured' : "t" } /*:any*/ ) ;
2022-05-22 23:51:41 +00:00
return [
2017-04-02 06:47:25 +00:00
'<v:shape' + wxt _helper ( {
2019-11-15 01:46:49 +00:00
id : '_x0000_s' + _shapeid ,
2017-04-02 06:47:25 +00:00
type : "#_x0000_t202" ,
2018-06-01 16:32:08 +00:00
style : "position:absolute; margin-left:80pt;margin-top:5pt;width:104pt;height:64pt;z-index:10" + ( x [ 1 ] . hidden ? ";visibility:hidden" : "" ) ,
2017-04-02 06:47:25 +00:00
fillcolor : "#ECFAD4" ,
strokecolor : "#edeaa1"
} ) + '>' ,
2019-11-15 01:46:49 +00:00
fillxml ,
writextag ( "v:shadow" , null , shadata ) ,
2017-04-02 06:47:25 +00:00
writextag ( "v:path" , null , { 'o:connecttype' : "none" } ) ,
'<v:textbox><div style="text-align:left"></div></v:textbox>' ,
'<x:ClientData ObjectType="Note">' ,
'<x:MoveWithCells/>' ,
'<x:SizeWithCells/>' ,
/* Part 4 19.4.2.3 Anchor (Anchor) */
2019-11-15 01:46:49 +00:00
writetag ( 'x:Anchor' , [ c . c + 1 , 0 , c . r + 1 , 0 , c . c + 3 , 20 , c . r + 5 , 20 ] . join ( "," ) ) ,
2017-04-02 06:47:25 +00:00
writetag ( 'x:AutoFill' , "False" ) ,
writetag ( 'x:Row' , String ( c . r ) ) ,
writetag ( 'x:Column' , String ( c . c ) ) ,
2018-06-01 16:32:08 +00:00
x [ 1 ] . hidden ? '' : '<x:Visible/>' ,
2017-04-02 06:47:25 +00:00
'</x:ClientData>' ,
'</v:shape>'
2022-05-22 23:51:41 +00:00
] . join ( "" ) ;
2017-04-02 06:47:25 +00:00
}
2022-03-16 03:18:09 +00:00
function sheet _insert _comments ( sheet , comments /*:Array<RawComment>*/ , threaded /*:boolean*/ , people /*:?Array<any>*/ ) {
2017-04-08 06:55:35 +00:00
var dense = Array . isArray ( sheet ) ;
2019-04-01 14:25:15 +00:00
var cell /*:Cell*/ ;
2017-02-03 20:50:45 +00:00
comments . forEach ( function ( comment ) {
2019-04-01 14:25:15 +00:00
var r = decode _cell ( comment . ref ) ;
2017-04-08 06:55:35 +00:00
if ( dense ) {
if ( ! sheet [ r . r ] ) sheet [ r . r ] = [ ] ;
cell = sheet [ r . r ] [ r . c ] ;
} else cell = sheet [ comment . ref ] ;
2017-02-03 20:50:45 +00:00
if ( ! cell ) {
2019-11-01 03:09:14 +00:00
cell = ( { t : "z" } /*:any*/ ) ;
2017-04-08 06:55:35 +00:00
if ( dense ) sheet [ r . r ] [ r . c ] = cell ;
else sheet [ comment . ref ] = cell ;
2017-02-03 20:50:45 +00:00
var range = safe _decode _range ( sheet [ "!ref" ] || "BDWGO1000001:A1" ) ;
2019-04-01 14:25:15 +00:00
if ( range . s . r > r . r ) range . s . r = r . r ;
if ( range . e . r < r . r ) range . e . r = r . r ;
if ( range . s . c > r . c ) range . s . c = r . c ;
if ( range . e . c < r . c ) range . e . c = r . c ;
2017-02-03 20:50:45 +00:00
var encoded = encode _range ( range ) ;
if ( encoded !== sheet [ "!ref" ] ) sheet [ "!ref" ] = encoded ;
}
if ( ! cell . c ) cell . c = [ ] ;
2022-03-16 03:18:09 +00:00
var o /*:Comment*/ = ( { a : comment . author , t : comment . t , r : comment . r , T : threaded } ) ;
2017-02-03 20:50:45 +00:00
if ( comment . h ) o . h = comment . h ;
2022-03-16 03:18:09 +00:00
/* threaded comments always override */
for ( var i = cell . c . length - 1 ; i >= 0 ; -- i ) {
if ( ! threaded && cell . c [ i ] . T ) return ;
if ( threaded && ! cell . c [ i ] . T ) cell . c . splice ( i , 1 ) ;
}
if ( threaded && people ) for ( i = 0 ; i < people . length ; ++ i ) {
if ( o . a == people [ i ] . id ) { o . a = people [ i ] . name || o . a ; break ; }
}
2017-02-03 20:50:45 +00:00
cell . c . push ( o ) ;
} ) ;
}
2017-04-02 06:47:25 +00:00
/* 18.7 Comments */
2017-12-30 05:40:35 +00:00
function parse _comments _xml ( data /*:string*/ , opts ) /*:Array<RawComment>*/ {
2017-04-02 06:47:25 +00:00
/* 18.7.6 CT_Comments */
2017-02-03 20:50:45 +00:00
if ( data . match ( /<(?:\w+:)?comments *\/>/ ) ) return [ ] ;
2017-12-30 05:40:35 +00:00
var authors /*:Array<string>*/ = [ ] ;
var commentList /*:Array<RawComment>*/ = [ ] ;
2017-06-24 06:51:37 +00:00
var authtag = data . match ( /<(?:\w+:)?authors>([\s\S]*)<\/(?:\w+:)?authors>/ ) ;
2017-02-10 19:23:01 +00:00
if ( authtag && authtag [ 1 ] ) authtag [ 1 ] . split ( /<\/\w*:?author>/ ) . forEach ( function ( x ) {
2017-02-03 20:50:45 +00:00
if ( x === "" || x . trim ( ) === "" ) return ;
2017-02-10 19:23:01 +00:00
var a = x . match ( /<(?:\w+:)?author[^>]*>(.*)/ ) ;
if ( a ) authors . push ( a [ 1 ] ) ;
2017-02-03 20:50:45 +00:00
} ) ;
2017-06-24 06:51:37 +00:00
var cmnttag = data . match ( /<(?:\w+:)?commentList>([\s\S]*)<\/(?:\w+:)?commentList>/ ) ;
2018-01-23 09:07:51 +00:00
if ( cmnttag && cmnttag [ 1 ] ) cmnttag [ 1 ] . split ( /<\/\w*:?comment>/ ) . forEach ( function ( x ) {
2017-02-03 20:50:45 +00:00
if ( x === "" || x . trim ( ) === "" ) return ;
2017-02-10 19:23:01 +00:00
var cm = x . match ( /<(?:\w+:)?comment[^>]*>/ ) ;
if ( ! cm ) return ;
var y = parsexmltag ( cm [ 0 ] ) ;
2017-12-30 05:40:35 +00:00
var comment /*:RawComment*/ = ( { author : y . authorId && authors [ y . authorId ] || "sheetjsghost" , ref : y . ref , guid : y . guid } /*:any*/ ) ;
2017-02-03 20:50:45 +00:00
var cell = decode _cell ( y . ref ) ;
if ( opts . sheetRows && opts . sheetRows <= cell . r ) return ;
2017-06-24 06:51:37 +00:00
var textMatch = x . match ( /<(?:\w+:)?text>([\s\S]*)<\/(?:\w+:)?text>/ ) ;
2017-04-03 00:16:03 +00:00
var rt = ! ! textMatch && ! ! textMatch [ 1 ] && parse _si ( textMatch [ 1 ] ) || { r : "" , t : "" , h : "" } ;
2017-02-03 20:50:45 +00:00
comment . r = rt . r ;
2017-04-03 00:16:03 +00:00
if ( rt . r == "<t></t>" ) rt . t = rt . h = "" ;
2021-09-16 01:50:33 +00:00
comment . t = ( rt . t || "" ) . replace ( /\r\n/g , "\n" ) . replace ( /\r/g , "\n" ) ;
2017-02-03 20:50:45 +00:00
if ( opts . cellHTML ) comment . h = rt . h ;
commentList . push ( comment ) ;
} ) ;
return commentList ;
}
2018-01-23 09:07:51 +00:00
function write _comments _xml ( data /*::, opts*/ ) {
2022-03-12 14:05:57 +00:00
var o = [ XML _HEADER , writextag ( 'comments' , null , { 'xmlns' : XMLNS _main [ 0 ] } ) ] ;
2017-04-02 06:47:25 +00:00
2017-12-30 05:40:35 +00:00
var iauthor /*:Array<string>*/ = [ ] ;
2017-04-02 06:47:25 +00:00
o . push ( "<authors>" ) ;
2018-03-13 02:51:54 +00:00
data . forEach ( function ( x ) { x [ 1 ] . forEach ( function ( w ) { var a = escapexml ( w . a ) ;
2022-03-16 03:18:09 +00:00
if ( iauthor . indexOf ( a ) == - 1 ) {
iauthor . push ( a ) ;
o . push ( "<author>" + a + "</author>" ) ;
}
if ( w . T && w . ID && iauthor . indexOf ( "tc=" + w . ID ) == - 1 ) {
iauthor . push ( "tc=" + w . ID ) ;
o . push ( "<author>" + "tc=" + w . ID + "</author>" ) ;
}
2018-03-13 02:51:54 +00:00
} ) ; } ) ;
2022-03-16 03:18:09 +00:00
if ( iauthor . length == 0 ) { iauthor . push ( "SheetJ5" ) ; o . push ( "<author>SheetJ5</author>" ) ; }
2017-04-02 06:47:25 +00:00
o . push ( "</authors>" ) ;
o . push ( "<commentList>" ) ;
data . forEach ( function ( d ) {
2022-03-16 03:18:09 +00:00
/* 18.7.3 CT_Comment */
var lastauthor = 0 , ts = [ ] ;
if ( d [ 1 ] [ 0 ] && d [ 1 ] [ 0 ] . T && d [ 1 ] [ 0 ] . ID ) lastauthor = iauthor . indexOf ( "tc=" + d [ 1 ] [ 0 ] . ID ) ;
else d [ 1 ] . forEach ( function ( c ) {
if ( c . a ) lastauthor = iauthor . indexOf ( escapexml ( c . a ) ) ;
ts . push ( c . t || "" ) ;
2017-04-02 06:47:25 +00:00
} ) ;
2022-03-16 03:18:09 +00:00
o . push ( '<comment ref="' + d [ 0 ] + '" authorId="' + lastauthor + '"><text>' ) ;
if ( ts . length <= 1 ) o . push ( writetag ( "t" , escapexml ( ts [ 0 ] || "" ) ) ) ;
else {
/* based on Threaded Comments -> Comments projection */
var t = "Comment:\n " + ( ts [ 0 ] ) + "\n" ;
for ( var i = 1 ; i < ts . length ; ++ i ) t += "Reply:\n " + ts [ i ] + "\n" ;
o . push ( writetag ( "t" , escapexml ( t ) ) ) ;
}
o . push ( '</text></comment>' ) ;
2017-04-02 06:47:25 +00:00
} ) ;
o . push ( "</commentList>" ) ;
if ( o . length > 2 ) { o [ o . length ] = ( '</comments>' ) ; o [ 1 ] = o [ 1 ] . replace ( "/>" , ">" ) ; }
return o . join ( "" ) ;
}
2022-03-16 03:18:09 +00:00
/* [MS-XLSX] 2.1.17 */
function parse _tcmnt _xml ( data /*:string*/ , opts ) /*:Array<RawComment>*/ {
var out = [ ] ;
var pass = false , comment = { } , tidx = 0 ;
data . replace ( tagregex , function xml _tcmnt ( x , idx ) {
var y /*:any*/ = parsexmltag ( x ) ;
switch ( strip _ns ( y [ 0 ] ) ) {
case '<?xml' : break ;
/* 2.6.207 ThreadedComments CT_ThreadedComments */
case '<ThreadedComments' : break ;
case '</ThreadedComments>' : break ;
/* 2.6.205 threadedComment CT_ThreadedComment */
case '<threadedComment' : comment = { author : y . personId , guid : y . id , ref : y . ref , T : 1 } ; break ;
case '</threadedComment>' : if ( comment . t != null ) out . push ( comment ) ; break ;
case '<text>' : case '<text' : tidx = idx + x . length ; break ;
case '</text>' : comment . t = data . slice ( tidx , idx ) . replace ( /\r\n/g , "\n" ) . replace ( /\r/g , "\n" ) ; break ;
/* 2.6.206 mentions CT_ThreadedCommentMentions TODO */
case '<mentions' : case '<mentions>' : pass = true ; break ;
case '</mentions>' : pass = false ; break ;
/* 2.6.202 mention CT_Mention TODO */
/* 18.2.10 extLst CT_ExtensionList ? */
case '<extLst' : case '<extLst>' : case '</extLst>' : case '<extLst/>' : break ;
/* 18.2.7 ext CT_Extension + */
case '<ext' : pass = true ; break ;
case '</ext>' : pass = false ; break ;
default : if ( ! pass && opts . WTF ) throw new Error ( 'unrecognized ' + y [ 0 ] + ' in threaded comments' ) ;
}
return x ;
} ) ;
return out ;
}
function write _tcmnt _xml ( comments , people , opts ) {
var o = [ XML _HEADER , writextag ( 'ThreadedComments' , null , { 'xmlns' : XMLNS . TCMNT } ) . replace ( /[\/]>/ , ">" ) ] ;
comments . forEach ( function ( carr ) {
var rootid = "" ;
( carr [ 1 ] || [ ] ) . forEach ( function ( c , idx ) {
if ( ! c . T ) { delete c . ID ; return ; }
if ( c . a && people . indexOf ( c . a ) == - 1 ) people . push ( c . a ) ;
var tcopts = {
ref : carr [ 0 ] ,
id : "{54EE7951-7262-4200-6969-" + ( "000000000000" + opts . tcid ++ ) . slice ( - 12 ) + "}"
} ;
if ( idx == 0 ) rootid = tcopts . id ;
else tcopts . parentId = rootid ;
c . ID = tcopts . id ;
if ( c . a ) tcopts . personId = "{54EE7950-7262-4200-6969-" + ( "000000000000" + people . indexOf ( c . a ) ) . slice ( - 12 ) + "}" ;
o . push ( writextag ( 'threadedComment' , writetag ( 'text' , c . t || "" ) , tcopts ) ) ;
} ) ;
} ) ;
o . push ( '</ThreadedComments>' ) ;
return o . join ( "" ) ;
}
/* [MS-XLSX] 2.1.18 */
function parse _people _xml ( data /*:string*/ , opts ) {
var out = [ ] ;
var pass = false ;
data . replace ( tagregex , function xml _tcmnt ( x ) {
var y /*:any*/ = parsexmltag ( x ) ;
switch ( strip _ns ( y [ 0 ] ) ) {
case '<?xml' : break ;
/* 2.4.85 personList CT_PersonList */
case '<personList' : break ;
case '</personList>' : break ;
/* 2.6.203 person CT_Person TODO: providers */
case '<person' : out . push ( { name : y . displayname , id : y . id } ) ; break ;
case '</person>' : break ;
/* 18.2.10 extLst CT_ExtensionList ? */
case '<extLst' : case '<extLst>' : case '</extLst>' : case '<extLst/>' : break ;
/* 18.2.7 ext CT_Extension + */
case '<ext' : pass = true ; break ;
case '</ext>' : pass = false ; break ;
default : if ( ! pass && opts . WTF ) throw new Error ( 'unrecognized ' + y [ 0 ] + ' in threaded comments' ) ;
}
return x ;
} ) ;
return out ;
}
function write _people _xml ( people /*, opts*/ ) {
var o = [ XML _HEADER , writextag ( 'personList' , null , {
'xmlns' : XMLNS . TCMNT ,
'xmlns:x' : XMLNS _main [ 0 ]
} ) . replace ( /[\/]>/ , ">" ) ] ;
people . forEach ( function ( person , idx ) {
o . push ( writextag ( 'person' , null , {
displayName : person ,
id : "{54EE7950-7262-4200-6969-" + ( "000000000000" + idx ) . slice ( - 12 ) + "}" ,
userId : person ,
providerId : "None"
} ) ) ;
} ) ;
o . push ( "</personList>" ) ;
return o . join ( "" ) ;
}
2017-02-03 20:50:45 +00:00
/* [MS-XLSB] 2.4.28 BrtBeginComment */
2018-01-23 09:07:51 +00:00
function parse _BrtBeginComment ( data ) {
2017-02-03 20:50:45 +00:00
var out = { } ;
out . iauthor = data . read _shift ( 4 ) ;
var rfx = parse _UncheckedRfX ( data , 16 ) ;
out . rfx = rfx . s ;
out . ref = encode _cell ( rfx . s ) ;
data . l += 16 ; /*var guid = parse_GUID(data); */
return out ;
}
2017-04-02 06:47:25 +00:00
function write _BrtBeginComment ( data , o ) {
if ( o == null ) o = new _buf ( 36 ) ;
o . write _shift ( 4 , data [ 1 ] . iauthor ) ;
2017-04-03 00:16:03 +00:00
write _UncheckedRfX ( ( data [ 0 ] /*:any*/ ) , o ) ;
2017-04-02 06:47:25 +00:00
o . write _shift ( 4 , 0 ) ;
o . write _shift ( 4 , 0 ) ;
o . write _shift ( 4 , 0 ) ;
o . write _shift ( 4 , 0 ) ;
return o ;
}
2017-02-03 20:50:45 +00:00
2018-02-14 20:06:35 +00:00
/* [MS-XLSB] 2.4.327 BrtCommentAuthor */
2017-02-03 20:50:45 +00:00
var parse _BrtCommentAuthor = parse _XLWideString ;
2017-09-22 22:18:51 +00:00
function write _BrtCommentAuthor ( data ) { return write _XLWideString ( data . slice ( 0 , 54 ) ) ; }
2017-02-03 20:50:45 +00:00
/* [MS-XLSB] 2.1.7.8 Comments */
2017-12-30 05:40:35 +00:00
function parse _comments _bin ( data , opts ) /*:Array<RawComment>*/ {
var out /*:Array<RawComment>*/ = [ ] ;
var authors /*:Array<string>*/ = [ ] ;
2017-02-03 20:50:45 +00:00
var c = { } ;
var pass = false ;
2022-03-12 14:05:57 +00:00
recordhopper ( data , function hopper _cmnt ( val , R , RT ) {
2017-04-09 04:03:19 +00:00
switch ( RT ) {
case 0x0278 : /* 'BrtCommentAuthor' */
authors . push ( val ) ; break ;
case 0x027B : /* 'BrtBeginComment' */
c = val ; break ;
case 0x027D : /* 'BrtCommentText' */
c . t = val . t ; c . h = val . h ; c . r = val . r ; break ;
case 0x027C : /* 'BrtEndComment' */
2017-02-03 20:50:45 +00:00
c . author = authors [ c . iauthor ] ;
2019-11-01 03:09:14 +00:00
delete ( c /*:any*/ ) . iauthor ;
if ( opts . sheetRows && c . rfx && opts . sheetRows <= c . rfx . r ) break ;
2017-04-02 06:47:25 +00:00
if ( ! c . t ) c . t = "" ;
2017-02-03 20:50:45 +00:00
delete c . rfx ; out . push ( c ) ; break ;
2017-04-08 06:55:35 +00:00
2018-03-19 21:42:55 +00:00
case 0x0C00 : /* 'BrtUid' */
break ;
2017-04-09 04:03:19 +00:00
case 0x0023 : /* 'BrtFRTBegin' */
pass = true ; break ;
case 0x0024 : /* 'BrtFRTEnd' */
pass = false ; break ;
case 0x0025 : /* 'BrtACBegin' */ break ;
case 0x0026 : /* 'BrtACEnd' */ break ;
2017-04-08 06:55:35 +00:00
default :
2022-03-12 14:05:57 +00:00
if ( R . T ) { /* empty */ }
else if ( ! pass || opts . WTF ) throw new Error ( "Unexpected record 0x" + RT . toString ( 16 ) ) ;
2017-02-03 20:50:45 +00:00
}
} ) ;
return out ;
}
2018-01-23 09:07:51 +00:00
function write _comments _bin ( data /*::, opts*/ ) {
2017-04-02 06:47:25 +00:00
var ba = buf _array ( ) ;
2017-12-30 05:40:35 +00:00
var iauthor /*:Array<string>*/ = [ ] ;
2022-03-12 14:05:57 +00:00
write _record ( ba , 0x0274 /* BrtBeginComments */ ) ;
2017-12-30 05:40:35 +00:00
2022-03-12 14:05:57 +00:00
write _record ( ba , 0x0276 /* BrtBeginCommentAuthors */ ) ;
2017-12-30 05:40:35 +00:00
data . forEach ( function ( comment ) {
comment [ 1 ] . forEach ( function ( c ) {
if ( iauthor . indexOf ( c . a ) > - 1 ) return ;
iauthor . push ( c . a . slice ( 0 , 54 ) ) ;
2022-03-12 14:05:57 +00:00
write _record ( ba , 0x0278 /* BrtCommentAuthor */ , write _BrtCommentAuthor ( c . a ) ) ;
2017-04-02 06:47:25 +00:00
} ) ;
2017-12-30 05:40:35 +00:00
} ) ;
2022-03-12 14:05:57 +00:00
write _record ( ba , 0x0277 /* BrtEndCommentAuthors */ ) ;
2017-12-30 05:40:35 +00:00
2022-03-12 14:05:57 +00:00
write _record ( ba , 0x0279 /* BrtBeginCommentList */ ) ;
2017-12-30 05:40:35 +00:00
data . forEach ( function ( comment ) {
comment [ 1 ] . forEach ( function ( c ) {
c . iauthor = iauthor . indexOf ( c . a ) ;
var range = { s : decode _cell ( comment [ 0 ] ) , e : decode _cell ( comment [ 0 ] ) } ;
2022-03-12 14:05:57 +00:00
write _record ( ba , 0x027B /* BrtBeginComment */ , write _BrtBeginComment ( [ range , c ] ) ) ;
if ( c . t && c . t . length > 0 ) write _record ( ba , 0x027D /* BrtCommentText */ , write _BrtCommentText ( c ) ) ;
write _record ( ba , 0x027C /* BrtEndComment */ ) ;
2017-12-30 05:40:35 +00:00
delete c . iauthor ;
2017-04-02 06:47:25 +00:00
} ) ;
2017-12-30 05:40:35 +00:00
} ) ;
2022-03-12 14:05:57 +00:00
write _record ( ba , 0x027A /* BrtEndCommentList */ ) ;
2017-12-30 05:40:35 +00:00
2022-03-12 14:05:57 +00:00
write _record ( ba , 0x0275 /* BrtEndComments */ ) ;
2017-04-02 06:47:25 +00:00
return ba . end ( ) ;
}
2018-02-04 23:58:00 +00:00
var CT _VBA = "application/vnd.ms-office.vbaProject" ;
2022-02-10 12:40:50 +00:00
function make _vba _xls ( cfb ) {
var newcfb = CFB . utils . cfb _new ( { root : "R" } ) ;
cfb . FullPaths . forEach ( function ( p , i ) {
if ( p . slice ( - 1 ) === "/" || ! p . match ( /_VBA_PROJECT_CUR/ ) )
return ;
var newpath = p . replace ( /^[^\/]*/ , "R" ) . replace ( /\/_VBA_PROJECT_CUR\u0000*/ , "" ) ;
CFB . utils . cfb _add ( newcfb , newpath , cfb . FileIndex [ i ] . content ) ;
} ) ;
return CFB . write ( newcfb ) ;
}
function fill _vba _xls ( cfb , vba ) {
vba . FullPaths . forEach ( function ( p , i ) {
if ( i == 0 )
return ;
var newpath = p . replace ( /[^\/]*[\/]/ , "/_VBA_PROJECT_CUR/" ) ;
if ( newpath . slice ( - 1 ) !== "/" )
CFB . utils . cfb _add ( cfb , newpath , vba . FileIndex [ i ] . content ) ;
} ) ;
2017-10-27 16:25:54 +00:00
}
2022-02-10 12:40:50 +00:00
var VBAFMTS = [ "xlsb" , "xlsm" , "xlam" , "biff8" , "xla" ] ;
2017-03-28 04:41:01 +00:00
/* macro and dialog sheet stubs */
2018-01-23 09:07:51 +00:00
function parse _ds _bin ( /*::data:any, opts, idx:number, rels, wb, themes, styles*/ ) /*:Worksheet*/ { return { '!type' : 'dialog' } ; }
function parse _ds _xml ( /*::data:any, opts, idx:number, rels, wb, themes, styles*/ ) /*:Worksheet*/ { return { '!type' : 'dialog' } ; }
function parse _ms _bin ( /*::data:any, opts, idx:number, rels, wb, themes, styles*/ ) /*:Worksheet*/ { return { '!type' : 'macro' } ; }
function parse _ms _xml ( /*::data:any, opts, idx:number, rels, wb, themes, styles*/ ) /*:Worksheet*/ { return { '!type' : 'macro' } ; }
2017-02-03 20:50:45 +00:00
/* TODO: it will be useful to parse the function str */
2022-03-12 14:05:57 +00:00
var rc _to _a1 = /*#__PURE__*/ ( function ( ) {
2019-11-01 03:09:14 +00:00
var rcregex = /(^|[^A-Za-z_])R(\[?-?\d+\]|[1-9]\d*|)C(\[?-?\d+\]|[1-9]\d*|)(?![A-Za-z0-9_])/g ;
2017-04-16 04:32:13 +00:00
var rcbase /*:Cell*/ = ( { r : 0 , c : 0 } /*:any*/ ) ;
2019-11-01 03:09:14 +00:00
function rcfunc ( $$ , $1 , $2 , $3 ) {
2017-02-19 20:36:32 +00:00
var cRel = false , rRel = false ;
2019-11-01 03:09:14 +00:00
if ( $2 . length == 0 ) rRel = true ;
else if ( $2 . charAt ( 0 ) == "[" ) { rRel = true ; $2 = $2 . slice ( 1 , - 1 ) ; }
if ( $3 . length == 0 ) cRel = true ;
else if ( $3 . charAt ( 0 ) == "[" ) { cRel = true ; $3 = $3 . slice ( 1 , - 1 ) ; }
var R = $2 . length > 0 ? parseInt ( $2 , 10 ) | 0 : 0 , C = $3 . length > 0 ? parseInt ( $3 , 10 ) | 0 : 0 ;
if ( cRel ) C += rcbase . c ; else -- C ;
if ( rRel ) R += rcbase . r ; else -- R ;
2017-02-19 20:36:32 +00:00
return $1 + ( cRel ? "" : "$" ) + encode _col ( C ) + ( rRel ? "" : "$" ) + encode _row ( R ) ;
2017-02-03 20:50:45 +00:00
}
2017-04-16 04:32:13 +00:00
return function rc _to _a1 ( fstr /*:string*/ , base /*:Cell*/ ) /*:string*/ {
2017-02-03 20:50:45 +00:00
rcbase = base ;
return fstr . replace ( rcregex , rcfunc ) ;
} ;
} ) ( ) ;
2020-03-15 07:42:05 +00:00
var crefregex = /(^|[^._A-Z0-9])([$]?)([A-Z]{1,2}|[A-W][A-Z]{2}|X[A-E][A-Z]|XF[A-D])([$]?)(10[0-3]\d{4}|104[0-7]\d{3}|1048[0-4]\d{2}|10485[0-6]\d|104857[0-6]|[1-9]\d{0,5})(?![_.\(A-Za-z0-9])/g ;
2022-03-12 14:05:57 +00:00
var a1 _to _rc = /*#__PURE__*/ ( function ( ) {
2018-01-09 07:36:02 +00:00
return function a1 _to _rc ( fstr /*:string*/ , base /*:CellAddress*/ ) {
2018-01-23 09:07:51 +00:00
return fstr . replace ( crefregex , function ( $0 , $1 , $2 , $3 , $4 , $5 ) {
2018-01-09 07:36:02 +00:00
var c = decode _col ( $3 ) - ( $2 ? 0 : base . c ) ;
var r = decode _row ( $5 ) - ( $4 ? 0 : base . r ) ;
2022-05-30 08:40:51 +00:00
var R = $4 == "$" ? ( r + 1 ) : ( r == 0 ? "" : "[" + r + "]" ) ;
var C = $2 == "$" ? ( c + 1 ) : ( c == 0 ? "" : "[" + c + "]" ) ;
2018-01-09 07:36:02 +00:00
return $1 + "R" + R + "C" + C ;
2017-03-14 08:19:51 +00:00
} ) ;
} ;
} ) ( ) ;
/* no defined name can collide with a valid cell address A1:XFD1048576 ... except LOG10! */
2017-02-19 20:36:32 +00:00
function shift _formula _str ( f /*:string*/ , delta /*:Cell*/ ) /*:string*/ {
2018-01-23 09:07:51 +00:00
return f . replace ( crefregex , function ( $0 , $1 , $2 , $3 , $4 , $5 ) {
2017-02-19 20:36:32 +00:00
return $1 + ( $2 == "$" ? $2 + $3 : encode _col ( decode _col ( $3 ) + delta . c ) ) + ( $4 == "$" ? $4 + $5 : encode _row ( decode _row ( $5 ) + delta . r ) ) ;
} ) ;
}
function shift _formula _xlsx ( f /*:string*/ , range /*:string*/ , cell /*:string*/ ) /*:string*/ {
var r = decode _range ( range ) , s = r . s , c = decode _cell ( cell ) ;
var delta = { r : c . r - s . r , c : c . c - s . c } ;
return shift _formula _str ( f , delta ) ;
}
2017-08-18 18:10:18 +00:00
/* TODO: parse formula */
function fuzzyfmla ( f /*:string*/ ) /*:boolean*/ {
if ( f . length == 1 ) return false ;
return true ;
}
2017-12-30 05:40:35 +00:00
function _xlfn ( f /*:string*/ ) /*:string*/ {
return f . replace ( /_xlfn\./g , "" ) ;
}
2017-05-09 18:07:57 +00:00
function parseread1 ( blob ) { blob . l += 1 ; return ; }
2017-02-03 20:50:45 +00:00
2018-02-14 20:06:35 +00:00
/* [MS-XLS] 2.5.51 */
2017-02-03 20:50:45 +00:00
function parse _ColRelU ( blob , length ) {
2017-02-19 20:36:32 +00:00
var c = blob . read _shift ( length == 1 ? 1 : 2 ) ;
2017-02-03 20:50:45 +00:00
return [ c & 0x3FFF , ( c >> 14 ) & 1 , ( c >> 15 ) & 1 ] ;
}
2018-02-14 20:06:35 +00:00
/* [MS-XLS] 2.5.198.105 ; [MS-XLSB] 2.5.97.89 */
2017-02-19 20:36:32 +00:00
function parse _RgceArea ( blob , length , opts ) {
var w = 2 ;
if ( opts ) {
if ( opts . biff >= 2 && opts . biff <= 5 ) return parse _RgceArea _BIFF2 ( blob , length , opts ) ;
else if ( opts . biff == 12 ) w = 4 ;
}
var r = blob . read _shift ( w ) , R = blob . read _shift ( w ) ;
2017-02-03 20:50:45 +00:00
var c = parse _ColRelU ( blob , 2 ) ;
var C = parse _ColRelU ( blob , 2 ) ;
return { s : { r : r , c : c [ 0 ] , cRel : c [ 1 ] , rRel : c [ 2 ] } , e : { r : R , c : C [ 0 ] , cRel : C [ 1 ] , rRel : C [ 2 ] } } ;
}
2017-02-19 20:36:32 +00:00
/* BIFF 2-5 encodes flags in the row field */
2017-07-05 22:27:54 +00:00
function parse _RgceArea _BIFF2 ( blob /*::, length, opts*/ ) {
2017-02-19 20:36:32 +00:00
var r = parse _ColRelU ( blob , 2 ) , R = parse _ColRelU ( blob , 2 ) ;
var c = blob . read _shift ( 1 ) ;
var C = blob . read _shift ( 1 ) ;
return { s : { r : r [ 0 ] , c : c , cRel : r [ 1 ] , rRel : r [ 2 ] } , e : { r : R [ 0 ] , c : C , cRel : R [ 1 ] , rRel : R [ 2 ] } } ;
}
2017-02-03 20:50:45 +00:00
2018-02-14 20:06:35 +00:00
/* [MS-XLS] 2.5.198.105 ; [MS-XLSB] 2.5.97.90 */
2018-02-21 07:01:34 +00:00
function parse _RgceAreaRel ( blob , length , opts ) {
if ( opts . biff < 8 ) return parse _RgceArea _BIFF2 ( blob , length , opts ) ;
var r = blob . read _shift ( opts . biff == 12 ? 4 : 2 ) , R = blob . read _shift ( opts . biff == 12 ? 4 : 2 ) ;
2017-02-03 20:50:45 +00:00
var c = parse _ColRelU ( blob , 2 ) ;
var C = parse _ColRelU ( blob , 2 ) ;
return { s : { r : r , c : c [ 0 ] , cRel : c [ 1 ] , rRel : c [ 2 ] } , e : { r : R , c : C [ 0 ] , cRel : C [ 1 ] , rRel : C [ 2 ] } } ;
}
2018-02-14 20:06:35 +00:00
/* [MS-XLS] 2.5.198.109 ; [MS-XLSB] 2.5.97.91 */
2017-02-19 20:36:32 +00:00
function parse _RgceLoc ( blob , length , opts ) {
if ( opts && opts . biff >= 2 && opts . biff <= 5 ) return parse _RgceLoc _BIFF2 ( blob , length , opts ) ;
var r = blob . read _shift ( opts && opts . biff == 12 ? 4 : 2 ) ;
2017-02-03 20:50:45 +00:00
var c = parse _ColRelU ( blob , 2 ) ;
return { r : r , c : c [ 0 ] , cRel : c [ 1 ] , rRel : c [ 2 ] } ;
}
2018-01-23 09:07:51 +00:00
function parse _RgceLoc _BIFF2 ( blob /*::, length, opts*/ ) {
2017-02-19 20:36:32 +00:00
var r = parse _ColRelU ( blob , 2 ) ;
var c = blob . read _shift ( 1 ) ;
return { r : r [ 0 ] , c : c , cRel : r [ 1 ] , rRel : r [ 2 ] } ;
}
2017-02-03 20:50:45 +00:00
2018-02-14 20:06:35 +00:00
/* [MS-XLS] 2.5.198.107, 2.5.47 */
2018-01-23 09:07:51 +00:00
function parse _RgceElfLoc ( blob /*::, length, opts*/ ) {
2017-10-17 00:14:32 +00:00
var r = blob . read _shift ( 2 ) ;
var c = blob . read _shift ( 2 ) ;
return { r : r , c : c & 0xFF , fQuoted : ! ! ( c & 0x4000 ) , cRel : c >> 15 , rRel : c >> 15 } ;
}
2018-02-14 20:06:35 +00:00
/* [MS-XLS] 2.5.198.111 ; [MS-XLSB] 2.5.97.92 TODO */
2017-02-19 20:36:32 +00:00
function parse _RgceLocRel ( blob , length , opts ) {
var biff = opts && opts . biff ? opts . biff : 8 ;
if ( biff >= 2 && biff <= 5 ) return parse _RgceLocRel _BIFF2 ( blob , length , opts ) ;
var r = blob . read _shift ( biff >= 12 ? 4 : 2 ) ;
2017-02-03 20:50:45 +00:00
var cl = blob . read _shift ( 2 ) ;
2018-01-09 07:36:02 +00:00
var cRel = ( cl & 0x4000 ) >> 14 , rRel = ( cl & 0x8000 ) >> 15 ;
2017-02-03 20:50:45 +00:00
cl &= 0x3FFF ;
2017-02-19 20:36:32 +00:00
if ( rRel == 1 ) while ( r > 0x7FFFF ) r -= 0x100000 ;
if ( cRel == 1 ) while ( cl > 0x1FFF ) cl = cl - 0x4000 ;
2017-02-03 20:50:45 +00:00
return { r : r , c : cl , cRel : cRel , rRel : rRel } ;
}
2018-01-23 09:07:51 +00:00
function parse _RgceLocRel _BIFF2 ( blob /*::, length:number, opts*/ ) {
2017-02-19 20:36:32 +00:00
var rl = blob . read _shift ( 2 ) ;
var c = blob . read _shift ( 1 ) ;
var rRel = ( rl & 0x8000 ) >> 15 , cRel = ( rl & 0x4000 ) >> 14 ;
rl &= 0x3FFF ;
if ( rRel == 1 && rl >= 0x2000 ) rl = rl - 0x4000 ;
if ( cRel == 1 && c >= 0x80 ) c = c - 0x100 ;
return { r : rl , c : c , cRel : cRel , rRel : rRel } ;
}
2017-02-03 20:50:45 +00:00
2018-02-14 20:06:35 +00:00
/* [MS-XLS] 2.5.198.27 ; [MS-XLSB] 2.5.97.18 */
2017-02-19 20:36:32 +00:00
function parse _PtgArea ( blob , length , opts ) {
2017-02-03 20:50:45 +00:00
var type = ( blob [ blob . l ++ ] & 0x60 ) >> 5 ;
2017-02-19 20:36:32 +00:00
var area = parse _RgceArea ( blob , opts . biff >= 2 && opts . biff <= 5 ? 6 : 8 , opts ) ;
2017-02-03 20:50:45 +00:00
return [ type , area ] ;
}
2018-02-14 20:06:35 +00:00
/* [MS-XLS] 2.5.198.28 ; [MS-XLSB] 2.5.97.19 */
2017-02-19 20:36:32 +00:00
function parse _PtgArea3d ( blob , length , opts ) {
2017-02-03 20:50:45 +00:00
var type = ( blob [ blob . l ++ ] & 0x60 ) >> 5 ;
2017-02-19 20:36:32 +00:00
var ixti = blob . read _shift ( 2 , 'i' ) ;
var w = 8 ;
if ( opts ) switch ( opts . biff ) {
case 5 : blob . l += 12 ; w = 6 ; break ;
case 12 : w = 12 ; break ;
}
var area = parse _RgceArea ( blob , w , opts ) ;
2017-02-03 20:50:45 +00:00
return [ type , ixti , area ] ;
}
2018-02-14 20:06:35 +00:00
/* [MS-XLS] 2.5.198.29 ; [MS-XLSB] 2.5.97.20 */
2017-03-10 08:39:51 +00:00
function parse _PtgAreaErr ( blob , length , opts ) {
2017-02-03 20:50:45 +00:00
var type = ( blob [ blob . l ++ ] & 0x60 ) >> 5 ;
2018-02-28 10:41:49 +00:00
blob . l += opts && ( opts . biff > 8 ) ? 12 : ( opts . biff < 8 ? 6 : 8 ) ;
2017-02-03 20:50:45 +00:00
return [ type ] ;
}
2018-02-14 20:06:35 +00:00
/* [MS-XLS] 2.5.198.30 ; [MS-XLSB] 2.5.97.21 */
2017-02-19 20:36:32 +00:00
function parse _PtgAreaErr3d ( blob , length , opts ) {
2017-02-03 20:50:45 +00:00
var type = ( blob [ blob . l ++ ] & 0x60 ) >> 5 ;
var ixti = blob . read _shift ( 2 ) ;
2017-02-19 20:36:32 +00:00
var w = 8 ;
if ( opts ) switch ( opts . biff ) {
case 5 : blob . l += 12 ; w = 6 ; break ;
case 12 : w = 12 ; break ;
}
blob . l += w ;
2017-02-03 20:50:45 +00:00
return [ type , ixti ] ;
}
2018-02-14 20:06:35 +00:00
/* [MS-XLS] 2.5.198.31 ; [MS-XLSB] 2.5.97.22 */
2017-03-10 08:39:51 +00:00
function parse _PtgAreaN ( blob , length , opts ) {
2017-02-03 20:50:45 +00:00
var type = ( blob [ blob . l ++ ] & 0x60 ) >> 5 ;
2018-02-21 07:01:34 +00:00
var area = parse _RgceAreaRel ( blob , length - 1 , opts ) ;
2017-02-03 20:50:45 +00:00
return [ type , area ] ;
}
2018-02-14 20:06:35 +00:00
/* [MS-XLS] 2.5.198.32 ; [MS-XLSB] 2.5.97.23 */
2017-02-19 20:36:32 +00:00
function parse _PtgArray ( blob , length , opts ) {
2017-02-03 20:50:45 +00:00
var type = ( blob [ blob . l ++ ] & 0x60 ) >> 5 ;
2017-02-19 20:36:32 +00:00
blob . l += opts . biff == 2 ? 6 : opts . biff == 12 ? 14 : 7 ;
2017-02-03 20:50:45 +00:00
return [ type ] ;
}
2018-02-14 20:06:35 +00:00
/* [MS-XLS] 2.5.198.33 ; [MS-XLSB] 2.5.97.24 */
2018-01-23 09:07:51 +00:00
function parse _PtgAttrBaxcel ( blob ) {
2017-02-03 20:50:45 +00:00
var bitSemi = blob [ blob . l + 1 ] & 0x01 ; /* 1 = volatile */
var bitBaxcel = 1 ;
blob . l += 4 ;
return [ bitSemi , bitBaxcel ] ;
}
2018-02-14 20:06:35 +00:00
/* [MS-XLS] 2.5.198.34 ; [MS-XLSB] 2.5.97.25 */
2017-12-30 05:40:35 +00:00
function parse _PtgAttrChoose ( blob , length , opts ) /*:Array<number>*/ {
2017-02-03 20:50:45 +00:00
blob . l += 2 ;
2017-02-19 20:36:32 +00:00
var offset = blob . read _shift ( opts && opts . biff == 2 ? 1 : 2 ) ;
2017-12-30 05:40:35 +00:00
var o /*:Array<number>*/ = [ ] ;
2017-02-03 20:50:45 +00:00
/* offset is 1 less than the number of elements */
2017-02-19 20:36:32 +00:00
for ( var i = 0 ; i <= offset ; ++ i ) o . push ( blob . read _shift ( opts && opts . biff == 2 ? 1 : 2 ) ) ;
2017-02-03 20:50:45 +00:00
return o ;
}
2018-02-14 20:06:35 +00:00
/* [MS-XLS] 2.5.198.35 ; [MS-XLSB] 2.5.97.26 */
2017-02-19 20:36:32 +00:00
function parse _PtgAttrGoto ( blob , length , opts ) {
2017-02-03 20:50:45 +00:00
var bitGoto = ( blob [ blob . l + 1 ] & 0xFF ) ? 1 : 0 ;
blob . l += 2 ;
2017-02-19 20:36:32 +00:00
return [ bitGoto , blob . read _shift ( opts && opts . biff == 2 ? 1 : 2 ) ] ;
2017-02-03 20:50:45 +00:00
}
2018-02-14 20:06:35 +00:00
/* [MS-XLS] 2.5.198.36 ; [MS-XLSB] 2.5.97.27 */
2017-02-19 20:36:32 +00:00
function parse _PtgAttrIf ( blob , length , opts ) {
var bitIf = ( blob [ blob . l + 1 ] & 0xFF ) ? 1 : 0 ;
blob . l += 2 ;
return [ bitIf , blob . read _shift ( opts && opts . biff == 2 ? 1 : 2 ) ] ;
}
/* [MS-XLSB] 2.5.97.28 */
2018-01-23 09:07:51 +00:00
function parse _PtgAttrIfError ( blob ) {
2017-02-03 20:50:45 +00:00
var bitIf = ( blob [ blob . l + 1 ] & 0xFF ) ? 1 : 0 ;
blob . l += 2 ;
return [ bitIf , blob . read _shift ( 2 ) ] ;
}
2018-02-14 20:06:35 +00:00
/* [MS-XLS] 2.5.198.37 ; [MS-XLSB] 2.5.97.29 */
2017-02-19 20:36:32 +00:00
function parse _PtgAttrSemi ( blob , length , opts ) {
2017-02-03 20:50:45 +00:00
var bitSemi = ( blob [ blob . l + 1 ] & 0xFF ) ? 1 : 0 ;
2017-02-19 20:36:32 +00:00
blob . l += opts && opts . biff == 2 ? 3 : 4 ;
2017-02-03 20:50:45 +00:00
return [ bitSemi ] ;
}
2018-02-14 20:06:35 +00:00
/* [MS-XLS] 2.5.198.40 ; [MS-XLSB] 2.5.97.32 */
2018-01-23 09:07:51 +00:00
function parse _PtgAttrSpaceType ( blob /*::, length*/ ) {
2017-02-03 20:50:45 +00:00
var type = blob . read _shift ( 1 ) , cch = blob . read _shift ( 1 ) ;
return [ type , cch ] ;
}
2018-02-14 20:06:35 +00:00
/* [MS-XLS] 2.5.198.38 ; [MS-XLSB] 2.5.97.30 */
2018-01-23 09:07:51 +00:00
function parse _PtgAttrSpace ( blob ) {
2017-02-03 20:50:45 +00:00
blob . read _shift ( 2 ) ;
return parse _PtgAttrSpaceType ( blob , 2 ) ;
}
2018-02-14 20:06:35 +00:00
/* [MS-XLS] 2.5.198.39 ; [MS-XLSB] 2.5.97.31 */
2018-01-23 09:07:51 +00:00
function parse _PtgAttrSpaceSemi ( blob ) {
2017-02-03 20:50:45 +00:00
blob . read _shift ( 2 ) ;
return parse _PtgAttrSpaceType ( blob , 2 ) ;
}
2018-02-14 20:06:35 +00:00
/* [MS-XLS] 2.5.198.84 ; [MS-XLSB] 2.5.97.68 TODO */
2017-02-19 20:36:32 +00:00
function parse _PtgRef ( blob , length , opts ) {
2018-01-23 09:07:51 +00:00
//var ptg = blob[blob.l] & 0x1F;
2017-02-03 20:50:45 +00:00
var type = ( blob [ blob . l ] & 0x60 ) >> 5 ;
blob . l += 1 ;
2017-02-19 20:36:32 +00:00
var loc = parse _RgceLoc ( blob , 0 , opts ) ;
2017-02-03 20:50:45 +00:00
return [ type , loc ] ;
}
2018-02-14 20:06:35 +00:00
/* [MS-XLS] 2.5.198.88 ; [MS-XLSB] 2.5.97.72 TODO */
2017-02-19 20:36:32 +00:00
function parse _PtgRefN ( blob , length , opts ) {
2017-02-03 20:50:45 +00:00
var type = ( blob [ blob . l ] & 0x60 ) >> 5 ;
blob . l += 1 ;
2017-02-19 20:36:32 +00:00
var loc = parse _RgceLocRel ( blob , 0 , opts ) ;
2017-02-03 20:50:45 +00:00
return [ type , loc ] ;
}
2018-02-14 20:06:35 +00:00
/* [MS-XLS] 2.5.198.85 ; [MS-XLSB] 2.5.97.69 TODO */
2017-02-19 20:36:32 +00:00
function parse _PtgRef3d ( blob , length , opts ) {
2017-02-03 20:50:45 +00:00
var type = ( blob [ blob . l ] & 0x60 ) >> 5 ;
blob . l += 1 ;
var ixti = blob . read _shift ( 2 ) ; // XtiIndex
2018-02-14 20:06:35 +00:00
if ( opts && opts . biff == 5 ) blob . l += 12 ;
2017-02-19 20:36:32 +00:00
var loc = parse _RgceLoc ( blob , 0 , opts ) ; // TODO: or RgceLocRel
2017-02-03 20:50:45 +00:00
return [ type , ixti , loc ] ;
}
2018-02-14 20:06:35 +00:00
/* [MS-XLS] 2.5.198.62 ; [MS-XLSB] 2.5.97.45 TODO */
2017-02-19 20:36:32 +00:00
function parse _PtgFunc ( blob , length , opts ) {
2018-01-23 09:07:51 +00:00
//var ptg = blob[blob.l] & 0x1F;
2017-02-03 20:50:45 +00:00
var type = ( blob [ blob . l ] & 0x60 ) >> 5 ;
blob . l += 1 ;
2017-02-19 20:36:32 +00:00
var iftab = blob . read _shift ( opts && opts . biff <= 3 ? 1 : 2 ) ;
return [ FtabArgc [ iftab ] , Ftab [ iftab ] , type ] ;
2017-02-03 20:50:45 +00:00
}
2018-02-14 20:06:35 +00:00
/* [MS-XLS] 2.5.198.63 ; [MS-XLSB] 2.5.97.46 TODO */
2017-02-19 20:36:32 +00:00
function parse _PtgFuncVar ( blob , length , opts ) {
2018-02-28 10:41:49 +00:00
var type = blob [ blob . l ++ ] ;
var cparams = blob . read _shift ( 1 ) , tab = opts && opts . biff <= 3 ? [ ( type == 0x58 ? - 1 : 0 ) , blob . read _shift ( 1 ) ] : parsetab ( blob ) ;
2017-02-03 20:50:45 +00:00
return [ cparams , ( tab [ 0 ] === 0 ? Ftab : Cetab ) [ tab [ 1 ] ] ] ;
}
2018-01-23 09:07:51 +00:00
function parsetab ( blob ) {
2017-02-03 20:50:45 +00:00
return [ blob [ blob . l + 1 ] >> 7 , blob . read _shift ( 2 ) & 0x7FFF ] ;
}
2018-02-14 20:06:35 +00:00
/* [MS-XLS] 2.5.198.41 ; [MS-XLSB] 2.5.97.33 */
2017-02-19 20:36:32 +00:00
function parse _PtgAttrSum ( blob , length , opts ) {
blob . l += opts && opts . biff == 2 ? 3 : 4 ; return ;
}
2018-02-14 20:06:35 +00:00
/* [MS-XLS] 2.5.198.58 ; [MS-XLSB] 2.5.97.40 */
2017-02-19 20:36:32 +00:00
function parse _PtgExp ( blob , length , opts ) {
2017-02-03 20:50:45 +00:00
blob . l ++ ;
2017-02-19 20:36:32 +00:00
if ( opts && opts . biff == 12 ) return [ blob . read _shift ( 4 , 'i' ) , 0 ] ;
2017-02-03 20:50:45 +00:00
var row = blob . read _shift ( 2 ) ;
2017-02-19 20:36:32 +00:00
var col = blob . read _shift ( opts && opts . biff == 2 ? 1 : 2 ) ;
2017-02-03 20:50:45 +00:00
return [ row , col ] ;
}
2018-02-14 20:06:35 +00:00
/* [MS-XLS] 2.5.198.57 ; [MS-XLSB] 2.5.97.39 */
2018-01-23 09:07:51 +00:00
function parse _PtgErr ( blob ) { blob . l ++ ; return BErr [ blob . read _shift ( 1 ) ] ; }
2017-02-03 20:50:45 +00:00
2018-02-14 20:06:35 +00:00
/* [MS-XLS] 2.5.198.66 ; [MS-XLSB] 2.5.97.49 */
2018-01-23 09:07:51 +00:00
function parse _PtgInt ( blob ) { blob . l ++ ; return blob . read _shift ( 2 ) ; }
2017-02-03 20:50:45 +00:00
2018-02-14 20:06:35 +00:00
/* [MS-XLS] 2.5.198.42 ; [MS-XLSB] 2.5.97.34 */
2018-01-23 09:07:51 +00:00
function parse _PtgBool ( blob ) { blob . l ++ ; return blob . read _shift ( 1 ) !== 0 ; }
2017-02-03 20:50:45 +00:00
2018-02-14 20:06:35 +00:00
/* [MS-XLS] 2.5.198.79 ; [MS-XLSB] 2.5.97.63 */
2018-01-23 09:07:51 +00:00
function parse _PtgNum ( blob ) { blob . l ++ ; return parse _Xnum ( blob , 8 ) ; }
2017-02-03 20:50:45 +00:00
2018-02-14 20:06:35 +00:00
/* [MS-XLS] 2.5.198.89 ; [MS-XLSB] 2.5.97.74 */
2017-02-19 20:36:32 +00:00
function parse _PtgStr ( blob , length , opts ) { blob . l ++ ; return parse _ShortXLUnicodeString ( blob , length - 1 , opts ) ; }
/* [MS-XLS] 2.5.192.112 + 2.5.192.11{3,4,5,6,7} */
/* [MS-XLSB] 2.5.97.93 + 2.5.97.9{4,5,6,7} */
function parse _SerAr ( blob , biff /*:number*/ ) {
var val = [ blob . read _shift ( 1 ) ] ;
if ( biff == 12 ) switch ( val [ 0 ] ) {
case 0x02 : val [ 0 ] = 0x04 ; break ; /* SerBool */
case 0x04 : val [ 0 ] = 0x10 ; break ; /* SerErr */
case 0x00 : val [ 0 ] = 0x01 ; break ; /* SerNum */
case 0x01 : val [ 0 ] = 0x02 ; break ; /* SerStr */
}
switch ( val [ 0 ] ) {
2017-02-03 20:50:45 +00:00
case 0x04 : /* SerBool -- boolean */
val [ 1 ] = parsebool ( blob , 1 ) ? 'TRUE' : 'FALSE' ;
2018-02-14 20:06:35 +00:00
if ( biff != 12 ) blob . l += 7 ; break ;
2018-05-05 06:34:37 +00:00
case 0x25 : /* appears to be an alias */
2017-02-03 20:50:45 +00:00
case 0x10 : /* SerErr -- error */
val [ 1 ] = BErr [ blob [ blob . l ] ] ;
2018-02-14 20:06:35 +00:00
blob . l += ( ( biff == 12 ) ? 4 : 8 ) ; break ;
2017-02-03 20:50:45 +00:00
case 0x00 : /* SerNil -- honestly, I'm not sure how to reproduce this */
blob . l += 8 ; break ;
case 0x01 : /* SerNum -- Xnum */
val [ 1 ] = parse _Xnum ( blob , 8 ) ; break ;
case 0x02 : /* SerStr -- XLUnicodeString (<256 chars) */
2017-02-19 20:36:32 +00:00
val [ 1 ] = parse _XLUnicodeString2 ( blob , 0 , { biff : biff > 0 && biff < 8 ? 2 : biff } ) ; break ;
2018-05-05 06:34:37 +00:00
default : throw new Error ( "Bad SerAr: " + val [ 0 ] ) ; /* Unreachable */
2017-02-03 20:50:45 +00:00
}
return val ;
}
2018-02-14 20:06:35 +00:00
/* [MS-XLS] 2.5.198.61 ; [MS-XLSB] 2.5.97.44 */
function parse _PtgExtraMem ( blob , cce , opts ) {
var count = blob . read _shift ( ( opts . biff == 12 ) ? 4 : 2 ) ;
2017-12-30 05:40:35 +00:00
var out /*:Array<Range>*/ = [ ] ;
2018-02-14 20:06:35 +00:00
for ( var i = 0 ; i != count ; ++ i ) out . push ( ( ( opts . biff == 12 ) ? parse _UncheckedRfX : parse _Ref8U ) ( blob , 8 ) ) ;
2017-02-03 20:50:45 +00:00
return out ;
}
2018-02-14 20:06:35 +00:00
/* [MS-XLS] 2.5.198.59 ; [MS-XLSB] 2.5.97.41 */
2017-02-19 20:36:32 +00:00
function parse _PtgExtraArray ( blob , length , opts ) {
var rows = 0 , cols = 0 ;
if ( opts . biff == 12 ) {
rows = blob . read _shift ( 4 ) ; // DRw
cols = blob . read _shift ( 4 ) ; // DCol
} else {
cols = 1 + blob . read _shift ( 1 ) ; //DColByteU
rows = 1 + blob . read _shift ( 2 ) ; //DRw
}
if ( opts . biff >= 2 && opts . biff < 8 ) { -- rows ; if ( -- cols == 0 ) cols = 0x100 ; }
2017-03-12 18:02:43 +00:00
// $FlowIgnore
2017-12-30 05:40:35 +00:00
for ( var i = 0 , o /*:Array<Array<any>>*/ = [ ] ; i != rows && ( o [ i ] = [ ] ) ; ++ i )
2017-02-19 20:36:32 +00:00
for ( var j = 0 ; j != cols ; ++ j ) o [ i ] [ j ] = parse _SerAr ( blob , opts . biff ) ;
2017-02-03 20:50:45 +00:00
return o ;
}
2018-02-14 20:06:35 +00:00
/* [MS-XLS] 2.5.198.76 ; [MS-XLSB] 2.5.97.60 */
2017-02-19 20:36:32 +00:00
function parse _PtgName ( blob , length , opts ) {
2017-02-03 20:50:45 +00:00
var type = ( blob . read _shift ( 1 ) >>> 5 ) & 0x03 ;
2017-02-19 20:36:32 +00:00
var w = ( ! opts || ( opts . biff >= 8 ) ) ? 4 : 2 ;
var nameindex = blob . read _shift ( w ) ;
switch ( opts . biff ) {
case 2 : blob . l += 5 ; break ;
case 3 : case 4 : blob . l += 8 ; break ;
case 5 : blob . l += 12 ; break ;
}
2017-02-03 20:50:45 +00:00
return [ type , 0 , nameindex ] ;
}
2018-02-14 20:06:35 +00:00
/* [MS-XLS] 2.5.198.77 ; [MS-XLSB] 2.5.97.61 */
2017-02-19 20:36:32 +00:00
function parse _PtgNameX ( blob , length , opts ) {
if ( opts . biff == 5 ) return parse _PtgNameX _BIFF5 ( blob , length , opts ) ;
2017-02-03 20:50:45 +00:00
var type = ( blob . read _shift ( 1 ) >>> 5 ) & 0x03 ;
var ixti = blob . read _shift ( 2 ) ; // XtiIndex
var nameindex = blob . read _shift ( 4 ) ;
return [ type , ixti , nameindex ] ;
}
2018-01-23 09:07:51 +00:00
function parse _PtgNameX _BIFF5 ( blob /*::, length, opts*/ ) {
2017-02-19 20:36:32 +00:00
var type = ( blob . read _shift ( 1 ) >>> 5 ) & 0x03 ;
var ixti = blob . read _shift ( 2 , 'i' ) ; // XtiIndex
blob . l += 8 ;
var nameindex = blob . read _shift ( 2 ) ;
blob . l += 12 ;
return [ type , ixti , nameindex ] ;
}
2017-02-03 20:50:45 +00:00
2018-02-14 20:06:35 +00:00
/* [MS-XLS] 2.5.198.70 ; [MS-XLSB] 2.5.97.54 */
2017-02-19 20:36:32 +00:00
function parse _PtgMemArea ( blob , length , opts ) {
2017-02-03 20:50:45 +00:00
var type = ( blob . read _shift ( 1 ) >>> 5 ) & 0x03 ;
2017-02-19 20:36:32 +00:00
blob . l += ( opts && opts . biff == 2 ? 3 : 4 ) ;
var cce = blob . read _shift ( opts && opts . biff == 2 ? 1 : 2 ) ;
2017-02-03 20:50:45 +00:00
return [ type , cce ] ;
}
2018-02-14 20:06:35 +00:00
/* [MS-XLS] 2.5.198.72 ; [MS-XLSB] 2.5.97.56 */
2017-02-19 20:36:32 +00:00
function parse _PtgMemFunc ( blob , length , opts ) {
2017-02-03 20:50:45 +00:00
var type = ( blob . read _shift ( 1 ) >>> 5 ) & 0x03 ;
2017-02-19 20:36:32 +00:00
var cce = blob . read _shift ( opts && opts . biff == 2 ? 1 : 2 ) ;
2017-02-03 20:50:45 +00:00
return [ type , cce ] ;
}
2018-02-14 20:06:35 +00:00
/* [MS-XLS] 2.5.198.86 ; [MS-XLSB] 2.5.97.69 */
2017-02-19 20:36:32 +00:00
function parse _PtgRefErr ( blob , length , opts ) {
2017-02-03 20:50:45 +00:00
var type = ( blob . read _shift ( 1 ) >>> 5 ) & 0x03 ;
blob . l += 4 ;
2018-02-21 07:01:34 +00:00
if ( opts . biff < 8 ) blob . l -- ;
2017-02-19 20:36:32 +00:00
if ( opts . biff == 12 ) blob . l += 2 ;
2017-02-03 20:50:45 +00:00
return [ type ] ;
}
2018-02-14 20:06:35 +00:00
/* [MS-XLS] 2.5.198.87 ; [MS-XLSB] 2.5.97.71 */
2017-03-10 08:39:51 +00:00
function parse _PtgRefErr3d ( blob , length , opts ) {
var type = ( blob [ blob . l ++ ] & 0x60 ) >> 5 ;
var ixti = blob . read _shift ( 2 ) ;
var w = 4 ;
if ( opts ) switch ( opts . biff ) {
2018-02-14 20:06:35 +00:00
case 5 : w = 15 ; break ;
2017-03-10 08:39:51 +00:00
case 12 : w = 6 ; break ;
}
blob . l += w ;
return [ type , ixti ] ;
}
2018-02-14 20:06:35 +00:00
/* [MS-XLS] 2.5.198.71 ; [MS-XLSB] 2.5.97.55 */
2017-02-03 20:50:45 +00:00
var parse _PtgMemErr = parsenoop ;
2018-02-14 20:06:35 +00:00
/* [MS-XLS] 2.5.198.73 ; [MS-XLSB] 2.5.97.57 */
2017-02-03 20:50:45 +00:00
var parse _PtgMemNoMem = parsenoop ;
2018-02-14 20:06:35 +00:00
/* [MS-XLS] 2.5.198.92 */
2017-02-03 20:50:45 +00:00
var parse _PtgTbl = parsenoop ;
2017-10-17 00:14:32 +00:00
function parse _PtgElfLoc ( blob , length , opts ) {
blob . l += 2 ;
return [ parse _RgceElfLoc ( blob , 4 , opts ) ] ;
}
2018-01-23 09:07:51 +00:00
function parse _PtgElfNoop ( blob /*::, length, opts*/ ) {
2017-10-17 00:14:32 +00:00
blob . l += 6 ;
return [ ] ;
}
2018-02-14 20:06:35 +00:00
/* [MS-XLS] 2.5.198.46 */
2017-10-17 00:14:32 +00:00
var parse _PtgElfCol = parse _PtgElfLoc ;
2018-02-14 20:06:35 +00:00
/* [MS-XLS] 2.5.198.47 */
2017-10-17 00:14:32 +00:00
var parse _PtgElfColS = parse _PtgElfNoop ;
2018-02-14 20:06:35 +00:00
/* [MS-XLS] 2.5.198.48 */
2017-10-17 00:14:32 +00:00
var parse _PtgElfColSV = parse _PtgElfNoop ;
2018-02-14 20:06:35 +00:00
/* [MS-XLS] 2.5.198.49 */
2017-10-17 00:14:32 +00:00
var parse _PtgElfColV = parse _PtgElfLoc ;
2018-02-14 20:06:35 +00:00
/* [MS-XLS] 2.5.198.50 */
2018-01-23 09:07:51 +00:00
function parse _PtgElfLel ( blob /*::, length, opts*/ ) {
2017-10-17 00:14:32 +00:00
blob . l += 2 ;
return [ parseuint16 ( blob ) , blob . read _shift ( 2 ) & 0x01 ] ;
}
2018-02-14 20:06:35 +00:00
/* [MS-XLS] 2.5.198.51 */
2017-10-17 00:14:32 +00:00
var parse _PtgElfRadical = parse _PtgElfLoc ;
2018-02-14 20:06:35 +00:00
/* [MS-XLS] 2.5.198.52 */
2017-10-17 00:14:32 +00:00
var parse _PtgElfRadicalLel = parse _PtgElfLel ;
2018-02-14 20:06:35 +00:00
/* [MS-XLS] 2.5.198.53 */
2017-10-17 00:14:32 +00:00
var parse _PtgElfRadicalS = parse _PtgElfNoop ;
2018-02-14 20:06:35 +00:00
/* [MS-XLS] 2.5.198.54 */
2017-10-17 00:14:32 +00:00
var parse _PtgElfRw = parse _PtgElfLoc ;
2018-02-14 20:06:35 +00:00
/* [MS-XLS] 2.5.198.55 */
2017-10-17 00:14:32 +00:00
var parse _PtgElfRwV = parse _PtgElfLoc ;
2018-02-28 10:41:49 +00:00
/* [MS-XLSB] 2.5.97.52 TODO */
var PtgListRT = [
"Data" ,
"All" ,
"Headers" ,
"??" ,
"?Data2" ,
"??" ,
"?DataHeaders" ,
"??" ,
"Totals" ,
"??" ,
"??" ,
"??" ,
"?DataTotals" ,
"??" ,
"??" ,
"??" ,
"?Current"
] ;
2018-01-23 09:07:51 +00:00
function parse _PtgList ( blob /*::, length, opts*/ ) {
2017-10-17 00:14:32 +00:00
blob . l += 2 ;
var ixti = blob . read _shift ( 2 ) ;
2018-02-28 10:41:49 +00:00
var flags = blob . read _shift ( 2 ) ;
var idx = blob . read _shift ( 4 ) ;
var c = blob . read _shift ( 2 ) ;
var C = blob . read _shift ( 2 ) ;
var rt = PtgListRT [ ( flags >> 2 ) & 0x1F ] ;
return { ixti : ixti , coltype : ( flags & 0x3 ) , rt : rt , idx : idx , c : c , C : C } ;
2017-10-17 00:14:32 +00:00
}
2018-02-14 20:06:35 +00:00
/* [MS-XLS] 2.5.198.91 ; [MS-XLSB] 2.5.97.76 */
2018-01-23 09:07:51 +00:00
function parse _PtgSxName ( blob /*::, length, opts*/ ) {
2017-10-17 00:14:32 +00:00
blob . l += 2 ;
return [ blob . read _shift ( 4 ) ] ;
}
2018-02-28 10:41:49 +00:00
/* [XLS] old spec */
function parse _PtgSheet ( blob , length , opts ) {
blob . l += 5 ;
blob . l += 2 ;
blob . l += ( opts . biff == 2 ? 1 : 4 ) ;
return [ "PTGSHEET" ] ;
}
function parse _PtgEndSheet ( blob , length , opts ) {
blob . l += ( opts . biff == 2 ? 4 : 5 ) ;
return [ "PTGENDSHEET" ] ;
}
function parse _PtgMemAreaN ( blob /*::, length, opts*/ ) {
var type = ( blob . read _shift ( 1 ) >>> 5 ) & 0x03 ;
var cce = blob . read _shift ( 2 ) ;
return [ type , cce ] ;
}
function parse _PtgMemNoMemN ( blob /*::, length, opts*/ ) {
var type = ( blob . read _shift ( 1 ) >>> 5 ) & 0x03 ;
var cce = blob . read _shift ( 2 ) ;
return [ type , cce ] ;
}
function parse _PtgAttrNoop ( blob /*::, length, opts*/ ) {
blob . l += 4 ;
return [ 0 , 0 ] ;
}
2018-02-14 20:06:35 +00:00
/* [MS-XLS] 2.5.198.25 ; [MS-XLSB] 2.5.97.16 */
2017-02-03 20:50:45 +00:00
var PtgTypes = {
2017-02-10 19:23:01 +00:00
/*::[*/ 0x01 /*::]*/ : { n : 'PtgExp' , f : parse _PtgExp } ,
/*::[*/ 0x02 /*::]*/ : { n : 'PtgTbl' , f : parse _PtgTbl } ,
2018-01-23 09:07:51 +00:00
/*::[*/ 0x03 /*::]*/ : { n : 'PtgAdd' , f : parseread1 } ,
/*::[*/ 0x04 /*::]*/ : { n : 'PtgSub' , f : parseread1 } ,
/*::[*/ 0x05 /*::]*/ : { n : 'PtgMul' , f : parseread1 } ,
/*::[*/ 0x06 /*::]*/ : { n : 'PtgDiv' , f : parseread1 } ,
/*::[*/ 0x07 /*::]*/ : { n : 'PtgPower' , f : parseread1 } ,
/*::[*/ 0x08 /*::]*/ : { n : 'PtgConcat' , f : parseread1 } ,
/*::[*/ 0x09 /*::]*/ : { n : 'PtgLt' , f : parseread1 } ,
/*::[*/ 0x0A /*::]*/ : { n : 'PtgLe' , f : parseread1 } ,
/*::[*/ 0x0B /*::]*/ : { n : 'PtgEq' , f : parseread1 } ,
/*::[*/ 0x0C /*::]*/ : { n : 'PtgGe' , f : parseread1 } ,
/*::[*/ 0x0D /*::]*/ : { n : 'PtgGt' , f : parseread1 } ,
/*::[*/ 0x0E /*::]*/ : { n : 'PtgNe' , f : parseread1 } ,
/*::[*/ 0x0F /*::]*/ : { n : 'PtgIsect' , f : parseread1 } ,
/*::[*/ 0x10 /*::]*/ : { n : 'PtgUnion' , f : parseread1 } ,
/*::[*/ 0x11 /*::]*/ : { n : 'PtgRange' , f : parseread1 } ,
/*::[*/ 0x12 /*::]*/ : { n : 'PtgUplus' , f : parseread1 } ,
/*::[*/ 0x13 /*::]*/ : { n : 'PtgUminus' , f : parseread1 } ,
/*::[*/ 0x14 /*::]*/ : { n : 'PtgPercent' , f : parseread1 } ,
/*::[*/ 0x15 /*::]*/ : { n : 'PtgParen' , f : parseread1 } ,
/*::[*/ 0x16 /*::]*/ : { n : 'PtgMissArg' , f : parseread1 } ,
2017-02-10 19:23:01 +00:00
/*::[*/ 0x17 /*::]*/ : { n : 'PtgStr' , f : parse _PtgStr } ,
2018-02-28 10:41:49 +00:00
/*::[*/ 0x1A /*::]*/ : { n : 'PtgSheet' , f : parse _PtgSheet } ,
/*::[*/ 0x1B /*::]*/ : { n : 'PtgEndSheet' , f : parse _PtgEndSheet } ,
2017-02-10 19:23:01 +00:00
/*::[*/ 0x1C /*::]*/ : { n : 'PtgErr' , f : parse _PtgErr } ,
/*::[*/ 0x1D /*::]*/ : { n : 'PtgBool' , f : parse _PtgBool } ,
/*::[*/ 0x1E /*::]*/ : { n : 'PtgInt' , f : parse _PtgInt } ,
/*::[*/ 0x1F /*::]*/ : { n : 'PtgNum' , f : parse _PtgNum } ,
/*::[*/ 0x20 /*::]*/ : { n : 'PtgArray' , f : parse _PtgArray } ,
/*::[*/ 0x21 /*::]*/ : { n : 'PtgFunc' , f : parse _PtgFunc } ,
/*::[*/ 0x22 /*::]*/ : { n : 'PtgFuncVar' , f : parse _PtgFuncVar } ,
/*::[*/ 0x23 /*::]*/ : { n : 'PtgName' , f : parse _PtgName } ,
/*::[*/ 0x24 /*::]*/ : { n : 'PtgRef' , f : parse _PtgRef } ,
/*::[*/ 0x25 /*::]*/ : { n : 'PtgArea' , f : parse _PtgArea } ,
/*::[*/ 0x26 /*::]*/ : { n : 'PtgMemArea' , f : parse _PtgMemArea } ,
/*::[*/ 0x27 /*::]*/ : { n : 'PtgMemErr' , f : parse _PtgMemErr } ,
/*::[*/ 0x28 /*::]*/ : { n : 'PtgMemNoMem' , f : parse _PtgMemNoMem } ,
/*::[*/ 0x29 /*::]*/ : { n : 'PtgMemFunc' , f : parse _PtgMemFunc } ,
/*::[*/ 0x2A /*::]*/ : { n : 'PtgRefErr' , f : parse _PtgRefErr } ,
/*::[*/ 0x2B /*::]*/ : { n : 'PtgAreaErr' , f : parse _PtgAreaErr } ,
/*::[*/ 0x2C /*::]*/ : { n : 'PtgRefN' , f : parse _PtgRefN } ,
/*::[*/ 0x2D /*::]*/ : { n : 'PtgAreaN' , f : parse _PtgAreaN } ,
2018-02-28 10:41:49 +00:00
/*::[*/ 0x2E /*::]*/ : { n : 'PtgMemAreaN' , f : parse _PtgMemAreaN } ,
/*::[*/ 0x2F /*::]*/ : { n : 'PtgMemNoMemN' , f : parse _PtgMemNoMemN } ,
2017-02-10 19:23:01 +00:00
/*::[*/ 0x39 /*::]*/ : { n : 'PtgNameX' , f : parse _PtgNameX } ,
/*::[*/ 0x3A /*::]*/ : { n : 'PtgRef3d' , f : parse _PtgRef3d } ,
/*::[*/ 0x3B /*::]*/ : { n : 'PtgArea3d' , f : parse _PtgArea3d } ,
/*::[*/ 0x3C /*::]*/ : { n : 'PtgRefErr3d' , f : parse _PtgRefErr3d } ,
/*::[*/ 0x3D /*::]*/ : { n : 'PtgAreaErr3d' , f : parse _PtgAreaErr3d } ,
/*::[*/ 0xFF /*::]*/ : { }
2017-02-03 20:50:45 +00:00
} ;
/* These are duplicated in the PtgTypes table */
var PtgDupes = {
2017-02-10 19:23:01 +00:00
/*::[*/ 0x40 /*::]*/ : 0x20 , /*::[*/ 0x60 /*::]*/ : 0x20 ,
/*::[*/ 0x41 /*::]*/ : 0x21 , /*::[*/ 0x61 /*::]*/ : 0x21 ,
/*::[*/ 0x42 /*::]*/ : 0x22 , /*::[*/ 0x62 /*::]*/ : 0x22 ,
/*::[*/ 0x43 /*::]*/ : 0x23 , /*::[*/ 0x63 /*::]*/ : 0x23 ,
/*::[*/ 0x44 /*::]*/ : 0x24 , /*::[*/ 0x64 /*::]*/ : 0x24 ,
/*::[*/ 0x45 /*::]*/ : 0x25 , /*::[*/ 0x65 /*::]*/ : 0x25 ,
/*::[*/ 0x46 /*::]*/ : 0x26 , /*::[*/ 0x66 /*::]*/ : 0x26 ,
/*::[*/ 0x47 /*::]*/ : 0x27 , /*::[*/ 0x67 /*::]*/ : 0x27 ,
/*::[*/ 0x48 /*::]*/ : 0x28 , /*::[*/ 0x68 /*::]*/ : 0x28 ,
/*::[*/ 0x49 /*::]*/ : 0x29 , /*::[*/ 0x69 /*::]*/ : 0x29 ,
/*::[*/ 0x4A /*::]*/ : 0x2A , /*::[*/ 0x6A /*::]*/ : 0x2A ,
/*::[*/ 0x4B /*::]*/ : 0x2B , /*::[*/ 0x6B /*::]*/ : 0x2B ,
/*::[*/ 0x4C /*::]*/ : 0x2C , /*::[*/ 0x6C /*::]*/ : 0x2C ,
/*::[*/ 0x4D /*::]*/ : 0x2D , /*::[*/ 0x6D /*::]*/ : 0x2D ,
2018-02-28 10:41:49 +00:00
/*::[*/ 0x4E /*::]*/ : 0x2E , /*::[*/ 0x6E /*::]*/ : 0x2E ,
/*::[*/ 0x4F /*::]*/ : 0x2F , /*::[*/ 0x6F /*::]*/ : 0x2F ,
/*::[*/ 0x58 /*::]*/ : 0x22 , /*::[*/ 0x78 /*::]*/ : 0x22 ,
2017-02-10 19:23:01 +00:00
/*::[*/ 0x59 /*::]*/ : 0x39 , /*::[*/ 0x79 /*::]*/ : 0x39 ,
/*::[*/ 0x5A /*::]*/ : 0x3A , /*::[*/ 0x7A /*::]*/ : 0x3A ,
/*::[*/ 0x5B /*::]*/ : 0x3B , /*::[*/ 0x7B /*::]*/ : 0x3B ,
/*::[*/ 0x5C /*::]*/ : 0x3C , /*::[*/ 0x7C /*::]*/ : 0x3C ,
/*::[*/ 0x5D /*::]*/ : 0x3D , /*::[*/ 0x7D /*::]*/ : 0x3D
2017-02-03 20:50:45 +00:00
} ;
2017-02-19 20:36:32 +00:00
var Ptg18 = {
2017-10-17 00:14:32 +00:00
/*::[*/ 0x01 /*::]*/ : { n : 'PtgElfLel' , f : parse _PtgElfLel } ,
/*::[*/ 0x02 /*::]*/ : { n : 'PtgElfRw' , f : parse _PtgElfRw } ,
/*::[*/ 0x03 /*::]*/ : { n : 'PtgElfCol' , f : parse _PtgElfCol } ,
/*::[*/ 0x06 /*::]*/ : { n : 'PtgElfRwV' , f : parse _PtgElfRwV } ,
/*::[*/ 0x07 /*::]*/ : { n : 'PtgElfColV' , f : parse _PtgElfColV } ,
/*::[*/ 0x0A /*::]*/ : { n : 'PtgElfRadical' , f : parse _PtgElfRadical } ,
/*::[*/ 0x0B /*::]*/ : { n : 'PtgElfRadicalS' , f : parse _PtgElfRadicalS } ,
/*::[*/ 0x0D /*::]*/ : { n : 'PtgElfColS' , f : parse _PtgElfColS } ,
/*::[*/ 0x0F /*::]*/ : { n : 'PtgElfColSV' , f : parse _PtgElfColSV } ,
/*::[*/ 0x10 /*::]*/ : { n : 'PtgElfRadicalLel' , f : parse _PtgElfRadicalLel } ,
/*::[*/ 0x19 /*::]*/ : { n : 'PtgList' , f : parse _PtgList } ,
/*::[*/ 0x1D /*::]*/ : { n : 'PtgSxName' , f : parse _PtgSxName } ,
/*::[*/ 0xFF /*::]*/ : { }
2017-02-19 20:36:32 +00:00
} ;
2017-02-03 20:50:45 +00:00
var Ptg19 = {
2018-02-28 10:41:49 +00:00
/*::[*/ 0x00 /*::]*/ : { n : 'PtgAttrNoop' , f : parse _PtgAttrNoop } ,
2017-02-10 19:23:01 +00:00
/*::[*/ 0x01 /*::]*/ : { n : 'PtgAttrSemi' , f : parse _PtgAttrSemi } ,
/*::[*/ 0x02 /*::]*/ : { n : 'PtgAttrIf' , f : parse _PtgAttrIf } ,
/*::[*/ 0x04 /*::]*/ : { n : 'PtgAttrChoose' , f : parse _PtgAttrChoose } ,
/*::[*/ 0x08 /*::]*/ : { n : 'PtgAttrGoto' , f : parse _PtgAttrGoto } ,
/*::[*/ 0x10 /*::]*/ : { n : 'PtgAttrSum' , f : parse _PtgAttrSum } ,
/*::[*/ 0x20 /*::]*/ : { n : 'PtgAttrBaxcel' , f : parse _PtgAttrBaxcel } ,
2022-03-16 03:18:09 +00:00
/*::[*/ 0x21 /*::]*/ : { n : 'PtgAttrBaxcel' , f : parse _PtgAttrBaxcel } ,
2017-02-10 19:23:01 +00:00
/*::[*/ 0x40 /*::]*/ : { n : 'PtgAttrSpace' , f : parse _PtgAttrSpace } ,
/*::[*/ 0x41 /*::]*/ : { n : 'PtgAttrSpaceSemi' , f : parse _PtgAttrSpaceSemi } ,
2017-02-19 20:36:32 +00:00
/*::[*/ 0x80 /*::]*/ : { n : 'PtgAttrIfError' , f : parse _PtgAttrIfError } ,
2017-02-10 19:23:01 +00:00
/*::[*/ 0xFF /*::]*/ : { }
2017-02-03 20:50:45 +00:00
} ;
2018-02-14 20:06:35 +00:00
/* [MS-XLS] 2.5.198.103 ; [MS-XLSB] 2.5.97.87 */
2017-02-03 20:50:45 +00:00
function parse _RgbExtra ( blob , length , rgce , opts ) {
2017-03-05 00:56:31 +00:00
if ( opts . biff < 8 ) return parsenoop ( blob , length ) ;
2017-02-03 20:50:45 +00:00
var target = blob . l + length ;
var o = [ ] ;
for ( var i = 0 ; i !== rgce . length ; ++ i ) {
switch ( rgce [ i ] [ 0 ] ) {
case 'PtgArray' : /* PtgArray -> PtgExtraArray */
2017-02-19 20:36:32 +00:00
rgce [ i ] [ 1 ] = parse _PtgExtraArray ( blob , 0 , opts ) ;
2017-02-03 20:50:45 +00:00
o . push ( rgce [ i ] [ 1 ] ) ;
break ;
case 'PtgMemArea' : /* PtgMemArea -> PtgExtraMem */
2018-02-14 20:06:35 +00:00
rgce [ i ] [ 2 ] = parse _PtgExtraMem ( blob , rgce [ i ] [ 1 ] , opts ) ;
2017-02-03 20:50:45 +00:00
o . push ( rgce [ i ] [ 2 ] ) ;
break ;
2017-02-19 20:36:32 +00:00
case 'PtgExp' : /* PtgExp -> PtgExtraCol */
if ( opts && opts . biff == 12 ) {
rgce [ i ] [ 1 ] [ 1 ] = blob . read _shift ( 4 ) ;
o . push ( rgce [ i ] [ 1 ] ) ;
} break ;
2017-10-17 00:14:32 +00:00
case 'PtgList' : /* TODO: PtgList -> PtgExtraList */
case 'PtgElfRadicalS' : /* TODO: PtgElfRadicalS -> PtgExtraElf */
case 'PtgElfColS' : /* TODO: PtgElfColS -> PtgExtraElf */
case 'PtgElfColSV' : /* TODO: PtgElfColSV -> PtgExtraElf */
throw "Unsupported " + rgce [ i ] [ 0 ] ;
2017-02-03 20:50:45 +00:00
default : break ;
}
}
length = target - blob . l ;
2017-02-19 20:36:32 +00:00
/* note: this is technically an error but Excel disregards */
//if(target !== blob.l && blob.l !== target - length) throw new Error(target + " != " + blob.l);
2017-02-03 20:50:45 +00:00
if ( length !== 0 ) o . push ( parsenoop ( blob , length ) ) ;
return o ;
}
2018-02-14 20:06:35 +00:00
/* [MS-XLS] 2.5.198.104 ; [MS-XLSB] 2.5.97.88 */
2017-02-19 20:36:32 +00:00
function parse _Rgce ( blob , length , opts ) {
2017-02-03 20:50:45 +00:00
var target = blob . l + length ;
var R , id , ptgs = [ ] ;
while ( target != blob . l ) {
length = target - blob . l ;
id = blob [ blob . l ] ;
2022-03-12 14:05:57 +00:00
R = PtgTypes [ id ] || PtgTypes [ PtgDupes [ id ] ] ;
2018-02-28 10:41:49 +00:00
if ( id === 0x18 || id === 0x19 ) R = ( id === 0x18 ? Ptg18 : Ptg19 ) [ blob [ blob . l + 1 ] ] ;
2017-03-12 18:02:43 +00:00
if ( ! R || ! R . f ) { /*ptgs.push*/ ( parsenoop ( blob , length ) ) ; }
2017-02-19 20:36:32 +00:00
else { ptgs . push ( [ R . n , R . f ( blob , length , opts ) ] ) ; }
2017-02-03 20:50:45 +00:00
}
return ptgs ;
}
2017-12-30 05:40:35 +00:00
function stringify _array ( f /*:Array<Array<string>>*/ ) /*:string*/ {
var o /*:Array<string>*/ = [ ] ;
2017-02-19 20:36:32 +00:00
for ( var i = 0 ; i < f . length ; ++ i ) {
2017-12-30 05:40:35 +00:00
var x = f [ i ] , r /*:Array<string>*/ = [ ] ;
2017-02-19 20:36:32 +00:00
for ( var j = 0 ; j < x . length ; ++ j ) {
var y = x [ j ] ;
if ( y ) switch ( y [ 0 ] ) {
// TODO: handle embedded quotes
2017-03-12 18:02:43 +00:00
case 0x02 :
/*:: if(typeof y[1] != 'string') throw "unreachable"; */
r . push ( '"' + y [ 1 ] . replace ( /"/g , '""' ) + '"' ) ; break ;
2017-02-19 20:36:32 +00:00
default : r . push ( y [ 1 ] ) ;
} else r . push ( "" ) ;
}
o . push ( r . join ( "," ) ) ;
}
return o . join ( ";" ) ;
}
2018-02-14 20:06:35 +00:00
/* [MS-XLS] 2.2.2 ; [MS-XLSB] 2.2.2 TODO */
2017-02-19 20:36:32 +00:00
var PtgBinOp = {
PtgAdd : "+" ,
PtgConcat : "&" ,
PtgDiv : "/" ,
PtgEq : "=" ,
PtgGe : ">=" ,
PtgGt : ">" ,
PtgLe : "<=" ,
PtgLt : "<" ,
PtgMul : "*" ,
PtgNe : "<>" ,
PtgPower : "^" ,
PtgSub : "-"
} ;
2020-07-03 23:46:07 +00:00
2022-05-27 20:26:39 +00:00
// TODO: explore space
function make _3d _range ( start , end ) {
var s = start . lastIndexOf ( "!" ) , e = end . lastIndexOf ( "!" ) ;
if ( s == - 1 && e == - 1 ) return start + ":" + end ;
if ( s > 0 && e > 0 && start . slice ( 0 , s ) . toLowerCase ( ) == end . slice ( 0 , e ) . toLowerCase ( ) ) return start + ":" + end . slice ( e + 1 ) ;
console . error ( "Cannot hydrate range" , start , end ) ;
return start + ":" + end ;
}
2017-08-05 06:32:57 +00:00
function get _ixti _raw ( supbooks , ixti /*:number*/ , opts ) /*:string*/ {
2017-11-15 18:14:02 +00:00
if ( ! supbooks ) return "SH33TJSERR0" ;
2019-04-30 07:30:54 +00:00
if ( opts . biff > 8 && ( ! supbooks . XTI || ! supbooks . XTI [ ixti ] ) ) return supbooks . SheetNames [ ixti ] ;
2017-11-15 18:14:02 +00:00
if ( ! supbooks . XTI ) return "SH33TJSERR6" ;
var XTI = supbooks . XTI [ ixti ] ;
if ( opts . biff < 8 ) {
if ( ixti > 10000 ) ixti -= 65536 ;
if ( ixti < 0 ) ixti = - ixti ;
return ixti == 0 ? "" : supbooks . XTI [ ixti - 1 ] ;
}
if ( ! XTI ) return "SH33TJSERR1" ;
var o = "" ;
if ( opts . biff > 8 ) switch ( supbooks [ XTI [ 0 ] ] [ 0 ] ) {
case 0x0165 : /* 'BrtSupSelf' */
o = XTI [ 1 ] == - 1 ? "#REF" : supbooks . SheetNames [ XTI [ 1 ] ] ;
return XTI [ 1 ] == XTI [ 2 ] ? o : o + ":" + supbooks . SheetNames [ XTI [ 2 ] ] ;
case 0x0166 : /* 'BrtSupSame' */
if ( opts . SID != null ) return supbooks . SheetNames [ opts . SID ] ;
2017-12-30 05:40:35 +00:00
return "SH33TJSSAME" + supbooks [ XTI [ 0 ] ] [ 0 ] ;
2017-11-15 18:14:02 +00:00
case 0x0163 : /* 'BrtSupBookSrc' */
/* falls through */
2017-12-30 05:40:35 +00:00
default : return "SH33TJSSRC" + supbooks [ XTI [ 0 ] ] [ 0 ] ;
2017-11-15 18:14:02 +00:00
}
switch ( supbooks [ XTI [ 0 ] ] [ 0 ] [ 0 ] ) {
case 0x0401 :
o = XTI [ 1 ] == - 1 ? "#REF" : ( supbooks . SheetNames [ XTI [ 1 ] ] || "SH33TJSERR3" ) ;
return XTI [ 1 ] == XTI [ 2 ] ? o : o + ":" + supbooks . SheetNames [ XTI [ 2 ] ] ;
2019-08-03 22:37:04 +00:00
case 0x3A01 : return supbooks [ XTI [ 0 ] ] . slice ( 1 ) . map ( function ( name ) { return name . Name ; } ) . join ( ";;" ) ; //return "SH33TJSERR8";
2017-11-15 18:14:02 +00:00
default :
if ( ! supbooks [ XTI [ 0 ] ] [ 0 ] [ 3 ] ) return "SH33TJSERR2" ;
o = XTI [ 1 ] == - 1 ? "#REF" : ( supbooks [ XTI [ 0 ] ] [ 0 ] [ 3 ] [ XTI [ 1 ] ] || "SH33TJSERR4" ) ;
return XTI [ 1 ] == XTI [ 2 ] ? o : o + ":" + supbooks [ XTI [ 0 ] ] [ 0 ] [ 3 ] [ XTI [ 2 ] ] ;
}
2017-07-27 20:07:51 +00:00
}
2017-08-05 06:32:57 +00:00
function get _ixti ( supbooks , ixti /*:number*/ , opts ) /*:string*/ {
2021-10-13 07:20:25 +00:00
var ixtiraw = get _ixti _raw ( supbooks , ixti , opts ) ;
return ixtiraw == "#REF" ? ixtiraw : formula _quote _sheet _name ( ixtiraw , opts ) ;
2017-08-05 06:32:57 +00:00
}
2017-09-30 06:18:11 +00:00
function stringify _formula ( formula /*Array<any>*/ , range , cell /*:any*/ , supbooks , opts ) /*:string*/ {
2018-02-21 07:01:34 +00:00
var biff = ( opts && opts . biff ) || 8 ;
2017-02-19 20:36:32 +00:00
var _range = /*range != null ? range :*/ { s : { c : 0 , r : 0 } , e : { c : 0 , r : 0 } } ;
2018-01-23 09:07:51 +00:00
var stack /*:Array<string>*/ = [ ] , e1 , e2 , /*::type,*/ c /*:CellAddress*/ , ixti = 0 , nameidx = 0 , r , sname = "" ;
2017-02-03 20:50:45 +00:00
if ( ! formula [ 0 ] || ! formula [ 0 ] [ 0 ] ) return "" ;
2017-02-19 20:36:32 +00:00
var last _sp = - 1 , sp = "" ;
2017-02-03 20:50:45 +00:00
for ( var ff = 0 , fflen = formula [ 0 ] . length ; ff < fflen ; ++ ff ) {
var f = formula [ 0 ] [ ff ] ;
switch ( f [ 0 ] ) {
2018-02-14 20:06:35 +00:00
case 'PtgUminus' : /* [MS-XLS] 2.5.198.93 */
2017-05-09 18:07:57 +00:00
stack . push ( "-" + stack . pop ( ) ) ; break ;
2018-02-14 20:06:35 +00:00
case 'PtgUplus' : /* [MS-XLS] 2.5.198.95 */
2017-05-09 18:07:57 +00:00
stack . push ( "+" + stack . pop ( ) ) ; break ;
2018-02-14 20:06:35 +00:00
case 'PtgPercent' : /* [MS-XLS] 2.5.198.81 */
2017-05-09 18:07:57 +00:00
stack . push ( stack . pop ( ) + "%" ) ; break ;
2017-02-03 20:50:45 +00:00
2018-02-14 20:06:35 +00:00
case 'PtgAdd' : /* [MS-XLS] 2.5.198.26 */
case 'PtgConcat' : /* [MS-XLS] 2.5.198.43 */
case 'PtgDiv' : /* [MS-XLS] 2.5.198.45 */
case 'PtgEq' : /* [MS-XLS] 2.5.198.56 */
case 'PtgGe' : /* [MS-XLS] 2.5.198.64 */
case 'PtgGt' : /* [MS-XLS] 2.5.198.65 */
case 'PtgLe' : /* [MS-XLS] 2.5.198.68 */
case 'PtgLt' : /* [MS-XLS] 2.5.198.69 */
case 'PtgMul' : /* [MS-XLS] 2.5.198.75 */
case 'PtgNe' : /* [MS-XLS] 2.5.198.78 */
case 'PtgPower' : /* [MS-XLS] 2.5.198.82 */
case 'PtgSub' : /* [MS-XLS] 2.5.198.90 */
2017-02-03 20:50:45 +00:00
e1 = stack . pop ( ) ; e2 = stack . pop ( ) ;
2017-02-19 20:36:32 +00:00
if ( last _sp >= 0 ) {
switch ( formula [ 0 ] [ last _sp ] [ 1 ] [ 0 ] ) {
2017-05-09 18:07:57 +00:00
case 0 :
// $FlowIgnore
sp = fill ( " " , formula [ 0 ] [ last _sp ] [ 1 ] [ 1 ] ) ; break ;
case 1 :
// $FlowIgnore
sp = fill ( "\r" , formula [ 0 ] [ last _sp ] [ 1 ] [ 1 ] ) ; break ;
2017-02-19 20:36:32 +00:00
default :
sp = "" ;
2017-03-12 18:02:43 +00:00
// $FlowIgnore
2017-03-10 08:39:51 +00:00
if ( opts . WTF ) throw new Error ( "Unexpected PtgAttrSpaceType " + formula [ 0 ] [ last _sp ] [ 1 ] [ 0 ] ) ;
2017-02-19 20:36:32 +00:00
}
e2 = e2 + sp ;
last _sp = - 1 ;
}
stack . push ( e2 + PtgBinOp [ f [ 0 ] ] + e1 ) ;
2017-02-03 20:50:45 +00:00
break ;
2018-02-14 20:06:35 +00:00
case 'PtgIsect' : /* [MS-XLS] 2.5.198.67 */
2017-02-03 20:50:45 +00:00
e1 = stack . pop ( ) ; e2 = stack . pop ( ) ;
stack . push ( e2 + " " + e1 ) ;
break ;
2018-02-14 20:06:35 +00:00
case 'PtgUnion' : /* [MS-XLS] 2.5.198.94 */
2017-02-03 20:50:45 +00:00
e1 = stack . pop ( ) ; e2 = stack . pop ( ) ;
stack . push ( e2 + "," + e1 ) ;
break ;
2018-02-14 20:06:35 +00:00
case 'PtgRange' : /* [MS-XLS] 2.5.198.83 */
2017-02-19 20:36:32 +00:00
e1 = stack . pop ( ) ; e2 = stack . pop ( ) ;
2022-05-27 20:26:39 +00:00
stack . push ( make _3d _range ( e2 , e1 ) ) ;
2017-02-19 20:36:32 +00:00
break ;
2017-02-03 20:50:45 +00:00
2018-02-14 20:06:35 +00:00
case 'PtgAttrChoose' : /* [MS-XLS] 2.5.198.34 */
2017-05-09 18:07:57 +00:00
break ;
2018-02-14 20:06:35 +00:00
case 'PtgAttrGoto' : /* [MS-XLS] 2.5.198.35 */
2017-05-09 18:07:57 +00:00
break ;
2018-02-14 20:06:35 +00:00
case 'PtgAttrIf' : /* [MS-XLS] 2.5.198.36 */
2017-05-09 18:07:57 +00:00
break ;
case 'PtgAttrIfError' : /* [MS-XLSB] 2.5.97.28 */
break ;
2017-02-03 20:50:45 +00:00
2018-02-14 20:06:35 +00:00
case 'PtgRef' : /* [MS-XLS] 2.5.198.84 */
2018-01-23 09:07:51 +00:00
/*::type = f[1][0]; */ c = shift _cell _xls ( ( f [ 1 ] [ 1 ] /*:any*/ ) , _range , opts ) ;
2018-02-21 07:01:34 +00:00
stack . push ( encode _cell _xls ( c , biff ) ) ;
2017-02-03 20:50:45 +00:00
break ;
2018-02-14 20:06:35 +00:00
case 'PtgRefN' : /* [MS-XLS] 2.5.198.88 */
2018-01-23 09:07:51 +00:00
/*::type = f[1][0]; */ c = cell ? shift _cell _xls ( ( f [ 1 ] [ 1 ] /*:any*/ ) , cell , opts ) : ( f [ 1 ] [ 1 ] /*:any*/ ) ;
2018-02-21 07:01:34 +00:00
stack . push ( encode _cell _xls ( c , biff ) ) ;
2017-02-03 20:50:45 +00:00
break ;
2018-02-14 20:06:35 +00:00
case 'PtgRef3d' : /* [MS-XLS] 2.5.198.85 */
2018-01-23 09:07:51 +00:00
/*::type = f[1][0]; */ ixti = /*::Number(*/ f [ 1 ] [ 1 ] /*::)*/ ; c = shift _cell _xls ( ( f [ 1 ] [ 2 ] /*:any*/ ) , _range , opts ) ;
2017-07-27 20:07:51 +00:00
sname = get _ixti ( supbooks , ixti , opts ) ;
2018-01-23 09:07:51 +00:00
var w = sname ; /* IE9 fails on defined names */ // eslint-disable-line no-unused-vars
2018-02-21 07:01:34 +00:00
stack . push ( sname + "!" + encode _cell _xls ( c , biff ) ) ;
2017-02-03 20:50:45 +00:00
break ;
2018-02-14 20:06:35 +00:00
case 'PtgFunc' : /* [MS-XLS] 2.5.198.62 */
case 'PtgFuncVar' : /* [MS-XLS] 2.5.198.63 */
2017-02-19 20:36:32 +00:00
/* f[1] = [argc, func, type] */
2017-09-30 06:18:11 +00:00
var argc /*:number*/ = ( f [ 1 ] [ 0 ] /*:any*/ ) , func /*:string*/ = ( f [ 1 ] [ 1 ] /*:any*/ ) ;
2017-02-03 20:50:45 +00:00
if ( ! argc ) argc = 0 ;
2018-02-21 07:01:34 +00:00
argc &= 0x7F ;
2017-02-19 20:36:32 +00:00
var args = argc == 0 ? [ ] : stack . slice ( - argc ) ;
2017-02-03 20:50:45 +00:00
stack . length -= argc ;
if ( func === 'User' ) func = args . shift ( ) ;
stack . push ( func + "(" + args . join ( "," ) + ")" ) ;
break ;
2018-02-14 20:06:35 +00:00
case 'PtgBool' : /* [MS-XLS] 2.5.198.42 */
2017-05-09 18:07:57 +00:00
stack . push ( f [ 1 ] ? "TRUE" : "FALSE" ) ; break ;
2018-02-14 20:06:35 +00:00
case 'PtgInt' : /* [MS-XLS] 2.5.198.66 */
2017-05-09 18:07:57 +00:00
stack . push ( /*::String(*/ f [ 1 ] /*::)*/ ) ; break ;
2018-02-14 20:06:35 +00:00
case 'PtgNum' : /* [MS-XLS] 2.5.198.79 TODO: precision? */
2017-05-09 18:07:57 +00:00
stack . push ( String ( f [ 1 ] ) ) ; break ;
2018-02-14 20:06:35 +00:00
case 'PtgStr' : /* [MS-XLS] 2.5.198.89 */
2017-05-09 18:07:57 +00:00
// $FlowIgnore
2019-08-03 22:37:04 +00:00
stack . push ( '"' + f [ 1 ] . replace ( /"/g , '""' ) + '"' ) ; break ;
2018-02-14 20:06:35 +00:00
case 'PtgErr' : /* [MS-XLS] 2.5.198.57 */
2017-05-09 18:07:57 +00:00
stack . push ( /*::String(*/ f [ 1 ] /*::)*/ ) ; break ;
2018-02-14 20:06:35 +00:00
case 'PtgAreaN' : /* [MS-XLS] 2.5.198.31 TODO */
2018-01-23 09:07:51 +00:00
/*::type = f[1][0]; */ r = shift _range _xls ( f [ 1 ] [ 1 ] , cell ? { s : cell } : _range , opts ) ;
2017-03-25 01:36:40 +00:00
stack . push ( encode _range _xls ( ( r /*:any*/ ) , opts ) ) ;
2017-03-10 08:39:51 +00:00
break ;
2018-02-14 20:06:35 +00:00
case 'PtgArea' : /* [MS-XLS] 2.5.198.27 TODO: fixed points */
2018-01-23 09:07:51 +00:00
/*::type = f[1][0]; */ r = shift _range _xls ( f [ 1 ] [ 1 ] , _range , opts ) ;
2017-03-25 01:36:40 +00:00
stack . push ( encode _range _xls ( ( r /*:any*/ ) , opts ) ) ;
2017-02-03 20:50:45 +00:00
break ;
2018-02-14 20:06:35 +00:00
case 'PtgArea3d' : /* [MS-XLS] 2.5.198.28 TODO */
2018-01-23 09:07:51 +00:00
/*::type = f[1][0]; */ ixti = /*::Number(*/ f [ 1 ] [ 1 ] /*::)*/ ; r = f [ 1 ] [ 2 ] ;
2017-11-15 18:14:02 +00:00
sname = get _ixti ( supbooks , ixti , opts ) ;
2017-08-19 23:06:34 +00:00
stack . push ( sname + "!" + encode _range _xls ( ( r /*:any*/ ) , opts ) ) ;
2017-02-03 20:50:45 +00:00
break ;
2018-02-14 20:06:35 +00:00
case 'PtgAttrSum' : /* [MS-XLS] 2.5.198.41 */
2017-02-03 20:50:45 +00:00
stack . push ( "SUM(" + stack . pop ( ) + ")" ) ;
break ;
2018-02-21 07:01:34 +00:00
case 'PtgAttrBaxcel' : /* [MS-XLS] 2.5.198.33 */
2018-02-14 20:06:35 +00:00
case 'PtgAttrSemi' : /* [MS-XLS] 2.5.198.37 */
2017-05-09 18:07:57 +00:00
break ;
2017-02-03 20:50:45 +00:00
2018-02-14 20:06:35 +00:00
case 'PtgName' : /* [MS-XLS] 2.5.198.76 ; [MS-XLSB] 2.5.97.60 TODO: revisions */
2017-02-03 20:50:45 +00:00
/* f[1] = type, 0, nameindex */
2017-05-13 18:21:22 +00:00
nameidx = ( f [ 1 ] [ 2 ] /*:any*/ ) ;
2017-04-11 22:15:36 +00:00
var lbl = ( supbooks . names || [ ] ) [ nameidx - 1 ] || ( supbooks [ 0 ] || [ ] ) [ nameidx ] ;
2017-12-30 05:40:35 +00:00
var name = lbl ? lbl . Name : "SH33TJSNAME" + String ( nameidx ) ;
2022-02-10 12:40:50 +00:00
/* [MS-XLSB] 2.5.97.10 Ftab -- last verified 20220204 */
2022-03-03 08:35:39 +00:00
if ( name && name . slice ( 0 , 6 ) == "_xlfn." && ! opts . xlfn ) name = name . slice ( 6 ) ;
2017-02-03 20:50:45 +00:00
stack . push ( name ) ;
break ;
2018-02-14 20:06:35 +00:00
case 'PtgNameX' : /* [MS-XLS] 2.5.198.77 ; [MS-XLSB] 2.5.97.61 TODO: revisions */
2017-02-03 20:50:45 +00:00
/* f[1] = type, ixti, nameindex */
2017-05-13 18:21:22 +00:00
var bookidx /*:number*/ = ( f [ 1 ] [ 1 ] /*:any*/ ) ; nameidx = ( f [ 1 ] [ 2 ] /*:any*/ ) ; var externbook ;
2019-08-03 22:37:04 +00:00
/* TODO: Properly handle missing values -- this should be using get_ixti_raw primarily */
2017-04-11 22:15:36 +00:00
if ( opts . biff <= 5 ) {
2017-02-19 20:36:32 +00:00
if ( bookidx < 0 ) bookidx = - bookidx ;
if ( supbooks [ bookidx ] ) externbook = supbooks [ bookidx ] [ nameidx ] ;
} else {
2017-04-11 22:15:36 +00:00
var o = "" ;
2017-05-09 18:07:57 +00:00
if ( ( ( supbooks [ bookidx ] || [ ] ) [ 0 ] || [ ] ) [ 0 ] == 0x3A01 ) { /* empty */ }
2017-04-11 22:15:36 +00:00
else if ( ( ( supbooks [ bookidx ] || [ ] ) [ 0 ] || [ ] ) [ 0 ] == 0x0401 ) {
if ( supbooks [ bookidx ] [ nameidx ] && supbooks [ bookidx ] [ nameidx ] . itab > 0 ) {
o = supbooks . SheetNames [ supbooks [ bookidx ] [ nameidx ] . itab - 1 ] + "!" ;
}
}
else o = supbooks . SheetNames [ nameidx - 1 ] + "!" ;
if ( supbooks [ bookidx ] && supbooks [ bookidx ] [ nameidx ] ) o += supbooks [ bookidx ] [ nameidx ] . Name ;
else if ( supbooks [ 0 ] && supbooks [ 0 ] [ nameidx ] ) o += supbooks [ 0 ] [ nameidx ] . Name ;
2019-08-03 22:37:04 +00:00
else {
2021-09-16 01:50:33 +00:00
var ixtidata = ( get _ixti _raw ( supbooks , bookidx , opts ) || "" ) . split ( ";;" ) ;
2019-08-03 22:37:04 +00:00
if ( ixtidata [ nameidx - 1 ] ) o = ixtidata [ nameidx - 1 ] ; // TODO: confirm this is correct
else o += "SH33TJSERRX" ;
}
2017-04-11 22:15:36 +00:00
stack . push ( o ) ;
break ;
2017-02-19 20:36:32 +00:00
}
2017-07-27 20:07:51 +00:00
if ( ! externbook ) externbook = { Name : "SH33TJSERRY" } ;
2017-04-11 22:15:36 +00:00
stack . push ( externbook . Name ) ;
2017-02-03 20:50:45 +00:00
break ;
2018-02-14 20:06:35 +00:00
case 'PtgParen' : /* [MS-XLS] 2.5.198.80 */
2017-02-19 20:36:32 +00:00
var lp = '(' , rp = ')' ;
if ( last _sp >= 0 ) {
sp = "" ;
switch ( formula [ 0 ] [ last _sp ] [ 1 ] [ 0 ] ) {
2017-03-12 18:02:43 +00:00
// $FlowIgnore
2017-02-19 20:36:32 +00:00
case 2 : lp = fill ( " " , formula [ 0 ] [ last _sp ] [ 1 ] [ 1 ] ) + lp ; break ;
2017-03-12 18:02:43 +00:00
// $FlowIgnore
2017-02-19 20:36:32 +00:00
case 3 : lp = fill ( "\r" , formula [ 0 ] [ last _sp ] [ 1 ] [ 1 ] ) + lp ; break ;
2017-03-12 18:02:43 +00:00
// $FlowIgnore
2017-03-10 08:39:51 +00:00
case 4 : rp = fill ( " " , formula [ 0 ] [ last _sp ] [ 1 ] [ 1 ] ) + rp ; break ;
2017-03-12 18:02:43 +00:00
// $FlowIgnore
2017-03-10 08:39:51 +00:00
case 5 : rp = fill ( "\r" , formula [ 0 ] [ last _sp ] [ 1 ] [ 1 ] ) + rp ; break ;
2017-02-19 20:36:32 +00:00
default :
2017-03-12 18:02:43 +00:00
// $FlowIgnore
2017-03-10 08:39:51 +00:00
if ( opts . WTF ) throw new Error ( "Unexpected PtgAttrSpaceType " + formula [ 0 ] [ last _sp ] [ 1 ] [ 0 ] ) ;
2017-02-19 20:36:32 +00:00
}
last _sp = - 1 ;
}
stack . push ( lp + stack . pop ( ) + rp ) ; break ;
2017-02-03 20:50:45 +00:00
2018-02-14 20:06:35 +00:00
case 'PtgRefErr' : /* [MS-XLS] 2.5.198.86 */
2017-05-09 18:07:57 +00:00
stack . push ( '#REF!' ) ; break ;
2017-02-03 20:50:45 +00:00
2018-02-14 20:06:35 +00:00
case 'PtgRefErr3d' : /* [MS-XLS] 2.5.198.87 */
2017-05-09 18:07:57 +00:00
stack . push ( '#REF!' ) ; break ;
2017-03-10 08:39:51 +00:00
2018-02-14 20:06:35 +00:00
case 'PtgExp' : /* [MS-XLS] 2.5.198.58 TODO */
2017-11-20 01:51:14 +00:00
c = { c : ( f [ 1 ] [ 1 ] /*:any*/ ) , r : ( f [ 1 ] [ 0 ] /*:any*/ ) } ;
2017-03-12 18:02:43 +00:00
var q = ( { c : cell . c , r : cell . r } /*:any*/ ) ;
2017-02-03 20:50:45 +00:00
if ( supbooks . sharedf [ encode _cell ( c ) ] ) {
var parsedf = ( supbooks . sharedf [ encode _cell ( c ) ] ) ;
stack . push ( stringify _formula ( parsedf , _range , q , supbooks , opts ) ) ;
2021-10-13 07:20:25 +00:00
} else {
2017-02-03 20:50:45 +00:00
var fnd = false ;
for ( e1 = 0 ; e1 != supbooks . arrayf . length ; ++ e1 ) {
/* TODO: should be something like range_has */
e2 = supbooks . arrayf [ e1 ] ;
if ( c . c < e2 [ 0 ] . s . c || c . c > e2 [ 0 ] . e . c ) continue ;
if ( c . r < e2 [ 0 ] . s . r || c . r > e2 [ 0 ] . e . r ) continue ;
stack . push ( stringify _formula ( e2 [ 1 ] , _range , q , supbooks , opts ) ) ;
2017-02-19 20:36:32 +00:00
fnd = true ;
break ;
2017-02-03 20:50:45 +00:00
}
2017-03-12 18:02:43 +00:00
if ( ! fnd ) stack . push ( /*::String(*/ f [ 1 ] /*::)*/ ) ;
2017-02-03 20:50:45 +00:00
}
break ;
2018-02-14 20:06:35 +00:00
case 'PtgArray' : /* [MS-XLS] 2.5.198.32 TODO */
2017-12-30 05:40:35 +00:00
stack . push ( "{" + stringify _array ( /*::(*/ f [ 1 ] /*:: :any)*/ ) + "}" ) ;
2017-02-03 20:50:45 +00:00
break ;
2018-02-14 20:06:35 +00:00
case 'PtgMemArea' : /* [MS-XLS] 2.5.198.70 TODO: confirm this is a non-display */
2017-02-03 20:50:45 +00:00
//stack.push("(" + f[2].map(encode_range).join(",") + ")");
break ;
2018-02-14 20:06:35 +00:00
case 'PtgAttrSpace' : /* [MS-XLS] 2.5.198.38 */
case 'PtgAttrSpaceSemi' : /* [MS-XLS] 2.5.198.39 */
2017-02-19 20:36:32 +00:00
last _sp = ff ;
break ;
2017-02-03 20:50:45 +00:00
2018-02-14 20:06:35 +00:00
case 'PtgTbl' : /* [MS-XLS] 2.5.198.92 TODO */
2017-05-09 18:07:57 +00:00
break ;
2017-02-03 20:50:45 +00:00
2018-02-14 20:06:35 +00:00
case 'PtgMemErr' : /* [MS-XLS] 2.5.198.71 */
2017-05-09 18:07:57 +00:00
break ;
2017-02-03 20:50:45 +00:00
2018-02-14 20:06:35 +00:00
case 'PtgMissArg' : /* [MS-XLS] 2.5.198.74 */
2017-02-03 20:50:45 +00:00
stack . push ( "" ) ;
break ;
2018-02-14 20:06:35 +00:00
case 'PtgAreaErr' : /* [MS-XLS] 2.5.198.29 */
2017-05-09 18:07:57 +00:00
stack . push ( "#REF!" ) ; break ;
2017-02-03 20:50:45 +00:00
2018-02-14 20:06:35 +00:00
case 'PtgAreaErr3d' : /* [MS-XLS] 2.5.198.30 */
2017-05-09 18:07:57 +00:00
stack . push ( "#REF!" ) ; break ;
2017-04-11 22:15:36 +00:00
2018-02-28 10:41:49 +00:00
case 'PtgList' : /* [MS-XLSB] 2.5.97.52 */
// $FlowIgnore
stack . push ( "Table" + f [ 1 ] . idx + "[#" + f [ 1 ] . rt + "]" ) ;
break ;
case 'PtgMemAreaN' :
case 'PtgMemNoMemN' :
case 'PtgAttrNoop' :
case 'PtgSheet' :
case 'PtgEndSheet' :
break ;
2018-02-14 20:06:35 +00:00
case 'PtgMemFunc' : /* [MS-XLS] 2.5.198.72 TODO */
break ;
case 'PtgMemNoMem' : /* [MS-XLS] 2.5.198.73 TODO */
2017-05-09 18:07:57 +00:00
break ;
2017-10-17 00:14:32 +00:00
2018-02-14 20:06:35 +00:00
case 'PtgElfCol' : /* [MS-XLS] 2.5.198.46 */
case 'PtgElfColS' : /* [MS-XLS] 2.5.198.47 */
case 'PtgElfColSV' : /* [MS-XLS] 2.5.198.48 */
case 'PtgElfColV' : /* [MS-XLS] 2.5.198.49 */
case 'PtgElfLel' : /* [MS-XLS] 2.5.198.50 */
case 'PtgElfRadical' : /* [MS-XLS] 2.5.198.51 */
case 'PtgElfRadicalLel' : /* [MS-XLS] 2.5.198.52 */
case 'PtgElfRadicalS' : /* [MS-XLS] 2.5.198.53 */
case 'PtgElfRw' : /* [MS-XLS] 2.5.198.54 */
case 'PtgElfRwV' : /* [MS-XLS] 2.5.198.55 */
2017-10-17 00:14:32 +00:00
throw new Error ( "Unsupported ELFs" ) ;
2018-02-14 20:06:35 +00:00
case 'PtgSxName' : /* [MS-XLS] 2.5.198.91 TODO -- find a test case */
2017-10-17 00:14:32 +00:00
throw new Error ( 'Unrecognized Formula Token: ' + String ( f ) ) ;
2017-03-12 18:02:43 +00:00
default : throw new Error ( 'Unrecognized Formula Token: ' + String ( f ) ) ;
2017-02-03 20:50:45 +00:00
}
2017-02-19 20:36:32 +00:00
var PtgNonDisp = [ 'PtgAttrSpace' , 'PtgAttrSpaceSemi' , 'PtgAttrGoto' ] ;
2018-02-28 10:41:49 +00:00
if ( opts . biff != 3 ) if ( last _sp >= 0 && PtgNonDisp . indexOf ( formula [ 0 ] [ ff ] [ 0 ] ) == - 1 ) {
2017-02-19 20:36:32 +00:00
f = formula [ 0 ] [ last _sp ] ;
2017-03-10 08:39:51 +00:00
var _left = true ;
2017-02-19 20:36:32 +00:00
switch ( f [ 1 ] [ 0 ] ) {
2017-03-10 08:39:51 +00:00
/* note: some bad XLSB files omit the PtgParen */
case 4 : _left = false ;
/* falls through */
2017-05-09 18:07:57 +00:00
case 0 :
// $FlowIgnore
sp = fill ( " " , f [ 1 ] [ 1 ] ) ; break ;
2017-03-10 08:39:51 +00:00
case 5 : _left = false ;
/* falls through */
2017-05-09 18:07:57 +00:00
case 1 :
// $FlowIgnore
sp = fill ( "\r" , f [ 1 ] [ 1 ] ) ; break ;
2017-02-19 20:36:32 +00:00
default :
sp = "" ;
2017-03-12 18:02:43 +00:00
// $FlowIgnore
2017-03-10 08:39:51 +00:00
if ( opts . WTF ) throw new Error ( "Unexpected PtgAttrSpaceType " + f [ 1 ] [ 0 ] ) ;
2017-02-19 20:36:32 +00:00
}
2017-03-10 08:39:51 +00:00
stack . push ( ( _left ? sp : "" ) + stack . pop ( ) + ( _left ? "" : sp ) ) ;
2017-02-19 20:36:32 +00:00
last _sp = - 1 ;
}
2017-02-03 20:50:45 +00:00
}
2017-02-19 20:36:32 +00:00
if ( stack . length > 1 && opts . WTF ) throw new Error ( "bad formula stack" ) ;
2022-06-09 04:45:22 +00:00
if ( stack [ 0 ] == "TRUE" ) return true ; if ( stack [ 0 ] == "FALSE" ) return false ;
2017-02-03 20:50:45 +00:00
return stack [ 0 ] ;
}
2017-10-17 00:14:32 +00:00
/* [MS-XLS] 2.5.198.1 TODO */
2018-01-23 09:07:51 +00:00
function parse _ArrayParsedFormula ( blob , length , opts /*::, ref*/ ) {
2017-10-17 00:14:32 +00:00
var target = blob . l + length , len = opts . biff == 2 ? 1 : 2 ;
var rgcb , cce = blob . read _shift ( len ) ; // length of rgce
if ( cce == 0xFFFF ) return [ [ ] , parsenoop ( blob , length - 2 ) ] ;
var rgce = parse _Rgce ( blob , cce , opts ) ;
if ( length !== cce + len ) rgcb = parse _RgbExtra ( blob , length - cce - len , rgce , opts ) ;
2018-01-23 09:07:51 +00:00
blob . l = target ;
2017-10-17 00:14:32 +00:00
return [ rgce , rgcb ] ;
}
/* [MS-XLS] 2.5.198.3 TODO */
function parse _XLSCellParsedFormula ( blob , length , opts ) {
var target = blob . l + length , len = opts . biff == 2 ? 1 : 2 ;
var rgcb , cce = blob . read _shift ( len ) ; // length of rgce
if ( cce == 0xFFFF ) return [ [ ] , parsenoop ( blob , length - 2 ) ] ;
var rgce = parse _Rgce ( blob , cce , opts ) ;
if ( length !== cce + len ) rgcb = parse _RgbExtra ( blob , length - cce - len , rgce , opts ) ;
2018-01-23 09:07:51 +00:00
blob . l = target ;
2017-10-17 00:14:32 +00:00
return [ rgce , rgcb ] ;
}
/* [MS-XLS] 2.5.198.21 */
function parse _NameParsedFormula ( blob , length , opts , cce ) {
var target = blob . l + length ;
var rgce = parse _Rgce ( blob , cce , opts ) ;
var rgcb ;
if ( target !== blob . l ) rgcb = parse _RgbExtra ( blob , target - blob . l , rgce , opts ) ;
return [ rgce , rgcb ] ;
}
/* [MS-XLS] 2.5.198.118 TODO */
function parse _SharedParsedFormula ( blob , length , opts ) {
var target = blob . l + length ;
var rgcb , cce = blob . read _shift ( 2 ) ; // length of rgce
var rgce = parse _Rgce ( blob , cce , opts ) ;
if ( cce == 0xFFFF ) return [ [ ] , parsenoop ( blob , length - 2 ) ] ;
if ( length !== cce + 2 ) rgcb = parse _RgbExtra ( blob , target - cce - 2 , rgce , opts ) ;
return [ rgce , rgcb ] ;
}
/* [MS-XLS] 2.5.133 TODO: how to emit empty strings? */
function parse _FormulaValue ( blob /*::, length*/ ) {
var b ;
if ( _ _readUInt16LE ( blob , blob . l + 6 ) !== 0xFFFF ) return [ parse _Xnum ( blob ) , 'n' ] ;
switch ( blob [ blob . l ] ) {
case 0x00 : blob . l += 8 ; return [ "String" , 's' ] ;
case 0x01 : b = blob [ blob . l + 2 ] === 0x1 ; blob . l += 8 ; return [ b , 'b' ] ;
case 0x02 : b = blob [ blob . l + 2 ] ; blob . l += 8 ; return [ b , 'e' ] ;
case 0x03 : blob . l += 8 ; return [ "" , 's' ] ;
}
return [ ] ;
}
2019-11-01 03:09:14 +00:00
function write _FormulaValue ( value ) {
if ( value == null ) {
// Blank String Value
var o = new _buf ( 8 ) ;
o . write _shift ( 1 , 0x03 ) ;
o . write _shift ( 1 , 0 ) ;
o . write _shift ( 2 , 0 ) ;
o . write _shift ( 2 , 0 ) ;
o . write _shift ( 2 , 0xFFFF ) ;
return o ;
} else if ( typeof value == "number" ) return write _Xnum ( value ) ;
return write _Xnum ( 0 ) ;
}
2017-10-17 00:14:32 +00:00
/* [MS-XLS] 2.4.127 TODO */
function parse _Formula ( blob , length , opts ) {
var end = blob . l + length ;
var cell = parse _XLSCell ( blob , 6 ) ;
if ( opts . biff == 2 ) ++ blob . l ;
var val = parse _FormulaValue ( blob , 8 ) ;
var flags = blob . read _shift ( 1 ) ;
if ( opts . biff != 2 ) {
blob . read _shift ( 1 ) ;
if ( opts . biff >= 5 ) {
2018-01-23 09:07:51 +00:00
/*var chn = */ blob . read _shift ( 4 ) ;
2017-10-17 00:14:32 +00:00
}
}
var cbf = parse _XLSCellParsedFormula ( blob , end - blob . l , opts ) ;
return { cell : cell , val : val [ 0 ] , formula : cbf , shared : ( flags >> 3 ) & 1 , tt : val [ 1 ] } ;
}
2019-11-01 03:09:14 +00:00
function write _Formula ( cell /*:Cell*/ , R /*:number*/ , C /*:number*/ , opts , os /*:number*/ ) {
// Cell
var o1 = write _XLSCell ( R , C , os ) ;
// FormulaValue
var o2 = write _FormulaValue ( cell . v ) ;
// flags + cache
var o3 = new _buf ( 6 ) ;
var flags = 0x01 | 0x20 ;
o3 . write _shift ( 2 , flags ) ;
o3 . write _shift ( 4 , 0 ) ;
// CellParsedFormula
var bf = new _buf ( cell . bf . length ) ;
for ( var i = 0 ; i < cell . bf . length ; ++ i ) bf [ i ] = cell . bf [ i ] ;
var out = bconcat ( [ o1 , o2 , o3 , bf ] ) ;
return out ;
}
2017-10-17 00:14:32 +00:00
2017-02-19 20:36:32 +00:00
/* XLSB Parsed Formula records have the same shape */
function parse _XLSBParsedFormula ( data , length , opts ) {
2017-02-03 20:50:45 +00:00
var cce = data . read _shift ( 4 ) ;
2017-02-19 20:36:32 +00:00
var rgce = parse _Rgce ( data , cce , opts ) ;
var cb = data . read _shift ( 4 ) ;
var rgcb = cb > 0 ? parse _RgbExtra ( data , cb , rgce , opts ) : null ;
return [ rgce , rgcb ] ;
2017-02-03 20:50:45 +00:00
}
2017-02-19 20:36:32 +00:00
/* [MS-XLSB] 2.5.97.1 ArrayParsedFormula */
var parse _XLSBArrayParsedFormula = parse _XLSBParsedFormula ;
/* [MS-XLSB] 2.5.97.4 CellParsedFormula */
var parse _XLSBCellParsedFormula = parse _XLSBParsedFormula ;
2019-11-01 03:09:14 +00:00
/* [MS-XLSB] 2.5.97.8 DVParsedFormula */
//var parse_XLSBDVParsedFormula = parse_XLSBParsedFormula;
/* [MS-XLSB] 2.5.97.9 FRTParsedFormula */
//var parse_XLSBFRTParsedFormula = parse_XLSBParsedFormula2;
2017-02-19 20:36:32 +00:00
/* [MS-XLSB] 2.5.97.12 NameParsedFormula */
var parse _XLSBNameParsedFormula = parse _XLSBParsedFormula ;
/* [MS-XLSB] 2.5.97.98 SharedParsedFormula */
var parse _XLSBSharedParsedFormula = parse _XLSBParsedFormula ;
2022-05-25 01:45:55 +00:00
/* Writes a PtgNum or PtgInt */
function write _XLSBFormulaNum ( val /*:number*/ ) {
if ( ( val | 0 ) == val && val < Math . pow ( 2 , 16 ) && val >= 0 ) {
var oint = new _buf ( 11 ) ;
oint . write _shift ( 4 , 3 ) ;
oint . write _shift ( 1 , 0x1e ) ;
oint . write _shift ( 2 , val ) ;
oint . write _shift ( 4 , 0 ) ;
return oint ;
}
var num = new _buf ( 17 ) ;
num . write _shift ( 4 , 11 ) ;
num . write _shift ( 1 , 0x1f ) ;
num . write _shift ( 8 , val ) ;
num . write _shift ( 4 , 0 ) ;
return num ;
}
/* Writes a PtgErr */
function write _XLSBFormulaErr ( val /*:number*/ ) {
var oint = new _buf ( 10 ) ;
oint . write _shift ( 4 , 2 ) ;
oint . write _shift ( 1 , 0x1C ) ;
oint . write _shift ( 1 , val ) ;
oint . write _shift ( 4 , 0 ) ;
return oint ;
}
2022-06-09 04:45:22 +00:00
/* Writes a PtgBool */
function write _XLSBFormulaBool ( val /*:boolean*/ ) {
var oint = new _buf ( 10 ) ;
oint . write _shift ( 4 , 2 ) ;
oint . write _shift ( 1 , 0x1D ) ;
oint . write _shift ( 1 , val ? 1 : 0 ) ;
oint . write _shift ( 4 , 0 ) ;
return oint ;
}
2022-05-25 01:45:55 +00:00
/* Writes a PtgStr */
function write _XLSBFormulaStr ( val /*:string*/ ) {
var preamble = new _buf ( 7 ) ;
preamble . write _shift ( 4 , 3 + 2 * val . length ) ;
preamble . write _shift ( 1 , 0x17 ) ;
preamble . write _shift ( 2 , val . length ) ;
var body = new _buf ( 2 * val . length ) ;
body . write _shift ( 2 * val . length , val , "utf16le" ) ;
var postamble = new _buf ( 4 ) ;
postamble . write _shift ( 4 , 0 ) ;
return bconcat ( [ preamble , body , postamble ] ) ;
}
/* Writes a PtgRef */
function write _XLSBFormulaRef ( str ) {
var cell = decode _cell ( str ) ;
var out = new _buf ( 15 ) ;
out . write _shift ( 4 , 7 ) ;
out . write _shift ( 1 , 0x04 | ( ( 1 ) << 5 ) ) ;
out . write _shift ( 4 , cell . r ) ;
out . write _shift ( 2 , cell . c | ( ( str . charAt ( 0 ) == "$" ? 0 : 1 ) << 14 ) | ( ( str . match ( /\$\d/ ) ? 0 : 1 ) << 15 ) ) ; // <== ColRelShort
out . write _shift ( 4 , 0 ) ;
return out ;
}
/* Writes a PtgRef3d */
function write _XLSBFormulaRef3D ( str , wb ) {
var lastbang = str . lastIndexOf ( "!" ) ;
var sname = str . slice ( 0 , lastbang ) ;
str = str . slice ( lastbang + 1 ) ;
var cell = decode _cell ( str ) ;
if ( sname . charAt ( 0 ) == "'" ) sname = sname . slice ( 1 , - 1 ) . replace ( /''/g , "'" ) ;
var out = new _buf ( 17 ) ;
out . write _shift ( 4 , 9 ) ;
out . write _shift ( 1 , 0x1A | ( ( 1 ) << 5 ) ) ;
2022-05-27 20:26:39 +00:00
out . write _shift ( 2 , 2 + wb . SheetNames . map ( function ( n ) { return n . toLowerCase ( ) ; } ) . indexOf ( sname . toLowerCase ( ) ) ) ;
2022-05-25 01:45:55 +00:00
out . write _shift ( 4 , cell . r ) ;
out . write _shift ( 2 , cell . c | ( ( str . charAt ( 0 ) == "$" ? 0 : 1 ) << 14 ) | ( ( str . match ( /\$\d/ ) ? 0 : 1 ) << 15 ) ) ; // <== ColRelShort
out . write _shift ( 4 , 0 ) ;
return out ;
}
2022-05-27 20:26:39 +00:00
/* Writes a PtgRefErr3d */
function write _XLSBFormulaRefErr3D ( str , wb ) {
var lastbang = str . lastIndexOf ( "!" ) ;
var sname = str . slice ( 0 , lastbang ) ;
str = str . slice ( lastbang + 1 ) ;
if ( sname . charAt ( 0 ) == "'" ) sname = sname . slice ( 1 , - 1 ) . replace ( /''/g , "'" ) ;
var out = new _buf ( 17 ) ;
out . write _shift ( 4 , 9 ) ;
out . write _shift ( 1 , 0x1C | ( ( 1 ) << 5 ) ) ;
out . write _shift ( 2 , 2 + wb . SheetNames . map ( function ( n ) { return n . toLowerCase ( ) ; } ) . indexOf ( sname . toLowerCase ( ) ) ) ;
out . write _shift ( 4 , 0 ) ;
out . write _shift ( 2 , 0 ) ; // <== ColRelShort
out . write _shift ( 4 , 0 ) ;
return out ;
}
/* Writes a single sheet range [PtgRef PtgRef PtgRange] */
function write _XLSBFormulaRange ( _str ) {
var parts = _str . split ( ":" ) , str = parts [ 0 ] ;
var out = new _buf ( 23 ) ;
out . write _shift ( 4 , 15 ) ;
/* start cell */
str = parts [ 0 ] ; var cell = decode _cell ( str ) ;
out . write _shift ( 1 , 0x04 | ( ( 1 ) << 5 ) ) ;
out . write _shift ( 4 , cell . r ) ;
out . write _shift ( 2 , cell . c | ( ( str . charAt ( 0 ) == "$" ? 0 : 1 ) << 14 ) | ( ( str . match ( /\$\d/ ) ? 0 : 1 ) << 15 ) ) ; // <== ColRelShort
out . write _shift ( 4 , 0 ) ;
/* end cell */
str = parts [ 1 ] ; cell = decode _cell ( str ) ;
out . write _shift ( 1 , 0x04 | ( ( 1 ) << 5 ) ) ;
out . write _shift ( 4 , cell . r ) ;
out . write _shift ( 2 , cell . c | ( ( str . charAt ( 0 ) == "$" ? 0 : 1 ) << 14 ) | ( ( str . match ( /\$\d/ ) ? 0 : 1 ) << 15 ) ) ; // <== ColRelShort
out . write _shift ( 4 , 0 ) ;
/* PtgRange */
out . write _shift ( 1 , 0x11 ) ;
out . write _shift ( 4 , 0 ) ;
return out ;
}
/* Writes a range with explicit sheet name [PtgRef3D PtgRef3D PtgRange] */
function write _XLSBFormulaRangeWS ( _str , wb ) {
var lastbang = _str . lastIndexOf ( "!" ) ;
var sname = _str . slice ( 0 , lastbang ) ;
_str = _str . slice ( lastbang + 1 ) ;
if ( sname . charAt ( 0 ) == "'" ) sname = sname . slice ( 1 , - 1 ) . replace ( /''/g , "'" ) ;
var parts = _str . split ( ":" ) ; str = parts [ 0 ] ;
var out = new _buf ( 27 ) ;
out . write _shift ( 4 , 19 ) ;
/* start cell */
var str = parts [ 0 ] , cell = decode _cell ( str ) ;
out . write _shift ( 1 , 0x1A | ( ( 1 ) << 5 ) ) ;
out . write _shift ( 2 , 2 + wb . SheetNames . map ( function ( n ) { return n . toLowerCase ( ) ; } ) . indexOf ( sname . toLowerCase ( ) ) ) ;
out . write _shift ( 4 , cell . r ) ;
out . write _shift ( 2 , cell . c | ( ( str . charAt ( 0 ) == "$" ? 0 : 1 ) << 14 ) | ( ( str . match ( /\$\d/ ) ? 0 : 1 ) << 15 ) ) ; // <== ColRelShort
/* end cell */
str = parts [ 1 ] ; cell = decode _cell ( str ) ;
out . write _shift ( 1 , 0x1A | ( ( 1 ) << 5 ) ) ;
out . write _shift ( 2 , 2 + wb . SheetNames . map ( function ( n ) { return n . toLowerCase ( ) ; } ) . indexOf ( sname . toLowerCase ( ) ) ) ;
out . write _shift ( 4 , cell . r ) ;
out . write _shift ( 2 , cell . c | ( ( str . charAt ( 0 ) == "$" ? 0 : 1 ) << 14 ) | ( ( str . match ( /\$\d/ ) ? 0 : 1 ) << 15 ) ) ; // <== ColRelShort
/* PtgRange */
out . write _shift ( 1 , 0x11 ) ;
out . write _shift ( 4 , 0 ) ;
return out ;
}
/* Writes a range with explicit sheet name [PtgArea3d] */
function write _XLSBFormulaArea3D ( _str , wb ) {
var lastbang = _str . lastIndexOf ( "!" ) ;
var sname = _str . slice ( 0 , lastbang ) ;
_str = _str . slice ( lastbang + 1 ) ;
if ( sname . charAt ( 0 ) == "'" ) sname = sname . slice ( 1 , - 1 ) . replace ( /''/g , "'" ) ;
var range = decode _range ( _str ) ;
var out = new _buf ( 23 ) ;
out . write _shift ( 4 , 15 ) ;
out . write _shift ( 1 , 0x1B | ( ( 1 ) << 5 ) ) ;
out . write _shift ( 2 , 2 + wb . SheetNames . map ( function ( n ) { return n . toLowerCase ( ) ; } ) . indexOf ( sname . toLowerCase ( ) ) ) ;
out . write _shift ( 4 , range . s . r ) ;
out . write _shift ( 4 , range . e . r ) ;
out . write _shift ( 2 , range . s . c ) ;
out . write _shift ( 2 , range . e . c ) ;
out . write _shift ( 4 , 0 ) ;
return out ;
}
2022-05-25 01:45:55 +00:00
/* General Formula */
2022-06-09 04:45:22 +00:00
function write _XLSBFormula ( val /*:string|number*/ , wb ) {
if ( typeof val == "number" ) return write _XLSBFormulaNum ( val ) ;
if ( typeof val == "boolean" ) return write _XLSBFormulaBool ( val ) ;
2022-05-25 01:45:55 +00:00
if ( /^#(DIV\/0!|GETTING_DATA|N\/A|NAME\?|NULL!|NUM!|REF!|VALUE!)$/ . test ( val ) ) return write _XLSBFormulaErr ( + RBErr [ val ] ) ;
if ( val . match ( /^\$?(?:[A-W][A-Z]{2}|X[A-E][A-Z]|XF[A-D]|[A-Z]{1,2})\$?(?:10[0-3]\d{4}|104[0-7]\d{3}|1048[0-4]\d{2}|10485[0-6]\d|104857[0-6]|[1-9]\d{0,5})$/ ) ) return write _XLSBFormulaRef ( val ) ;
2022-05-27 20:26:39 +00:00
if ( val . match ( /^\$?(?:[A-W][A-Z]{2}|X[A-E][A-Z]|XF[A-D]|[A-Z]{1,2})\$?(?:10[0-3]\d{4}|104[0-7]\d{3}|1048[0-4]\d{2}|10485[0-6]\d|104857[0-6]|[1-9]\d{0,5}):\$?(?:[A-W][A-Z]{2}|X[A-E][A-Z]|XF[A-D]|[A-Z]{1,2})\$?(?:10[0-3]\d{4}|104[0-7]\d{3}|1048[0-4]\d{2}|10485[0-6]\d|104857[0-6]|[1-9]\d{0,5})$/ ) ) return write _XLSBFormulaRange ( val ) ;
if ( val . match ( /^#REF!\$?(?:[A-W][A-Z]{2}|X[A-E][A-Z]|XF[A-D]|[A-Z]{1,2})\$?(?:10[0-3]\d{4}|104[0-7]\d{3}|1048[0-4]\d{2}|10485[0-6]\d|104857[0-6]|[1-9]\d{0,5}):\$?(?:[A-W][A-Z]{2}|X[A-E][A-Z]|XF[A-D]|[A-Z]{1,2})\$?(?:10[0-3]\d{4}|104[0-7]\d{3}|1048[0-4]\d{2}|10485[0-6]\d|104857[0-6]|[1-9]\d{0,5})$/ ) ) return write _XLSBFormulaArea3D ( val , wb ) ;
if ( val . match ( /^(?:'[^\\\/?*\[\]:]*'|[^'][^\\\/?*\[\]:'`~!@#$%^()\-=+{}|;,<.>]*)!\$?(?:[A-W][A-Z]{2}|X[A-E][A-Z]|XF[A-D]|[A-Z]{1,2})\$?(?:10[0-3]\d{4}|104[0-7]\d{3}|1048[0-4]\d{2}|10485[0-6]\d|104857[0-6]|[1-9]\d{0,5})$/ ) ) return write _XLSBFormulaRef3D ( val , wb ) ;
if ( val . match ( /^(?:'[^\\\/?*\[\]:]*'|[^'][^\\\/?*\[\]:'`~!@#$%^()\-=+{}|;,<.>]*)!\$?(?:[A-W][A-Z]{2}|X[A-E][A-Z]|XF[A-D]|[A-Z]{1,2})\$?(?:10[0-3]\d{4}|104[0-7]\d{3}|1048[0-4]\d{2}|10485[0-6]\d|104857[0-6]|[1-9]\d{0,5}):\$?(?:[A-W][A-Z]{2}|X[A-E][A-Z]|XF[A-D]|[A-Z]{1,2})\$?(?:10[0-3]\d{4}|104[0-7]\d{3}|1048[0-4]\d{2}|10485[0-6]\d|104857[0-6]|[1-9]\d{0,5})$/ ) ) return write _XLSBFormulaRangeWS ( val , wb ) ;
if ( /^(?:'[^\\\/?*\[\]:]*'|[^'][^\\\/?*\[\]:'`~!@#$%^()\-=+{}|;,<.>]*)!#REF!$/ . test ( val ) ) return write _XLSBFormulaRefErr3D ( val , wb ) ;
if ( /^".*"$/ . test ( val ) ) return write _XLSBFormulaStr ( val ) ;
if ( /^[+-]\d+$/ . test ( val ) ) return write _XLSBFormulaNum ( parseInt ( val , 10 ) ) ;
2022-05-25 01:45:55 +00:00
throw "Formula |" + val + "| not supported for XLSB" ;
}
var write _XLSBNameParsedFormula = write _XLSBFormula ;
2017-02-03 20:50:45 +00:00
var Cetab = {
2022-02-10 12:40:50 +00:00
0 : "BEEP" ,
1 : "OPEN" ,
2 : "OPEN.LINKS" ,
3 : "CLOSE.ALL" ,
4 : "SAVE" ,
5 : "SAVE.AS" ,
6 : "FILE.DELETE" ,
7 : "PAGE.SETUP" ,
8 : "PRINT" ,
9 : "PRINTER.SETUP" ,
10 : "QUIT" ,
11 : "NEW.WINDOW" ,
12 : "ARRANGE.ALL" ,
13 : "WINDOW.SIZE" ,
14 : "WINDOW.MOVE" ,
15 : "FULL" ,
16 : "CLOSE" ,
17 : "RUN" ,
22 : "SET.PRINT.AREA" ,
23 : "SET.PRINT.TITLES" ,
24 : "SET.PAGE.BREAK" ,
25 : "REMOVE.PAGE.BREAK" ,
26 : "FONT" ,
27 : "DISPLAY" ,
28 : "PROTECT.DOCUMENT" ,
29 : "PRECISION" ,
30 : "A1.R1C1" ,
31 : "CALCULATE.NOW" ,
32 : "CALCULATION" ,
34 : "DATA.FIND" ,
35 : "EXTRACT" ,
36 : "DATA.DELETE" ,
37 : "SET.DATABASE" ,
38 : "SET.CRITERIA" ,
39 : "SORT" ,
40 : "DATA.SERIES" ,
41 : "TABLE" ,
42 : "FORMAT.NUMBER" ,
43 : "ALIGNMENT" ,
44 : "STYLE" ,
45 : "BORDER" ,
46 : "CELL.PROTECTION" ,
47 : "COLUMN.WIDTH" ,
48 : "UNDO" ,
49 : "CUT" ,
50 : "COPY" ,
51 : "PASTE" ,
52 : "CLEAR" ,
53 : "PASTE.SPECIAL" ,
54 : "EDIT.DELETE" ,
55 : "INSERT" ,
56 : "FILL.RIGHT" ,
57 : "FILL.DOWN" ,
61 : "DEFINE.NAME" ,
62 : "CREATE.NAMES" ,
63 : "FORMULA.GOTO" ,
64 : "FORMULA.FIND" ,
65 : "SELECT.LAST.CELL" ,
66 : "SHOW.ACTIVE.CELL" ,
67 : "GALLERY.AREA" ,
68 : "GALLERY.BAR" ,
69 : "GALLERY.COLUMN" ,
70 : "GALLERY.LINE" ,
71 : "GALLERY.PIE" ,
72 : "GALLERY.SCATTER" ,
73 : "COMBINATION" ,
74 : "PREFERRED" ,
75 : "ADD.OVERLAY" ,
76 : "GRIDLINES" ,
77 : "SET.PREFERRED" ,
78 : "AXES" ,
79 : "LEGEND" ,
80 : "ATTACH.TEXT" ,
81 : "ADD.ARROW" ,
82 : "SELECT.CHART" ,
83 : "SELECT.PLOT.AREA" ,
84 : "PATTERNS" ,
85 : "MAIN.CHART" ,
86 : "OVERLAY" ,
87 : "SCALE" ,
88 : "FORMAT.LEGEND" ,
89 : "FORMAT.TEXT" ,
90 : "EDIT.REPEAT" ,
91 : "PARSE" ,
92 : "JUSTIFY" ,
93 : "HIDE" ,
94 : "UNHIDE" ,
95 : "WORKSPACE" ,
96 : "FORMULA" ,
97 : "FORMULA.FILL" ,
98 : "FORMULA.ARRAY" ,
99 : "DATA.FIND.NEXT" ,
100 : "DATA.FIND.PREV" ,
101 : "FORMULA.FIND.NEXT" ,
102 : "FORMULA.FIND.PREV" ,
103 : "ACTIVATE" ,
104 : "ACTIVATE.NEXT" ,
105 : "ACTIVATE.PREV" ,
106 : "UNLOCKED.NEXT" ,
107 : "UNLOCKED.PREV" ,
108 : "COPY.PICTURE" ,
109 : "SELECT" ,
110 : "DELETE.NAME" ,
111 : "DELETE.FORMAT" ,
112 : "VLINE" ,
113 : "HLINE" ,
114 : "VPAGE" ,
115 : "HPAGE" ,
116 : "VSCROLL" ,
117 : "HSCROLL" ,
118 : "ALERT" ,
119 : "NEW" ,
120 : "CANCEL.COPY" ,
121 : "SHOW.CLIPBOARD" ,
122 : "MESSAGE" ,
124 : "PASTE.LINK" ,
125 : "APP.ACTIVATE" ,
126 : "DELETE.ARROW" ,
127 : "ROW.HEIGHT" ,
128 : "FORMAT.MOVE" ,
129 : "FORMAT.SIZE" ,
130 : "FORMULA.REPLACE" ,
131 : "SEND.KEYS" ,
132 : "SELECT.SPECIAL" ,
133 : "APPLY.NAMES" ,
134 : "REPLACE.FONT" ,
135 : "FREEZE.PANES" ,
136 : "SHOW.INFO" ,
137 : "SPLIT" ,
138 : "ON.WINDOW" ,
139 : "ON.DATA" ,
140 : "DISABLE.INPUT" ,
142 : "OUTLINE" ,
143 : "LIST.NAMES" ,
144 : "FILE.CLOSE" ,
145 : "SAVE.WORKBOOK" ,
146 : "DATA.FORM" ,
147 : "COPY.CHART" ,
148 : "ON.TIME" ,
149 : "WAIT" ,
150 : "FORMAT.FONT" ,
151 : "FILL.UP" ,
152 : "FILL.LEFT" ,
153 : "DELETE.OVERLAY" ,
155 : "SHORT.MENUS" ,
159 : "SET.UPDATE.STATUS" ,
161 : "COLOR.PALETTE" ,
162 : "DELETE.STYLE" ,
163 : "WINDOW.RESTORE" ,
164 : "WINDOW.MAXIMIZE" ,
166 : "CHANGE.LINK" ,
167 : "CALCULATE.DOCUMENT" ,
168 : "ON.KEY" ,
169 : "APP.RESTORE" ,
170 : "APP.MOVE" ,
171 : "APP.SIZE" ,
172 : "APP.MINIMIZE" ,
173 : "APP.MAXIMIZE" ,
174 : "BRING.TO.FRONT" ,
175 : "SEND.TO.BACK" ,
185 : "MAIN.CHART.TYPE" ,
186 : "OVERLAY.CHART.TYPE" ,
187 : "SELECT.END" ,
188 : "OPEN.MAIL" ,
189 : "SEND.MAIL" ,
190 : "STANDARD.FONT" ,
191 : "CONSOLIDATE" ,
192 : "SORT.SPECIAL" ,
193 : "GALLERY.3D.AREA" ,
194 : "GALLERY.3D.COLUMN" ,
195 : "GALLERY.3D.LINE" ,
196 : "GALLERY.3D.PIE" ,
197 : "VIEW.3D" ,
198 : "GOAL.SEEK" ,
199 : "WORKGROUP" ,
200 : "FILL.GROUP" ,
201 : "UPDATE.LINK" ,
202 : "PROMOTE" ,
203 : "DEMOTE" ,
204 : "SHOW.DETAIL" ,
206 : "UNGROUP" ,
207 : "OBJECT.PROPERTIES" ,
208 : "SAVE.NEW.OBJECT" ,
209 : "SHARE" ,
210 : "SHARE.NAME" ,
211 : "DUPLICATE" ,
212 : "APPLY.STYLE" ,
213 : "ASSIGN.TO.OBJECT" ,
214 : "OBJECT.PROTECTION" ,
215 : "HIDE.OBJECT" ,
216 : "SET.EXTRACT" ,
217 : "CREATE.PUBLISHER" ,
218 : "SUBSCRIBE.TO" ,
219 : "ATTRIBUTES" ,
220 : "SHOW.TOOLBAR" ,
222 : "PRINT.PREVIEW" ,
223 : "EDIT.COLOR" ,
224 : "SHOW.LEVELS" ,
225 : "FORMAT.MAIN" ,
226 : "FORMAT.OVERLAY" ,
227 : "ON.RECALC" ,
228 : "EDIT.SERIES" ,
229 : "DEFINE.STYLE" ,
240 : "LINE.PRINT" ,
243 : "ENTER.DATA" ,
249 : "GALLERY.RADAR" ,
250 : "MERGE.STYLES" ,
251 : "EDITION.OPTIONS" ,
252 : "PASTE.PICTURE" ,
253 : "PASTE.PICTURE.LINK" ,
254 : "SPELLING" ,
256 : "ZOOM" ,
259 : "INSERT.OBJECT" ,
260 : "WINDOW.MINIMIZE" ,
265 : "SOUND.NOTE" ,
266 : "SOUND.PLAY" ,
267 : "FORMAT.SHAPE" ,
268 : "EXTEND.POLYGON" ,
269 : "FORMAT.AUTO" ,
272 : "GALLERY.3D.BAR" ,
273 : "GALLERY.3D.SURFACE" ,
274 : "FILL.AUTO" ,
276 : "CUSTOMIZE.TOOLBAR" ,
277 : "ADD.TOOL" ,
278 : "EDIT.OBJECT" ,
279 : "ON.DOUBLECLICK" ,
280 : "ON.ENTRY" ,
281 : "WORKBOOK.ADD" ,
282 : "WORKBOOK.MOVE" ,
283 : "WORKBOOK.COPY" ,
284 : "WORKBOOK.OPTIONS" ,
285 : "SAVE.WORKSPACE" ,
288 : "CHART.WIZARD" ,
289 : "DELETE.TOOL" ,
290 : "MOVE.TOOL" ,
291 : "WORKBOOK.SELECT" ,
292 : "WORKBOOK.ACTIVATE" ,
293 : "ASSIGN.TO.TOOL" ,
295 : "COPY.TOOL" ,
296 : "RESET.TOOL" ,
297 : "CONSTRAIN.NUMERIC" ,
298 : "PASTE.TOOL" ,
302 : "WORKBOOK.NEW" ,
305 : "SCENARIO.CELLS" ,
306 : "SCENARIO.DELETE" ,
307 : "SCENARIO.ADD" ,
308 : "SCENARIO.EDIT" ,
309 : "SCENARIO.SHOW" ,
310 : "SCENARIO.SHOW.NEXT" ,
311 : "SCENARIO.SUMMARY" ,
312 : "PIVOT.TABLE.WIZARD" ,
313 : "PIVOT.FIELD.PROPERTIES" ,
314 : "PIVOT.FIELD" ,
315 : "PIVOT.ITEM" ,
316 : "PIVOT.ADD.FIELDS" ,
318 : "OPTIONS.CALCULATION" ,
319 : "OPTIONS.EDIT" ,
320 : "OPTIONS.VIEW" ,
321 : "ADDIN.MANAGER" ,
322 : "MENU.EDITOR" ,
323 : "ATTACH.TOOLBARS" ,
324 : "VBAActivate" ,
325 : "OPTIONS.CHART" ,
328 : "VBA.INSERT.FILE" ,
330 : "VBA.PROCEDURE.DEFINITION" ,
336 : "ROUTING.SLIP" ,
338 : "ROUTE.DOCUMENT" ,
339 : "MAIL.LOGON" ,
342 : "INSERT.PICTURE" ,
343 : "EDIT.TOOL" ,
344 : "GALLERY.DOUGHNUT" ,
350 : "CHART.TREND" ,
352 : "PIVOT.ITEM.PROPERTIES" ,
354 : "WORKBOOK.INSERT" ,
355 : "OPTIONS.TRANSITION" ,
356 : "OPTIONS.GENERAL" ,
370 : "FILTER.ADVANCED" ,
373 : "MAIL.ADD.MAILER" ,
374 : "MAIL.DELETE.MAILER" ,
375 : "MAIL.REPLY" ,
376 : "MAIL.REPLY.ALL" ,
377 : "MAIL.FORWARD" ,
378 : "MAIL.NEXT.LETTER" ,
379 : "DATA.LABEL" ,
380 : "INSERT.TITLE" ,
381 : "FONT.PROPERTIES" ,
382 : "MACRO.OPTIONS" ,
383 : "WORKBOOK.HIDE" ,
384 : "WORKBOOK.UNHIDE" ,
385 : "WORKBOOK.DELETE" ,
386 : "WORKBOOK.NAME" ,
388 : "GALLERY.CUSTOM" ,
390 : "ADD.CHART.AUTOFORMAT" ,
391 : "DELETE.CHART.AUTOFORMAT" ,
392 : "CHART.ADD.DATA" ,
393 : "AUTO.OUTLINE" ,
394 : "TAB.ORDER" ,
395 : "SHOW.DIALOG" ,
396 : "SELECT.ALL" ,
397 : "UNGROUP.SHEETS" ,
398 : "SUBTOTAL.CREATE" ,
399 : "SUBTOTAL.REMOVE" ,
400 : "RENAME.OBJECT" ,
412 : "WORKBOOK.SCROLL" ,
413 : "WORKBOOK.NEXT" ,
414 : "WORKBOOK.PREV" ,
415 : "WORKBOOK.TAB.SPLIT" ,
416 : "FULL.SCREEN" ,
417 : "WORKBOOK.PROTECT" ,
420 : "SCROLLBAR.PROPERTIES" ,
421 : "PIVOT.SHOW.PAGES" ,
422 : "TEXT.TO.COLUMNS" ,
423 : "FORMAT.CHARTTYPE" ,
424 : "LINK.FORMAT" ,
425 : "TRACER.DISPLAY" ,
430 : "TRACER.NAVIGATE" ,
431 : "TRACER.CLEAR" ,
432 : "TRACER.ERROR" ,
433 : "PIVOT.FIELD.GROUP" ,
434 : "PIVOT.FIELD.UNGROUP" ,
435 : "CHECKBOX.PROPERTIES" ,
436 : "LABEL.PROPERTIES" ,
437 : "LISTBOX.PROPERTIES" ,
438 : "EDITBOX.PROPERTIES" ,
439 : "PIVOT.REFRESH" ,
440 : "LINK.COMBO" ,
441 : "OPEN.TEXT" ,
442 : "HIDE.DIALOG" ,
443 : "SET.DIALOG.FOCUS" ,
444 : "ENABLE.OBJECT" ,
445 : "PUSHBUTTON.PROPERTIES" ,
446 : "SET.DIALOG.DEFAULT" ,
447 : "FILTER" ,
448 : "FILTER.SHOW.ALL" ,
449 : "CLEAR.OUTLINE" ,
450 : "FUNCTION.WIZARD" ,
451 : "ADD.LIST.ITEM" ,
452 : "SET.LIST.ITEM" ,
453 : "REMOVE.LIST.ITEM" ,
454 : "SELECT.LIST.ITEM" ,
455 : "SET.CONTROL.VALUE" ,
456 : "SAVE.COPY.AS" ,
458 : "OPTIONS.LISTS.ADD" ,
459 : "OPTIONS.LISTS.DELETE" ,
460 : "SERIES.AXES" ,
461 : "SERIES.X" ,
462 : "SERIES.Y" ,
463 : "ERRORBAR.X" ,
464 : "ERRORBAR.Y" ,
465 : "FORMAT.CHART" ,
466 : "SERIES.ORDER" ,
467 : "MAIL.LOGOFF" ,
468 : "CLEAR.ROUTING.SLIP" ,
469 : "APP.ACTIVATE.MICROSOFT" ,
470 : "MAIL.EDIT.MAILER" ,
471 : "ON.SHEET" ,
472 : "STANDARD.WIDTH" ,
473 : "SCENARIO.MERGE" ,
474 : "SUMMARY.INFO" ,
475 : "FIND.FILE" ,
476 : "ACTIVE.CELL.FONT" ,
477 : "ENABLE.TIPWIZARD" ,
478 : "VBA.MAKE.ADDIN" ,
480 : "INSERTDATATABLE" ,
481 : "WORKGROUP.OPTIONS" ,
482 : "MAIL.SEND.MAILER" ,
485 : "AUTOCORRECT" ,
489 : "POST.DOCUMENT" ,
491 : "PICKLIST" ,
493 : "VIEW.SHOW" ,
494 : "VIEW.DEFINE" ,
495 : "VIEW.DELETE" ,
509 : "SHEET.BACKGROUND" ,
510 : "INSERT.MAP.OBJECT" ,
511 : "OPTIONS.MENONO" ,
517 : "MSOCHECKS" ,
518 : "NORMAL" ,
519 : "LAYOUT" ,
520 : "RM.PRINT.AREA" ,
521 : "CLEAR.PRINT.AREA" ,
522 : "ADD.PRINT.AREA" ,
523 : "MOVE.BRK" ,
545 : "HIDECURR.NOTE" ,
546 : "HIDEALL.NOTES" ,
547 : "DELETE.NOTE" ,
548 : "TRAVERSE.NOTES" ,
549 : "ACTIVATE.NOTES" ,
620 : "PROTECT.REVISIONS" ,
621 : "UNPROTECT.REVISIONS" ,
647 : "OPTIONS.ME" ,
653 : "WEB.PUBLISH" ,
667 : "NEWWEBQUERY" ,
673 : "PIVOT.TABLE.CHART" ,
753 : "OPTIONS.SAVE" ,
755 : "OPTIONS.SPELL" ,
808 : "HIDEALL.INKANNOTS"
2017-02-03 20:50:45 +00:00
} ;
var Ftab = {
2022-02-10 12:40:50 +00:00
0 : "COUNT" ,
1 : "IF" ,
2 : "ISNA" ,
3 : "ISERROR" ,
4 : "SUM" ,
5 : "AVERAGE" ,
6 : "MIN" ,
7 : "MAX" ,
8 : "ROW" ,
9 : "COLUMN" ,
10 : "NA" ,
11 : "NPV" ,
12 : "STDEV" ,
13 : "DOLLAR" ,
14 : "FIXED" ,
15 : "SIN" ,
16 : "COS" ,
17 : "TAN" ,
18 : "ATAN" ,
19 : "PI" ,
20 : "SQRT" ,
21 : "EXP" ,
22 : "LN" ,
23 : "LOG10" ,
24 : "ABS" ,
25 : "INT" ,
26 : "SIGN" ,
27 : "ROUND" ,
28 : "LOOKUP" ,
29 : "INDEX" ,
30 : "REPT" ,
31 : "MID" ,
32 : "LEN" ,
33 : "VALUE" ,
34 : "TRUE" ,
35 : "FALSE" ,
36 : "AND" ,
37 : "OR" ,
38 : "NOT" ,
39 : "MOD" ,
40 : "DCOUNT" ,
41 : "DSUM" ,
42 : "DAVERAGE" ,
43 : "DMIN" ,
44 : "DMAX" ,
45 : "DSTDEV" ,
46 : "VAR" ,
47 : "DVAR" ,
48 : "TEXT" ,
49 : "LINEST" ,
50 : "TREND" ,
51 : "LOGEST" ,
52 : "GROWTH" ,
53 : "GOTO" ,
54 : "HALT" ,
55 : "RETURN" ,
56 : "PV" ,
57 : "FV" ,
58 : "NPER" ,
59 : "PMT" ,
60 : "RATE" ,
61 : "MIRR" ,
62 : "IRR" ,
63 : "RAND" ,
64 : "MATCH" ,
65 : "DATE" ,
66 : "TIME" ,
67 : "DAY" ,
68 : "MONTH" ,
69 : "YEAR" ,
70 : "WEEKDAY" ,
71 : "HOUR" ,
72 : "MINUTE" ,
73 : "SECOND" ,
74 : "NOW" ,
75 : "AREAS" ,
76 : "ROWS" ,
77 : "COLUMNS" ,
78 : "OFFSET" ,
79 : "ABSREF" ,
80 : "RELREF" ,
81 : "ARGUMENT" ,
82 : "SEARCH" ,
83 : "TRANSPOSE" ,
84 : "ERROR" ,
85 : "STEP" ,
86 : "TYPE" ,
87 : "ECHO" ,
88 : "SET.NAME" ,
89 : "CALLER" ,
90 : "DEREF" ,
91 : "WINDOWS" ,
92 : "SERIES" ,
93 : "DOCUMENTS" ,
94 : "ACTIVE.CELL" ,
95 : "SELECTION" ,
96 : "RESULT" ,
97 : "ATAN2" ,
98 : "ASIN" ,
99 : "ACOS" ,
100 : "CHOOSE" ,
101 : "HLOOKUP" ,
102 : "VLOOKUP" ,
103 : "LINKS" ,
104 : "INPUT" ,
105 : "ISREF" ,
106 : "GET.FORMULA" ,
107 : "GET.NAME" ,
108 : "SET.VALUE" ,
109 : "LOG" ,
110 : "EXEC" ,
111 : "CHAR" ,
112 : "LOWER" ,
113 : "UPPER" ,
114 : "PROPER" ,
115 : "LEFT" ,
116 : "RIGHT" ,
117 : "EXACT" ,
118 : "TRIM" ,
119 : "REPLACE" ,
120 : "SUBSTITUTE" ,
121 : "CODE" ,
122 : "NAMES" ,
123 : "DIRECTORY" ,
124 : "FIND" ,
125 : "CELL" ,
126 : "ISERR" ,
127 : "ISTEXT" ,
128 : "ISNUMBER" ,
129 : "ISBLANK" ,
130 : "T" ,
131 : "N" ,
132 : "FOPEN" ,
133 : "FCLOSE" ,
134 : "FSIZE" ,
135 : "FREADLN" ,
136 : "FREAD" ,
137 : "FWRITELN" ,
138 : "FWRITE" ,
139 : "FPOS" ,
140 : "DATEVALUE" ,
141 : "TIMEVALUE" ,
142 : "SLN" ,
143 : "SYD" ,
144 : "DDB" ,
145 : "GET.DEF" ,
146 : "REFTEXT" ,
147 : "TEXTREF" ,
148 : "INDIRECT" ,
149 : "REGISTER" ,
150 : "CALL" ,
151 : "ADD.BAR" ,
152 : "ADD.MENU" ,
153 : "ADD.COMMAND" ,
154 : "ENABLE.COMMAND" ,
155 : "CHECK.COMMAND" ,
156 : "RENAME.COMMAND" ,
157 : "SHOW.BAR" ,
158 : "DELETE.MENU" ,
159 : "DELETE.COMMAND" ,
160 : "GET.CHART.ITEM" ,
161 : "DIALOG.BOX" ,
162 : "CLEAN" ,
163 : "MDETERM" ,
164 : "MINVERSE" ,
165 : "MMULT" ,
166 : "FILES" ,
167 : "IPMT" ,
168 : "PPMT" ,
169 : "COUNTA" ,
170 : "CANCEL.KEY" ,
171 : "FOR" ,
172 : "WHILE" ,
173 : "BREAK" ,
174 : "NEXT" ,
175 : "INITIATE" ,
176 : "REQUEST" ,
177 : "POKE" ,
178 : "EXECUTE" ,
179 : "TERMINATE" ,
180 : "RESTART" ,
181 : "HELP" ,
182 : "GET.BAR" ,
183 : "PRODUCT" ,
184 : "FACT" ,
185 : "GET.CELL" ,
186 : "GET.WORKSPACE" ,
187 : "GET.WINDOW" ,
188 : "GET.DOCUMENT" ,
189 : "DPRODUCT" ,
190 : "ISNONTEXT" ,
191 : "GET.NOTE" ,
192 : "NOTE" ,
193 : "STDEVP" ,
194 : "VARP" ,
195 : "DSTDEVP" ,
196 : "DVARP" ,
197 : "TRUNC" ,
198 : "ISLOGICAL" ,
199 : "DCOUNTA" ,
200 : "DELETE.BAR" ,
201 : "UNREGISTER" ,
204 : "USDOLLAR" ,
205 : "FINDB" ,
206 : "SEARCHB" ,
207 : "REPLACEB" ,
208 : "LEFTB" ,
209 : "RIGHTB" ,
210 : "MIDB" ,
211 : "LENB" ,
212 : "ROUNDUP" ,
213 : "ROUNDDOWN" ,
214 : "ASC" ,
215 : "DBCS" ,
216 : "RANK" ,
219 : "ADDRESS" ,
220 : "DAYS360" ,
221 : "TODAY" ,
222 : "VDB" ,
223 : "ELSE" ,
224 : "ELSE.IF" ,
225 : "END.IF" ,
226 : "FOR.CELL" ,
227 : "MEDIAN" ,
228 : "SUMPRODUCT" ,
229 : "SINH" ,
230 : "COSH" ,
231 : "TANH" ,
232 : "ASINH" ,
233 : "ACOSH" ,
234 : "ATANH" ,
235 : "DGET" ,
236 : "CREATE.OBJECT" ,
237 : "VOLATILE" ,
238 : "LAST.ERROR" ,
239 : "CUSTOM.UNDO" ,
240 : "CUSTOM.REPEAT" ,
241 : "FORMULA.CONVERT" ,
242 : "GET.LINK.INFO" ,
243 : "TEXT.BOX" ,
244 : "INFO" ,
245 : "GROUP" ,
246 : "GET.OBJECT" ,
247 : "DB" ,
248 : "PAUSE" ,
251 : "RESUME" ,
252 : "FREQUENCY" ,
253 : "ADD.TOOLBAR" ,
254 : "DELETE.TOOLBAR" ,
255 : "User" ,
256 : "RESET.TOOLBAR" ,
257 : "EVALUATE" ,
258 : "GET.TOOLBAR" ,
259 : "GET.TOOL" ,
260 : "SPELLING.CHECK" ,
261 : "ERROR.TYPE" ,
262 : "APP.TITLE" ,
263 : "WINDOW.TITLE" ,
264 : "SAVE.TOOLBAR" ,
265 : "ENABLE.TOOL" ,
266 : "PRESS.TOOL" ,
267 : "REGISTER.ID" ,
268 : "GET.WORKBOOK" ,
269 : "AVEDEV" ,
270 : "BETADIST" ,
271 : "GAMMALN" ,
272 : "BETAINV" ,
273 : "BINOMDIST" ,
274 : "CHIDIST" ,
275 : "CHIINV" ,
276 : "COMBIN" ,
277 : "CONFIDENCE" ,
278 : "CRITBINOM" ,
279 : "EVEN" ,
280 : "EXPONDIST" ,
281 : "FDIST" ,
282 : "FINV" ,
283 : "FISHER" ,
284 : "FISHERINV" ,
285 : "FLOOR" ,
286 : "GAMMADIST" ,
287 : "GAMMAINV" ,
288 : "CEILING" ,
289 : "HYPGEOMDIST" ,
290 : "LOGNORMDIST" ,
291 : "LOGINV" ,
292 : "NEGBINOMDIST" ,
293 : "NORMDIST" ,
294 : "NORMSDIST" ,
295 : "NORMINV" ,
296 : "NORMSINV" ,
297 : "STANDARDIZE" ,
298 : "ODD" ,
299 : "PERMUT" ,
300 : "POISSON" ,
301 : "TDIST" ,
302 : "WEIBULL" ,
303 : "SUMXMY2" ,
304 : "SUMX2MY2" ,
305 : "SUMX2PY2" ,
306 : "CHITEST" ,
307 : "CORREL" ,
308 : "COVAR" ,
309 : "FORECAST" ,
310 : "FTEST" ,
311 : "INTERCEPT" ,
312 : "PEARSON" ,
313 : "RSQ" ,
314 : "STEYX" ,
315 : "SLOPE" ,
316 : "TTEST" ,
317 : "PROB" ,
318 : "DEVSQ" ,
319 : "GEOMEAN" ,
320 : "HARMEAN" ,
321 : "SUMSQ" ,
322 : "KURT" ,
323 : "SKEW" ,
324 : "ZTEST" ,
325 : "LARGE" ,
326 : "SMALL" ,
327 : "QUARTILE" ,
328 : "PERCENTILE" ,
329 : "PERCENTRANK" ,
330 : "MODE" ,
331 : "TRIMMEAN" ,
332 : "TINV" ,
334 : "MOVIE.COMMAND" ,
335 : "GET.MOVIE" ,
336 : "CONCATENATE" ,
337 : "POWER" ,
338 : "PIVOT.ADD.DATA" ,
339 : "GET.PIVOT.TABLE" ,
340 : "GET.PIVOT.FIELD" ,
341 : "GET.PIVOT.ITEM" ,
342 : "RADIANS" ,
343 : "DEGREES" ,
344 : "SUBTOTAL" ,
345 : "SUMIF" ,
346 : "COUNTIF" ,
347 : "COUNTBLANK" ,
348 : "SCENARIO.GET" ,
349 : "OPTIONS.LISTS.GET" ,
350 : "ISPMT" ,
351 : "DATEDIF" ,
352 : "DATESTRING" ,
353 : "NUMBERSTRING" ,
354 : "ROMAN" ,
355 : "OPEN.DIALOG" ,
356 : "SAVE.DIALOG" ,
357 : "VIEW.GET" ,
358 : "GETPIVOTDATA" ,
359 : "HYPERLINK" ,
360 : "PHONETIC" ,
361 : "AVERAGEA" ,
362 : "MAXA" ,
363 : "MINA" ,
364 : "STDEVPA" ,
365 : "VARPA" ,
366 : "STDEVA" ,
367 : "VARA" ,
368 : "BAHTTEXT" ,
369 : "THAIDAYOFWEEK" ,
370 : "THAIDIGIT" ,
371 : "THAIMONTHOFYEAR" ,
372 : "THAINUMSOUND" ,
373 : "THAINUMSTRING" ,
374 : "THAISTRINGLENGTH" ,
375 : "ISTHAIDIGIT" ,
376 : "ROUNDBAHTDOWN" ,
377 : "ROUNDBAHTUP" ,
378 : "THAIYEAR" ,
379 : "RTD" ,
380 : "CUBEVALUE" ,
381 : "CUBEMEMBER" ,
382 : "CUBEMEMBERPROPERTY" ,
383 : "CUBERANKEDMEMBER" ,
384 : "HEX2BIN" ,
385 : "HEX2DEC" ,
386 : "HEX2OCT" ,
387 : "DEC2BIN" ,
388 : "DEC2HEX" ,
389 : "DEC2OCT" ,
390 : "OCT2BIN" ,
391 : "OCT2HEX" ,
392 : "OCT2DEC" ,
393 : "BIN2DEC" ,
394 : "BIN2OCT" ,
395 : "BIN2HEX" ,
396 : "IMSUB" ,
397 : "IMDIV" ,
398 : "IMPOWER" ,
399 : "IMABS" ,
400 : "IMSQRT" ,
401 : "IMLN" ,
402 : "IMLOG2" ,
403 : "IMLOG10" ,
404 : "IMSIN" ,
405 : "IMCOS" ,
406 : "IMEXP" ,
407 : "IMARGUMENT" ,
408 : "IMCONJUGATE" ,
409 : "IMAGINARY" ,
410 : "IMREAL" ,
411 : "COMPLEX" ,
412 : "IMSUM" ,
413 : "IMPRODUCT" ,
414 : "SERIESSUM" ,
415 : "FACTDOUBLE" ,
416 : "SQRTPI" ,
417 : "QUOTIENT" ,
418 : "DELTA" ,
419 : "GESTEP" ,
420 : "ISEVEN" ,
421 : "ISODD" ,
422 : "MROUND" ,
423 : "ERF" ,
424 : "ERFC" ,
425 : "BESSELJ" ,
426 : "BESSELK" ,
427 : "BESSELY" ,
428 : "BESSELI" ,
429 : "XIRR" ,
430 : "XNPV" ,
431 : "PRICEMAT" ,
432 : "YIELDMAT" ,
433 : "INTRATE" ,
434 : "RECEIVED" ,
435 : "DISC" ,
436 : "PRICEDISC" ,
437 : "YIELDDISC" ,
438 : "TBILLEQ" ,
439 : "TBILLPRICE" ,
440 : "TBILLYIELD" ,
441 : "PRICE" ,
442 : "YIELD" ,
443 : "DOLLARDE" ,
444 : "DOLLARFR" ,
445 : "NOMINAL" ,
446 : "EFFECT" ,
447 : "CUMPRINC" ,
448 : "CUMIPMT" ,
449 : "EDATE" ,
450 : "EOMONTH" ,
451 : "YEARFRAC" ,
452 : "COUPDAYBS" ,
453 : "COUPDAYS" ,
454 : "COUPDAYSNC" ,
455 : "COUPNCD" ,
456 : "COUPNUM" ,
457 : "COUPPCD" ,
458 : "DURATION" ,
459 : "MDURATION" ,
460 : "ODDLPRICE" ,
461 : "ODDLYIELD" ,
462 : "ODDFPRICE" ,
463 : "ODDFYIELD" ,
464 : "RANDBETWEEN" ,
465 : "WEEKNUM" ,
466 : "AMORDEGRC" ,
467 : "AMORLINC" ,
468 : "CONVERT" ,
724 : "SHEETJS" ,
469 : "ACCRINT" ,
470 : "ACCRINTM" ,
471 : "WORKDAY" ,
472 : "NETWORKDAYS" ,
473 : "GCD" ,
474 : "MULTINOMIAL" ,
475 : "LCM" ,
476 : "FVSCHEDULE" ,
477 : "CUBEKPIMEMBER" ,
478 : "CUBESET" ,
479 : "CUBESETCOUNT" ,
480 : "IFERROR" ,
481 : "COUNTIFS" ,
482 : "SUMIFS" ,
483 : "AVERAGEIF" ,
484 : "AVERAGEIFS"
2017-02-03 20:50:45 +00:00
} ;
var FtabArgc = {
2022-02-10 12:40:50 +00:00
2 : 1 ,
3 : 1 ,
10 : 0 ,
15 : 1 ,
16 : 1 ,
17 : 1 ,
18 : 1 ,
19 : 0 ,
20 : 1 ,
21 : 1 ,
22 : 1 ,
23 : 1 ,
24 : 1 ,
25 : 1 ,
26 : 1 ,
27 : 2 ,
30 : 2 ,
31 : 3 ,
32 : 1 ,
33 : 1 ,
34 : 0 ,
35 : 0 ,
38 : 1 ,
39 : 2 ,
40 : 3 ,
41 : 3 ,
42 : 3 ,
43 : 3 ,
44 : 3 ,
45 : 3 ,
47 : 3 ,
48 : 2 ,
53 : 1 ,
61 : 3 ,
63 : 0 ,
65 : 3 ,
66 : 3 ,
67 : 1 ,
68 : 1 ,
69 : 1 ,
70 : 1 ,
71 : 1 ,
72 : 1 ,
73 : 1 ,
74 : 0 ,
75 : 1 ,
76 : 1 ,
77 : 1 ,
79 : 2 ,
80 : 2 ,
83 : 1 ,
85 : 0 ,
86 : 1 ,
89 : 0 ,
90 : 1 ,
94 : 0 ,
95 : 0 ,
97 : 2 ,
98 : 1 ,
99 : 1 ,
101 : 3 ,
102 : 3 ,
105 : 1 ,
106 : 1 ,
108 : 2 ,
111 : 1 ,
112 : 1 ,
113 : 1 ,
114 : 1 ,
117 : 2 ,
118 : 1 ,
119 : 4 ,
121 : 1 ,
126 : 1 ,
127 : 1 ,
128 : 1 ,
129 : 1 ,
130 : 1 ,
131 : 1 ,
133 : 1 ,
134 : 1 ,
135 : 1 ,
136 : 2 ,
137 : 2 ,
138 : 2 ,
140 : 1 ,
141 : 1 ,
142 : 3 ,
143 : 4 ,
144 : 4 ,
161 : 1 ,
162 : 1 ,
163 : 1 ,
164 : 1 ,
165 : 2 ,
172 : 1 ,
175 : 2 ,
176 : 2 ,
177 : 3 ,
178 : 2 ,
179 : 1 ,
184 : 1 ,
186 : 1 ,
189 : 3 ,
190 : 1 ,
195 : 3 ,
196 : 3 ,
197 : 1 ,
198 : 1 ,
199 : 3 ,
201 : 1 ,
207 : 4 ,
210 : 3 ,
211 : 1 ,
212 : 2 ,
213 : 2 ,
214 : 1 ,
215 : 1 ,
225 : 0 ,
229 : 1 ,
230 : 1 ,
231 : 1 ,
232 : 1 ,
233 : 1 ,
234 : 1 ,
235 : 3 ,
244 : 1 ,
247 : 4 ,
252 : 2 ,
257 : 1 ,
261 : 1 ,
271 : 1 ,
273 : 4 ,
274 : 2 ,
275 : 2 ,
276 : 2 ,
277 : 3 ,
278 : 3 ,
279 : 1 ,
280 : 3 ,
281 : 3 ,
282 : 3 ,
283 : 1 ,
284 : 1 ,
285 : 2 ,
286 : 4 ,
287 : 3 ,
288 : 2 ,
289 : 4 ,
290 : 3 ,
291 : 3 ,
292 : 3 ,
293 : 4 ,
294 : 1 ,
295 : 3 ,
296 : 1 ,
297 : 3 ,
298 : 1 ,
299 : 2 ,
300 : 3 ,
301 : 3 ,
302 : 4 ,
303 : 2 ,
304 : 2 ,
305 : 2 ,
306 : 2 ,
307 : 2 ,
308 : 2 ,
309 : 3 ,
310 : 2 ,
311 : 2 ,
312 : 2 ,
313 : 2 ,
314 : 2 ,
315 : 2 ,
316 : 4 ,
325 : 2 ,
326 : 2 ,
327 : 2 ,
328 : 2 ,
331 : 2 ,
332 : 2 ,
337 : 2 ,
342 : 1 ,
343 : 1 ,
346 : 2 ,
347 : 1 ,
350 : 4 ,
351 : 3 ,
352 : 1 ,
353 : 2 ,
360 : 1 ,
368 : 1 ,
369 : 1 ,
370 : 1 ,
371 : 1 ,
372 : 1 ,
373 : 1 ,
374 : 1 ,
375 : 1 ,
376 : 1 ,
377 : 1 ,
378 : 1 ,
382 : 3 ,
385 : 1 ,
392 : 1 ,
393 : 1 ,
396 : 2 ,
397 : 2 ,
398 : 2 ,
399 : 1 ,
400 : 1 ,
401 : 1 ,
402 : 1 ,
403 : 1 ,
404 : 1 ,
405 : 1 ,
406 : 1 ,
407 : 1 ,
408 : 1 ,
409 : 1 ,
410 : 1 ,
414 : 4 ,
415 : 1 ,
416 : 1 ,
417 : 2 ,
420 : 1 ,
421 : 1 ,
422 : 2 ,
424 : 1 ,
425 : 2 ,
426 : 2 ,
427 : 2 ,
428 : 2 ,
430 : 3 ,
438 : 3 ,
439 : 3 ,
440 : 3 ,
443 : 2 ,
444 : 2 ,
445 : 2 ,
446 : 2 ,
447 : 6 ,
448 : 6 ,
449 : 2 ,
450 : 2 ,
464 : 2 ,
468 : 3 ,
476 : 2 ,
479 : 1 ,
480 : 2 ,
65535 : 0
2017-02-03 20:50:45 +00:00
} ;
2017-03-10 01:09:18 +00:00
/* Part 3 TODO: actually parse formulae */
function ods _to _csf _formula ( f /*:string*/ ) /*:string*/ {
2018-01-11 08:01:25 +00:00
if ( f . slice ( 0 , 3 ) == "of:" ) f = f . slice ( 3 ) ;
2017-03-10 01:09:18 +00:00
/* 5.2 Basic Expressions */
if ( f . charCodeAt ( 0 ) == 61 ) {
2018-01-11 08:01:25 +00:00
f = f . slice ( 1 ) ;
if ( f . charCodeAt ( 0 ) == 61 ) f = f . slice ( 1 ) ;
2017-03-10 01:09:18 +00:00
}
2017-03-18 00:45:06 +00:00
f = f . replace ( /COM\.MICROSOFT\./g , "" ) ;
2017-03-10 01:09:18 +00:00
/* Part 3 Section 5.8 References */
2017-03-18 00:45:06 +00:00
f = f . replace ( /\[((?:\.[A-Z]+[0-9]+)(?::\.[A-Z]+[0-9]+)?)\]/g , function ( $$ , $1 ) { return $1 . replace ( /\./g , "" ) ; } ) ;
2022-05-27 20:26:39 +00:00
f = f . replace ( /\$'([^']|'')+'/g , function ( $$ ) { return $$ . slice ( 1 ) ; } ) ;
f = f . replace ( /\$([^\]\. #$]+)/g , function ( $$ , $1 ) { return ( $1 ) . match ( /^([A-Z]{1,2}|[A-W][A-Z]{2}|X[A-E][A-Z]|XF[A-D])?(10[0-3]\d{4}|104[0-7]\d{3}|1048[0-4]\d{2}|10485[0-6]\d|104857[0-6]|[1-9]\d{0,5})?$/ ) ? $$ : $1 ; } ) ;
2017-03-18 00:45:06 +00:00
/* TODO: something other than this */
f = f . replace ( /\[.(#[A-Z]*[?!])\]/g , "$1" ) ;
return f . replace ( /[;~]/g , "," ) . replace ( /\|/g , ";" ) ;
}
function csf _to _ods _formula ( f /*:string*/ ) /*:string*/ {
var o = "of:=" + f . replace ( crefregex , "$1[.$2$3$4$5]" ) . replace ( /\]:\[/g , ":" ) ;
/* TODO: something other than this */
return o . replace ( /;/g , "|" ) . replace ( /,/g , ";" ) ;
2017-03-10 01:09:18 +00:00
}
2017-04-10 05:10:54 +00:00
2017-12-15 01:18:40 +00:00
function ods _to _csf _3D ( r /*:string*/ ) /*:[string, string]*/ {
2022-05-27 20:26:39 +00:00
r = r . replace ( /\$'([^']|'')+'/g , function ( $$ ) { return $$ . slice ( 1 ) ; } ) ;
r = r . replace ( /\$([^\]\. #$]+)/g , function ( $$ , $1 ) { return ( $1 ) . match ( /^([A-Z]{1,2}|[A-W][A-Z]{2}|X[A-E][A-Z]|XF[A-D])?(10[0-3]\d{4}|104[0-7]\d{3}|1048[0-4]\d{2}|10485[0-6]\d|104857[0-6]|[1-9]\d{0,5})?$/ ) ? $$ : $1 ; } ) ;
2017-04-10 05:10:54 +00:00
var a = r . split ( ":" ) ;
var s = a [ 0 ] . split ( "." ) [ 0 ] ;
2017-12-15 01:18:40 +00:00
return [ s , a [ 0 ] . split ( "." ) [ 1 ] + ( a . length > 1 ? ( ":" + ( a [ 1 ] . split ( "." ) [ 1 ] || a [ 1 ] . split ( "." ) [ 0 ] ) ) : "" ) ] ;
2017-04-10 05:10:54 +00:00
}
2017-12-15 01:18:40 +00:00
function csf _to _ods _3D ( r /*:string*/ ) /*:string*/ {
2022-05-25 01:45:55 +00:00
return r . replace ( /!/ , "." ) ;
2017-12-15 01:18:40 +00:00
}
2017-02-03 20:50:45 +00:00
var strs = { } ; // shared strings
var _ssfopts = { } ; // spreadsheet formatting options
2018-06-22 21:40:01 +00:00
/*global Map */
var browser _has _Map = typeof Map !== 'undefined' ;
function get _sst _id ( sst /*:SST*/ , str /*:string*/ , rev ) /*:number*/ {
var i = 0 , len = sst . length ;
if ( rev ) {
2020-03-15 07:42:05 +00:00
if ( browser _has _Map ? rev . has ( str ) : Object . prototype . hasOwnProperty . call ( rev , str ) ) {
2018-06-22 21:40:01 +00:00
var revarr = browser _has _Map ? rev . get ( str ) : rev [ str ] ;
for ( ; i < revarr . length ; ++ i ) {
if ( sst [ revarr [ i ] ] . t === str ) { sst . Count ++ ; return revarr [ i ] ; }
}
}
} else for ( ; i < len ; ++ i ) {
if ( sst [ i ] . t === str ) { sst . Count ++ ; return i ; }
}
sst [ len ] = ( { t : str } /*:any*/ ) ; sst . Count ++ ; sst . Unique ++ ;
if ( rev ) {
if ( browser _has _Map ) {
if ( ! rev . has ( str ) ) rev . set ( str , [ ] ) ;
rev . get ( str ) . push ( len ) ;
} else {
2020-03-15 07:42:05 +00:00
if ( ! Object . prototype . hasOwnProperty . call ( rev , str ) ) rev [ str ] = [ ] ;
2018-06-22 21:40:01 +00:00
rev [ str ] . push ( len ) ;
}
}
return len ;
2017-02-03 20:50:45 +00:00
}
2017-03-28 22:03:03 +00:00
function col _obj _w ( C /*:number*/ , col ) {
var p = ( { min : C + 1 , max : C + 1 } /*:any*/ ) ;
/* wch (chars), wpx (pixels) */
2017-04-28 07:28:03 +00:00
var wch = - 1 ;
2017-03-28 22:03:03 +00:00
if ( col . MDW ) MDW = col . MDW ;
if ( col . width != null ) p . customWidth = 1 ;
2017-04-28 07:28:03 +00:00
else if ( col . wpx != null ) wch = px2char ( col . wpx ) ;
else if ( col . wch != null ) wch = col . wch ;
if ( wch > - 1 ) { p . width = char2width ( wch ) ; p . customWidth = 1 ; }
else if ( col . width != null ) p . width = col . width ;
if ( col . hidden ) p . hidden = true ;
2021-10-13 07:20:25 +00:00
if ( col . level != null ) { p . outlineLevel = p . level = col . level ; }
2017-03-28 22:03:03 +00:00
return p ;
}
2017-05-13 18:21:22 +00:00
function default _margins ( margins /*:Margins*/ , mode /*:?string*/ ) {
2017-04-13 01:29:38 +00:00
if ( ! margins ) return ;
var defs = [ 0.7 , 0.7 , 0.75 , 0.75 , 0.3 , 0.3 ] ;
if ( mode == 'xlml' ) defs = [ 1 , 1 , 1 , 1 , 0.5 , 0.5 ] ;
if ( margins . left == null ) margins . left = defs [ 0 ] ;
if ( margins . right == null ) margins . right = defs [ 1 ] ;
if ( margins . top == null ) margins . top = defs [ 2 ] ;
if ( margins . bottom == null ) margins . bottom = defs [ 3 ] ;
if ( margins . header == null ) margins . header = defs [ 4 ] ;
if ( margins . footer == null ) margins . footer = defs [ 5 ] ;
}
2017-12-30 05:40:35 +00:00
function get _cell _style ( styles /*:Array<any>*/ , cell /*:Cell*/ , opts ) {
2017-02-03 20:50:45 +00:00
var z = opts . revssf [ cell . z != null ? cell . z : "General" ] ;
2017-05-09 18:07:57 +00:00
var i = 0x3c , len = styles . length ;
if ( z == null && opts . ssf ) {
for ( ; i < 0x188 ; ++ i ) if ( opts . ssf [ i ] == null ) {
2022-04-11 04:11:47 +00:00
SSF _ _load ( cell . z , i ) ;
2017-12-30 05:40:35 +00:00
// $FlowIgnore
2017-05-09 18:07:57 +00:00
opts . ssf [ i ] = cell . z ;
opts . revssf [ cell . z ] = z = i ;
break ;
}
}
for ( i = 0 ; i != len ; ++ i ) if ( styles [ i ] . numFmtId === z ) return i ;
2017-02-03 20:50:45 +00:00
styles [ len ] = {
numFmtId : z ,
fontId : 0 ,
fillId : 0 ,
borderId : 0 ,
xfId : 0 ,
applyNumberFormat : 1
} ;
return len ;
}
2017-12-30 05:40:35 +00:00
function safe _format ( p /*:Cell*/ , fmtid /*:number*/ , fillid /*:?number*/ , opts , themes , styles ) {
2017-02-03 20:50:45 +00:00
try {
2022-03-20 05:29:24 +00:00
if ( opts . cellNF ) p . z = table _fmt [ fmtid ] ;
2017-04-21 22:02:02 +00:00
} catch ( e ) { if ( opts . WTF ) throw e ; }
2021-09-16 01:50:33 +00:00
if ( p . t === 'z' && ! opts . cellStyles ) return ;
2019-12-23 03:19:56 +00:00
if ( p . t === 'd' && typeof p . v === 'string' ) p . v = parseDate ( p . v ) ;
2021-09-16 01:50:33 +00:00
if ( ( ! opts || opts . cellText !== false ) && p . t !== 'z' ) try {
2022-04-11 04:11:47 +00:00
if ( table _fmt [ fmtid ] == null ) SSF _ _load ( SSFImplicit [ fmtid ] || "General" , fmtid ) ;
2017-02-03 20:50:45 +00:00
if ( p . t === 'e' ) p . w = p . w || BErr [ p . v ] ;
else if ( fmtid === 0 ) {
if ( p . t === 'n' ) {
2022-03-20 05:29:24 +00:00
if ( ( p . v | 0 ) === p . v ) p . w = p . v . toString ( 10 ) ;
else p . w = SSF _general _num ( p . v ) ;
2017-02-03 20:50:45 +00:00
}
else if ( p . t === 'd' ) {
var dd = datenum ( p . v ) ;
2022-03-20 05:29:24 +00:00
if ( ( dd | 0 ) === dd ) p . w = dd . toString ( 10 ) ;
else p . w = SSF _general _num ( dd ) ;
2017-02-03 20:50:45 +00:00
}
else if ( p . v === undefined ) return "" ;
2022-03-20 05:29:24 +00:00
else p . w = SSF _general ( p . v , _ssfopts ) ;
2017-02-03 20:50:45 +00:00
}
2022-03-20 05:29:24 +00:00
else if ( p . t === 'd' ) p . w = SSF _format ( fmtid , datenum ( p . v ) , _ssfopts ) ;
else p . w = SSF _format ( fmtid , p . v , _ssfopts ) ;
2017-02-03 20:50:45 +00:00
} catch ( e ) { if ( opts . WTF ) throw e ; }
2017-08-05 06:32:57 +00:00
if ( ! opts . cellStyles ) return ;
if ( fillid != null ) try {
2017-02-03 20:50:45 +00:00
p . s = styles . Fills [ fillid ] ;
2017-05-09 18:07:57 +00:00
if ( p . s . fgColor && p . s . fgColor . theme && ! p . s . fgColor . rgb ) {
2017-02-03 20:50:45 +00:00
p . s . fgColor . rgb = rgb _tint ( themes . themeElements . clrScheme [ p . s . fgColor . theme ] . rgb , p . s . fgColor . tint || 0 ) ;
if ( opts . WTF ) p . s . fgColor . raw _rgb = themes . themeElements . clrScheme [ p . s . fgColor . theme ] . rgb ;
}
if ( p . s . bgColor && p . s . bgColor . theme ) {
p . s . bgColor . rgb = rgb _tint ( themes . themeElements . clrScheme [ p . s . bgColor . theme ] . rgb , p . s . bgColor . tint || 0 ) ;
if ( opts . WTF ) p . s . bgColor . raw _rgb = themes . themeElements . clrScheme [ p . s . bgColor . theme ] . rgb ;
}
2017-08-05 06:32:57 +00:00
} catch ( e ) { if ( opts . WTF && styles . Fills ) throw e ; }
2017-02-03 20:50:45 +00:00
}
2018-04-27 20:11:18 +00:00
function check _ws ( ws /*:Worksheet*/ , sname /*:string*/ , i /*:number*/ ) {
if ( ws && ws [ '!ref' ] ) {
var range = safe _decode _range ( ws [ '!ref' ] ) ;
if ( range . e . c < range . s . c || range . e . r < range . s . r ) throw new Error ( "Bad range (" + i + "): " + ws [ '!ref' ] ) ;
}
}
2017-12-30 05:40:35 +00:00
function parse _ws _xml _dim ( ws /*:Worksheet*/ , s /*:string*/ ) {
2017-02-03 20:50:45 +00:00
var d = safe _decode _range ( s ) ;
if ( d . s . r <= d . e . r && d . s . c <= d . e . c && d . s . r >= 0 && d . s . c >= 0 ) ws [ "!ref" ] = encode _range ( d ) ;
}
2017-03-20 21:42:12 +00:00
var mergecregex = /<(?:\w:)?mergeCell ref="[A-Z0-9:]+"\s*[\/]?>/g ;
2019-08-14 20:11:16 +00:00
var sheetdataregex = /<(?:\w+:)?sheetData[^>]*>([\s\S]*)<\/(?:\w+:)?sheetData>/ ;
2017-04-09 04:03:19 +00:00
var hlinkregex = /<(?:\w:)?hyperlink [^>]*>/mg ;
2017-02-03 20:50:45 +00:00
var dimregex = /"(\w*:\w*)"/ ;
2019-04-01 14:25:15 +00:00
var colregex = /<(?:\w:)?col\b[^>]*[\/]?>/g ;
2017-06-24 06:51:37 +00:00
var afregex = /<(?:\w:)?autoFilter[^>]*([\/]|>([\s\S]*)<\/(?:\w:)?autoFilter)>/g ;
2017-04-13 01:29:38 +00:00
var marginregex = /<(?:\w:)?pageMargins[^>]*\/>/g ;
2019-04-30 07:30:54 +00:00
var sheetprregex = /<(?:\w:)?sheetPr\b(?:[^>a-z][^>]*)?\/>/ ;
2021-10-13 07:20:25 +00:00
var sheetprregex2 = /<(?:\w:)?sheetPr[^>]*(?:[\/]|>([\s\S]*)<\/(?:\w:)?sheetPr)>/ ;
2017-12-30 05:40:35 +00:00
var svsregex = /<(?:\w:)?sheetViews[^>]*(?:[\/]|>([\s\S]*)<\/(?:\w:)?sheetViews)>/ ;
2019-11-01 03:09:14 +00:00
2017-02-03 20:50:45 +00:00
/* 18.3 Worksheets */
2017-12-30 05:40:35 +00:00
function parse _ws _xml ( data /*:?string*/ , opts , idx /*:number*/ , rels , wb /*:WBWBProps*/ , themes , styles ) /*:Worksheet*/ {
2017-02-03 20:50:45 +00:00
if ( ! data ) return data ;
2019-11-01 03:09:14 +00:00
if ( ! rels ) rels = { '!id' : { } } ;
2017-04-09 04:03:19 +00:00
if ( DENSE != null && opts . dense == null ) opts . dense = DENSE ;
2017-04-10 05:10:54 +00:00
2017-02-03 20:50:45 +00:00
/* 18.3.1.99 worksheet CT_Worksheet */
2017-04-08 06:55:35 +00:00
var s = opts . dense ? ( [ ] /*:any*/ ) : ( { } /*:any*/ ) ;
2017-04-10 05:10:54 +00:00
var refguess /*:Range*/ = ( { s : { r : 2000000 , c : 2000000 } , e : { r : 0 , c : 0 } } /*:any*/ ) ;
var data1 = "" , data2 = "" ;
2017-06-10 01:47:42 +00:00
var mtch /*:?any*/ = data . match ( sheetdataregex ) ;
2017-04-10 05:10:54 +00:00
if ( mtch ) {
2018-01-11 08:01:25 +00:00
data1 = data . slice ( 0 , mtch . index ) ;
data2 = data . slice ( mtch . index + mtch [ 0 ] . length ) ;
2017-04-10 05:10:54 +00:00
} else data1 = data2 = data ;
2017-02-03 20:50:45 +00:00
2017-11-20 01:51:14 +00:00
/* 18.3.1.82 sheetPr CT_SheetPr */
var sheetPr = data1 . match ( sheetprregex ) ;
if ( sheetPr ) parse _ws _xml _sheetpr ( sheetPr [ 0 ] , s , wb , idx ) ;
2021-10-13 07:20:25 +00:00
else if ( ( sheetPr = data1 . match ( sheetprregex2 ) ) ) parse _ws _xml _sheetpr2 ( sheetPr [ 0 ] , sheetPr [ 1 ] || "" , s , wb , idx , styles , themes ) ;
2017-11-20 01:51:14 +00:00
2017-12-30 05:40:35 +00:00
/* 18.3.1.35 dimension CT_SheetDimension */
2017-04-10 05:10:54 +00:00
var ridx = ( data1 . match ( /<(?:\w*:)?dimension/ ) || { index : - 1 } ) . index ;
2017-02-03 20:50:45 +00:00
if ( ridx > 0 ) {
2018-01-11 08:01:25 +00:00
var ref = data1 . slice ( ridx , ridx + 50 ) . match ( dimregex ) ;
2017-04-10 05:10:54 +00:00
if ( ref ) parse _ws _xml _dim ( s , ref [ 1 ] ) ;
2017-02-03 20:50:45 +00:00
}
2017-12-30 05:40:35 +00:00
/* 18.3.1.88 sheetViews CT_SheetViews */
var svs = data1 . match ( svsregex ) ;
if ( svs && svs [ 1 ] ) parse _ws _xml _sheetviews ( svs [ 1 ] , wb ) ;
2017-02-03 20:50:45 +00:00
/* 18.3.1.17 cols CT_Cols */
2017-12-30 05:40:35 +00:00
var columns /*:Array<ColInfo>*/ = [ ] ;
2017-02-10 19:23:01 +00:00
if ( opts . cellStyles ) {
2017-02-03 20:50:45 +00:00
/* 18.3.1.13 col CT_Col */
2017-04-10 05:10:54 +00:00
var cols = data1 . match ( colregex ) ;
2017-02-10 19:23:01 +00:00
if ( cols ) parse _ws _xml _cols ( columns , cols ) ;
2017-02-03 20:50:45 +00:00
}
/* 18.3.1.80 sheetData CT_SheetData ? */
2017-03-18 23:25:50 +00:00
if ( mtch ) parse _ws _xml _data ( mtch [ 1 ] , s , opts , refguess , themes , styles ) ;
2017-02-03 20:50:45 +00:00
2017-04-10 05:10:54 +00:00
/* 18.3.1.2 autoFilter CT_AutoFilter */
var afilter = data2 . match ( afregex ) ;
if ( afilter ) s [ '!autofilter' ] = parse _ws _xml _autofilter ( afilter [ 0 ] ) ;
/* 18.3.1.55 mergeCells CT_MergeCells */
2017-12-30 05:40:35 +00:00
var merges /*:Array<Range>*/ = [ ] ;
var _merge = data2 . match ( mergecregex ) ;
if ( _merge ) for ( ridx = 0 ; ridx != _merge . length ; ++ ridx )
2018-01-11 08:01:25 +00:00
merges [ ridx ] = safe _decode _range ( _merge [ ridx ] . slice ( _merge [ ridx ] . indexOf ( "\"" ) + 1 ) ) ;
2017-04-10 05:10:54 +00:00
2017-02-03 20:50:45 +00:00
/* 18.3.1.48 hyperlinks CT_Hyperlinks */
2017-04-10 05:10:54 +00:00
var hlink = data2 . match ( hlinkregex ) ;
2017-02-10 19:23:01 +00:00
if ( hlink ) parse _ws _xml _hlinks ( s , hlink , rels ) ;
2017-02-03 20:50:45 +00:00
2017-04-13 01:29:38 +00:00
/* 18.3.1.62 pageMargins CT_PageMargins */
var margins = data2 . match ( marginregex ) ;
if ( margins ) s [ '!margins' ] = parse _ws _xml _margins ( parsexmltag ( margins [ 0 ] ) ) ;
2017-02-03 20:50:45 +00:00
if ( ! s [ "!ref" ] && refguess . e . c >= refguess . s . c && refguess . e . r >= refguess . s . r ) s [ "!ref" ] = encode _range ( refguess ) ;
if ( opts . sheetRows > 0 && s [ "!ref" ] ) {
var tmpref = safe _decode _range ( s [ "!ref" ] ) ;
2018-04-06 06:39:48 +00:00
if ( opts . sheetRows <= + tmpref . e . r ) {
2017-02-03 20:50:45 +00:00
tmpref . e . r = opts . sheetRows - 1 ;
if ( tmpref . e . r > refguess . e . r ) tmpref . e . r = refguess . e . r ;
if ( tmpref . e . r < tmpref . s . r ) tmpref . s . r = tmpref . e . r ;
if ( tmpref . e . c > refguess . e . c ) tmpref . e . c = refguess . e . c ;
if ( tmpref . e . c < tmpref . s . c ) tmpref . s . c = tmpref . e . c ;
s [ "!fullref" ] = s [ "!ref" ] ;
s [ "!ref" ] = encode _range ( tmpref ) ;
}
}
if ( columns . length > 0 ) s [ "!cols" ] = columns ;
2017-12-30 05:40:35 +00:00
if ( merges . length > 0 ) s [ "!merges" ] = merges ;
2017-02-03 20:50:45 +00:00
return s ;
}
2017-12-30 05:40:35 +00:00
function write _ws _xml _merges ( merges /*:Array<Range>*/ ) /*:string*/ {
2017-10-17 00:14:32 +00:00
if ( merges . length === 0 ) return "" ;
2017-02-03 20:50:45 +00:00
var o = '<mergeCells count="' + merges . length + '">' ;
for ( var i = 0 ; i != merges . length ; ++ i ) o += '<mergeCell ref="' + encode _range ( merges [ i ] ) + '"/>' ;
return o + '</mergeCells>' ;
}
2017-11-20 01:51:14 +00:00
/* 18.3.1.82-3 sheetPr CT_ChartsheetPr / CT_SheetPr */
function parse _ws _xml _sheetpr ( sheetPr /*:string*/ , s , wb /*:WBWBProps*/ , idx /*:number*/ ) {
var data = parsexmltag ( sheetPr ) ;
if ( ! wb . Sheets [ idx ] ) wb . Sheets [ idx ] = { } ;
2020-11-20 07:05:27 +00:00
if ( data . codeName ) wb . Sheets [ idx ] . CodeName = unescapexml ( utf8read ( data . codeName ) ) ;
2017-11-20 01:51:14 +00:00
}
2022-03-16 03:18:09 +00:00
function parse _ws _xml _sheetpr2 ( sheetPr /*:string*/ , body /*:string*/ , s , wb /*:WBWBProps*/ , idx /*:number*/ ) {
2021-10-13 07:20:25 +00:00
parse _ws _xml _sheetpr ( sheetPr . slice ( 0 , sheetPr . indexOf ( ">" ) ) , s , wb , idx ) ;
}
2019-11-15 01:46:49 +00:00
function write _ws _xml _sheetpr ( ws , wb , idx , opts , o ) {
var needed = false ;
var props = { } , payload = null ;
if ( opts . bookType !== 'xlsx' && wb . vbaraw ) {
var cname = wb . SheetNames [ idx ] ;
try { if ( wb . Workbook ) cname = wb . Workbook . Sheets [ idx ] . CodeName || cname ; } catch ( e ) { }
needed = true ;
2020-11-20 07:05:27 +00:00
props . codeName = utf8write ( escapexml ( cname ) ) ;
}
if ( ws && ws [ "!outline" ] ) {
var outlineprops = { summaryBelow : 1 , summaryRight : 1 } ;
if ( ws [ "!outline" ] . above ) outlineprops . summaryBelow = 0 ;
if ( ws [ "!outline" ] . left ) outlineprops . summaryRight = 0 ;
payload = ( payload || "" ) + writextag ( 'outlinePr' , null , outlineprops ) ;
2019-11-15 01:46:49 +00:00
}
if ( ! needed && ! payload ) return ;
o [ o . length ] = ( writextag ( 'sheetPr' , payload , props ) ) ;
}
2017-11-20 01:51:14 +00:00
/* 18.3.1.85 sheetProtection CT_SheetProtection */
2019-11-01 03:09:14 +00:00
var sheetprot _deffalse = [ "objects" , "scenarios" , "selectLockedCells" , "selectUnlockedCells" ] ;
var sheetprot _deftrue = [
"formatColumns" , "formatRows" , "formatCells" ,
"insertColumns" , "insertRows" , "insertHyperlinks" ,
"deleteColumns" , "deleteRows" ,
"sort" , "autoFilter" , "pivotTables"
] ;
2017-04-04 18:41:11 +00:00
function write _ws _xml _protection ( sp ) /*:string*/ {
2020-10-06 21:13:46 +00:00
// algorithmName, hashValue, saltValue, spinCount
2017-04-04 18:41:11 +00:00
var o = ( { sheet : 1 } /*:any*/ ) ;
2019-11-01 03:09:14 +00:00
sheetprot _deffalse . forEach ( function ( n ) { if ( sp [ n ] != null && sp [ n ] ) o [ n ] = "1" ; } ) ;
sheetprot _deftrue . forEach ( function ( n ) { if ( sp [ n ] != null && ! sp [ n ] ) o [ n ] = "0" ; } ) ;
2017-04-04 18:41:11 +00:00
/* TODO: algorithm */
if ( sp . password ) o . password = crypto _CreatePasswordVerifier _Method1 ( sp . password ) . toString ( 16 ) . toUpperCase ( ) ;
return writextag ( 'sheetProtection' , null , o ) ;
}
2017-03-28 22:03:03 +00:00
function parse _ws _xml _hlinks ( s , data /*:Array<string>*/ , rels ) {
2017-04-08 06:55:35 +00:00
var dense = Array . isArray ( s ) ;
2017-02-03 20:50:45 +00:00
for ( var i = 0 ; i != data . length ; ++ i ) {
2017-06-24 06:51:37 +00:00
var val = parsexmltag ( utf8read ( data [ i ] ) , true ) ;
2017-02-03 20:50:45 +00:00
if ( ! val . ref ) return ;
2017-12-15 01:18:40 +00:00
var rel = ( ( rels || { } ) [ '!id' ] || [ ] ) [ val . id ] ;
2017-02-03 20:50:45 +00:00
if ( rel ) {
val . Target = rel . Target ;
2021-10-13 07:20:25 +00:00
if ( val . location ) val . Target += "#" + unescapexml ( val . location ) ;
2017-02-03 20:50:45 +00:00
} else {
2021-10-13 07:20:25 +00:00
val . Target = "#" + unescapexml ( val . location ) ;
2017-12-15 01:18:40 +00:00
rel = { Target : val . Target , TargetMode : 'Internal' } ;
2017-02-03 20:50:45 +00:00
}
2017-12-15 01:18:40 +00:00
val . Rel = rel ;
2017-03-28 22:03:03 +00:00
if ( val . tooltip ) { val . Tooltip = val . tooltip ; delete val . tooltip ; }
2017-02-03 20:50:45 +00:00
var rng = safe _decode _range ( val . ref ) ;
for ( var R = rng . s . r ; R <= rng . e . r ; ++ R ) for ( var C = rng . s . c ; C <= rng . e . c ; ++ C ) {
var addr = encode _cell ( { c : C , r : R } ) ;
2017-04-08 06:55:35 +00:00
if ( dense ) {
if ( ! s [ R ] ) s [ R ] = [ ] ;
if ( ! s [ R ] [ C ] ) s [ R ] [ C ] = { t : "z" , v : undefined } ;
s [ R ] [ C ] . l = val ;
} else {
if ( ! s [ addr ] ) s [ addr ] = { t : "z" , v : undefined } ;
s [ addr ] . l = val ;
}
2017-02-03 20:50:45 +00:00
}
}
}
2017-04-13 01:29:38 +00:00
function parse _ws _xml _margins ( margin ) {
var o = { } ;
[ "left" , "right" , "top" , "bottom" , "header" , "footer" ] . forEach ( function ( k ) {
if ( margin [ k ] ) o [ k ] = parseFloat ( margin [ k ] ) ;
} ) ;
return o ;
}
2017-12-30 05:40:35 +00:00
function write _ws _xml _margins ( margin ) /*:string*/ {
2017-04-17 02:28:38 +00:00
default _margins ( margin ) ;
return writextag ( 'pageMargins' , null , margin ) ;
}
2017-04-13 01:29:38 +00:00
2017-02-03 20:50:45 +00:00
function parse _ws _xml _cols ( columns , cols ) {
var seencol = false ;
for ( var coli = 0 ; coli != cols . length ; ++ coli ) {
var coll = parsexmltag ( cols [ coli ] , true ) ;
2017-04-28 07:28:03 +00:00
if ( coll . hidden ) coll . hidden = parsexmlbool ( coll . hidden ) ;
2017-02-03 20:50:45 +00:00
var colm = parseInt ( coll . min , 10 ) - 1 , colM = parseInt ( coll . max , 10 ) - 1 ;
2021-10-13 07:20:25 +00:00
if ( coll . outlineLevel ) coll . level = ( + coll . outlineLevel || 0 ) ;
2017-03-20 09:02:25 +00:00
delete coll . min ; delete coll . max ; coll . width = + coll . width ;
if ( ! seencol && coll . width ) { seencol = true ; find _mdw _colw ( coll . width ) ; }
process _col ( coll ) ;
while ( colm <= colM ) columns [ colm ++ ] = dup ( coll ) ;
2017-02-03 20:50:45 +00:00
}
}
2017-02-10 19:23:01 +00:00
function write _ws _xml _cols ( ws , cols ) /*:string*/ {
2018-01-23 09:07:51 +00:00
var o = [ "<cols>" ] , col ;
2017-02-03 20:50:45 +00:00
for ( var i = 0 ; i != cols . length ; ++ i ) {
if ( ! ( col = cols [ i ] ) ) continue ;
2017-03-28 22:03:03 +00:00
o [ o . length ] = ( writextag ( 'col' , null , col _obj _w ( i , col ) ) ) ;
2017-02-03 20:50:45 +00:00
}
o [ o . length ] = "</cols>" ;
return o . join ( "" ) ;
}
2017-12-30 05:40:35 +00:00
function parse _ws _xml _autofilter ( data /*:string*/ ) {
2017-04-10 05:10:54 +00:00
var o = { ref : ( data . match ( /ref="([^"]*)"/ ) || [ ] ) [ 1 ] } ;
return o ;
}
2018-11-13 20:25:51 +00:00
function write _ws _xml _autofilter ( data , ws , wb , idx ) /*:string*/ {
var ref = typeof data . ref == "string" ? data . ref : encode _range ( data . ref ) ;
2019-11-01 03:09:14 +00:00
if ( ! wb . Workbook ) wb . Workbook = ( { Sheets : [ ] } /*:any*/ ) ;
2018-11-13 20:25:51 +00:00
if ( ! wb . Workbook . Names ) wb . Workbook . Names = [ ] ;
var names /*: Array<any> */ = wb . Workbook . Names ;
var range = decode _range ( ref ) ;
if ( range . s . r == range . e . r ) { range . e . r = decode _range ( ws [ "!ref" ] ) . e . r ; ref = encode _range ( range ) ; }
for ( var i = 0 ; i < names . length ; ++ i ) {
var name = names [ i ] ;
if ( name . Name != '_xlnm._FilterDatabase' ) continue ;
if ( name . Sheet != idx ) continue ;
2022-05-30 08:40:51 +00:00
name . Ref = formula _quote _sheet _name ( wb . SheetNames [ idx ] ) + "!" + fix _range ( ref ) ; break ;
2018-11-13 20:25:51 +00:00
}
if ( i == names . length ) names . push ( { Name : '_xlnm._FilterDatabase' , Sheet : idx , Ref : "'" + wb . SheetNames [ idx ] + "'!" + ref } ) ;
return writextag ( "autoFilter" , null , { ref : ref } ) ;
2017-04-10 05:10:54 +00:00
}
2017-04-28 07:28:03 +00:00
/* 18.3.1.88 sheetViews CT_SheetViews */
/* 18.3.1.87 sheetView CT_SheetView */
2022-05-25 01:45:55 +00:00
var sviewregex = /<(?:\w:)?sheetView(?:[^>a-z][^>]*)?\/?>/g ;
2017-12-30 05:40:35 +00:00
function parse _ws _xml _sheetviews ( data , wb /*:WBWBProps*/ ) {
2019-11-01 03:09:14 +00:00
if ( ! wb . Views ) wb . Views = [ { } ] ;
( data . match ( sviewregex ) || [ ] ) . forEach ( function ( r /*:string*/ , i /*:number*/ ) {
2017-12-30 05:40:35 +00:00
var tag = parsexmltag ( r ) ;
2019-11-01 03:09:14 +00:00
// $FlowIgnore
if ( ! wb . Views [ i ] ) wb . Views [ i ] = { } ;
// $FlowIgnore
2021-05-13 19:02:31 +00:00
if ( + tag . zoomScale ) wb . Views [ i ] . zoom = + tag . zoomScale ;
// $FlowIgnore
2022-04-25 09:02:14 +00:00
if ( tag . rightToLeft && parsexmlbool ( tag . rightToLeft ) ) wb . Views [ i ] . RTL = true ;
2017-12-30 05:40:35 +00:00
} ) ;
}
2017-04-28 07:28:03 +00:00
function write _ws _xml _sheetviews ( ws , opts , idx , wb ) /*:string*/ {
2019-11-01 03:09:14 +00:00
var sview = ( { workbookViewId : "0" } /*:any*/ ) ;
2017-12-25 02:25:03 +00:00
// $FlowIgnore
2019-11-01 03:09:14 +00:00
if ( ( ( ( wb || { } ) . Workbook || { } ) . Views || [ ] ) [ 0 ] ) sview . rightToLeft = wb . Workbook . Views [ 0 ] . RTL ? "1" : "0" ;
2017-12-25 02:25:03 +00:00
return writextag ( "sheetViews" , writextag ( "sheetView" , null , sview ) , { } ) ;
2017-04-28 07:28:03 +00:00
}
2018-01-23 09:07:51 +00:00
function write _ws _xml _cell ( cell /*:Cell*/ , ref , ws , opts /*::, idx, wb*/ ) /*:string*/ {
2022-03-16 03:18:09 +00:00
if ( cell . c ) ws [ '!comments' ] . push ( [ ref , cell . c ] ) ;
if ( cell . v === undefined && typeof cell . f !== "string" || cell . t === 'z' && ! cell . f ) return "" ;
2017-02-03 20:50:45 +00:00
var vv = "" ;
var oldt = cell . t , oldv = cell . v ;
2019-11-01 03:09:14 +00:00
if ( cell . t !== "z" ) switch ( cell . t ) {
2017-02-03 20:50:45 +00:00
case 'b' : vv = cell . v ? "1" : "0" ; break ;
case 'n' : vv = '' + cell . v ; break ;
case 'e' : vv = BErr [ cell . v ] ; break ;
case 'd' :
2019-11-01 03:09:14 +00:00
if ( opts && opts . cellDates ) vv = parseDate ( cell . v , - 1 ) . toISOString ( ) ;
2017-02-03 20:50:45 +00:00
else {
2017-10-17 00:14:32 +00:00
cell = dup ( cell ) ;
2017-02-03 20:50:45 +00:00
cell . t = 'n' ;
2017-03-23 01:18:40 +00:00
vv = '' + ( cell . v = datenum ( parseDate ( cell . v ) ) ) ;
2017-02-03 20:50:45 +00:00
}
2022-03-20 05:29:24 +00:00
if ( typeof cell . z === 'undefined' ) cell . z = table _fmt [ 14 ] ;
2017-02-03 20:50:45 +00:00
break ;
default : vv = cell . v ; break ;
}
2022-05-25 01:45:55 +00:00
var v = ( cell . t == "z" || cell . v == null ) ? "" : writetag ( 'v' , escapexml ( vv ) ) , o = ( { r : ref } /*:any*/ ) ;
2017-02-03 20:50:45 +00:00
/* TODO: cell style */
var os = get _cell _style ( opts . cellXfs , cell , opts ) ;
if ( os !== 0 ) o . s = os ;
switch ( cell . t ) {
case 'n' : break ;
case 'd' : o . t = "d" ; break ;
case 'b' : o . t = "b" ; break ;
case 'e' : o . t = "e" ; break ;
2019-11-15 01:46:49 +00:00
case 'z' : break ;
2017-03-18 00:45:06 +00:00
default : if ( cell . v == null ) { delete cell . t ; break ; }
2021-10-13 07:20:25 +00:00
if ( cell . v . length > 32767 ) throw new Error ( "Text length must not exceed 32767 characters" ) ;
2019-11-15 01:46:49 +00:00
if ( opts && opts . bookSST ) {
2018-06-22 21:40:01 +00:00
v = writetag ( 'v' , '' + get _sst _id ( opts . Strings , cell . v , opts . revStrings ) ) ;
2017-02-03 20:50:45 +00:00
o . t = "s" ; break ;
}
2022-05-25 01:45:55 +00:00
else o . t = "str" ; break ;
2017-02-03 20:50:45 +00:00
}
if ( cell . t != oldt ) { cell . t = oldt ; cell . v = oldv ; }
2020-09-11 08:38:33 +00:00
if ( typeof cell . f == "string" && cell . f ) {
2018-01-11 08:01:25 +00:00
var ff = cell . F && cell . F . slice ( 0 , ref . length ) == ref ? { t : "array" , ref : cell . F } : null ;
2017-03-18 00:45:06 +00:00
v = writextag ( 'f' , escapexml ( cell . f ) , ff ) + ( cell . v != null ? v : "" ) ;
}
2017-03-31 00:47:35 +00:00
if ( cell . l ) ws [ '!links' ] . push ( [ ref , cell . l ] ) ;
2022-03-03 08:35:39 +00:00
if ( cell . D ) o . cm = 1 ;
2017-02-03 20:50:45 +00:00
return writextag ( 'c' , v , o ) ;
}
2022-03-12 14:05:57 +00:00
var parse _ws _xml _data = /*#__PURE__*/ ( function ( ) {
2020-11-20 07:05:27 +00:00
var cellregex = /<(?:\w+:)?c[ \/>]/ , rowregex = /<\/(?:\w+:)?row>/ ;
2017-02-10 19:23:01 +00:00
var rregex = /r=["']([^"']*)["']/ , isregex = /<(?:\w+:)?is>([\S\s]*?)<\/(?:\w+:)?is>/ ;
2017-02-19 20:36:32 +00:00
var refregex = /ref=["']([^"']*)["']/ ;
2017-02-03 20:50:45 +00:00
var match _v = matchtag ( "v" ) , match _f = matchtag ( "f" ) ;
2017-12-30 05:40:35 +00:00
return function parse _ws _xml _data ( sdata /*:string*/ , s , opts , guess /*:Range*/ , themes , styles ) {
var ri = 0 , x = "" , cells /*:Array<string>*/ = [ ] , cref /*:?Array<string>*/ = [ ] , idx = 0 , i = 0 , cc = 0 , d = "" , p /*:any*/ ;
2017-02-03 20:50:45 +00:00
var tag , tagr = 0 , tagc = 0 ;
2017-02-19 20:36:32 +00:00
var sstr , ftag ;
2017-07-05 22:27:54 +00:00
var fmtid = 0 , fillid = 0 ;
var do _format = Array . isArray ( styles . CellXf ) , cf ;
2017-12-30 05:40:35 +00:00
var arrayf /*:Array<[Range, string]>*/ = [ ] ;
2017-02-19 20:36:32 +00:00
var sharedf = [ ] ;
2017-04-08 06:55:35 +00:00
var dense = Array . isArray ( s ) ;
2017-12-30 05:40:35 +00:00
var rows /*:Array<RowInfo>*/ = [ ] , rowobj = { } , rowrite = false ;
2020-10-06 21:13:46 +00:00
var sheetStubs = ! ! opts . sheetStubs ;
2017-02-03 20:50:45 +00:00
for ( var marr = sdata . split ( rowregex ) , mt = 0 , marrlen = marr . length ; mt != marrlen ; ++ mt ) {
x = marr [ mt ] . trim ( ) ;
var xlen = x . length ;
if ( xlen === 0 ) continue ;
/* 18.3.1.73 row CT_Row */
2021-10-13 07:20:25 +00:00
var rstarti = 0 ;
outa : for ( ri = 0 ; ri < xlen ; ++ ri ) switch ( /*x.charCodeAt(ri)*/ x [ ri ] ) {
case ">" /*62*/ :
if ( /*x.charCodeAt(ri-1) != 47*/ x [ ri - 1 ] != "/" ) { ++ ri ; break outa ; }
if ( opts && opts . cellStyles ) {
// TODO: avoid duplication
tag = parsexmltag ( x . slice ( rstarti , ri ) , true ) ;
tagr = tag . r != null ? parseInt ( tag . r , 10 ) : tagr + 1 ; tagc = - 1 ;
if ( opts . sheetRows && opts . sheetRows < tagr ) continue ;
rowobj = { } ; rowrite = false ;
if ( tag . ht ) { rowrite = true ; rowobj . hpt = parseFloat ( tag . ht ) ; rowobj . hpx = pt2px ( rowobj . hpt ) ; }
2022-04-25 09:02:14 +00:00
if ( tag . hidden && parsexmlbool ( tag . hidden ) ) { rowrite = true ; rowobj . hidden = true ; }
2021-10-13 07:20:25 +00:00
if ( tag . outlineLevel != null ) { rowrite = true ; rowobj . level = + tag . outlineLevel ; }
if ( rowrite ) rows [ tagr - 1 ] = rowobj ;
}
break ;
case "<" /*60*/ : rstarti = ri ; break ;
}
if ( rstarti >= ri ) break ;
tag = parsexmltag ( x . slice ( rstarti , ri ) , true ) ;
2017-04-26 02:27:12 +00:00
tagr = tag . r != null ? parseInt ( tag . r , 10 ) : tagr + 1 ; tagc = - 1 ;
2017-02-03 20:50:45 +00:00
if ( opts . sheetRows && opts . sheetRows < tagr ) continue ;
if ( guess . s . r > tagr - 1 ) guess . s . r = tagr - 1 ;
if ( guess . e . r < tagr - 1 ) guess . e . r = tagr - 1 ;
2017-04-28 07:28:03 +00:00
if ( opts && opts . cellStyles ) {
rowobj = { } ; rowrite = false ;
if ( tag . ht ) { rowrite = true ; rowobj . hpt = parseFloat ( tag . ht ) ; rowobj . hpx = pt2px ( rowobj . hpt ) ; }
2022-04-25 09:02:14 +00:00
if ( tag . hidden && parsexmlbool ( tag . hidden ) ) { rowrite = true ; rowobj . hidden = true ; }
2017-07-09 17:37:45 +00:00
if ( tag . outlineLevel != null ) { rowrite = true ; rowobj . level = + tag . outlineLevel ; }
2017-04-28 07:28:03 +00:00
if ( rowrite ) rows [ tagr - 1 ] = rowobj ;
}
2017-02-03 20:50:45 +00:00
/* 18.3.1.4 c CT_Cell */
2018-01-11 08:01:25 +00:00
cells = x . slice ( ri ) . split ( cellregex ) ;
2019-11-01 03:09:14 +00:00
for ( var rslice = 0 ; rslice != cells . length ; ++ rslice ) if ( cells [ rslice ] . trim ( ) . charAt ( 0 ) != "<" ) break ;
cells = cells . slice ( rslice ) ;
2017-02-22 06:57:59 +00:00
for ( ri = 0 ; ri != cells . length ; ++ ri ) {
2017-02-03 20:50:45 +00:00
x = cells [ ri ] . trim ( ) ;
if ( x . length === 0 ) continue ;
cref = x . match ( rregex ) ; idx = ri ; i = 0 ; cc = 0 ;
2018-01-11 08:01:25 +00:00
x = "<c " + ( x . slice ( 0 , 1 ) == "<" ? ">" : "" ) + x ;
2017-02-10 19:23:01 +00:00
if ( cref != null && cref . length === 2 ) {
2017-02-03 20:50:45 +00:00
idx = 0 ; d = cref [ 1 ] ;
for ( i = 0 ; i != d . length ; ++ i ) {
if ( ( cc = d . charCodeAt ( i ) - 64 ) < 1 || cc > 26 ) break ;
idx = 26 * idx + cc ;
}
-- idx ;
tagc = idx ;
} else ++ tagc ;
for ( i = 0 ; i != x . length ; ++ i ) if ( x . charCodeAt ( i ) === 62 ) break ; ++ i ;
2018-01-11 08:01:25 +00:00
tag = parsexmltag ( x . slice ( 0 , i ) , true ) ;
2017-04-17 02:08:23 +00:00
if ( ! tag . r ) tag . r = encode _cell ( { r : tagr - 1 , c : tagc } ) ;
2018-01-11 08:01:25 +00:00
d = x . slice ( i ) ;
2017-02-10 19:23:01 +00:00
p = ( { t : "" } /*:any*/ ) ;
2017-02-03 20:50:45 +00:00
2017-02-19 20:36:32 +00:00
if ( ( cref = d . match ( match _v ) ) != null && /*::cref != null && */ cref [ 1 ] !== '' ) p . v = unescapexml ( cref [ 1 ] ) ;
if ( opts . cellFormula ) {
if ( ( cref = d . match ( match _f ) ) != null && /*::cref != null && */ cref [ 1 ] !== '' ) {
2017-03-18 00:45:06 +00:00
/* TODO: match against XLSXFutureFunctions */
2022-04-25 09:02:14 +00:00
p . f = unescapexml ( utf8read ( cref [ 1 ] ) , true ) ;
2020-08-12 21:58:02 +00:00
if ( ! opts . xlfn ) p . f = _xlfn ( p . f ) ;
2017-02-19 20:36:32 +00:00
if ( /*::cref != null && cref[0] != null && */ cref [ 0 ] . indexOf ( 't="array"' ) > - 1 ) {
p . F = ( d . match ( refregex ) || [ ] ) [ 1 ] ;
if ( p . F . indexOf ( ":" ) > - 1 ) arrayf . push ( [ safe _decode _range ( p . F ) , p . F ] ) ;
} else if ( /*::cref != null && cref[0] != null && */ cref [ 0 ] . indexOf ( 't="shared"' ) > - 1 ) {
// TODO: parse formula
ftag = parsexmltag ( cref [ 0 ] ) ;
2020-08-12 21:58:02 +00:00
var _ _ _f = unescapexml ( utf8read ( cref [ 1 ] ) ) ;
if ( ! opts . xlfn ) _ _ _f = _xlfn ( _ _ _f ) ;
sharedf [ parseInt ( ftag . si , 10 ) ] = [ ftag , _ _ _f , tag . r ] ;
2017-02-19 20:36:32 +00:00
}
} else if ( ( cref = d . match ( /<f[^>]*\/>/ ) ) ) {
ftag = parsexmltag ( cref [ 0 ] ) ;
2019-04-30 07:30:54 +00:00
if ( sharedf [ ftag . si ] ) p . f = shift _formula _xlsx ( sharedf [ ftag . si ] [ 1 ] , sharedf [ ftag . si ] [ 2 ] /*[0].ref*/ , tag . r ) ;
2017-02-19 20:36:32 +00:00
}
/* TODO: factor out contains logic */
var _tag = decode _cell ( tag . r ) ;
for ( i = 0 ; i < arrayf . length ; ++ i )
if ( _tag . r >= arrayf [ i ] [ 0 ] . s . r && _tag . r <= arrayf [ i ] [ 0 ] . e . r )
if ( _tag . c >= arrayf [ i ] [ 0 ] . s . c && _tag . c <= arrayf [ i ] [ 0 ] . e . c )
p . F = arrayf [ i ] [ 1 ] ;
}
2017-02-03 20:50:45 +00:00
2017-04-26 02:27:12 +00:00
if ( tag . t == null && p . v === undefined ) {
2017-05-11 07:29:59 +00:00
if ( p . f || p . F ) {
p . v = 0 ; p . t = "n" ;
2020-10-06 21:13:46 +00:00
} else if ( ! sheetStubs ) continue ;
2017-05-11 07:29:59 +00:00
else p . t = "z" ;
2017-02-03 20:50:45 +00:00
}
else p . t = tag . t || "n" ;
2018-07-25 06:38:32 +00:00
if ( guess . s . c > tagc ) guess . s . c = tagc ;
if ( guess . e . c < tagc ) guess . e . c = tagc ;
2017-02-03 20:50:45 +00:00
/* 18.18.11 t ST_CellType */
switch ( p . t ) {
2017-03-21 20:44:35 +00:00
case 'n' :
2017-11-20 01:51:14 +00:00
if ( p . v == "" || p . v == null ) {
2020-10-06 21:13:46 +00:00
if ( ! sheetStubs ) continue ;
2017-11-20 01:51:14 +00:00
p . t = 'z' ;
} else p . v = parseFloat ( p . v ) ;
2017-03-21 20:44:35 +00:00
break ;
2017-02-03 20:50:45 +00:00
case 's' :
2017-03-10 01:09:18 +00:00
if ( typeof p . v == 'undefined' ) {
2020-10-06 21:13:46 +00:00
if ( ! sheetStubs ) continue ;
2017-03-15 08:19:02 +00:00
p . t = 'z' ;
2017-07-05 22:27:54 +00:00
} else {
sstr = strs [ parseInt ( p . v , 10 ) ] ;
p . v = sstr . t ;
p . r = sstr . r ;
if ( opts . cellHTML ) p . h = sstr . h ;
2017-03-10 01:09:18 +00:00
}
2017-02-03 20:50:45 +00:00
break ;
case 'str' :
p . t = "s" ;
2022-04-25 09:02:14 +00:00
p . v = ( p . v != null ) ? unescapexml ( utf8read ( p . v ) , true ) : '' ;
2017-04-13 18:28:16 +00:00
if ( opts . cellHTML ) p . h = escapehtml ( p . v ) ;
2017-02-03 20:50:45 +00:00
break ;
case 'inlineStr' :
cref = d . match ( isregex ) ;
p . t = 's' ;
2019-11-01 03:09:14 +00:00
if ( cref != null && ( sstr = parse _si ( cref [ 1 ] ) ) ) {
p . v = sstr . t ;
if ( opts . cellHTML ) p . h = sstr . h ;
} else p . v = "" ;
2017-04-10 05:10:54 +00:00
break ;
2017-02-03 20:50:45 +00:00
case 'b' : p . v = parsexmlbool ( p . v ) ; break ;
case 'd' :
2017-06-01 21:22:11 +00:00
if ( opts . cellDates ) p . v = parseDate ( p . v , 1 ) ;
else { p . v = datenum ( parseDate ( p . v , 1 ) ) ; p . t = 'n' ; }
2017-02-03 20:50:45 +00:00
break ;
2017-03-21 20:44:35 +00:00
/* error string in .w, number in .v */
2017-04-21 22:02:02 +00:00
case 'e' :
2017-04-26 02:27:12 +00:00
if ( ! opts || opts . cellText !== false ) p . w = p . v ;
2017-04-21 22:02:02 +00:00
p . v = RBErr [ p . v ] ; break ;
2017-02-03 20:50:45 +00:00
}
/* formatting */
fmtid = fillid = 0 ;
2019-11-01 03:09:14 +00:00
cf = null ;
2017-02-03 20:50:45 +00:00
if ( do _format && tag . s !== undefined ) {
cf = styles . CellXf [ tag . s ] ;
if ( cf != null ) {
if ( cf . numFmtId != null ) fmtid = cf . numFmtId ;
2017-07-10 22:18:18 +00:00
if ( opts . cellStyles ) {
if ( cf . fillId != null ) fillid = cf . fillId ;
}
2017-02-03 20:50:45 +00:00
}
}
2017-03-18 23:25:50 +00:00
safe _format ( p , fmtid , fillid , opts , themes , styles ) ;
2022-03-20 05:29:24 +00:00
if ( opts . cellDates && do _format && p . t == 'n' && fmt _is _date ( table _fmt [ fmtid ] ) ) { p . t = 'd' ; p . v = numdate ( p . v ) ; }
2022-03-03 08:35:39 +00:00
if ( tag . cm && opts . xlmeta ) {
2022-03-16 03:18:09 +00:00
var cm = ( opts . xlmeta . Cell || [ ] ) [ + tag . cm - 1 ] ;
if ( cm && cm . type == 'XLDAPR' ) p . D = true ;
2022-03-03 08:35:39 +00:00
}
2017-04-08 06:55:35 +00:00
if ( dense ) {
var _r = decode _cell ( tag . r ) ;
if ( ! s [ _r . r ] ) s [ _r . r ] = [ ] ;
s [ _r . r ] [ _r . c ] = p ;
} else s [ tag . r ] = p ;
2017-02-03 20:50:45 +00:00
}
}
2017-04-28 07:28:03 +00:00
if ( rows . length > 0 ) s [ '!rows' ] = rows ;
2017-02-03 20:50:45 +00:00
} ; } ) ( ) ;
2018-01-23 09:07:51 +00:00
function write _ws _xml _data ( ws /*:Worksheet*/ , opts , idx /*:number*/ , wb /*:Workbook*/ /*::, rels*/ ) /*:string*/ {
2017-12-30 05:40:35 +00:00
var o /*:Array<string>*/ = [ ] , r /*:Array<string>*/ = [ ] , range = safe _decode _range ( ws [ '!ref' ] ) , cell = "" , ref , rr = "" , cols /*:Array<string>*/ = [ ] , R = 0 , C = 0 , rows = ws [ '!rows' ] ;
2017-04-08 06:55:35 +00:00
var dense = Array . isArray ( ws ) ;
2017-10-17 00:14:32 +00:00
var params = ( { r : rr } /*:any*/ ) , row /*:RowInfo*/ , height = - 1 ;
2017-02-03 20:50:45 +00:00
for ( C = range . s . c ; C <= range . e . c ; ++ C ) cols [ C ] = encode _col ( C ) ;
for ( R = range . s . r ; R <= range . e . r ; ++ R ) {
r = [ ] ;
rr = encode _row ( R ) ;
for ( C = range . s . c ; C <= range . e . c ; ++ C ) {
ref = cols [ C ] + rr ;
2017-04-08 06:55:35 +00:00
var _cell = dense ? ( ws [ R ] || [ ] ) [ C ] : ws [ ref ] ;
if ( _cell === undefined ) continue ;
if ( ( cell = write _ws _xml _cell ( _cell , ref , ws , opts , idx , wb ) ) != null ) r . push ( cell ) ;
2017-02-03 20:50:45 +00:00
}
2018-02-08 18:21:39 +00:00
if ( r . length > 0 || ( rows && rows [ R ] ) ) {
2017-10-17 00:14:32 +00:00
params = ( { r : rr } /*:any*/ ) ;
2017-03-31 03:57:11 +00:00
if ( rows && rows [ R ] ) {
2017-10-17 00:14:32 +00:00
row = rows [ R ] ;
2017-03-31 03:57:11 +00:00
if ( row . hidden ) params . hidden = 1 ;
2017-10-17 00:14:32 +00:00
height = - 1 ;
2019-04-01 14:25:15 +00:00
if ( row . hpx ) height = px2pt ( row . hpx ) ;
else if ( row . hpt ) height = row . hpt ;
if ( height > - 1 ) { params . ht = height ; params . customHeight = 1 ; }
if ( row . level ) { params . outlineLevel = row . level ; }
2017-03-31 03:57:11 +00:00
}
o [ o . length ] = ( writextag ( 'row' , r . join ( "" ) , params ) ) ;
}
2017-02-03 20:50:45 +00:00
}
2017-07-09 17:37:45 +00:00
if ( rows ) for ( ; R < rows . length ; ++ R ) {
if ( rows && rows [ R ] ) {
2017-07-26 08:35:28 +00:00
params = ( { r : R + 1 } /*:any*/ ) ;
row = rows [ R ] ;
2017-07-09 17:37:45 +00:00
if ( row . hidden ) params . hidden = 1 ;
2017-07-26 08:35:28 +00:00
height = - 1 ;
2017-07-09 17:37:45 +00:00
if ( row . hpx ) height = px2pt ( row . hpx ) ;
else if ( row . hpt ) height = row . hpt ;
if ( height > - 1 ) { params . ht = height ; params . customHeight = 1 ; }
if ( row . level ) { params . outlineLevel = row . level ; }
o [ o . length ] = ( writextag ( 'row' , "" , params ) ) ;
}
}
2017-02-03 20:50:45 +00:00
return o . join ( "" ) ;
}
2017-03-31 00:47:35 +00:00
function write _ws _xml ( idx /*:number*/ , opts , wb /*:Workbook*/ , rels ) /*:string*/ {
2022-03-12 14:05:57 +00:00
var o = [ XML _HEADER , writextag ( 'worksheet' , null , {
'xmlns' : XMLNS _main [ 0 ] ,
'xmlns:r' : XMLNS . r
} ) ] ;
2017-02-03 20:50:45 +00:00
var s = wb . SheetNames [ idx ] , sidx = 0 , rdata = "" ;
var ws = wb . Sheets [ s ] ;
2017-04-10 05:10:54 +00:00
if ( ws == null ) ws = { } ;
2018-04-27 20:11:18 +00:00
var ref = ws [ '!ref' ] || 'A1' ;
var range = safe _decode _range ( ref ) ;
if ( range . e . c > 0x3FFF || range . e . r > 0xFFFFF ) {
if ( opts . WTF ) throw new Error ( "Range " + ref + " exceeds format limit A1:XFD1048576" ) ;
range . e . c = Math . min ( range . e . c , 0x3FFF ) ;
range . e . r = Math . min ( range . e . c , 0xFFFFF ) ;
ref = encode _range ( range ) ;
}
2017-03-31 00:47:35 +00:00
if ( ! rels ) rels = { } ;
2017-04-02 06:47:25 +00:00
ws [ '!comments' ] = [ ] ;
2019-11-15 01:46:49 +00:00
var _drawing = [ ] ;
2017-03-31 00:47:35 +00:00
2019-11-15 01:46:49 +00:00
write _ws _xml _sheetpr ( ws , wb , idx , opts , o ) ;
2017-04-10 05:10:54 +00:00
2017-02-03 20:50:45 +00:00
o [ o . length ] = ( writextag ( 'dimension' , null , { 'ref' : ref } ) ) ;
2017-04-28 07:28:03 +00:00
o [ o . length ] = write _ws _xml _sheetviews ( ws , opts , idx , wb ) ;
2017-04-10 05:10:54 +00:00
2017-03-31 03:23:52 +00:00
/* TODO: store in WB, process styles */
2017-07-09 17:37:45 +00:00
if ( opts . sheetFormat ) o [ o . length ] = ( writextag ( 'sheetFormatPr' , null , {
defaultRowHeight : opts . sheetFormat . defaultRowHeight || '16' ,
baseColWidth : opts . sheetFormat . baseColWidth || '10' ,
outlineLevelRow : opts . sheetFormat . outlineLevelRow || '7'
} ) ) ;
2017-03-31 03:23:52 +00:00
2017-04-10 05:10:54 +00:00
if ( ws [ '!cols' ] != null && ws [ '!cols' ] . length > 0 ) o [ o . length ] = ( write _ws _xml _cols ( ws , ws [ '!cols' ] ) ) ;
2017-02-03 20:50:45 +00:00
o [ sidx = o . length ] = '<sheetData/>' ;
2017-03-31 00:47:35 +00:00
ws [ '!links' ] = [ ] ;
2017-03-28 22:03:03 +00:00
if ( ws [ '!ref' ] != null ) {
2017-03-31 00:47:35 +00:00
rdata = write _ws _xml _data ( ws , opts , idx , wb , rels ) ;
2017-02-03 20:50:45 +00:00
if ( rdata . length > 0 ) o [ o . length ] = ( rdata ) ;
}
if ( o . length > sidx + 1 ) { o [ o . length ] = ( '</sheetData>' ) ; o [ sidx ] = o [ sidx ] . replace ( "/>" , ">" ) ; }
2017-04-10 05:10:54 +00:00
/* sheetCalcPr */
2021-11-14 04:38:00 +00:00
if ( ws [ '!protect' ] ) o [ o . length ] = write _ws _xml _protection ( ws [ '!protect' ] ) ;
2017-04-04 18:41:11 +00:00
2017-04-10 05:10:54 +00:00
/* protectedRanges */
/* scenarios */
2018-11-13 20:25:51 +00:00
if ( ws [ '!autofilter' ] != null ) o [ o . length ] = write _ws _xml _autofilter ( ws [ '!autofilter' ] , ws , wb , idx ) ;
2017-04-10 05:10:54 +00:00
/* sortState */
/* dataConsolidate */
/* customSheetViews */
2017-03-28 22:03:03 +00:00
if ( ws [ '!merges' ] != null && ws [ '!merges' ] . length > 0 ) o [ o . length ] = ( write _ws _xml _merges ( ws [ '!merges' ] ) ) ;
2017-02-03 20:50:45 +00:00
2017-04-10 05:10:54 +00:00
/* phoneticPr */
/* conditionalFormatting */
/* dataValidations */
2017-04-02 06:47:25 +00:00
var relc = - 1 , rel , rId = - 1 ;
2019-11-01 03:09:14 +00:00
if ( /*::(*/ ws [ '!links' ] /*::||[])*/ . length > 0 ) {
2017-03-31 00:47:35 +00:00
o [ o . length ] = "<hyperlinks>" ;
2019-11-01 03:09:14 +00:00
/*::(*/ ws [ '!links' ] /*::||[])*/ . forEach ( function ( l ) {
2017-03-31 00:47:35 +00:00
if ( ! l [ 1 ] . Target ) return ;
2017-12-15 01:18:40 +00:00
rel = ( { "ref" : l [ 0 ] } /*:any*/ ) ;
if ( l [ 1 ] . Target . charAt ( 0 ) != "#" ) {
rId = add _rels ( rels , - 1 , escapexml ( l [ 1 ] . Target ) . replace ( /#.*$/ , "" ) , RELS . HLINK ) ;
rel [ "r:id" ] = "rId" + rId ;
}
2018-01-11 08:01:25 +00:00
if ( ( relc = l [ 1 ] . Target . indexOf ( "#" ) ) > - 1 ) rel . location = escapexml ( l [ 1 ] . Target . slice ( relc + 1 ) ) ;
2017-03-31 00:47:35 +00:00
if ( l [ 1 ] . Tooltip ) rel . tooltip = escapexml ( l [ 1 ] . Tooltip ) ;
o [ o . length ] = writextag ( "hyperlink" , null , rel ) ;
} ) ;
o [ o . length ] = "</hyperlinks>" ;
}
2017-03-28 22:03:03 +00:00
delete ws [ '!links' ] ;
2017-04-02 06:47:25 +00:00
2017-04-10 05:10:54 +00:00
/* printOptions */
2019-11-15 01:46:49 +00:00
if ( ws [ '!margins' ] != null ) o [ o . length ] = write _ws _xml _margins ( ws [ '!margins' ] ) ;
2017-04-08 06:55:35 +00:00
2019-11-15 01:46:49 +00:00
/* pageSetup */
/* headerFooter */
2017-04-10 05:10:54 +00:00
/* rowBreaks */
/* colBreaks */
/* customProperties */
/* cellWatches */
2018-02-14 20:06:35 +00:00
2018-08-15 19:22:47 +00:00
if ( ! opts || opts . ignoreEC || ( opts . ignoreEC == ( void 0 ) ) ) o [ o . length ] = writetag ( "ignoredErrors" , writextag ( "ignoredError" , null , { numberStoredAsText : 1 , sqref : ref } ) ) ;
2018-02-14 20:06:35 +00:00
2017-04-10 05:10:54 +00:00
/* smartTags */
2019-11-15 01:46:49 +00:00
if ( _drawing . length > 0 ) {
2017-04-08 06:55:35 +00:00
rId = add _rels ( rels , - 1 , "../drawings/drawing" + ( idx + 1 ) + ".xml" , RELS . DRAW ) ;
o [ o . length ] = writextag ( "drawing" , null , { "r:id" : "rId" + rId } ) ;
2019-11-15 01:46:49 +00:00
ws [ '!drawing' ] = _drawing ;
2017-04-08 06:55:35 +00:00
}
2017-04-10 05:10:54 +00:00
2017-04-02 06:47:25 +00:00
if ( ws [ '!comments' ] . length > 0 ) {
rId = add _rels ( rels , - 1 , "../drawings/vmlDrawing" + ( idx + 1 ) + ".vml" , RELS . VML ) ;
o [ o . length ] = writextag ( "legacyDrawing" , null , { "r:id" : "rId" + rId } ) ;
ws [ '!legacy' ] = rId ;
}
2019-11-15 01:46:49 +00:00
/* legacyDrawingHF */
2017-04-10 05:10:54 +00:00
/* picture */
/* oleObjects */
/* controls */
/* webPublishItems */
/* tableParts */
2019-11-15 01:46:49 +00:00
/* extLst */
2017-04-10 05:10:54 +00:00
2019-11-15 01:46:49 +00:00
if ( o . length > 1 ) { o [ o . length ] = ( '</worksheet>' ) ; o [ 1 ] = o [ 1 ] . replace ( "/>" , ">" ) ; }
2017-02-03 20:50:45 +00:00
return o . join ( "" ) ;
}
2018-02-14 20:06:35 +00:00
/* [MS-XLSB] 2.4.726 BrtRowHdr */
2017-02-03 20:50:45 +00:00
function parse _BrtRowHdr ( data , length ) {
2017-04-28 07:28:03 +00:00
var z = ( { } /*:any*/ ) ;
var tgt = data . l + length ;
2017-02-03 20:50:45 +00:00
z . r = data . read _shift ( 4 ) ;
2017-04-28 07:28:03 +00:00
data . l += 4 ; // TODO: ixfe
var miyRw = data . read _shift ( 2 ) ;
data . l += 1 ; // TODO: top/bot padding
var flags = data . read _shift ( 1 ) ;
data . l = tgt ;
2017-07-09 17:37:45 +00:00
if ( flags & 0x07 ) z . level = flags & 0x07 ;
2017-04-28 07:28:03 +00:00
if ( flags & 0x10 ) z . hidden = true ;
if ( flags & 0x20 ) z . hpt = miyRw / 20 ;
2017-02-03 20:50:45 +00:00
return z ;
}
function write _BrtRowHdr ( R /*:number*/ , range , ws ) {
var o = new _buf ( 17 + 8 * 16 ) ;
2017-04-28 07:28:03 +00:00
var row = ( ws [ '!rows' ] || [ ] ) [ R ] || { } ;
2017-02-03 20:50:45 +00:00
o . write _shift ( 4 , R ) ;
2017-04-28 07:28:03 +00:00
o . write _shift ( 4 , 0 ) ; /* TODO: ixfe */
var miyRw = 0x0140 ;
if ( row . hpx ) miyRw = px2pt ( row . hpx ) * 20 ;
else if ( row . hpt ) miyRw = row . hpt * 20 ;
o . write _shift ( 2 , miyRw ) ;
o . write _shift ( 1 , 0 ) ; /* top/bot padding */
var flags = 0x0 ;
2017-07-09 17:37:45 +00:00
if ( row . level ) flags |= row . level ;
2017-04-28 07:28:03 +00:00
if ( row . hidden ) flags |= 0x10 ;
if ( row . hpx || row . hpt ) flags |= 0x20 ;
o . write _shift ( 1 , flags ) ;
o . write _shift ( 1 , 0 ) ; /* phonetic guide */
2017-02-03 20:50:45 +00:00
/* [MS-XLSB] 2.5.8 BrtColSpan explains the mechanism */
var ncolspan = 0 , lcs = o . l ;
o . l += 4 ;
var caddr = { r : R , c : 0 } ;
for ( var i = 0 ; i < 16 ; ++ i ) {
2018-02-08 18:21:39 +00:00
if ( ( range . s . c > ( ( i + 1 ) << 10 ) ) || ( range . e . c < ( i << 10 ) ) ) continue ;
2017-02-03 20:50:45 +00:00
var first = - 1 , last = - 1 ;
for ( var j = ( i << 10 ) ; j < ( ( i + 1 ) << 10 ) ; ++ j ) {
caddr . c = j ;
2017-04-08 06:55:35 +00:00
var cell = Array . isArray ( ws ) ? ( ws [ caddr . r ] || [ ] ) [ caddr . c ] : ws [ encode _cell ( caddr ) ] ;
if ( cell ) { if ( first < 0 ) first = j ; last = j ; }
2017-02-03 20:50:45 +00:00
}
if ( first < 0 ) continue ;
++ ncolspan ;
o . write _shift ( 4 , first ) ;
o . write _shift ( 4 , last ) ;
}
var l = o . l ;
o . l = lcs ;
o . write _shift ( 4 , ncolspan ) ;
o . l = l ;
return o . length > o . l ? o . slice ( 0 , o . l ) : o ;
}
function write _row _header ( ba , ws , range , R ) {
var o = write _BrtRowHdr ( R , range , ws ) ;
2022-03-12 14:05:57 +00:00
if ( ( o . length > 17 ) || ( ws [ '!rows' ] || [ ] ) [ R ] ) write _record ( ba , 0x0000 /* BrtRowHdr */ , o ) ;
2017-02-03 20:50:45 +00:00
}
2018-02-14 20:06:35 +00:00
/* [MS-XLSB] 2.4.820 BrtWsDim */
2017-02-03 20:50:45 +00:00
var parse _BrtWsDim = parse _UncheckedRfX ;
var write _BrtWsDim = write _UncheckedRfX ;
2018-02-14 20:06:35 +00:00
/* [MS-XLSB] 2.4.821 BrtWsFmtInfo */
2018-01-23 09:07:51 +00:00
function parse _BrtWsFmtInfo ( /*::data, length*/ ) {
2017-07-27 20:07:51 +00:00
}
2017-05-09 18:07:57 +00:00
//function write_BrtWsFmtInfo(ws, o) { }
2018-02-14 20:06:35 +00:00
/* [MS-XLSB] 2.4.823 BrtWsProp */
2017-02-03 20:50:45 +00:00
function parse _BrtWsProp ( data , length ) {
var z = { } ;
2021-10-13 07:20:25 +00:00
var f = data [ data . l ] ; ++ data . l ;
z . above = ! ( f & 0x40 ) ;
z . left = ! ( f & 0x80 ) ;
2017-02-03 20:50:45 +00:00
/* TODO: pull flags */
2021-10-13 07:20:25 +00:00
data . l += 18 ;
2017-02-03 20:50:45 +00:00
z . name = parse _XLSBCodeName ( data , length - 19 ) ;
return z ;
}
2021-10-13 07:20:25 +00:00
function write _BrtWsProp ( str , outl , o ) {
2017-05-09 18:07:57 +00:00
if ( o == null ) o = new _buf ( 84 + 4 * str . length ) ;
2021-10-13 07:20:25 +00:00
var f = 0xC0 ;
if ( outl ) {
if ( outl . above ) f &= ~ 0x40 ;
if ( outl . left ) f &= ~ 0x80 ;
}
o . write _shift ( 1 , f ) ;
for ( var i = 1 ; i < 3 ; ++ i ) o . write _shift ( 1 , 0 ) ;
2017-05-09 18:07:57 +00:00
write _BrtColor ( { auto : 1 } , o ) ;
2017-03-31 00:47:35 +00:00
o . write _shift ( - 4 , - 1 ) ;
o . write _shift ( - 4 , - 1 ) ;
write _XLSBCodeName ( str , o ) ;
return o . slice ( 0 , o . l ) ;
}
2017-02-03 20:50:45 +00:00
2018-02-14 20:06:35 +00:00
/* [MS-XLSB] 2.4.306 BrtCellBlank */
2018-01-23 09:07:51 +00:00
function parse _BrtCellBlank ( data ) {
2017-02-03 20:50:45 +00:00
var cell = parse _XLSBCell ( data ) ;
return [ cell ] ;
}
function write _BrtCellBlank ( cell , ncell , o ) {
if ( o == null ) o = new _buf ( 8 ) ;
return write _XLSBCell ( ncell , o ) ;
}
2021-08-18 18:34:02 +00:00
function parse _BrtShortBlank ( data ) {
var cell = parse _XLSBShortCell ( data ) ;
return [ cell ] ;
}
function write _BrtShortBlank ( cell , ncell , o ) {
if ( o == null ) o = new _buf ( 4 ) ;
return write _XLSBShortCell ( ncell , o ) ;
}
2017-02-03 20:50:45 +00:00
2018-02-14 20:06:35 +00:00
/* [MS-XLSB] 2.4.307 BrtCellBool */
2018-01-23 09:07:51 +00:00
function parse _BrtCellBool ( data ) {
2017-02-03 20:50:45 +00:00
var cell = parse _XLSBCell ( data ) ;
var fBool = data . read _shift ( 1 ) ;
return [ cell , fBool , 'b' ] ;
}
function write _BrtCellBool ( cell , ncell , o ) {
if ( o == null ) o = new _buf ( 9 ) ;
write _XLSBCell ( ncell , o ) ;
o . write _shift ( 1 , cell . v ? 1 : 0 ) ;
return o ;
}
2021-08-18 18:34:02 +00:00
function parse _BrtShortBool ( data ) {
var cell = parse _XLSBShortCell ( data ) ;
var fBool = data . read _shift ( 1 ) ;
return [ cell , fBool , 'b' ] ;
}
function write _BrtShortBool ( cell , ncell , o ) {
if ( o == null ) o = new _buf ( 5 ) ;
write _XLSBShortCell ( ncell , o ) ;
o . write _shift ( 1 , cell . v ? 1 : 0 ) ;
return o ;
}
2017-02-03 20:50:45 +00:00
2018-02-14 20:06:35 +00:00
/* [MS-XLSB] 2.4.308 BrtCellError */
2018-01-23 09:07:51 +00:00
function parse _BrtCellError ( data ) {
2017-02-03 20:50:45 +00:00
var cell = parse _XLSBCell ( data ) ;
var bError = data . read _shift ( 1 ) ;
return [ cell , bError , 'e' ] ;
}
2021-08-18 18:34:02 +00:00
function write _BrtCellError ( cell , ncell , o ) {
if ( o == null ) o = new _buf ( 9 ) ;
write _XLSBCell ( ncell , o ) ;
o . write _shift ( 1 , cell . v ) ;
return o ;
}
function parse _BrtShortError ( data ) {
var cell = parse _XLSBShortCell ( data ) ;
var bError = data . read _shift ( 1 ) ;
return [ cell , bError , 'e' ] ;
}
function write _BrtShortError ( cell , ncell , o ) {
if ( o == null ) o = new _buf ( 8 ) ;
write _XLSBShortCell ( ncell , o ) ;
o . write _shift ( 1 , cell . v ) ;
o . write _shift ( 2 , 0 ) ;
o . write _shift ( 1 , 0 ) ;
return o ;
}
2017-02-03 20:50:45 +00:00
2018-02-14 20:06:35 +00:00
/* [MS-XLSB] 2.4.311 BrtCellIsst */
2018-01-23 09:07:51 +00:00
function parse _BrtCellIsst ( data ) {
2017-02-03 20:50:45 +00:00
var cell = parse _XLSBCell ( data ) ;
var isst = data . read _shift ( 4 ) ;
return [ cell , isst , 's' ] ;
}
function write _BrtCellIsst ( cell , ncell , o ) {
if ( o == null ) o = new _buf ( 12 ) ;
write _XLSBCell ( ncell , o ) ;
o . write _shift ( 4 , ncell . v ) ;
return o ;
}
2021-08-18 18:34:02 +00:00
function parse _BrtShortIsst ( data ) {
var cell = parse _XLSBShortCell ( data ) ;
var isst = data . read _shift ( 4 ) ;
return [ cell , isst , 's' ] ;
}
function write _BrtShortIsst ( cell , ncell , o ) {
if ( o == null ) o = new _buf ( 8 ) ;
write _XLSBShortCell ( ncell , o ) ;
o . write _shift ( 4 , ncell . v ) ;
return o ;
}
2017-02-03 20:50:45 +00:00
2018-02-14 20:06:35 +00:00
/* [MS-XLSB] 2.4.313 BrtCellReal */
2018-01-23 09:07:51 +00:00
function parse _BrtCellReal ( data ) {
2017-02-03 20:50:45 +00:00
var cell = parse _XLSBCell ( data ) ;
var value = parse _Xnum ( data ) ;
return [ cell , value , 'n' ] ;
}
function write _BrtCellReal ( cell , ncell , o ) {
if ( o == null ) o = new _buf ( 16 ) ;
write _XLSBCell ( ncell , o ) ;
write _Xnum ( cell . v , o ) ;
return o ;
}
2021-08-18 18:34:02 +00:00
function parse _BrtShortReal ( data ) {
var cell = parse _XLSBShortCell ( data ) ;
var value = parse _Xnum ( data ) ;
return [ cell , value , 'n' ] ;
}
function write _BrtShortReal ( cell , ncell , o ) {
if ( o == null ) o = new _buf ( 12 ) ;
write _XLSBShortCell ( ncell , o ) ;
write _Xnum ( cell . v , o ) ;
return o ;
}
2017-02-03 20:50:45 +00:00
2018-02-14 20:06:35 +00:00
/* [MS-XLSB] 2.4.314 BrtCellRk */
2018-01-23 09:07:51 +00:00
function parse _BrtCellRk ( data ) {
2017-02-03 20:50:45 +00:00
var cell = parse _XLSBCell ( data ) ;
var value = parse _RkNumber ( data ) ;
return [ cell , value , 'n' ] ;
}
function write _BrtCellRk ( cell , ncell , o ) {
if ( o == null ) o = new _buf ( 12 ) ;
write _XLSBCell ( ncell , o ) ;
write _RkNumber ( cell . v , o ) ;
return o ;
}
2021-08-18 18:34:02 +00:00
function parse _BrtShortRk ( data ) {
var cell = parse _XLSBShortCell ( data ) ;
var value = parse _RkNumber ( data ) ;
return [ cell , value , 'n' ] ;
}
function write _BrtShortRk ( cell , ncell , o ) {
if ( o == null ) o = new _buf ( 8 ) ;
write _XLSBShortCell ( ncell , o ) ;
write _RkNumber ( cell . v , o ) ;
return o ;
}
2017-02-03 20:50:45 +00:00
2022-02-10 12:40:50 +00:00
/* [MS-XLSB] 2.4.323 BrtCellRString */
function parse _BrtCellRString ( data ) {
var cell = parse _XLSBCell ( data ) ;
var value = parse _RichStr ( data ) ;
return [ cell , value , 'is' ] ;
}
2017-02-03 20:50:45 +00:00
2018-02-14 20:06:35 +00:00
/* [MS-XLSB] 2.4.317 BrtCellSt */
2018-01-23 09:07:51 +00:00
function parse _BrtCellSt ( data ) {
2017-02-03 20:50:45 +00:00
var cell = parse _XLSBCell ( data ) ;
var value = parse _XLWideString ( data ) ;
return [ cell , value , 'str' ] ;
}
function write _BrtCellSt ( cell , ncell , o ) {
if ( o == null ) o = new _buf ( 12 + 4 * cell . v . length ) ;
write _XLSBCell ( ncell , o ) ;
write _XLWideString ( cell . v , o ) ;
return o . length > o . l ? o . slice ( 0 , o . l ) : o ;
}
2021-08-18 18:34:02 +00:00
function parse _BrtShortSt ( data ) {
var cell = parse _XLSBShortCell ( data ) ;
var value = parse _XLWideString ( data ) ;
return [ cell , value , 'str' ] ;
}
function write _BrtShortSt ( cell , ncell , o ) {
if ( o == null ) o = new _buf ( 8 + 4 * cell . v . length ) ;
write _XLSBShortCell ( ncell , o ) ;
write _XLWideString ( cell . v , o ) ;
return o . length > o . l ? o . slice ( 0 , o . l ) : o ;
}
2017-02-03 20:50:45 +00:00
2018-02-14 20:06:35 +00:00
/* [MS-XLSB] 2.4.653 BrtFmlaBool */
2017-02-03 20:50:45 +00:00
function parse _BrtFmlaBool ( data , length , opts ) {
2017-02-19 20:36:32 +00:00
var end = data . l + length ;
2017-02-03 20:50:45 +00:00
var cell = parse _XLSBCell ( data ) ;
2017-02-19 20:36:32 +00:00
cell . r = opts [ '!row' ] ;
2017-02-03 20:50:45 +00:00
var value = data . read _shift ( 1 ) ;
var o = [ cell , value , 'b' ] ;
if ( opts . cellFormula ) {
2017-02-19 20:36:32 +00:00
data . l += 2 ;
var formula = parse _XLSBCellParsedFormula ( data , end - data . l , opts ) ;
o [ 3 ] = stringify _formula ( formula , null /*range*/ , cell , opts . supbooks , opts ) ; /* TODO */
2017-02-03 20:50:45 +00:00
}
2017-02-19 20:36:32 +00:00
else data . l = end ;
2017-02-03 20:50:45 +00:00
return o ;
}
2018-02-14 20:06:35 +00:00
/* [MS-XLSB] 2.4.654 BrtFmlaError */
2017-02-03 20:50:45 +00:00
function parse _BrtFmlaError ( data , length , opts ) {
2017-02-19 20:36:32 +00:00
var end = data . l + length ;
2017-02-03 20:50:45 +00:00
var cell = parse _XLSBCell ( data ) ;
2017-02-19 20:36:32 +00:00
cell . r = opts [ '!row' ] ;
2017-02-03 20:50:45 +00:00
var value = data . read _shift ( 1 ) ;
var o = [ cell , value , 'e' ] ;
if ( opts . cellFormula ) {
2017-02-19 20:36:32 +00:00
data . l += 2 ;
var formula = parse _XLSBCellParsedFormula ( data , end - data . l , opts ) ;
o [ 3 ] = stringify _formula ( formula , null /*range*/ , cell , opts . supbooks , opts ) ; /* TODO */
2017-02-03 20:50:45 +00:00
}
2017-02-19 20:36:32 +00:00
else data . l = end ;
2017-02-03 20:50:45 +00:00
return o ;
}
2018-02-14 20:06:35 +00:00
/* [MS-XLSB] 2.4.655 BrtFmlaNum */
2017-02-03 20:50:45 +00:00
function parse _BrtFmlaNum ( data , length , opts ) {
2017-02-19 20:36:32 +00:00
var end = data . l + length ;
2017-02-03 20:50:45 +00:00
var cell = parse _XLSBCell ( data ) ;
2017-02-19 20:36:32 +00:00
cell . r = opts [ '!row' ] ;
2017-02-03 20:50:45 +00:00
var value = parse _Xnum ( data ) ;
var o = [ cell , value , 'n' ] ;
if ( opts . cellFormula ) {
2017-02-19 20:36:32 +00:00
data . l += 2 ;
var formula = parse _XLSBCellParsedFormula ( data , end - data . l , opts ) ;
o [ 3 ] = stringify _formula ( formula , null /*range*/ , cell , opts . supbooks , opts ) ; /* TODO */
2017-02-03 20:50:45 +00:00
}
2017-02-19 20:36:32 +00:00
else data . l = end ;
2017-02-03 20:50:45 +00:00
return o ;
}
2018-02-14 20:06:35 +00:00
/* [MS-XLSB] 2.4.656 BrtFmlaString */
2017-02-03 20:50:45 +00:00
function parse _BrtFmlaString ( data , length , opts ) {
2017-02-19 20:36:32 +00:00
var end = data . l + length ;
2017-02-03 20:50:45 +00:00
var cell = parse _XLSBCell ( data ) ;
2017-02-19 20:36:32 +00:00
cell . r = opts [ '!row' ] ;
2017-02-03 20:50:45 +00:00
var value = parse _XLWideString ( data ) ;
var o = [ cell , value , 'str' ] ;
if ( opts . cellFormula ) {
2017-02-19 20:36:32 +00:00
data . l += 2 ;
var formula = parse _XLSBCellParsedFormula ( data , end - data . l , opts ) ;
o [ 3 ] = stringify _formula ( formula , null /*range*/ , cell , opts . supbooks , opts ) ; /* TODO */
2017-02-03 20:50:45 +00:00
}
2017-02-19 20:36:32 +00:00
else data . l = end ;
2017-02-03 20:50:45 +00:00
return o ;
}
2018-02-14 20:06:35 +00:00
/* [MS-XLSB] 2.4.682 BrtMergeCell */
2017-02-03 20:50:45 +00:00
var parse _BrtMergeCell = parse _UncheckedRfX ;
2017-03-16 01:17:24 +00:00
var write _BrtMergeCell = write _UncheckedRfX ;
2018-02-14 20:06:35 +00:00
/* [MS-XLSB] 2.4.107 BrtBeginMergeCells */
2017-03-16 01:17:24 +00:00
function write _BrtBeginMergeCells ( cnt , o ) {
if ( o == null ) o = new _buf ( 4 ) ;
o . write _shift ( 4 , cnt ) ;
return o ;
}
2017-02-03 20:50:45 +00:00
2018-02-14 20:06:35 +00:00
/* [MS-XLSB] 2.4.662 BrtHLink */
2018-01-23 09:07:51 +00:00
function parse _BrtHLink ( data , length /*::, opts*/ ) {
2017-02-03 20:50:45 +00:00
var end = data . l + length ;
var rfx = parse _UncheckedRfX ( data , 16 ) ;
var relId = parse _XLNullableWideString ( data ) ;
var loc = parse _XLWideString ( data ) ;
var tooltip = parse _XLWideString ( data ) ;
var display = parse _XLWideString ( data ) ;
data . l = end ;
2017-10-17 00:14:32 +00:00
var o = ( { rfx : rfx , relId : relId , loc : loc , display : display } /*:any*/ ) ;
if ( tooltip ) o . Tooltip = tooltip ;
return o ;
2017-02-03 20:50:45 +00:00
}
2017-12-15 01:18:40 +00:00
function write _BrtHLink ( l , rId ) {
var o = new _buf ( 50 + 4 * ( l [ 1 ] . Target . length + ( l [ 1 ] . Tooltip || "" ) . length ) ) ;
2017-03-31 00:47:35 +00:00
write _UncheckedRfX ( { s : decode _cell ( l [ 0 ] ) , e : decode _cell ( l [ 0 ] ) } , o ) ;
write _RelID ( "rId" + rId , o ) ;
var locidx = l [ 1 ] . Target . indexOf ( "#" ) ;
2018-01-11 08:01:25 +00:00
var loc = locidx == - 1 ? "" : l [ 1 ] . Target . slice ( locidx + 1 ) ;
2017-05-09 18:07:57 +00:00
write _XLWideString ( loc || "" , o ) ;
2017-03-31 00:47:35 +00:00
write _XLWideString ( l [ 1 ] . Tooltip || "" , o ) ;
write _XLWideString ( "" , o ) ;
return o . slice ( 0 , o . l ) ;
}
2017-02-03 20:50:45 +00:00
2019-11-15 01:46:49 +00:00
/* [MS-XLSB] 2.4.692 BrtPane */
function parse _BrtPane ( /*data, length, opts*/ ) {
}
2017-02-19 20:36:32 +00:00
/* [MS-XLSB] 2.4.6 BrtArrFmla */
function parse _BrtArrFmla ( data , length , opts ) {
var end = data . l + length ;
var rfx = parse _RfX ( data , 16 ) ;
var fAlwaysCalc = data . read _shift ( 1 ) ;
2017-03-12 18:02:43 +00:00
var o = [ rfx ] ; o [ 2 ] = fAlwaysCalc ;
2017-02-19 20:36:32 +00:00
if ( opts . cellFormula ) {
var formula = parse _XLSBArrayParsedFormula ( data , end - data . l , opts ) ;
o [ 1 ] = formula ;
} else data . l = end ;
return o ;
}
2018-02-14 20:06:35 +00:00
/* [MS-XLSB] 2.4.750 BrtShrFmla */
2017-02-19 20:36:32 +00:00
function parse _BrtShrFmla ( data , length , opts ) {
var end = data . l + length ;
var rfx = parse _UncheckedRfX ( data , 16 ) ;
2017-03-12 18:02:43 +00:00
var o = [ rfx ] ;
2017-02-19 20:36:32 +00:00
if ( opts . cellFormula ) {
var formula = parse _XLSBSharedParsedFormula ( data , end - data . l , opts ) ;
o [ 1 ] = formula ;
data . l = end ;
} else data . l = end ;
return o ;
}
2017-03-28 22:03:03 +00:00
/* [MS-XLSB] 2.4.323 BrtColInfo */
/* TODO: once XLS ColInfo is set, combine the functions */
function write _BrtColInfo ( C /*:number*/ , col , o ) {
if ( o == null ) o = new _buf ( 18 ) ;
var p = col _obj _w ( C , col ) ;
o . write _shift ( - 4 , C ) ;
o . write _shift ( - 4 , C ) ;
2017-04-28 07:28:03 +00:00
o . write _shift ( 4 , ( p . width || 10 ) * 256 ) ;
2017-03-28 22:03:03 +00:00
o . write _shift ( 4 , 0 /*ixfe*/ ) ; // style
2017-04-28 07:28:03 +00:00
var flags = 0 ;
if ( col . hidden ) flags |= 0x01 ;
if ( typeof p . width == 'number' ) flags |= 0x02 ;
2019-11-01 03:09:14 +00:00
if ( col . level ) flags |= ( col . level << 8 ) ;
o . write _shift ( 2 , flags ) ; // bit flag
2017-03-28 22:03:03 +00:00
return o ;
}
2018-02-14 20:06:35 +00:00
/* [MS-XLSB] 2.4.678 BrtMargins */
2017-10-17 00:14:32 +00:00
var BrtMarginKeys = [ "left" , "right" , "top" , "bottom" , "header" , "footer" ] ;
2018-01-23 09:07:51 +00:00
function parse _BrtMargins ( data /*::, length, opts*/ ) /*:Margins*/ {
2017-10-17 00:14:32 +00:00
var margins = ( { } /*:any*/ ) ;
BrtMarginKeys . forEach ( function ( k ) { margins [ k ] = parse _Xnum ( data , 8 ) ; } ) ;
return margins ;
2017-04-13 01:29:38 +00:00
}
2017-10-17 00:14:32 +00:00
function write _BrtMargins ( margins /*:Margins*/ , o ) {
2017-04-13 01:29:38 +00:00
if ( o == null ) o = new _buf ( 6 * 8 ) ;
default _margins ( margins ) ;
2017-10-17 00:14:32 +00:00
BrtMarginKeys . forEach ( function ( k ) { write _Xnum ( ( margins /*:any*/ ) [ k ] , o ) ; } ) ;
2017-04-13 01:29:38 +00:00
return o ;
}
2018-02-14 20:06:35 +00:00
/* [MS-XLSB] 2.4.299 BrtBeginWsView */
2018-01-23 09:07:51 +00:00
function parse _BrtBeginWsView ( data /*::, length, opts*/ ) {
2017-12-30 05:40:35 +00:00
var f = data . read _shift ( 2 ) ;
data . l += 28 ;
return { RTL : f & 0x20 } ;
}
2017-12-25 02:25:03 +00:00
function write _BrtBeginWsView ( ws , Workbook , o ) {
2017-04-28 07:28:03 +00:00
if ( o == null ) o = new _buf ( 30 ) ;
2017-12-25 02:25:03 +00:00
var f = 0x39c ;
if ( ( ( ( Workbook || { } ) . Views || [ ] ) [ 0 ] || { } ) . RTL ) f |= 0x20 ;
o . write _shift ( 2 , f ) ; // bit flag
2017-04-28 07:28:03 +00:00
o . write _shift ( 4 , 0 ) ;
o . write _shift ( 4 , 0 ) ; // view first row
o . write _shift ( 4 , 0 ) ; // view first col
o . write _shift ( 1 , 0 ) ; // gridline color ICV
o . write _shift ( 1 , 0 ) ;
o . write _shift ( 2 , 0 ) ;
o . write _shift ( 2 , 100 ) ; // zoom scale
o . write _shift ( 2 , 0 ) ;
o . write _shift ( 2 , 0 ) ;
o . write _shift ( 2 , 0 ) ;
o . write _shift ( 4 , 0 ) ; // workbook view id
return o ;
}
2018-02-14 20:06:35 +00:00
/* [MS-XLSB] 2.4.309 BrtCellIgnoreEC */
function write _BrtCellIgnoreEC ( ref ) {
var o = new _buf ( 24 ) ;
o . write _shift ( 4 , 4 ) ;
o . write _shift ( 4 , 1 ) ;
write _UncheckedRfX ( ref , o ) ;
return o ;
}
/* [MS-XLSB] 2.4.748 BrtSheetProtection */
2017-04-10 05:10:54 +00:00
function write _BrtSheetProtection ( sp , o ) {
if ( o == null ) o = new _buf ( 16 * 4 + 2 ) ;
o . write _shift ( 2 , sp . password ? crypto _CreatePasswordVerifier _Method1 ( sp . password ) : 0 ) ;
o . write _shift ( 4 , 1 ) ; // this record should not be written if no protection
[
[ "objects" , false ] , // fObjects
[ "scenarios" , false ] , // fScenarios
[ "formatCells" , true ] , // fFormatCells
[ "formatColumns" , true ] , // fFormatColumns
[ "formatRows" , true ] , // fFormatRows
[ "insertColumns" , true ] , // fInsertColumns
[ "insertRows" , true ] , // fInsertRows
[ "insertHyperlinks" , true ] , // fInsertHyperlinks
[ "deleteColumns" , true ] , // fDeleteColumns
[ "deleteRows" , true ] , // fDeleteRows
[ "selectLockedCells" , false ] , // fSelLockedCells
[ "sort" , true ] , // fSort
[ "autoFilter" , true ] , // fAutoFilter
[ "pivotTables" , true ] , // fPivotTables
[ "selectUnlockedCells" , false ] // fSelUnlockedCells
] . forEach ( function ( n ) {
2017-05-13 18:21:22 +00:00
/*:: if(o == null) throw "unreachable"; */
2017-04-28 07:28:03 +00:00
if ( n [ 1 ] ) o . write _shift ( 4 , sp [ n [ 0 ] ] != null && ! sp [ n [ 0 ] ] ? 1 : 0 ) ;
else o . write _shift ( 4 , sp [ n [ 0 ] ] != null && sp [ n [ 0 ] ] ? 0 : 1 ) ;
2017-04-10 05:10:54 +00:00
} ) ;
return o ;
}
2019-11-15 01:46:49 +00:00
function parse _BrtDVal ( /*data, length, opts*/ ) {
}
function parse _BrtDVal14 ( /*data, length, opts*/ ) {
}
2017-02-03 20:50:45 +00:00
/* [MS-XLSB] 2.1.7.61 Worksheet */
2017-12-30 05:40:35 +00:00
function parse _ws _bin ( data , _opts , idx , rels , wb /*:WBWBProps*/ , themes , styles ) /*:Worksheet*/ {
2017-02-03 20:50:45 +00:00
if ( ! data ) return data ;
2017-04-08 06:55:35 +00:00
var opts = _opts || { } ;
2017-02-03 20:50:45 +00:00
if ( ! rels ) rels = { '!id' : { } } ;
2017-04-09 04:03:19 +00:00
if ( DENSE != null && opts . dense == null ) opts . dense = DENSE ;
2017-05-13 18:21:22 +00:00
var s /*:Worksheet*/ = ( opts . dense ? [ ] : { } ) ;
2017-02-03 20:50:45 +00:00
var ref ;
var refguess = { s : { r : 2000000 , c : 2000000 } , e : { r : 0 , c : 0 } } ;
2019-11-01 03:09:14 +00:00
var state /*:Array<string>*/ = [ ] ;
2017-02-03 20:50:45 +00:00
var pass = false , end = false ;
2017-05-13 18:21:22 +00:00
var row , p , cf , R , C , addr , sstr , rr , cell /*:Cell*/ ;
2017-12-30 05:40:35 +00:00
var merges /*:Array<Range>*/ = [ ] ;
2017-02-19 20:36:32 +00:00
opts . biff = 12 ;
opts [ '!row' ] = 0 ;
var ai = 0 , af = false ;
2017-12-30 05:40:35 +00:00
var arrayf /*:Array<[Range, string]>*/ = [ ] ;
var sharedf = { } ;
2019-11-01 03:09:14 +00:00
var supbooks = opts . supbooks || /*::(*/ wb /*:: :any)*/ . supbooks || ( [ [ ] ] /*:any*/ ) ;
2017-12-30 05:40:35 +00:00
supbooks . sharedf = sharedf ;
supbooks . arrayf = arrayf ;
2017-04-11 22:15:36 +00:00
supbooks . SheetNames = wb . SheetNames || wb . Sheets . map ( function ( x ) { return x . name ; } ) ;
2017-11-15 18:14:02 +00:00
if ( ! opts . supbooks ) {
opts . supbooks = supbooks ;
2017-12-30 05:40:35 +00:00
if ( wb . Names ) for ( var i = 0 ; i < wb . Names . length ; ++ i ) supbooks [ 0 ] [ i + 1 ] = wb . Names [ i ] ;
2017-11-15 18:14:02 +00:00
}
2017-02-19 20:36:32 +00:00
2017-12-30 05:40:35 +00:00
var colinfo /*:Array<ColInfo>*/ = [ ] , rowinfo /*:Array<RowInfo>*/ = [ ] ;
2017-03-20 09:02:25 +00:00
var seencol = false ;
2021-08-18 18:34:02 +00:00
XLSBRecordEnum [ 0x0010 ] = { n : "BrtShortReal" , f : parse _BrtShortReal } ;
2022-03-03 08:35:39 +00:00
var cm , vm ;
2022-03-16 03:18:09 +00:00
recordhopper ( data , function ws _parse ( val , RR , RT ) {
2017-02-03 20:50:45 +00:00
if ( end ) return ;
2017-04-09 04:03:19 +00:00
switch ( RT ) {
case 0x0094 : /* 'BrtWsDim' */
ref = val ; break ;
case 0x0000 : /* 'BrtRowHdr' */
2017-02-03 20:50:45 +00:00
row = val ;
if ( opts . sheetRows && opts . sheetRows <= row . r ) end = true ;
2017-04-08 06:55:35 +00:00
rr = encode _row ( R = row . r ) ;
2017-02-19 20:36:32 +00:00
opts [ '!row' ] = row . r ;
2017-07-09 17:37:45 +00:00
if ( val . hidden || val . hpt || val . level != null ) {
2017-04-28 07:28:03 +00:00
if ( val . hpt ) val . hpx = pt2px ( val . hpt ) ;
rowinfo [ val . r ] = val ;
}
2017-02-03 20:50:45 +00:00
break ;
2017-04-09 04:03:19 +00:00
case 0x0002 : /* 'BrtCellRk' */
case 0x0003 : /* 'BrtCellError' */
case 0x0004 : /* 'BrtCellBool' */
case 0x0005 : /* 'BrtCellReal' */
case 0x0006 : /* 'BrtCellSt' */
case 0x0007 : /* 'BrtCellIsst' */
case 0x0008 : /* 'BrtFmlaString' */
case 0x0009 : /* 'BrtFmlaNum' */
case 0x000A : /* 'BrtFmlaBool' */
case 0x000B : /* 'BrtFmlaError' */
2021-08-18 18:34:02 +00:00
case 0x000D : /* 'BrtShortRk' */
case 0x000E : /* 'BrtShortError' */
case 0x000F : /* 'BrtShortBool' */
case 0x0010 : /* 'BrtShortReal' */
case 0x0011 : /* 'BrtShortSt' */
case 0x0012 : /* 'BrtShortIsst' */
2022-02-10 12:40:50 +00:00
case 0x003E : /* 'BrtCellRString' */
2017-02-10 19:23:01 +00:00
p = ( { t : val [ 2 ] } /*:any*/ ) ;
2017-02-03 20:50:45 +00:00
switch ( val [ 2 ] ) {
case 'n' : p . v = val [ 1 ] ; break ;
case 's' : sstr = strs [ val [ 1 ] ] ; p . v = sstr . t ; p . r = sstr . r ; break ;
case 'b' : p . v = val [ 1 ] ? true : false ; break ;
2017-04-26 02:27:12 +00:00
case 'e' : p . v = val [ 1 ] ; if ( opts . cellText !== false ) p . w = BErr [ p . v ] ; break ;
2017-09-30 06:18:11 +00:00
case 'str' : p . t = 's' ; p . v = val [ 1 ] ; break ;
2022-02-10 12:40:50 +00:00
case 'is' : p . t = 's' ; p . v = val [ 1 ] . t ; break ;
2017-02-03 20:50:45 +00:00
}
2017-07-27 20:07:51 +00:00
if ( ( cf = styles . CellXf [ val [ 0 ] . iStyleRef ] ) ) safe _format ( p , cf . numFmtId , null , opts , themes , styles ) ;
2021-08-18 18:34:02 +00:00
C = val [ 0 ] . c == - 1 ? C + 1 : val [ 0 ] . c ;
2017-04-08 06:55:35 +00:00
if ( opts . dense ) { if ( ! s [ R ] ) s [ R ] = [ ] ; s [ R ] [ C ] = p ; }
else s [ encode _col ( C ) + rr ] = p ;
2017-02-19 20:36:32 +00:00
if ( opts . cellFormula ) {
af = false ;
2017-12-30 05:40:35 +00:00
for ( ai = 0 ; ai < arrayf . length ; ++ ai ) {
var aii = arrayf [ ai ] ;
2017-02-19 20:36:32 +00:00
if ( row . r >= aii [ 0 ] . s . r && row . r <= aii [ 0 ] . e . r )
if ( C >= aii [ 0 ] . s . c && C <= aii [ 0 ] . e . c ) {
p . F = encode _range ( aii [ 0 ] ) ; af = true ;
}
}
if ( ! af && val . length > 3 ) p . f = val [ 3 ] ;
}
2022-03-03 08:35:39 +00:00
2017-02-03 20:50:45 +00:00
if ( refguess . s . r > row . r ) refguess . s . r = row . r ;
if ( refguess . s . c > C ) refguess . s . c = C ;
if ( refguess . e . r < row . r ) refguess . e . r = row . r ;
if ( refguess . e . c < C ) refguess . e . c = C ;
2022-03-20 05:29:24 +00:00
if ( opts . cellDates && cf && p . t == 'n' && fmt _is _date ( table _fmt [ cf . numFmtId ] ) ) {
var _d = SSF _parse _date _code ( p . v ) ; if ( _d ) { p . t = 'd' ; p . v = new Date ( _d . y , _d . m - 1 , _d . d , _d . H , _d . M , _d . S , _d . u ) ; }
2017-03-21 20:44:35 +00:00
}
2022-03-03 08:35:39 +00:00
if ( cm ) {
2022-03-16 03:18:09 +00:00
if ( cm . type == 'XLDAPR' ) p . D = true ;
2022-03-03 08:35:39 +00:00
cm = void 0 ;
}
if ( vm ) vm = void 0 ;
2017-02-03 20:50:45 +00:00
break ;
2017-04-09 04:03:19 +00:00
case 0x0001 : /* 'BrtCellBlank' */
2021-08-18 18:34:02 +00:00
case 0x000C : /* 'BrtShortBlank' */
2017-07-10 22:18:18 +00:00
if ( ! opts . sheetStubs || pass ) break ;
2022-03-03 08:35:39 +00:00
p = ( { t : 'z' , v : void 0 } /*:any*/ ) ;
2021-08-18 18:34:02 +00:00
C = val [ 0 ] . c == - 1 ? C + 1 : val [ 0 ] . c ;
2017-04-08 06:55:35 +00:00
if ( opts . dense ) { if ( ! s [ R ] ) s [ R ] = [ ] ; s [ R ] [ C ] = p ; }
else s [ encode _col ( C ) + rr ] = p ;
2017-02-03 20:50:45 +00:00
if ( refguess . s . r > row . r ) refguess . s . r = row . r ;
if ( refguess . s . c > C ) refguess . s . c = C ;
if ( refguess . e . r < row . r ) refguess . e . r = row . r ;
if ( refguess . e . c < C ) refguess . e . c = C ;
2022-03-03 08:35:39 +00:00
if ( cm ) {
2022-03-16 03:18:09 +00:00
if ( cm . type == 'XLDAPR' ) p . D = true ;
2022-03-03 08:35:39 +00:00
cm = void 0 ;
}
if ( vm ) vm = void 0 ;
2017-02-03 20:50:45 +00:00
break ;
2017-04-09 04:03:19 +00:00
case 0x00B0 : /* 'BrtMergeCell' */
2017-12-30 05:40:35 +00:00
merges . push ( val ) ; break ;
2017-02-03 20:50:45 +00:00
2022-03-03 08:35:39 +00:00
case 0x0031 : { /* 'BrtCellMeta' */
2022-03-16 03:18:09 +00:00
cm = ( ( opts . xlmeta || { } ) . Cell || [ ] ) [ val - 1 ] ;
2022-03-03 08:35:39 +00:00
} break ;
2017-04-09 04:03:19 +00:00
case 0x01EE : /* 'BrtHLink' */
2017-02-03 20:50:45 +00:00
var rel = rels [ '!id' ] [ val . relId ] ;
if ( rel ) {
val . Target = rel . Target ;
if ( val . loc ) val . Target += "#" + val . loc ;
val . Rel = rel ;
2017-12-15 01:18:40 +00:00
} else if ( val . relId == '' ) {
val . Target = "#" + val . loc ;
2017-02-03 20:50:45 +00:00
}
for ( R = val . rfx . s . r ; R <= val . rfx . e . r ; ++ R ) for ( C = val . rfx . s . c ; C <= val . rfx . e . c ; ++ C ) {
2017-04-08 06:55:35 +00:00
if ( opts . dense ) {
if ( ! s [ R ] ) s [ R ] = [ ] ;
if ( ! s [ R ] [ C ] ) s [ R ] [ C ] = { t : 'z' , v : undefined } ;
s [ R ] [ C ] . l = val ;
} else {
addr = encode _cell ( { c : C , r : R } ) ;
if ( ! s [ addr ] ) s [ addr ] = { t : 'z' , v : undefined } ;
s [ addr ] . l = val ;
}
2017-02-03 20:50:45 +00:00
}
break ;
2017-04-09 04:03:19 +00:00
case 0x01AA : /* 'BrtArrFmla' */
2017-04-08 06:55:35 +00:00
if ( ! opts . cellFormula ) break ;
2017-12-30 05:40:35 +00:00
arrayf . push ( val ) ;
2017-05-13 18:21:22 +00:00
cell = ( ( opts . dense ? s [ R ] [ C ] : s [ encode _col ( C ) + rr ] ) /*:any*/ ) ;
2017-04-08 06:55:35 +00:00
cell . f = stringify _formula ( val [ 1 ] , refguess , { r : row . r , c : C } , supbooks , opts ) ;
cell . F = encode _range ( val [ 0 ] ) ;
2017-02-19 20:36:32 +00:00
break ;
2017-04-09 04:03:19 +00:00
case 0x01AB : /* 'BrtShrFmla' */
2017-04-08 06:55:35 +00:00
if ( ! opts . cellFormula ) break ;
2017-12-30 05:40:35 +00:00
sharedf [ encode _cell ( val [ 0 ] . s ) ] = val [ 1 ] ;
2017-04-08 06:55:35 +00:00
cell = ( opts . dense ? s [ R ] [ C ] : s [ encode _col ( C ) + rr ] ) ;
cell . f = stringify _formula ( val [ 1 ] , refguess , { r : row . r , c : C } , supbooks , opts ) ;
2017-02-19 20:36:32 +00:00
break ;
2017-03-20 09:02:25 +00:00
/* identical to 'ColInfo' in XLS */
2017-04-09 04:03:19 +00:00
case 0x003C : /* 'BrtColInfo' */
2017-03-20 09:02:25 +00:00
if ( ! opts . cellStyles ) break ;
while ( val . e >= val . s ) {
2019-11-01 03:09:14 +00:00
colinfo [ val . e -- ] = { width : val . w / 256 , hidden : ! ! ( val . flags & 0x01 ) , level : val . level } ;
2017-03-20 09:02:25 +00:00
if ( ! seencol ) { seencol = true ; find _mdw _colw ( val . w / 256 ) ; }
process _col ( colinfo [ val . e + 1 ] ) ;
}
2017-04-08 06:55:35 +00:00
break ;
2017-02-03 20:50:45 +00:00
2017-04-10 05:10:54 +00:00
case 0x00A1 : /* 'BrtBeginAFilter' */
s [ '!autofilter' ] = { ref : encode _range ( val ) } ;
break ;
2017-04-13 01:29:38 +00:00
case 0x01DC : /* 'BrtMargins' */
s [ '!margins' ] = val ;
break ;
2017-11-20 01:51:14 +00:00
case 0x0093 : /* 'BrtWsProp' */
if ( ! wb . Sheets [ idx ] ) wb . Sheets [ idx ] = { } ;
if ( val . name ) wb . Sheets [ idx ] . CodeName = val . name ;
2021-10-13 07:20:25 +00:00
if ( val . above || val . left ) s [ '!outline' ] = { above : val . above , left : val . left } ;
2017-11-20 01:51:14 +00:00
break ;
2017-12-30 05:40:35 +00:00
case 0x0089 : /* 'BrtBeginWsView' */
if ( ! wb . Views ) wb . Views = [ { } ] ;
if ( ! wb . Views [ 0 ] ) wb . Views [ 0 ] = { } ;
if ( val . RTL ) wb . Views [ 0 ] . RTL = true ;
break ;
2017-07-10 22:18:18 +00:00
case 0x01E5 : /* 'BrtWsFmtInfo' */
2018-01-23 09:07:51 +00:00
break ;
2019-11-01 03:09:14 +00:00
case 0x0040 : /* 'BrtDVal' */
case 0x041D : /* 'BrtDVal14' */
break ;
case 0x0097 : /* 'BrtPane' */
break ;
2021-08-18 18:34:02 +00:00
case 0x0098 : /* 'BrtSel' */
2017-04-09 04:03:19 +00:00
case 0x00AF : /* 'BrtAFilterDateGroupItem' */
case 0x0284 : /* 'BrtActiveX' */
case 0x0271 : /* 'BrtBigName' */
case 0x0232 : /* 'BrtBkHim' */
case 0x018C : /* 'BrtBrk' */
case 0x0458 : /* 'BrtCFIcon' */
case 0x047A : /* 'BrtCFRuleExt' */
case 0x01D7 : /* 'BrtCFVO' */
case 0x041A : /* 'BrtCFVO14' */
case 0x0289 : /* 'BrtCellIgnoreEC' */
case 0x0451 : /* 'BrtCellIgnoreEC14' */
case 0x024D : /* 'BrtCellSmartTagProperty' */
case 0x025F : /* 'BrtCellWatch' */
case 0x0234 : /* 'BrtColor' */
case 0x041F : /* 'BrtColor14' */
case 0x00A8 : /* 'BrtColorFilter' */
case 0x00AE : /* 'BrtCustomFilter' */
case 0x049C : /* 'BrtCustomFilter14' */
case 0x01F3 : /* 'BrtDRef' */
2020-07-16 21:47:39 +00:00
case 0x01FB : /* 'BrtDXF' */
2017-04-09 04:03:19 +00:00
case 0x0226 : /* 'BrtDrawing' */
case 0x00AB : /* 'BrtDynamicFilter' */
case 0x00A7 : /* 'BrtFilter' */
case 0x0499 : /* 'BrtFilter14' */
case 0x00A9 : /* 'BrtIconFilter' */
case 0x049D : /* 'BrtIconFilter14' */
case 0x0227 : /* 'BrtLegacyDrawing' */
case 0x0228 : /* 'BrtLegacyDrawingHF' */
case 0x0295 : /* 'BrtListPart' */
case 0x027F : /* 'BrtOleObject' */
case 0x01DE : /* 'BrtPageSetup' */
case 0x0219 : /* 'BrtPhoneticInfo' */
case 0x01DD : /* 'BrtPrintOptions' */
case 0x0218 : /* 'BrtRangeProtection' */
case 0x044F : /* 'BrtRangeProtection14' */
case 0x02A8 : /* 'BrtRangeProtectionIso' */
case 0x0450 : /* 'BrtRangeProtectionIso14' */
case 0x0400 : /* 'BrtRwDescent' */
case 0x0297 : /* 'BrtSheetCalcProp' */
case 0x0217 : /* 'BrtSheetProtection' */
case 0x02A6 : /* 'BrtSheetProtectionIso' */
case 0x01F8 : /* 'BrtSlc' */
case 0x0413 : /* 'BrtSparkline' */
case 0x01AC : /* 'BrtTable' */
case 0x00AA : /* 'BrtTop10Filter' */
2018-03-19 21:42:55 +00:00
case 0x0C00 : /* 'BrtUid' */
2017-04-09 04:03:19 +00:00
case 0x0032 : /* 'BrtValueMeta' */
case 0x0816 : /* 'BrtWebExtension' */
case 0x0415 : /* 'BrtWsFmtInfoEx14' */
break ;
case 0x0023 : /* 'BrtFRTBegin' */
pass = true ; break ;
case 0x0024 : /* 'BrtFRTEnd' */
pass = false ; break ;
2019-11-01 03:09:14 +00:00
case 0x0025 : /* 'BrtACBegin' */
2022-03-12 14:05:57 +00:00
state . push ( RT ) ; pass = true ; break ;
2019-11-01 03:09:14 +00:00
case 0x0026 : /* 'BrtACEnd' */
state . pop ( ) ; pass = false ; break ;
2017-02-03 20:50:45 +00:00
2017-04-08 06:55:35 +00:00
default :
2022-03-16 03:18:09 +00:00
if ( RR . T ) { /* empty */ }
2022-03-12 14:05:57 +00:00
else if ( ! pass || opts . WTF ) throw new Error ( "Unexpected record 0x" + RT . toString ( 16 ) ) ;
2017-02-03 20:50:45 +00:00
}
} , opts ) ;
2017-02-19 20:36:32 +00:00
delete opts . supbooks ;
delete opts [ '!row' ] ;
2017-02-10 19:23:01 +00:00
if ( ! s [ "!ref" ] && ( refguess . s . r < 2000000 || ref && ( ref . e . r > 0 || ref . e . c > 0 || ref . s . r > 0 || ref . s . c > 0 ) ) ) s [ "!ref" ] = encode _range ( ref || refguess ) ;
2017-02-03 20:50:45 +00:00
if ( opts . sheetRows && s [ "!ref" ] ) {
var tmpref = safe _decode _range ( s [ "!ref" ] ) ;
2018-04-06 06:39:48 +00:00
if ( opts . sheetRows <= + tmpref . e . r ) {
2017-02-03 20:50:45 +00:00
tmpref . e . r = opts . sheetRows - 1 ;
if ( tmpref . e . r > refguess . e . r ) tmpref . e . r = refguess . e . r ;
if ( tmpref . e . r < tmpref . s . r ) tmpref . s . r = tmpref . e . r ;
if ( tmpref . e . c > refguess . e . c ) tmpref . e . c = refguess . e . c ;
if ( tmpref . e . c < tmpref . s . c ) tmpref . s . c = tmpref . e . c ;
s [ "!fullref" ] = s [ "!ref" ] ;
s [ "!ref" ] = encode _range ( tmpref ) ;
}
}
2017-12-30 05:40:35 +00:00
if ( merges . length > 0 ) s [ "!merges" ] = merges ;
2017-03-20 09:02:25 +00:00
if ( colinfo . length > 0 ) s [ "!cols" ] = colinfo ;
if ( rowinfo . length > 0 ) s [ "!rows" ] = rowinfo ;
2017-02-03 20:50:45 +00:00
return s ;
}
/* TODO: something useful -- this is a stub */
2021-08-18 18:34:02 +00:00
function write _ws _bin _cell ( ba /*:BufArray*/ , cell /*:Cell*/ , R /*:number*/ , C /*:number*/ , opts , ws /*:Worksheet*/ , last _seen /*:boolean*/ ) /*:boolean*/ {
2022-04-25 09:02:14 +00:00
var o /*:any*/ = ( { r : R , c : C } /*:any*/ ) ;
if ( cell . c ) ws [ '!comments' ] . push ( [ encode _cell ( o ) , cell . c ] ) ;
2021-08-18 18:34:02 +00:00
if ( cell . v === undefined ) return false ;
2017-10-17 00:14:32 +00:00
var vv = "" ;
2017-02-03 20:50:45 +00:00
switch ( cell . t ) {
case 'b' : vv = cell . v ? "1" : "0" ; break ;
2017-03-28 22:03:03 +00:00
case 'd' : // no BrtCellDate :(
2017-10-17 00:14:32 +00:00
cell = dup ( cell ) ;
2022-03-20 05:29:24 +00:00
cell . z = cell . z || table _fmt [ 14 ] ;
2017-10-17 00:14:32 +00:00
cell . v = datenum ( parseDate ( cell . v ) ) ; cell . t = 'n' ;
2017-03-28 22:03:03 +00:00
break ;
/* falls through */
2017-02-03 20:50:45 +00:00
case 'n' : case 'e' : vv = '' + cell . v ; break ;
default : vv = cell . v ; break ;
}
/* TODO: cell style */
2017-05-09 18:07:57 +00:00
o . s = get _cell _style ( opts . cellXfs , cell , opts ) ;
2017-03-31 00:47:35 +00:00
if ( cell . l ) ws [ '!links' ] . push ( [ encode _cell ( o ) , cell . l ] ) ;
2017-02-03 20:50:45 +00:00
switch ( cell . t ) {
case 's' : case 'str' :
if ( opts . bookSST ) {
2018-06-22 21:40:01 +00:00
vv = get _sst _id ( opts . Strings , ( cell . v /*:any*/ ) , opts . revStrings ) ;
2017-02-03 20:50:45 +00:00
o . t = "s" ; o . v = vv ;
2022-03-12 14:05:57 +00:00
if ( last _seen ) write _record ( ba , 0x0012 /* BrtShortIsst */ , write _BrtShortIsst ( cell , o ) ) ;
else write _record ( ba , 0x0007 /* BrtCellIsst */ , write _BrtCellIsst ( cell , o ) ) ;
2017-02-03 20:50:45 +00:00
} else {
o . t = "str" ;
2022-03-12 14:05:57 +00:00
if ( last _seen ) write _record ( ba , 0x0011 /* BrtShortSt */ , write _BrtShortSt ( cell , o ) ) ;
else write _record ( ba , 0x0006 /* BrtCellSt */ , write _BrtCellSt ( cell , o ) ) ;
2017-02-03 20:50:45 +00:00
}
2021-08-18 18:34:02 +00:00
return true ;
2017-02-03 20:50:45 +00:00
case 'n' :
/* TODO: determine threshold for Real vs RK */
2021-08-18 18:34:02 +00:00
if ( cell . v == ( cell . v | 0 ) && cell . v > - 1000 && cell . v < 1000 ) {
2022-03-12 14:05:57 +00:00
if ( last _seen ) write _record ( ba , 0x000D /* BrtShortRk */ , write _BrtShortRk ( cell , o ) ) ;
else write _record ( ba , 0x0002 /* BrtCellRk */ , write _BrtCellRk ( cell , o ) ) ;
2021-08-18 18:34:02 +00:00
} else {
2022-03-12 14:05:57 +00:00
if ( last _seen ) write _record ( ba , 0x0010 /* BrtShortReal */ , write _BrtShortReal ( cell , o ) ) ;
else write _record ( ba , 0x0005 /* BrtCellReal */ , write _BrtCellReal ( cell , o ) ) ;
2021-08-18 18:34:02 +00:00
} return true ;
2017-02-03 20:50:45 +00:00
case 'b' :
o . t = "b" ;
2022-03-12 14:05:57 +00:00
if ( last _seen ) write _record ( ba , 0x000F /* BrtShortBool */ , write _BrtShortBool ( cell , o ) ) ;
else write _record ( ba , 0x0004 /* BrtCellBool */ , write _BrtCellBool ( cell , o ) ) ;
2021-08-18 18:34:02 +00:00
return true ;
case 'e' :
o . t = "e" ;
2022-03-12 14:05:57 +00:00
if ( last _seen ) write _record ( ba , 0x000E /* BrtShortError */ , write _BrtShortError ( cell , o ) ) ;
else write _record ( ba , 0x0003 /* BrtCellError */ , write _BrtCellError ( cell , o ) ) ;
2021-08-18 18:34:02 +00:00
return true ;
}
2022-03-12 14:05:57 +00:00
if ( last _seen ) write _record ( ba , 0x000C /* BrtShortBlank */ , write _BrtShortBlank ( cell , o ) ) ;
else write _record ( ba , 0x0001 /* BrtCellBlank */ , write _BrtCellBlank ( cell , o ) ) ;
2021-08-18 18:34:02 +00:00
return true ;
2017-02-03 20:50:45 +00:00
}
2018-01-23 09:07:51 +00:00
function write _CELLTABLE ( ba , ws /*:Worksheet*/ , idx /*:number*/ , opts /*::, wb:Workbook*/ ) {
2017-12-30 05:40:35 +00:00
var range = safe _decode _range ( ws [ '!ref' ] || "A1" ) , ref , rr = "" , cols /*:Array<string>*/ = [ ] ;
2022-03-12 14:05:57 +00:00
write _record ( ba , 0x0091 /* BrtBeginSheetData */ ) ;
2017-04-08 06:55:35 +00:00
var dense = Array . isArray ( ws ) ;
2017-07-09 17:37:45 +00:00
var cap = range . e . r ;
if ( ws [ '!rows' ] ) cap = Math . max ( range . e . r , ws [ '!rows' ] . length - 1 ) ;
for ( var R = range . s . r ; R <= cap ; ++ R ) {
2017-02-03 20:50:45 +00:00
rr = encode _row ( R ) ;
/* [ACCELLTABLE] */
/* BrtRowHdr */
write _row _header ( ba , ws , range , R ) ;
2021-08-18 18:34:02 +00:00
var last _seen = false ;
2017-07-09 17:37:45 +00:00
if ( R <= range . e . r ) for ( var C = range . s . c ; C <= range . e . c ; ++ C ) {
2017-02-03 20:50:45 +00:00
/* *16384CELL */
if ( R === range . s . r ) cols [ C ] = encode _col ( C ) ;
ref = cols [ C ] + rr ;
2017-04-08 06:55:35 +00:00
var cell = dense ? ( ws [ R ] || [ ] ) [ C ] : ws [ ref ] ;
2021-08-18 18:34:02 +00:00
if ( ! cell ) { last _seen = false ; continue ; }
2017-02-03 20:50:45 +00:00
/* write cell */
2021-08-18 18:34:02 +00:00
last _seen = write _ws _bin _cell ( ba , cell , R , C , opts , ws , last _seen ) ;
2017-02-03 20:50:45 +00:00
}
}
2022-03-12 14:05:57 +00:00
write _record ( ba , 0x0092 /* BrtEndSheetData */ ) ;
2017-02-03 20:50:45 +00:00
}
2017-03-16 01:17:24 +00:00
function write _MERGECELLS ( ba , ws /*:Worksheet*/ ) {
if ( ! ws || ! ws [ '!merges' ] ) return ;
2022-03-12 14:05:57 +00:00
write _record ( ba , 0x00B1 /* BrtBeginMergeCells */ , write _BrtBeginMergeCells ( ws [ '!merges' ] . length ) ) ;
ws [ '!merges' ] . forEach ( function ( m ) { write _record ( ba , 0x00B0 /* BrtMergeCell */ , write _BrtMergeCell ( m ) ) ; } ) ;
write _record ( ba , 0x00B2 /* BrtEndMergeCells */ ) ;
2017-03-16 01:17:24 +00:00
}
2018-01-23 09:07:51 +00:00
function write _COLINFOS ( ba , ws /*:Worksheet*/ /*::, idx:number, opts, wb:Workbook*/ ) {
2017-03-28 22:03:03 +00:00
if ( ! ws || ! ws [ '!cols' ] ) return ;
2022-03-12 14:05:57 +00:00
write _record ( ba , 0x0186 /* BrtBeginColInfos */ ) ;
ws [ '!cols' ] . forEach ( function ( m , i ) { if ( m ) write _record ( ba , 0x003C /* 'BrtColInfo' */ , write _BrtColInfo ( i , m ) ) ; } ) ;
write _record ( ba , 0x0187 /* BrtEndColInfos */ ) ;
2017-03-28 22:03:03 +00:00
}
2018-02-14 20:06:35 +00:00
function write _IGNOREECS ( ba , ws /*:Worksheet*/ ) {
if ( ! ws || ! ws [ '!ref' ] ) return ;
2022-03-12 14:05:57 +00:00
write _record ( ba , 0x0288 /* BrtBeginCellIgnoreECs */ ) ;
write _record ( ba , 0x0289 /* BrtCellIgnoreEC */ , write _BrtCellIgnoreEC ( safe _decode _range ( ws [ '!ref' ] ) ) ) ;
write _record ( ba , 0x028A /* BrtEndCellIgnoreECs */ ) ;
2018-02-14 20:06:35 +00:00
}
2017-03-31 00:47:35 +00:00
function write _HLINKS ( ba , ws /*:Worksheet*/ , rels ) {
/* *BrtHLink */
ws [ '!links' ] . forEach ( function ( l ) {
if ( ! l [ 1 ] . Target ) return ;
var rId = add _rels ( rels , - 1 , l [ 1 ] . Target . replace ( /#.*$/ , "" ) , RELS . HLINK ) ;
2022-03-12 14:05:57 +00:00
write _record ( ba , 0x01EE /* BrtHLink */ , write _BrtHLink ( l , rId ) ) ;
2017-03-31 00:47:35 +00:00
} ) ;
delete ws [ '!links' ] ;
}
2017-04-02 06:47:25 +00:00
function write _LEGACYDRAWING ( ba , ws /*:Worksheet*/ , idx /*:number*/ , rels ) {
/* [BrtLegacyDrawing] */
if ( ws [ '!comments' ] . length > 0 ) {
var rId = add _rels ( rels , - 1 , "../drawings/vmlDrawing" + ( idx + 1 ) + ".vml" , RELS . VML ) ;
2022-03-12 14:05:57 +00:00
write _record ( ba , 0x0227 /* BrtLegacyDrawing */ , write _RelID ( "rId" + rId ) ) ;
2017-04-02 06:47:25 +00:00
ws [ '!legacy' ] = rId ;
}
}
2017-03-31 00:47:35 +00:00
2019-11-01 03:09:14 +00:00
function write _AUTOFILTER ( ba , ws , wb , idx ) {
2017-04-10 05:10:54 +00:00
if ( ! ws [ '!autofilter' ] ) return ;
2019-11-01 03:09:14 +00:00
var data = ws [ '!autofilter' ] ;
var ref = typeof data . ref === "string" ? data . ref : encode _range ( data . ref ) ;
/* Update FilterDatabase defined name for the worksheet */
if ( ! wb . Workbook ) wb . Workbook = ( { Sheets : [ ] } /*:any*/ ) ;
if ( ! wb . Workbook . Names ) wb . Workbook . Names = [ ] ;
var names /*: Array<any> */ = wb . Workbook . Names ;
var range = decode _range ( ref ) ;
if ( range . s . r == range . e . r ) { range . e . r = decode _range ( ws [ "!ref" ] ) . e . r ; ref = encode _range ( range ) ; }
for ( var i = 0 ; i < names . length ; ++ i ) {
var name = names [ i ] ;
if ( name . Name != '_xlnm._FilterDatabase' ) continue ;
if ( name . Sheet != idx ) continue ;
2022-05-30 08:40:51 +00:00
name . Ref = formula _quote _sheet _name ( wb . SheetNames [ idx ] ) + "!" + fix _range ( ref ) ; break ;
2019-11-01 03:09:14 +00:00
}
2022-05-30 08:40:51 +00:00
if ( i == names . length ) names . push ( { Name : '_xlnm._FilterDatabase' , Sheet : idx , Ref : formula _quote _sheet _name ( wb . SheetNames [ idx ] ) + "!" + fix _range ( ref ) } ) ;
2019-11-01 03:09:14 +00:00
2022-03-12 14:05:57 +00:00
write _record ( ba , 0x00A1 /* BrtBeginAFilter */ , write _UncheckedRfX ( safe _decode _range ( ref ) ) ) ;
2017-04-10 05:10:54 +00:00
/* *FILTERCOLUMN */
/* [SORTSTATE] */
/* BrtEndAFilter */
2022-03-12 14:05:57 +00:00
write _record ( ba , 0x00A2 /* BrtEndAFilter */ ) ;
2017-04-10 05:10:54 +00:00
}
2017-12-25 02:25:03 +00:00
function write _WSVIEWS2 ( ba , ws , Workbook ) {
2022-03-12 14:05:57 +00:00
write _record ( ba , 0x0085 /* BrtBeginWsViews */ ) ;
2017-04-28 07:28:03 +00:00
{ /* 1*WSVIEW2 */
/* [ACUID] */
2022-03-12 14:05:57 +00:00
write _record ( ba , 0x0089 /* BrtBeginWsView */ , write _BrtBeginWsView ( ws , Workbook ) ) ;
2017-04-28 07:28:03 +00:00
/* [BrtPane] */
/* *4BrtSel */
/* *4SXSELECT */
/* *FRT */
2022-03-12 14:05:57 +00:00
write _record ( ba , 0x008A /* BrtEndWsView */ ) ;
2017-04-28 07:28:03 +00:00
}
/* *FRT */
2022-03-12 14:05:57 +00:00
write _record ( ba , 0x0086 /* BrtEndWsViews */ ) ;
2017-04-28 07:28:03 +00:00
}
2018-01-23 09:07:51 +00:00
function write _WSFMTINFO ( /*::ba, ws*/ ) {
2017-05-09 18:07:57 +00:00
/* [ACWSFMTINFO] */
2022-03-12 14:05:57 +00:00
// write_record(ba, 0x01E5 /* BrtWsFmtInfo */, write_BrtWsFmtInfo(ws));
2017-05-09 18:07:57 +00:00
}
2017-04-10 05:10:54 +00:00
function write _SHEETPROTECT ( ba , ws ) {
if ( ! ws [ '!protect' ] ) return ;
/* [BrtSheetProtectionIso] */
2022-03-12 14:05:57 +00:00
write _record ( ba , 0x0217 /* BrtSheetProtection */ , write _BrtSheetProtection ( ws [ '!protect' ] ) ) ;
2017-04-10 05:10:54 +00:00
}
2017-03-31 00:47:35 +00:00
function write _ws _bin ( idx /*:number*/ , opts , wb /*:Workbook*/ , rels ) {
2017-02-03 20:50:45 +00:00
var ba = buf _array ( ) ;
var s = wb . SheetNames [ idx ] , ws = wb . Sheets [ s ] || { } ;
2017-11-20 01:51:14 +00:00
var c /*:string*/ = s ; try { if ( wb && wb . Workbook ) c = wb . Workbook . Sheets [ idx ] . CodeName || c ; } catch ( e ) { }
2017-02-03 20:50:45 +00:00
var r = safe _decode _range ( ws [ '!ref' ] || "A1" ) ;
2018-04-27 20:11:18 +00:00
if ( r . e . c > 0x3FFF || r . e . r > 0xFFFFF ) {
if ( opts . WTF ) throw new Error ( "Range " + ( ws [ '!ref' ] || "A1" ) + " exceeds format limit A1:XFD1048576" ) ;
r . e . c = Math . min ( r . e . c , 0x3FFF ) ;
r . e . r = Math . min ( r . e . c , 0xFFFFF ) ;
}
2017-03-31 00:47:35 +00:00
ws [ '!links' ] = [ ] ;
2017-04-02 06:47:25 +00:00
/* passed back to write_zip and removed there */
ws [ '!comments' ] = [ ] ;
2022-03-12 14:05:57 +00:00
write _record ( ba , 0x0081 /* BrtBeginSheet */ ) ;
if ( wb . vbaraw || ws [ '!outline' ] ) write _record ( ba , 0x0093 /* BrtWsProp */ , write _BrtWsProp ( c , ws [ '!outline' ] ) ) ;
write _record ( ba , 0x0094 /* BrtWsDim */ , write _BrtWsDim ( r ) ) ;
2017-12-25 02:25:03 +00:00
write _WSVIEWS2 ( ba , ws , wb . Workbook ) ;
2017-05-09 18:07:57 +00:00
write _WSFMTINFO ( ba , ws ) ;
2017-03-28 22:03:03 +00:00
write _COLINFOS ( ba , ws , idx , opts , wb ) ;
2017-02-03 20:50:45 +00:00
write _CELLTABLE ( ba , ws , idx , opts , wb ) ;
/* [BrtSheetCalcProp] */
2017-04-10 05:10:54 +00:00
write _SHEETPROTECT ( ba , ws ) ;
2017-02-03 20:50:45 +00:00
/* *([BrtRangeProtectionIso] BrtRangeProtection) */
/* [SCENMAN] */
2019-11-01 03:09:14 +00:00
write _AUTOFILTER ( ba , ws , wb , idx ) ;
2017-02-03 20:50:45 +00:00
/* [SORTSTATE] */
/* [DCON] */
/* [USERSHVIEWS] */
2017-03-16 01:17:24 +00:00
write _MERGECELLS ( ba , ws ) ;
2017-02-03 20:50:45 +00:00
/* [BrtPhoneticInfo] */
/* *CONDITIONALFORMATTING */
/* [DVALS] */
2017-03-31 00:47:35 +00:00
write _HLINKS ( ba , ws , rels ) ;
2017-02-03 20:50:45 +00:00
/* [BrtPrintOptions] */
2022-03-12 14:05:57 +00:00
if ( ws [ '!margins' ] ) write _record ( ba , 0x01DC /* BrtMargins */ , write _BrtMargins ( ws [ '!margins' ] ) ) ;
2017-02-03 20:50:45 +00:00
/* [BrtPageSetup] */
/* [HEADERFOOTER] */
/* [RWBRK] */
/* [COLBRK] */
/* *BrtBigName */
/* [CELLWATCHES] */
2018-08-15 19:22:47 +00:00
if ( ! opts || opts . ignoreEC || ( opts . ignoreEC == ( void 0 ) ) ) write _IGNOREECS ( ba , ws ) ;
2017-02-03 20:50:45 +00:00
/* [SMARTTAGS] */
/* [BrtDrawing] */
2017-04-02 06:47:25 +00:00
write _LEGACYDRAWING ( ba , ws , idx , rels ) ;
2017-02-03 20:50:45 +00:00
/* [BrtLegacyDrawingHF] */
/* [BrtBkHim] */
/* [OLEOBJECTS] */
/* [ACTIVEXCONTROLS] */
/* [WEBPUBITEMS] */
/* [LISTPARTS] */
/* FRTWORKSHEET */
2022-03-12 14:05:57 +00:00
write _record ( ba , 0x0082 /* BrtEndSheet */ ) ;
2017-02-03 20:50:45 +00:00
return ba . end ( ) ;
}
2019-11-01 03:09:14 +00:00
function parse _Cache ( data /*:string*/ ) /*:[Array<number|string>, string, ?string]*/ {
var col /*:Array<number|string>*/ = [ ] ;
var num = data . match ( /^<c:numCache>/ ) ;
var f ;
2017-03-27 21:35:15 +00:00
/* 21.2.2.150 pt CT_NumVal */
( data . match ( /<c:pt idx="(\d*)">(.*?)<\/c:pt>/mg ) || [ ] ) . forEach ( function ( pt ) {
2018-02-21 07:01:34 +00:00
var q = pt . match ( /<c:pt idx="(\d*?)"><c:v>(.*)<\/c:v><\/c:pt>/ ) ;
2017-03-27 21:35:15 +00:00
if ( ! q ) return ;
2019-11-01 03:09:14 +00:00
col [ + q [ 1 ] ] = num ? + q [ 2 ] : q [ 2 ] ;
2017-03-27 21:35:15 +00:00
} ) ;
/* 21.2.2.71 formatCode CT_Xstring */
2017-07-05 22:27:54 +00:00
var nf = unescapexml ( ( data . match ( /<c:formatCode>([\s\S]*?)<\/c:formatCode>/ ) || [ "" , "General" ] ) [ 1 ] ) ;
2017-03-27 21:35:15 +00:00
2019-11-01 03:09:14 +00:00
( data . match ( /<c:f>(.*?)<\/c:f>/mg ) || [ ] ) . forEach ( function ( F ) { f = F . replace ( /<.*?>/g , "" ) ; } ) ;
return [ col , nf , f ] ;
2017-03-27 21:35:15 +00:00
}
/* 21.2 DrawingML - Charts */
2017-12-30 05:40:35 +00:00
function parse _chart ( data /*:?string*/ , name /*:string*/ , opts , rels , wb , csheet ) {
var cs /*:Worksheet*/ = ( ( csheet || { "!type" : "chart" } ) /*:any*/ ) ;
2017-03-27 21:35:15 +00:00
if ( ! data ) return csheet ;
/* 21.2.2.27 chart CT_Chart */
var C = 0 , R = 0 , col = "A" ;
var refguess = { s : { r : 2000000 , c : 2000000 } , e : { r : 0 , c : 0 } } ;
/* 21.2.2.120 numCache CT_NumData */
2017-07-05 22:27:54 +00:00
( data . match ( /<c:numCache>[\s\S]*?<\/c:numCache>/gm ) || [ ] ) . forEach ( function ( nc ) {
2019-11-01 03:09:14 +00:00
var cache = parse _Cache ( nc ) ;
2017-03-27 21:35:15 +00:00
refguess . s . r = refguess . s . c = 0 ;
refguess . e . c = C ;
col = encode _col ( C ) ;
cache [ 0 ] . forEach ( function ( n , i ) {
cs [ col + encode _row ( i ) ] = { t : 'n' , v : n , z : cache [ 1 ] } ;
R = i ;
} ) ;
if ( refguess . e . r < R ) refguess . e . r = R ;
++ C ;
} ) ;
if ( C > 0 ) cs [ "!ref" ] = encode _range ( refguess ) ;
return cs ;
}
/* 18.3 Worksheets also covers Chartsheets */
2018-01-23 09:07:51 +00:00
function parse _cs _xml ( data /*:?string*/ , opts , idx /*:number*/ , rels , wb /*::, themes, styles*/ ) /*:Worksheet*/ {
2017-03-27 21:35:15 +00:00
if ( ! data ) return data ;
/* 18.3.1.12 chartsheet CT_ChartSheet */
if ( ! rels ) rels = { '!id' : { } } ;
2019-11-15 01:46:49 +00:00
var s = ( { '!type' : "chart" , '!drawel' : null , '!rel' : "" } /*:any*/ ) ;
2017-03-27 21:35:15 +00:00
var m ;
2017-11-20 01:51:14 +00:00
/* 18.3.1.83 sheetPr CT_ChartsheetPr */
var sheetPr = data . match ( sheetprregex ) ;
if ( sheetPr ) parse _ws _xml _sheetpr ( sheetPr [ 0 ] , s , wb , idx ) ;
2017-03-27 21:35:15 +00:00
/* 18.3.1.36 drawing CT_Drawing */
if ( ( m = data . match ( /drawing r:id="(.*?)"/ ) ) ) s [ '!rel' ] = m [ 1 ] ;
2019-11-15 01:46:49 +00:00
if ( rels [ '!id' ] [ s [ '!rel' ] ] ) s [ '!drawel' ] = rels [ '!id' ] [ s [ '!rel' ] ] ;
2017-03-27 21:35:15 +00:00
return s ;
}
2022-04-14 07:27:38 +00:00
//function write_cs_xml(idx/*:number*/, opts, wb/*:Workbook*/, rels)/*:string*/ {
// var o = [XML_HEADER, writextag('chartsheet', null, {
// 'xmlns': XMLNS_main[0],
// 'xmlns:r': XMLNS.r
// })];
// o[o.length] = writextag("drawing", null, {"r:id": "rId1"});
// add_rels(rels, -1, "../drawings/drawing" + (idx+1) + ".xml", RELS.DRAW);
// if(o.length>2) { o[o.length] = ('</chartsheet>'); o[1]=o[1].replace("/>",">"); }
// return o.join("");
//}
2017-03-27 21:35:15 +00:00
2017-11-20 01:51:14 +00:00
/* [MS-XLSB] 2.4.331 BrtCsProp */
function parse _BrtCsProp ( data , length /*:number*/ ) {
data . l += 10 ;
var name = parse _XLWideString ( data , length - 10 ) ;
return { name : name } ;
}
2017-03-27 21:35:15 +00:00
/* [MS-XLSB] 2.1.7.7 Chart Sheet */
2018-01-23 09:07:51 +00:00
function parse _cs _bin ( data , opts , idx /*:number*/ , rels , wb /*::, themes, styles*/ ) /*:Worksheet*/ {
2017-03-27 21:35:15 +00:00
if ( ! data ) return data ;
if ( ! rels ) rels = { '!id' : { } } ;
2019-11-15 01:46:49 +00:00
var s = { '!type' : "chart" , '!drawel' : null , '!rel' : "" } ;
2017-12-30 05:40:35 +00:00
var state /*:Array<string>*/ = [ ] ;
2017-03-27 21:35:15 +00:00
var pass = false ;
2022-03-12 14:05:57 +00:00
recordhopper ( data , function cs _parse ( val , R , RT ) {
2017-04-09 04:03:19 +00:00
switch ( RT ) {
case 0x0226 : /* 'BrtDrawing' */
s [ '!rel' ] = val ; break ;
2017-11-20 01:51:14 +00:00
case 0x028B : /* 'BrtCsProp' */
if ( ! wb . Sheets [ idx ] ) wb . Sheets [ idx ] = { } ;
if ( val . name ) wb . Sheets [ idx ] . CodeName = val . name ;
break ;
2017-04-09 04:03:19 +00:00
case 0x0232 : /* 'BrtBkHim' */
case 0x028C : /* 'BrtCsPageSetup' */
case 0x029D : /* 'BrtCsProtection' */
case 0x02A7 : /* 'BrtCsProtectionIso' */
case 0x0227 : /* 'BrtLegacyDrawing' */
case 0x0228 : /* 'BrtLegacyDrawingHF' */
case 0x01DC : /* 'BrtMargins' */
2018-03-19 21:42:55 +00:00
case 0x0C00 : /* 'BrtUid' */
2017-04-09 04:03:19 +00:00
break ;
case 0x0023 : /* 'BrtFRTBegin' */
pass = true ; break ;
case 0x0024 : /* 'BrtFRTEnd' */
pass = false ; break ;
case 0x0025 : /* 'BrtACBegin' */
2022-03-12 14:05:57 +00:00
state . push ( RT ) ; break ;
2017-04-09 04:03:19 +00:00
case 0x0026 : /* 'BrtACEnd' */
state . pop ( ) ; break ;
2017-04-08 06:55:35 +00:00
default :
2022-03-12 14:05:57 +00:00
if ( R . T > 0 ) state . push ( RT ) ;
else if ( R . T < 0 ) state . pop ( ) ;
else if ( ! pass || opts . WTF ) throw new Error ( "Unexpected record 0x" + RT . toString ( 16 ) ) ;
2017-03-27 21:35:15 +00:00
}
} , opts ) ;
2019-11-15 01:46:49 +00:00
if ( rels [ '!id' ] [ s [ '!rel' ] ] ) s [ '!drawel' ] = rels [ '!id' ] [ s [ '!rel' ] ] ;
2017-03-27 21:35:15 +00:00
return s ;
}
2022-04-14 07:27:38 +00:00
//function write_cs_bin(/*::idx:number, opts, wb:Workbook, rels*/) {
// var ba = buf_array();
// write_record(ba, 0x0081 /* BrtBeginSheet */);
// /* [BrtCsProp] */
// /* CSVIEWS */
// /* [[BrtCsProtectionIso] BrtCsProtection] */
// /* [USERCSVIEWS] */
// /* [BrtMargins] */
// /* [BrtCsPageSetup] */
// /* [HEADERFOOTER] */
// /* BrtDrawing */
// /* [BrtLegacyDrawing] */
// /* [BrtLegacyDrawingHF] */
// /* [BrtBkHim] */
// /* [WEBPUBITEMS] */
// /* FRTCHARTSHEET */
// write_record(ba, 0x0082 /* BrtEndSheet */);
// return ba.end();
//}
2017-02-03 20:50:45 +00:00
/* 18.2.28 (CT_WorkbookProtection) Defaults */
var WBPropsDef = [
2017-06-01 21:22:11 +00:00
[ 'allowRefreshQuery' , false , "bool" ] ,
[ 'autoCompressPictures' , true , "bool" ] ,
[ 'backupFile' , false , "bool" ] ,
[ 'checkCompatibility' , false , "bool" ] ,
2017-11-20 01:51:14 +00:00
[ 'CodeName' , '' ] ,
2017-06-01 21:22:11 +00:00
[ 'date1904' , false , "bool" ] ,
[ 'defaultThemeVersion' , 0 , "int" ] ,
[ 'filterPrivacy' , false , "bool" ] ,
[ 'hidePivotFieldList' , false , "bool" ] ,
[ 'promptedSolutions' , false , "bool" ] ,
[ 'publishItems' , false , "bool" ] ,
[ 'refreshAllConnections' , false , "bool" ] ,
[ 'saveExternalLinkValues' , true , "bool" ] ,
[ 'showBorderUnselectedTables' , true , "bool" ] ,
[ 'showInkAnnotation' , true , "bool" ] ,
[ 'showObjects' , 'all' ] ,
[ 'showPivotChartFilter' , false , "bool" ] ,
[ 'updateLinks' , 'userSet' ]
2017-02-03 20:50:45 +00:00
] ;
/* 18.2.30 (CT_BookView) Defaults */
var WBViewDef = [
2017-06-01 21:22:11 +00:00
[ 'activeTab' , 0 , "int" ] ,
[ 'autoFilterDateGrouping' , true , "bool" ] ,
[ 'firstSheet' , 0 , "int" ] ,
[ 'minimized' , false , "bool" ] ,
[ 'showHorizontalScroll' , true , "bool" ] ,
[ 'showSheetTabs' , true , "bool" ] ,
[ 'showVerticalScroll' , true , "bool" ] ,
[ 'tabRatio' , 600 , "int" ] ,
[ 'visibility' , 'visible' ]
2017-02-03 20:50:45 +00:00
//window{Height,Width}, {x,y}Window
] ;
/* 18.2.19 (CT_Sheet) Defaults */
var SheetDef = [
2017-03-31 18:46:42 +00:00
//['state', 'visible']
2017-02-03 20:50:45 +00:00
] ;
/* 18.2.2 (CT_CalcPr) Defaults */
var CalcPrDef = [
[ 'calcCompleted' , 'true' ] ,
[ 'calcMode' , 'auto' ] ,
[ 'calcOnSave' , 'true' ] ,
[ 'concurrentCalc' , 'true' ] ,
[ 'fullCalcOnLoad' , 'false' ] ,
[ 'fullPrecision' , 'true' ] ,
[ 'iterate' , 'false' ] ,
[ 'iterateCount' , '100' ] ,
[ 'iterateDelta' , '0.001' ] ,
[ 'refMode' , 'A1' ]
] ;
/* 18.2.3 (CT_CustomWorkbookView) Defaults */
2018-01-23 09:07:51 +00:00
/ * v a r C u s t o m W B V i e w D e f = [
2017-02-03 20:50:45 +00:00
[ 'autoUpdate' , 'false' ] ,
[ 'changesSavedWin' , 'false' ] ,
[ 'includeHiddenRowCol' , 'true' ] ,
[ 'includePrintSettings' , 'true' ] ,
[ 'maximized' , 'false' ] ,
[ 'minimized' , 'false' ] ,
[ 'onlySync' , 'false' ] ,
[ 'personalView' , 'false' ] ,
[ 'showComments' , 'commIndicator' ] ,
[ 'showFormulaBar' , 'true' ] ,
[ 'showHorizontalScroll' , 'true' ] ,
[ 'showObjects' , 'all' ] ,
[ 'showSheetTabs' , 'true' ] ,
[ 'showStatusbar' , 'true' ] ,
[ 'showVerticalScroll' , 'true' ] ,
[ 'tabRatio' , '600' ] ,
[ 'xWindow' , '0' ] ,
[ 'yWindow' , '0' ]
2018-01-23 09:07:51 +00:00
] ; * /
2017-02-03 20:50:45 +00:00
function push _defaults _array ( target , defaults ) {
for ( var j = 0 ; j != target . length ; ++ j ) { var w = target [ j ] ;
for ( var i = 0 ; i != defaults . length ; ++ i ) { var z = defaults [ i ] ;
if ( w [ z [ 0 ] ] == null ) w [ z [ 0 ] ] = z [ 1 ] ;
2017-06-01 21:22:11 +00:00
else switch ( z [ 2 ] ) {
2018-01-23 09:07:51 +00:00
case "bool" : if ( typeof w [ z [ 0 ] ] == "string" ) w [ z [ 0 ] ] = parsexmlbool ( w [ z [ 0 ] ] ) ; break ;
2017-06-01 21:22:11 +00:00
case "int" : if ( typeof w [ z [ 0 ] ] == "string" ) w [ z [ 0 ] ] = parseInt ( w [ z [ 0 ] ] , 10 ) ; break ;
}
2017-02-03 20:50:45 +00:00
}
}
}
function push _defaults ( target , defaults ) {
for ( var i = 0 ; i != defaults . length ; ++ i ) { var z = defaults [ i ] ;
if ( target [ z [ 0 ] ] == null ) target [ z [ 0 ] ] = z [ 1 ] ;
2017-06-01 21:22:11 +00:00
else switch ( z [ 2 ] ) {
2018-01-23 09:07:51 +00:00
case "bool" : if ( typeof target [ z [ 0 ] ] == "string" ) target [ z [ 0 ] ] = parsexmlbool ( target [ z [ 0 ] ] ) ; break ;
2017-06-01 21:22:11 +00:00
case "int" : if ( typeof target [ z [ 0 ] ] == "string" ) target [ z [ 0 ] ] = parseInt ( target [ z [ 0 ] ] , 10 ) ; break ;
}
2017-02-03 20:50:45 +00:00
}
}
function parse _wb _defaults ( wb ) {
push _defaults ( wb . WBProps , WBPropsDef ) ;
push _defaults ( wb . CalcPr , CalcPrDef ) ;
push _defaults _array ( wb . WBView , WBViewDef ) ;
push _defaults _array ( wb . Sheets , SheetDef ) ;
2018-01-23 09:07:51 +00:00
_ssfopts . date1904 = parsexmlbool ( wb . WBProps . date1904 ) ;
2017-02-03 20:50:45 +00:00
}
2017-03-10 08:39:51 +00:00
2017-06-01 21:22:11 +00:00
function safe1904 ( wb /*:Workbook*/ ) /*:string*/ {
/* TODO: store date1904 somewhere else */
if ( ! wb . Workbook ) return "false" ;
if ( ! wb . Workbook . WBProps ) return "false" ;
return parsexmlbool ( wb . Workbook . WBProps . date1904 ) ? "true" : "false" ;
}
2022-03-20 05:29:24 +00:00
var badchars = /*#__PURE__*/ "][*?\/\\" . split ( "" ) ;
2017-05-13 18:21:22 +00:00
function check _ws _name ( n /*:string*/ , safe /*:?boolean*/ ) /*:boolean*/ {
2017-05-11 07:29:59 +00:00
if ( n . length > 31 ) { if ( safe ) return false ; throw new Error ( "Sheet names cannot exceed 31 chars" ) ; }
var _good = true ;
badchars . forEach ( function ( c ) {
if ( n . indexOf ( c ) == - 1 ) return ;
if ( ! safe ) throw new Error ( "Sheet name cannot contain : \\ / ? * [ ]" ) ;
_good = false ;
} ) ;
return _good ;
}
2018-02-14 20:06:35 +00:00
function check _wb _names ( N , S , codes ) {
2017-04-03 00:16:03 +00:00
N . forEach ( function ( n , i ) {
2017-05-11 07:29:59 +00:00
check _ws _name ( n ) ;
2017-04-03 00:16:03 +00:00
for ( var j = 0 ; j < i ; ++ j ) if ( n == N [ j ] ) throw new Error ( "Duplicate Sheet Name: " + n ) ;
2018-02-14 20:06:35 +00:00
if ( codes ) {
var cn = ( S && S [ i ] && S [ i ] . CodeName ) || n ;
if ( cn . charCodeAt ( 0 ) == 95 && cn . length > 22 ) throw new Error ( "Bad Code Name: Worksheet" + cn ) ;
}
2017-04-03 00:16:03 +00:00
} ) ;
}
2017-03-10 08:39:51 +00:00
function check _wb ( wb ) {
if ( ! wb || ! wb . SheetNames || ! wb . Sheets ) throw new Error ( "Invalid Workbook" ) ;
2018-02-03 20:46:32 +00:00
if ( ! wb . SheetNames . length ) throw new Error ( "Workbook is empty" ) ;
2018-02-14 20:06:35 +00:00
var Sheets = ( wb . Workbook && wb . Workbook . Sheets ) || [ ] ;
check _wb _names ( wb . SheetNames , Sheets , ! ! wb . vbaraw ) ;
2018-04-27 20:11:18 +00:00
for ( var i = 0 ; i < wb . SheetNames . length ; ++ i ) check _ws ( wb . Sheets [ wb . SheetNames [ i ] ] , wb . SheetNames [ i ] , i ) ;
2022-05-30 08:40:51 +00:00
wb . SheetNames . forEach ( function ( n , i ) {
var ws = wb . Sheets [ n ] ;
if ( ! ws || ! ws [ "!autofilter" ] ) return ;
var DN ;
if ( ! wb . Workbook ) wb . Workbook = { } ;
if ( ! wb . Workbook . Names ) wb . Workbook . Names = [ ] ;
wb . Workbook . Names . forEach ( function ( dn ) { if ( dn . Name == "_xlnm._FilterDatabase" && dn . Sheet == i ) DN = dn ; } ) ;
var nn = formula _quote _sheet _name ( n ) + "!" + fix _range ( ws [ "!autofilter" ] . ref ) ;
if ( DN ) DN . Ref = nn ;
else wb . Workbook . Names . push ( { Name : "_xlnm._FilterDatabase" , Sheet : i , Ref : nn } ) ;
} ) ;
2017-04-03 00:16:03 +00:00
/* TODO: validate workbook */
2017-03-10 08:39:51 +00:00
}
2017-02-03 20:50:45 +00:00
/* 18.2 Workbook */
var wbnsregex = /<\w+:workbook/ ;
2017-03-12 18:02:43 +00:00
function parse _wb _xml ( data , opts ) /*:WorkbookFile*/ {
2017-02-10 19:23:01 +00:00
if ( ! data ) throw new Error ( "Could not find file" ) ;
2019-11-15 01:46:49 +00:00
var wb = /*::(*/ { AppVersion : { } , WBProps : { } , WBView : [ ] , Sheets : [ ] , CalcPr : { } , Names : [ ] , xmlns : "" } /*::)*/ ;
2017-02-03 20:50:45 +00:00
var pass = false , xmlns = "xmlns" ;
2017-03-19 17:26:13 +00:00
var dname = { } , dnstart = 0 ;
data . replace ( tagregex , function xml _wb ( x , idx ) {
2017-05-13 18:21:22 +00:00
var y /*:any*/ = parsexmltag ( x ) ;
2017-02-03 20:50:45 +00:00
switch ( strip _ns ( y [ 0 ] ) ) {
case '<?xml' : break ;
/* 18.2.27 workbook CT_Workbook 1 */
case '<workbook' :
if ( x . match ( wbnsregex ) ) xmlns = "xmlns" + x . match ( /<(\w+):/ ) [ 1 ] ;
wb . xmlns = y [ xmlns ] ;
break ;
case '</workbook>' : break ;
/* 18.2.13 fileVersion CT_FileVersion ? */
case '<fileVersion' : delete y [ 0 ] ; wb . AppVersion = y ; break ;
2017-03-10 08:39:51 +00:00
case '<fileVersion/>' : case '</fileVersion>' : break ;
2017-02-03 20:50:45 +00:00
/* 18.2.12 fileSharing CT_FileSharing ? */
2019-11-01 03:09:14 +00:00
case '<fileSharing' :
break ;
case '<fileSharing/>' : break ;
2017-02-03 20:50:45 +00:00
/* 18.2.28 workbookPr CT_WorkbookPr ? */
2017-06-01 21:22:11 +00:00
case '<workbookPr' :
case '<workbookPr/>' :
WBPropsDef . forEach ( function ( w ) {
if ( y [ w [ 0 ] ] == null ) return ;
switch ( w [ 2 ] ) {
2018-01-23 09:07:51 +00:00
case "bool" : wb . WBProps [ w [ 0 ] ] = parsexmlbool ( y [ w [ 0 ] ] ) ; break ;
2017-06-01 21:22:11 +00:00
case "int" : wb . WBProps [ w [ 0 ] ] = parseInt ( y [ w [ 0 ] ] , 10 ) ; break ;
default : wb . WBProps [ w [ 0 ] ] = y [ w [ 0 ] ] ;
}
} ) ;
2020-07-27 12:46:17 +00:00
if ( y . codeName ) wb . WBProps . CodeName = utf8read ( y . codeName ) ;
2017-06-01 21:22:11 +00:00
break ;
2017-03-10 08:39:51 +00:00
case '</workbookPr>' : break ;
2017-02-03 20:50:45 +00:00
/* 18.2.29 workbookProtection CT_WorkbookProtection ? */
2019-11-01 03:09:14 +00:00
case '<workbookProtection' :
break ;
2017-02-03 20:50:45 +00:00
case '<workbookProtection/>' : break ;
/* 18.2.1 bookViews CT_BookViews ? */
2017-07-26 08:35:28 +00:00
case '<bookViews' : case '<bookViews>' : case '</bookViews>' : break ;
2017-02-03 20:50:45 +00:00
/* 18.2.30 workbookView CT_BookView + */
2018-04-27 20:11:18 +00:00
case '<workbookView' : case '<workbookView/>' : delete y [ 0 ] ; wb . WBView . push ( y ) ; break ;
2017-03-10 08:39:51 +00:00
case '</workbookView>' : break ;
2017-02-03 20:50:45 +00:00
/* 18.2.20 sheets CT_Sheets 1 */
2017-07-26 08:35:28 +00:00
case '<sheets' : case '<sheets>' : case '</sheets>' : break ; // aggregate sheet
2017-02-03 20:50:45 +00:00
/* 18.2.19 sheet CT_Sheet + */
2017-03-31 18:46:42 +00:00
case '<sheet' :
switch ( y . state ) {
case "hidden" : y . Hidden = 1 ; break ;
case "veryHidden" : y . Hidden = 2 ; break ;
default : y . Hidden = 0 ;
}
delete y . state ;
y . name = unescapexml ( utf8read ( y . name ) ) ;
delete y [ 0 ] ; wb . Sheets . push ( y ) ; break ;
2017-03-10 08:39:51 +00:00
case '</sheet>' : break ;
2017-02-03 20:50:45 +00:00
/* 18.2.15 functionGroups CT_FunctionGroups ? */
case '<functionGroups' : case '<functionGroups/>' : break ;
/* 18.2.14 functionGroup CT_FunctionGroup + */
case '<functionGroup' : break ;
/* 18.2.9 externalReferences CT_ExternalReferences ? */
case '<externalReferences' : case '</externalReferences>' : case '<externalReferences>' : break ;
/* 18.2.8 externalReference CT_ExternalReference + */
case '<externalReference' : break ;
/* 18.2.6 definedNames CT_DefinedNames ? */
case '<definedNames/>' : break ;
case '<definedNames>' : case '<definedNames' : pass = true ; break ;
case '</definedNames>' : pass = false ; break ;
/* 18.2.5 definedName CT_DefinedName + */
2017-03-19 17:26:13 +00:00
case '<definedName' : {
dname = { } ;
2018-08-25 23:44:35 +00:00
dname . Name = utf8read ( y . name ) ;
2017-03-19 17:26:13 +00:00
if ( y . comment ) dname . Comment = y . comment ;
2017-04-11 22:15:36 +00:00
if ( y . localSheetId ) dname . Sheet = + y . localSheetId ;
2019-04-01 14:25:15 +00:00
if ( parsexmlbool ( y . hidden || "0" ) ) dname . Hidden = true ;
2017-03-19 17:26:13 +00:00
dnstart = idx + x . length ;
} break ;
case '</definedName>' : {
2018-08-25 23:44:35 +00:00
dname . Ref = unescapexml ( utf8read ( data . slice ( dnstart , idx ) ) ) ;
2017-04-11 22:15:36 +00:00
wb . Names . push ( dname ) ;
2017-03-19 17:26:13 +00:00
} break ;
case '<definedName/>' : break ;
2017-02-03 20:50:45 +00:00
/* 18.2.2 calcPr CT_CalcPr ? */
case '<calcPr' : delete y [ 0 ] ; wb . CalcPr = y ; break ;
case '<calcPr/>' : delete y [ 0 ] ; wb . CalcPr = y ; break ;
2017-03-10 08:39:51 +00:00
case '</calcPr>' : break ;
2017-02-03 20:50:45 +00:00
/* 18.2.16 oleSize CT_OleSize ? (ref required) */
case '<oleSize' : break ;
/* 18.2.4 customWorkbookViews CT_CustomWorkbookViews ? */
case '<customWorkbookViews>' : case '</customWorkbookViews>' : case '<customWorkbookViews' : break ;
2019-11-01 03:09:14 +00:00
/* 18.2.3 customWorkbookView CT_CustomWorkbookView + */
2017-02-03 20:50:45 +00:00
case '<customWorkbookView' : case '</customWorkbookView>' : break ;
/* 18.2.18 pivotCaches CT_PivotCaches ? */
case '<pivotCaches>' : case '</pivotCaches>' : case '<pivotCaches' : break ;
/* 18.2.17 pivotCache CT_PivotCache ? */
case '<pivotCache' : break ;
/* 18.2.21 smartTagPr CT_SmartTagPr ? */
case '<smartTagPr' : case '<smartTagPr/>' : break ;
/* 18.2.23 smartTagTypes CT_SmartTagTypes ? */
case '<smartTagTypes' : case '<smartTagTypes>' : case '</smartTagTypes>' : break ;
2019-11-01 03:09:14 +00:00
/* 18.2.22 smartTagType CT_SmartTagType ? */
2017-02-03 20:50:45 +00:00
case '<smartTagType' : break ;
/* 18.2.24 webPublishing CT_WebPublishing ? */
case '<webPublishing' : case '<webPublishing/>' : break ;
/* 18.2.11 fileRecoveryPr CT_FileRecoveryPr ? */
case '<fileRecoveryPr' : case '<fileRecoveryPr/>' : break ;
/* 18.2.26 webPublishObjects CT_WebPublishObjects ? */
case '<webPublishObjects>' : case '<webPublishObjects' : case '</webPublishObjects>' : break ;
/* 18.2.25 webPublishObject CT_WebPublishObject ? */
case '<webPublishObject' : break ;
/* 18.2.10 extLst CT_ExtensionList ? */
2017-07-26 08:35:28 +00:00
case '<extLst' : case '<extLst>' : case '</extLst>' : case '<extLst/>' : break ;
2019-11-01 03:09:14 +00:00
/* 18.2.7 ext CT_Extension + */
2017-02-03 20:50:45 +00:00
case '<ext' : pass = true ; break ; //TODO: check with versions of excel
case '</ext>' : pass = false ; break ;
/* Others */
case '<ArchID' : break ;
2017-10-02 08:15:36 +00:00
case '<AlternateContent' :
case '<AlternateContent>' : pass = true ; break ;
2017-02-03 20:50:45 +00:00
case '</AlternateContent>' : pass = false ; break ;
2017-07-10 22:18:18 +00:00
/* TODO */
case '<revisionPtr' : break ;
2017-03-10 08:39:51 +00:00
default : if ( ! pass && opts . WTF ) throw new Error ( 'unrecognized ' + y [ 0 ] + ' in workbook' ) ;
2017-02-03 20:50:45 +00:00
}
2017-03-19 17:26:13 +00:00
return x ;
2017-02-03 20:50:45 +00:00
} ) ;
2022-03-12 14:05:57 +00:00
if ( XMLNS _main . indexOf ( wb . xmlns ) === - 1 ) throw new Error ( "Unknown Namespace: " + wb . xmlns ) ;
2017-02-03 20:50:45 +00:00
parse _wb _defaults ( wb ) ;
return wb ;
}
2018-01-23 09:07:51 +00:00
function write _wb _xml ( wb /*:Workbook*/ /*::, opts:?WriteOpts*/ ) /*:string*/ {
2017-02-03 20:50:45 +00:00
var o = [ XML _HEADER ] ;
2022-03-12 14:05:57 +00:00
o [ o . length ] = writextag ( 'workbook' , null , {
'xmlns' : XMLNS _main [ 0 ] ,
//'xmlns:mx': XMLNS.mx,
//'xmlns:s': XMLNS_main[0],
'xmlns:r' : XMLNS . r
} ) ;
2017-04-10 05:10:54 +00:00
2017-04-16 04:32:13 +00:00
var write _names = ( wb . Workbook && ( wb . Workbook . Names || [ ] ) . length > 0 ) ;
2017-04-10 05:10:54 +00:00
/* fileVersion */
/* fileSharing */
2017-11-20 01:51:14 +00:00
var workbookPr /*:any*/ = ( { codeName : "ThisWorkbook" } /*:any*/ ) ;
2017-06-03 07:19:09 +00:00
if ( wb . Workbook && wb . Workbook . WBProps ) {
WBPropsDef . forEach ( function ( x ) {
/*:: if(!wb.Workbook || !wb.Workbook.WBProps) throw "unreachable"; */
if ( ( wb . Workbook . WBProps [ x [ 0 ] ] /*:any*/ ) == null ) return ;
if ( ( wb . Workbook . WBProps [ x [ 0 ] ] /*:any*/ ) == x [ 1 ] ) return ;
workbookPr [ x [ 0 ] ] = ( wb . Workbook . WBProps [ x [ 0 ] ] /*:any*/ ) ;
} ) ;
2017-11-20 01:51:14 +00:00
/*:: if(!wb.Workbook || !wb.Workbook.WBProps) throw "unreachable"; */
if ( wb . Workbook . WBProps . CodeName ) { workbookPr . codeName = wb . Workbook . WBProps . CodeName ; delete workbookPr . CodeName ; }
2017-06-03 07:19:09 +00:00
}
o [ o . length ] = ( writextag ( 'workbookPr' , null , workbookPr ) ) ;
2017-04-10 05:10:54 +00:00
/* workbookProtection */
2019-04-01 14:25:15 +00:00
var sheets = wb . Workbook && wb . Workbook . Sheets || [ ] ;
var i = 0 ;
2020-09-11 08:38:33 +00:00
/* bookViews only written if first worksheet is hidden */
if ( sheets && sheets [ 0 ] && ! ! sheets [ 0 ] . Hidden ) {
o [ o . length ] = "<bookViews>" ;
for ( i = 0 ; i != wb . SheetNames . length ; ++ i ) {
if ( ! sheets [ i ] ) break ;
if ( ! sheets [ i ] . Hidden ) break ;
}
if ( i == wb . SheetNames . length ) i = 0 ;
o [ o . length ] = '<workbookView firstSheet="' + i + '" activeTab="' + i + '"/>' ;
o [ o . length ] = "</bookViews>" ;
}
2017-04-10 05:10:54 +00:00
2017-02-03 20:50:45 +00:00
o [ o . length ] = "<sheets>" ;
2019-04-01 14:25:15 +00:00
for ( i = 0 ; i != wb . SheetNames . length ; ++ i ) {
2018-01-11 08:01:25 +00:00
var sht = ( { name : escapexml ( wb . SheetNames [ i ] . slice ( 0 , 31 ) ) } /*:any*/ ) ;
2017-03-31 18:46:42 +00:00
sht . sheetId = "" + ( i + 1 ) ;
sht [ "r:id" ] = "rId" + ( i + 1 ) ;
if ( sheets [ i ] ) switch ( sheets [ i ] . Hidden ) {
case 1 : sht . state = "hidden" ; break ;
case 2 : sht . state = "veryHidden" ; break ;
}
o [ o . length ] = ( writextag ( 'sheet' , null , sht ) ) ;
}
2017-02-03 20:50:45 +00:00
o [ o . length ] = "</sheets>" ;
2017-04-10 05:10:54 +00:00
/* functionGroups */
/* externalReferences */
2017-04-11 22:15:36 +00:00
2017-04-16 04:32:13 +00:00
if ( write _names ) {
2017-04-11 22:15:36 +00:00
o [ o . length ] = "<definedNames>" ;
2017-04-16 04:32:13 +00:00
if ( wb . Workbook && wb . Workbook . Names ) wb . Workbook . Names . forEach ( function ( n ) {
2017-05-13 18:21:22 +00:00
var d /*:any*/ = { name : n . Name } ;
2017-04-11 22:15:36 +00:00
if ( n . Comment ) d . comment = n . Comment ;
if ( n . Sheet != null ) d . localSheetId = "" + n . Sheet ;
2019-04-01 14:25:15 +00:00
if ( n . Hidden ) d . hidden = "1" ;
2017-04-11 22:15:36 +00:00
if ( ! n . Ref ) return ;
2020-03-15 07:42:05 +00:00
o [ o . length ] = writextag ( 'definedName' , escapexml ( n . Ref ) , d ) ;
2017-04-11 22:15:36 +00:00
} ) ;
o [ o . length ] = "</definedNames>" ;
}
2017-04-10 05:10:54 +00:00
/* calcPr */
/* oleSize */
/* customWorkbookViews */
/* pivotCaches */
/* smartTagPr */
/* smartTagTypes */
/* webPublishing */
/* fileRecoveryPr */
/* webPublishObjects */
/* extLst */
2017-02-03 20:50:45 +00:00
if ( o . length > 2 ) { o [ o . length ] = '</workbook>' ; o [ 1 ] = o [ 1 ] . replace ( "/>" , ">" ) ; }
return o . join ( "" ) ;
}
2018-02-14 20:06:35 +00:00
/* [MS-XLSB] 2.4.304 BrtBundleSh */
2017-02-10 19:23:01 +00:00
function parse _BrtBundleSh ( data , length /*:number*/ ) {
2017-02-03 20:50:45 +00:00
var z = { } ;
2017-03-31 18:46:42 +00:00
z . Hidden = data . read _shift ( 4 ) ; //hsState ST_SheetState
2017-02-03 20:50:45 +00:00
z . iTabID = data . read _shift ( 4 ) ;
z . strRelID = parse _RelID ( data , length - 8 ) ;
z . name = parse _XLWideString ( data ) ;
return z ;
}
function write _BrtBundleSh ( data , o ) {
if ( ! o ) o = new _buf ( 127 ) ;
2017-03-31 18:46:42 +00:00
o . write _shift ( 4 , data . Hidden ) ;
2017-02-03 20:50:45 +00:00
o . write _shift ( 4 , data . iTabID ) ;
write _RelID ( data . strRelID , o ) ;
2018-01-11 08:01:25 +00:00
write _XLWideString ( data . name . slice ( 0 , 31 ) , o ) ;
2017-02-03 20:50:45 +00:00
return o . length > o . l ? o . slice ( 0 , o . l ) : o ;
}
2018-02-14 20:06:35 +00:00
/* [MS-XLSB] 2.4.815 BrtWbProp */
2017-06-03 07:19:09 +00:00
function parse _BrtWbProp ( data , length ) /*:WBProps*/ {
var o /*:WBProps*/ = ( { } /*:any*/ ) ;
2017-06-01 21:22:11 +00:00
var flags = data . read _shift ( 4 ) ;
o . defaultThemeVersion = data . read _shift ( 4 ) ;
2017-02-03 20:50:45 +00:00
var strName = ( length > 8 ) ? parse _XLWideString ( data ) : "" ;
2017-11-20 01:51:14 +00:00
if ( strName . length > 0 ) o . CodeName = strName ;
2017-06-01 21:22:11 +00:00
o . autoCompressPictures = ! ! ( flags & 0x10000 ) ;
o . backupFile = ! ! ( flags & 0x40 ) ;
o . checkCompatibility = ! ! ( flags & 0x1000 ) ;
o . date1904 = ! ! ( flags & 0x01 ) ;
o . filterPrivacy = ! ! ( flags & 0x08 ) ;
o . hidePivotFieldList = ! ! ( flags & 0x400 ) ;
o . promptedSolutions = ! ! ( flags & 0x10 ) ;
o . publishItems = ! ! ( flags & 0x800 ) ;
o . refreshAllConnections = ! ! ( flags & 0x40000 ) ;
o . saveExternalLinkValues = ! ! ( flags & 0x80 ) ;
o . showBorderUnselectedTables = ! ! ( flags & 0x04 ) ;
o . showInkAnnotation = ! ! ( flags & 0x20 ) ;
o . showObjects = [ "all" , "placeholders" , "none" ] [ ( flags >> 13 ) & 0x03 ] ;
o . showPivotChartFilter = ! ! ( flags & 0x8000 ) ;
o . updateLinks = [ "userSet" , "never" , "always" ] [ ( flags >> 8 ) & 0x03 ] ;
return o ;
2017-02-03 20:50:45 +00:00
}
2017-06-03 07:19:09 +00:00
function write _BrtWbProp ( data /*:?WBProps*/ , o ) {
2017-05-09 18:07:57 +00:00
if ( ! o ) o = new _buf ( 72 ) ;
2017-06-03 07:19:09 +00:00
var flags = 0 ;
if ( data ) {
/* TODO: mirror parse_BrtWbProp fields */
2022-06-06 23:05:27 +00:00
if ( data . date1904 ) flags |= 0x01 ;
2017-06-03 07:19:09 +00:00
if ( data . filterPrivacy ) flags |= 0x08 ;
}
o . write _shift ( 4 , flags ) ;
2017-02-03 20:50:45 +00:00
o . write _shift ( 4 , 0 ) ;
2017-11-20 01:51:14 +00:00
write _XLSBCodeName ( data && data . CodeName || "ThisWorkbook" , o ) ;
2017-03-31 00:47:35 +00:00
return o . slice ( 0 , o . l ) ;
2017-02-03 20:50:45 +00:00
}
function parse _BrtFRTArchID$ ( data , length ) {
var o = { } ;
data . read _shift ( 4 ) ;
o . ArchID = data . read _shift ( 4 ) ;
data . l += length - 8 ;
return o ;
}
2018-02-14 20:06:35 +00:00
/* [MS-XLSB] 2.4.687 BrtName */
2017-02-19 20:36:32 +00:00
function parse _BrtName ( data , length , opts ) {
var end = data . l + length ;
2022-05-27 20:26:39 +00:00
var flags = data . read _shift ( 4 ) ;
2018-01-23 09:07:51 +00:00
data . l += 1 ; //var chKey = data.read_shift(1);
2017-02-19 20:36:32 +00:00
var itab = data . read _shift ( 4 ) ;
var name = parse _XLNameWideString ( data ) ;
var formula = parse _XLSBNameParsedFormula ( data , 0 , opts ) ;
var comment = parse _XLNullableWideString ( data ) ;
2022-05-27 20:26:39 +00:00
if ( flags & 0x20 ) name = "_xlnm." + name ;
2017-03-31 00:47:35 +00:00
//if(0 /* fProc */) {
2017-02-19 20:36:32 +00:00
// unusedstring1: XLNullableWideString
// description: XLNullableWideString
// helpTopic: XLNullableWideString
// unusedstring2: XLNullableWideString
2017-03-31 00:47:35 +00:00
//}
2017-02-19 20:36:32 +00:00
data . l = end ;
2022-05-27 20:26:39 +00:00
var out = ( { Name : name , Ptg : formula , Flags : flags } /*:any*/ ) ;
2017-04-11 22:15:36 +00:00
if ( itab < 0xFFFFFFF ) out . Sheet = itab ;
2017-12-15 01:18:40 +00:00
if ( comment ) out . Comment = comment ;
2017-04-11 22:15:36 +00:00
return out ;
2017-02-19 20:36:32 +00:00
}
2022-05-25 01:45:55 +00:00
function write _BrtName ( name , wb ) {
var o = new _buf ( 9 ) ;
2022-05-27 20:26:39 +00:00
var flags = 0 ;
var dname = name . Name ;
if ( XLSLblBuiltIn . indexOf ( dname ) > - 1 ) { flags |= 0x20 ; dname = dname . slice ( 6 ) ; }
o . write _shift ( 4 , flags ) ; // flags
2022-05-25 01:45:55 +00:00
o . write _shift ( 1 , 0 ) ; // chKey
o . write _shift ( 4 , name . Sheet == null ? 0xFFFFFFFF : name . Sheet ) ;
var arr = [
o ,
2022-05-27 20:26:39 +00:00
write _XLWideString ( dname ) ,
write _XLSBNameParsedFormula ( name . Ref , wb )
2022-05-25 01:45:55 +00:00
] ;
2022-05-27 20:26:39 +00:00
if ( name . Comment ) arr . push ( write _XLNullableWideString ( name . Comment ) ) ;
2022-05-25 01:45:55 +00:00
else {
var x = new _buf ( 4 ) ;
x . write _shift ( 4 , 0xFFFFFFFF ) ;
arr . push ( x ) ;
}
// if macro (flags & 0x0F):
// write_shift(4, 0xFFFFFFFF);
// write_XLNullableWideString(description)
// write_XLNullableWideString(helpTopic)
// write_shift(4, 0xFFFFFFFF);
2022-05-27 20:26:39 +00:00
return bconcat ( arr ) ;
2022-05-25 01:45:55 +00:00
}
2017-02-19 20:36:32 +00:00
2018-02-14 20:06:35 +00:00
/* [MS-XLSB] 2.1.7.61 Workbook */
2017-03-12 18:02:43 +00:00
function parse _wb _bin ( data , opts ) /*:WorkbookFile*/ {
2017-02-03 20:50:45 +00:00
var wb = { AppVersion : { } , WBProps : { } , WBView : [ ] , Sheets : [ ] , CalcPr : { } , xmlns : "" } ;
2019-04-01 14:25:15 +00:00
var state /*:Array<string>*/ = [ ] ;
2018-01-23 09:07:51 +00:00
var pass = false ;
2017-02-03 20:50:45 +00:00
2017-02-19 20:36:32 +00:00
if ( ! opts ) opts = { } ;
opts . biff = 12 ;
2017-04-11 22:15:36 +00:00
var Names = [ ] ;
2017-11-15 18:14:02 +00:00
var supbooks = ( [ [ ] ] /*:any*/ ) ;
2017-04-11 22:15:36 +00:00
supbooks . SheetNames = [ ] ;
2017-11-15 18:14:02 +00:00
supbooks . XTI = [ ] ;
2017-02-19 20:36:32 +00:00
2021-08-18 18:34:02 +00:00
XLSBRecordEnum [ 0x0010 ] = { n : "BrtFRTArchID$" , f : parse _BrtFRTArchID$ } ;
2022-03-12 14:05:57 +00:00
recordhopper ( data , function hopper _wb ( val , R , RT ) {
2017-04-09 04:03:19 +00:00
switch ( RT ) {
case 0x009C : /* 'BrtBundleSh' */
2017-04-11 22:15:36 +00:00
supbooks . SheetNames . push ( val . name ) ;
2017-04-09 04:03:19 +00:00
wb . Sheets . push ( val ) ; break ;
2017-02-03 20:50:45 +00:00
2017-07-10 22:18:18 +00:00
case 0x0099 : /* 'BrtWbProp' */
wb . WBProps = val ; break ;
2017-04-09 04:03:19 +00:00
case 0x0027 : /* 'BrtName' */
2017-11-15 18:14:02 +00:00
if ( val . Sheet != null ) opts . SID = val . Sheet ;
2017-04-11 22:15:36 +00:00
val . Ref = stringify _formula ( val . Ptg , null , null , supbooks , opts ) ;
2017-11-15 18:14:02 +00:00
delete opts . SID ;
2017-04-11 22:15:36 +00:00
delete val . Ptg ;
Names . push ( val ) ;
2017-02-19 20:36:32 +00:00
break ;
2017-04-09 04:03:19 +00:00
case 0x040C : /* 'BrtNameExt' */ break ;
2017-07-10 22:18:18 +00:00
case 0x0165 : /* 'BrtSupSelf' */
case 0x0166 : /* 'BrtSupSame' */
case 0x0163 : /* 'BrtSupBookSrc' */
case 0x029B : /* 'BrtSupAddin' */
2017-11-15 18:14:02 +00:00
if ( ! supbooks [ 0 ] . length ) supbooks [ 0 ] = [ RT , val ] ;
else supbooks . push ( [ RT , val ] ) ;
supbooks [ supbooks . length - 1 ] . XTI = [ ] ;
break ;
2017-07-10 22:18:18 +00:00
case 0x016A : /* 'BrtExternSheet' */
2017-11-15 18:14:02 +00:00
if ( supbooks . length === 0 ) { supbooks [ 0 ] = [ ] ; supbooks [ 0 ] . XTI = [ ] ; }
supbooks [ supbooks . length - 1 ] . XTI = supbooks [ supbooks . length - 1 ] . XTI . concat ( val ) ;
supbooks . XTI = supbooks . XTI . concat ( val ) ;
break ;
2017-07-10 22:18:18 +00:00
case 0x0169 : /* 'BrtPlaceholderName' */
break ;
2017-06-01 21:22:11 +00:00
2021-08-18 18:34:02 +00:00
case 0x0817 : /* 'BrtAbsPath15' */
case 0x009E : /* 'BrtBookView' */
case 0x008F : /* 'BrtBeginBundleShs' */
case 0x0298 : /* 'BrtBeginFnGroup' */
case 0x0161 : /* 'BrtBeginExternals' */
break ;
2017-05-09 18:07:57 +00:00
/* case 'BrtModelTimeGroupingCalcCol' */
2018-03-19 21:42:55 +00:00
case 0x0C00 : /* 'BrtUid' */
case 0x0C01 : /* 'BrtRevisionPtr' */
2017-04-09 04:03:19 +00:00
case 0x0216 : /* 'BrtBookProtection' */
case 0x02A5 : /* 'BrtBookProtectionIso' */
case 0x009D : /* 'BrtCalcProp' */
case 0x0262 : /* 'BrtCrashRecErr' */
case 0x0802 : /* 'BrtDecoupledPivotCacheID' */
case 0x009B : /* 'BrtFileRecover' */
case 0x0224 : /* 'BrtFileSharing' */
case 0x02A4 : /* 'BrtFileSharingIso' */
case 0x0080 : /* 'BrtFileVersion' */
case 0x0299 : /* 'BrtFnGroup' */
case 0x0850 : /* 'BrtModelRelationship' */
case 0x084D : /* 'BrtModelTable' */
case 0x0225 : /* 'BrtOleSize' */
case 0x0805 : /* 'BrtPivotTableRef' */
case 0x0254 : /* 'BrtSmartTagType' */
case 0x081C : /* 'BrtTableSlicerCacheID' */
case 0x081B : /* 'BrtTableSlicerCacheIDs' */
case 0x0822 : /* 'BrtTimelineCachePivotCacheID' */
case 0x018D : /* 'BrtUserBookView' */
case 0x009A : /* 'BrtWbFactoid' */
case 0x045D : /* 'BrtWbProp14' */
case 0x0229 : /* 'BrtWebOpt' */
case 0x082B : /* 'BrtWorkBookPr15' */
break ;
case 0x0023 : /* 'BrtFRTBegin' */
2022-03-12 14:05:57 +00:00
state . push ( RT ) ; pass = true ; break ;
2017-04-09 04:03:19 +00:00
case 0x0024 : /* 'BrtFRTEnd' */
2019-04-01 14:25:15 +00:00
state . pop ( ) ; pass = false ; break ;
case 0x0025 : /* 'BrtACBegin' */
2022-03-12 14:05:57 +00:00
state . push ( RT ) ; pass = true ; break ;
2019-04-01 14:25:15 +00:00
case 0x0026 : /* 'BrtACEnd' */
state . pop ( ) ; pass = false ; break ;
2017-04-09 04:03:19 +00:00
case 0x0010 : /* 'BrtFRTArchID$' */ break ;
2017-04-08 06:55:35 +00:00
default :
2022-03-12 14:05:57 +00:00
if ( R . T ) { /* empty */ }
else if ( ! pass || ( opts . WTF && state [ state . length - 1 ] != 0x0025 /* BrtACBegin */ && state [ state . length - 1 ] != 0x0023 /* BrtFRTBegin */ ) ) throw new Error ( "Unexpected record 0x" + RT . toString ( 16 ) ) ;
2017-02-03 20:50:45 +00:00
}
2017-02-19 20:36:32 +00:00
} , opts ) ;
2017-02-03 20:50:45 +00:00
parse _wb _defaults ( wb ) ;
2017-03-12 18:02:43 +00:00
// $FlowIgnore
2017-02-19 20:36:32 +00:00
wb . Names = Names ;
2017-11-15 18:14:02 +00:00
( wb /*:any*/ ) . supbooks = supbooks ;
2017-02-03 20:50:45 +00:00
return wb ;
}
2018-01-23 09:07:51 +00:00
function write _BUNDLESHS ( ba , wb /*::, opts*/ ) {
2022-03-12 14:05:57 +00:00
write _record ( ba , 0x008F /* BrtBeginBundleShs */ ) ;
2017-02-03 20:50:45 +00:00
for ( var idx = 0 ; idx != wb . SheetNames . length ; ++ idx ) {
2017-03-31 18:46:42 +00:00
var viz = wb . Workbook && wb . Workbook . Sheets && wb . Workbook . Sheets [ idx ] && wb . Workbook . Sheets [ idx ] . Hidden || 0 ;
var d = { Hidden : viz , iTabID : idx + 1 , strRelID : 'rId' + ( idx + 1 ) , name : wb . SheetNames [ idx ] } ;
2022-03-12 14:05:57 +00:00
write _record ( ba , 0x009C /* BrtBundleSh */ , write _BrtBundleSh ( d ) ) ;
2017-02-03 20:50:45 +00:00
}
2022-03-12 14:05:57 +00:00
write _record ( ba , 0x0090 /* BrtEndBundleShs */ ) ;
2017-02-03 20:50:45 +00:00
}
2018-02-14 20:06:35 +00:00
/* [MS-XLSB] 2.4.649 BrtFileVersion */
2017-02-03 20:50:45 +00:00
function write _BrtFileVersion ( data , o ) {
if ( ! o ) o = new _buf ( 127 ) ;
for ( var i = 0 ; i != 4 ; ++ i ) o . write _shift ( 4 , 0 ) ;
write _XLWideString ( "SheetJS" , o ) ;
write _XLWideString ( XLSX . version , o ) ;
write _XLWideString ( XLSX . version , o ) ;
write _XLWideString ( "7262" , o ) ;
return o . length > o . l ? o . slice ( 0 , o . l ) : o ;
}
2018-02-14 20:06:35 +00:00
/* [MS-XLSB] 2.4.301 BrtBookView */
2017-03-31 18:46:42 +00:00
function write _BrtBookView ( idx , o ) {
if ( ! o ) o = new _buf ( 29 ) ;
o . write _shift ( - 4 , 0 ) ;
o . write _shift ( - 4 , 460 ) ;
o . write _shift ( 4 , 28800 ) ;
o . write _shift ( 4 , 17600 ) ;
o . write _shift ( 4 , 500 ) ;
o . write _shift ( 4 , idx ) ;
o . write _shift ( 4 , idx ) ;
var flags = 0x78 ;
o . write _shift ( 1 , flags ) ;
return o . length > o . l ? o . slice ( 0 , o . l ) : o ;
}
2018-01-23 09:07:51 +00:00
function write _BOOKVIEWS ( ba , wb /*::, opts*/ ) {
2017-03-31 18:46:42 +00:00
/* required if hidden tab appears before visible tab */
if ( ! wb . Workbook || ! wb . Workbook . Sheets ) return ;
var sheets = wb . Workbook . Sheets ;
var i = 0 , vistab = - 1 , hidden = - 1 ;
for ( ; i < sheets . length ; ++ i ) {
if ( ! sheets [ i ] || ! sheets [ i ] . Hidden && vistab == - 1 ) vistab = i ;
else if ( sheets [ i ] . Hidden == 1 && hidden == - 1 ) hidden = i ;
}
if ( hidden > vistab ) return ;
2022-03-12 14:05:57 +00:00
write _record ( ba , 0x0087 /* BrtBeginBookViews */ ) ;
write _record ( ba , 0x009E /* BrtBookView */ , write _BrtBookView ( vistab ) ) ;
2017-02-03 20:50:45 +00:00
/* 1*(BrtBookView *FRT) */
2022-03-12 14:05:57 +00:00
write _record ( ba , 0x0088 /* BrtEndBookViews */ ) ;
2017-02-03 20:50:45 +00:00
}
2022-05-25 01:45:55 +00:00
function write _BRTNAMES ( ba , wb ) {
if ( ! wb . Workbook || ! wb . Workbook . Names ) return ;
wb . Workbook . Names . forEach ( function ( name ) { try {
2022-05-27 20:26:39 +00:00
if ( name . Flags & 0x0e ) return ; // TODO: macro name write
2022-05-25 01:45:55 +00:00
write _record ( ba , 0x0027 /* BrtName */ , write _BrtName ( name , wb ) ) ;
} catch ( e ) {
console . error ( "Could not serialize defined name " + JSON . stringify ( name ) ) ;
} } ) ;
}
function write _SELF _EXTERNS _xlsb ( wb ) {
var L = wb . SheetNames . length ;
2022-05-27 20:26:39 +00:00
var o = new _buf ( 12 * L + 28 ) ;
o . write _shift ( 4 , L + 2 ) ;
2022-05-25 01:45:55 +00:00
o . write _shift ( 4 , 0 ) ; o . write _shift ( 4 , - 2 ) ; o . write _shift ( 4 , - 2 ) ; // workbook-level reference
2022-05-27 20:26:39 +00:00
o . write _shift ( 4 , 0 ) ; o . write _shift ( 4 , - 1 ) ; o . write _shift ( 4 , - 1 ) ; // #REF!...
2022-05-25 01:45:55 +00:00
for ( var i = 0 ; i < L ; ++ i ) {
o . write _shift ( 4 , 0 ) ; o . write _shift ( 4 , i ) ; o . write _shift ( 4 , i ) ;
}
return o ;
}
function write _EXTERNALS _xlsb ( ba , wb ) {
write _record ( ba , 0x0161 /* BrtBeginExternals */ ) ;
write _record ( ba , 0x0165 /* BrtSupSelf */ ) ;
write _record ( ba , 0x016A /* BrtExternSheet */ , write _SELF _EXTERNS _xlsb ( wb , 0 ) ) ;
write _record ( ba , 0x0162 /* BrtEndExternals */ ) ;
}
2018-02-14 20:06:35 +00:00
/* [MS-XLSB] 2.4.305 BrtCalcProp */
2018-01-23 09:07:51 +00:00
/ * f u n c t i o n w r i t e _ B r t C a l c P r o p ( d a t a , o ) {
2017-02-03 20:50:45 +00:00
if ( ! o ) o = new _buf ( 26 ) ;
2018-01-23 09:07:51 +00:00
o . write _shift ( 4 , 0 ) ; // force recalc
2017-02-03 20:50:45 +00:00
o . write _shift ( 4 , 1 ) ;
o . write _shift ( 4 , 0 ) ;
write _Xnum ( 0 , o ) ;
o . write _shift ( - 4 , 1023 ) ;
o . write _shift ( 1 , 0x33 ) ;
o . write _shift ( 1 , 0x00 ) ;
return o ;
2018-01-23 09:07:51 +00:00
} * /
2017-02-03 20:50:45 +00:00
2018-02-14 20:06:35 +00:00
/* [MS-XLSB] 2.4.646 BrtFileRecover */
2018-01-23 09:07:51 +00:00
/ * f u n c t i o n w r i t e _ B r t F i l e R e c o v e r ( d a t a , o ) {
2017-02-03 20:50:45 +00:00
if ( ! o ) o = new _buf ( 1 ) ;
o . write _shift ( 1 , 0 ) ;
return o ;
2018-01-23 09:07:51 +00:00
} * /
2017-02-03 20:50:45 +00:00
2018-02-14 20:06:35 +00:00
/* [MS-XLSB] 2.1.7.61 Workbook */
2017-02-03 20:50:45 +00:00
function write _wb _bin ( wb , opts ) {
var ba = buf _array ( ) ;
2022-03-12 14:05:57 +00:00
write _record ( ba , 0x0083 /* BrtBeginBook */ ) ;
write _record ( ba , 0x0080 /* BrtFileVersion */ , write _BrtFileVersion ( ) ) ;
2017-02-03 20:50:45 +00:00
/* [[BrtFileSharingIso] BrtFileSharing] */
2022-03-12 14:05:57 +00:00
write _record ( ba , 0x0099 /* BrtWbProp */ , write _BrtWbProp ( wb . Workbook && wb . Workbook . WBProps || null ) ) ;
2017-02-03 20:50:45 +00:00
/* [ACABSPATH] */
/* [[BrtBookProtectionIso] BrtBookProtection] */
2017-03-31 18:46:42 +00:00
write _BOOKVIEWS ( ba , wb , opts ) ;
2017-02-03 20:50:45 +00:00
write _BUNDLESHS ( ba , wb , opts ) ;
/* [FNGROUP] */
2022-05-25 01:45:55 +00:00
write _EXTERNALS _xlsb ( ba , wb ) ;
if ( ( wb . Workbook || { } ) . Names ) write _BRTNAMES ( ba , wb ) ;
2022-03-12 14:05:57 +00:00
/* write_record(ba, 0x009D BrtCalcProp, write_BrtCalcProp()); */
2017-02-03 20:50:45 +00:00
/* [BrtOleSize] */
/* *(BrtUserBookView *FRT) */
/* [PIVOTCACHEIDS] */
/* [BrtWbFactoid] */
/* [SMARTTAGTYPES] */
/* [BrtWebOpt] */
2022-03-12 14:05:57 +00:00
/* write_record(ba, 0x009B BrtFileRecover, write_BrtFileRecover()); */
2017-02-03 20:50:45 +00:00
/* [WEBPUBITEMS] */
/* [CRERRS] */
/* FRTWORKBOOK */
2022-03-12 14:05:57 +00:00
write _record ( ba , 0x0084 /* BrtEndBook */ ) ;
2017-02-03 20:50:45 +00:00
return ba . end ( ) ;
}
2017-03-12 18:02:43 +00:00
function parse _wb ( data , name /*:string*/ , opts ) /*:WorkbookFile*/ {
2017-02-22 06:57:59 +00:00
if ( name . slice ( - 4 ) === ".bin" ) return parse _wb _bin ( ( data /*:any*/ ) , opts ) ;
2017-02-10 19:23:01 +00:00
return parse _wb _xml ( ( data /*:any*/ ) , opts ) ;
2017-02-03 20:50:45 +00:00
}
2017-11-20 01:51:14 +00:00
function parse _ws ( data , name /*:string*/ , idx /*:number*/ , opts , rels , wb , themes , styles ) /*:Worksheet*/ {
if ( name . slice ( - 4 ) === ".bin" ) return parse _ws _bin ( ( data /*:any*/ ) , opts , idx , rels , wb , themes , styles ) ;
return parse _ws _xml ( ( data /*:any*/ ) , opts , idx , rels , wb , themes , styles ) ;
2017-02-03 20:50:45 +00:00
}
2017-11-20 01:51:14 +00:00
function parse _cs ( data , name /*:string*/ , idx /*:number*/ , opts , rels , wb , themes , styles ) /*:Worksheet*/ {
if ( name . slice ( - 4 ) === ".bin" ) return parse _cs _bin ( ( data /*:any*/ ) , opts , idx , rels , wb , themes , styles ) ;
return parse _cs _xml ( ( data /*:any*/ ) , opts , idx , rels , wb , themes , styles ) ;
2017-03-27 21:35:15 +00:00
}
2017-11-20 01:51:14 +00:00
function parse _ms ( data , name /*:string*/ , idx /*:number*/ , opts , rels , wb , themes , styles ) /*:Worksheet*/ {
if ( name . slice ( - 4 ) === ".bin" ) return parse _ms _bin ( ( data /*:any*/ ) , opts , idx , rels , wb , themes , styles ) ;
return parse _ms _xml ( ( data /*:any*/ ) , opts , idx , rels , wb , themes , styles ) ;
2017-03-28 04:41:01 +00:00
}
2017-11-20 01:51:14 +00:00
function parse _ds ( data , name /*:string*/ , idx /*:number*/ , opts , rels , wb , themes , styles ) /*:Worksheet*/ {
if ( name . slice ( - 4 ) === ".bin" ) return parse _ds _bin ( ( data /*:any*/ ) , opts , idx , rels , wb , themes , styles ) ;
return parse _ds _xml ( ( data /*:any*/ ) , opts , idx , rels , wb , themes , styles ) ;
2017-03-28 04:41:01 +00:00
}
2017-03-19 06:50:30 +00:00
function parse _sty ( data , name /*:string*/ , themes , opts ) {
if ( name . slice ( - 4 ) === ".bin" ) return parse _sty _bin ( ( data /*:any*/ ) , themes , opts ) ;
return parse _sty _xml ( ( data /*:any*/ ) , themes , opts ) ;
2017-02-03 20:50:45 +00:00
}
2017-02-10 19:23:01 +00:00
function parse _sst ( data , name /*:string*/ , opts ) /*:SST*/ {
2017-02-22 06:57:59 +00:00
if ( name . slice ( - 4 ) === ".bin" ) return parse _sst _bin ( ( data /*:any*/ ) , opts ) ;
2017-02-10 19:23:01 +00:00
return parse _sst _xml ( ( data /*:any*/ ) , opts ) ;
2017-02-03 20:50:45 +00:00
}
2017-12-30 05:40:35 +00:00
function parse _cmnt ( data , name /*:string*/ , opts ) /*:Array<RawComment>*/ {
2017-02-22 06:57:59 +00:00
if ( name . slice ( - 4 ) === ".bin" ) return parse _comments _bin ( ( data /*:any*/ ) , opts ) ;
2017-02-10 19:23:01 +00:00
return parse _comments _xml ( ( data /*:any*/ ) , opts ) ;
2017-02-03 20:50:45 +00:00
}
2017-02-10 19:23:01 +00:00
function parse _cc ( data , name /*:string*/ , opts ) {
2017-08-19 23:06:34 +00:00
if ( name . slice ( - 4 ) === ".bin" ) return parse _cc _bin ( ( data /*:any*/ ) , name , opts ) ;
return parse _cc _xml ( ( data /*:any*/ ) , name , opts ) ;
}
2019-11-01 03:09:14 +00:00
function parse _xlink ( data , rel , name /*:string*/ , opts ) {
if ( name . slice ( - 4 ) === ".bin" ) return parse _xlink _bin ( ( data /*:any*/ ) , rel , name , opts ) ;
return parse _xlink _xml ( ( data /*:any*/ ) , rel , name , opts ) ;
2017-02-03 20:50:45 +00:00
}
2022-03-03 08:35:39 +00:00
function parse _xlmeta ( data , name /*:string*/ , opts ) {
if ( name . slice ( - 4 ) === ".bin" ) return parse _xlmeta _bin ( ( data /*:any*/ ) , name , opts ) ;
return parse _xlmeta _xml ( ( data /*:any*/ ) , name , opts ) ;
}
2017-02-03 20:50:45 +00:00
var attregexg2 = /([\w:]+)=((?:")([^"]*)(?:")|(?:')([^']*)(?:'))/g ;
var attregex2 = /([\w:]+)=((?:")(?:[^"]*)(?:")|(?:')(?:[^']*)(?:'))/ ;
2017-02-10 19:23:01 +00:00
function xlml _parsexmltag ( tag /*:string*/ , skip _root /*:?boolean*/ ) {
2017-02-03 20:50:45 +00:00
var words = tag . split ( /\s+/ ) ;
2017-02-10 19:23:01 +00:00
var z /*:any*/ = ( [ ] /*:any*/ ) ; if ( ! skip _root ) z [ 0 ] = words [ 0 ] ;
2017-02-03 20:50:45 +00:00
if ( words . length === 1 ) return z ;
var m = tag . match ( attregexg2 ) , y , j , w , i ;
if ( m ) for ( i = 0 ; i != m . length ; ++ i ) {
y = m [ i ] . match ( attregex2 ) ;
2017-02-10 19:23:01 +00:00
/*:: if(!y || !y[2]) continue; */
2018-01-11 08:01:25 +00:00
if ( ( j = y [ 1 ] . indexOf ( ":" ) ) === - 1 ) z [ y [ 1 ] ] = y [ 2 ] . slice ( 1 , y [ 2 ] . length - 1 ) ;
2017-02-03 20:50:45 +00:00
else {
2018-01-11 08:01:25 +00:00
if ( y [ 1 ] . slice ( 0 , 6 ) === "xmlns:" ) w = "xmlns" + y [ 1 ] . slice ( 6 ) ;
else w = y [ 1 ] . slice ( j + 1 ) ;
z [ w ] = y [ 2 ] . slice ( 1 , y [ 2 ] . length - 1 ) ;
2017-02-03 20:50:45 +00:00
}
}
return z ;
}
2017-02-10 19:23:01 +00:00
function xlml _parsexmltagobj ( tag /*:string*/ ) {
2017-02-03 20:50:45 +00:00
var words = tag . split ( /\s+/ ) ;
var z = { } ;
if ( words . length === 1 ) return z ;
var m = tag . match ( attregexg2 ) , y , j , w , i ;
if ( m ) for ( i = 0 ; i != m . length ; ++ i ) {
y = m [ i ] . match ( attregex2 ) ;
2017-02-10 19:23:01 +00:00
/*:: if(!y || !y[2]) continue; */
2018-01-11 08:01:25 +00:00
if ( ( j = y [ 1 ] . indexOf ( ":" ) ) === - 1 ) z [ y [ 1 ] ] = y [ 2 ] . slice ( 1 , y [ 2 ] . length - 1 ) ;
2017-02-03 20:50:45 +00:00
else {
2018-01-11 08:01:25 +00:00
if ( y [ 1 ] . slice ( 0 , 6 ) === "xmlns:" ) w = "xmlns" + y [ 1 ] . slice ( 6 ) ;
else w = y [ 1 ] . slice ( j + 1 ) ;
z [ w ] = y [ 2 ] . slice ( 1 , y [ 2 ] . length - 1 ) ;
2017-02-03 20:50:45 +00:00
}
}
return z ;
}
// ----
2022-03-20 05:29:24 +00:00
/* map from xlml named formats to SSF TODO: localize */
var XLMLFormatMap /*: {[string]:string}*/ ;
2017-02-10 19:23:01 +00:00
function xlml _format ( format , value ) /*:string*/ {
2017-02-03 20:50:45 +00:00
var fmt = XLMLFormatMap [ format ] || unescapexml ( format ) ;
2022-03-20 05:29:24 +00:00
if ( fmt === "General" ) return SSF _general ( value ) ;
return SSF _format ( fmt , value ) ;
2017-02-03 20:50:45 +00:00
}
2017-12-30 05:40:35 +00:00
function xlml _set _custprop ( Custprops , key , cp , val /*:string*/ ) {
2017-03-12 18:02:43 +00:00
var oval /*:any*/ = val ;
2017-02-03 20:50:45 +00:00
switch ( ( cp [ 0 ] . match ( /dt:dt="([\w.]+)"/ ) || [ "" , "" ] ) [ 1 ] ) {
2017-03-12 18:02:43 +00:00
case "boolean" : oval = parsexmlbool ( val ) ; break ;
case "i2" : case "int" : oval = parseInt ( val , 10 ) ; break ;
case "r4" : case "float" : oval = parseFloat ( val ) ; break ;
2017-03-23 01:18:40 +00:00
case "date" : case "dateTime.tz" : oval = parseDate ( val ) ; break ;
2017-02-03 20:50:45 +00:00
case "i8" : case "string" : case "fixed" : case "uuid" : case "bin.base64" : break ;
2017-03-12 18:02:43 +00:00
default : throw new Error ( "bad custprop:" + cp [ 0 ] ) ;
2017-02-03 20:50:45 +00:00
}
2017-12-30 05:40:35 +00:00
Custprops [ unescapexml ( key ) ] = oval ;
2017-02-03 20:50:45 +00:00
}
2017-02-10 19:23:01 +00:00
function safe _format _xlml ( cell /*:Cell*/ , nf , o ) {
2017-03-15 08:19:02 +00:00
if ( cell . t === 'z' ) return ;
2017-04-21 22:02:02 +00:00
if ( ! o || o . cellText !== false ) try {
2017-02-03 20:50:45 +00:00
if ( cell . t === 'e' ) { cell . w = cell . w || BErr [ cell . v ] ; }
else if ( nf === "General" ) {
if ( cell . t === 'n' ) {
2022-03-20 05:29:24 +00:00
if ( ( cell . v | 0 ) === cell . v ) cell . w = cell . v . toString ( 10 ) ;
else cell . w = SSF _general _num ( cell . v ) ;
2017-02-03 20:50:45 +00:00
}
2022-03-20 05:29:24 +00:00
else cell . w = SSF _general ( cell . v ) ;
2017-02-03 20:50:45 +00:00
}
else cell . w = xlml _format ( nf || "General" , cell . v ) ;
2017-04-21 22:02:02 +00:00
} catch ( e ) { if ( o . WTF ) throw e ; }
try {
2017-03-21 20:44:35 +00:00
var z = XLMLFormatMap [ nf ] || nf || "General" ;
if ( o . cellNF ) cell . z = z ;
2022-03-20 05:29:24 +00:00
if ( o . cellDates && cell . t == 'n' && fmt _is _date ( z ) ) {
var _d = SSF _parse _date _code ( cell . v ) ; if ( _d ) { cell . t = 'd' ; cell . v = new Date ( _d . y , _d . m - 1 , _d . d , _d . H , _d . M , _d . S , _d . u ) ; }
2017-03-21 20:44:35 +00:00
}
2017-02-03 20:50:45 +00:00
} catch ( e ) { if ( o . WTF ) throw e ; }
}
function process _style _xlml ( styles , stag , opts ) {
if ( opts . cellStyles ) {
if ( stag . Interior ) {
var I = stag . Interior ;
if ( I . Pattern ) I . patternType = XLMLPatternTypeMap [ I . Pattern ] || I . Pattern ;
}
}
styles [ stag . ID ] = stag ;
}
/* TODO: there must exist some form of OSP-blessed spec */
2017-03-12 18:02:43 +00:00
function parse _xlml _data ( xml , ss , data , cell /*:any*/ , base , styles , csty , row , arrayf , o ) {
2017-02-03 20:50:45 +00:00
var nf = "General" , sid = cell . StyleID , S = { } ; o = o || { } ;
var interiors = [ ] ;
2017-03-10 01:09:18 +00:00
var i = 0 ;
2017-02-03 20:50:45 +00:00
if ( sid === undefined && row ) sid = row . StyleID ;
if ( sid === undefined && csty ) sid = csty . StyleID ;
while ( styles [ sid ] !== undefined ) {
if ( styles [ sid ] . nf ) nf = styles [ sid ] . nf ;
if ( styles [ sid ] . Interior ) interiors . push ( styles [ sid ] . Interior ) ;
if ( ! styles [ sid ] . Parent ) break ;
sid = styles [ sid ] . Parent ;
}
switch ( data . Type ) {
case 'Boolean' :
cell . t = 'b' ;
cell . v = parsexmlbool ( xml ) ;
break ;
case 'String' :
cell . t = 's' ; cell . r = xlml _fixstr ( unescapexml ( xml ) ) ;
2020-03-18 06:47:02 +00:00
cell . v = ( xml . indexOf ( "<" ) > - 1 ? unescapexml ( ss || xml ) . replace ( /<.*?>/g , "" ) : cell . r ) ; // todo: BR etc
2017-02-03 20:50:45 +00:00
break ;
case 'DateTime' :
2017-05-17 04:23:36 +00:00
if ( xml . slice ( - 1 ) != "Z" ) xml += "Z" ;
2017-03-23 01:18:40 +00:00
cell . v = ( parseDate ( xml ) - new Date ( Date . UTC ( 1899 , 11 , 30 ) ) ) / ( 24 * 60 * 60 * 1000 ) ;
2017-02-03 20:50:45 +00:00
if ( cell . v !== cell . v ) cell . v = unescapexml ( xml ) ;
2017-03-18 00:45:06 +00:00
else if ( cell . v < 60 ) cell . v = cell . v - 1 ;
2017-02-03 20:50:45 +00:00
if ( ! nf || nf == "General" ) nf = "yyyy-mm-dd" ;
/* falls through */
case 'Number' :
if ( cell . v === undefined ) cell . v = + xml ;
if ( ! cell . t ) cell . t = 'n' ;
break ;
2017-04-26 02:27:12 +00:00
case 'Error' : cell . t = 'e' ; cell . v = RBErr [ xml ] ; if ( o . cellText !== false ) cell . w = xml ; break ;
2020-03-15 07:42:05 +00:00
default :
if ( xml == "" && ss == "" ) { cell . t = 'z' ; }
else { cell . t = 's' ; cell . v = xlml _fixstr ( ss || xml ) ; }
break ;
2017-02-03 20:50:45 +00:00
}
safe _format _xlml ( cell , nf , o ) ;
2017-04-26 02:27:12 +00:00
if ( o . cellFormula !== false ) {
2017-02-19 20:36:32 +00:00
if ( cell . Formula ) {
var fstr = unescapexml ( cell . Formula ) ;
/* strictly speaking, the leading = is required but some writers omit */
2018-01-11 08:01:25 +00:00
if ( fstr . charCodeAt ( 0 ) == 61 /* = */ ) fstr = fstr . slice ( 1 ) ;
2017-02-19 20:36:32 +00:00
cell . f = rc _to _a1 ( fstr , base ) ;
2017-04-02 06:47:25 +00:00
delete cell . Formula ;
2017-02-19 20:36:32 +00:00
if ( cell . ArrayRange == "RC" ) cell . F = rc _to _a1 ( "RC:RC" , base ) ;
else if ( cell . ArrayRange ) {
cell . F = rc _to _a1 ( cell . ArrayRange , base ) ;
arrayf . push ( [ safe _decode _range ( cell . F ) , cell . F ] ) ;
}
} else {
for ( i = 0 ; i < arrayf . length ; ++ i )
if ( base . r >= arrayf [ i ] [ 0 ] . s . r && base . r <= arrayf [ i ] [ 0 ] . e . r )
if ( base . c >= arrayf [ i ] [ 0 ] . s . c && base . c <= arrayf [ i ] [ 0 ] . e . c )
cell . F = arrayf [ i ] [ 1 ] ;
}
2017-02-03 20:50:45 +00:00
}
if ( o . cellStyles ) {
interiors . forEach ( function ( x ) {
if ( ! S . patternType && x . patternType ) S . patternType = x . patternType ;
} ) ;
cell . s = S ;
}
2017-11-15 18:14:02 +00:00
if ( cell . StyleID !== undefined ) cell . ixfe = cell . StyleID ;
2017-02-03 20:50:45 +00:00
}
2022-05-30 08:40:51 +00:00
function xlml _prefix _dname ( dname ) {
return XLSLblBuiltIn . indexOf ( "_xlnm." + dname ) > - 1 ? "_xlnm." + dname : dname ;
}
2017-02-10 19:23:01 +00:00
function xlml _clean _comment ( comment /*:any*/ ) {
2017-04-02 06:47:25 +00:00
comment . t = comment . v || "" ;
comment . t = comment . t . replace ( /\r\n/g , "\n" ) . replace ( /\r/g , "\n" ) ;
2017-02-03 20:50:45 +00:00
comment . v = comment . w = comment . ixfe = undefined ;
}
/* TODO: Everything */
2017-06-24 06:51:37 +00:00
function parse _xlml _xml ( d , _opts ) /*:Workbook*/ {
var opts = _opts || { } ;
2022-03-20 05:29:24 +00:00
make _ssf ( ) ;
2017-02-24 10:33:01 +00:00
var str = debom ( xlml _normalize ( d ) ) ;
2017-12-30 05:40:35 +00:00
if ( opts . type == 'binary' || opts . type == 'array' || opts . type == 'base64' ) {
2022-03-12 14:05:57 +00:00
if ( typeof $cptable !== 'undefined' ) str = $cptable . utils . decode ( 65001 , char _codes ( str ) ) ;
2017-09-30 06:18:11 +00:00
else str = utf8read ( str ) ;
}
2017-07-26 08:35:28 +00:00
var opening = str . slice ( 0 , 1024 ) . toLowerCase ( ) , ishtml = false ;
2022-01-10 18:45:50 +00:00
opening = opening . replace ( /".*?"/g , "" ) ;
2021-10-13 07:20:25 +00:00
if ( ( opening . indexOf ( ">" ) & 1023 ) > Math . min ( ( opening . indexOf ( "," ) & 1023 ) , ( opening . indexOf ( ";" ) & 1023 ) ) ) { var _o = dup ( opts ) ; _o . type = "string" ; return PRN . to _workbook ( str , _o ) ; }
2017-07-26 08:35:28 +00:00
if ( opening . indexOf ( "<?xml" ) == - 1 ) [ "html" , "table" , "head" , "meta" , "script" , "style" , "div" ] . forEach ( function ( tag ) { if ( opening . indexOf ( "<" + tag ) >= 0 ) ishtml = true ; } ) ;
2022-03-20 05:29:24 +00:00
if ( ishtml ) return html _to _workbook ( str , opts ) ;
XLMLFormatMap = ( {
"General Number" : "General" ,
"General Date" : table _fmt [ 22 ] ,
"Long Date" : "dddd, mmmm dd, yyyy" ,
"Medium Date" : table _fmt [ 15 ] ,
"Short Date" : table _fmt [ 14 ] ,
"Long Time" : table _fmt [ 19 ] ,
"Medium Time" : table _fmt [ 18 ] ,
"Short Time" : table _fmt [ 20 ] ,
"Currency" : '"$"#,##0.00_);[Red]\\("$"#,##0.00\\)' ,
"Fixed" : table _fmt [ 2 ] ,
"Standard" : table _fmt [ 4 ] ,
"Percent" : table _fmt [ 10 ] ,
"Scientific" : table _fmt [ 11 ] ,
"Yes/No" : '"Yes";"Yes";"No";@' ,
"True/False" : '"True";"True";"False";@' ,
"On/Off" : '"Yes";"Yes";"No";@'
} /*:any*/ ) ;
2017-02-03 20:50:45 +00:00
var Rn ;
var state = [ ] , tmp ;
2017-04-09 04:03:19 +00:00
if ( DENSE != null && opts . dense == null ) opts . dense = DENSE ;
2017-12-30 05:40:35 +00:00
var sheets = { } , sheetnames /*:Array<string>*/ = [ ] , cursheet /*:Worksheet*/ = ( opts . dense ? [ ] : { } ) , sheetname = "" ;
2022-03-16 03:18:09 +00:00
var cell = ( { } /*:any*/ ) , row = { } ; // eslint-disable-line no-unused-vars
2017-02-10 19:23:01 +00:00
var dtag = xlml _parsexmltag ( '<Data ss:Type="String">' ) , didx = 0 ;
2017-02-03 20:50:45 +00:00
var c = 0 , r = 0 ;
2017-12-30 05:40:35 +00:00
var refguess /*:Range*/ = { s : { r : 2000000 , c : 2000000 } , e : { r : 0 , c : 0 } } ;
2017-02-03 20:50:45 +00:00
var styles = { } , stag = { } ;
var ss = "" , fidx = 0 ;
2017-12-30 05:40:35 +00:00
var merges /*:Array<Range>*/ = [ ] ;
var Props = { } , Custprops = { } , pidx = 0 , cp = [ ] ;
var comments /*:Array<Comment>*/ = [ ] , comment /*:Comment*/ = ( { } /*:any*/ ) ;
2017-03-20 09:02:25 +00:00
var cstys = [ ] , csty , seencol = false ;
2017-12-30 05:40:35 +00:00
var arrayf /*:Array<[Range, string]>*/ = [ ] ;
var rowinfo /*:Array<RowInfo>*/ = [ ] , rowobj = { } , cc = 0 , rr = 0 ;
2017-06-01 21:22:11 +00:00
var Workbook /*:WBWBProps*/ = ( { Sheets : [ ] , WBProps : { date1904 : false } } /*:any*/ ) , wsprops = { } ;
2017-02-03 20:50:45 +00:00
xlmlregex . lastIndex = 0 ;
2017-06-24 06:51:37 +00:00
str = str . replace ( /<!--([\s\S]*?)-->/mg , "" ) ;
2020-03-18 06:47:02 +00:00
var raw _Rn3 = "" ;
while ( ( Rn = xlmlregex . exec ( str ) ) ) switch ( ( Rn [ 3 ] = ( raw _Rn3 = Rn [ 3 ] ) . toLowerCase ( ) ) ) {
case 'data' /*case 'Data'*/ :
if ( raw _Rn3 == "data" ) {
if ( Rn [ 1 ] === '/' ) { if ( ( tmp = state . pop ( ) ) [ 0 ] !== Rn [ 3 ] ) throw new Error ( "Bad state: " + tmp . join ( "|" ) ) ; }
else if ( Rn [ 0 ] . charAt ( Rn [ 0 ] . length - 2 ) !== '/' ) state . push ( [ Rn [ 3 ] , true ] ) ;
break ;
}
2017-02-03 20:50:45 +00:00
if ( state [ state . length - 1 ] [ 1 ] ) break ;
2020-03-18 06:47:02 +00:00
if ( Rn [ 1 ] === '/' ) parse _xlml _data ( str . slice ( didx , Rn . index ) , ss , dtag , state [ state . length - 1 ] [ 0 ] == /*"Comment"*/ "comment" ? comment : cell , { c : c , r : r } , styles , cstys [ c ] , row , arrayf , opts ) ;
2017-02-03 20:50:45 +00:00
else { ss = "" ; dtag = xlml _parsexmltag ( Rn [ 0 ] ) ; didx = Rn . index + Rn [ 0 ] . length ; }
break ;
2020-03-18 06:47:02 +00:00
case 'cell' /*case 'Cell'*/ :
2017-02-03 20:50:45 +00:00
if ( Rn [ 1 ] === '/' ) {
if ( comments . length > 0 ) cell . c = comments ;
2022-05-25 01:45:55 +00:00
if ( ( ! opts . sheetRows || opts . sheetRows > r ) && cell . v !== void 0 ) {
2017-04-08 06:55:35 +00:00
if ( opts . dense ) {
if ( ! cursheet [ r ] ) cursheet [ r ] = [ ] ;
cursheet [ r ] [ c ] = cell ;
} else cursheet [ encode _col ( c ) + encode _row ( r ) ] = cell ;
}
2017-02-03 20:50:45 +00:00
if ( cell . HRef ) {
2021-10-13 07:20:25 +00:00
cell . l = ( { Target : unescapexml ( cell . HRef ) } /*:any*/ ) ;
2017-12-15 01:18:40 +00:00
if ( cell . HRefScreenTip ) cell . l . Tooltip = cell . HRefScreenTip ;
2017-03-28 22:03:03 +00:00
delete cell . HRef ; delete cell . HRefScreenTip ;
2017-02-03 20:50:45 +00:00
}
if ( cell . MergeAcross || cell . MergeDown ) {
2017-10-17 00:14:32 +00:00
cc = c + ( parseInt ( cell . MergeAcross , 10 ) | 0 ) ;
rr = r + ( parseInt ( cell . MergeDown , 10 ) | 0 ) ;
2022-05-25 01:45:55 +00:00
if ( cc > c || rr > r ) merges . push ( { s : { c : c , r : r } , e : { c : cc , r : rr } } ) ;
2017-02-03 20:50:45 +00:00
}
2017-03-15 08:19:02 +00:00
if ( ! opts . sheetStubs ) { if ( cell . MergeAcross ) c = cc + 1 ; else ++ c ; }
else if ( cell . MergeAcross || cell . MergeDown ) {
/*:: if(!cc) cc = 0; if(!rr) rr = 0; */
for ( var cma = c ; cma <= cc ; ++ cma ) {
for ( var cmd = r ; cmd <= rr ; ++ cmd ) {
2017-04-08 06:55:35 +00:00
if ( cma > c || cmd > r ) {
if ( opts . dense ) {
if ( ! cursheet [ cmd ] ) cursheet [ cmd ] = [ ] ;
cursheet [ cmd ] [ cma ] = { t : 'z' } ;
} else cursheet [ encode _col ( cma ) + encode _row ( cmd ) ] = { t : 'z' } ;
}
2017-03-15 08:19:02 +00:00
}
}
c = cc + 1 ;
}
else ++ c ;
2017-02-03 20:50:45 +00:00
} else {
cell = xlml _parsexmltagobj ( Rn [ 0 ] ) ;
if ( cell . Index ) c = + cell . Index - 1 ;
if ( c < refguess . s . c ) refguess . s . c = c ;
if ( c > refguess . e . c ) refguess . e . c = c ;
2017-02-22 06:57:59 +00:00
if ( Rn [ 0 ] . slice ( - 2 ) === "/>" ) ++ c ;
2017-02-03 20:50:45 +00:00
comments = [ ] ;
}
break ;
2020-03-18 06:47:02 +00:00
case 'row' /*case 'Row'*/ :
2017-02-22 06:57:59 +00:00
if ( Rn [ 1 ] === '/' || Rn [ 0 ] . slice ( - 2 ) === "/>" ) {
2017-02-03 20:50:45 +00:00
if ( r < refguess . s . r ) refguess . s . r = r ;
if ( r > refguess . e . r ) refguess . e . r = r ;
2017-02-22 06:57:59 +00:00
if ( Rn [ 0 ] . slice ( - 2 ) === "/>" ) {
2017-02-03 20:50:45 +00:00
row = xlml _parsexmltag ( Rn [ 0 ] ) ;
if ( row . Index ) r = + row . Index - 1 ;
}
c = 0 ; ++ r ;
} else {
row = xlml _parsexmltag ( Rn [ 0 ] ) ;
if ( row . Index ) r = + row . Index - 1 ;
2017-04-28 07:28:03 +00:00
rowobj = { } ;
2017-06-10 01:47:42 +00:00
if ( row . AutoFitHeight == "0" || row . Height ) {
2017-04-28 07:28:03 +00:00
rowobj . hpx = parseInt ( row . Height , 10 ) ; rowobj . hpt = px2pt ( rowobj . hpx ) ;
rowinfo [ r ] = rowobj ;
}
if ( row . Hidden == "1" ) { rowobj . hidden = true ; rowinfo [ r ] = rowobj ; }
2017-02-03 20:50:45 +00:00
}
break ;
2020-03-18 06:47:02 +00:00
case 'worksheet' /*case 'Worksheet'*/ : /* TODO: read range from FullRows/FullColumns */
2017-02-03 20:50:45 +00:00
if ( Rn [ 1 ] === '/' ) {
2017-03-12 18:02:43 +00:00
if ( ( tmp = state . pop ( ) ) [ 0 ] !== Rn [ 3 ] ) throw new Error ( "Bad state: " + tmp . join ( "|" ) ) ;
2017-02-03 20:50:45 +00:00
sheetnames . push ( sheetname ) ;
2018-04-06 06:39:48 +00:00
if ( refguess . s . r <= refguess . e . r && refguess . s . c <= refguess . e . c ) {
cursheet [ "!ref" ] = encode _range ( refguess ) ;
if ( opts . sheetRows && opts . sheetRows <= refguess . e . r ) {
cursheet [ "!fullref" ] = cursheet [ "!ref" ] ;
refguess . e . r = opts . sheetRows - 1 ;
cursheet [ "!ref" ] = encode _range ( refguess ) ;
}
}
2017-12-30 05:40:35 +00:00
if ( merges . length ) cursheet [ "!merges" ] = merges ;
2017-03-20 09:02:25 +00:00
if ( cstys . length > 0 ) cursheet [ "!cols" ] = cstys ;
if ( rowinfo . length > 0 ) cursheet [ "!rows" ] = rowinfo ;
2017-02-03 20:50:45 +00:00
sheets [ sheetname ] = cursheet ;
} else {
refguess = { s : { r : 2000000 , c : 2000000 } , e : { r : 0 , c : 0 } } ;
r = c = 0 ;
state . push ( [ Rn [ 3 ] , false ] ) ;
tmp = xlml _parsexmltag ( Rn [ 0 ] ) ;
2017-03-13 06:46:37 +00:00
sheetname = unescapexml ( tmp . Name ) ;
2017-04-08 06:55:35 +00:00
cursheet = ( opts . dense ? [ ] : { } ) ;
2017-12-30 05:40:35 +00:00
merges = [ ] ;
2017-03-18 00:45:06 +00:00
arrayf = [ ] ;
2017-03-20 09:02:25 +00:00
rowinfo = [ ] ;
2017-03-31 18:46:42 +00:00
wsprops = { name : sheetname , Hidden : 0 } ;
Workbook . Sheets . push ( wsprops ) ;
2017-02-03 20:50:45 +00:00
}
break ;
2020-03-18 06:47:02 +00:00
case 'table' /*case 'Table'*/ :
2017-03-12 18:02:43 +00:00
if ( Rn [ 1 ] === '/' ) { if ( ( tmp = state . pop ( ) ) [ 0 ] !== Rn [ 3 ] ) throw new Error ( "Bad state: " + tmp . join ( "|" ) ) ; }
2017-02-03 20:50:45 +00:00
else if ( Rn [ 0 ] . slice ( - 2 ) == "/>" ) break ;
else {
state . push ( [ Rn [ 3 ] , false ] ) ;
2017-03-20 09:02:25 +00:00
cstys = [ ] ; seencol = false ;
2017-02-03 20:50:45 +00:00
}
break ;
2020-03-18 06:47:02 +00:00
case 'style' /*case 'Style'*/ :
2017-02-03 20:50:45 +00:00
if ( Rn [ 1 ] === '/' ) process _style _xlml ( styles , stag , opts ) ;
else stag = xlml _parsexmltag ( Rn [ 0 ] ) ;
break ;
2020-03-18 06:47:02 +00:00
case 'numberformat' /*case 'NumberFormat'*/ :
2017-03-25 01:36:40 +00:00
stag . nf = unescapexml ( xlml _parsexmltag ( Rn [ 0 ] ) . Format || "General" ) ;
if ( XLMLFormatMap [ stag . nf ] ) stag . nf = XLMLFormatMap [ stag . nf ] ;
2022-03-20 05:29:24 +00:00
for ( var ssfidx = 0 ; ssfidx != 0x188 ; ++ ssfidx ) if ( table _fmt [ ssfidx ] == stag . nf ) break ;
2022-04-11 04:11:47 +00:00
if ( ssfidx == 0x188 ) for ( ssfidx = 0x39 ; ssfidx != 0x188 ; ++ ssfidx ) if ( table _fmt [ ssfidx ] == null ) { SSF _ _load ( stag . nf , ssfidx ) ; break ; }
2017-02-03 20:50:45 +00:00
break ;
2020-03-18 06:47:02 +00:00
case 'column' /*case 'Column'*/ :
if ( state [ state . length - 1 ] [ 0 ] !== /*'Table'*/ 'table' ) break ;
2022-05-25 01:45:55 +00:00
if ( Rn [ 1 ] === '/' ) break ;
2017-02-03 20:50:45 +00:00
csty = xlml _parsexmltag ( Rn [ 0 ] ) ;
2017-04-28 07:28:03 +00:00
if ( csty . Hidden ) { csty . hidden = true ; delete csty . Hidden ; }
if ( csty . Width ) csty . wpx = parseInt ( csty . Width , 10 ) ;
2017-03-20 09:02:25 +00:00
if ( ! seencol && csty . wpx > 10 ) {
2017-04-28 07:28:03 +00:00
seencol = true ; MDW = DEF _MDW ; //find_mdw_wpx(csty.wpx);
2017-03-20 09:02:25 +00:00
for ( var _col = 0 ; _col < cstys . length ; ++ _col ) if ( cstys [ _col ] ) process _col ( cstys [ _col ] ) ;
}
if ( seencol ) process _col ( csty ) ;
2017-02-03 20:50:45 +00:00
cstys [ ( csty . Index - 1 || cstys . length ) ] = csty ;
2017-03-20 09:02:25 +00:00
for ( var i = 0 ; i < + csty . Span ; ++ i ) cstys [ cstys . length ] = dup ( csty ) ;
2017-02-03 20:50:45 +00:00
break ;
2020-03-18 06:47:02 +00:00
case 'namedrange' /*case 'NamedRange'*/ :
if ( Rn [ 1 ] === '/' ) break ;
2017-04-11 22:15:36 +00:00
if ( ! Workbook . Names ) Workbook . Names = [ ] ;
var _NamedRange = parsexmltag ( Rn [ 0 ] ) ;
2017-05-13 18:21:22 +00:00
var _DefinedName /*:DefinedName*/ = ( {
2022-05-30 08:40:51 +00:00
Name : xlml _prefix _dname ( _NamedRange . Name ) ,
2018-01-11 08:01:25 +00:00
Ref : rc _to _a1 ( _NamedRange . RefersTo . slice ( 1 ) , { r : 0 , c : 0 } )
2017-05-13 18:21:22 +00:00
} /*:any*/ ) ;
2017-04-11 22:15:36 +00:00
if ( Workbook . Sheets . length > 0 ) _DefinedName . Sheet = Workbook . Sheets . length - 1 ;
2017-05-13 18:21:22 +00:00
/*:: if(Workbook.Names) */ Workbook . Names . push ( _DefinedName ) ;
2017-04-11 22:15:36 +00:00
break ;
2020-03-18 06:47:02 +00:00
case 'namedcell' /*case 'NamedCell'*/ : break ;
case 'b' /*case 'B'*/ : break ;
case 'i' /*case 'I'*/ : break ;
case 'u' /*case 'U'*/ : break ;
case 's' /*case 'S'*/ : break ;
case 'em' /*case 'EM'*/ : break ;
case 'h2' /*case 'H2'*/ : break ;
case 'h3' /*case 'H3'*/ : break ;
case 'sub' /*case 'Sub'*/ : break ;
case 'sup' /*case 'Sup'*/ : break ;
case 'span' /*case 'Span'*/ : break ;
case 'alignment' /*case 'Alignment'*/ :
2019-11-01 03:09:14 +00:00
break ;
2020-03-18 06:47:02 +00:00
case 'borders' /*case 'Borders'*/ : break ;
case 'border' /*case 'Border'*/ : break ;
case 'font' /*case 'Font'*/ :
2017-02-22 06:57:59 +00:00
if ( Rn [ 0 ] . slice ( - 2 ) === "/>" ) break ;
2017-02-03 20:50:45 +00:00
else if ( Rn [ 1 ] === "/" ) ss += str . slice ( fidx , Rn . index ) ;
else fidx = Rn . index + Rn [ 0 ] . length ;
break ;
2020-03-18 06:47:02 +00:00
case 'interior' /*case 'Interior'*/ :
2017-02-03 20:50:45 +00:00
if ( ! opts . cellStyles ) break ;
stag . Interior = xlml _parsexmltag ( Rn [ 0 ] ) ;
break ;
2020-03-18 06:47:02 +00:00
case 'protection' /*case 'Protection'*/ : break ;
case 'author' /*case 'Author'*/ :
case 'title' /*case 'Title'*/ :
case 'description' /*case 'Description'*/ :
case 'created' /*case 'Created'*/ :
case 'keywords' /*case 'Keywords'*/ :
case 'subject' /*case 'Subject'*/ :
case 'category' /*case 'Category'*/ :
case 'company' /*case 'Company'*/ :
case 'lastauthor' /*case 'LastAuthor'*/ :
case 'lastsaved' /*case 'LastSaved'*/ :
case 'lastprinted' /*case 'LastPrinted'*/ :
case 'version' /*case 'Version'*/ :
case 'revision' /*case 'Revision'*/ :
case 'totaltime' /*case 'TotalTime'*/ :
case 'hyperlinkbase' /*case 'HyperlinkBase'*/ :
case 'manager' /*case 'Manager'*/ :
case 'contentstatus' /*case 'ContentStatus'*/ :
case 'identifier' /*case 'Identifier'*/ :
case 'language' /*case 'Language'*/ :
case 'appname' /*case 'AppName'*/ :
2017-02-22 06:57:59 +00:00
if ( Rn [ 0 ] . slice ( - 2 ) === "/>" ) break ;
2020-03-18 06:47:02 +00:00
else if ( Rn [ 1 ] === "/" ) xlml _set _prop ( Props , raw _Rn3 , str . slice ( pidx , Rn . index ) ) ;
2017-02-03 20:50:45 +00:00
else pidx = Rn . index + Rn [ 0 ] . length ;
break ;
2020-03-18 06:47:02 +00:00
case 'paragraphs' /*case 'Paragraphs'*/ : break ;
2017-02-03 20:50:45 +00:00
2020-03-18 06:47:02 +00:00
case 'styles' /*case 'Styles'*/ :
case 'workbook' /*case 'Workbook'*/ :
2017-03-12 18:02:43 +00:00
if ( Rn [ 1 ] === '/' ) { if ( ( tmp = state . pop ( ) ) [ 0 ] !== Rn [ 3 ] ) throw new Error ( "Bad state: " + tmp . join ( "|" ) ) ; }
2017-02-03 20:50:45 +00:00
else state . push ( [ Rn [ 3 ] , false ] ) ;
break ;
2020-03-18 06:47:02 +00:00
case 'comment' /*case 'Comment'*/ :
2017-02-03 20:50:45 +00:00
if ( Rn [ 1 ] === '/' ) {
2017-03-12 18:02:43 +00:00
if ( ( tmp = state . pop ( ) ) [ 0 ] !== Rn [ 3 ] ) throw new Error ( "Bad state: " + tmp . join ( "|" ) ) ;
2017-02-03 20:50:45 +00:00
xlml _clean _comment ( comment ) ;
comments . push ( comment ) ;
} else {
state . push ( [ Rn [ 3 ] , false ] ) ;
tmp = xlml _parsexmltag ( Rn [ 0 ] ) ;
2017-12-30 05:40:35 +00:00
comment = ( { a : tmp . Author } /*:any*/ ) ;
2017-02-03 20:50:45 +00:00
}
break ;
2020-03-18 06:47:02 +00:00
case 'autofilter' /*case 'AutoFilter'*/ :
2017-04-10 05:10:54 +00:00
if ( Rn [ 1 ] === '/' ) { if ( ( tmp = state . pop ( ) ) [ 0 ] !== Rn [ 3 ] ) throw new Error ( "Bad state: " + tmp . join ( "|" ) ) ; }
else if ( Rn [ 0 ] . charAt ( Rn [ 0 ] . length - 2 ) !== '/' ) {
var AutoFilter = xlml _parsexmltag ( Rn [ 0 ] ) ;
cursheet [ '!autofilter' ] = { ref : rc _to _a1 ( AutoFilter . Range ) . replace ( /\$/g , "" ) } ;
state . push ( [ Rn [ 3 ] , true ] ) ;
}
break ;
2020-03-18 06:47:02 +00:00
case 'name' /*case 'Name'*/ : break ;
2017-02-03 20:50:45 +00:00
2020-03-18 06:47:02 +00:00
case 'datavalidation' /*case 'DataValidation'*/ :
2019-11-01 03:09:14 +00:00
if ( Rn [ 1 ] === '/' ) {
if ( ( tmp = state . pop ( ) ) [ 0 ] !== Rn [ 3 ] ) throw new Error ( "Bad state: " + tmp . join ( "|" ) ) ;
} else {
if ( Rn [ 0 ] . charAt ( Rn [ 0 ] . length - 2 ) !== '/' ) state . push ( [ Rn [ 3 ] , true ] ) ;
}
break ;
2020-03-18 06:47:02 +00:00
case 'pixelsperinch' /*case 'PixelsPerInch'*/ :
break ;
case 'componentoptions' /*case 'ComponentOptions'*/ :
case 'documentproperties' /*case 'DocumentProperties'*/ :
case 'customdocumentproperties' /*case 'CustomDocumentProperties'*/ :
case 'officedocumentsettings' /*case 'OfficeDocumentSettings'*/ :
case 'pivottable' /*case 'PivotTable'*/ :
case 'pivotcache' /*case 'PivotCache'*/ :
case 'names' /*case 'Names'*/ :
case 'mapinfo' /*case 'MapInfo'*/ :
case 'pagebreaks' /*case 'PageBreaks'*/ :
case 'querytable' /*case 'QueryTable'*/ :
case 'sorting' /*case 'Sorting'*/ :
case 'schema' /*case 'Schema'*/ : //case 'data' /*case 'data'*/:
case 'conditionalformatting' /*case 'ConditionalFormatting'*/ :
case 'smarttagtype' /*case 'SmartTagType'*/ :
case 'smarttags' /*case 'SmartTags'*/ :
case 'excelworkbook' /*case 'ExcelWorkbook'*/ :
case 'workbookoptions' /*case 'WorkbookOptions'*/ :
case 'worksheetoptions' /*case 'WorksheetOptions'*/ :
2017-03-12 18:02:43 +00:00
if ( Rn [ 1 ] === '/' ) { if ( ( tmp = state . pop ( ) ) [ 0 ] !== Rn [ 3 ] ) throw new Error ( "Bad state: " + tmp . join ( "|" ) ) ; }
2017-02-03 20:50:45 +00:00
else if ( Rn [ 0 ] . charAt ( Rn [ 0 ] . length - 2 ) !== '/' ) state . push ( [ Rn [ 3 ] , true ] ) ;
break ;
2021-11-14 04:38:00 +00:00
case 'null' /*case 'Null'*/ : break ;
2017-02-03 20:50:45 +00:00
default :
2017-02-22 06:57:59 +00:00
/* FODS file root is <office:document> */
if ( state . length == 0 && Rn [ 3 ] == "document" ) return parse _fods ( str , opts ) ;
/* UOS file root is <uof:UOF> */
2020-03-18 06:47:02 +00:00
if ( state . length == 0 && Rn [ 3 ] == "uof" /*"UOF"*/ ) return parse _fods ( str , opts ) ;
2017-02-22 06:57:59 +00:00
2017-02-03 20:50:45 +00:00
var seen = true ;
switch ( state [ state . length - 1 ] [ 0 ] ) {
/* OfficeDocumentSettings */
2020-03-18 06:47:02 +00:00
case 'officedocumentsettings' /*case 'OfficeDocumentSettings'*/ : switch ( Rn [ 3 ] ) {
case 'allowpng' /*case 'AllowPNG'*/ : break ;
case 'removepersonalinformation' /*case 'RemovePersonalInformation'*/ : break ;
case 'downloadcomponents' /*case 'DownloadComponents'*/ : break ;
case 'locationofcomponents' /*case 'LocationOfComponents'*/ : break ;
case 'colors' /*case 'Colors'*/ : break ;
case 'color' /*case 'Color'*/ : break ;
case 'index' /*case 'Index'*/ : break ;
case 'rgb' /*case 'RGB'*/ : break ;
case 'targetscreensize' /*case 'TargetScreenSize'*/ : break ;
case 'readonlyrecommended' /*case 'ReadOnlyRecommended'*/ : break ;
2017-02-03 20:50:45 +00:00
default : seen = false ;
} break ;
/* ComponentOptions */
2020-03-18 06:47:02 +00:00
case 'componentoptions' /*case 'ComponentOptions'*/ : switch ( Rn [ 3 ] ) {
case 'toolbar' /*case 'Toolbar'*/ : break ;
case 'hideofficelogo' /*case 'HideOfficeLogo'*/ : break ;
case 'spreadsheetautofit' /*case 'SpreadsheetAutoFit'*/ : break ;
case 'label' /*case 'Label'*/ : break ;
case 'caption' /*case 'Caption'*/ : break ;
case 'maxheight' /*case 'MaxHeight'*/ : break ;
case 'maxwidth' /*case 'MaxWidth'*/ : break ;
case 'nextsheetnumber' /*case 'NextSheetNumber'*/ : break ;
2017-02-03 20:50:45 +00:00
default : seen = false ;
} break ;
/* ExcelWorkbook */
2020-03-18 06:47:02 +00:00
case 'excelworkbook' /*case 'ExcelWorkbook'*/ : switch ( Rn [ 3 ] ) {
case 'date1904' /*case 'Date1904'*/ :
2017-06-01 21:22:11 +00:00
/*:: if(!Workbook.WBProps) Workbook.WBProps = {}; */
Workbook . WBProps . date1904 = true ;
break ;
2020-03-18 06:47:02 +00:00
case 'windowheight' /*case 'WindowHeight'*/ : break ;
case 'windowwidth' /*case 'WindowWidth'*/ : break ;
case 'windowtopx' /*case 'WindowTopX'*/ : break ;
case 'windowtopy' /*case 'WindowTopY'*/ : break ;
case 'tabratio' /*case 'TabRatio'*/ : break ;
case 'protectstructure' /*case 'ProtectStructure'*/ : break ;
case 'protectwindow' /*case 'ProtectWindow'*/ : break ;
case 'protectwindows' /*case 'ProtectWindows'*/ : break ;
case 'activesheet' /*case 'ActiveSheet'*/ : break ;
case 'displayinknotes' /*case 'DisplayInkNotes'*/ : break ;
case 'firstvisiblesheet' /*case 'FirstVisibleSheet'*/ : break ;
case 'supbook' /*case 'SupBook'*/ : break ;
case 'sheetname' /*case 'SheetName'*/ : break ;
case 'sheetindex' /*case 'SheetIndex'*/ : break ;
case 'sheetindexfirst' /*case 'SheetIndexFirst'*/ : break ;
case 'sheetindexlast' /*case 'SheetIndexLast'*/ : break ;
case 'dll' /*case 'Dll'*/ : break ;
case 'acceptlabelsinformulas' /*case 'AcceptLabelsInFormulas'*/ : break ;
case 'donotsavelinkvalues' /*case 'DoNotSaveLinkValues'*/ : break ;
case 'iteration' /*case 'Iteration'*/ : break ;
case 'maxiterations' /*case 'MaxIterations'*/ : break ;
case 'maxchange' /*case 'MaxChange'*/ : break ;
case 'path' /*case 'Path'*/ : break ;
case 'xct' /*case 'Xct'*/ : break ;
case 'count' /*case 'Count'*/ : break ;
case 'selectedsheets' /*case 'SelectedSheets'*/ : break ;
case 'calculation' /*case 'Calculation'*/ : break ;
case 'uncalced' /*case 'Uncalced'*/ : break ;
case 'startupprompt' /*case 'StartupPrompt'*/ : break ;
case 'crn' /*case 'Crn'*/ : break ;
case 'externname' /*case 'ExternName'*/ : break ;
case 'formula' /*case 'Formula'*/ : break ;
case 'colfirst' /*case 'ColFirst'*/ : break ;
case 'collast' /*case 'ColLast'*/ : break ;
case 'wantadvise' /*case 'WantAdvise'*/ : break ;
case 'boolean' /*case 'Boolean'*/ : break ;
case 'error' /*case 'Error'*/ : break ;
case 'text' /*case 'Text'*/ : break ;
case 'ole' /*case 'OLE'*/ : break ;
case 'noautorecover' /*case 'NoAutoRecover'*/ : break ;
case 'publishobjects' /*case 'PublishObjects'*/ : break ;
case 'donotcalculatebeforesave' /*case 'DoNotCalculateBeforeSave'*/ : break ;
case 'number' /*case 'Number'*/ : break ;
case 'refmoder1c1' /*case 'RefModeR1C1'*/ : break ;
case 'embedsavesmarttags' /*case 'EmbedSaveSmartTags'*/ : break ;
2017-02-03 20:50:45 +00:00
default : seen = false ;
} break ;
/* WorkbookOptions */
2020-03-18 06:47:02 +00:00
case 'workbookoptions' /*case 'WorkbookOptions'*/ : switch ( Rn [ 3 ] ) {
case 'owcversion' /*case 'OWCVersion'*/ : break ;
case 'height' /*case 'Height'*/ : break ;
case 'width' /*case 'Width'*/ : break ;
2017-02-03 20:50:45 +00:00
default : seen = false ;
} break ;
/* WorksheetOptions */
2020-03-18 06:47:02 +00:00
case 'worksheetoptions' /*case 'WorksheetOptions'*/ : switch ( Rn [ 3 ] ) {
case 'visible' /*case 'Visible'*/ :
2017-05-09 18:07:57 +00:00
if ( Rn [ 0 ] . slice ( - 2 ) === "/>" ) { /* empty */ }
2017-03-31 18:46:42 +00:00
else if ( Rn [ 1 ] === "/" ) switch ( str . slice ( pidx , Rn . index ) ) {
case "SheetHidden" : wsprops . Hidden = 1 ; break ;
case "SheetVeryHidden" : wsprops . Hidden = 2 ; break ;
}
else pidx = Rn . index + Rn [ 0 ] . length ;
break ;
2020-03-18 06:47:02 +00:00
case 'header' /*case 'Header'*/ :
2017-04-13 01:29:38 +00:00
if ( ! cursheet [ '!margins' ] ) default _margins ( cursheet [ '!margins' ] = { } , 'xlml' ) ;
2022-02-14 01:28:13 +00:00
if ( ! isNaN ( + parsexmltag ( Rn [ 0 ] ) . Margin ) ) cursheet [ '!margins' ] . header = + parsexmltag ( Rn [ 0 ] ) . Margin ;
2017-04-13 01:29:38 +00:00
break ;
2020-03-18 06:47:02 +00:00
case 'footer' /*case 'Footer'*/ :
2017-04-13 01:29:38 +00:00
if ( ! cursheet [ '!margins' ] ) default _margins ( cursheet [ '!margins' ] = { } , 'xlml' ) ;
2022-02-14 01:28:13 +00:00
if ( ! isNaN ( + parsexmltag ( Rn [ 0 ] ) . Margin ) ) cursheet [ '!margins' ] . footer = + parsexmltag ( Rn [ 0 ] ) . Margin ;
2017-04-13 01:29:38 +00:00
break ;
2020-03-18 06:47:02 +00:00
case 'pagemargins' /*case 'PageMargins'*/ :
2017-04-13 01:29:38 +00:00
var pagemargins = parsexmltag ( Rn [ 0 ] ) ;
if ( ! cursheet [ '!margins' ] ) default _margins ( cursheet [ '!margins' ] = { } , 'xlml' ) ;
2022-02-14 01:28:13 +00:00
if ( ! isNaN ( + pagemargins . Top ) ) cursheet [ '!margins' ] . top = + pagemargins . Top ;
if ( ! isNaN ( + pagemargins . Left ) ) cursheet [ '!margins' ] . left = + pagemargins . Left ;
if ( ! isNaN ( + pagemargins . Right ) ) cursheet [ '!margins' ] . right = + pagemargins . Right ;
if ( ! isNaN ( + pagemargins . Bottom ) ) cursheet [ '!margins' ] . bottom = + pagemargins . Bottom ;
2017-04-13 01:29:38 +00:00
break ;
2020-03-18 06:47:02 +00:00
case 'displayrighttoleft' /*case 'DisplayRightToLeft'*/ :
2017-12-30 05:40:35 +00:00
if ( ! Workbook . Views ) Workbook . Views = [ ] ;
if ( ! Workbook . Views [ 0 ] ) Workbook . Views [ 0 ] = { } ;
Workbook . Views [ 0 ] . RTL = true ;
break ;
2020-03-18 06:47:02 +00:00
case 'freezepanes' /*case 'FreezePanes'*/ : break ;
case 'frozennosplit' /*case 'FrozenNoSplit'*/ : break ;
2019-11-01 03:09:14 +00:00
2020-03-18 06:47:02 +00:00
case 'splithorizontal' /*case 'SplitHorizontal'*/ :
case 'splitvertical' /*case 'SplitVertical'*/ :
2019-11-01 03:09:14 +00:00
break ;
2020-03-18 06:47:02 +00:00
case 'donotdisplaygridlines' /*case 'DoNotDisplayGridlines'*/ :
2019-11-01 03:09:14 +00:00
break ;
2020-09-11 08:38:33 +00:00
case 'activerow' /*case 'ActiveRow'*/ : break ;
case 'activecol' /*case 'ActiveCol'*/ : break ;
2020-03-18 06:47:02 +00:00
case 'toprowbottompane' /*case 'TopRowBottomPane'*/ : break ;
case 'leftcolumnrightpane' /*case 'LeftColumnRightPane'*/ : break ;
case 'unsynced' /*case 'Unsynced'*/ : break ;
case 'print' /*case 'Print'*/ : break ;
2021-10-13 07:20:25 +00:00
case 'printerrors' /*case 'PrintErrors'*/ : break ;
2020-03-18 06:47:02 +00:00
case 'panes' /*case 'Panes'*/ : break ;
case 'scale' /*case 'Scale'*/ : break ;
case 'pane' /*case 'Pane'*/ : break ;
case 'number' /*case 'Number'*/ : break ;
case 'layout' /*case 'Layout'*/ : break ;
case 'pagesetup' /*case 'PageSetup'*/ : break ;
case 'selected' /*case 'Selected'*/ : break ;
case 'protectobjects' /*case 'ProtectObjects'*/ : break ;
case 'enableselection' /*case 'EnableSelection'*/ : break ;
case 'protectscenarios' /*case 'ProtectScenarios'*/ : break ;
case 'validprinterinfo' /*case 'ValidPrinterInfo'*/ : break ;
case 'horizontalresolution' /*case 'HorizontalResolution'*/ : break ;
case 'verticalresolution' /*case 'VerticalResolution'*/ : break ;
case 'numberofcopies' /*case 'NumberofCopies'*/ : break ;
case 'activepane' /*case 'ActivePane'*/ : break ;
case 'toprowvisible' /*case 'TopRowVisible'*/ : break ;
case 'leftcolumnvisible' /*case 'LeftColumnVisible'*/ : break ;
case 'fittopage' /*case 'FitToPage'*/ : break ;
case 'rangeselection' /*case 'RangeSelection'*/ : break ;
case 'papersizeindex' /*case 'PaperSizeIndex'*/ : break ;
case 'pagelayoutzoom' /*case 'PageLayoutZoom'*/ : break ;
case 'pagebreakzoom' /*case 'PageBreakZoom'*/ : break ;
case 'filteron' /*case 'FilterOn'*/ : break ;
case 'fitwidth' /*case 'FitWidth'*/ : break ;
case 'fitheight' /*case 'FitHeight'*/ : break ;
case 'commentslayout' /*case 'CommentsLayout'*/ : break ;
case 'zoom' /*case 'Zoom'*/ : break ;
case 'lefttoright' /*case 'LeftToRight'*/ : break ;
case 'gridlines' /*case 'Gridlines'*/ : break ;
case 'allowsort' /*case 'AllowSort'*/ : break ;
case 'allowfilter' /*case 'AllowFilter'*/ : break ;
case 'allowinsertrows' /*case 'AllowInsertRows'*/ : break ;
case 'allowdeleterows' /*case 'AllowDeleteRows'*/ : break ;
case 'allowinsertcols' /*case 'AllowInsertCols'*/ : break ;
case 'allowdeletecols' /*case 'AllowDeleteCols'*/ : break ;
case 'allowinserthyperlinks' /*case 'AllowInsertHyperlinks'*/ : break ;
case 'allowformatcells' /*case 'AllowFormatCells'*/ : break ;
case 'allowsizecols' /*case 'AllowSizeCols'*/ : break ;
case 'allowsizerows' /*case 'AllowSizeRows'*/ : break ;
2021-10-13 07:20:25 +00:00
case 'nosummaryrowsbelowdetail' /*case 'NoSummaryRowsBelowDetail'*/ :
if ( ! cursheet [ "!outline" ] ) cursheet [ "!outline" ] = { } ;
cursheet [ "!outline" ] . above = true ;
break ;
2020-03-18 06:47:02 +00:00
case 'tabcolorindex' /*case 'TabColorIndex'*/ : break ;
case 'donotdisplayheadings' /*case 'DoNotDisplayHeadings'*/ : break ;
case 'showpagelayoutzoom' /*case 'ShowPageLayoutZoom'*/ : break ;
2021-10-13 07:20:25 +00:00
case 'nosummarycolumnsrightdetail' /*case 'NoSummaryColumnsRightDetail'*/ :
if ( ! cursheet [ "!outline" ] ) cursheet [ "!outline" ] = { } ;
cursheet [ "!outline" ] . left = true ;
break ;
2020-03-18 06:47:02 +00:00
case 'blackandwhite' /*case 'BlackAndWhite'*/ : break ;
case 'donotdisplayzeros' /*case 'DoNotDisplayZeros'*/ : break ;
case 'displaypagebreak' /*case 'DisplayPageBreak'*/ : break ;
case 'rowcolheadings' /*case 'RowColHeadings'*/ : break ;
case 'donotdisplayoutline' /*case 'DoNotDisplayOutline'*/ : break ;
case 'noorientation' /*case 'NoOrientation'*/ : break ;
case 'allowusepivottables' /*case 'AllowUsePivotTables'*/ : break ;
case 'zeroheight' /*case 'ZeroHeight'*/ : break ;
case 'viewablerange' /*case 'ViewableRange'*/ : break ;
case 'selection' /*case 'Selection'*/ : break ;
case 'protectcontents' /*case 'ProtectContents'*/ : break ;
2017-02-03 20:50:45 +00:00
default : seen = false ;
} break ;
/* PivotTable */
2020-03-18 06:47:02 +00:00
case 'pivottable' /*case 'PivotTable'*/ : case 'pivotcache' /*case 'PivotCache'*/ : switch ( Rn [ 3 ] ) {
case 'immediateitemsondrop' /*case 'ImmediateItemsOnDrop'*/ : break ;
case 'showpagemultipleitemlabel' /*case 'ShowPageMultipleItemLabel'*/ : break ;
case 'compactrowindent' /*case 'CompactRowIndent'*/ : break ;
case 'location' /*case 'Location'*/ : break ;
case 'pivotfield' /*case 'PivotField'*/ : break ;
case 'orientation' /*case 'Orientation'*/ : break ;
case 'layoutform' /*case 'LayoutForm'*/ : break ;
case 'layoutsubtotallocation' /*case 'LayoutSubtotalLocation'*/ : break ;
case 'layoutcompactrow' /*case 'LayoutCompactRow'*/ : break ;
case 'position' /*case 'Position'*/ : break ;
case 'pivotitem' /*case 'PivotItem'*/ : break ;
case 'datatype' /*case 'DataType'*/ : break ;
case 'datafield' /*case 'DataField'*/ : break ;
case 'sourcename' /*case 'SourceName'*/ : break ;
case 'parentfield' /*case 'ParentField'*/ : break ;
case 'ptlineitems' /*case 'PTLineItems'*/ : break ;
case 'ptlineitem' /*case 'PTLineItem'*/ : break ;
case 'countofsameitems' /*case 'CountOfSameItems'*/ : break ;
case 'item' /*case 'Item'*/ : break ;
case 'itemtype' /*case 'ItemType'*/ : break ;
case 'ptsource' /*case 'PTSource'*/ : break ;
case 'cacheindex' /*case 'CacheIndex'*/ : break ;
case 'consolidationreference' /*case 'ConsolidationReference'*/ : break ;
case 'filename' /*case 'FileName'*/ : break ;
case 'reference' /*case 'Reference'*/ : break ;
case 'nocolumngrand' /*case 'NoColumnGrand'*/ : break ;
case 'norowgrand' /*case 'NoRowGrand'*/ : break ;
case 'blanklineafteritems' /*case 'BlankLineAfterItems'*/ : break ;
case 'hidden' /*case 'Hidden'*/ : break ;
case 'subtotal' /*case 'Subtotal'*/ : break ;
case 'basefield' /*case 'BaseField'*/ : break ;
case 'mapchilditems' /*case 'MapChildItems'*/ : break ;
case 'function' /*case 'Function'*/ : break ;
case 'refreshonfileopen' /*case 'RefreshOnFileOpen'*/ : break ;
case 'printsettitles' /*case 'PrintSetTitles'*/ : break ;
case 'mergelabels' /*case 'MergeLabels'*/ : break ;
case 'defaultversion' /*case 'DefaultVersion'*/ : break ;
case 'refreshname' /*case 'RefreshName'*/ : break ;
case 'refreshdate' /*case 'RefreshDate'*/ : break ;
case 'refreshdatecopy' /*case 'RefreshDateCopy'*/ : break ;
case 'versionlastrefresh' /*case 'VersionLastRefresh'*/ : break ;
case 'versionlastupdate' /*case 'VersionLastUpdate'*/ : break ;
case 'versionupdateablemin' /*case 'VersionUpdateableMin'*/ : break ;
case 'versionrefreshablemin' /*case 'VersionRefreshableMin'*/ : break ;
case 'calculation' /*case 'Calculation'*/ : break ;
2017-02-03 20:50:45 +00:00
default : seen = false ;
} break ;
/* PageBreaks */
2020-03-18 06:47:02 +00:00
case 'pagebreaks' /*case 'PageBreaks'*/ : switch ( Rn [ 3 ] ) {
case 'colbreaks' /*case 'ColBreaks'*/ : break ;
case 'colbreak' /*case 'ColBreak'*/ : break ;
case 'rowbreaks' /*case 'RowBreaks'*/ : break ;
case 'rowbreak' /*case 'RowBreak'*/ : break ;
case 'colstart' /*case 'ColStart'*/ : break ;
case 'colend' /*case 'ColEnd'*/ : break ;
case 'rowend' /*case 'RowEnd'*/ : break ;
2017-02-03 20:50:45 +00:00
default : seen = false ;
} break ;
/* AutoFilter */
2020-03-18 06:47:02 +00:00
case 'autofilter' /*case 'AutoFilter'*/ : switch ( Rn [ 3 ] ) {
case 'autofiltercolumn' /*case 'AutoFilterColumn'*/ : break ;
case 'autofiltercondition' /*case 'AutoFilterCondition'*/ : break ;
case 'autofilterand' /*case 'AutoFilterAnd'*/ : break ;
case 'autofilteror' /*case 'AutoFilterOr'*/ : break ;
2017-02-03 20:50:45 +00:00
default : seen = false ;
} break ;
/* QueryTable */
2020-03-18 06:47:02 +00:00
case 'querytable' /*case 'QueryTable'*/ : switch ( Rn [ 3 ] ) {
case 'id' /*case 'Id'*/ : break ;
case 'autoformatfont' /*case 'AutoFormatFont'*/ : break ;
case 'autoformatpattern' /*case 'AutoFormatPattern'*/ : break ;
case 'querysource' /*case 'QuerySource'*/ : break ;
case 'querytype' /*case 'QueryType'*/ : break ;
case 'enableredirections' /*case 'EnableRedirections'*/ : break ;
case 'refreshedinxl9' /*case 'RefreshedInXl9'*/ : break ;
case 'urlstring' /*case 'URLString'*/ : break ;
case 'htmltables' /*case 'HTMLTables'*/ : break ;
case 'connection' /*case 'Connection'*/ : break ;
case 'commandtext' /*case 'CommandText'*/ : break ;
case 'refreshinfo' /*case 'RefreshInfo'*/ : break ;
case 'notitles' /*case 'NoTitles'*/ : break ;
case 'nextid' /*case 'NextId'*/ : break ;
case 'columninfo' /*case 'ColumnInfo'*/ : break ;
case 'overwritecells' /*case 'OverwriteCells'*/ : break ;
case 'donotpromptforfile' /*case 'DoNotPromptForFile'*/ : break ;
case 'textwizardsettings' /*case 'TextWizardSettings'*/ : break ;
case 'source' /*case 'Source'*/ : break ;
case 'number' /*case 'Number'*/ : break ;
case 'decimal' /*case 'Decimal'*/ : break ;
case 'thousandseparator' /*case 'ThousandSeparator'*/ : break ;
case 'trailingminusnumbers' /*case 'TrailingMinusNumbers'*/ : break ;
case 'formatsettings' /*case 'FormatSettings'*/ : break ;
case 'fieldtype' /*case 'FieldType'*/ : break ;
case 'delimiters' /*case 'Delimiters'*/ : break ;
case 'tab' /*case 'Tab'*/ : break ;
case 'comma' /*case 'Comma'*/ : break ;
case 'autoformatname' /*case 'AutoFormatName'*/ : break ;
case 'versionlastedit' /*case 'VersionLastEdit'*/ : break ;
case 'versionlastrefresh' /*case 'VersionLastRefresh'*/ : break ;
2017-02-03 20:50:45 +00:00
default : seen = false ;
} break ;
2020-03-18 06:47:02 +00:00
case 'datavalidation' /*case 'DataValidation'*/ :
2019-11-01 03:09:14 +00:00
switch ( Rn [ 3 ] ) {
2020-03-23 01:57:53 +00:00
case 'range' /*case 'Range'*/ : break ;
2020-03-18 06:47:02 +00:00
case 'type' /*case 'Type'*/ : break ;
case 'min' /*case 'Min'*/ : break ;
case 'max' /*case 'Max'*/ : break ;
case 'sort' /*case 'Sort'*/ : break ;
case 'descending' /*case 'Descending'*/ : break ;
case 'order' /*case 'Order'*/ : break ;
case 'casesensitive' /*case 'CaseSensitive'*/ : break ;
case 'value' /*case 'Value'*/ : break ;
case 'errorstyle' /*case 'ErrorStyle'*/ : break ;
case 'errormessage' /*case 'ErrorMessage'*/ : break ;
case 'errortitle' /*case 'ErrorTitle'*/ : break ;
case 'inputmessage' /*case 'InputMessage'*/ : break ;
case 'inputtitle' /*case 'InputTitle'*/ : break ;
case 'combohide' /*case 'ComboHide'*/ : break ;
case 'inputhide' /*case 'InputHide'*/ : break ;
case 'condition' /*case 'Condition'*/ : break ;
case 'qualifier' /*case 'Qualifier'*/ : break ;
case 'useblank' /*case 'UseBlank'*/ : break ;
case 'value1' /*case 'Value1'*/ : break ;
case 'value2' /*case 'Value2'*/ : break ;
case 'format' /*case 'Format'*/ : break ;
case 'cellrangelist' /*case 'CellRangeList'*/ : break ;
2019-11-01 03:09:14 +00:00
default : seen = false ;
} break ;
2020-03-18 06:47:02 +00:00
case 'sorting' /*case 'Sorting'*/ :
case 'conditionalformatting' /*case 'ConditionalFormatting'*/ :
2017-05-09 18:07:57 +00:00
switch ( Rn [ 3 ] ) {
2020-03-18 06:47:02 +00:00
case 'range' /*case 'Range'*/ : break ;
case 'type' /*case 'Type'*/ : break ;
case 'min' /*case 'Min'*/ : break ;
case 'max' /*case 'Max'*/ : break ;
case 'sort' /*case 'Sort'*/ : break ;
case 'descending' /*case 'Descending'*/ : break ;
case 'order' /*case 'Order'*/ : break ;
case 'casesensitive' /*case 'CaseSensitive'*/ : break ;
case 'value' /*case 'Value'*/ : break ;
case 'errorstyle' /*case 'ErrorStyle'*/ : break ;
case 'errormessage' /*case 'ErrorMessage'*/ : break ;
case 'errortitle' /*case 'ErrorTitle'*/ : break ;
case 'cellrangelist' /*case 'CellRangeList'*/ : break ;
case 'inputmessage' /*case 'InputMessage'*/ : break ;
case 'inputtitle' /*case 'InputTitle'*/ : break ;
case 'combohide' /*case 'ComboHide'*/ : break ;
case 'inputhide' /*case 'InputHide'*/ : break ;
case 'condition' /*case 'Condition'*/ : break ;
case 'qualifier' /*case 'Qualifier'*/ : break ;
case 'useblank' /*case 'UseBlank'*/ : break ;
case 'value1' /*case 'Value1'*/ : break ;
case 'value2' /*case 'Value2'*/ : break ;
case 'format' /*case 'Format'*/ : break ;
2017-02-03 20:50:45 +00:00
default : seen = false ;
} break ;
/* MapInfo (schema) */
2020-03-18 06:47:02 +00:00
case 'mapinfo' /*case 'MapInfo'*/ : case 'schema' /*case 'Schema'*/ : case 'data' /*case 'data'*/ : switch ( Rn [ 3 ] ) {
case 'map' /*case 'Map'*/ : break ;
case 'entry' /*case 'Entry'*/ : break ;
case 'range' /*case 'Range'*/ : break ;
case 'xpath' /*case 'XPath'*/ : break ;
case 'field' /*case 'Field'*/ : break ;
case 'xsdtype' /*case 'XSDType'*/ : break ;
case 'filteron' /*case 'FilterOn'*/ : break ;
case 'aggregate' /*case 'Aggregate'*/ : break ;
case 'elementtype' /*case 'ElementType'*/ : break ;
case 'attributetype' /*case 'AttributeType'*/ : break ;
2017-02-03 20:50:45 +00:00
/* These are from xsd (XML Schema Definition) */
2020-03-18 06:47:02 +00:00
case 'schema' /*case 'schema'*/ :
case 'element' /*case 'element'*/ :
case 'complextype' /*case 'complexType'*/ :
case 'datatype' /*case 'datatype'*/ :
case 'all' /*case 'all'*/ :
case 'attribute' /*case 'attribute'*/ :
case 'extends' /*case 'extends'*/ : break ;
case 'row' /*case 'row'*/ : break ;
2017-02-03 20:50:45 +00:00
default : seen = false ;
} break ;
/* SmartTags (can be anything) */
2020-03-18 06:47:02 +00:00
case 'smarttags' /*case 'SmartTags'*/ : break ;
2017-02-03 20:50:45 +00:00
default : seen = false ; break ;
}
if ( seen ) break ;
/* CustomDocumentProperties */
2019-11-01 03:09:14 +00:00
if ( Rn [ 3 ] . match ( /!\[CDATA/ ) ) break ;
2017-02-03 20:50:45 +00:00
if ( ! state [ state . length - 1 ] [ 1 ] ) throw 'Unrecognized tag: ' + Rn [ 3 ] + "|" + state . join ( "|" ) ;
2020-03-18 06:47:02 +00:00
if ( state [ state . length - 1 ] [ 0 ] === /*'CustomDocumentProperties'*/ 'customdocumentproperties' ) {
2017-02-22 06:57:59 +00:00
if ( Rn [ 0 ] . slice ( - 2 ) === "/>" ) break ;
2020-03-18 06:47:02 +00:00
else if ( Rn [ 1 ] === "/" ) xlml _set _custprop ( Custprops , raw _Rn3 , cp , str . slice ( pidx , Rn . index ) ) ;
2017-02-03 20:50:45 +00:00
else { cp = Rn ; pidx = Rn . index + Rn [ 0 ] . length ; }
break ;
}
if ( opts . WTF ) throw 'Unrecognized tag: ' + Rn [ 3 ] + "|" + state . join ( "|" ) ;
}
2017-03-05 00:56:31 +00:00
var out = ( { } /*:any*/ ) ;
2017-02-03 20:50:45 +00:00
if ( ! opts . bookSheets && ! opts . bookProps ) out . Sheets = sheets ;
out . SheetNames = sheetnames ;
2017-03-31 18:46:42 +00:00
out . Workbook = Workbook ;
2022-03-20 05:29:24 +00:00
out . SSF = dup ( table _fmt ) ;
2017-02-03 20:50:45 +00:00
out . Props = Props ;
out . Custprops = Custprops ;
return out ;
}
2017-08-05 06:32:57 +00:00
function parse _xlml ( data /*:RawBytes|string*/ , opts ) /*:Workbook*/ {
2017-02-03 20:50:45 +00:00
fix _read _opts ( opts = opts || { } ) ;
switch ( opts . type || "base64" ) {
2022-03-22 20:08:08 +00:00
case "base64" : return parse _xlml _xml ( Base64 _decode ( data ) , opts ) ;
2017-02-03 20:50:45 +00:00
case "binary" : case "buffer" : case "file" : return parse _xlml _xml ( data , opts ) ;
2018-02-03 20:46:32 +00:00
case "array" : return parse _xlml _xml ( a2s ( data ) , opts ) ;
2017-02-03 20:50:45 +00:00
}
2017-03-12 18:02:43 +00:00
/*:: throw new Error("unsupported type " + opts.type); */
2017-02-03 20:50:45 +00:00
}
2017-02-22 06:57:59 +00:00
/* TODO */
2017-12-30 05:40:35 +00:00
function write _props _xlml ( wb /*:Workbook*/ , opts ) /*:string*/ {
var o /*:Array<string>*/ = [ ] ;
2017-03-14 08:19:51 +00:00
/* DocumentProperties */
2017-04-10 05:10:54 +00:00
if ( wb . Props ) o . push ( xlml _write _docprops ( wb . Props , opts ) ) ;
2017-03-14 08:19:51 +00:00
/* CustomDocumentProperties */
2017-04-11 22:15:36 +00:00
if ( wb . Custprops ) o . push ( xlml _write _custprops ( wb . Props , wb . Custprops , opts ) ) ;
2017-02-10 19:23:01 +00:00
return o . join ( "" ) ;
}
2017-03-14 08:19:51 +00:00
/* TODO */
2022-06-06 23:05:27 +00:00
function write _wb _xlml ( wb /*::, opts*/ ) /*:string*/ {
2017-03-14 08:19:51 +00:00
/* OfficeDocumentSettings */
/* ExcelWorkbook */
2022-06-06 23:05:27 +00:00
if ( ( ( ( wb || { } ) . Workbook || { } ) . WBProps || { } ) . date1904 ) return '<ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel"><Date1904/></ExcelWorkbook>' ;
2017-03-14 08:19:51 +00:00
return "" ;
}
/* TODO */
function write _sty _xlml ( wb , opts ) /*:string*/ {
/* Styles */
2017-12-30 05:40:35 +00:00
var styles /*:Array<string>*/ = [ '<Style ss:ID="Default" ss:Name="Normal"><NumberFormat/></Style>' ] ;
opts . cellXfs . forEach ( function ( xf , id ) {
var payload /*:Array<string>*/ = [ ] ;
2022-03-20 05:29:24 +00:00
payload . push ( writextag ( 'NumberFormat' , null , { "ss:Format" : escapexml ( table _fmt [ xf . numFmtId ] ) } ) ) ;
2020-03-15 07:42:05 +00:00
var o = /*::(*/ { "ss:ID" : "s" + ( 21 + id ) } /*:: :any)*/ ;
styles . push ( writextag ( 'Style' , payload . join ( "" ) , o ) ) ;
2017-12-30 05:40:35 +00:00
} ) ;
return writextag ( "Styles" , styles . join ( "" ) ) ;
2017-03-14 08:19:51 +00:00
}
2022-05-30 08:40:51 +00:00
function write _name _xlml ( n ) { return writextag ( "NamedRange" , null , { "ss:Name" : n . Name . slice ( 0 , 6 ) == "_xlnm." ? n . Name . slice ( 6 ) : n . Name , "ss:RefersTo" : "=" + a1 _to _rc ( n . Ref , { r : 0 , c : 0 } ) } ) ; }
2018-01-23 09:07:51 +00:00
function write _names _xlml ( wb /*::, opts*/ ) /*:string*/ {
2018-01-09 07:36:02 +00:00
if ( ! ( ( wb || { } ) . Workbook || { } ) . Names ) return "" ;
/*:: if(!wb || !wb.Workbook || !wb.Workbook.Names) throw new Error("unreachable"); */
var names /*:Array<any>*/ = wb . Workbook . Names ;
var out /*:Array<string>*/ = [ ] ;
for ( var i = 0 ; i < names . length ; ++ i ) {
var n = names [ i ] ;
if ( n . Sheet != null ) continue ;
if ( n . Name . match ( /^_xlfn\./ ) ) continue ;
out . push ( write _name _xlml ( n ) ) ;
}
return writextag ( "Names" , out . join ( "" ) ) ;
}
function write _ws _xlml _names ( ws /*:Worksheet*/ , opts , idx /*:number*/ , wb /*:Workbook*/ ) /*:string*/ {
if ( ! ws ) return "" ;
if ( ! ( ( wb || { } ) . Workbook || { } ) . Names ) return "" ;
/*:: if(!wb || !wb.Workbook || !wb.Workbook.Names) throw new Error("unreachable"); */
var names /*:Array<any>*/ = wb . Workbook . Names ;
var out /*:Array<string>*/ = [ ] ;
2018-08-25 23:44:35 +00:00
for ( var i = 0 ; i < names . length ; ++ i ) {
2018-01-09 07:36:02 +00:00
var n = names [ i ] ;
if ( n . Sheet != idx ) continue ;
/ * s w i t c h ( n . N a m e ) {
case "_" : continue ;
} * /
if ( n . Name . match ( /^_xlfn\./ ) ) continue ;
out . push ( write _name _xlml ( n ) ) ;
}
return out . join ( "" ) ;
}
2017-03-31 18:46:42 +00:00
/* WorksheetOptions */
function write _ws _xlml _wsopts ( ws /*:Worksheet*/ , opts , idx /*:number*/ , wb /*:Workbook*/ ) /*:string*/ {
2017-04-26 02:27:12 +00:00
if ( ! ws ) return "" ;
2017-12-30 05:40:35 +00:00
var o /*:Array<string>*/ = [ ] ;
2017-04-26 02:27:12 +00:00
/* NOTE: spec technically allows any order, but stick with implied order */
/* FitToPage */
/* DoNotDisplayColHeaders */
/* DoNotDisplayRowHeaders */
/* ViewableRange */
/* Selection */
/* GridlineColor */
/* Name */
/* ExcelWorksheetType */
/* IntlMacro */
/* Unsynced */
/* Selected */
/* CodeName */
if ( ws [ '!margins' ] ) {
o . push ( "<PageSetup>" ) ;
if ( ws [ '!margins' ] . header ) o . push ( writextag ( "Header" , null , { 'x:Margin' : ws [ '!margins' ] . header } ) ) ;
if ( ws [ '!margins' ] . footer ) o . push ( writextag ( "Footer" , null , { 'x:Margin' : ws [ '!margins' ] . footer } ) ) ;
o . push ( writextag ( "PageMargins" , null , {
'x:Bottom' : ws [ '!margins' ] . bottom || "0.75" ,
'x:Left' : ws [ '!margins' ] . left || "0.7" ,
'x:Right' : ws [ '!margins' ] . right || "0.7" ,
'x:Top' : ws [ '!margins' ] . top || "0.75"
} ) ) ;
o . push ( "</PageSetup>" ) ;
}
2017-03-31 18:46:42 +00:00
/* PageSetup */
2017-04-26 02:27:12 +00:00
/* DisplayPageBreak */
/* TransitionExpressionEvaluation */
/* TransitionFormulaEntry */
/* Print */
/* Zoom */
/* PageLayoutZoom */
/* PageBreakZoom */
/* ShowPageBreakZoom */
/* DefaultRowHeight */
/* DefaultColumnWidth */
/* StandardWidth */
2017-03-31 18:46:42 +00:00
if ( wb && wb . Workbook && wb . Workbook . Sheets && wb . Workbook . Sheets [ idx ] ) {
/* Visible */
2017-05-09 18:07:57 +00:00
if ( wb . Workbook . Sheets [ idx ] . Hidden ) o . push ( writextag ( "Visible" , ( wb . Workbook . Sheets [ idx ] . Hidden == 1 ? "SheetHidden" : "SheetVeryHidden" ) , { } ) ) ;
2017-03-31 18:46:42 +00:00
else {
/* Selected */
for ( var i = 0 ; i < idx ; ++ i ) if ( wb . Workbook . Sheets [ i ] && ! wb . Workbook . Sheets [ i ] . Hidden ) break ;
if ( i == idx ) o . push ( "<Selected/>" ) ;
}
}
2017-04-26 02:27:12 +00:00
/* LeftColumnVisible */
2017-12-30 05:40:35 +00:00
if ( ( ( ( ( wb || { } ) . Workbook || { } ) . Views || [ ] ) [ 0 ] || { } ) . RTL ) o . push ( "<DisplayRightToLeft/>" ) ;
2017-04-26 02:27:12 +00:00
/* GridlineColorIndex */
/* DisplayFormulas */
/* DoNotDisplayGridlines */
/* DoNotDisplayHeadings */
/* DoNotDisplayOutline */
/* ApplyAutomaticOutlineStyles */
/* NoSummaryRowsBelowDetail */
/* NoSummaryColumnsRightDetail */
/* DoNotDisplayZeros */
/* ActiveRow */
/* ActiveColumn */
/* FilterOn */
/* RangeSelection */
/* TopRowVisible */
/* TopRowBottomPane */
/* LeftColumnRightPane */
/* ActivePane */
/* SplitHorizontal */
/* SplitVertical */
/* FreezePanes */
/* FrozenNoSplit */
/* TabColorIndex */
/* Panes */
/* NOTE: Password not supported in XLML Format */
if ( ws [ '!protect' ] ) {
o . push ( writetag ( "ProtectContents" , "True" ) ) ;
if ( ws [ '!protect' ] . objects ) o . push ( writetag ( "ProtectObjects" , "True" ) ) ;
if ( ws [ '!protect' ] . scenarios ) o . push ( writetag ( "ProtectScenarios" , "True" ) ) ;
if ( ws [ '!protect' ] . selectLockedCells != null && ! ws [ '!protect' ] . selectLockedCells ) o . push ( writetag ( "EnableSelection" , "NoSelection" ) ) ;
else if ( ws [ '!protect' ] . selectUnlockedCells != null && ! ws [ '!protect' ] . selectUnlockedCells ) o . push ( writetag ( "EnableSelection" , "UnlockedCells" ) ) ;
[
2017-10-16 22:19:53 +00:00
[ "formatCells" , "AllowFormatCells" ] ,
[ "formatColumns" , "AllowSizeCols" ] ,
[ "formatRows" , "AllowSizeRows" ] ,
2017-04-26 02:27:12 +00:00
[ "insertColumns" , "AllowInsertCols" ] ,
[ "insertRows" , "AllowInsertRows" ] ,
[ "insertHyperlinks" , "AllowInsertHyperlinks" ] ,
[ "deleteColumns" , "AllowDeleteCols" ] ,
[ "deleteRows" , "AllowDeleteRows" ] ,
[ "sort" , "AllowSort" ] ,
[ "autoFilter" , "AllowFilter" ] ,
[ "pivotTables" , "AllowUsePivotTables" ]
] . forEach ( function ( x ) { if ( ws [ '!protect' ] [ x [ 0 ] ] ) o . push ( "<" + x [ 1 ] + "/>" ) ; } ) ;
}
2017-03-31 18:46:42 +00:00
if ( o . length == 0 ) return "" ;
return writextag ( "WorksheetOptions" , o . join ( "" ) , { xmlns : XLMLNS . x } ) ;
}
2017-12-15 01:18:40 +00:00
function write _ws _xlml _comment ( comments /*:Array<any>*/ ) /*:string*/ {
2017-04-02 06:47:25 +00:00
return comments . map ( function ( c ) {
// TODO: formatted text
var t = xlml _unfixstr ( c . t || "" ) ;
var d = writextag ( "ss:Data" , t , { "xmlns" : "http://www.w3.org/TR/REC-html40" } ) ;
return writextag ( "Comment" , d , { "ss:Author" : c . a } ) ;
} ) . join ( "" ) ;
}
2017-12-15 01:18:40 +00:00
function write _ws _xlml _cell ( cell , ref /*:string*/ , ws , opts , idx /*:number*/ , wb , addr ) /*:string*/ {
2018-02-08 18:21:39 +00:00
if ( ! cell || ( cell . v == undefined && cell . f == undefined ) ) return "" ;
2017-03-14 08:19:51 +00:00
var attr = { } ;
if ( cell . f ) attr [ "ss:Formula" ] = "=" + escapexml ( a1 _to _rc ( cell . f , addr ) ) ;
2018-01-11 08:01:25 +00:00
if ( cell . F && cell . F . slice ( 0 , ref . length ) == ref ) {
var end = decode _cell ( cell . F . slice ( ref . length + 1 ) ) ;
2017-03-18 00:45:06 +00:00
attr [ "ss:ArrayRange" ] = "RC:R" + ( end . r == addr . r ? "" : "[" + ( end . r - addr . r ) + "]" ) + "C" + ( end . c == addr . c ? "" : "[" + ( end . c - addr . c ) + "]" ) ;
}
2017-03-14 08:19:51 +00:00
2017-03-28 22:03:03 +00:00
if ( cell . l && cell . l . Target ) {
attr [ "ss:HRef" ] = escapexml ( cell . l . Target ) ;
if ( cell . l . Tooltip ) attr [ "x:HRefScreenTip" ] = escapexml ( cell . l . Tooltip ) ;
}
2017-03-16 01:17:24 +00:00
if ( ws [ '!merges' ] ) {
var marr = ws [ '!merges' ] ;
for ( var mi = 0 ; mi != marr . length ; ++ mi ) {
if ( marr [ mi ] . s . c != addr . c || marr [ mi ] . s . r != addr . r ) continue ;
if ( marr [ mi ] . e . c > marr [ mi ] . s . c ) attr [ 'ss:MergeAcross' ] = marr [ mi ] . e . c - marr [ mi ] . s . c ;
if ( marr [ mi ] . e . r > marr [ mi ] . s . r ) attr [ 'ss:MergeDown' ] = marr [ mi ] . e . r - marr [ mi ] . s . r ;
}
}
2017-03-14 08:19:51 +00:00
var t = "" , p = "" ;
switch ( cell . t ) {
2019-11-01 03:09:14 +00:00
case 'z' : if ( ! opts . sheetStubs ) return "" ; break ;
2017-03-14 08:19:51 +00:00
case 'n' : t = 'Number' ; p = String ( cell . v ) ; break ;
case 'b' : t = 'Boolean' ; p = ( cell . v ? "1" : "0" ) ; break ;
case 'e' : t = 'Error' ; p = BErr [ cell . v ] ; break ;
2022-03-20 05:29:24 +00:00
case 'd' : t = 'DateTime' ; p = new Date ( cell . v ) . toISOString ( ) ; if ( cell . z == null ) cell . z = cell . z || table _fmt [ 14 ] ; break ;
2018-01-09 07:36:02 +00:00
case 's' : t = 'String' ; p = escapexlml ( cell . v || "" ) ; break ;
2017-03-14 08:19:51 +00:00
}
2017-12-30 05:40:35 +00:00
/* TODO: cell style */
var os = get _cell _style ( opts . cellXfs , cell , opts ) ;
attr [ "ss:StyleID" ] = "s" + ( 21 + os ) ;
2018-01-09 07:36:02 +00:00
attr [ "ss:Index" ] = addr . c + 1 ;
2017-03-20 21:42:12 +00:00
var _v = ( cell . v != null ? p : "" ) ;
2019-11-01 03:09:14 +00:00
var m = cell . t == 'z' ? "" : ( '<Data ss:Type="' + t + '">' + _v + '</Data>' ) ;
2017-03-14 08:19:51 +00:00
2017-04-02 06:47:25 +00:00
if ( ( cell . c || [ ] ) . length > 0 ) m += write _ws _xlml _comment ( cell . c ) ;
2017-03-14 08:19:51 +00:00
return writextag ( "Cell" , m , attr ) ;
}
2017-04-28 07:28:03 +00:00
function write _ws _xlml _row ( R /*:number*/ , row ) /*:string*/ {
var o = '<Row ss:Index="' + ( R + 1 ) + '"' ;
if ( row ) {
if ( row . hpt && ! row . hpx ) row . hpx = pt2px ( row . hpt ) ;
if ( row . hpx ) o += ' ss:AutoFitHeight="0" ss:Height="' + row . hpx + '"' ;
if ( row . hidden ) o += ' ss:Hidden="1"' ;
}
return o + '>' ;
}
2017-03-14 08:19:51 +00:00
/* TODO */
function write _ws _xlml _table ( ws /*:Worksheet*/ , opts , idx /*:number*/ , wb /*:Workbook*/ ) /*:string*/ {
if ( ! ws [ '!ref' ] ) return "" ;
2017-12-30 05:40:35 +00:00
var range /*:Range*/ = safe _decode _range ( ws [ '!ref' ] ) ;
var marr /*:Array<Range>*/ = ws [ '!merges' ] || [ ] , mi = 0 ;
var o /*:Array<string>*/ = [ ] ;
2017-03-28 22:03:03 +00:00
if ( ws [ '!cols' ] ) ws [ '!cols' ] . forEach ( function ( n , i ) {
2017-04-28 07:28:03 +00:00
process _col ( n ) ;
var w = ! ! n . width ;
2017-03-28 22:03:03 +00:00
var p = col _obj _w ( i , n ) ;
2017-05-13 18:21:22 +00:00
var k /*:any*/ = { "ss:Index" : i + 1 } ;
2017-04-28 07:28:03 +00:00
if ( w ) k [ 'ss:Width' ] = width2px ( p . width ) ;
if ( n . hidden ) k [ 'ss:Hidden' ] = "1" ;
o . push ( writextag ( "Column" , null , k ) ) ;
2017-03-28 22:03:03 +00:00
} ) ;
2017-04-08 06:55:35 +00:00
var dense = Array . isArray ( ws ) ;
2017-03-14 08:19:51 +00:00
for ( var R = range . s . r ; R <= range . e . r ; ++ R ) {
2017-04-28 07:28:03 +00:00
var row = [ write _ws _xlml _row ( R , ( ws [ '!rows' ] || [ ] ) [ R ] ) ] ;
2017-03-14 08:19:51 +00:00
for ( var C = range . s . c ; C <= range . e . c ; ++ C ) {
2017-03-16 01:17:24 +00:00
var skip = false ;
for ( mi = 0 ; mi != marr . length ; ++ mi ) {
if ( marr [ mi ] . s . c > C ) continue ;
if ( marr [ mi ] . s . r > R ) continue ;
if ( marr [ mi ] . e . c < C ) continue ;
if ( marr [ mi ] . e . r < R ) continue ;
if ( marr [ mi ] . s . c != C || marr [ mi ] . s . r != R ) skip = true ;
break ;
}
if ( skip ) continue ;
2017-03-14 08:19:51 +00:00
var addr = { r : R , c : C } ;
2017-04-08 06:55:35 +00:00
var ref = encode _cell ( addr ) , cell = dense ? ( ws [ R ] || [ ] ) [ C ] : ws [ ref ] ;
row . push ( write _ws _xlml _cell ( cell , ref , ws , opts , idx , wb , addr ) ) ;
2017-03-14 08:19:51 +00:00
}
row . push ( "</Row>" ) ;
2017-03-16 01:17:24 +00:00
if ( row . length > 2 ) o . push ( row . join ( "" ) ) ;
2017-03-14 08:19:51 +00:00
}
return o . join ( "" ) ;
}
function write _ws _xlml ( idx /*:number*/ , opts , wb /*:Workbook*/ ) /*:string*/ {
2017-12-30 05:40:35 +00:00
var o /*:Array<string>*/ = [ ] ;
2017-03-14 08:19:51 +00:00
var s = wb . SheetNames [ idx ] ;
var ws = wb . Sheets [ s ] ;
2018-01-09 07:36:02 +00:00
var t /*:string*/ = ws ? write _ws _xlml _names ( ws , opts , idx , wb ) : "" ;
if ( t . length > 0 ) o . push ( "<Names>" + t + "</Names>" ) ;
2017-03-14 08:19:51 +00:00
/* Table */
2018-01-09 07:36:02 +00:00
t = ws ? write _ws _xlml _table ( ws , opts , idx , wb ) : "" ;
2017-03-14 08:19:51 +00:00
if ( t . length > 0 ) o . push ( "<Table>" + t + "</Table>" ) ;
2017-03-31 18:46:42 +00:00
2017-03-14 08:19:51 +00:00
/* WorksheetOptions */
2017-03-31 18:46:42 +00:00
o . push ( write _ws _xlml _wsopts ( ws , opts , idx , wb ) ) ;
2022-05-30 08:40:51 +00:00
if ( ws [ "!autofilter" ] ) o . push ( '<AutoFilter x:Range="' + a1 _to _rc ( fix _range ( ws [ "!autofilter" ] . ref ) , { r : 0 , c : 0 } ) + '" xmlns="urn:schemas-microsoft-com:office:excel"></AutoFilter>' ) ;
2017-03-14 08:19:51 +00:00
return o . join ( "" ) ;
}
function write _xlml ( wb , opts ) /*:string*/ {
2017-12-30 05:40:35 +00:00
if ( ! opts ) opts = { } ;
2022-03-20 05:29:24 +00:00
if ( ! wb . SSF ) wb . SSF = dup ( table _fmt ) ;
2017-12-30 05:40:35 +00:00
if ( wb . SSF ) {
2022-03-20 05:29:24 +00:00
make _ssf ( ) ; SSF _load _table ( wb . SSF ) ;
2017-12-30 05:40:35 +00:00
// $FlowIgnore
opts . revssf = evert _num ( wb . SSF ) ; opts . revssf [ wb . SSF [ 65535 ] ] = 0 ;
opts . ssf = wb . SSF ;
opts . cellXfs = [ ] ;
get _cell _style ( opts . cellXfs , { } , { revssf : { "General" : 0 } } ) ;
}
var d /*:Array<string>*/ = [ ] ;
2017-03-14 08:19:51 +00:00
d . push ( write _props _xlml ( wb , opts ) ) ;
d . push ( write _wb _xlml ( wb , opts ) ) ;
2017-12-30 05:40:35 +00:00
d . push ( "" ) ;
2018-01-09 07:36:02 +00:00
d . push ( "" ) ;
2017-03-14 08:19:51 +00:00
for ( var i = 0 ; i < wb . SheetNames . length ; ++ i )
d . push ( writextag ( "Worksheet" , write _ws _xlml ( i , opts , wb ) , { "ss:Name" : escapexml ( wb . SheetNames [ i ] ) } ) ) ;
2017-12-30 05:40:35 +00:00
d [ 2 ] = write _sty _xlml ( wb , opts ) ;
2018-01-09 07:36:02 +00:00
d [ 3 ] = write _names _xlml ( wb , opts ) ;
2017-03-14 08:19:51 +00:00
return XML _HEADER + writextag ( "Workbook" , d . join ( "" ) , {
'xmlns' : XLMLNS . ss ,
'xmlns:o' : XLMLNS . o ,
'xmlns:x' : XLMLNS . x ,
'xmlns:ss' : XLMLNS . ss ,
'xmlns:dt' : XLMLNS . dt ,
'xmlns:html' : XLMLNS . html
} ) ;
}
2017-02-03 20:50:45 +00:00
/* [MS-OLEDS] 2.3.8 CompObjStream */
2017-09-30 06:18:11 +00:00
function parse _compobj ( obj /*:CFBEntry*/ ) {
2017-02-03 20:50:45 +00:00
var v = { } ;
var o = obj . content ;
2017-09-30 06:18:11 +00:00
/*:: if(o == null) return; */
2017-02-03 20:50:45 +00:00
/* [MS-OLEDS] 2.3.7 CompObjHeader -- All fields MUST be ignored */
2017-12-30 05:40:35 +00:00
o . l = 28 ;
2017-02-03 20:50:45 +00:00
2017-12-30 05:40:35 +00:00
v . AnsiUserType = o . read _shift ( 0 , "lpstr-ansi" ) ;
v . AnsiClipboardFormat = parse _ClipboardFormatOrAnsiString ( o ) ;
if ( o . length - o . l <= 4 ) return v ;
var m /*:number*/ = o . read _shift ( 4 ) ;
if ( m == 0 || m > 40 ) return v ;
o . l -= 4 ; v . Reserved1 = o . read _shift ( 0 , "lpstr-ansi" ) ;
2017-02-03 20:50:45 +00:00
2017-12-30 05:40:35 +00:00
if ( o . length - o . l <= 4 ) return v ;
m = o . read _shift ( 4 ) ;
if ( m !== 0x71b239f4 ) return v ;
v . UnicodeClipboardFormat = parse _ClipboardFormatOrUnicodeString ( o ) ;
2017-02-03 20:50:45 +00:00
2017-12-30 05:40:35 +00:00
m = o . read _shift ( 4 ) ;
if ( m == 0 || m > 40 ) return v ;
o . l -= 4 ; v . Reserved2 = o . read _shift ( 0 , "lpwstr" ) ;
2017-02-03 20:50:45 +00:00
}
2017-07-26 08:35:28 +00:00
/ *
Continue logic for :
2022-03-12 14:05:57 +00:00
- 2.4 . 58 Continue 0x003c
- 2.4 . 59 ContinueBigName 0x043c
- 2.4 . 60 ContinueFrt 0x0812
- 2.4 . 61 ContinueFrt11 0x0875
- 2.4 . 62 ContinueFrt12 0x087f
2017-07-26 08:35:28 +00:00
* /
2022-03-12 14:05:57 +00:00
var CONTINUE _RT = [ 0x003c , 0x043c , 0x0812 , 0x0875 , 0x087f ] ;
function slurp ( RecordType , R , blob , length /*:number*/ , opts ) /*:any*/ {
2017-02-03 20:50:45 +00:00
var l = length ;
var bufs = [ ] ;
var d = blob . slice ( blob . l , blob . l + l ) ;
2022-03-12 14:05:57 +00:00
if ( opts && opts . enc && opts . enc . insitu && d . length > 0 ) switch ( RecordType ) {
2022-05-22 23:51:41 +00:00
case 0x0009 : case 0x0209 : case 0x0409 : case 0x0809 /* BOF */ : case 0x002F /* FilePass */ : case 0x0195 /* FileLock */ : case 0x00E1 /* InterfaceHdr */ : case 0x0196 /* RRDInfo */ : case 0x0138 /* RRDHead */ : case 0x0194 /* UsrExcl */ : case 0x000a /* EOF */ :
2021-05-13 19:02:31 +00:00
break ;
2022-03-12 14:05:57 +00:00
case 0x0085 /* BoundSheet8 */ :
2021-05-13 19:02:31 +00:00
break ;
2017-02-03 20:50:45 +00:00
default :
2017-10-17 00:14:32 +00:00
opts . enc . insitu ( d ) ;
2017-02-03 20:50:45 +00:00
}
bufs . push ( d ) ;
blob . l += l ;
2022-03-12 14:05:57 +00:00
var nextrt = _ _readUInt16LE ( blob , blob . l ) , next = XLSRecordEnum [ nextrt ] ;
2017-07-26 08:35:28 +00:00
var start = 0 ;
2022-03-12 14:05:57 +00:00
while ( next != null && CONTINUE _RT . indexOf ( nextrt ) > - 1 ) {
2017-02-03 20:50:45 +00:00
l = _ _readUInt16LE ( blob , blob . l + 2 ) ;
2017-07-26 08:35:28 +00:00
start = blob . l + 4 ;
2022-03-12 14:05:57 +00:00
if ( nextrt == 0x0812 /* ContinueFrt */ ) start += 4 ;
else if ( nextrt == 0x0875 || nextrt == 0x087f ) {
2021-05-13 19:02:31 +00:00
start += 12 ;
}
d = blob . slice ( start , blob . l + 4 + l ) ;
bufs . push ( d ) ;
2017-02-03 20:50:45 +00:00
blob . l += 4 + l ;
2022-03-12 14:05:57 +00:00
next = ( XLSRecordEnum [ nextrt = _ _readUInt16LE ( blob , blob . l ) ] ) ;
2017-02-03 20:50:45 +00:00
}
2017-02-10 19:23:01 +00:00
var b = ( bconcat ( bufs ) /*:any*/ ) ;
2017-02-03 20:50:45 +00:00
prep _blob ( b , 0 ) ;
var ll = 0 ; b . lens = [ ] ;
for ( var j = 0 ; j < bufs . length ; ++ j ) { b . lens . push ( ll ) ; ll += bufs [ j ] . length ; }
2022-03-12 14:05:57 +00:00
if ( b . length < length ) throw "XLS Record 0x" + RecordType . toString ( 16 ) + " Truncated: " + b . length + " < " + length ;
2017-02-03 20:50:45 +00:00
return R . f ( b , b . length , opts ) ;
}
2017-03-12 18:02:43 +00:00
function safe _format _xf ( p /*:any*/ , opts /*:ParseOpts*/ , date1904 /*:?boolean*/ ) {
2017-03-15 08:19:02 +00:00
if ( p . t === 'z' ) return ;
2017-02-03 20:50:45 +00:00
if ( ! p . XF ) return ;
2017-05-13 18:21:22 +00:00
var fmtid = 0 ;
2017-02-03 20:50:45 +00:00
try {
2017-07-27 20:07:51 +00:00
fmtid = p . z || p . XF . numFmtId || 0 ;
2022-03-20 05:29:24 +00:00
if ( opts . cellNF ) p . z = table _fmt [ fmtid ] ;
2017-04-26 02:27:12 +00:00
} catch ( e ) { if ( opts . WTF ) throw e ; }
if ( ! opts || opts . cellText !== false ) try {
if ( p . t === 'e' ) { p . w = p . w || BErr [ p . v ] ; }
2017-07-27 20:07:51 +00:00
else if ( fmtid === 0 || fmtid == "General" ) {
2017-02-03 20:50:45 +00:00
if ( p . t === 'n' ) {
2022-03-20 05:29:24 +00:00
if ( ( p . v | 0 ) === p . v ) p . w = p . v . toString ( 10 ) ;
else p . w = SSF _general _num ( p . v ) ;
2017-02-03 20:50:45 +00:00
}
2022-03-20 05:29:24 +00:00
else p . w = SSF _general ( p . v ) ;
2017-02-03 20:50:45 +00:00
}
2022-03-20 05:29:24 +00:00
else p . w = SSF _format ( fmtid , p . v , { date1904 : ! ! date1904 , dateNF : opts && opts . dateNF } ) ;
2017-02-03 20:50:45 +00:00
} catch ( e ) { if ( opts . WTF ) throw e ; }
2022-03-20 05:29:24 +00:00
if ( opts . cellDates && fmtid && p . t == 'n' && fmt _is _date ( table _fmt [ fmtid ] || String ( fmtid ) ) ) {
var _d = SSF _parse _date _code ( p . v ) ; if ( _d ) { p . t = 'd' ; p . v = new Date ( _d . y , _d . m - 1 , _d . d , _d . H , _d . M , _d . S , _d . u ) ; }
2017-10-18 03:05:05 +00:00
}
2017-02-03 20:50:45 +00:00
}
2017-05-13 18:21:22 +00:00
function make _cell ( val , ixfe , t ) /*:Cell*/ {
2017-02-10 19:23:01 +00:00
return ( { v : val , ixfe : ixfe , t : t } /*:any*/ ) ;
2017-02-03 20:50:45 +00:00
}
// 2.3.2
2017-02-10 19:23:01 +00:00
function parse _workbook ( blob , options /*:ParseOpts*/ ) /*:Workbook*/ {
var wb = ( { opts : { } } /*:any*/ ) ;
2017-02-03 20:50:45 +00:00
var Sheets = { } ;
2017-04-09 04:03:19 +00:00
if ( DENSE != null && options . dense == null ) options . dense = DENSE ;
2017-05-13 18:21:22 +00:00
var out /*:Worksheet*/ = ( ( options . dense ? [ ] : { } ) /*:any*/ ) ;
2017-02-03 20:50:45 +00:00
var Directory = { } ;
2017-03-25 01:36:40 +00:00
var range /*:Range*/ = ( { } /*:any*/ ) ;
2017-02-03 20:50:45 +00:00
var last _formula = null ;
2017-12-30 05:40:35 +00:00
var sst /*:SST*/ = ( [ ] /*:any*/ ) ;
2017-02-03 20:50:45 +00:00
var cur _sheet = "" ;
var Preamble = { } ;
2019-11-01 03:09:14 +00:00
var lastcell , last _cell = "" , cc /*:Cell*/ , cmnt , rngC , rngR ;
2018-01-09 07:36:02 +00:00
var sharedf = { } ;
2017-12-30 05:40:35 +00:00
var arrayf /*:Array<[Range, string]>*/ = [ ] ;
2017-05-13 18:21:22 +00:00
var temp _val /*:Cell*/ ;
2017-02-03 20:50:45 +00:00
var country ;
var XFs = [ ] ; /* XF records */
2019-11-01 03:09:14 +00:00
var palette /*:Array<[number, number, number]>*/ = [ ] ;
2017-12-30 05:40:35 +00:00
var Workbook /*:WBWBProps*/ = ( { Sheets : [ ] , WBProps : { date1904 : false } , Views : [ { } ] } /*:any*/ ) , wsprops = { } ;
2019-11-01 03:09:14 +00:00
var get _rgb = function getrgb ( icv /*:number*/ ) /*:[number, number, number]*/ {
2017-02-03 20:50:45 +00:00
if ( icv < 8 ) return XLSIcv [ icv ] ;
if ( icv < 64 ) return palette [ icv - 8 ] || XLSIcv [ icv ] ;
return XLSIcv [ icv ] ;
} ;
2017-03-20 09:02:25 +00:00
var process _cell _style = function pcs ( cell , line /*:any*/ , options ) {
2017-02-03 20:50:45 +00:00
var xfd = line . XF . data ;
2017-03-20 09:02:25 +00:00
if ( ! xfd || ! xfd . patternType || ! options || ! options . cellStyles ) return ;
2017-03-12 18:02:43 +00:00
line . s = ( { } /*:any*/ ) ;
2017-02-03 20:50:45 +00:00
line . s . patternType = xfd . patternType ;
var t ;
if ( ( t = rgb2Hex ( get _rgb ( xfd . icvFore ) ) ) ) { line . s . fgColor = { rgb : t } ; }
if ( ( t = rgb2Hex ( get _rgb ( xfd . icvBack ) ) ) ) { line . s . bgColor = { rgb : t } ; }
} ;
2017-03-12 18:02:43 +00:00
var addcell = function addcell ( cell /*:any*/ , line /*:any*/ , options /*:any*/ ) {
2017-03-20 09:02:25 +00:00
if ( file _depth > 1 ) return ;
2021-11-14 04:38:00 +00:00
if ( options . sheetRows && cell . r >= options . sheetRows ) return ;
2017-03-20 09:02:25 +00:00
if ( options . cellStyles && line . XF && line . XF . data ) process _cell _style ( cell , line , options ) ;
2017-08-18 18:10:18 +00:00
delete line . ixfe ; delete line . XF ;
2017-02-03 20:50:45 +00:00
lastcell = cell ;
last _cell = encode _cell ( cell ) ;
2018-11-13 20:25:51 +00:00
if ( ! range || ! range . s || ! range . e ) range = { s : { r : 0 , c : 0 } , e : { r : 0 , c : 0 } } ;
if ( cell . r < range . s . r ) range . s . r = cell . r ;
if ( cell . c < range . s . c ) range . s . c = cell . c ;
if ( cell . r + 1 > range . e . r ) range . e . r = cell . r + 1 ;
if ( cell . c + 1 > range . e . c ) range . e . c = cell . c + 1 ;
2017-03-18 00:45:06 +00:00
if ( options . cellFormula && line . f ) {
2017-12-30 05:40:35 +00:00
for ( var afi = 0 ; afi < arrayf . length ; ++ afi ) {
2018-01-09 07:36:02 +00:00
if ( arrayf [ afi ] [ 0 ] . s . c > cell . c || arrayf [ afi ] [ 0 ] . s . r > cell . r ) continue ;
if ( arrayf [ afi ] [ 0 ] . e . c < cell . c || arrayf [ afi ] [ 0 ] . e . r < cell . r ) continue ;
2017-12-30 05:40:35 +00:00
line . F = encode _range ( arrayf [ afi ] [ 0 ] ) ;
2018-01-09 07:36:02 +00:00
if ( arrayf [ afi ] [ 0 ] . s . c != cell . c || arrayf [ afi ] [ 0 ] . s . r != cell . r ) delete line . f ;
2017-12-30 05:40:35 +00:00
if ( line . f ) line . f = "" + stringify _formula ( arrayf [ afi ] [ 1 ] , range , cell , supbooks , opts ) ;
2017-03-18 00:45:06 +00:00
break ;
}
}
2018-04-06 06:39:48 +00:00
{
2017-04-08 06:55:35 +00:00
if ( options . dense ) {
if ( ! out [ cell . r ] ) out [ cell . r ] = [ ] ;
out [ cell . r ] [ cell . c ] = line ;
} else out [ last _cell ] = line ;
}
2017-02-03 20:50:45 +00:00
} ;
2017-02-10 19:23:01 +00:00
var opts = ( {
2017-02-03 20:50:45 +00:00
enc : false , // encrypted
sbcch : 0 , // cch in the preceding SupBook
snames : [ ] , // sheetnames
2018-01-09 07:36:02 +00:00
sharedf : sharedf , // shared formulae by address
2017-12-30 05:40:35 +00:00
arrayf : arrayf , // array formulae array
2017-02-03 20:50:45 +00:00
rrtabid : [ ] , // RRTabId
lastuser : "" , // Last User from WriteAccess
biff : 8 , // BIFF version
codepage : 0 , // CP from CodePage record
winlocked : 0 , // fLockWn from WinProtect
2017-03-20 09:02:25 +00:00
cellStyles : ! ! options && ! ! options . cellStyles ,
2017-03-18 23:25:50 +00:00
WTF : ! ! options && ! ! options . wtf
2017-02-10 19:23:01 +00:00
} /*:any*/ ) ;
2017-02-03 20:50:45 +00:00
if ( options . password ) opts . password = options . password ;
2017-12-30 05:40:35 +00:00
var themes ;
var merges /*:Array<Range>*/ = [ ] ;
2017-02-03 20:50:45 +00:00
var objects = [ ] ;
2017-12-30 05:40:35 +00:00
var colinfo /*:Array<ColInfo>*/ = [ ] , rowinfo /*:Array<RowInfo>*/ = [ ] ;
2017-03-20 09:02:25 +00:00
var seencol = false ;
2017-04-11 22:15:36 +00:00
var supbooks = ( [ ] /*:any*/ ) ; // 1-indexed, will hold extern names
2017-02-03 20:50:45 +00:00
supbooks . SheetNames = opts . snames ;
supbooks . sharedf = opts . sharedf ;
supbooks . arrayf = opts . arrayf ;
2017-04-11 22:15:36 +00:00
supbooks . names = [ ] ;
supbooks . XTI = [ ] ;
2022-03-12 14:05:57 +00:00
var last _RT = 0 ;
2017-02-03 20:50:45 +00:00
var file _depth = 0 ; /* TODO: make a real stack */
2017-12-30 05:40:35 +00:00
var BIFF2Fmt = 0 , BIFF2FmtTable /*:Array<string>*/ = [ ] ;
2017-04-10 05:10:54 +00:00
var FilterDatabases = [ ] ; /* TODO: sort out supbooks and process elsewhere */
2017-05-13 18:21:22 +00:00
var last _lbl /*:?DefinedName*/ ;
2017-02-03 20:50:45 +00:00
/* explicit override for some broken writers */
opts . codepage = 1200 ;
set _cp ( 1200 ) ;
2017-12-09 07:17:25 +00:00
var seen _codepage = false ;
2017-02-03 20:50:45 +00:00
while ( blob . l < blob . length - 1 ) {
var s = blob . l ;
var RecordType = blob . read _shift ( 2 ) ;
2022-03-12 14:05:57 +00:00
if ( RecordType === 0 && last _RT === 0x000a /* EOF */ ) break ;
2018-01-23 09:07:51 +00:00
var length = ( blob . l === blob . length ? 0 : blob . read _shift ( 2 ) ) ;
2017-02-03 20:50:45 +00:00
var R = XLSRecordEnum [ RecordType ] ;
2017-02-10 19:23:01 +00:00
//console.log(RecordType.toString(16), RecordType, R, blob.l, length, blob.length);
2017-03-05 00:56:31 +00:00
//if(!R) console.log(blob.slice(blob.l, blob.l + length));
2017-02-03 20:50:45 +00:00
if ( R && R . f ) {
if ( options . bookSheets ) {
2022-03-12 14:05:57 +00:00
if ( last _RT === 0x0085 /* BoundSheet8 */ && RecordType !== 0x0085 /* R.n !== 'BoundSheet8' */ ) break ;
2017-02-03 20:50:45 +00:00
}
2022-03-12 14:05:57 +00:00
last _RT = RecordType ;
2017-02-03 20:50:45 +00:00
if ( R . r === 2 || R . r == 12 ) {
var rt = blob . read _shift ( 2 ) ; length -= 2 ;
2018-02-21 07:01:34 +00:00
if ( ! opts . enc && rt !== RecordType && ( ( ( rt & 0xFF ) << 8 ) | ( rt >> 8 ) ) !== RecordType ) throw new Error ( "rt mismatch: " + rt + "!=" + RecordType ) ;
2021-10-13 07:20:25 +00:00
if ( R . r == 12 ) {
blob . l += 10 ; length -= 10 ;
} // skip FRT
2017-02-03 20:50:45 +00:00
}
//console.error(R,blob.l,length,blob.length);
2019-11-01 03:09:14 +00:00
var val /*:any*/ = ( { } /*:any*/ ) ;
2022-03-12 14:05:57 +00:00
if ( RecordType === 0x000a /* EOF */ ) val = /*::(*/ R . f ( blob , length , opts ) /*:: :any)*/ ;
else val = /*::(*/ slurp ( RecordType , R , blob , length , opts ) /*:: :any)*/ ;
2019-11-01 03:09:14 +00:00
/*:: val = (val:any); */
2022-05-22 23:51:41 +00:00
if ( file _depth == 0 && [ 0x0009 , 0x0209 , 0x0409 , 0x0809 ] . indexOf ( last _RT ) === - 1 /* BOF */ ) continue ;
2022-03-12 14:05:57 +00:00
switch ( RecordType ) {
case 0x0022 /* Date1904 */ :
2017-06-01 21:22:11 +00:00
/*:: if(!Workbook.WBProps) Workbook.WBProps = {}; */
wb . opts . Date1904 = Workbook . WBProps . date1904 = val ; break ;
2022-03-12 14:05:57 +00:00
case 0x0086 /* WriteProtect */ : wb . opts . WriteProtect = true ; break ;
case 0x002f /* FilePass */ :
2017-02-03 20:50:45 +00:00
if ( ! opts . enc ) blob . l = 0 ;
opts . enc = val ;
if ( ! options . password ) throw new Error ( "File is password-protected" ) ;
2017-05-11 07:29:59 +00:00
if ( val . valid == null ) throw new Error ( "Encryption scheme unsupported" ) ;
2017-02-03 20:50:45 +00:00
if ( ! val . valid ) throw new Error ( "Password is incorrect" ) ;
break ;
2022-03-12 14:05:57 +00:00
case 0x005c /* WriteAccess */ : opts . lastuser = val ; break ;
case 0x0042 /* CodePage */ :
2019-11-01 03:09:14 +00:00
var cpval = Number ( val ) ;
2017-02-03 20:50:45 +00:00
/* overrides based on test cases */
2019-11-01 03:09:14 +00:00
switch ( cpval ) {
case 0x5212 : cpval = 1200 ; break ;
case 0x8000 : cpval = 10000 ; break ;
case 0x8001 : cpval = 1252 ; break ;
2017-08-18 18:10:18 +00:00
}
2019-11-01 03:09:14 +00:00
set _cp ( opts . codepage = cpval ) ;
2017-12-09 07:17:25 +00:00
seen _codepage = true ;
2017-02-03 20:50:45 +00:00
break ;
2022-03-12 14:05:57 +00:00
case 0x013d /* RRTabId */ : opts . rrtabid = val ; break ;
case 0x0019 /* WinProtect */ : opts . winlocked = val ; break ;
case 0x01b7 /* RefreshAll */ : wb . opts [ "RefreshAll" ] = val ; break ;
case 0x000c /* CalcCount */ : wb . opts [ "CalcCount" ] = val ; break ;
case 0x0010 /* CalcDelta */ : wb . opts [ "CalcDelta" ] = val ; break ;
case 0x0011 /* CalcIter */ : wb . opts [ "CalcIter" ] = val ; break ;
case 0x000d /* CalcMode */ : wb . opts [ "CalcMode" ] = val ; break ;
case 0x000e /* CalcPrecision */ : wb . opts [ "CalcPrecision" ] = val ; break ;
case 0x005f /* CalcSaveRecalc */ : wb . opts [ "CalcSaveRecalc" ] = val ; break ;
case 0x000f /* CalcRefMode */ : opts . CalcRefMode = val ; break ; // TODO: implement R1C1
case 0x08a3 /* ForceFullCalculation */ : wb . opts . FullCalc = val ; break ;
case 0x0081 /* WsBool */ :
2017-11-20 01:51:14 +00:00
if ( val . fDialog ) out [ "!type" ] = "dialog" ;
2021-10-13 07:20:25 +00:00
if ( ! val . fBelow ) ( out [ "!outline" ] || ( out [ "!outline" ] = { } ) ) . above = true ;
if ( ! val . fRight ) ( out [ "!outline" ] || ( out [ "!outline" ] = { } ) ) . left = true ;
2017-11-20 01:51:14 +00:00
break ; // TODO
2022-03-12 14:05:57 +00:00
case 0x00e0 /* XF */ :
2019-04-01 14:25:15 +00:00
XFs . push ( val ) ; break ;
2022-03-12 14:05:57 +00:00
case 0x01ae /* SupBook */ :
2017-04-11 22:15:36 +00:00
supbooks . push ( [ val ] ) ;
supbooks [ supbooks . length - 1 ] . XTI = [ ] ;
break ;
2022-03-12 14:05:57 +00:00
case 0x0023 : case 0x0223 /* ExternName */ :
2017-04-11 22:15:36 +00:00
supbooks [ supbooks . length - 1 ] . push ( val ) ;
break ;
2022-03-12 14:05:57 +00:00
case 0x0018 : case 0x0218 /* Lbl */ :
2017-05-13 18:21:22 +00:00
last _lbl = ( {
2017-04-11 22:15:36 +00:00
Name : val . Name ,
Ref : stringify _formula ( val . rgce , range , null , supbooks , opts )
2017-05-13 18:21:22 +00:00
} /*:DefinedName*/ ) ;
2017-04-11 22:15:36 +00:00
if ( val . itab > 0 ) last _lbl . Sheet = val . itab - 1 ;
supbooks . names . push ( last _lbl ) ;
2017-12-30 05:40:35 +00:00
if ( ! supbooks [ 0 ] ) { supbooks [ 0 ] = [ ] ; supbooks [ 0 ] . XTI = [ ] ; }
2017-04-11 22:15:36 +00:00
supbooks [ supbooks . length - 1 ] . push ( val ) ;
2017-06-10 01:47:42 +00:00
if ( val . Name == "_xlnm._FilterDatabase" && val . itab > 0 )
2017-04-10 05:10:54 +00:00
if ( val . rgce && val . rgce [ 0 ] && val . rgce [ 0 ] [ 0 ] && val . rgce [ 0 ] [ 0 ] [ 0 ] == 'PtgArea3d' )
FilterDatabases [ val . itab - 1 ] = { ref : encode _range ( val . rgce [ 0 ] [ 0 ] [ 1 ] [ 2 ] ) } ;
break ;
2022-03-12 14:05:57 +00:00
case 0x0016 /* ExternCount */ : opts . ExternCount = val ; break ;
case 0x0017 /* ExternSheet */ :
2017-04-11 22:15:36 +00:00
if ( supbooks . length == 0 ) { supbooks [ 0 ] = [ ] ; supbooks [ 0 ] . XTI = [ ] ; }
supbooks [ supbooks . length - 1 ] . XTI = supbooks [ supbooks . length - 1 ] . XTI . concat ( val ) ; supbooks . XTI = supbooks . XTI . concat ( val ) ; break ;
2022-03-12 14:05:57 +00:00
case 0x0894 /* NameCmt */ :
2017-04-11 22:15:36 +00:00
/* TODO: search for correct name */
if ( opts . biff < 8 ) break ;
2017-05-13 18:21:22 +00:00
if ( last _lbl != null ) last _lbl . Comment = val [ 1 ] ;
2017-04-11 22:15:36 +00:00
break ;
2022-03-12 14:05:57 +00:00
case 0x0012 /* Protect */ : out [ "!protect" ] = val ; break ; /* for sheet or book */
case 0x0013 /* Password */ : if ( val !== 0 && opts . WTF ) console . error ( "Password verifier: " + val ) ; break ;
case 0x0085 /* BoundSheet8 */ : {
2017-02-03 20:50:45 +00:00
Directory [ val . pos ] = val ;
opts . snames . push ( val . name ) ;
} break ;
2022-03-12 14:05:57 +00:00
case 0x000a /* EOF */ : {
2017-02-03 20:50:45 +00:00
if ( -- file _depth ) break ;
if ( range . e ) {
if ( range . e . r > 0 && range . e . c > 0 ) {
range . e . r -- ; range . e . c -- ;
out [ "!ref" ] = encode _range ( range ) ;
2018-04-06 06:39:48 +00:00
if ( options . sheetRows && options . sheetRows <= range . e . r ) {
var tmpri = range . e . r ;
range . e . r = options . sheetRows - 1 ;
out [ "!fullref" ] = out [ "!ref" ] ;
out [ "!ref" ] = encode _range ( range ) ;
range . e . r = tmpri ;
}
2017-02-03 20:50:45 +00:00
range . e . r ++ ; range . e . c ++ ;
}
2017-12-30 05:40:35 +00:00
if ( merges . length > 0 ) out [ "!merges" ] = merges ;
2017-02-03 20:50:45 +00:00
if ( objects . length > 0 ) out [ "!objects" ] = objects ;
2017-03-20 09:02:25 +00:00
if ( colinfo . length > 0 ) out [ "!cols" ] = colinfo ;
if ( rowinfo . length > 0 ) out [ "!rows" ] = rowinfo ;
2017-03-31 18:46:42 +00:00
Workbook . Sheets . push ( wsprops ) ;
2017-02-03 20:50:45 +00:00
}
if ( cur _sheet === "" ) Preamble = out ; else Sheets [ cur _sheet ] = out ;
2017-05-13 18:21:22 +00:00
out = ( ( options . dense ? [ ] : { } ) /*:any*/ ) ;
2017-02-03 20:50:45 +00:00
} break ;
2022-03-12 14:05:57 +00:00
case 0x0009 : case 0x0209 : case 0x0409 : case 0x0809 /* BOF */ : {
2017-12-30 05:40:35 +00:00
if ( opts . biff === 8 ) opts . biff = {
/*::[*/ 0x0009 /*::]*/ : 2 ,
/*::[*/ 0x0209 /*::]*/ : 3 ,
/*::[*/ 0x0409 /*::]*/ : 4
} [ RecordType ] || {
2018-02-21 07:01:34 +00:00
/*::[*/ 0x0200 /*::]*/ : 2 ,
/*::[*/ 0x0300 /*::]*/ : 3 ,
/*::[*/ 0x0400 /*::]*/ : 4 ,
2017-12-30 05:40:35 +00:00
/*::[*/ 0x0500 /*::]*/ : 5 ,
/*::[*/ 0x0600 /*::]*/ : 8 ,
/*::[*/ 0x0002 /*::]*/ : 2 ,
/*::[*/ 0x0007 /*::]*/ : 2
} [ val . BIFFVer ] || 8 ;
2021-10-13 07:20:25 +00:00
opts . biffguess = val . BIFFVer == 0 ;
if ( val . BIFFVer == 0 && val . dt == 0x1000 ) { opts . biff = 5 ; seen _codepage = true ; set _cp ( opts . codepage = 28591 ) ; }
2018-08-15 19:22:47 +00:00
if ( opts . biff == 8 && val . BIFFVer == 0 && val . dt == 16 ) opts . biff = 2 ;
2017-02-03 20:50:45 +00:00
if ( file _depth ++ ) break ;
2017-05-13 18:21:22 +00:00
out = ( ( options . dense ? [ ] : { } ) /*:any*/ ) ;
2017-03-31 18:46:42 +00:00
2017-12-09 07:17:25 +00:00
if ( opts . biff < 8 && ! seen _codepage ) { seen _codepage = true ; set _cp ( opts . codepage = options . codepage || 1252 ) ; }
2021-10-13 07:20:25 +00:00
if ( opts . biff < 5 || val . BIFFVer == 0 && val . dt == 0x1000 ) {
2017-02-03 20:50:45 +00:00
if ( cur _sheet === "" ) cur _sheet = "Sheet1" ;
range = { s : { r : 0 , c : 0 } , e : { r : 0 , c : 0 } } ;
2017-02-10 19:23:01 +00:00
/* fake BoundSheet8 */
var fakebs8 = { pos : blob . l - length , name : cur _sheet } ;
Directory [ fakebs8 . pos ] = fakebs8 ;
opts . snames . push ( cur _sheet ) ;
2017-02-03 20:50:45 +00:00
}
else cur _sheet = ( Directory [ s ] || { name : "" } ) . name ;
2017-03-27 21:35:15 +00:00
if ( val . dt == 0x20 ) out [ "!type" ] = "chart" ;
2017-11-20 01:51:14 +00:00
if ( val . dt == 0x40 ) out [ "!type" ] = "macro" ;
2017-12-30 05:40:35 +00:00
merges = [ ] ;
2017-02-03 20:50:45 +00:00
objects = [ ] ;
2017-12-30 05:40:35 +00:00
opts . arrayf = arrayf = [ ] ;
2017-03-20 09:02:25 +00:00
colinfo = [ ] ; rowinfo = [ ] ;
seencol = false ;
2017-03-31 18:46:42 +00:00
wsprops = { Hidden : ( Directory [ s ] || { hs : 0 } ) . hs , name : cur _sheet } ;
2017-02-03 20:50:45 +00:00
} break ;
2022-03-12 14:05:57 +00:00
case 0x0203 /* Number */ : case 0x0003 /* BIFF2NUM */ : case 0x0002 /* BIFF2INT */ : {
2017-04-08 06:55:35 +00:00
if ( out [ "!type" ] == "chart" ) if ( options . dense ? ( out [ val . r ] || [ ] ) [ val . c ] : out [ encode _cell ( { c : val . c , r : val . r } ) ] ) ++ val . c ;
2017-05-13 18:21:22 +00:00
temp _val = ( { ixfe : val . ixfe , XF : XFs [ val . ixfe ] || { } , v : val . val , t : 'n' } /*:any*/ ) ;
2021-10-13 07:20:25 +00:00
if ( BIFF2Fmt > 0 ) temp _val . z = BIFF2FmtTable [ ( temp _val . ixfe >> 8 ) & 0x3F ] ;
2017-02-10 19:23:01 +00:00
safe _format _xf ( temp _val , options , wb . opts . Date1904 ) ;
2017-02-03 20:50:45 +00:00
addcell ( { c : val . c , r : val . r } , temp _val , options ) ;
} break ;
2022-03-12 14:05:57 +00:00
case 0x0005 : case 0x0205 /* BoolErr */ : {
2017-05-13 18:21:22 +00:00
temp _val = ( { ixfe : val . ixfe , XF : XFs [ val . ixfe ] , v : val . val , t : val . t } /*:any*/ ) ;
2021-10-13 07:20:25 +00:00
if ( BIFF2Fmt > 0 ) temp _val . z = BIFF2FmtTable [ ( temp _val . ixfe >> 8 ) & 0x3F ] ;
2017-02-10 19:23:01 +00:00
safe _format _xf ( temp _val , options , wb . opts . Date1904 ) ;
2017-02-03 20:50:45 +00:00
addcell ( { c : val . c , r : val . r } , temp _val , options ) ;
} break ;
2022-03-12 14:05:57 +00:00
case 0x027e /* RK */ : {
2017-05-13 18:21:22 +00:00
temp _val = ( { ixfe : val . ixfe , XF : XFs [ val . ixfe ] , v : val . rknum , t : 'n' } /*:any*/ ) ;
2021-10-13 07:20:25 +00:00
if ( BIFF2Fmt > 0 ) temp _val . z = BIFF2FmtTable [ ( temp _val . ixfe >> 8 ) & 0x3F ] ;
2017-02-10 19:23:01 +00:00
safe _format _xf ( temp _val , options , wb . opts . Date1904 ) ;
2017-02-03 20:50:45 +00:00
addcell ( { c : val . c , r : val . r } , temp _val , options ) ;
} break ;
2022-03-12 14:05:57 +00:00
case 0x00bd /* MulRk */ : {
2017-02-03 20:50:45 +00:00
for ( var j = val . c ; j <= val . C ; ++ j ) {
var ixfe = val . rkrec [ j - val . c ] [ 0 ] ;
2017-05-13 18:21:22 +00:00
temp _val = ( { ixfe : ixfe , XF : XFs [ ixfe ] , v : val . rkrec [ j - val . c ] [ 1 ] , t : 'n' } /*:any*/ ) ;
2021-10-13 07:20:25 +00:00
if ( BIFF2Fmt > 0 ) temp _val . z = BIFF2FmtTable [ ( temp _val . ixfe >> 8 ) & 0x3F ] ;
2017-02-10 19:23:01 +00:00
safe _format _xf ( temp _val , options , wb . opts . Date1904 ) ;
2017-02-03 20:50:45 +00:00
addcell ( { c : j , r : val . r } , temp _val , options ) ;
}
} break ;
2022-03-12 14:05:57 +00:00
case 0x0006 : case 0x0206 : case 0x0406 /* Formula */ : {
2017-03-18 00:45:06 +00:00
if ( val . val == 'String' ) { last _formula = val ; break ; }
2017-05-13 18:21:22 +00:00
temp _val = make _cell ( val . val , val . cell . ixfe , val . tt ) ;
2017-03-18 00:45:06 +00:00
temp _val . XF = XFs [ temp _val . ixfe ] ;
if ( options . cellFormula ) {
var _f = val . formula ;
if ( _f && _f [ 0 ] && _f [ 0 ] [ 0 ] && _f [ 0 ] [ 0 ] [ 0 ] == 'PtgExp' ) {
var _fr = _f [ 0 ] [ 0 ] [ 1 ] [ 0 ] , _fc = _f [ 0 ] [ 0 ] [ 1 ] [ 1 ] ;
var _fe = encode _cell ( { r : _fr , c : _fc } ) ;
2018-01-09 07:36:02 +00:00
if ( sharedf [ _fe ] ) temp _val . f = "" + stringify _formula ( val . formula , range , val . cell , supbooks , opts ) ;
2017-04-08 06:55:35 +00:00
else temp _val . F = ( ( options . dense ? ( out [ _fr ] || [ ] ) [ _fc ] : out [ _fe ] ) || { } ) . F ;
2017-03-18 00:45:06 +00:00
} else temp _val . f = "" + stringify _formula ( val . formula , range , val . cell , supbooks , opts ) ;
2017-02-03 20:50:45 +00:00
}
2021-10-13 07:20:25 +00:00
if ( BIFF2Fmt > 0 ) temp _val . z = BIFF2FmtTable [ ( temp _val . ixfe >> 8 ) & 0x3F ] ;
2017-03-18 00:45:06 +00:00
safe _format _xf ( temp _val , options , wb . opts . Date1904 ) ;
addcell ( val . cell , temp _val , options ) ;
last _formula = val ;
2017-02-03 20:50:45 +00:00
} break ;
2022-03-12 14:05:57 +00:00
case 0x0007 : case 0x0207 /* String */ : {
2017-03-18 00:45:06 +00:00
if ( last _formula ) { /* technically always true */
2017-02-03 20:50:45 +00:00
last _formula . val = val ;
2017-05-13 18:21:22 +00:00
temp _val = make _cell ( val , last _formula . cell . ixfe , 's' ) ;
2017-02-03 20:50:45 +00:00
temp _val . XF = XFs [ temp _val . ixfe ] ;
2017-03-18 00:45:06 +00:00
if ( options . cellFormula ) {
temp _val . f = "" + stringify _formula ( last _formula . formula , range , last _formula . cell , supbooks , opts ) ;
}
2021-10-13 07:20:25 +00:00
if ( BIFF2Fmt > 0 ) temp _val . z = BIFF2FmtTable [ ( temp _val . ixfe >> 8 ) & 0x3F ] ;
2017-02-10 19:23:01 +00:00
safe _format _xf ( temp _val , options , wb . opts . Date1904 ) ;
2017-02-03 20:50:45 +00:00
addcell ( last _formula . cell , temp _val , options ) ;
last _formula = null ;
2017-03-18 00:45:06 +00:00
} else throw new Error ( "String record expects Formula" ) ;
2017-02-03 20:50:45 +00:00
} break ;
2022-03-12 14:05:57 +00:00
case 0x0021 : case 0x0221 /* Array */ : {
2017-12-30 05:40:35 +00:00
arrayf . push ( val ) ;
2017-03-18 00:45:06 +00:00
var _arraystart = encode _cell ( val [ 0 ] . s ) ;
2017-04-08 06:55:35 +00:00
cc = options . dense ? ( out [ val [ 0 ] . s . r ] || [ ] ) [ val [ 0 ] . s . c ] : out [ _arraystart ] ;
if ( options . cellFormula && cc ) {
2017-03-12 18:02:43 +00:00
if ( ! last _formula ) break ; /* technically unreachable */
2017-04-08 06:55:35 +00:00
if ( ! _arraystart || ! cc ) break ;
cc . f = "" + stringify _formula ( val [ 1 ] , range , val [ 0 ] , supbooks , opts ) ;
cc . F = encode _range ( val [ 0 ] ) ;
2017-02-19 20:36:32 +00:00
}
2017-02-03 20:50:45 +00:00
} break ;
2022-03-12 14:05:57 +00:00
case 0x04bc /* ShrFmla */ : {
2017-02-19 20:36:32 +00:00
if ( ! options . cellFormula ) break ;
if ( last _cell ) {
/* TODO: capture range */
2017-03-12 18:02:43 +00:00
if ( ! last _formula ) break ; /* technically unreachable */
2018-01-09 07:36:02 +00:00
sharedf [ encode _cell ( last _formula . cell ) ] = val [ 0 ] ;
2017-04-08 06:55:35 +00:00
cc = options . dense ? ( out [ last _formula . cell . r ] || [ ] ) [ last _formula . cell . c ] : out [ encode _cell ( last _formula . cell ) ] ;
( cc || { } ) . f = "" + stringify _formula ( val [ 0 ] , range , lastcell , supbooks , opts ) ;
2017-02-19 20:36:32 +00:00
}
2017-02-03 20:50:45 +00:00
} break ;
2022-03-12 14:05:57 +00:00
case 0x00fd /* LabelSst */ :
2017-02-03 20:50:45 +00:00
temp _val = make _cell ( sst [ val . isst ] . t , val . ixfe , 's' ) ;
2019-11-15 01:46:49 +00:00
if ( sst [ val . isst ] . h ) temp _val . h = sst [ val . isst ] . h ;
2017-02-03 20:50:45 +00:00
temp _val . XF = XFs [ temp _val . ixfe ] ;
2021-10-13 07:20:25 +00:00
if ( BIFF2Fmt > 0 ) temp _val . z = BIFF2FmtTable [ ( temp _val . ixfe >> 8 ) & 0x3F ] ;
2017-02-10 19:23:01 +00:00
safe _format _xf ( temp _val , options , wb . opts . Date1904 ) ;
2017-02-03 20:50:45 +00:00
addcell ( { c : val . c , r : val . r } , temp _val , options ) ;
break ;
2022-03-12 14:05:57 +00:00
case 0x0201 /* Blank */ : if ( options . sheetStubs ) {
2017-05-13 18:21:22 +00:00
temp _val = ( { ixfe : val . ixfe , XF : XFs [ val . ixfe ] , t : 'z' } /*:any*/ ) ;
2021-10-13 07:20:25 +00:00
if ( BIFF2Fmt > 0 ) temp _val . z = BIFF2FmtTable [ ( temp _val . ixfe >> 8 ) & 0x3F ] ;
2017-03-15 08:19:02 +00:00
safe _format _xf ( temp _val , options , wb . opts . Date1904 ) ;
addcell ( { c : val . c , r : val . r } , temp _val , options ) ;
} break ;
2022-03-12 14:05:57 +00:00
case 0x00be /* MulBlank */ : if ( options . sheetStubs ) {
2017-03-15 08:19:02 +00:00
for ( var _j = val . c ; _j <= val . C ; ++ _j ) {
var _ixfe = val . ixfe [ _j - val . c ] ;
2017-05-13 18:21:22 +00:00
temp _val = ( { ixfe : _ixfe , XF : XFs [ _ixfe ] , t : 'z' } /*:any*/ ) ;
2021-10-13 07:20:25 +00:00
if ( BIFF2Fmt > 0 ) temp _val . z = BIFF2FmtTable [ ( temp _val . ixfe >> 8 ) & 0x3F ] ;
2017-03-15 08:19:02 +00:00
safe _format _xf ( temp _val , options , wb . opts . Date1904 ) ;
addcell ( { c : _j , r : val . r } , temp _val , options ) ;
}
} break ;
2022-03-12 14:05:57 +00:00
case 0x00d6 /* RString */ :
case 0x0204 /* Label */ : case 0x0004 /* BIFF2STR */ :
2017-02-03 20:50:45 +00:00
temp _val = make _cell ( val . val , val . ixfe , 's' ) ;
temp _val . XF = XFs [ temp _val . ixfe ] ;
2021-10-13 07:20:25 +00:00
if ( BIFF2Fmt > 0 ) temp _val . z = BIFF2FmtTable [ ( temp _val . ixfe >> 8 ) & 0x3F ] ;
2017-02-10 19:23:01 +00:00
safe _format _xf ( temp _val , options , wb . opts . Date1904 ) ;
2017-02-03 20:50:45 +00:00
addcell ( { c : val . c , r : val . r } , temp _val , options ) ;
break ;
2017-03-18 00:45:06 +00:00
2022-03-12 14:05:57 +00:00
case 0x0000 : case 0x0200 /* Dimensions */ : {
2017-02-03 20:50:45 +00:00
if ( file _depth === 1 ) range = val ; /* TODO: stack */
} break ;
2022-03-12 14:05:57 +00:00
case 0x00fc /* SST */ : {
2017-02-03 20:50:45 +00:00
sst = val ;
} break ;
2022-03-12 14:05:57 +00:00
case 0x041e /* Format */ : { /* val = [id, fmt] */
2017-12-01 05:48:10 +00:00
if ( opts . biff == 4 ) {
BIFF2FmtTable [ BIFF2Fmt ++ ] = val [ 1 ] ;
2022-03-20 05:29:24 +00:00
for ( var b4idx = 0 ; b4idx < BIFF2Fmt + 163 ; ++ b4idx ) if ( table _fmt [ b4idx ] == val [ 1 ] ) break ;
2022-04-11 04:11:47 +00:00
if ( b4idx >= 163 ) SSF _ _load ( val [ 1 ] , BIFF2Fmt + 163 ) ;
2017-12-01 05:48:10 +00:00
}
2022-04-11 04:11:47 +00:00
else SSF _ _load ( val [ 1 ] , val [ 0 ] ) ;
2017-02-03 20:50:45 +00:00
} break ;
2022-03-12 14:05:57 +00:00
case 0x001e /* BIFF2FORMAT */ : {
2017-05-09 18:07:57 +00:00
BIFF2FmtTable [ BIFF2Fmt ++ ] = val ;
2022-03-20 05:29:24 +00:00
for ( var b2idx = 0 ; b2idx < BIFF2Fmt + 163 ; ++ b2idx ) if ( table _fmt [ b2idx ] == val ) break ;
2022-04-11 04:11:47 +00:00
if ( b2idx >= 163 ) SSF _ _load ( val , BIFF2Fmt + 163 ) ;
2017-02-10 19:23:01 +00:00
} break ;
2017-02-03 20:50:45 +00:00
2022-03-12 14:05:57 +00:00
case 0x00e5 /* MergeCells */ : merges = merges . concat ( val ) ; break ;
2017-02-03 20:50:45 +00:00
2022-03-12 14:05:57 +00:00
case 0x005d /* Obj */ : objects [ val . cmo [ 0 ] ] = opts . lastobj = val ; break ;
case 0x01b6 /* TxO */ : opts . lastobj . TxO = val ; break ;
case 0x007f /* ImData */ : opts . lastobj . ImData = val ; break ;
2017-02-03 20:50:45 +00:00
2022-03-12 14:05:57 +00:00
case 0x01b8 /* HLink */ : {
2017-02-03 20:50:45 +00:00
for ( rngR = val [ 0 ] . s . r ; rngR <= val [ 0 ] . e . r ; ++ rngR )
2017-04-08 06:55:35 +00:00
for ( rngC = val [ 0 ] . s . c ; rngC <= val [ 0 ] . e . c ; ++ rngC ) {
cc = options . dense ? ( out [ rngR ] || [ ] ) [ rngC ] : out [ encode _cell ( { c : rngC , r : rngR } ) ] ;
if ( cc ) cc . l = val [ 1 ] ;
2017-05-09 18:07:57 +00:00
}
2017-02-03 20:50:45 +00:00
} break ;
2022-03-12 14:05:57 +00:00
case 0x0800 /* HLinkTooltip */ : {
2017-02-03 20:50:45 +00:00
for ( rngR = val [ 0 ] . s . r ; rngR <= val [ 0 ] . e . r ; ++ rngR )
2017-04-08 06:55:35 +00:00
for ( rngC = val [ 0 ] . s . c ; rngC <= val [ 0 ] . e . c ; ++ rngC ) {
cc = options . dense ? ( out [ rngR ] || [ ] ) [ rngC ] : out [ encode _cell ( { c : rngC , r : rngR } ) ] ;
2018-02-21 07:01:34 +00:00
if ( cc && cc . l ) cc . l . Tooltip = val [ 1 ] ;
2017-04-08 06:55:35 +00:00
}
2017-02-03 20:50:45 +00:00
} break ;
2022-03-12 14:05:57 +00:00
case 0x001c /* Note */ : {
2017-02-03 20:50:45 +00:00
if ( opts . biff <= 5 && opts . biff >= 2 ) break ; /* TODO: BIFF5 */
2017-04-08 06:55:35 +00:00
cc = options . dense ? ( out [ val [ 0 ] . r ] || [ ] ) [ val [ 0 ] . c ] : out [ encode _cell ( val [ 0 ] ) ] ;
2017-02-03 20:50:45 +00:00
var noteobj = objects [ val [ 2 ] ] ;
2019-08-03 22:37:04 +00:00
if ( ! cc ) {
if ( options . dense ) {
if ( ! out [ val [ 0 ] . r ] ) out [ val [ 0 ] . r ] = [ ] ;
2019-11-01 03:09:14 +00:00
cc = out [ val [ 0 ] . r ] [ val [ 0 ] . c ] = ( { t : "z" } /*:any*/ ) ;
2019-08-03 22:37:04 +00:00
} else {
2019-11-01 03:09:14 +00:00
cc = out [ encode _cell ( val [ 0 ] ) ] = ( { t : "z" } /*:any*/ ) ;
2019-08-03 22:37:04 +00:00
}
range . e . r = Math . max ( range . e . r , val [ 0 ] . r ) ;
range . s . r = Math . min ( range . s . r , val [ 0 ] . r ) ;
range . e . c = Math . max ( range . e . c , val [ 0 ] . c ) ;
range . s . c = Math . min ( range . s . c , val [ 0 ] . c ) ;
}
2017-02-03 20:50:45 +00:00
if ( ! cc . c ) cc . c = [ ] ;
cmnt = { a : val [ 1 ] , t : noteobj . TxO . t } ;
cc . c . push ( cmnt ) ;
} break ;
2022-03-12 14:05:57 +00:00
case 0x087d /* XFExt */ : update _xfext ( XFs [ val . ixfe ] , val . ext ) ; break ;
case 0x007d /* ColInfo */ : {
2017-03-20 09:02:25 +00:00
if ( ! opts . cellStyles ) break ;
while ( val . e >= val . s ) {
2021-10-13 07:20:25 +00:00
colinfo [ val . e -- ] = { width : val . w / 256 , level : ( val . level || 0 ) , hidden : ! ! ( val . flags & 1 ) } ;
2017-03-20 09:02:25 +00:00
if ( ! seencol ) { seencol = true ; find _mdw _colw ( val . w / 256 ) ; }
process _col ( colinfo [ val . e + 1 ] ) ;
}
} break ;
2022-03-12 14:05:57 +00:00
case 0x0208 /* Row */ : {
2017-04-28 07:28:03 +00:00
var rowobj = { } ;
2017-07-09 17:37:45 +00:00
if ( val . level != null ) { rowinfo [ val . r ] = rowobj ; rowobj . level = val . level ; }
2017-04-28 07:28:03 +00:00
if ( val . hidden ) { rowinfo [ val . r ] = rowobj ; rowobj . hidden = true ; }
if ( val . hpt ) {
rowinfo [ val . r ] = rowobj ;
rowobj . hpt = val . hpt ; rowobj . hpx = pt2px ( val . hpt ) ;
}
} break ;
2022-03-12 14:05:57 +00:00
case 0x0026 /* LeftMargin */ :
case 0x0027 /* RightMargin */ :
case 0x0028 /* TopMargin */ :
case 0x0029 /* BottomMargin */ :
2017-04-13 01:29:38 +00:00
if ( ! out [ '!margins' ] ) default _margins ( out [ '!margins' ] = { } ) ;
2022-03-12 14:05:57 +00:00
out [ '!margins' ] [ ( { 0x26 : "left" , 0x27 : "right" , 0x28 : "top" , 0x29 : "bottom" } ) [ RecordType ] ] = val ;
2017-04-13 01:29:38 +00:00
break ;
2022-03-12 14:05:57 +00:00
case 0x00a1 /* Setup */ : // TODO
2017-04-13 01:29:38 +00:00
if ( ! out [ '!margins' ] ) default _margins ( out [ '!margins' ] = { } ) ;
out [ '!margins' ] . header = val . header ;
out [ '!margins' ] . footer = val . footer ;
break ;
2022-03-12 14:05:57 +00:00
case 0x023e /* Window2 */ : // TODO
2017-12-30 05:40:35 +00:00
// $FlowIgnore
if ( val . RTL ) Workbook . Views [ 0 ] . RTL = true ;
break ;
2022-03-16 03:18:09 +00:00
case 0x0092 /* Palette */ : palette = val ; break ;
case 0x0896 /* Theme */ : themes = val ; break ;
case 0x008c /* Country */ : country = val ; break ;
case 0x01ba /* CodeName */ : {
/*:: if(!Workbook.WBProps) Workbook.WBProps = {}; */
if ( ! cur _sheet ) Workbook . WBProps . CodeName = val || "ThisWorkbook" ;
else wsprops . CodeName = val || wsprops . name ;
} break ;
2022-03-12 14:05:57 +00:00
}
2022-03-20 05:29:24 +00:00
} else {
if ( ! R ) console . error ( "Missing Info for XLS Record 0x" + RecordType . toString ( 16 ) ) ;
blob . l += length ;
}
2017-02-03 20:50:45 +00:00
}
2018-01-23 09:07:51 +00:00
wb . SheetNames = keys ( Directory ) . sort ( function ( a , b ) { return Number ( a ) - Number ( b ) ; } ) . map ( function ( x ) { return Directory [ x ] . name ; } ) ;
2017-02-03 20:50:45 +00:00
if ( ! options . bookSheets ) wb . Sheets = Sheets ;
2021-10-13 07:20:25 +00:00
if ( ! wb . SheetNames . length && Preamble [ "!ref" ] ) {
wb . SheetNames . push ( "Sheet1" ) ;
2022-01-10 18:45:50 +00:00
/*jshint -W069 */
2021-10-13 07:20:25 +00:00
if ( wb . Sheets ) wb . Sheets [ "Sheet1" ] = Preamble ;
2022-01-10 18:45:50 +00:00
/*jshint +W069 */
2021-10-13 07:20:25 +00:00
} else wb . Preamble = Preamble ;
2017-04-10 05:10:54 +00:00
if ( wb . Sheets ) FilterDatabases . forEach ( function ( r , i ) { wb . Sheets [ wb . SheetNames [ i ] ] [ '!autofilter' ] = r ; } ) ;
2017-02-03 20:50:45 +00:00
wb . Strings = sst ;
2022-03-20 05:29:24 +00:00
wb . SSF = dup ( table _fmt ) ;
2017-02-03 20:50:45 +00:00
if ( opts . enc ) wb . Encryption = opts . enc ;
2017-12-30 05:40:35 +00:00
if ( themes ) wb . Themes = themes ;
2017-02-03 20:50:45 +00:00
wb . Metadata = { } ;
if ( country !== undefined ) wb . Metadata . Country = country ;
2017-04-11 22:15:36 +00:00
if ( supbooks . names . length > 0 ) Workbook . Names = supbooks . names ;
2017-03-31 18:46:42 +00:00
wb . Workbook = Workbook ;
2017-02-03 20:50:45 +00:00
return wb ;
}
2018-05-05 06:34:37 +00:00
/* TODO: split props*/
var PSCLSID = {
SI : "e0859ff2f94f6810ab9108002b27b3d9" ,
DSI : "02d5cdd59c2e1b10939708002b2cf9ae" ,
UDI : "05d5cdd59c2e1b10939708002b2cf9ae"
} ;
function parse _xls _props ( cfb /*:CFBContainer*/ , props , o ) {
2017-04-30 16:27:03 +00:00
/* [MS-OSHARED] 2.3.3.2.2 Document Summary Information Property Set */
2022-02-01 05:58:45 +00:00
var DSI = CFB . find ( cfb , '/!DocumentSummaryInformation' ) ;
2018-02-14 20:06:35 +00:00
if ( DSI && DSI . size > 0 ) try {
2018-05-05 06:34:37 +00:00
var DocSummary = parse _PropertySetStream ( DSI , DocSummaryPIDDSI , PSCLSID . DSI ) ;
2017-09-30 06:18:11 +00:00
for ( var d in DocSummary ) props [ d ] = DocSummary [ d ] ;
2017-12-30 05:40:35 +00:00
} catch ( e ) { if ( o . WTF ) throw e ; /* empty */ }
2017-04-30 16:27:03 +00:00
/* [MS-OSHARED] 2.3.3.2.1 Summary Information Property Set*/
2022-02-01 05:58:45 +00:00
var SI = CFB . find ( cfb , '/!SummaryInformation' ) ;
2018-02-14 20:06:35 +00:00
if ( SI && SI . size > 0 ) try {
2018-05-05 06:34:37 +00:00
var Summary = parse _PropertySetStream ( SI , SummaryPIDSI , PSCLSID . SI ) ;
2017-09-30 06:18:11 +00:00
for ( var s in Summary ) if ( props [ s ] == null ) props [ s ] = Summary [ s ] ;
2017-12-30 05:40:35 +00:00
} catch ( e ) { if ( o . WTF ) throw e ; /* empty */ }
2018-05-05 06:34:37 +00:00
if ( props . HeadingPairs && props . TitlesOfParts ) {
load _props _pairs ( props . HeadingPairs , props . TitlesOfParts , props , o ) ;
delete props . HeadingPairs ; delete props . TitlesOfParts ;
}
}
function write _xls _props ( wb /*:Workbook*/ , cfb /*:CFBContainer*/ ) {
var DSEntries = [ ] , SEntries = [ ] , CEntries = [ ] ;
var i = 0 , Keys ;
2022-03-16 03:18:09 +00:00
var DocSummaryRE /*:{[key:string]:string}*/ = evert _key ( DocSummaryPIDDSI , "n" ) ;
var SummaryRE /*:{[key:string]:string}*/ = evert _key ( SummaryPIDSI , "n" ) ;
2018-05-05 06:34:37 +00:00
if ( wb . Props ) {
Keys = keys ( wb . Props ) ;
2018-05-20 01:34:59 +00:00
// $FlowIgnore
2020-03-15 07:42:05 +00:00
for ( i = 0 ; i < Keys . length ; ++ i ) ( Object . prototype . hasOwnProperty . call ( DocSummaryRE , Keys [ i ] ) ? DSEntries : Object . prototype . hasOwnProperty . call ( SummaryRE , Keys [ i ] ) ? SEntries : CEntries ) . push ( [ Keys [ i ] , wb . Props [ Keys [ i ] ] ] ) ;
2018-05-05 06:34:37 +00:00
}
if ( wb . Custprops ) {
Keys = keys ( wb . Custprops ) ;
2018-05-20 01:34:59 +00:00
// $FlowIgnore
2020-03-15 07:42:05 +00:00
for ( i = 0 ; i < Keys . length ; ++ i ) if ( ! Object . prototype . hasOwnProperty . call ( ( wb . Props || { } ) , Keys [ i ] ) ) ( Object . prototype . hasOwnProperty . call ( DocSummaryRE , Keys [ i ] ) ? DSEntries : Object . prototype . hasOwnProperty . call ( SummaryRE , Keys [ i ] ) ? SEntries : CEntries ) . push ( [ Keys [ i ] , wb . Custprops [ Keys [ i ] ] ] ) ;
2018-05-05 06:34:37 +00:00
}
var CEntries2 = [ ] ;
for ( i = 0 ; i < CEntries . length ; ++ i ) {
2022-03-16 03:18:09 +00:00
if ( XLSPSSkip . indexOf ( CEntries [ i ] [ 0 ] ) > - 1 || PseudoPropsPairs . indexOf ( CEntries [ i ] [ 0 ] ) > - 1 ) continue ;
2018-05-05 06:34:37 +00:00
if ( CEntries [ i ] [ 1 ] == null ) continue ;
CEntries2 . push ( CEntries [ i ] ) ;
}
if ( SEntries . length ) CFB . utils . cfb _add ( cfb , "/\u0005SummaryInformation" , write _PropertySetStream ( SEntries , PSCLSID . SI , SummaryRE , SummaryPIDSI ) ) ;
if ( DSEntries . length || CEntries2 . length ) CFB . utils . cfb _add ( cfb , "/\u0005DocumentSummaryInformation" , write _PropertySetStream ( DSEntries , PSCLSID . DSI , DocSummaryRE , DocSummaryPIDDSI , CEntries2 . length ? CEntries2 : null , PSCLSID . UDI ) ) ;
2017-04-30 16:27:03 +00:00
}
2017-03-12 18:02:43 +00:00
function parse _xlscfb ( cfb /*:any*/ , options /*:?ParseOpts*/ ) /*:Workbook*/ {
2017-02-03 20:50:45 +00:00
if ( ! options ) options = { } ;
fix _read _opts ( options ) ;
reset _cp ( ) ;
2017-12-30 05:40:35 +00:00
if ( options . codepage ) set _ansi ( options . codepage ) ;
2018-01-23 09:07:51 +00:00
var CompObj /*:?CFBEntry*/ , WB /*:?any*/ ;
2017-02-10 19:23:01 +00:00
if ( cfb . FullPaths ) {
2017-12-30 05:40:35 +00:00
if ( CFB . find ( cfb , '/encryption' ) ) throw new Error ( "File is password-protected" ) ;
2017-08-09 22:38:23 +00:00
CompObj = CFB . find ( cfb , '!CompObj' ) ;
2017-09-30 06:18:11 +00:00
WB = CFB . find ( cfb , '/Workbook' ) || CFB . find ( cfb , '/Book' ) ;
2017-02-03 20:50:45 +00:00
} else {
2017-08-19 23:06:34 +00:00
switch ( options . type ) {
2022-03-22 20:08:08 +00:00
case 'base64' : cfb = s2a ( Base64 _decode ( cfb ) ) ; break ;
2017-08-19 23:06:34 +00:00
case 'binary' : cfb = s2a ( cfb ) ; break ;
case 'buffer' : break ;
case 'array' : if ( ! Array . isArray ( cfb ) ) cfb = Array . prototype . slice . call ( cfb ) ; break ;
}
2017-02-03 20:50:45 +00:00
prep _blob ( cfb , 0 ) ;
2017-08-09 22:38:23 +00:00
WB = ( { content : cfb } /*:any*/ ) ;
2017-02-03 20:50:45 +00:00
}
2018-01-23 09:07:51 +00:00
var /*::CompObjP, */ WorkbookP /*:: :Workbook = XLSX.utils.book_new(); */ ;
2017-02-03 20:50:45 +00:00
2017-08-09 22:38:23 +00:00
var _data /*:?any*/ ;
2018-01-23 09:07:51 +00:00
if ( CompObj ) /*::CompObjP = */ parse _compobj ( CompObj ) ;
2017-03-12 18:02:43 +00:00
if ( options . bookProps && ! options . bookSheets ) WorkbookP = ( { } /*:any*/ ) ;
2017-09-30 06:18:11 +00:00
else /*:: if(cfb instanceof CFBContainer) */ {
var T = has _buf ? 'buffer' : 'array' ;
2017-08-09 22:38:23 +00:00
if ( WB && WB . content ) WorkbookP = parse _workbook ( WB . content , options ) ;
2017-04-04 16:09:41 +00:00
/* Quattro Pro 7-8 */
2017-09-30 06:18:11 +00:00
else if ( ( _data = CFB . find ( cfb , 'PerfectOffice_MAIN' ) ) && _data . content ) WorkbookP = WK _ . to _workbook ( _data . content , ( options . type = T , options ) ) ;
2017-04-04 16:09:41 +00:00
/* Quattro Pro 9 */
2017-09-30 06:18:11 +00:00
else if ( ( _data = CFB . find ( cfb , 'NativeContent_MAIN' ) ) && _data . content ) WorkbookP = WK _ . to _workbook ( _data . content , ( options . type = T , options ) ) ;
2022-01-10 18:45:50 +00:00
/* Works 4 for Mac */
else if ( ( _data = CFB . find ( cfb , 'MN0' ) ) && _data . content ) throw new Error ( "Unsupported Works 4 for Mac file" ) ;
2017-02-03 20:50:45 +00:00
else throw new Error ( "Cannot find Workbook stream" ) ;
2017-11-15 18:14:02 +00:00
if ( options . bookVBA && cfb . FullPaths && CFB . find ( cfb , '/_VBA_PROJECT_CUR/VBA/dir' ) ) WorkbookP . vbaraw = make _vba _xls ( cfb ) ;
2017-02-03 20:50:45 +00:00
}
var props = { } ;
2018-05-05 06:34:37 +00:00
if ( cfb . FullPaths ) parse _xls _props ( /*::((*/ cfb /*:: :any):CFBContainer)*/ , props , options ) ;
2017-09-30 06:18:11 +00:00
2017-02-03 20:50:45 +00:00
WorkbookP . Props = WorkbookP . Custprops = props ; /* TODO: split up properties */
if ( options . bookFiles ) WorkbookP . cfb = cfb ;
2017-03-12 18:02:43 +00:00
/*WorkbookP.CompObjP = CompObjP; // TODO: storage? */
2017-02-03 20:50:45 +00:00
return WorkbookP ;
}
2017-09-22 22:18:51 +00:00
function write _xlscfb ( wb /*:Workbook*/ , opts /*:WriteOpts*/ ) /*:CFBContainer*/ {
var o = opts || { } ;
var cfb = CFB . utils . cfb _new ( { root : "R" } ) ;
var wbpath = "/Workbook" ;
switch ( o . bookType || "xls" ) {
case "xls" : o . bookType = "biff8" ;
/* falls through */
2017-12-30 05:40:35 +00:00
case "xla" : if ( ! o . bookType ) o . bookType = "xla" ;
/* falls through */
2017-09-22 22:18:51 +00:00
case "biff8" : wbpath = "/Workbook" ; o . biff = 8 ; break ;
case "biff5" : wbpath = "/Book" ; o . biff = 5 ; break ;
default : throw new Error ( "invalid type " + o . bookType + " for XLS CFB" ) ;
}
CFB . utils . cfb _add ( cfb , wbpath , write _biff _buf ( wb , o ) ) ;
2018-05-05 06:34:37 +00:00
if ( o . biff == 8 && ( wb . Props || wb . Custprops ) ) write _xls _props ( wb , cfb ) ;
2017-09-22 22:18:51 +00:00
// TODO: SI, DSI, CO
2017-10-27 16:25:54 +00:00
if ( o . biff == 8 && wb . vbaraw ) fill _vba _xls ( cfb , CFB . read ( wb . vbaraw , { type : typeof wb . vbaraw == "string" ? "binary" : "buffer" } ) ) ;
2017-09-22 22:18:51 +00:00
return cfb ;
}
2017-02-03 20:50:45 +00:00
/* [MS-XLSB] 2.3 Record Enumeration */
var XLSBRecordEnum = {
2022-03-12 14:05:57 +00:00
/*::[*/ 0x0000 /*::]*/ : { /* n:"BrtRowHdr", */ f : parse _BrtRowHdr } ,
/*::[*/ 0x0001 /*::]*/ : { /* n:"BrtCellBlank", */ f : parse _BrtCellBlank } ,
/*::[*/ 0x0002 /*::]*/ : { /* n:"BrtCellRk", */ f : parse _BrtCellRk } ,
/*::[*/ 0x0003 /*::]*/ : { /* n:"BrtCellError", */ f : parse _BrtCellError } ,
/*::[*/ 0x0004 /*::]*/ : { /* n:"BrtCellBool", */ f : parse _BrtCellBool } ,
/*::[*/ 0x0005 /*::]*/ : { /* n:"BrtCellReal", */ f : parse _BrtCellReal } ,
/*::[*/ 0x0006 /*::]*/ : { /* n:"BrtCellSt", */ f : parse _BrtCellSt } ,
/*::[*/ 0x0007 /*::]*/ : { /* n:"BrtCellIsst", */ f : parse _BrtCellIsst } ,
/*::[*/ 0x0008 /*::]*/ : { /* n:"BrtFmlaString", */ f : parse _BrtFmlaString } ,
/*::[*/ 0x0009 /*::]*/ : { /* n:"BrtFmlaNum", */ f : parse _BrtFmlaNum } ,
/*::[*/ 0x000A /*::]*/ : { /* n:"BrtFmlaBool", */ f : parse _BrtFmlaBool } ,
/*::[*/ 0x000B /*::]*/ : { /* n:"BrtFmlaError", */ f : parse _BrtFmlaError } ,
/*::[*/ 0x000C /*::]*/ : { /* n:"BrtShortBlank", */ f : parse _BrtShortBlank } ,
/*::[*/ 0x000D /*::]*/ : { /* n:"BrtShortRk", */ f : parse _BrtShortRk } ,
/*::[*/ 0x000E /*::]*/ : { /* n:"BrtShortError", */ f : parse _BrtShortError } ,
/*::[*/ 0x000F /*::]*/ : { /* n:"BrtShortBool", */ f : parse _BrtShortBool } ,
/*::[*/ 0x0010 /*::]*/ : { /* n:"BrtShortReal", */ f : parse _BrtShortReal } ,
/*::[*/ 0x0011 /*::]*/ : { /* n:"BrtShortSt", */ f : parse _BrtShortSt } ,
/*::[*/ 0x0012 /*::]*/ : { /* n:"BrtShortIsst", */ f : parse _BrtShortIsst } ,
/*::[*/ 0x0013 /*::]*/ : { /* n:"BrtSSTItem", */ f : parse _RichStr } ,
/*::[*/ 0x0014 /*::]*/ : { /* n:"BrtPCDIMissing" */ } ,
/*::[*/ 0x0015 /*::]*/ : { /* n:"BrtPCDINumber" */ } ,
/*::[*/ 0x0016 /*::]*/ : { /* n:"BrtPCDIBoolean" */ } ,
/*::[*/ 0x0017 /*::]*/ : { /* n:"BrtPCDIError" */ } ,
/*::[*/ 0x0018 /*::]*/ : { /* n:"BrtPCDIString" */ } ,
/*::[*/ 0x0019 /*::]*/ : { /* n:"BrtPCDIDatetime" */ } ,
/*::[*/ 0x001A /*::]*/ : { /* n:"BrtPCDIIndex" */ } ,
/*::[*/ 0x001B /*::]*/ : { /* n:"BrtPCDIAMissing" */ } ,
/*::[*/ 0x001C /*::]*/ : { /* n:"BrtPCDIANumber" */ } ,
/*::[*/ 0x001D /*::]*/ : { /* n:"BrtPCDIABoolean" */ } ,
/*::[*/ 0x001E /*::]*/ : { /* n:"BrtPCDIAError" */ } ,
/*::[*/ 0x001F /*::]*/ : { /* n:"BrtPCDIAString" */ } ,
/*::[*/ 0x0020 /*::]*/ : { /* n:"BrtPCDIADatetime" */ } ,
/*::[*/ 0x0021 /*::]*/ : { /* n:"BrtPCRRecord" */ } ,
/*::[*/ 0x0022 /*::]*/ : { /* n:"BrtPCRRecordDt" */ } ,
/*::[*/ 0x0023 /*::]*/ : { /* n:"BrtFRTBegin", */ T : 1 } ,
/*::[*/ 0x0024 /*::]*/ : { /* n:"BrtFRTEnd", */ T : - 1 } ,
/*::[*/ 0x0025 /*::]*/ : { /* n:"BrtACBegin", */ T : 1 } ,
/*::[*/ 0x0026 /*::]*/ : { /* n:"BrtACEnd", */ T : - 1 } ,
/*::[*/ 0x0027 /*::]*/ : { /* n:"BrtName", */ f : parse _BrtName } ,
/*::[*/ 0x0028 /*::]*/ : { /* n:"BrtIndexRowBlock" */ } ,
/*::[*/ 0x002A /*::]*/ : { /* n:"BrtIndexBlock" */ } ,
/*::[*/ 0x002B /*::]*/ : { /* n:"BrtFont", */ f : parse _BrtFont } ,
/*::[*/ 0x002C /*::]*/ : { /* n:"BrtFmt", */ f : parse _BrtFmt } ,
/*::[*/ 0x002D /*::]*/ : { /* n:"BrtFill", */ f : parse _BrtFill } ,
/*::[*/ 0x002E /*::]*/ : { /* n:"BrtBorder", */ f : parse _BrtBorder } ,
/*::[*/ 0x002F /*::]*/ : { /* n:"BrtXF", */ f : parse _BrtXF } ,
/*::[*/ 0x0030 /*::]*/ : { /* n:"BrtStyle" */ } ,
/*::[*/ 0x0031 /*::]*/ : { /* n:"BrtCellMeta", */ f : parse _Int32LE } ,
/*::[*/ 0x0032 /*::]*/ : { /* n:"BrtValueMeta" */ } ,
2022-03-16 03:18:09 +00:00
/*::[*/ 0x0033 /*::]*/ : { /* n:"BrtMdb" */ f : parse _BrtMdb } ,
2022-03-12 14:05:57 +00:00
/*::[*/ 0x0034 /*::]*/ : { /* n:"BrtBeginFmd", */ T : 1 } ,
/*::[*/ 0x0035 /*::]*/ : { /* n:"BrtEndFmd", */ T : - 1 } ,
/*::[*/ 0x0036 /*::]*/ : { /* n:"BrtBeginMdx", */ T : 1 } ,
/*::[*/ 0x0037 /*::]*/ : { /* n:"BrtEndMdx", */ T : - 1 } ,
/*::[*/ 0x0038 /*::]*/ : { /* n:"BrtBeginMdxTuple", */ T : 1 } ,
/*::[*/ 0x0039 /*::]*/ : { /* n:"BrtEndMdxTuple", */ T : - 1 } ,
/*::[*/ 0x003A /*::]*/ : { /* n:"BrtMdxMbrIstr" */ } ,
/*::[*/ 0x003B /*::]*/ : { /* n:"BrtStr" */ } ,
/*::[*/ 0x003C /*::]*/ : { /* n:"BrtColInfo", */ f : parse _ColInfo } ,
/*::[*/ 0x003E /*::]*/ : { /* n:"BrtCellRString", */ f : parse _BrtCellRString } ,
/*::[*/ 0x003F /*::]*/ : { /* n:"BrtCalcChainItem$", */ f : parse _BrtCalcChainItem$ } ,
/*::[*/ 0x0040 /*::]*/ : { /* n:"BrtDVal", */ f : parse _BrtDVal } ,
/*::[*/ 0x0041 /*::]*/ : { /* n:"BrtSxvcellNum" */ } ,
/*::[*/ 0x0042 /*::]*/ : { /* n:"BrtSxvcellStr" */ } ,
/*::[*/ 0x0043 /*::]*/ : { /* n:"BrtSxvcellBool" */ } ,
/*::[*/ 0x0044 /*::]*/ : { /* n:"BrtSxvcellErr" */ } ,
/*::[*/ 0x0045 /*::]*/ : { /* n:"BrtSxvcellDate" */ } ,
/*::[*/ 0x0046 /*::]*/ : { /* n:"BrtSxvcellNil" */ } ,
/*::[*/ 0x0080 /*::]*/ : { /* n:"BrtFileVersion" */ } ,
/*::[*/ 0x0081 /*::]*/ : { /* n:"BrtBeginSheet", */ T : 1 } ,
/*::[*/ 0x0082 /*::]*/ : { /* n:"BrtEndSheet", */ T : - 1 } ,
/*::[*/ 0x0083 /*::]*/ : { /* n:"BrtBeginBook", */ T : 1 , f : parsenoop , p : 0 } ,
/*::[*/ 0x0084 /*::]*/ : { /* n:"BrtEndBook", */ T : - 1 } ,
/*::[*/ 0x0085 /*::]*/ : { /* n:"BrtBeginWsViews", */ T : 1 } ,
/*::[*/ 0x0086 /*::]*/ : { /* n:"BrtEndWsViews", */ T : - 1 } ,
/*::[*/ 0x0087 /*::]*/ : { /* n:"BrtBeginBookViews", */ T : 1 } ,
/*::[*/ 0x0088 /*::]*/ : { /* n:"BrtEndBookViews", */ T : - 1 } ,
/*::[*/ 0x0089 /*::]*/ : { /* n:"BrtBeginWsView", */ T : 1 , f : parse _BrtBeginWsView } ,
/*::[*/ 0x008A /*::]*/ : { /* n:"BrtEndWsView", */ T : - 1 } ,
/*::[*/ 0x008B /*::]*/ : { /* n:"BrtBeginCsViews", */ T : 1 } ,
/*::[*/ 0x008C /*::]*/ : { /* n:"BrtEndCsViews", */ T : - 1 } ,
/*::[*/ 0x008D /*::]*/ : { /* n:"BrtBeginCsView", */ T : 1 } ,
/*::[*/ 0x008E /*::]*/ : { /* n:"BrtEndCsView", */ T : - 1 } ,
/*::[*/ 0x008F /*::]*/ : { /* n:"BrtBeginBundleShs", */ T : 1 } ,
/*::[*/ 0x0090 /*::]*/ : { /* n:"BrtEndBundleShs", */ T : - 1 } ,
/*::[*/ 0x0091 /*::]*/ : { /* n:"BrtBeginSheetData", */ T : 1 } ,
/*::[*/ 0x0092 /*::]*/ : { /* n:"BrtEndSheetData", */ T : - 1 } ,
/*::[*/ 0x0093 /*::]*/ : { /* n:"BrtWsProp", */ f : parse _BrtWsProp } ,
/*::[*/ 0x0094 /*::]*/ : { /* n:"BrtWsDim", */ f : parse _BrtWsDim , p : 16 } ,
/*::[*/ 0x0097 /*::]*/ : { /* n:"BrtPane", */ f : parse _BrtPane } ,
/*::[*/ 0x0098 /*::]*/ : { /* n:"BrtSel" */ } ,
/*::[*/ 0x0099 /*::]*/ : { /* n:"BrtWbProp", */ f : parse _BrtWbProp } ,
/*::[*/ 0x009A /*::]*/ : { /* n:"BrtWbFactoid" */ } ,
/*::[*/ 0x009B /*::]*/ : { /* n:"BrtFileRecover" */ } ,
/*::[*/ 0x009C /*::]*/ : { /* n:"BrtBundleSh", */ f : parse _BrtBundleSh } ,
/*::[*/ 0x009D /*::]*/ : { /* n:"BrtCalcProp" */ } ,
/*::[*/ 0x009E /*::]*/ : { /* n:"BrtBookView" */ } ,
/*::[*/ 0x009F /*::]*/ : { /* n:"BrtBeginSst", */ T : 1 , f : parse _BrtBeginSst } ,
/*::[*/ 0x00A0 /*::]*/ : { /* n:"BrtEndSst", */ T : - 1 } ,
/*::[*/ 0x00A1 /*::]*/ : { /* n:"BrtBeginAFilter", */ T : 1 , f : parse _UncheckedRfX } ,
/*::[*/ 0x00A2 /*::]*/ : { /* n:"BrtEndAFilter", */ T : - 1 } ,
/*::[*/ 0x00A3 /*::]*/ : { /* n:"BrtBeginFilterColumn", */ T : 1 } ,
/*::[*/ 0x00A4 /*::]*/ : { /* n:"BrtEndFilterColumn", */ T : - 1 } ,
/*::[*/ 0x00A5 /*::]*/ : { /* n:"BrtBeginFilters", */ T : 1 } ,
/*::[*/ 0x00A6 /*::]*/ : { /* n:"BrtEndFilters", */ T : - 1 } ,
/*::[*/ 0x00A7 /*::]*/ : { /* n:"BrtFilter" */ } ,
/*::[*/ 0x00A8 /*::]*/ : { /* n:"BrtColorFilter" */ } ,
/*::[*/ 0x00A9 /*::]*/ : { /* n:"BrtIconFilter" */ } ,
/*::[*/ 0x00AA /*::]*/ : { /* n:"BrtTop10Filter" */ } ,
/*::[*/ 0x00AB /*::]*/ : { /* n:"BrtDynamicFilter" */ } ,
/*::[*/ 0x00AC /*::]*/ : { /* n:"BrtBeginCustomFilters", */ T : 1 } ,
/*::[*/ 0x00AD /*::]*/ : { /* n:"BrtEndCustomFilters", */ T : - 1 } ,
/*::[*/ 0x00AE /*::]*/ : { /* n:"BrtCustomFilter" */ } ,
/*::[*/ 0x00AF /*::]*/ : { /* n:"BrtAFilterDateGroupItem" */ } ,
/*::[*/ 0x00B0 /*::]*/ : { /* n:"BrtMergeCell", */ f : parse _BrtMergeCell } ,
/*::[*/ 0x00B1 /*::]*/ : { /* n:"BrtBeginMergeCells", */ T : 1 } ,
/*::[*/ 0x00B2 /*::]*/ : { /* n:"BrtEndMergeCells", */ T : - 1 } ,
/*::[*/ 0x00B3 /*::]*/ : { /* n:"BrtBeginPivotCacheDef", */ T : 1 } ,
/*::[*/ 0x00B4 /*::]*/ : { /* n:"BrtEndPivotCacheDef", */ T : - 1 } ,
/*::[*/ 0x00B5 /*::]*/ : { /* n:"BrtBeginPCDFields", */ T : 1 } ,
/*::[*/ 0x00B6 /*::]*/ : { /* n:"BrtEndPCDFields", */ T : - 1 } ,
/*::[*/ 0x00B7 /*::]*/ : { /* n:"BrtBeginPCDField", */ T : 1 } ,
/*::[*/ 0x00B8 /*::]*/ : { /* n:"BrtEndPCDField", */ T : - 1 } ,
/*::[*/ 0x00B9 /*::]*/ : { /* n:"BrtBeginPCDSource", */ T : 1 } ,
/*::[*/ 0x00BA /*::]*/ : { /* n:"BrtEndPCDSource", */ T : - 1 } ,
/*::[*/ 0x00BB /*::]*/ : { /* n:"BrtBeginPCDSRange", */ T : 1 } ,
/*::[*/ 0x00BC /*::]*/ : { /* n:"BrtEndPCDSRange", */ T : - 1 } ,
/*::[*/ 0x00BD /*::]*/ : { /* n:"BrtBeginPCDFAtbl", */ T : 1 } ,
/*::[*/ 0x00BE /*::]*/ : { /* n:"BrtEndPCDFAtbl", */ T : - 1 } ,
/*::[*/ 0x00BF /*::]*/ : { /* n:"BrtBeginPCDIRun", */ T : 1 } ,
/*::[*/ 0x00C0 /*::]*/ : { /* n:"BrtEndPCDIRun", */ T : - 1 } ,
/*::[*/ 0x00C1 /*::]*/ : { /* n:"BrtBeginPivotCacheRecords", */ T : 1 } ,
/*::[*/ 0x00C2 /*::]*/ : { /* n:"BrtEndPivotCacheRecords", */ T : - 1 } ,
/*::[*/ 0x00C3 /*::]*/ : { /* n:"BrtBeginPCDHierarchies", */ T : 1 } ,
/*::[*/ 0x00C4 /*::]*/ : { /* n:"BrtEndPCDHierarchies", */ T : - 1 } ,
/*::[*/ 0x00C5 /*::]*/ : { /* n:"BrtBeginPCDHierarchy", */ T : 1 } ,
/*::[*/ 0x00C6 /*::]*/ : { /* n:"BrtEndPCDHierarchy", */ T : - 1 } ,
/*::[*/ 0x00C7 /*::]*/ : { /* n:"BrtBeginPCDHFieldsUsage", */ T : 1 } ,
/*::[*/ 0x00C8 /*::]*/ : { /* n:"BrtEndPCDHFieldsUsage", */ T : - 1 } ,
/*::[*/ 0x00C9 /*::]*/ : { /* n:"BrtBeginExtConnection", */ T : 1 } ,
/*::[*/ 0x00CA /*::]*/ : { /* n:"BrtEndExtConnection", */ T : - 1 } ,
/*::[*/ 0x00CB /*::]*/ : { /* n:"BrtBeginECDbProps", */ T : 1 } ,
/*::[*/ 0x00CC /*::]*/ : { /* n:"BrtEndECDbProps", */ T : - 1 } ,
/*::[*/ 0x00CD /*::]*/ : { /* n:"BrtBeginECOlapProps", */ T : 1 } ,
/*::[*/ 0x00CE /*::]*/ : { /* n:"BrtEndECOlapProps", */ T : - 1 } ,
/*::[*/ 0x00CF /*::]*/ : { /* n:"BrtBeginPCDSConsol", */ T : 1 } ,
/*::[*/ 0x00D0 /*::]*/ : { /* n:"BrtEndPCDSConsol", */ T : - 1 } ,
/*::[*/ 0x00D1 /*::]*/ : { /* n:"BrtBeginPCDSCPages", */ T : 1 } ,
/*::[*/ 0x00D2 /*::]*/ : { /* n:"BrtEndPCDSCPages", */ T : - 1 } ,
/*::[*/ 0x00D3 /*::]*/ : { /* n:"BrtBeginPCDSCPage", */ T : 1 } ,
/*::[*/ 0x00D4 /*::]*/ : { /* n:"BrtEndPCDSCPage", */ T : - 1 } ,
/*::[*/ 0x00D5 /*::]*/ : { /* n:"BrtBeginPCDSCPItem", */ T : 1 } ,
/*::[*/ 0x00D6 /*::]*/ : { /* n:"BrtEndPCDSCPItem", */ T : - 1 } ,
/*::[*/ 0x00D7 /*::]*/ : { /* n:"BrtBeginPCDSCSets", */ T : 1 } ,
/*::[*/ 0x00D8 /*::]*/ : { /* n:"BrtEndPCDSCSets", */ T : - 1 } ,
/*::[*/ 0x00D9 /*::]*/ : { /* n:"BrtBeginPCDSCSet", */ T : 1 } ,
/*::[*/ 0x00DA /*::]*/ : { /* n:"BrtEndPCDSCSet", */ T : - 1 } ,
/*::[*/ 0x00DB /*::]*/ : { /* n:"BrtBeginPCDFGroup", */ T : 1 } ,
/*::[*/ 0x00DC /*::]*/ : { /* n:"BrtEndPCDFGroup", */ T : - 1 } ,
/*::[*/ 0x00DD /*::]*/ : { /* n:"BrtBeginPCDFGItems", */ T : 1 } ,
/*::[*/ 0x00DE /*::]*/ : { /* n:"BrtEndPCDFGItems", */ T : - 1 } ,
/*::[*/ 0x00DF /*::]*/ : { /* n:"BrtBeginPCDFGRange", */ T : 1 } ,
/*::[*/ 0x00E0 /*::]*/ : { /* n:"BrtEndPCDFGRange", */ T : - 1 } ,
/*::[*/ 0x00E1 /*::]*/ : { /* n:"BrtBeginPCDFGDiscrete", */ T : 1 } ,
/*::[*/ 0x00E2 /*::]*/ : { /* n:"BrtEndPCDFGDiscrete", */ T : - 1 } ,
/*::[*/ 0x00E3 /*::]*/ : { /* n:"BrtBeginPCDSDTupleCache", */ T : 1 } ,
/*::[*/ 0x00E4 /*::]*/ : { /* n:"BrtEndPCDSDTupleCache", */ T : - 1 } ,
/*::[*/ 0x00E5 /*::]*/ : { /* n:"BrtBeginPCDSDTCEntries", */ T : 1 } ,
/*::[*/ 0x00E6 /*::]*/ : { /* n:"BrtEndPCDSDTCEntries", */ T : - 1 } ,
/*::[*/ 0x00E7 /*::]*/ : { /* n:"BrtBeginPCDSDTCEMembers", */ T : 1 } ,
/*::[*/ 0x00E8 /*::]*/ : { /* n:"BrtEndPCDSDTCEMembers", */ T : - 1 } ,
/*::[*/ 0x00E9 /*::]*/ : { /* n:"BrtBeginPCDSDTCEMember", */ T : 1 } ,
/*::[*/ 0x00EA /*::]*/ : { /* n:"BrtEndPCDSDTCEMember", */ T : - 1 } ,
/*::[*/ 0x00EB /*::]*/ : { /* n:"BrtBeginPCDSDTCQueries", */ T : 1 } ,
/*::[*/ 0x00EC /*::]*/ : { /* n:"BrtEndPCDSDTCQueries", */ T : - 1 } ,
/*::[*/ 0x00ED /*::]*/ : { /* n:"BrtBeginPCDSDTCQuery", */ T : 1 } ,
/*::[*/ 0x00EE /*::]*/ : { /* n:"BrtEndPCDSDTCQuery", */ T : - 1 } ,
/*::[*/ 0x00EF /*::]*/ : { /* n:"BrtBeginPCDSDTCSets", */ T : 1 } ,
/*::[*/ 0x00F0 /*::]*/ : { /* n:"BrtEndPCDSDTCSets", */ T : - 1 } ,
/*::[*/ 0x00F1 /*::]*/ : { /* n:"BrtBeginPCDSDTCSet", */ T : 1 } ,
/*::[*/ 0x00F2 /*::]*/ : { /* n:"BrtEndPCDSDTCSet", */ T : - 1 } ,
/*::[*/ 0x00F3 /*::]*/ : { /* n:"BrtBeginPCDCalcItems", */ T : 1 } ,
/*::[*/ 0x00F4 /*::]*/ : { /* n:"BrtEndPCDCalcItems", */ T : - 1 } ,
/*::[*/ 0x00F5 /*::]*/ : { /* n:"BrtBeginPCDCalcItem", */ T : 1 } ,
/*::[*/ 0x00F6 /*::]*/ : { /* n:"BrtEndPCDCalcItem", */ T : - 1 } ,
/*::[*/ 0x00F7 /*::]*/ : { /* n:"BrtBeginPRule", */ T : 1 } ,
/*::[*/ 0x00F8 /*::]*/ : { /* n:"BrtEndPRule", */ T : - 1 } ,
/*::[*/ 0x00F9 /*::]*/ : { /* n:"BrtBeginPRFilters", */ T : 1 } ,
/*::[*/ 0x00FA /*::]*/ : { /* n:"BrtEndPRFilters", */ T : - 1 } ,
/*::[*/ 0x00FB /*::]*/ : { /* n:"BrtBeginPRFilter", */ T : 1 } ,
/*::[*/ 0x00FC /*::]*/ : { /* n:"BrtEndPRFilter", */ T : - 1 } ,
/*::[*/ 0x00FD /*::]*/ : { /* n:"BrtBeginPNames", */ T : 1 } ,
/*::[*/ 0x00FE /*::]*/ : { /* n:"BrtEndPNames", */ T : - 1 } ,
/*::[*/ 0x00FF /*::]*/ : { /* n:"BrtBeginPName", */ T : 1 } ,
/*::[*/ 0x0100 /*::]*/ : { /* n:"BrtEndPName", */ T : - 1 } ,
/*::[*/ 0x0101 /*::]*/ : { /* n:"BrtBeginPNPairs", */ T : 1 } ,
/*::[*/ 0x0102 /*::]*/ : { /* n:"BrtEndPNPairs", */ T : - 1 } ,
/*::[*/ 0x0103 /*::]*/ : { /* n:"BrtBeginPNPair", */ T : 1 } ,
/*::[*/ 0x0104 /*::]*/ : { /* n:"BrtEndPNPair", */ T : - 1 } ,
/*::[*/ 0x0105 /*::]*/ : { /* n:"BrtBeginECWebProps", */ T : 1 } ,
/*::[*/ 0x0106 /*::]*/ : { /* n:"BrtEndECWebProps", */ T : - 1 } ,
/*::[*/ 0x0107 /*::]*/ : { /* n:"BrtBeginEcWpTables", */ T : 1 } ,
/*::[*/ 0x0108 /*::]*/ : { /* n:"BrtEndECWPTables", */ T : - 1 } ,
/*::[*/ 0x0109 /*::]*/ : { /* n:"BrtBeginECParams", */ T : 1 } ,
/*::[*/ 0x010A /*::]*/ : { /* n:"BrtEndECParams", */ T : - 1 } ,
/*::[*/ 0x010B /*::]*/ : { /* n:"BrtBeginECParam", */ T : 1 } ,
/*::[*/ 0x010C /*::]*/ : { /* n:"BrtEndECParam", */ T : - 1 } ,
/*::[*/ 0x010D /*::]*/ : { /* n:"BrtBeginPCDKPIs", */ T : 1 } ,
/*::[*/ 0x010E /*::]*/ : { /* n:"BrtEndPCDKPIs", */ T : - 1 } ,
/*::[*/ 0x010F /*::]*/ : { /* n:"BrtBeginPCDKPI", */ T : 1 } ,
/*::[*/ 0x0110 /*::]*/ : { /* n:"BrtEndPCDKPI", */ T : - 1 } ,
/*::[*/ 0x0111 /*::]*/ : { /* n:"BrtBeginDims", */ T : 1 } ,
/*::[*/ 0x0112 /*::]*/ : { /* n:"BrtEndDims", */ T : - 1 } ,
/*::[*/ 0x0113 /*::]*/ : { /* n:"BrtBeginDim", */ T : 1 } ,
/*::[*/ 0x0114 /*::]*/ : { /* n:"BrtEndDim", */ T : - 1 } ,
/*::[*/ 0x0115 /*::]*/ : { /* n:"BrtIndexPartEnd" */ } ,
/*::[*/ 0x0116 /*::]*/ : { /* n:"BrtBeginStyleSheet", */ T : 1 } ,
/*::[*/ 0x0117 /*::]*/ : { /* n:"BrtEndStyleSheet", */ T : - 1 } ,
/*::[*/ 0x0118 /*::]*/ : { /* n:"BrtBeginSXView", */ T : 1 } ,
/*::[*/ 0x0119 /*::]*/ : { /* n:"BrtEndSXVI", */ T : - 1 } ,
/*::[*/ 0x011A /*::]*/ : { /* n:"BrtBeginSXVI", */ T : 1 } ,
/*::[*/ 0x011B /*::]*/ : { /* n:"BrtBeginSXVIs", */ T : 1 } ,
/*::[*/ 0x011C /*::]*/ : { /* n:"BrtEndSXVIs", */ T : - 1 } ,
/*::[*/ 0x011D /*::]*/ : { /* n:"BrtBeginSXVD", */ T : 1 } ,
/*::[*/ 0x011E /*::]*/ : { /* n:"BrtEndSXVD", */ T : - 1 } ,
/*::[*/ 0x011F /*::]*/ : { /* n:"BrtBeginSXVDs", */ T : 1 } ,
/*::[*/ 0x0120 /*::]*/ : { /* n:"BrtEndSXVDs", */ T : - 1 } ,
/*::[*/ 0x0121 /*::]*/ : { /* n:"BrtBeginSXPI", */ T : 1 } ,
/*::[*/ 0x0122 /*::]*/ : { /* n:"BrtEndSXPI", */ T : - 1 } ,
/*::[*/ 0x0123 /*::]*/ : { /* n:"BrtBeginSXPIs", */ T : 1 } ,
/*::[*/ 0x0124 /*::]*/ : { /* n:"BrtEndSXPIs", */ T : - 1 } ,
/*::[*/ 0x0125 /*::]*/ : { /* n:"BrtBeginSXDI", */ T : 1 } ,
/*::[*/ 0x0126 /*::]*/ : { /* n:"BrtEndSXDI", */ T : - 1 } ,
/*::[*/ 0x0127 /*::]*/ : { /* n:"BrtBeginSXDIs", */ T : 1 } ,
/*::[*/ 0x0128 /*::]*/ : { /* n:"BrtEndSXDIs", */ T : - 1 } ,
/*::[*/ 0x0129 /*::]*/ : { /* n:"BrtBeginSXLI", */ T : 1 } ,
/*::[*/ 0x012A /*::]*/ : { /* n:"BrtEndSXLI", */ T : - 1 } ,
/*::[*/ 0x012B /*::]*/ : { /* n:"BrtBeginSXLIRws", */ T : 1 } ,
/*::[*/ 0x012C /*::]*/ : { /* n:"BrtEndSXLIRws", */ T : - 1 } ,
/*::[*/ 0x012D /*::]*/ : { /* n:"BrtBeginSXLICols", */ T : 1 } ,
/*::[*/ 0x012E /*::]*/ : { /* n:"BrtEndSXLICols", */ T : - 1 } ,
/*::[*/ 0x012F /*::]*/ : { /* n:"BrtBeginSXFormat", */ T : 1 } ,
/*::[*/ 0x0130 /*::]*/ : { /* n:"BrtEndSXFormat", */ T : - 1 } ,
/*::[*/ 0x0131 /*::]*/ : { /* n:"BrtBeginSXFormats", */ T : 1 } ,
/*::[*/ 0x0132 /*::]*/ : { /* n:"BrtEndSxFormats", */ T : - 1 } ,
/*::[*/ 0x0133 /*::]*/ : { /* n:"BrtBeginSxSelect", */ T : 1 } ,
/*::[*/ 0x0134 /*::]*/ : { /* n:"BrtEndSxSelect", */ T : - 1 } ,
/*::[*/ 0x0135 /*::]*/ : { /* n:"BrtBeginISXVDRws", */ T : 1 } ,
/*::[*/ 0x0136 /*::]*/ : { /* n:"BrtEndISXVDRws", */ T : - 1 } ,
/*::[*/ 0x0137 /*::]*/ : { /* n:"BrtBeginISXVDCols", */ T : 1 } ,
/*::[*/ 0x0138 /*::]*/ : { /* n:"BrtEndISXVDCols", */ T : - 1 } ,
/*::[*/ 0x0139 /*::]*/ : { /* n:"BrtEndSXLocation", */ T : - 1 } ,
/*::[*/ 0x013A /*::]*/ : { /* n:"BrtBeginSXLocation", */ T : 1 } ,
/*::[*/ 0x013B /*::]*/ : { /* n:"BrtEndSXView", */ T : - 1 } ,
/*::[*/ 0x013C /*::]*/ : { /* n:"BrtBeginSXTHs", */ T : 1 } ,
/*::[*/ 0x013D /*::]*/ : { /* n:"BrtEndSXTHs", */ T : - 1 } ,
/*::[*/ 0x013E /*::]*/ : { /* n:"BrtBeginSXTH", */ T : 1 } ,
/*::[*/ 0x013F /*::]*/ : { /* n:"BrtEndSXTH", */ T : - 1 } ,
/*::[*/ 0x0140 /*::]*/ : { /* n:"BrtBeginISXTHRws", */ T : 1 } ,
/*::[*/ 0x0141 /*::]*/ : { /* n:"BrtEndISXTHRws", */ T : - 1 } ,
/*::[*/ 0x0142 /*::]*/ : { /* n:"BrtBeginISXTHCols", */ T : 1 } ,
/*::[*/ 0x0143 /*::]*/ : { /* n:"BrtEndISXTHCols", */ T : - 1 } ,
/*::[*/ 0x0144 /*::]*/ : { /* n:"BrtBeginSXTDMPS", */ T : 1 } ,
/*::[*/ 0x0145 /*::]*/ : { /* n:"BrtEndSXTDMPs", */ T : - 1 } ,
/*::[*/ 0x0146 /*::]*/ : { /* n:"BrtBeginSXTDMP", */ T : 1 } ,
/*::[*/ 0x0147 /*::]*/ : { /* n:"BrtEndSXTDMP", */ T : - 1 } ,
/*::[*/ 0x0148 /*::]*/ : { /* n:"BrtBeginSXTHItems", */ T : 1 } ,
/*::[*/ 0x0149 /*::]*/ : { /* n:"BrtEndSXTHItems", */ T : - 1 } ,
/*::[*/ 0x014A /*::]*/ : { /* n:"BrtBeginSXTHItem", */ T : 1 } ,
/*::[*/ 0x014B /*::]*/ : { /* n:"BrtEndSXTHItem", */ T : - 1 } ,
/*::[*/ 0x014C /*::]*/ : { /* n:"BrtBeginMetadata", */ T : 1 } ,
/*::[*/ 0x014D /*::]*/ : { /* n:"BrtEndMetadata", */ T : - 1 } ,
/*::[*/ 0x014E /*::]*/ : { /* n:"BrtBeginEsmdtinfo", */ T : 1 } ,
/*::[*/ 0x014F /*::]*/ : { /* n:"BrtMdtinfo", */ f : parse _BrtMdtinfo } ,
/*::[*/ 0x0150 /*::]*/ : { /* n:"BrtEndEsmdtinfo", */ T : - 1 } ,
2022-03-16 03:18:09 +00:00
/*::[*/ 0x0151 /*::]*/ : { /* n:"BrtBeginEsmdb", */ f : parse _BrtBeginEsmdb , T : 1 } ,
2022-03-12 14:05:57 +00:00
/*::[*/ 0x0152 /*::]*/ : { /* n:"BrtEndEsmdb", */ T : - 1 } ,
/*::[*/ 0x0153 /*::]*/ : { /* n:"BrtBeginEsfmd", */ T : 1 } ,
/*::[*/ 0x0154 /*::]*/ : { /* n:"BrtEndEsfmd", */ T : - 1 } ,
/*::[*/ 0x0155 /*::]*/ : { /* n:"BrtBeginSingleCells", */ T : 1 } ,
/*::[*/ 0x0156 /*::]*/ : { /* n:"BrtEndSingleCells", */ T : - 1 } ,
/*::[*/ 0x0157 /*::]*/ : { /* n:"BrtBeginList", */ T : 1 } ,
/*::[*/ 0x0158 /*::]*/ : { /* n:"BrtEndList", */ T : - 1 } ,
/*::[*/ 0x0159 /*::]*/ : { /* n:"BrtBeginListCols", */ T : 1 } ,
/*::[*/ 0x015A /*::]*/ : { /* n:"BrtEndListCols", */ T : - 1 } ,
/*::[*/ 0x015B /*::]*/ : { /* n:"BrtBeginListCol", */ T : 1 } ,
/*::[*/ 0x015C /*::]*/ : { /* n:"BrtEndListCol", */ T : - 1 } ,
/*::[*/ 0x015D /*::]*/ : { /* n:"BrtBeginListXmlCPr", */ T : 1 } ,
/*::[*/ 0x015E /*::]*/ : { /* n:"BrtEndListXmlCPr", */ T : - 1 } ,
/*::[*/ 0x015F /*::]*/ : { /* n:"BrtListCCFmla" */ } ,
/*::[*/ 0x0160 /*::]*/ : { /* n:"BrtListTrFmla" */ } ,
/*::[*/ 0x0161 /*::]*/ : { /* n:"BrtBeginExternals", */ T : 1 } ,
/*::[*/ 0x0162 /*::]*/ : { /* n:"BrtEndExternals", */ T : - 1 } ,
/*::[*/ 0x0163 /*::]*/ : { /* n:"BrtSupBookSrc", */ f : parse _RelID } ,
/*::[*/ 0x0165 /*::]*/ : { /* n:"BrtSupSelf" */ } ,
/*::[*/ 0x0166 /*::]*/ : { /* n:"BrtSupSame" */ } ,
/*::[*/ 0x0167 /*::]*/ : { /* n:"BrtSupTabs" */ } ,
/*::[*/ 0x0168 /*::]*/ : { /* n:"BrtBeginSupBook", */ T : 1 } ,
/*::[*/ 0x0169 /*::]*/ : { /* n:"BrtPlaceholderName" */ } ,
/*::[*/ 0x016A /*::]*/ : { /* n:"BrtExternSheet", */ f : parse _ExternSheet } ,
/*::[*/ 0x016B /*::]*/ : { /* n:"BrtExternTableStart" */ } ,
/*::[*/ 0x016C /*::]*/ : { /* n:"BrtExternTableEnd" */ } ,
/*::[*/ 0x016E /*::]*/ : { /* n:"BrtExternRowHdr" */ } ,
/*::[*/ 0x016F /*::]*/ : { /* n:"BrtExternCellBlank" */ } ,
/*::[*/ 0x0170 /*::]*/ : { /* n:"BrtExternCellReal" */ } ,
/*::[*/ 0x0171 /*::]*/ : { /* n:"BrtExternCellBool" */ } ,
/*::[*/ 0x0172 /*::]*/ : { /* n:"BrtExternCellError" */ } ,
/*::[*/ 0x0173 /*::]*/ : { /* n:"BrtExternCellString" */ } ,
/*::[*/ 0x0174 /*::]*/ : { /* n:"BrtBeginEsmdx", */ T : 1 } ,
/*::[*/ 0x0175 /*::]*/ : { /* n:"BrtEndEsmdx", */ T : - 1 } ,
/*::[*/ 0x0176 /*::]*/ : { /* n:"BrtBeginMdxSet", */ T : 1 } ,
/*::[*/ 0x0177 /*::]*/ : { /* n:"BrtEndMdxSet", */ T : - 1 } ,
/*::[*/ 0x0178 /*::]*/ : { /* n:"BrtBeginMdxMbrProp", */ T : 1 } ,
/*::[*/ 0x0179 /*::]*/ : { /* n:"BrtEndMdxMbrProp", */ T : - 1 } ,
/*::[*/ 0x017A /*::]*/ : { /* n:"BrtBeginMdxKPI", */ T : 1 } ,
/*::[*/ 0x017B /*::]*/ : { /* n:"BrtEndMdxKPI", */ T : - 1 } ,
/*::[*/ 0x017C /*::]*/ : { /* n:"BrtBeginEsstr", */ T : 1 } ,
/*::[*/ 0x017D /*::]*/ : { /* n:"BrtEndEsstr", */ T : - 1 } ,
/*::[*/ 0x017E /*::]*/ : { /* n:"BrtBeginPRFItem", */ T : 1 } ,
/*::[*/ 0x017F /*::]*/ : { /* n:"BrtEndPRFItem", */ T : - 1 } ,
/*::[*/ 0x0180 /*::]*/ : { /* n:"BrtBeginPivotCacheIDs", */ T : 1 } ,
/*::[*/ 0x0181 /*::]*/ : { /* n:"BrtEndPivotCacheIDs", */ T : - 1 } ,
/*::[*/ 0x0182 /*::]*/ : { /* n:"BrtBeginPivotCacheID", */ T : 1 } ,
/*::[*/ 0x0183 /*::]*/ : { /* n:"BrtEndPivotCacheID", */ T : - 1 } ,
/*::[*/ 0x0184 /*::]*/ : { /* n:"BrtBeginISXVIs", */ T : 1 } ,
/*::[*/ 0x0185 /*::]*/ : { /* n:"BrtEndISXVIs", */ T : - 1 } ,
/*::[*/ 0x0186 /*::]*/ : { /* n:"BrtBeginColInfos", */ T : 1 } ,
/*::[*/ 0x0187 /*::]*/ : { /* n:"BrtEndColInfos", */ T : - 1 } ,
/*::[*/ 0x0188 /*::]*/ : { /* n:"BrtBeginRwBrk", */ T : 1 } ,
/*::[*/ 0x0189 /*::]*/ : { /* n:"BrtEndRwBrk", */ T : - 1 } ,
/*::[*/ 0x018A /*::]*/ : { /* n:"BrtBeginColBrk", */ T : 1 } ,
/*::[*/ 0x018B /*::]*/ : { /* n:"BrtEndColBrk", */ T : - 1 } ,
/*::[*/ 0x018C /*::]*/ : { /* n:"BrtBrk" */ } ,
/*::[*/ 0x018D /*::]*/ : { /* n:"BrtUserBookView" */ } ,
/*::[*/ 0x018E /*::]*/ : { /* n:"BrtInfo" */ } ,
/*::[*/ 0x018F /*::]*/ : { /* n:"BrtCUsr" */ } ,
/*::[*/ 0x0190 /*::]*/ : { /* n:"BrtUsr" */ } ,
/*::[*/ 0x0191 /*::]*/ : { /* n:"BrtBeginUsers", */ T : 1 } ,
/*::[*/ 0x0193 /*::]*/ : { /* n:"BrtEOF" */ } ,
/*::[*/ 0x0194 /*::]*/ : { /* n:"BrtUCR" */ } ,
/*::[*/ 0x0195 /*::]*/ : { /* n:"BrtRRInsDel" */ } ,
/*::[*/ 0x0196 /*::]*/ : { /* n:"BrtRREndInsDel" */ } ,
/*::[*/ 0x0197 /*::]*/ : { /* n:"BrtRRMove" */ } ,
/*::[*/ 0x0198 /*::]*/ : { /* n:"BrtRREndMove" */ } ,
/*::[*/ 0x0199 /*::]*/ : { /* n:"BrtRRChgCell" */ } ,
/*::[*/ 0x019A /*::]*/ : { /* n:"BrtRREndChgCell" */ } ,
/*::[*/ 0x019B /*::]*/ : { /* n:"BrtRRHeader" */ } ,
/*::[*/ 0x019C /*::]*/ : { /* n:"BrtRRUserView" */ } ,
/*::[*/ 0x019D /*::]*/ : { /* n:"BrtRRRenSheet" */ } ,
/*::[*/ 0x019E /*::]*/ : { /* n:"BrtRRInsertSh" */ } ,
/*::[*/ 0x019F /*::]*/ : { /* n:"BrtRRDefName" */ } ,
/*::[*/ 0x01A0 /*::]*/ : { /* n:"BrtRRNote" */ } ,
/*::[*/ 0x01A1 /*::]*/ : { /* n:"BrtRRConflict" */ } ,
/*::[*/ 0x01A2 /*::]*/ : { /* n:"BrtRRTQSIF" */ } ,
/*::[*/ 0x01A3 /*::]*/ : { /* n:"BrtRRFormat" */ } ,
/*::[*/ 0x01A4 /*::]*/ : { /* n:"BrtRREndFormat" */ } ,
/*::[*/ 0x01A5 /*::]*/ : { /* n:"BrtRRAutoFmt" */ } ,
/*::[*/ 0x01A6 /*::]*/ : { /* n:"BrtBeginUserShViews", */ T : 1 } ,
/*::[*/ 0x01A7 /*::]*/ : { /* n:"BrtBeginUserShView", */ T : 1 } ,
/*::[*/ 0x01A8 /*::]*/ : { /* n:"BrtEndUserShView", */ T : - 1 } ,
/*::[*/ 0x01A9 /*::]*/ : { /* n:"BrtEndUserShViews", */ T : - 1 } ,
/*::[*/ 0x01AA /*::]*/ : { /* n:"BrtArrFmla", */ f : parse _BrtArrFmla } ,
/*::[*/ 0x01AB /*::]*/ : { /* n:"BrtShrFmla", */ f : parse _BrtShrFmla } ,
/*::[*/ 0x01AC /*::]*/ : { /* n:"BrtTable" */ } ,
/*::[*/ 0x01AD /*::]*/ : { /* n:"BrtBeginExtConnections", */ T : 1 } ,
/*::[*/ 0x01AE /*::]*/ : { /* n:"BrtEndExtConnections", */ T : - 1 } ,
/*::[*/ 0x01AF /*::]*/ : { /* n:"BrtBeginPCDCalcMems", */ T : 1 } ,
/*::[*/ 0x01B0 /*::]*/ : { /* n:"BrtEndPCDCalcMems", */ T : - 1 } ,
/*::[*/ 0x01B1 /*::]*/ : { /* n:"BrtBeginPCDCalcMem", */ T : 1 } ,
/*::[*/ 0x01B2 /*::]*/ : { /* n:"BrtEndPCDCalcMem", */ T : - 1 } ,
/*::[*/ 0x01B3 /*::]*/ : { /* n:"BrtBeginPCDHGLevels", */ T : 1 } ,
/*::[*/ 0x01B4 /*::]*/ : { /* n:"BrtEndPCDHGLevels", */ T : - 1 } ,
/*::[*/ 0x01B5 /*::]*/ : { /* n:"BrtBeginPCDHGLevel", */ T : 1 } ,
/*::[*/ 0x01B6 /*::]*/ : { /* n:"BrtEndPCDHGLevel", */ T : - 1 } ,
/*::[*/ 0x01B7 /*::]*/ : { /* n:"BrtBeginPCDHGLGroups", */ T : 1 } ,
/*::[*/ 0x01B8 /*::]*/ : { /* n:"BrtEndPCDHGLGroups", */ T : - 1 } ,
/*::[*/ 0x01B9 /*::]*/ : { /* n:"BrtBeginPCDHGLGroup", */ T : 1 } ,
/*::[*/ 0x01BA /*::]*/ : { /* n:"BrtEndPCDHGLGroup", */ T : - 1 } ,
/*::[*/ 0x01BB /*::]*/ : { /* n:"BrtBeginPCDHGLGMembers", */ T : 1 } ,
/*::[*/ 0x01BC /*::]*/ : { /* n:"BrtEndPCDHGLGMembers", */ T : - 1 } ,
/*::[*/ 0x01BD /*::]*/ : { /* n:"BrtBeginPCDHGLGMember", */ T : 1 } ,
/*::[*/ 0x01BE /*::]*/ : { /* n:"BrtEndPCDHGLGMember", */ T : - 1 } ,
/*::[*/ 0x01BF /*::]*/ : { /* n:"BrtBeginQSI", */ T : 1 } ,
/*::[*/ 0x01C0 /*::]*/ : { /* n:"BrtEndQSI", */ T : - 1 } ,
/*::[*/ 0x01C1 /*::]*/ : { /* n:"BrtBeginQSIR", */ T : 1 } ,
/*::[*/ 0x01C2 /*::]*/ : { /* n:"BrtEndQSIR", */ T : - 1 } ,
/*::[*/ 0x01C3 /*::]*/ : { /* n:"BrtBeginDeletedNames", */ T : 1 } ,
/*::[*/ 0x01C4 /*::]*/ : { /* n:"BrtEndDeletedNames", */ T : - 1 } ,
/*::[*/ 0x01C5 /*::]*/ : { /* n:"BrtBeginDeletedName", */ T : 1 } ,
/*::[*/ 0x01C6 /*::]*/ : { /* n:"BrtEndDeletedName", */ T : - 1 } ,
/*::[*/ 0x01C7 /*::]*/ : { /* n:"BrtBeginQSIFs", */ T : 1 } ,
/*::[*/ 0x01C8 /*::]*/ : { /* n:"BrtEndQSIFs", */ T : - 1 } ,
/*::[*/ 0x01C9 /*::]*/ : { /* n:"BrtBeginQSIF", */ T : 1 } ,
/*::[*/ 0x01CA /*::]*/ : { /* n:"BrtEndQSIF", */ T : - 1 } ,
/*::[*/ 0x01CB /*::]*/ : { /* n:"BrtBeginAutoSortScope", */ T : 1 } ,
/*::[*/ 0x01CC /*::]*/ : { /* n:"BrtEndAutoSortScope", */ T : - 1 } ,
/*::[*/ 0x01CD /*::]*/ : { /* n:"BrtBeginConditionalFormatting", */ T : 1 } ,
/*::[*/ 0x01CE /*::]*/ : { /* n:"BrtEndConditionalFormatting", */ T : - 1 } ,
/*::[*/ 0x01CF /*::]*/ : { /* n:"BrtBeginCFRule", */ T : 1 } ,
/*::[*/ 0x01D0 /*::]*/ : { /* n:"BrtEndCFRule", */ T : - 1 } ,
/*::[*/ 0x01D1 /*::]*/ : { /* n:"BrtBeginIconSet", */ T : 1 } ,
/*::[*/ 0x01D2 /*::]*/ : { /* n:"BrtEndIconSet", */ T : - 1 } ,
/*::[*/ 0x01D3 /*::]*/ : { /* n:"BrtBeginDatabar", */ T : 1 } ,
/*::[*/ 0x01D4 /*::]*/ : { /* n:"BrtEndDatabar", */ T : - 1 } ,
/*::[*/ 0x01D5 /*::]*/ : { /* n:"BrtBeginColorScale", */ T : 1 } ,
/*::[*/ 0x01D6 /*::]*/ : { /* n:"BrtEndColorScale", */ T : - 1 } ,
/*::[*/ 0x01D7 /*::]*/ : { /* n:"BrtCFVO" */ } ,
/*::[*/ 0x01D8 /*::]*/ : { /* n:"BrtExternValueMeta" */ } ,
/*::[*/ 0x01D9 /*::]*/ : { /* n:"BrtBeginColorPalette", */ T : 1 } ,
/*::[*/ 0x01DA /*::]*/ : { /* n:"BrtEndColorPalette", */ T : - 1 } ,
/*::[*/ 0x01DB /*::]*/ : { /* n:"BrtIndexedColor" */ } ,
/*::[*/ 0x01DC /*::]*/ : { /* n:"BrtMargins", */ f : parse _BrtMargins } ,
/*::[*/ 0x01DD /*::]*/ : { /* n:"BrtPrintOptions" */ } ,
/*::[*/ 0x01DE /*::]*/ : { /* n:"BrtPageSetup" */ } ,
/*::[*/ 0x01DF /*::]*/ : { /* n:"BrtBeginHeaderFooter", */ T : 1 } ,
/*::[*/ 0x01E0 /*::]*/ : { /* n:"BrtEndHeaderFooter", */ T : - 1 } ,
/*::[*/ 0x01E1 /*::]*/ : { /* n:"BrtBeginSXCrtFormat", */ T : 1 } ,
/*::[*/ 0x01E2 /*::]*/ : { /* n:"BrtEndSXCrtFormat", */ T : - 1 } ,
/*::[*/ 0x01E3 /*::]*/ : { /* n:"BrtBeginSXCrtFormats", */ T : 1 } ,
/*::[*/ 0x01E4 /*::]*/ : { /* n:"BrtEndSXCrtFormats", */ T : - 1 } ,
/*::[*/ 0x01E5 /*::]*/ : { /* n:"BrtWsFmtInfo", */ f : parse _BrtWsFmtInfo } ,
/*::[*/ 0x01E6 /*::]*/ : { /* n:"BrtBeginMgs", */ T : 1 } ,
/*::[*/ 0x01E7 /*::]*/ : { /* n:"BrtEndMGs", */ T : - 1 } ,
/*::[*/ 0x01E8 /*::]*/ : { /* n:"BrtBeginMGMaps", */ T : 1 } ,
/*::[*/ 0x01E9 /*::]*/ : { /* n:"BrtEndMGMaps", */ T : - 1 } ,
/*::[*/ 0x01EA /*::]*/ : { /* n:"BrtBeginMG", */ T : 1 } ,
/*::[*/ 0x01EB /*::]*/ : { /* n:"BrtEndMG", */ T : - 1 } ,
/*::[*/ 0x01EC /*::]*/ : { /* n:"BrtBeginMap", */ T : 1 } ,
/*::[*/ 0x01ED /*::]*/ : { /* n:"BrtEndMap", */ T : - 1 } ,
/*::[*/ 0x01EE /*::]*/ : { /* n:"BrtHLink", */ f : parse _BrtHLink } ,
/*::[*/ 0x01EF /*::]*/ : { /* n:"BrtBeginDCon", */ T : 1 } ,
/*::[*/ 0x01F0 /*::]*/ : { /* n:"BrtEndDCon", */ T : - 1 } ,
/*::[*/ 0x01F1 /*::]*/ : { /* n:"BrtBeginDRefs", */ T : 1 } ,
/*::[*/ 0x01F2 /*::]*/ : { /* n:"BrtEndDRefs", */ T : - 1 } ,
/*::[*/ 0x01F3 /*::]*/ : { /* n:"BrtDRef" */ } ,
/*::[*/ 0x01F4 /*::]*/ : { /* n:"BrtBeginScenMan", */ T : 1 } ,
/*::[*/ 0x01F5 /*::]*/ : { /* n:"BrtEndScenMan", */ T : - 1 } ,
/*::[*/ 0x01F6 /*::]*/ : { /* n:"BrtBeginSct", */ T : 1 } ,
/*::[*/ 0x01F7 /*::]*/ : { /* n:"BrtEndSct", */ T : - 1 } ,
/*::[*/ 0x01F8 /*::]*/ : { /* n:"BrtSlc" */ } ,
/*::[*/ 0x01F9 /*::]*/ : { /* n:"BrtBeginDXFs", */ T : 1 } ,
/*::[*/ 0x01FA /*::]*/ : { /* n:"BrtEndDXFs", */ T : - 1 } ,
/*::[*/ 0x01FB /*::]*/ : { /* n:"BrtDXF" */ } ,
/*::[*/ 0x01FC /*::]*/ : { /* n:"BrtBeginTableStyles", */ T : 1 } ,
/*::[*/ 0x01FD /*::]*/ : { /* n:"BrtEndTableStyles", */ T : - 1 } ,
/*::[*/ 0x01FE /*::]*/ : { /* n:"BrtBeginTableStyle", */ T : 1 } ,
/*::[*/ 0x01FF /*::]*/ : { /* n:"BrtEndTableStyle", */ T : - 1 } ,
/*::[*/ 0x0200 /*::]*/ : { /* n:"BrtTableStyleElement" */ } ,
/*::[*/ 0x0201 /*::]*/ : { /* n:"BrtTableStyleClient" */ } ,
/*::[*/ 0x0202 /*::]*/ : { /* n:"BrtBeginVolDeps", */ T : 1 } ,
/*::[*/ 0x0203 /*::]*/ : { /* n:"BrtEndVolDeps", */ T : - 1 } ,
/*::[*/ 0x0204 /*::]*/ : { /* n:"BrtBeginVolType", */ T : 1 } ,
/*::[*/ 0x0205 /*::]*/ : { /* n:"BrtEndVolType", */ T : - 1 } ,
/*::[*/ 0x0206 /*::]*/ : { /* n:"BrtBeginVolMain", */ T : 1 } ,
/*::[*/ 0x0207 /*::]*/ : { /* n:"BrtEndVolMain", */ T : - 1 } ,
/*::[*/ 0x0208 /*::]*/ : { /* n:"BrtBeginVolTopic", */ T : 1 } ,
/*::[*/ 0x0209 /*::]*/ : { /* n:"BrtEndVolTopic", */ T : - 1 } ,
/*::[*/ 0x020A /*::]*/ : { /* n:"BrtVolSubtopic" */ } ,
/*::[*/ 0x020B /*::]*/ : { /* n:"BrtVolRef" */ } ,
/*::[*/ 0x020C /*::]*/ : { /* n:"BrtVolNum" */ } ,
/*::[*/ 0x020D /*::]*/ : { /* n:"BrtVolErr" */ } ,
/*::[*/ 0x020E /*::]*/ : { /* n:"BrtVolStr" */ } ,
/*::[*/ 0x020F /*::]*/ : { /* n:"BrtVolBool" */ } ,
/*::[*/ 0x0210 /*::]*/ : { /* n:"BrtBeginCalcChain$", */ T : 1 } ,
/*::[*/ 0x0211 /*::]*/ : { /* n:"BrtEndCalcChain$", */ T : - 1 } ,
/*::[*/ 0x0212 /*::]*/ : { /* n:"BrtBeginSortState", */ T : 1 } ,
/*::[*/ 0x0213 /*::]*/ : { /* n:"BrtEndSortState", */ T : - 1 } ,
/*::[*/ 0x0214 /*::]*/ : { /* n:"BrtBeginSortCond", */ T : 1 } ,
/*::[*/ 0x0215 /*::]*/ : { /* n:"BrtEndSortCond", */ T : - 1 } ,
/*::[*/ 0x0216 /*::]*/ : { /* n:"BrtBookProtection" */ } ,
/*::[*/ 0x0217 /*::]*/ : { /* n:"BrtSheetProtection" */ } ,
/*::[*/ 0x0218 /*::]*/ : { /* n:"BrtRangeProtection" */ } ,
/*::[*/ 0x0219 /*::]*/ : { /* n:"BrtPhoneticInfo" */ } ,
/*::[*/ 0x021A /*::]*/ : { /* n:"BrtBeginECTxtWiz", */ T : 1 } ,
/*::[*/ 0x021B /*::]*/ : { /* n:"BrtEndECTxtWiz", */ T : - 1 } ,
/*::[*/ 0x021C /*::]*/ : { /* n:"BrtBeginECTWFldInfoLst", */ T : 1 } ,
/*::[*/ 0x021D /*::]*/ : { /* n:"BrtEndECTWFldInfoLst", */ T : - 1 } ,
/*::[*/ 0x021E /*::]*/ : { /* n:"BrtBeginECTwFldInfo", */ T : 1 } ,
/*::[*/ 0x0224 /*::]*/ : { /* n:"BrtFileSharing" */ } ,
/*::[*/ 0x0225 /*::]*/ : { /* n:"BrtOleSize" */ } ,
/*::[*/ 0x0226 /*::]*/ : { /* n:"BrtDrawing", */ f : parse _RelID } ,
/*::[*/ 0x0227 /*::]*/ : { /* n:"BrtLegacyDrawing" */ } ,
/*::[*/ 0x0228 /*::]*/ : { /* n:"BrtLegacyDrawingHF" */ } ,
/*::[*/ 0x0229 /*::]*/ : { /* n:"BrtWebOpt" */ } ,
/*::[*/ 0x022A /*::]*/ : { /* n:"BrtBeginWebPubItems", */ T : 1 } ,
/*::[*/ 0x022B /*::]*/ : { /* n:"BrtEndWebPubItems", */ T : - 1 } ,
/*::[*/ 0x022C /*::]*/ : { /* n:"BrtBeginWebPubItem", */ T : 1 } ,
/*::[*/ 0x022D /*::]*/ : { /* n:"BrtEndWebPubItem", */ T : - 1 } ,
/*::[*/ 0x022E /*::]*/ : { /* n:"BrtBeginSXCondFmt", */ T : 1 } ,
/*::[*/ 0x022F /*::]*/ : { /* n:"BrtEndSXCondFmt", */ T : - 1 } ,
/*::[*/ 0x0230 /*::]*/ : { /* n:"BrtBeginSXCondFmts", */ T : 1 } ,
/*::[*/ 0x0231 /*::]*/ : { /* n:"BrtEndSXCondFmts", */ T : - 1 } ,
/*::[*/ 0x0232 /*::]*/ : { /* n:"BrtBkHim" */ } ,
/*::[*/ 0x0234 /*::]*/ : { /* n:"BrtColor" */ } ,
/*::[*/ 0x0235 /*::]*/ : { /* n:"BrtBeginIndexedColors", */ T : 1 } ,
/*::[*/ 0x0236 /*::]*/ : { /* n:"BrtEndIndexedColors", */ T : - 1 } ,
/*::[*/ 0x0239 /*::]*/ : { /* n:"BrtBeginMRUColors", */ T : 1 } ,
/*::[*/ 0x023A /*::]*/ : { /* n:"BrtEndMRUColors", */ T : - 1 } ,
/*::[*/ 0x023C /*::]*/ : { /* n:"BrtMRUColor" */ } ,
/*::[*/ 0x023D /*::]*/ : { /* n:"BrtBeginDVals", */ T : 1 } ,
/*::[*/ 0x023E /*::]*/ : { /* n:"BrtEndDVals", */ T : - 1 } ,
/*::[*/ 0x0241 /*::]*/ : { /* n:"BrtSupNameStart" */ } ,
/*::[*/ 0x0242 /*::]*/ : { /* n:"BrtSupNameValueStart" */ } ,
/*::[*/ 0x0243 /*::]*/ : { /* n:"BrtSupNameValueEnd" */ } ,
/*::[*/ 0x0244 /*::]*/ : { /* n:"BrtSupNameNum" */ } ,
/*::[*/ 0x0245 /*::]*/ : { /* n:"BrtSupNameErr" */ } ,
/*::[*/ 0x0246 /*::]*/ : { /* n:"BrtSupNameSt" */ } ,
/*::[*/ 0x0247 /*::]*/ : { /* n:"BrtSupNameNil" */ } ,
/*::[*/ 0x0248 /*::]*/ : { /* n:"BrtSupNameBool" */ } ,
/*::[*/ 0x0249 /*::]*/ : { /* n:"BrtSupNameFmla" */ } ,
/*::[*/ 0x024A /*::]*/ : { /* n:"BrtSupNameBits" */ } ,
/*::[*/ 0x024B /*::]*/ : { /* n:"BrtSupNameEnd" */ } ,
/*::[*/ 0x024C /*::]*/ : { /* n:"BrtEndSupBook", */ T : - 1 } ,
/*::[*/ 0x024D /*::]*/ : { /* n:"BrtCellSmartTagProperty" */ } ,
/*::[*/ 0x024E /*::]*/ : { /* n:"BrtBeginCellSmartTag", */ T : 1 } ,
/*::[*/ 0x024F /*::]*/ : { /* n:"BrtEndCellSmartTag", */ T : - 1 } ,
/*::[*/ 0x0250 /*::]*/ : { /* n:"BrtBeginCellSmartTags", */ T : 1 } ,
/*::[*/ 0x0251 /*::]*/ : { /* n:"BrtEndCellSmartTags", */ T : - 1 } ,
/*::[*/ 0x0252 /*::]*/ : { /* n:"BrtBeginSmartTags", */ T : 1 } ,
/*::[*/ 0x0253 /*::]*/ : { /* n:"BrtEndSmartTags", */ T : - 1 } ,
/*::[*/ 0x0254 /*::]*/ : { /* n:"BrtSmartTagType" */ } ,
/*::[*/ 0x0255 /*::]*/ : { /* n:"BrtBeginSmartTagTypes", */ T : 1 } ,
/*::[*/ 0x0256 /*::]*/ : { /* n:"BrtEndSmartTagTypes", */ T : - 1 } ,
/*::[*/ 0x0257 /*::]*/ : { /* n:"BrtBeginSXFilters", */ T : 1 } ,
/*::[*/ 0x0258 /*::]*/ : { /* n:"BrtEndSXFilters", */ T : - 1 } ,
/*::[*/ 0x0259 /*::]*/ : { /* n:"BrtBeginSXFILTER", */ T : 1 } ,
/*::[*/ 0x025A /*::]*/ : { /* n:"BrtEndSXFilter", */ T : - 1 } ,
/*::[*/ 0x025B /*::]*/ : { /* n:"BrtBeginFills", */ T : 1 } ,
/*::[*/ 0x025C /*::]*/ : { /* n:"BrtEndFills", */ T : - 1 } ,
/*::[*/ 0x025D /*::]*/ : { /* n:"BrtBeginCellWatches", */ T : 1 } ,
/*::[*/ 0x025E /*::]*/ : { /* n:"BrtEndCellWatches", */ T : - 1 } ,
/*::[*/ 0x025F /*::]*/ : { /* n:"BrtCellWatch" */ } ,
/*::[*/ 0x0260 /*::]*/ : { /* n:"BrtBeginCRErrs", */ T : 1 } ,
/*::[*/ 0x0261 /*::]*/ : { /* n:"BrtEndCRErrs", */ T : - 1 } ,
/*::[*/ 0x0262 /*::]*/ : { /* n:"BrtCrashRecErr" */ } ,
/*::[*/ 0x0263 /*::]*/ : { /* n:"BrtBeginFonts", */ T : 1 } ,
/*::[*/ 0x0264 /*::]*/ : { /* n:"BrtEndFonts", */ T : - 1 } ,
/*::[*/ 0x0265 /*::]*/ : { /* n:"BrtBeginBorders", */ T : 1 } ,
/*::[*/ 0x0266 /*::]*/ : { /* n:"BrtEndBorders", */ T : - 1 } ,
/*::[*/ 0x0267 /*::]*/ : { /* n:"BrtBeginFmts", */ T : 1 } ,
/*::[*/ 0x0268 /*::]*/ : { /* n:"BrtEndFmts", */ T : - 1 } ,
/*::[*/ 0x0269 /*::]*/ : { /* n:"BrtBeginCellXFs", */ T : 1 } ,
/*::[*/ 0x026A /*::]*/ : { /* n:"BrtEndCellXFs", */ T : - 1 } ,
/*::[*/ 0x026B /*::]*/ : { /* n:"BrtBeginStyles", */ T : 1 } ,
/*::[*/ 0x026C /*::]*/ : { /* n:"BrtEndStyles", */ T : - 1 } ,
/*::[*/ 0x0271 /*::]*/ : { /* n:"BrtBigName" */ } ,
/*::[*/ 0x0272 /*::]*/ : { /* n:"BrtBeginCellStyleXFs", */ T : 1 } ,
/*::[*/ 0x0273 /*::]*/ : { /* n:"BrtEndCellStyleXFs", */ T : - 1 } ,
/*::[*/ 0x0274 /*::]*/ : { /* n:"BrtBeginComments", */ T : 1 } ,
/*::[*/ 0x0275 /*::]*/ : { /* n:"BrtEndComments", */ T : - 1 } ,
/*::[*/ 0x0276 /*::]*/ : { /* n:"BrtBeginCommentAuthors", */ T : 1 } ,
/*::[*/ 0x0277 /*::]*/ : { /* n:"BrtEndCommentAuthors", */ T : - 1 } ,
/*::[*/ 0x0278 /*::]*/ : { /* n:"BrtCommentAuthor", */ f : parse _BrtCommentAuthor } ,
/*::[*/ 0x0279 /*::]*/ : { /* n:"BrtBeginCommentList", */ T : 1 } ,
/*::[*/ 0x027A /*::]*/ : { /* n:"BrtEndCommentList", */ T : - 1 } ,
/*::[*/ 0x027B /*::]*/ : { /* n:"BrtBeginComment", */ T : 1 , f : parse _BrtBeginComment } ,
/*::[*/ 0x027C /*::]*/ : { /* n:"BrtEndComment", */ T : - 1 } ,
/*::[*/ 0x027D /*::]*/ : { /* n:"BrtCommentText", */ f : parse _BrtCommentText } ,
/*::[*/ 0x027E /*::]*/ : { /* n:"BrtBeginOleObjects", */ T : 1 } ,
/*::[*/ 0x027F /*::]*/ : { /* n:"BrtOleObject" */ } ,
/*::[*/ 0x0280 /*::]*/ : { /* n:"BrtEndOleObjects", */ T : - 1 } ,
/*::[*/ 0x0281 /*::]*/ : { /* n:"BrtBeginSxrules", */ T : 1 } ,
/*::[*/ 0x0282 /*::]*/ : { /* n:"BrtEndSxRules", */ T : - 1 } ,
/*::[*/ 0x0283 /*::]*/ : { /* n:"BrtBeginActiveXControls", */ T : 1 } ,
/*::[*/ 0x0284 /*::]*/ : { /* n:"BrtActiveX" */ } ,
/*::[*/ 0x0285 /*::]*/ : { /* n:"BrtEndActiveXControls", */ T : - 1 } ,
/*::[*/ 0x0286 /*::]*/ : { /* n:"BrtBeginPCDSDTCEMembersSortBy", */ T : 1 } ,
/*::[*/ 0x0288 /*::]*/ : { /* n:"BrtBeginCellIgnoreECs", */ T : 1 } ,
/*::[*/ 0x0289 /*::]*/ : { /* n:"BrtCellIgnoreEC" */ } ,
/*::[*/ 0x028A /*::]*/ : { /* n:"BrtEndCellIgnoreECs", */ T : - 1 } ,
/*::[*/ 0x028B /*::]*/ : { /* n:"BrtCsProp", */ f : parse _BrtCsProp } ,
/*::[*/ 0x028C /*::]*/ : { /* n:"BrtCsPageSetup" */ } ,
/*::[*/ 0x028D /*::]*/ : { /* n:"BrtBeginUserCsViews", */ T : 1 } ,
/*::[*/ 0x028E /*::]*/ : { /* n:"BrtEndUserCsViews", */ T : - 1 } ,
/*::[*/ 0x028F /*::]*/ : { /* n:"BrtBeginUserCsView", */ T : 1 } ,
/*::[*/ 0x0290 /*::]*/ : { /* n:"BrtEndUserCsView", */ T : - 1 } ,
/*::[*/ 0x0291 /*::]*/ : { /* n:"BrtBeginPcdSFCIEntries", */ T : 1 } ,
/*::[*/ 0x0292 /*::]*/ : { /* n:"BrtEndPCDSFCIEntries", */ T : - 1 } ,
/*::[*/ 0x0293 /*::]*/ : { /* n:"BrtPCDSFCIEntry" */ } ,
/*::[*/ 0x0294 /*::]*/ : { /* n:"BrtBeginListParts", */ T : 1 } ,
/*::[*/ 0x0295 /*::]*/ : { /* n:"BrtListPart" */ } ,
/*::[*/ 0x0296 /*::]*/ : { /* n:"BrtEndListParts", */ T : - 1 } ,
/*::[*/ 0x0297 /*::]*/ : { /* n:"BrtSheetCalcProp" */ } ,
/*::[*/ 0x0298 /*::]*/ : { /* n:"BrtBeginFnGroup", */ T : 1 } ,
/*::[*/ 0x0299 /*::]*/ : { /* n:"BrtFnGroup" */ } ,
/*::[*/ 0x029A /*::]*/ : { /* n:"BrtEndFnGroup", */ T : - 1 } ,
/*::[*/ 0x029B /*::]*/ : { /* n:"BrtSupAddin" */ } ,
/*::[*/ 0x029C /*::]*/ : { /* n:"BrtSXTDMPOrder" */ } ,
/*::[*/ 0x029D /*::]*/ : { /* n:"BrtCsProtection" */ } ,
/*::[*/ 0x029F /*::]*/ : { /* n:"BrtBeginWsSortMap", */ T : 1 } ,
/*::[*/ 0x02A0 /*::]*/ : { /* n:"BrtEndWsSortMap", */ T : - 1 } ,
/*::[*/ 0x02A1 /*::]*/ : { /* n:"BrtBeginRRSort", */ T : 1 } ,
/*::[*/ 0x02A2 /*::]*/ : { /* n:"BrtEndRRSort", */ T : - 1 } ,
/*::[*/ 0x02A3 /*::]*/ : { /* n:"BrtRRSortItem" */ } ,
/*::[*/ 0x02A4 /*::]*/ : { /* n:"BrtFileSharingIso" */ } ,
/*::[*/ 0x02A5 /*::]*/ : { /* n:"BrtBookProtectionIso" */ } ,
/*::[*/ 0x02A6 /*::]*/ : { /* n:"BrtSheetProtectionIso" */ } ,
/*::[*/ 0x02A7 /*::]*/ : { /* n:"BrtCsProtectionIso" */ } ,
/*::[*/ 0x02A8 /*::]*/ : { /* n:"BrtRangeProtectionIso" */ } ,
/*::[*/ 0x02A9 /*::]*/ : { /* n:"BrtDValList" */ } ,
/*::[*/ 0x0400 /*::]*/ : { /* n:"BrtRwDescent" */ } ,
/*::[*/ 0x0401 /*::]*/ : { /* n:"BrtKnownFonts" */ } ,
/*::[*/ 0x0402 /*::]*/ : { /* n:"BrtBeginSXTupleSet", */ T : 1 } ,
/*::[*/ 0x0403 /*::]*/ : { /* n:"BrtEndSXTupleSet", */ T : - 1 } ,
/*::[*/ 0x0404 /*::]*/ : { /* n:"BrtBeginSXTupleSetHeader", */ T : 1 } ,
/*::[*/ 0x0405 /*::]*/ : { /* n:"BrtEndSXTupleSetHeader", */ T : - 1 } ,
/*::[*/ 0x0406 /*::]*/ : { /* n:"BrtSXTupleSetHeaderItem" */ } ,
/*::[*/ 0x0407 /*::]*/ : { /* n:"BrtBeginSXTupleSetData", */ T : 1 } ,
/*::[*/ 0x0408 /*::]*/ : { /* n:"BrtEndSXTupleSetData", */ T : - 1 } ,
/*::[*/ 0x0409 /*::]*/ : { /* n:"BrtBeginSXTupleSetRow", */ T : 1 } ,
/*::[*/ 0x040A /*::]*/ : { /* n:"BrtEndSXTupleSetRow", */ T : - 1 } ,
/*::[*/ 0x040B /*::]*/ : { /* n:"BrtSXTupleSetRowItem" */ } ,
/*::[*/ 0x040C /*::]*/ : { /* n:"BrtNameExt" */ } ,
/*::[*/ 0x040D /*::]*/ : { /* n:"BrtPCDH14" */ } ,
/*::[*/ 0x040E /*::]*/ : { /* n:"BrtBeginPCDCalcMem14", */ T : 1 } ,
/*::[*/ 0x040F /*::]*/ : { /* n:"BrtEndPCDCalcMem14", */ T : - 1 } ,
/*::[*/ 0x0410 /*::]*/ : { /* n:"BrtSXTH14" */ } ,
/*::[*/ 0x0411 /*::]*/ : { /* n:"BrtBeginSparklineGroup", */ T : 1 } ,
/*::[*/ 0x0412 /*::]*/ : { /* n:"BrtEndSparklineGroup", */ T : - 1 } ,
/*::[*/ 0x0413 /*::]*/ : { /* n:"BrtSparkline" */ } ,
/*::[*/ 0x0414 /*::]*/ : { /* n:"BrtSXDI14" */ } ,
/*::[*/ 0x0415 /*::]*/ : { /* n:"BrtWsFmtInfoEx14" */ } ,
/*::[*/ 0x0416 /*::]*/ : { /* n:"BrtBeginConditionalFormatting14", */ T : 1 } ,
/*::[*/ 0x0417 /*::]*/ : { /* n:"BrtEndConditionalFormatting14", */ T : - 1 } ,
/*::[*/ 0x0418 /*::]*/ : { /* n:"BrtBeginCFRule14", */ T : 1 } ,
/*::[*/ 0x0419 /*::]*/ : { /* n:"BrtEndCFRule14", */ T : - 1 } ,
/*::[*/ 0x041A /*::]*/ : { /* n:"BrtCFVO14" */ } ,
/*::[*/ 0x041B /*::]*/ : { /* n:"BrtBeginDatabar14", */ T : 1 } ,
/*::[*/ 0x041C /*::]*/ : { /* n:"BrtBeginIconSet14", */ T : 1 } ,
/*::[*/ 0x041D /*::]*/ : { /* n:"BrtDVal14", */ f : parse _BrtDVal14 } ,
/*::[*/ 0x041E /*::]*/ : { /* n:"BrtBeginDVals14", */ T : 1 } ,
/*::[*/ 0x041F /*::]*/ : { /* n:"BrtColor14" */ } ,
/*::[*/ 0x0420 /*::]*/ : { /* n:"BrtBeginSparklines", */ T : 1 } ,
/*::[*/ 0x0421 /*::]*/ : { /* n:"BrtEndSparklines", */ T : - 1 } ,
/*::[*/ 0x0422 /*::]*/ : { /* n:"BrtBeginSparklineGroups", */ T : 1 } ,
/*::[*/ 0x0423 /*::]*/ : { /* n:"BrtEndSparklineGroups", */ T : - 1 } ,
/*::[*/ 0x0425 /*::]*/ : { /* n:"BrtSXVD14" */ } ,
/*::[*/ 0x0426 /*::]*/ : { /* n:"BrtBeginSXView14", */ T : 1 } ,
/*::[*/ 0x0427 /*::]*/ : { /* n:"BrtEndSXView14", */ T : - 1 } ,
/*::[*/ 0x0428 /*::]*/ : { /* n:"BrtBeginSXView16", */ T : 1 } ,
/*::[*/ 0x0429 /*::]*/ : { /* n:"BrtEndSXView16", */ T : - 1 } ,
/*::[*/ 0x042A /*::]*/ : { /* n:"BrtBeginPCD14", */ T : 1 } ,
/*::[*/ 0x042B /*::]*/ : { /* n:"BrtEndPCD14", */ T : - 1 } ,
/*::[*/ 0x042C /*::]*/ : { /* n:"BrtBeginExtConn14", */ T : 1 } ,
/*::[*/ 0x042D /*::]*/ : { /* n:"BrtEndExtConn14", */ T : - 1 } ,
/*::[*/ 0x042E /*::]*/ : { /* n:"BrtBeginSlicerCacheIDs", */ T : 1 } ,
/*::[*/ 0x042F /*::]*/ : { /* n:"BrtEndSlicerCacheIDs", */ T : - 1 } ,
/*::[*/ 0x0430 /*::]*/ : { /* n:"BrtBeginSlicerCacheID", */ T : 1 } ,
/*::[*/ 0x0431 /*::]*/ : { /* n:"BrtEndSlicerCacheID", */ T : - 1 } ,
/*::[*/ 0x0433 /*::]*/ : { /* n:"BrtBeginSlicerCache", */ T : 1 } ,
/*::[*/ 0x0434 /*::]*/ : { /* n:"BrtEndSlicerCache", */ T : - 1 } ,
/*::[*/ 0x0435 /*::]*/ : { /* n:"BrtBeginSlicerCacheDef", */ T : 1 } ,
/*::[*/ 0x0436 /*::]*/ : { /* n:"BrtEndSlicerCacheDef", */ T : - 1 } ,
/*::[*/ 0x0437 /*::]*/ : { /* n:"BrtBeginSlicersEx", */ T : 1 } ,
/*::[*/ 0x0438 /*::]*/ : { /* n:"BrtEndSlicersEx", */ T : - 1 } ,
/*::[*/ 0x0439 /*::]*/ : { /* n:"BrtBeginSlicerEx", */ T : 1 } ,
/*::[*/ 0x043A /*::]*/ : { /* n:"BrtEndSlicerEx", */ T : - 1 } ,
/*::[*/ 0x043B /*::]*/ : { /* n:"BrtBeginSlicer", */ T : 1 } ,
/*::[*/ 0x043C /*::]*/ : { /* n:"BrtEndSlicer", */ T : - 1 } ,
/*::[*/ 0x043D /*::]*/ : { /* n:"BrtSlicerCachePivotTables" */ } ,
/*::[*/ 0x043E /*::]*/ : { /* n:"BrtBeginSlicerCacheOlapImpl", */ T : 1 } ,
/*::[*/ 0x043F /*::]*/ : { /* n:"BrtEndSlicerCacheOlapImpl", */ T : - 1 } ,
/*::[*/ 0x0440 /*::]*/ : { /* n:"BrtBeginSlicerCacheLevelsData", */ T : 1 } ,
/*::[*/ 0x0441 /*::]*/ : { /* n:"BrtEndSlicerCacheLevelsData", */ T : - 1 } ,
/*::[*/ 0x0442 /*::]*/ : { /* n:"BrtBeginSlicerCacheLevelData", */ T : 1 } ,
/*::[*/ 0x0443 /*::]*/ : { /* n:"BrtEndSlicerCacheLevelData", */ T : - 1 } ,
/*::[*/ 0x0444 /*::]*/ : { /* n:"BrtBeginSlicerCacheSiRanges", */ T : 1 } ,
/*::[*/ 0x0445 /*::]*/ : { /* n:"BrtEndSlicerCacheSiRanges", */ T : - 1 } ,
/*::[*/ 0x0446 /*::]*/ : { /* n:"BrtBeginSlicerCacheSiRange", */ T : 1 } ,
/*::[*/ 0x0447 /*::]*/ : { /* n:"BrtEndSlicerCacheSiRange", */ T : - 1 } ,
/*::[*/ 0x0448 /*::]*/ : { /* n:"BrtSlicerCacheOlapItem" */ } ,
/*::[*/ 0x0449 /*::]*/ : { /* n:"BrtBeginSlicerCacheSelections", */ T : 1 } ,
/*::[*/ 0x044A /*::]*/ : { /* n:"BrtSlicerCacheSelection" */ } ,
/*::[*/ 0x044B /*::]*/ : { /* n:"BrtEndSlicerCacheSelections", */ T : - 1 } ,
/*::[*/ 0x044C /*::]*/ : { /* n:"BrtBeginSlicerCacheNative", */ T : 1 } ,
/*::[*/ 0x044D /*::]*/ : { /* n:"BrtEndSlicerCacheNative", */ T : - 1 } ,
/*::[*/ 0x044E /*::]*/ : { /* n:"BrtSlicerCacheNativeItem" */ } ,
/*::[*/ 0x044F /*::]*/ : { /* n:"BrtRangeProtection14" */ } ,
/*::[*/ 0x0450 /*::]*/ : { /* n:"BrtRangeProtectionIso14" */ } ,
/*::[*/ 0x0451 /*::]*/ : { /* n:"BrtCellIgnoreEC14" */ } ,
/*::[*/ 0x0457 /*::]*/ : { /* n:"BrtList14" */ } ,
/*::[*/ 0x0458 /*::]*/ : { /* n:"BrtCFIcon" */ } ,
/*::[*/ 0x0459 /*::]*/ : { /* n:"BrtBeginSlicerCachesPivotCacheIDs", */ T : 1 } ,
/*::[*/ 0x045A /*::]*/ : { /* n:"BrtEndSlicerCachesPivotCacheIDs", */ T : - 1 } ,
/*::[*/ 0x045B /*::]*/ : { /* n:"BrtBeginSlicers", */ T : 1 } ,
/*::[*/ 0x045C /*::]*/ : { /* n:"BrtEndSlicers", */ T : - 1 } ,
/*::[*/ 0x045D /*::]*/ : { /* n:"BrtWbProp14" */ } ,
/*::[*/ 0x045E /*::]*/ : { /* n:"BrtBeginSXEdit", */ T : 1 } ,
/*::[*/ 0x045F /*::]*/ : { /* n:"BrtEndSXEdit", */ T : - 1 } ,
/*::[*/ 0x0460 /*::]*/ : { /* n:"BrtBeginSXEdits", */ T : 1 } ,
/*::[*/ 0x0461 /*::]*/ : { /* n:"BrtEndSXEdits", */ T : - 1 } ,
/*::[*/ 0x0462 /*::]*/ : { /* n:"BrtBeginSXChange", */ T : 1 } ,
/*::[*/ 0x0463 /*::]*/ : { /* n:"BrtEndSXChange", */ T : - 1 } ,
/*::[*/ 0x0464 /*::]*/ : { /* n:"BrtBeginSXChanges", */ T : 1 } ,
/*::[*/ 0x0465 /*::]*/ : { /* n:"BrtEndSXChanges", */ T : - 1 } ,
/*::[*/ 0x0466 /*::]*/ : { /* n:"BrtSXTupleItems" */ } ,
/*::[*/ 0x0468 /*::]*/ : { /* n:"BrtBeginSlicerStyle", */ T : 1 } ,
/*::[*/ 0x0469 /*::]*/ : { /* n:"BrtEndSlicerStyle", */ T : - 1 } ,
/*::[*/ 0x046A /*::]*/ : { /* n:"BrtSlicerStyleElement" */ } ,
/*::[*/ 0x046B /*::]*/ : { /* n:"BrtBeginStyleSheetExt14", */ T : 1 } ,
/*::[*/ 0x046C /*::]*/ : { /* n:"BrtEndStyleSheetExt14", */ T : - 1 } ,
/*::[*/ 0x046D /*::]*/ : { /* n:"BrtBeginSlicerCachesPivotCacheID", */ T : 1 } ,
/*::[*/ 0x046E /*::]*/ : { /* n:"BrtEndSlicerCachesPivotCacheID", */ T : - 1 } ,
/*::[*/ 0x046F /*::]*/ : { /* n:"BrtBeginConditionalFormattings", */ T : 1 } ,
/*::[*/ 0x0470 /*::]*/ : { /* n:"BrtEndConditionalFormattings", */ T : - 1 } ,
/*::[*/ 0x0471 /*::]*/ : { /* n:"BrtBeginPCDCalcMemExt", */ T : 1 } ,
/*::[*/ 0x0472 /*::]*/ : { /* n:"BrtEndPCDCalcMemExt", */ T : - 1 } ,
/*::[*/ 0x0473 /*::]*/ : { /* n:"BrtBeginPCDCalcMemsExt", */ T : 1 } ,
/*::[*/ 0x0474 /*::]*/ : { /* n:"BrtEndPCDCalcMemsExt", */ T : - 1 } ,
/*::[*/ 0x0475 /*::]*/ : { /* n:"BrtPCDField14" */ } ,
/*::[*/ 0x0476 /*::]*/ : { /* n:"BrtBeginSlicerStyles", */ T : 1 } ,
/*::[*/ 0x0477 /*::]*/ : { /* n:"BrtEndSlicerStyles", */ T : - 1 } ,
/*::[*/ 0x0478 /*::]*/ : { /* n:"BrtBeginSlicerStyleElements", */ T : 1 } ,
/*::[*/ 0x0479 /*::]*/ : { /* n:"BrtEndSlicerStyleElements", */ T : - 1 } ,
/*::[*/ 0x047A /*::]*/ : { /* n:"BrtCFRuleExt" */ } ,
/*::[*/ 0x047B /*::]*/ : { /* n:"BrtBeginSXCondFmt14", */ T : 1 } ,
/*::[*/ 0x047C /*::]*/ : { /* n:"BrtEndSXCondFmt14", */ T : - 1 } ,
/*::[*/ 0x047D /*::]*/ : { /* n:"BrtBeginSXCondFmts14", */ T : 1 } ,
/*::[*/ 0x047E /*::]*/ : { /* n:"BrtEndSXCondFmts14", */ T : - 1 } ,
/*::[*/ 0x0480 /*::]*/ : { /* n:"BrtBeginSortCond14", */ T : 1 } ,
/*::[*/ 0x0481 /*::]*/ : { /* n:"BrtEndSortCond14", */ T : - 1 } ,
/*::[*/ 0x0482 /*::]*/ : { /* n:"BrtEndDVals14", */ T : - 1 } ,
/*::[*/ 0x0483 /*::]*/ : { /* n:"BrtEndIconSet14", */ T : - 1 } ,
/*::[*/ 0x0484 /*::]*/ : { /* n:"BrtEndDatabar14", */ T : - 1 } ,
/*::[*/ 0x0485 /*::]*/ : { /* n:"BrtBeginColorScale14", */ T : 1 } ,
/*::[*/ 0x0486 /*::]*/ : { /* n:"BrtEndColorScale14", */ T : - 1 } ,
/*::[*/ 0x0487 /*::]*/ : { /* n:"BrtBeginSxrules14", */ T : 1 } ,
/*::[*/ 0x0488 /*::]*/ : { /* n:"BrtEndSxrules14", */ T : - 1 } ,
/*::[*/ 0x0489 /*::]*/ : { /* n:"BrtBeginPRule14", */ T : 1 } ,
/*::[*/ 0x048A /*::]*/ : { /* n:"BrtEndPRule14", */ T : - 1 } ,
/*::[*/ 0x048B /*::]*/ : { /* n:"BrtBeginPRFilters14", */ T : 1 } ,
/*::[*/ 0x048C /*::]*/ : { /* n:"BrtEndPRFilters14", */ T : - 1 } ,
/*::[*/ 0x048D /*::]*/ : { /* n:"BrtBeginPRFilter14", */ T : 1 } ,
/*::[*/ 0x048E /*::]*/ : { /* n:"BrtEndPRFilter14", */ T : - 1 } ,
/*::[*/ 0x048F /*::]*/ : { /* n:"BrtBeginPRFItem14", */ T : 1 } ,
/*::[*/ 0x0490 /*::]*/ : { /* n:"BrtEndPRFItem14", */ T : - 1 } ,
/*::[*/ 0x0491 /*::]*/ : { /* n:"BrtBeginCellIgnoreECs14", */ T : 1 } ,
/*::[*/ 0x0492 /*::]*/ : { /* n:"BrtEndCellIgnoreECs14", */ T : - 1 } ,
/*::[*/ 0x0493 /*::]*/ : { /* n:"BrtDxf14" */ } ,
/*::[*/ 0x0494 /*::]*/ : { /* n:"BrtBeginDxF14s", */ T : 1 } ,
/*::[*/ 0x0495 /*::]*/ : { /* n:"BrtEndDxf14s", */ T : - 1 } ,
/*::[*/ 0x0499 /*::]*/ : { /* n:"BrtFilter14" */ } ,
/*::[*/ 0x049A /*::]*/ : { /* n:"BrtBeginCustomFilters14", */ T : 1 } ,
/*::[*/ 0x049C /*::]*/ : { /* n:"BrtCustomFilter14" */ } ,
/*::[*/ 0x049D /*::]*/ : { /* n:"BrtIconFilter14" */ } ,
/*::[*/ 0x049E /*::]*/ : { /* n:"BrtPivotCacheConnectionName" */ } ,
/*::[*/ 0x0800 /*::]*/ : { /* n:"BrtBeginDecoupledPivotCacheIDs", */ T : 1 } ,
/*::[*/ 0x0801 /*::]*/ : { /* n:"BrtEndDecoupledPivotCacheIDs", */ T : - 1 } ,
/*::[*/ 0x0802 /*::]*/ : { /* n:"BrtDecoupledPivotCacheID" */ } ,
/*::[*/ 0x0803 /*::]*/ : { /* n:"BrtBeginPivotTableRefs", */ T : 1 } ,
/*::[*/ 0x0804 /*::]*/ : { /* n:"BrtEndPivotTableRefs", */ T : - 1 } ,
/*::[*/ 0x0805 /*::]*/ : { /* n:"BrtPivotTableRef" */ } ,
/*::[*/ 0x0806 /*::]*/ : { /* n:"BrtSlicerCacheBookPivotTables" */ } ,
/*::[*/ 0x0807 /*::]*/ : { /* n:"BrtBeginSxvcells", */ T : 1 } ,
/*::[*/ 0x0808 /*::]*/ : { /* n:"BrtEndSxvcells", */ T : - 1 } ,
/*::[*/ 0x0809 /*::]*/ : { /* n:"BrtBeginSxRow", */ T : 1 } ,
/*::[*/ 0x080A /*::]*/ : { /* n:"BrtEndSxRow", */ T : - 1 } ,
/*::[*/ 0x080C /*::]*/ : { /* n:"BrtPcdCalcMem15" */ } ,
/*::[*/ 0x0813 /*::]*/ : { /* n:"BrtQsi15" */ } ,
/*::[*/ 0x0814 /*::]*/ : { /* n:"BrtBeginWebExtensions", */ T : 1 } ,
/*::[*/ 0x0815 /*::]*/ : { /* n:"BrtEndWebExtensions", */ T : - 1 } ,
/*::[*/ 0x0816 /*::]*/ : { /* n:"BrtWebExtension" */ } ,
/*::[*/ 0x0817 /*::]*/ : { /* n:"BrtAbsPath15" */ } ,
/*::[*/ 0x0818 /*::]*/ : { /* n:"BrtBeginPivotTableUISettings", */ T : 1 } ,
/*::[*/ 0x0819 /*::]*/ : { /* n:"BrtEndPivotTableUISettings", */ T : - 1 } ,
/*::[*/ 0x081B /*::]*/ : { /* n:"BrtTableSlicerCacheIDs" */ } ,
/*::[*/ 0x081C /*::]*/ : { /* n:"BrtTableSlicerCacheID" */ } ,
/*::[*/ 0x081D /*::]*/ : { /* n:"BrtBeginTableSlicerCache", */ T : 1 } ,
/*::[*/ 0x081E /*::]*/ : { /* n:"BrtEndTableSlicerCache", */ T : - 1 } ,
/*::[*/ 0x081F /*::]*/ : { /* n:"BrtSxFilter15" */ } ,
/*::[*/ 0x0820 /*::]*/ : { /* n:"BrtBeginTimelineCachePivotCacheIDs", */ T : 1 } ,
/*::[*/ 0x0821 /*::]*/ : { /* n:"BrtEndTimelineCachePivotCacheIDs", */ T : - 1 } ,
/*::[*/ 0x0822 /*::]*/ : { /* n:"BrtTimelineCachePivotCacheID" */ } ,
/*::[*/ 0x0823 /*::]*/ : { /* n:"BrtBeginTimelineCacheIDs", */ T : 1 } ,
/*::[*/ 0x0824 /*::]*/ : { /* n:"BrtEndTimelineCacheIDs", */ T : - 1 } ,
/*::[*/ 0x0825 /*::]*/ : { /* n:"BrtBeginTimelineCacheID", */ T : 1 } ,
/*::[*/ 0x0826 /*::]*/ : { /* n:"BrtEndTimelineCacheID", */ T : - 1 } ,
/*::[*/ 0x0827 /*::]*/ : { /* n:"BrtBeginTimelinesEx", */ T : 1 } ,
/*::[*/ 0x0828 /*::]*/ : { /* n:"BrtEndTimelinesEx", */ T : - 1 } ,
/*::[*/ 0x0829 /*::]*/ : { /* n:"BrtBeginTimelineEx", */ T : 1 } ,
/*::[*/ 0x082A /*::]*/ : { /* n:"BrtEndTimelineEx", */ T : - 1 } ,
/*::[*/ 0x082B /*::]*/ : { /* n:"BrtWorkBookPr15" */ } ,
/*::[*/ 0x082C /*::]*/ : { /* n:"BrtPCDH15" */ } ,
/*::[*/ 0x082D /*::]*/ : { /* n:"BrtBeginTimelineStyle", */ T : 1 } ,
/*::[*/ 0x082E /*::]*/ : { /* n:"BrtEndTimelineStyle", */ T : - 1 } ,
/*::[*/ 0x082F /*::]*/ : { /* n:"BrtTimelineStyleElement" */ } ,
/*::[*/ 0x0830 /*::]*/ : { /* n:"BrtBeginTimelineStylesheetExt15", */ T : 1 } ,
/*::[*/ 0x0831 /*::]*/ : { /* n:"BrtEndTimelineStylesheetExt15", */ T : - 1 } ,
/*::[*/ 0x0832 /*::]*/ : { /* n:"BrtBeginTimelineStyles", */ T : 1 } ,
/*::[*/ 0x0833 /*::]*/ : { /* n:"BrtEndTimelineStyles", */ T : - 1 } ,
/*::[*/ 0x0834 /*::]*/ : { /* n:"BrtBeginTimelineStyleElements", */ T : 1 } ,
/*::[*/ 0x0835 /*::]*/ : { /* n:"BrtEndTimelineStyleElements", */ T : - 1 } ,
/*::[*/ 0x0836 /*::]*/ : { /* n:"BrtDxf15" */ } ,
/*::[*/ 0x0837 /*::]*/ : { /* n:"BrtBeginDxfs15", */ T : 1 } ,
/*::[*/ 0x0838 /*::]*/ : { /* n:"BrtEndDxfs15", */ T : - 1 } ,
/*::[*/ 0x0839 /*::]*/ : { /* n:"BrtSlicerCacheHideItemsWithNoData" */ } ,
/*::[*/ 0x083A /*::]*/ : { /* n:"BrtBeginItemUniqueNames", */ T : 1 } ,
/*::[*/ 0x083B /*::]*/ : { /* n:"BrtEndItemUniqueNames", */ T : - 1 } ,
/*::[*/ 0x083C /*::]*/ : { /* n:"BrtItemUniqueName" */ } ,
/*::[*/ 0x083D /*::]*/ : { /* n:"BrtBeginExtConn15", */ T : 1 } ,
/*::[*/ 0x083E /*::]*/ : { /* n:"BrtEndExtConn15", */ T : - 1 } ,
/*::[*/ 0x083F /*::]*/ : { /* n:"BrtBeginOledbPr15", */ T : 1 } ,
/*::[*/ 0x0840 /*::]*/ : { /* n:"BrtEndOledbPr15", */ T : - 1 } ,
/*::[*/ 0x0841 /*::]*/ : { /* n:"BrtBeginDataFeedPr15", */ T : 1 } ,
/*::[*/ 0x0842 /*::]*/ : { /* n:"BrtEndDataFeedPr15", */ T : - 1 } ,
/*::[*/ 0x0843 /*::]*/ : { /* n:"BrtTextPr15" */ } ,
/*::[*/ 0x0844 /*::]*/ : { /* n:"BrtRangePr15" */ } ,
/*::[*/ 0x0845 /*::]*/ : { /* n:"BrtDbCommand15" */ } ,
/*::[*/ 0x0846 /*::]*/ : { /* n:"BrtBeginDbTables15", */ T : 1 } ,
/*::[*/ 0x0847 /*::]*/ : { /* n:"BrtEndDbTables15", */ T : - 1 } ,
/*::[*/ 0x0848 /*::]*/ : { /* n:"BrtDbTable15" */ } ,
/*::[*/ 0x0849 /*::]*/ : { /* n:"BrtBeginDataModel", */ T : 1 } ,
/*::[*/ 0x084A /*::]*/ : { /* n:"BrtEndDataModel", */ T : - 1 } ,
/*::[*/ 0x084B /*::]*/ : { /* n:"BrtBeginModelTables", */ T : 1 } ,
/*::[*/ 0x084C /*::]*/ : { /* n:"BrtEndModelTables", */ T : - 1 } ,
/*::[*/ 0x084D /*::]*/ : { /* n:"BrtModelTable" */ } ,
/*::[*/ 0x084E /*::]*/ : { /* n:"BrtBeginModelRelationships", */ T : 1 } ,
/*::[*/ 0x084F /*::]*/ : { /* n:"BrtEndModelRelationships", */ T : - 1 } ,
/*::[*/ 0x0850 /*::]*/ : { /* n:"BrtModelRelationship" */ } ,
/*::[*/ 0x0851 /*::]*/ : { /* n:"BrtBeginECTxtWiz15", */ T : 1 } ,
/*::[*/ 0x0852 /*::]*/ : { /* n:"BrtEndECTxtWiz15", */ T : - 1 } ,
/*::[*/ 0x0853 /*::]*/ : { /* n:"BrtBeginECTWFldInfoLst15", */ T : 1 } ,
/*::[*/ 0x0854 /*::]*/ : { /* n:"BrtEndECTWFldInfoLst15", */ T : - 1 } ,
/*::[*/ 0x0855 /*::]*/ : { /* n:"BrtBeginECTWFldInfo15", */ T : 1 } ,
/*::[*/ 0x0856 /*::]*/ : { /* n:"BrtFieldListActiveItem" */ } ,
/*::[*/ 0x0857 /*::]*/ : { /* n:"BrtPivotCacheIdVersion" */ } ,
/*::[*/ 0x0858 /*::]*/ : { /* n:"BrtSXDI15" */ } ,
/*::[*/ 0x0859 /*::]*/ : { /* n:"BrtBeginModelTimeGroupings", */ T : 1 } ,
/*::[*/ 0x085A /*::]*/ : { /* n:"BrtEndModelTimeGroupings", */ T : - 1 } ,
/*::[*/ 0x085B /*::]*/ : { /* n:"BrtBeginModelTimeGrouping", */ T : 1 } ,
/*::[*/ 0x085C /*::]*/ : { /* n:"BrtEndModelTimeGrouping", */ T : - 1 } ,
/*::[*/ 0x085D /*::]*/ : { /* n:"BrtModelTimeGroupingCalcCol" */ } ,
/*::[*/ 0x0C00 /*::]*/ : { /* n:"BrtUid" */ } ,
/*::[*/ 0x0C01 /*::]*/ : { /* n:"BrtRevisionPtr" */ } ,
/*::[*/ 0x1000 /*::]*/ : { /* n:"BrtBeginDynamicArrayPr", */ T : 1 } ,
/*::[*/ 0x1001 /*::]*/ : { /* n:"BrtEndDynamicArrayPr", */ T : - 1 } ,
/*::[*/ 0x138A /*::]*/ : { /* n:"BrtBeginRichValueBlock", */ T : 1 } ,
/*::[*/ 0x138B /*::]*/ : { /* n:"BrtEndRichValueBlock", */ T : - 1 } ,
/*::[*/ 0x13D9 /*::]*/ : { /* n:"BrtBeginRichFilters", */ T : 1 } ,
/*::[*/ 0x13DA /*::]*/ : { /* n:"BrtEndRichFilters", */ T : - 1 } ,
/*::[*/ 0x13DB /*::]*/ : { /* n:"BrtRichFilter" */ } ,
/*::[*/ 0x13DC /*::]*/ : { /* n:"BrtBeginRichFilterColumn", */ T : 1 } ,
/*::[*/ 0x13DD /*::]*/ : { /* n:"BrtEndRichFilterColumn", */ T : - 1 } ,
/*::[*/ 0x13DE /*::]*/ : { /* n:"BrtBeginCustomRichFilters", */ T : 1 } ,
/*::[*/ 0x13DF /*::]*/ : { /* n:"BrtEndCustomRichFilters", */ T : - 1 } ,
/*::[*/ 0x13E0 /*::]*/ : { /* n:"BrtCustomRichFilter" */ } ,
/*::[*/ 0x13E1 /*::]*/ : { /* n:"BrtTop10RichFilter" */ } ,
/*::[*/ 0x13E2 /*::]*/ : { /* n:"BrtDynamicRichFilter" */ } ,
/*::[*/ 0x13E4 /*::]*/ : { /* n:"BrtBeginRichSortCondition", */ T : 1 } ,
/*::[*/ 0x13E5 /*::]*/ : { /* n:"BrtEndRichSortCondition", */ T : - 1 } ,
/*::[*/ 0x13E6 /*::]*/ : { /* n:"BrtRichFilterDateGroupItem" */ } ,
/*::[*/ 0x13E7 /*::]*/ : { /* n:"BrtBeginCalcFeatures", */ T : 1 } ,
/*::[*/ 0x13E8 /*::]*/ : { /* n:"BrtEndCalcFeatures", */ T : - 1 } ,
/*::[*/ 0x13E9 /*::]*/ : { /* n:"BrtCalcFeature" */ } ,
/*::[*/ 0x13EB /*::]*/ : { /* n:"BrtExternalLinksPr" */ } ,
2017-09-22 22:18:51 +00:00
/*::[*/ 0xFFFF /*::]*/ : { n : "" }
2017-02-03 20:50:45 +00:00
} ;
2021-11-14 04:38:00 +00:00
/* [MS-XLS] 2.3 Record Enumeration (and other sources) */
2017-02-03 20:50:45 +00:00
var XLSRecordEnum = {
2021-11-14 04:38:00 +00:00
/* [MS-XLS] 2.3 Record Enumeration 2021-08-17 */
2022-03-12 14:05:57 +00:00
/*::[*/ 0x0006 /*::]*/ : { /* n:"Formula", */ f : parse _Formula } ,
/*::[*/ 0x000a /*::]*/ : { /* n:"EOF", */ f : parsenoop2 } ,
/*::[*/ 0x000c /*::]*/ : { /* n:"CalcCount", */ f : parseuint16 } , //
/*::[*/ 0x000d /*::]*/ : { /* n:"CalcMode", */ f : parseuint16 } , //
/*::[*/ 0x000e /*::]*/ : { /* n:"CalcPrecision", */ f : parsebool } , //
/*::[*/ 0x000f /*::]*/ : { /* n:"CalcRefMode", */ f : parsebool } , //
/*::[*/ 0x0010 /*::]*/ : { /* n:"CalcDelta", */ f : parse _Xnum } , //
/*::[*/ 0x0011 /*::]*/ : { /* n:"CalcIter", */ f : parsebool } , //
/*::[*/ 0x0012 /*::]*/ : { /* n:"Protect", */ f : parsebool } ,
/*::[*/ 0x0013 /*::]*/ : { /* n:"Password", */ f : parseuint16 } ,
/*::[*/ 0x0014 /*::]*/ : { /* n:"Header", */ f : parse _XLHeaderFooter } ,
/*::[*/ 0x0015 /*::]*/ : { /* n:"Footer", */ f : parse _XLHeaderFooter } ,
/*::[*/ 0x0017 /*::]*/ : { /* n:"ExternSheet", */ f : parse _ExternSheet } ,
/*::[*/ 0x0018 /*::]*/ : { /* n:"Lbl", */ f : parse _Lbl } ,
/*::[*/ 0x0019 /*::]*/ : { /* n:"WinProtect", */ f : parsebool } ,
/*::[*/ 0x001a /*::]*/ : { /* n:"VerticalPageBreaks", */ } ,
/*::[*/ 0x001b /*::]*/ : { /* n:"HorizontalPageBreaks", */ } ,
/*::[*/ 0x001c /*::]*/ : { /* n:"Note", */ f : parse _Note } ,
/*::[*/ 0x001d /*::]*/ : { /* n:"Selection", */ } ,
/*::[*/ 0x0022 /*::]*/ : { /* n:"Date1904", */ f : parsebool } ,
/*::[*/ 0x0023 /*::]*/ : { /* n:"ExternName", */ f : parse _ExternName } ,
/*::[*/ 0x0026 /*::]*/ : { /* n:"LeftMargin", */ f : parse _Xnum } , // *
/*::[*/ 0x0027 /*::]*/ : { /* n:"RightMargin", */ f : parse _Xnum } , // *
/*::[*/ 0x0028 /*::]*/ : { /* n:"TopMargin", */ f : parse _Xnum } , // *
/*::[*/ 0x0029 /*::]*/ : { /* n:"BottomMargin", */ f : parse _Xnum } , // *
/*::[*/ 0x002a /*::]*/ : { /* n:"PrintRowCol", */ f : parsebool } ,
/*::[*/ 0x002b /*::]*/ : { /* n:"PrintGrid", */ f : parsebool } ,
/*::[*/ 0x002f /*::]*/ : { /* n:"FilePass", */ f : parse _FilePass } ,
/*::[*/ 0x0031 /*::]*/ : { /* n:"Font", */ f : parse _Font } ,
/*::[*/ 0x0033 /*::]*/ : { /* n:"PrintSize", */ f : parseuint16 } ,
/*::[*/ 0x003c /*::]*/ : { /* n:"Continue", */ } ,
/*::[*/ 0x003d /*::]*/ : { /* n:"Window1", */ f : parse _Window1 } ,
/*::[*/ 0x0040 /*::]*/ : { /* n:"Backup", */ f : parsebool } ,
/*::[*/ 0x0041 /*::]*/ : { /* n:"Pane", */ f : parse _Pane } ,
/*::[*/ 0x0042 /*::]*/ : { /* n:"CodePage", */ f : parseuint16 } ,
/*::[*/ 0x004d /*::]*/ : { /* n:"Pls", */ } ,
/*::[*/ 0x0050 /*::]*/ : { /* n:"DCon", */ } ,
/*::[*/ 0x0051 /*::]*/ : { /* n:"DConRef", */ } ,
/*::[*/ 0x0052 /*::]*/ : { /* n:"DConName", */ } ,
/*::[*/ 0x0055 /*::]*/ : { /* n:"DefColWidth", */ f : parseuint16 } ,
/*::[*/ 0x0059 /*::]*/ : { /* n:"XCT", */ } ,
/*::[*/ 0x005a /*::]*/ : { /* n:"CRN", */ } ,
/*::[*/ 0x005b /*::]*/ : { /* n:"FileSharing", */ } ,
/*::[*/ 0x005c /*::]*/ : { /* n:"WriteAccess", */ f : parse _WriteAccess } ,
/*::[*/ 0x005d /*::]*/ : { /* n:"Obj", */ f : parse _Obj } ,
/*::[*/ 0x005e /*::]*/ : { /* n:"Uncalced", */ } ,
/*::[*/ 0x005f /*::]*/ : { /* n:"CalcSaveRecalc", */ f : parsebool } , //
/*::[*/ 0x0060 /*::]*/ : { /* n:"Template", */ } ,
/*::[*/ 0x0061 /*::]*/ : { /* n:"Intl", */ } ,
/*::[*/ 0x0063 /*::]*/ : { /* n:"ObjProtect", */ f : parsebool } ,
/*::[*/ 0x007d /*::]*/ : { /* n:"ColInfo", */ f : parse _ColInfo } ,
/*::[*/ 0x0080 /*::]*/ : { /* n:"Guts", */ f : parse _Guts } ,
/*::[*/ 0x0081 /*::]*/ : { /* n:"WsBool", */ f : parse _WsBool } ,
/*::[*/ 0x0082 /*::]*/ : { /* n:"GridSet", */ f : parseuint16 } ,
/*::[*/ 0x0083 /*::]*/ : { /* n:"HCenter", */ f : parsebool } ,
/*::[*/ 0x0084 /*::]*/ : { /* n:"VCenter", */ f : parsebool } ,
/*::[*/ 0x0085 /*::]*/ : { /* n:"BoundSheet8", */ f : parse _BoundSheet8 } ,
/*::[*/ 0x0086 /*::]*/ : { /* n:"WriteProtect", */ } ,
/*::[*/ 0x008c /*::]*/ : { /* n:"Country", */ f : parse _Country } ,
/*::[*/ 0x008d /*::]*/ : { /* n:"HideObj", */ f : parseuint16 } ,
/*::[*/ 0x0090 /*::]*/ : { /* n:"Sort", */ } ,
/*::[*/ 0x0092 /*::]*/ : { /* n:"Palette", */ f : parse _Palette } ,
/*::[*/ 0x0097 /*::]*/ : { /* n:"Sync", */ } ,
/*::[*/ 0x0098 /*::]*/ : { /* n:"LPr", */ } ,
/*::[*/ 0x0099 /*::]*/ : { /* n:"DxGCol", */ } ,
/*::[*/ 0x009a /*::]*/ : { /* n:"FnGroupName", */ } ,
/*::[*/ 0x009b /*::]*/ : { /* n:"FilterMode", */ } ,
/*::[*/ 0x009c /*::]*/ : { /* n:"BuiltInFnGroupCount", */ f : parseuint16 } ,
/*::[*/ 0x009d /*::]*/ : { /* n:"AutoFilterInfo", */ } ,
/*::[*/ 0x009e /*::]*/ : { /* n:"AutoFilter", */ } ,
/*::[*/ 0x00a0 /*::]*/ : { /* n:"Scl", */ f : parse _Scl } ,
/*::[*/ 0x00a1 /*::]*/ : { /* n:"Setup", */ f : parse _Setup } ,
/*::[*/ 0x00ae /*::]*/ : { /* n:"ScenMan", */ } ,
/*::[*/ 0x00af /*::]*/ : { /* n:"SCENARIO", */ } ,
/*::[*/ 0x00b0 /*::]*/ : { /* n:"SxView", */ } ,
/*::[*/ 0x00b1 /*::]*/ : { /* n:"Sxvd", */ } ,
/*::[*/ 0x00b2 /*::]*/ : { /* n:"SXVI", */ } ,
/*::[*/ 0x00b4 /*::]*/ : { /* n:"SxIvd", */ } ,
/*::[*/ 0x00b5 /*::]*/ : { /* n:"SXLI", */ } ,
/*::[*/ 0x00b6 /*::]*/ : { /* n:"SXPI", */ } ,
/*::[*/ 0x00b8 /*::]*/ : { /* n:"DocRoute", */ } ,
/*::[*/ 0x00b9 /*::]*/ : { /* n:"RecipName", */ } ,
/*::[*/ 0x00bd /*::]*/ : { /* n:"MulRk", */ f : parse _MulRk } ,
/*::[*/ 0x00be /*::]*/ : { /* n:"MulBlank", */ f : parse _MulBlank } ,
/*::[*/ 0x00c1 /*::]*/ : { /* n:"Mms", */ f : parsenoop2 } ,
/*::[*/ 0x00c5 /*::]*/ : { /* n:"SXDI", */ } ,
/*::[*/ 0x00c6 /*::]*/ : { /* n:"SXDB", */ } ,
/*::[*/ 0x00c7 /*::]*/ : { /* n:"SXFDB", */ } ,
/*::[*/ 0x00c8 /*::]*/ : { /* n:"SXDBB", */ } ,
/*::[*/ 0x00c9 /*::]*/ : { /* n:"SXNum", */ } ,
/*::[*/ 0x00ca /*::]*/ : { /* n:"SxBool", */ f : parsebool } ,
/*::[*/ 0x00cb /*::]*/ : { /* n:"SxErr", */ } ,
/*::[*/ 0x00cc /*::]*/ : { /* n:"SXInt", */ } ,
/*::[*/ 0x00cd /*::]*/ : { /* n:"SXString", */ } ,
/*::[*/ 0x00ce /*::]*/ : { /* n:"SXDtr", */ } ,
/*::[*/ 0x00cf /*::]*/ : { /* n:"SxNil", */ } ,
/*::[*/ 0x00d0 /*::]*/ : { /* n:"SXTbl", */ } ,
/*::[*/ 0x00d1 /*::]*/ : { /* n:"SXTBRGIITM", */ } ,
/*::[*/ 0x00d2 /*::]*/ : { /* n:"SxTbpg", */ } ,
/*::[*/ 0x00d3 /*::]*/ : { /* n:"ObProj", */ } ,
/*::[*/ 0x00d5 /*::]*/ : { /* n:"SXStreamID", */ } ,
/*::[*/ 0x00d7 /*::]*/ : { /* n:"DBCell", */ } ,
/*::[*/ 0x00d8 /*::]*/ : { /* n:"SXRng", */ } ,
/*::[*/ 0x00d9 /*::]*/ : { /* n:"SxIsxoper", */ } ,
/*::[*/ 0x00da /*::]*/ : { /* n:"BookBool", */ f : parseuint16 } ,
/*::[*/ 0x00dc /*::]*/ : { /* n:"DbOrParamQry", */ } ,
/*::[*/ 0x00dd /*::]*/ : { /* n:"ScenarioProtect", */ f : parsebool } ,
/*::[*/ 0x00de /*::]*/ : { /* n:"OleObjectSize", */ } ,
/*::[*/ 0x00e0 /*::]*/ : { /* n:"XF", */ f : parse _XF } ,
/*::[*/ 0x00e1 /*::]*/ : { /* n:"InterfaceHdr", */ f : parse _InterfaceHdr } ,
/*::[*/ 0x00e2 /*::]*/ : { /* n:"InterfaceEnd", */ f : parsenoop2 } ,
/*::[*/ 0x00e3 /*::]*/ : { /* n:"SXVS", */ } ,
/*::[*/ 0x00e5 /*::]*/ : { /* n:"MergeCells", */ f : parse _MergeCells } ,
/*::[*/ 0x00e9 /*::]*/ : { /* n:"BkHim", */ } ,
/*::[*/ 0x00eb /*::]*/ : { /* n:"MsoDrawingGroup", */ } ,
/*::[*/ 0x00ec /*::]*/ : { /* n:"MsoDrawing", */ } ,
/*::[*/ 0x00ed /*::]*/ : { /* n:"MsoDrawingSelection", */ } ,
/*::[*/ 0x00ef /*::]*/ : { /* n:"PhoneticInfo", */ } ,
/*::[*/ 0x00f0 /*::]*/ : { /* n:"SxRule", */ } ,
/*::[*/ 0x00f1 /*::]*/ : { /* n:"SXEx", */ } ,
/*::[*/ 0x00f2 /*::]*/ : { /* n:"SxFilt", */ } ,
/*::[*/ 0x00f4 /*::]*/ : { /* n:"SxDXF", */ } ,
/*::[*/ 0x00f5 /*::]*/ : { /* n:"SxItm", */ } ,
/*::[*/ 0x00f6 /*::]*/ : { /* n:"SxName", */ } ,
/*::[*/ 0x00f7 /*::]*/ : { /* n:"SxSelect", */ } ,
/*::[*/ 0x00f8 /*::]*/ : { /* n:"SXPair", */ } ,
/*::[*/ 0x00f9 /*::]*/ : { /* n:"SxFmla", */ } ,
/*::[*/ 0x00fb /*::]*/ : { /* n:"SxFormat", */ } ,
/*::[*/ 0x00fc /*::]*/ : { /* n:"SST", */ f : parse _SST } ,
/*::[*/ 0x00fd /*::]*/ : { /* n:"LabelSst", */ f : parse _LabelSst } ,
/*::[*/ 0x00ff /*::]*/ : { /* n:"ExtSST", */ f : parse _ExtSST } ,
/*::[*/ 0x0100 /*::]*/ : { /* n:"SXVDEx", */ } ,
/*::[*/ 0x0103 /*::]*/ : { /* n:"SXFormula", */ } ,
/*::[*/ 0x0122 /*::]*/ : { /* n:"SXDBEx", */ } ,
/*::[*/ 0x0137 /*::]*/ : { /* n:"RRDInsDel", */ } ,
/*::[*/ 0x0138 /*::]*/ : { /* n:"RRDHead", */ } ,
/*::[*/ 0x013b /*::]*/ : { /* n:"RRDChgCell", */ } ,
/*::[*/ 0x013d /*::]*/ : { /* n:"RRTabId", */ f : parseuint16a } ,
/*::[*/ 0x013e /*::]*/ : { /* n:"RRDRenSheet", */ } ,
/*::[*/ 0x013f /*::]*/ : { /* n:"RRSort", */ } ,
/*::[*/ 0x0140 /*::]*/ : { /* n:"RRDMove", */ } ,
/*::[*/ 0x014a /*::]*/ : { /* n:"RRFormat", */ } ,
/*::[*/ 0x014b /*::]*/ : { /* n:"RRAutoFmt", */ } ,
/*::[*/ 0x014d /*::]*/ : { /* n:"RRInsertSh", */ } ,
/*::[*/ 0x014e /*::]*/ : { /* n:"RRDMoveBegin", */ } ,
/*::[*/ 0x014f /*::]*/ : { /* n:"RRDMoveEnd", */ } ,
/*::[*/ 0x0150 /*::]*/ : { /* n:"RRDInsDelBegin", */ } ,
/*::[*/ 0x0151 /*::]*/ : { /* n:"RRDInsDelEnd", */ } ,
/*::[*/ 0x0152 /*::]*/ : { /* n:"RRDConflict", */ } ,
/*::[*/ 0x0153 /*::]*/ : { /* n:"RRDDefName", */ } ,
/*::[*/ 0x0154 /*::]*/ : { /* n:"RRDRstEtxp", */ } ,
/*::[*/ 0x015f /*::]*/ : { /* n:"LRng", */ } ,
/*::[*/ 0x0160 /*::]*/ : { /* n:"UsesELFs", */ f : parsebool } ,
/*::[*/ 0x0161 /*::]*/ : { /* n:"DSF", */ f : parsenoop2 } ,
/*::[*/ 0x0191 /*::]*/ : { /* n:"CUsr", */ } ,
/*::[*/ 0x0192 /*::]*/ : { /* n:"CbUsr", */ } ,
/*::[*/ 0x0193 /*::]*/ : { /* n:"UsrInfo", */ } ,
/*::[*/ 0x0194 /*::]*/ : { /* n:"UsrExcl", */ } ,
/*::[*/ 0x0195 /*::]*/ : { /* n:"FileLock", */ } ,
/*::[*/ 0x0196 /*::]*/ : { /* n:"RRDInfo", */ } ,
/*::[*/ 0x0197 /*::]*/ : { /* n:"BCUsrs", */ } ,
/*::[*/ 0x0198 /*::]*/ : { /* n:"UsrChk", */ } ,
/*::[*/ 0x01a9 /*::]*/ : { /* n:"UserBView", */ } ,
/*::[*/ 0x01aa /*::]*/ : { /* n:"UserSViewBegin", */ } ,
/*::[*/ 0x01ab /*::]*/ : { /* n:"UserSViewEnd", */ } ,
/*::[*/ 0x01ac /*::]*/ : { /* n:"RRDUserView", */ } ,
/*::[*/ 0x01ad /*::]*/ : { /* n:"Qsi", */ } ,
/*::[*/ 0x01ae /*::]*/ : { /* n:"SupBook", */ f : parse _SupBook } ,
/*::[*/ 0x01af /*::]*/ : { /* n:"Prot4Rev", */ f : parsebool } ,
/*::[*/ 0x01b0 /*::]*/ : { /* n:"CondFmt", */ } ,
/*::[*/ 0x01b1 /*::]*/ : { /* n:"CF", */ } ,
/*::[*/ 0x01b2 /*::]*/ : { /* n:"DVal", */ } ,
/*::[*/ 0x01b5 /*::]*/ : { /* n:"DConBin", */ } ,
/*::[*/ 0x01b6 /*::]*/ : { /* n:"TxO", */ f : parse _TxO } ,
/*::[*/ 0x01b7 /*::]*/ : { /* n:"RefreshAll", */ f : parsebool } , //
/*::[*/ 0x01b8 /*::]*/ : { /* n:"HLink", */ f : parse _HLink } ,
/*::[*/ 0x01b9 /*::]*/ : { /* n:"Lel", */ } ,
/*::[*/ 0x01ba /*::]*/ : { /* n:"CodeName", */ f : parse _XLUnicodeString } ,
/*::[*/ 0x01bb /*::]*/ : { /* n:"SXFDBType", */ } ,
/*::[*/ 0x01bc /*::]*/ : { /* n:"Prot4RevPass", */ f : parseuint16 } ,
/*::[*/ 0x01bd /*::]*/ : { /* n:"ObNoMacros", */ } ,
/*::[*/ 0x01be /*::]*/ : { /* n:"Dv", */ } ,
/*::[*/ 0x01c0 /*::]*/ : { /* n:"Excel9File", */ f : parsenoop2 } ,
/*::[*/ 0x01c1 /*::]*/ : { /* n:"RecalcId", */ f : parse _RecalcId , r : 2 } ,
/*::[*/ 0x01c2 /*::]*/ : { /* n:"EntExU2", */ f : parsenoop2 } ,
/*::[*/ 0x0200 /*::]*/ : { /* n:"Dimensions", */ f : parse _Dimensions } ,
/*::[*/ 0x0201 /*::]*/ : { /* n:"Blank", */ f : parse _Blank } ,
/*::[*/ 0x0203 /*::]*/ : { /* n:"Number", */ f : parse _Number } ,
/*::[*/ 0x0204 /*::]*/ : { /* n:"Label", */ f : parse _Label } ,
/*::[*/ 0x0205 /*::]*/ : { /* n:"BoolErr", */ f : parse _BoolErr } ,
/*::[*/ 0x0207 /*::]*/ : { /* n:"String", */ f : parse _String } ,
/*::[*/ 0x0208 /*::]*/ : { /* n:"Row", */ f : parse _Row } ,
/*::[*/ 0x020b /*::]*/ : { /* n:"Index", */ } ,
/*::[*/ 0x0221 /*::]*/ : { /* n:"Array", */ f : parse _Array } ,
/*::[*/ 0x0225 /*::]*/ : { /* n:"DefaultRowHeight", */ f : parse _DefaultRowHeight } ,
/*::[*/ 0x0236 /*::]*/ : { /* n:"Table", */ } ,
/*::[*/ 0x023e /*::]*/ : { /* n:"Window2", */ f : parse _Window2 } ,
/*::[*/ 0x027e /*::]*/ : { /* n:"RK", */ f : parse _RK } ,
/*::[*/ 0x0293 /*::]*/ : { /* n:"Style", */ } ,
/*::[*/ 0x0418 /*::]*/ : { /* n:"BigName", */ } ,
/*::[*/ 0x041e /*::]*/ : { /* n:"Format", */ f : parse _Format } ,
/*::[*/ 0x043c /*::]*/ : { /* n:"ContinueBigName", */ } ,
/*::[*/ 0x04bc /*::]*/ : { /* n:"ShrFmla", */ f : parse _ShrFmla } ,
/*::[*/ 0x0800 /*::]*/ : { /* n:"HLinkTooltip", */ f : parse _HLinkTooltip } ,
/*::[*/ 0x0801 /*::]*/ : { /* n:"WebPub", */ } ,
/*::[*/ 0x0802 /*::]*/ : { /* n:"QsiSXTag", */ } ,
/*::[*/ 0x0803 /*::]*/ : { /* n:"DBQueryExt", */ } ,
/*::[*/ 0x0804 /*::]*/ : { /* n:"ExtString", */ } ,
/*::[*/ 0x0805 /*::]*/ : { /* n:"TxtQry", */ } ,
/*::[*/ 0x0806 /*::]*/ : { /* n:"Qsir", */ } ,
/*::[*/ 0x0807 /*::]*/ : { /* n:"Qsif", */ } ,
/*::[*/ 0x0808 /*::]*/ : { /* n:"RRDTQSIF", */ } ,
/*::[*/ 0x0809 /*::]*/ : { /* n:"BOF", */ f : parse _BOF } ,
/*::[*/ 0x080a /*::]*/ : { /* n:"OleDbConn", */ } ,
/*::[*/ 0x080b /*::]*/ : { /* n:"WOpt", */ } ,
/*::[*/ 0x080c /*::]*/ : { /* n:"SXViewEx", */ } ,
/*::[*/ 0x080d /*::]*/ : { /* n:"SXTH", */ } ,
/*::[*/ 0x080e /*::]*/ : { /* n:"SXPIEx", */ } ,
/*::[*/ 0x080f /*::]*/ : { /* n:"SXVDTEx", */ } ,
/*::[*/ 0x0810 /*::]*/ : { /* n:"SXViewEx9", */ } ,
/*::[*/ 0x0812 /*::]*/ : { /* n:"ContinueFrt", */ } ,
/*::[*/ 0x0813 /*::]*/ : { /* n:"RealTimeData", */ } ,
/*::[*/ 0x0850 /*::]*/ : { /* n:"ChartFrtInfo", */ } ,
/*::[*/ 0x0851 /*::]*/ : { /* n:"FrtWrapper", */ } ,
/*::[*/ 0x0852 /*::]*/ : { /* n:"StartBlock", */ } ,
/*::[*/ 0x0853 /*::]*/ : { /* n:"EndBlock", */ } ,
/*::[*/ 0x0854 /*::]*/ : { /* n:"StartObject", */ } ,
/*::[*/ 0x0855 /*::]*/ : { /* n:"EndObject", */ } ,
/*::[*/ 0x0856 /*::]*/ : { /* n:"CatLab", */ } ,
/*::[*/ 0x0857 /*::]*/ : { /* n:"YMult", */ } ,
/*::[*/ 0x0858 /*::]*/ : { /* n:"SXViewLink", */ } ,
/*::[*/ 0x0859 /*::]*/ : { /* n:"PivotChartBits", */ } ,
/*::[*/ 0x085a /*::]*/ : { /* n:"FrtFontList", */ } ,
/*::[*/ 0x0862 /*::]*/ : { /* n:"SheetExt", */ } ,
/*::[*/ 0x0863 /*::]*/ : { /* n:"BookExt", */ r : 12 } ,
/*::[*/ 0x0864 /*::]*/ : { /* n:"SXAddl", */ } ,
/*::[*/ 0x0865 /*::]*/ : { /* n:"CrErr", */ } ,
/*::[*/ 0x0866 /*::]*/ : { /* n:"HFPicture", */ } ,
/*::[*/ 0x0867 /*::]*/ : { /* n:"FeatHdr", */ f : parsenoop2 } ,
/*::[*/ 0x0868 /*::]*/ : { /* n:"Feat", */ } ,
/*::[*/ 0x086a /*::]*/ : { /* n:"DataLabExt", */ } ,
/*::[*/ 0x086b /*::]*/ : { /* n:"DataLabExtContents", */ } ,
/*::[*/ 0x086c /*::]*/ : { /* n:"CellWatch", */ } ,
/*::[*/ 0x0871 /*::]*/ : { /* n:"FeatHdr11", */ } ,
/*::[*/ 0x0872 /*::]*/ : { /* n:"Feature11", */ } ,
/*::[*/ 0x0874 /*::]*/ : { /* n:"DropDownObjIds", */ } ,
/*::[*/ 0x0875 /*::]*/ : { /* n:"ContinueFrt11", */ } ,
/*::[*/ 0x0876 /*::]*/ : { /* n:"DConn", */ } ,
/*::[*/ 0x0877 /*::]*/ : { /* n:"List12", */ } ,
/*::[*/ 0x0878 /*::]*/ : { /* n:"Feature12", */ } ,
/*::[*/ 0x0879 /*::]*/ : { /* n:"CondFmt12", */ } ,
/*::[*/ 0x087a /*::]*/ : { /* n:"CF12", */ } ,
/*::[*/ 0x087b /*::]*/ : { /* n:"CFEx", */ } ,
/*::[*/ 0x087c /*::]*/ : { /* n:"XFCRC", */ f : parse _XFCRC , r : 12 } ,
/*::[*/ 0x087d /*::]*/ : { /* n:"XFExt", */ f : parse _XFExt , r : 12 } ,
/*::[*/ 0x087e /*::]*/ : { /* n:"AutoFilter12", */ } ,
/*::[*/ 0x087f /*::]*/ : { /* n:"ContinueFrt12", */ } ,
/*::[*/ 0x0884 /*::]*/ : { /* n:"MDTInfo", */ } ,
/*::[*/ 0x0885 /*::]*/ : { /* n:"MDXStr", */ } ,
/*::[*/ 0x0886 /*::]*/ : { /* n:"MDXTuple", */ } ,
/*::[*/ 0x0887 /*::]*/ : { /* n:"MDXSet", */ } ,
/*::[*/ 0x0888 /*::]*/ : { /* n:"MDXProp", */ } ,
/*::[*/ 0x0889 /*::]*/ : { /* n:"MDXKPI", */ } ,
/*::[*/ 0x088a /*::]*/ : { /* n:"MDB", */ } ,
/*::[*/ 0x088b /*::]*/ : { /* n:"PLV", */ } ,
/*::[*/ 0x088c /*::]*/ : { /* n:"Compat12", */ f : parsebool , r : 12 } ,
/*::[*/ 0x088d /*::]*/ : { /* n:"DXF", */ } ,
/*::[*/ 0x088e /*::]*/ : { /* n:"TableStyles", */ r : 12 } ,
/*::[*/ 0x088f /*::]*/ : { /* n:"TableStyle", */ } ,
/*::[*/ 0x0890 /*::]*/ : { /* n:"TableStyleElement", */ } ,
/*::[*/ 0x0892 /*::]*/ : { /* n:"StyleExt", */ } ,
/*::[*/ 0x0893 /*::]*/ : { /* n:"NamePublish", */ } ,
/*::[*/ 0x0894 /*::]*/ : { /* n:"NameCmt", */ f : parse _NameCmt , r : 12 } ,
/*::[*/ 0x0895 /*::]*/ : { /* n:"SortData", */ } ,
/*::[*/ 0x0896 /*::]*/ : { /* n:"Theme", */ f : parse _Theme , r : 12 } ,
/*::[*/ 0x0897 /*::]*/ : { /* n:"GUIDTypeLib", */ } ,
/*::[*/ 0x0898 /*::]*/ : { /* n:"FnGrp12", */ } ,
/*::[*/ 0x0899 /*::]*/ : { /* n:"NameFnGrp12", */ } ,
/*::[*/ 0x089a /*::]*/ : { /* n:"MTRSettings", */ f : parse _MTRSettings , r : 12 } ,
/*::[*/ 0x089b /*::]*/ : { /* n:"CompressPictures", */ f : parsenoop2 } ,
/*::[*/ 0x089c /*::]*/ : { /* n:"HeaderFooter", */ } ,
/*::[*/ 0x089d /*::]*/ : { /* n:"CrtLayout12", */ } ,
/*::[*/ 0x089e /*::]*/ : { /* n:"CrtMlFrt", */ } ,
/*::[*/ 0x089f /*::]*/ : { /* n:"CrtMlFrtContinue", */ } ,
/*::[*/ 0x08a3 /*::]*/ : { /* n:"ForceFullCalculation", */ f : parse _ForceFullCalculation } ,
/*::[*/ 0x08a4 /*::]*/ : { /* n:"ShapePropsStream", */ } ,
/*::[*/ 0x08a5 /*::]*/ : { /* n:"TextPropsStream", */ } ,
/*::[*/ 0x08a6 /*::]*/ : { /* n:"RichTextStream", */ } ,
/*::[*/ 0x08a7 /*::]*/ : { /* n:"CrtLayout12A", */ } ,
/*::[*/ 0x1001 /*::]*/ : { /* n:"Units", */ } ,
/*::[*/ 0x1002 /*::]*/ : { /* n:"Chart", */ } ,
/*::[*/ 0x1003 /*::]*/ : { /* n:"Series", */ } ,
/*::[*/ 0x1006 /*::]*/ : { /* n:"DataFormat", */ } ,
/*::[*/ 0x1007 /*::]*/ : { /* n:"LineFormat", */ } ,
/*::[*/ 0x1009 /*::]*/ : { /* n:"MarkerFormat", */ } ,
/*::[*/ 0x100a /*::]*/ : { /* n:"AreaFormat", */ } ,
/*::[*/ 0x100b /*::]*/ : { /* n:"PieFormat", */ } ,
/*::[*/ 0x100c /*::]*/ : { /* n:"AttachedLabel", */ } ,
/*::[*/ 0x100d /*::]*/ : { /* n:"SeriesText", */ } ,
/*::[*/ 0x1014 /*::]*/ : { /* n:"ChartFormat", */ } ,
/*::[*/ 0x1015 /*::]*/ : { /* n:"Legend", */ } ,
/*::[*/ 0x1016 /*::]*/ : { /* n:"SeriesList", */ } ,
/*::[*/ 0x1017 /*::]*/ : { /* n:"Bar", */ } ,
/*::[*/ 0x1018 /*::]*/ : { /* n:"Line", */ } ,
/*::[*/ 0x1019 /*::]*/ : { /* n:"Pie", */ } ,
/*::[*/ 0x101a /*::]*/ : { /* n:"Area", */ } ,
/*::[*/ 0x101b /*::]*/ : { /* n:"Scatter", */ } ,
/*::[*/ 0x101c /*::]*/ : { /* n:"CrtLine", */ } ,
/*::[*/ 0x101d /*::]*/ : { /* n:"Axis", */ } ,
/*::[*/ 0x101e /*::]*/ : { /* n:"Tick", */ } ,
/*::[*/ 0x101f /*::]*/ : { /* n:"ValueRange", */ } ,
/*::[*/ 0x1020 /*::]*/ : { /* n:"CatSerRange", */ } ,
/*::[*/ 0x1021 /*::]*/ : { /* n:"AxisLine", */ } ,
/*::[*/ 0x1022 /*::]*/ : { /* n:"CrtLink", */ } ,
/*::[*/ 0x1024 /*::]*/ : { /* n:"DefaultText", */ } ,
/*::[*/ 0x1025 /*::]*/ : { /* n:"Text", */ } ,
/*::[*/ 0x1026 /*::]*/ : { /* n:"FontX", */ f : parseuint16 } ,
/*::[*/ 0x1027 /*::]*/ : { /* n:"ObjectLink", */ } ,
/*::[*/ 0x1032 /*::]*/ : { /* n:"Frame", */ } ,
/*::[*/ 0x1033 /*::]*/ : { /* n:"Begin", */ } ,
/*::[*/ 0x1034 /*::]*/ : { /* n:"End", */ } ,
/*::[*/ 0x1035 /*::]*/ : { /* n:"PlotArea", */ } ,
/*::[*/ 0x103a /*::]*/ : { /* n:"Chart3d", */ } ,
/*::[*/ 0x103c /*::]*/ : { /* n:"PicF", */ } ,
/*::[*/ 0x103d /*::]*/ : { /* n:"DropBar", */ } ,
/*::[*/ 0x103e /*::]*/ : { /* n:"Radar", */ } ,
/*::[*/ 0x103f /*::]*/ : { /* n:"Surf", */ } ,
/*::[*/ 0x1040 /*::]*/ : { /* n:"RadarArea", */ } ,
/*::[*/ 0x1041 /*::]*/ : { /* n:"AxisParent", */ } ,
/*::[*/ 0x1043 /*::]*/ : { /* n:"LegendException", */ } ,
/*::[*/ 0x1044 /*::]*/ : { /* n:"ShtProps", */ f : parse _ShtProps } ,
/*::[*/ 0x1045 /*::]*/ : { /* n:"SerToCrt", */ } ,
/*::[*/ 0x1046 /*::]*/ : { /* n:"AxesUsed", */ } ,
/*::[*/ 0x1048 /*::]*/ : { /* n:"SBaseRef", */ } ,
/*::[*/ 0x104a /*::]*/ : { /* n:"SerParent", */ } ,
/*::[*/ 0x104b /*::]*/ : { /* n:"SerAuxTrend", */ } ,
/*::[*/ 0x104e /*::]*/ : { /* n:"IFmtRecord", */ } ,
/*::[*/ 0x104f /*::]*/ : { /* n:"Pos", */ } ,
/*::[*/ 0x1050 /*::]*/ : { /* n:"AlRuns", */ } ,
/*::[*/ 0x1051 /*::]*/ : { /* n:"BRAI", */ } ,
/*::[*/ 0x105b /*::]*/ : { /* n:"SerAuxErrBar", */ } ,
/*::[*/ 0x105c /*::]*/ : { /* n:"ClrtClient", */ f : parse _ClrtClient } ,
/*::[*/ 0x105d /*::]*/ : { /* n:"SerFmt", */ } ,
/*::[*/ 0x105f /*::]*/ : { /* n:"Chart3DBarShape", */ } ,
/*::[*/ 0x1060 /*::]*/ : { /* n:"Fbi", */ } ,
/*::[*/ 0x1061 /*::]*/ : { /* n:"BopPop", */ } ,
/*::[*/ 0x1062 /*::]*/ : { /* n:"AxcExt", */ } ,
/*::[*/ 0x1063 /*::]*/ : { /* n:"Dat", */ } ,
/*::[*/ 0x1064 /*::]*/ : { /* n:"PlotGrowth", */ } ,
/*::[*/ 0x1065 /*::]*/ : { /* n:"SIIndex", */ } ,
/*::[*/ 0x1066 /*::]*/ : { /* n:"GelFrame", */ } ,
/*::[*/ 0x1067 /*::]*/ : { /* n:"BopPopCustom", */ } ,
/*::[*/ 0x1068 /*::]*/ : { /* n:"Fbi2", */ } ,
/*::[*/ 0x0000 /*::]*/ : { /* n:"Dimensions", */ f : parse _Dimensions } ,
/*::[*/ 0x0001 /*::]*/ : { /* n:"BIFF2BLANK", */ } ,
/*::[*/ 0x0002 /*::]*/ : { /* n:"BIFF2INT", */ f : parse _BIFF2INT } ,
/*::[*/ 0x0003 /*::]*/ : { /* n:"BIFF2NUM", */ f : parse _BIFF2NUM } ,
/*::[*/ 0x0004 /*::]*/ : { /* n:"BIFF2STR", */ f : parse _BIFF2STR } ,
/*::[*/ 0x0005 /*::]*/ : { /* n:"BoolErr", */ f : parse _BoolErr } ,
/*::[*/ 0x0007 /*::]*/ : { /* n:"String", */ f : parse _BIFF2STRING } ,
/*::[*/ 0x0008 /*::]*/ : { /* n:"BIFF2ROW", */ } ,
/*::[*/ 0x0009 /*::]*/ : { /* n:"BOF", */ f : parse _BOF } ,
/*::[*/ 0x000b /*::]*/ : { /* n:"Index", */ } ,
/*::[*/ 0x0016 /*::]*/ : { /* n:"ExternCount", */ f : parseuint16 } ,
/*::[*/ 0x001e /*::]*/ : { /* n:"BIFF2FORMAT", */ f : parse _BIFF2Format } ,
/*::[*/ 0x001f /*::]*/ : { /* n:"BIFF2FMTCNT", */ } , /* 16-bit cnt of BIFF2FORMAT records */
/*::[*/ 0x0020 /*::]*/ : { /* n:"BIFF2COLINFO", */ } ,
/*::[*/ 0x0021 /*::]*/ : { /* n:"Array", */ f : parse _Array } ,
/*::[*/ 0x0024 /*::]*/ : { /* n:"COLWIDTH", */ } ,
/*::[*/ 0x0025 /*::]*/ : { /* n:"DefaultRowHeight", */ f : parse _DefaultRowHeight } ,
2021-11-14 04:38:00 +00:00
// 0x2c ??
// 0x2d ??
// 0x2e ??
// 0x30 FONTCOUNT: number of fonts
2022-03-12 14:05:57 +00:00
/*::[*/ 0x0032 /*::]*/ : { /* n:"BIFF2FONTXTRA", */ f : parse _BIFF2FONTXTRA } ,
2021-11-14 04:38:00 +00:00
// 0x35: INFOOPTS
// 0x36: TABLE (BIFF2 only)
// 0x37: TABLE2 (BIFF2 only)
// 0x38: WNDESK
// 0x39 ??
// 0x3a: BEGINPREF
// 0x3b: ENDPREF
2022-03-12 14:05:57 +00:00
/*::[*/ 0x003e /*::]*/ : { /* n:"BIFF2WINDOW2", */ } ,
2021-11-14 04:38:00 +00:00
// 0x3f ??
// 0x46: SHOWSCROLL
// 0x47: SHOWFORMULA
// 0x48: STATUSBAR
// 0x49: SHORTMENUS
// 0x4A:
// 0x4B:
// 0x4C:
// 0x4E:
// 0x4F:
// 0x58: TOOLBAR (BIFF3)
/* - - - */
2022-03-12 14:05:57 +00:00
/*::[*/ 0x0034 /*::]*/ : { /* n:"DDEObjName", */ } ,
/*::[*/ 0x0043 /*::]*/ : { /* n:"BIFF2XF", */ } ,
/*::[*/ 0x0044 /*::]*/ : { /* n:"BIFF2XFINDEX", */ f : parseuint16 } ,
/*::[*/ 0x0045 /*::]*/ : { /* n:"BIFF2FONTCLR", */ } ,
/*::[*/ 0x0056 /*::]*/ : { /* n:"BIFF4FMTCNT", */ } , /* 16-bit cnt, similar to BIFF2 */
/*::[*/ 0x007e /*::]*/ : { /* n:"RK", */ } , /* Not necessarily same as 0x027e */
/*::[*/ 0x007f /*::]*/ : { /* n:"ImData", */ f : parse _ImData } ,
/*::[*/ 0x0087 /*::]*/ : { /* n:"Addin", */ } ,
/*::[*/ 0x0088 /*::]*/ : { /* n:"Edg", */ } ,
/*::[*/ 0x0089 /*::]*/ : { /* n:"Pub", */ } ,
2021-11-14 04:38:00 +00:00
// 0x8A
// 0x8B LH: alternate menu key flag (BIFF3/4)
// 0x8E
// 0x8F
2022-03-12 14:05:57 +00:00
/*::[*/ 0x0091 /*::]*/ : { /* n:"Sub", */ } ,
2021-11-14 04:38:00 +00:00
// 0x93 STYLE
2022-03-12 14:05:57 +00:00
/*::[*/ 0x0094 /*::]*/ : { /* n:"LHRecord", */ } ,
/*::[*/ 0x0095 /*::]*/ : { /* n:"LHNGraph", */ } ,
/*::[*/ 0x0096 /*::]*/ : { /* n:"Sound", */ } ,
2021-11-14 04:38:00 +00:00
// 0xA2 FNPROTO: function prototypes (BIFF4)
// 0xA3
// 0xA8
2022-03-12 14:05:57 +00:00
/*::[*/ 0x00a9 /*::]*/ : { /* n:"CoordList", */ } ,
/*::[*/ 0x00ab /*::]*/ : { /* n:"GCW", */ } ,
/*::[*/ 0x00bc /*::]*/ : { /* n:"ShrFmla", */ } , /* Not necessarily same as 0x04bc */
/*::[*/ 0x00bf /*::]*/ : { /* n:"ToolbarHdr", */ } ,
/*::[*/ 0x00c0 /*::]*/ : { /* n:"ToolbarEnd", */ } ,
/*::[*/ 0x00c2 /*::]*/ : { /* n:"AddMenu", */ } ,
/*::[*/ 0x00c3 /*::]*/ : { /* n:"DelMenu", */ } ,
/*::[*/ 0x00d6 /*::]*/ : { /* n:"RString", */ f : parse _RString } ,
/*::[*/ 0x00df /*::]*/ : { /* n:"UDDesc", */ } ,
/*::[*/ 0x00ea /*::]*/ : { /* n:"TabIdConf", */ } ,
/*::[*/ 0x0162 /*::]*/ : { /* n:"XL5Modify", */ } ,
/*::[*/ 0x01a5 /*::]*/ : { /* n:"FileSharing2", */ } ,
/*::[*/ 0x0206 /*::]*/ : { /* n:"Formula", */ f : parse _Formula } ,
/*::[*/ 0x0209 /*::]*/ : { /* n:"BOF", */ f : parse _BOF } ,
/*::[*/ 0x0218 /*::]*/ : { /* n:"Lbl", */ f : parse _Lbl } ,
/*::[*/ 0x0223 /*::]*/ : { /* n:"ExternName", */ f : parse _ExternName } ,
/*::[*/ 0x0231 /*::]*/ : { /* n:"Font", */ } ,
/*::[*/ 0x0243 /*::]*/ : { /* n:"BIFF3XF", */ } ,
/*::[*/ 0x0406 /*::]*/ : { /* n:"Formula", */ f : parse _Formula } ,
/*::[*/ 0x0409 /*::]*/ : { /* n:"BOF", */ f : parse _BOF } ,
/*::[*/ 0x0443 /*::]*/ : { /* n:"BIFF4XF", */ } ,
/*::[*/ 0x086d /*::]*/ : { /* n:"FeatInfo", */ } ,
/*::[*/ 0x0873 /*::]*/ : { /* n:"FeatInfo11", */ } ,
/*::[*/ 0x0881 /*::]*/ : { /* n:"SXAddl12", */ } ,
/*::[*/ 0x08c0 /*::]*/ : { /* n:"AutoWebPub", */ } ,
/*::[*/ 0x08c1 /*::]*/ : { /* n:"ListObj", */ } ,
/*::[*/ 0x08c2 /*::]*/ : { /* n:"ListField", */ } ,
/*::[*/ 0x08c3 /*::]*/ : { /* n:"ListDV", */ } ,
/*::[*/ 0x08c4 /*::]*/ : { /* n:"ListCondFmt", */ } ,
/*::[*/ 0x08c5 /*::]*/ : { /* n:"ListCF", */ } ,
/*::[*/ 0x08c6 /*::]*/ : { /* n:"FMQry", */ } ,
/*::[*/ 0x08c7 /*::]*/ : { /* n:"FMSQry", */ } ,
/*::[*/ 0x08c8 /*::]*/ : { /* n:"PLV", */ } ,
/*::[*/ 0x08c9 /*::]*/ : { /* n:"LnExt", */ } ,
/*::[*/ 0x08ca /*::]*/ : { /* n:"MkrExt", */ } ,
/*::[*/ 0x08cb /*::]*/ : { /* n:"CrtCoopt", */ } ,
/*::[*/ 0x08d6 /*::]*/ : { /* n:"FRTArchId$", */ r : 12 } ,
2017-02-10 19:23:01 +00:00
2022-05-09 06:49:17 +00:00
/* --- multiplan 4 records --- */
/*::[*/ 0x0065 /*::]*/ : { /* n:"", */ } , // one per window
/*::[*/ 0x0066 /*::]*/ : { /* n:"", */ } , // calc settings
/*::[*/ 0x0069 /*::]*/ : { /* n:"", */ } , // print header
/*::[*/ 0x006a /*::]*/ : { /* n:"", */ } , // print footer
/*::[*/ 0x006b /*::]*/ : { /* n:"", */ } , // print settings
/*::[*/ 0x006d /*::]*/ : { /* n:"", */ } , // one per window
/*::[*/ 0x0070 /*::]*/ : { /* n:"", */ } , // includes default col width
/*::[*/ 0x0072 /*::]*/ : { /* n:"", */ } , // includes selected cell
2017-02-10 19:23:01 +00:00
/*::[*/ 0x7262 /*::]*/ : { }
2017-02-03 20:50:45 +00:00
} ;
2022-03-12 14:05:57 +00:00
function write _biff _rec ( ba /*:BufArray*/ , type /*:number*/ , payload , length /*:?number*/ ) /*:void*/ {
var t /*:number*/ = type ;
2017-09-22 22:18:51 +00:00
if ( isNaN ( t ) ) return ;
var len = length || ( payload || [ ] ) . length || 0 ;
2017-12-30 05:40:35 +00:00
var o = ba . next ( 4 ) ;
2017-02-10 19:23:01 +00:00
o . write _shift ( 2 , t ) ;
o . write _shift ( 2 , len ) ;
if ( /*:: len != null &&*/ len > 0 && is _buf ( payload ) ) ba . push ( payload ) ;
}
2022-03-12 14:05:57 +00:00
function write _biff _continue ( ba /*:BufArray*/ , type /*:number*/ , payload , length /*:?number*/ ) /*:void*/ {
2020-06-29 08:07:23 +00:00
var len = length || ( payload || [ ] ) . length || 0 ;
if ( len <= 8224 ) return write _biff _rec ( ba , type , payload , len ) ;
2022-03-12 14:05:57 +00:00
var t = type ;
2020-06-29 08:07:23 +00:00
if ( isNaN ( t ) ) return ;
var parts = payload . parts || [ ] , sidx = 0 ;
var i = 0 , w = 0 ;
while ( w + ( parts [ sidx ] || 8224 ) <= 8224 ) { w += ( parts [ sidx ] || 8224 ) ; sidx ++ ; }
var o = ba . next ( 4 ) ;
o . write _shift ( 2 , t ) ;
o . write _shift ( 2 , w ) ;
ba . push ( payload . slice ( i , i + w ) ) ;
i += w ;
while ( i < len ) {
o = ba . next ( 4 ) ;
o . write _shift ( 2 , 0x3c ) ; // TODO: figure out correct continue type
w = 0 ;
while ( w + ( parts [ sidx ] || 8224 ) <= 8224 ) { w += ( parts [ sidx ] || 8224 ) ; sidx ++ ; }
o . write _shift ( 2 , w ) ;
ba . push ( payload . slice ( i , i + w ) ) ; i += w ;
}
}
2020-03-15 07:42:05 +00:00
2017-02-10 19:23:01 +00:00
function write _BIFF2Cell ( out , r /*:number*/ , c /*:number*/ ) {
if ( ! out ) out = new _buf ( 7 ) ;
out . write _shift ( 2 , r ) ;
out . write _shift ( 2 , c ) ;
2017-12-30 05:40:35 +00:00
out . write _shift ( 2 , 0 ) ;
2017-02-10 19:23:01 +00:00
out . write _shift ( 1 , 0 ) ;
return out ;
}
2017-07-27 20:07:51 +00:00
function write _BIFF2BERR ( r /*:number*/ , c /*:number*/ , val , t /*:?string*/ ) {
2017-02-10 19:23:01 +00:00
var out = new _buf ( 9 ) ;
write _BIFF2Cell ( out , r , c ) ;
2021-10-13 07:20:25 +00:00
write _Bes ( val , t || 'b' , out ) ;
2017-02-10 19:23:01 +00:00
return out ;
}
/* TODO: codepage, large strings */
2017-07-27 20:07:51 +00:00
function write _BIFF2LABEL ( r /*:number*/ , c /*:number*/ , val ) {
2017-02-10 19:23:01 +00:00
var out = new _buf ( 8 + 2 * val . length ) ;
write _BIFF2Cell ( out , r , c ) ;
out . write _shift ( 1 , val . length ) ;
out . write _shift ( val . length , val , 'sbcs' ) ;
return out . l < out . length ? out . slice ( 0 , out . l ) : out ;
}
2018-01-23 09:07:51 +00:00
function write _ws _biff2 _cell ( ba /*:BufArray*/ , cell /*:Cell*/ , R /*:number*/ , C /*:number*/ /*::, opts*/ ) {
2017-03-18 00:45:06 +00:00
if ( cell . v != null ) switch ( cell . t ) {
2017-04-02 06:47:25 +00:00
case 'd' : case 'n' :
2017-10-17 00:14:32 +00:00
var v = cell . t == 'd' ? datenum ( parseDate ( cell . v ) ) : cell . v ;
2017-04-02 06:47:25 +00:00
if ( ( v == ( v | 0 ) ) && ( v >= 0 ) && ( v < 65536 ) )
write _biff _rec ( ba , 0x0002 , write _BIFF2INT ( R , C , v ) ) ;
2017-02-10 19:23:01 +00:00
else
2017-09-22 22:18:51 +00:00
write _biff _rec ( ba , 0x0003 , write _BIFF2NUM ( R , C , v ) ) ;
2017-03-18 00:45:06 +00:00
return ;
case 'b' : case 'e' : write _biff _rec ( ba , 0x0005 , write _BIFF2BERR ( R , C , cell . v , cell . t ) ) ; return ;
2017-02-10 19:23:01 +00:00
/* TODO: codepage, sst */
case 's' : case 'str' :
2021-10-13 07:20:25 +00:00
write _biff _rec ( ba , 0x0004 , write _BIFF2LABEL ( R , C , ( cell . v || "" ) . slice ( 0 , 255 ) ) ) ;
2017-03-18 00:45:06 +00:00
return ;
2017-02-10 19:23:01 +00:00
}
2017-03-18 00:45:06 +00:00
write _biff _rec ( ba , 0x0001 , write _BIFF2Cell ( null , R , C ) ) ;
2017-02-10 19:23:01 +00:00
}
2018-01-23 09:07:51 +00:00
function write _ws _biff2 ( ba /*:BufArray*/ , ws /*:Worksheet*/ , idx /*:number*/ , opts /*::, wb:Workbook*/ ) {
2017-04-08 06:55:35 +00:00
var dense = Array . isArray ( ws ) ;
2017-07-27 20:07:51 +00:00
var range = safe _decode _range ( ws [ '!ref' ] || "A1" ) , ref /*:string*/ , rr = "" , cols /*:Array<string>*/ = [ ] ;
2018-04-27 20:11:18 +00:00
if ( range . e . c > 0xFF || range . e . r > 0x3FFF ) {
if ( opts . WTF ) throw new Error ( "Range " + ( ws [ '!ref' ] || "A1" ) + " exceeds format limit A1:IV16384" ) ;
range . e . c = Math . min ( range . e . c , 0xFF ) ;
range . e . r = Math . min ( range . e . c , 0x3FFF ) ;
ref = encode _range ( range ) ;
}
2017-02-10 19:23:01 +00:00
for ( var R = range . s . r ; R <= range . e . r ; ++ R ) {
rr = encode _row ( R ) ;
for ( var C = range . s . c ; C <= range . e . c ; ++ C ) {
if ( R === range . s . r ) cols [ C ] = encode _col ( C ) ;
ref = cols [ C ] + rr ;
2017-06-10 01:47:42 +00:00
var cell = dense ? ( ws [ R ] || [ ] ) [ C ] : ws [ ref ] ;
2017-04-08 06:55:35 +00:00
if ( ! cell ) continue ;
2017-02-10 19:23:01 +00:00
/* write cell */
2017-09-22 22:18:51 +00:00
write _ws _biff2 _cell ( ba , cell , R , C , opts ) ;
2017-02-10 19:23:01 +00:00
}
}
}
/* Based on test files */
2017-09-22 22:18:51 +00:00
function write _biff2 _buf ( wb /*:Workbook*/ , opts /*:WriteOpts*/ ) {
2017-04-08 06:55:35 +00:00
var o = opts || { } ;
2017-04-09 04:03:19 +00:00
if ( DENSE != null && o . dense == null ) o . dense = DENSE ;
2017-02-10 19:23:01 +00:00
var ba = buf _array ( ) ;
var idx = 0 ;
for ( var i = 0 ; i < wb . SheetNames . length ; ++ i ) if ( wb . SheetNames [ i ] == o . sheet ) idx = i ;
if ( idx == 0 && ! ! o . sheet && wb . SheetNames [ 0 ] != o . sheet ) throw new Error ( "Sheet not found: " + o . sheet ) ;
2021-10-13 07:20:25 +00:00
write _biff _rec ( ba , ( o . biff == 4 ? 0x0409 : ( o . biff == 3 ? 0x0209 : 0x0009 ) ) , write _BOF ( wb , 0x10 , o ) ) ;
2017-02-10 19:23:01 +00:00
/* ... */
2017-09-22 22:18:51 +00:00
write _ws _biff2 ( ba , wb . Sheets [ wb . SheetNames [ idx ] ] , idx , o , wb ) ;
2017-02-10 19:23:01 +00:00
/* ... */
2017-09-22 22:18:51 +00:00
write _biff _rec ( ba , 0x000A ) ;
2017-02-10 19:23:01 +00:00
return ba . end ( ) ;
}
2017-09-22 22:18:51 +00:00
2018-02-14 20:06:35 +00:00
function write _FONTS _biff8 ( ba , data , opts ) {
2022-03-12 14:05:57 +00:00
write _biff _rec ( ba , 0x0031 /* Font */ , write _Font ( {
2018-02-14 20:06:35 +00:00
sz : 12 ,
color : { theme : 1 } ,
name : "Arial" ,
family : 2 ,
scheme : "minor"
} , opts ) ) ;
}
function write _FMTS _biff8 ( ba , NF /*:?SSFTable*/ , opts ) {
2018-02-08 18:21:39 +00:00
if ( ! NF ) return ;
[ [ 5 , 8 ] , [ 23 , 26 ] , [ 41 , 44 ] , [ /*63*/ 50 , /*66],[164,*/ 392 ] ] . forEach ( function ( r ) {
/*:: if(!NF) return; */
2022-03-12 14:05:57 +00:00
for ( var i = r [ 0 ] ; i <= r [ 1 ] ; ++ i ) if ( NF [ i ] != null ) write _biff _rec ( ba , 0x041E /* Format */ , write _Format ( i , NF [ i ] , opts ) ) ;
2018-02-08 18:21:39 +00:00
} ) ;
}
2018-02-14 20:06:35 +00:00
function write _FEAT ( ba , ws ) {
/* [MS-XLS] 2.4.112 */
var o = new _buf ( 19 ) ;
o . write _shift ( 4 , 0x867 ) ; o . write _shift ( 4 , 0 ) ; o . write _shift ( 4 , 0 ) ;
o . write _shift ( 2 , 3 ) ; o . write _shift ( 1 , 1 ) ; o . write _shift ( 4 , 0 ) ;
2022-03-12 14:05:57 +00:00
write _biff _rec ( ba , 0x0867 /* FeatHdr */ , o ) ;
2018-02-14 20:06:35 +00:00
/* [MS-XLS] 2.4.111 */
o = new _buf ( 39 ) ;
o . write _shift ( 4 , 0x868 ) ; o . write _shift ( 4 , 0 ) ; o . write _shift ( 4 , 0 ) ;
o . write _shift ( 2 , 3 ) ; o . write _shift ( 1 , 0 ) ; o . write _shift ( 4 , 0 ) ;
o . write _shift ( 2 , 1 ) ; o . write _shift ( 4 , 4 ) ; o . write _shift ( 2 , 0 ) ;
2018-05-05 06:34:37 +00:00
write _Ref8U ( safe _decode _range ( ws [ '!ref' ] || "A1" ) , o ) ;
2018-02-14 20:06:35 +00:00
o . write _shift ( 4 , 4 ) ;
2022-03-12 14:05:57 +00:00
write _biff _rec ( ba , 0x0868 /* Feat */ , o ) ;
2018-02-14 20:06:35 +00:00
}
function write _CELLXFS _biff8 ( ba , opts ) {
2022-03-12 14:05:57 +00:00
for ( var i = 0 ; i < 16 ; ++ i ) write _biff _rec ( ba , 0x00e0 /* XF */ , write _XF ( { numFmtId : 0 , style : true } , 0 , opts ) ) ;
2018-02-14 20:06:35 +00:00
opts . cellXfs . forEach ( function ( c ) {
2022-03-12 14:05:57 +00:00
write _biff _rec ( ba , 0x00e0 /* XF */ , write _XF ( c , 0 , opts ) ) ;
2018-02-08 18:21:39 +00:00
} ) ;
}
2017-12-15 01:18:40 +00:00
function write _ws _biff8 _hlinks ( ba /*:BufArray*/ , ws ) {
for ( var R = 0 ; R < ws [ '!links' ] . length ; ++ R ) {
var HL = ws [ '!links' ] [ R ] ;
2022-03-12 14:05:57 +00:00
write _biff _rec ( ba , 0x01b8 /* HLink */ , write _HLink ( HL ) ) ;
if ( HL [ 1 ] . Tooltip ) write _biff _rec ( ba , 0x0800 /* HLinkTooltip */ , write _HLinkTooltip ( HL ) ) ;
2017-12-15 01:18:40 +00:00
}
delete ws [ '!links' ] ;
}
2022-03-16 03:18:09 +00:00
function write _ws _cols _biff8 ( ba , cols ) {
2021-09-16 01:50:33 +00:00
if ( ! cols ) return ;
var cnt = 0 ;
cols . forEach ( function ( col , idx ) {
if ( ++ cnt <= 256 && col ) {
2022-03-12 14:05:57 +00:00
write _biff _rec ( ba , 0x007d /* ColInfo */ , write _ColInfo ( col _obj _w ( idx , col ) , idx ) ) ;
2021-09-16 01:50:33 +00:00
}
} ) ;
}
2017-09-22 22:18:51 +00:00
function write _ws _biff8 _cell ( ba /*:BufArray*/ , cell /*:Cell*/ , R /*:number*/ , C /*:number*/ , opts ) {
2018-02-14 20:06:35 +00:00
var os = 16 + get _cell _style ( opts . cellXfs , cell , opts ) ;
2019-11-01 03:09:14 +00:00
if ( cell . v == null && ! cell . bf ) {
2022-03-12 14:05:57 +00:00
write _biff _rec ( ba , 0x0201 /* Blank */ , write _XLSCell ( R , C , os ) ) ;
2019-11-01 03:09:14 +00:00
return ;
}
2022-03-12 14:05:57 +00:00
if ( cell . bf ) write _biff _rec ( ba , 0x0006 /* Formula */ , write _Formula ( cell , R , C , opts , os ) ) ;
2019-11-01 03:09:14 +00:00
else switch ( cell . t ) {
2017-09-22 22:18:51 +00:00
case 'd' : case 'n' :
2017-10-17 00:14:32 +00:00
var v = cell . t == 'd' ? datenum ( parseDate ( cell . v ) ) : cell . v ;
2017-09-22 22:18:51 +00:00
/* TODO: emit RK as appropriate */
2022-03-12 14:05:57 +00:00
write _biff _rec ( ba , 0x0203 /* Number */ , write _Number ( R , C , v , os , opts ) ) ;
2019-11-01 03:09:14 +00:00
break ;
case 'b' : case 'e' :
2022-03-12 14:05:57 +00:00
write _biff _rec ( ba , 0x0205 /* BoolErr */ , write _BoolErr ( R , C , cell . v , os , opts , cell . t ) ) ;
2019-11-01 03:09:14 +00:00
break ;
2017-09-22 22:18:51 +00:00
/* TODO: codepage, sst */
case 's' : case 'str' :
2020-06-29 08:07:23 +00:00
if ( opts . bookSST ) {
var isst = get _sst _id ( opts . Strings , cell . v , opts . revStrings ) ;
2022-03-12 14:05:57 +00:00
write _biff _rec ( ba , 0x00fd /* LabelSst */ , write _LabelSst ( R , C , isst , os , opts ) ) ;
} else write _biff _rec ( ba , 0x0204 /* Label */ , write _Label ( R , C , ( cell . v || "" ) . slice ( 0 , 255 ) , os , opts ) ) ;
2019-11-01 03:09:14 +00:00
break ;
default :
2022-03-12 14:05:57 +00:00
write _biff _rec ( ba , 0x0201 /* Blank */ , write _XLSCell ( R , C , os ) ) ;
2017-09-22 22:18:51 +00:00
}
}
/* [MS-XLS] 2.1.7.20.5 */
function write _ws _biff8 ( idx /*:number*/ , opts , wb /*:Workbook*/ ) {
var ba = buf _array ( ) ;
var s = wb . SheetNames [ idx ] , ws = wb . Sheets [ s ] || { } ;
2017-12-30 05:40:35 +00:00
var _WB /*:WBWBProps*/ = ( ( wb || { } ) . Workbook || { } /*:any*/ ) ;
var _sheet /*:WBWSProp*/ = ( ( _WB . Sheets || [ ] ) [ idx ] || { } /*:any*/ ) ;
2017-09-22 22:18:51 +00:00
var dense = Array . isArray ( ws ) ;
2018-04-27 20:11:18 +00:00
var b8 = opts . biff == 8 ;
2017-09-22 22:18:51 +00:00
var ref /*:string*/ , rr = "" , cols /*:Array<string>*/ = [ ] ;
var range = safe _decode _range ( ws [ '!ref' ] || "A1" ) ;
2018-04-27 20:11:18 +00:00
var MAX _ROWS = b8 ? 65536 : 16384 ;
if ( range . e . c > 0xFF || range . e . r >= MAX _ROWS ) {
if ( opts . WTF ) throw new Error ( "Range " + ( ws [ '!ref' ] || "A1" ) + " exceeds format limit A1:IV16384" ) ;
range . e . c = Math . min ( range . e . c , 0xFF ) ;
range . e . r = Math . min ( range . e . c , MAX _ROWS - 1 ) ;
}
2017-09-22 22:18:51 +00:00
write _biff _rec ( ba , 0x0809 , write _BOF ( wb , 0x10 , opts ) ) ;
2019-11-01 03:09:14 +00:00
/* [Uncalced] Index */
2022-03-12 14:05:57 +00:00
write _biff _rec ( ba , 0x000d /* CalcMode */ , writeuint16 ( 1 ) ) ;
write _biff _rec ( ba , 0x000c /* CalcCount */ , writeuint16 ( 100 ) ) ;
write _biff _rec ( ba , 0x000f /* CalcRefMode */ , writebool ( true ) ) ;
write _biff _rec ( ba , 0x0011 /* CalcIter */ , writebool ( false ) ) ;
write _biff _rec ( ba , 0x0010 /* CalcDelta */ , write _Xnum ( 0.001 ) ) ;
write _biff _rec ( ba , 0x005f /* CalcSaveRecalc */ , writebool ( true ) ) ;
write _biff _rec ( ba , 0x002a /* PrintRowCol */ , writebool ( false ) ) ;
write _biff _rec ( ba , 0x002b /* PrintGrid */ , writebool ( false ) ) ;
write _biff _rec ( ba , 0x0082 /* GridSet */ , writeuint16 ( 1 ) ) ;
write _biff _rec ( ba , 0x0080 /* Guts */ , write _Guts ( [ 0 , 0 ] ) ) ;
2019-11-01 03:09:14 +00:00
/* DefaultRowHeight WsBool [Sync] [LPr] [HorizontalPageBreaks] [VerticalPageBreaks] */
/* Header (string) */
/* Footer (string) */
2022-03-12 14:05:57 +00:00
write _biff _rec ( ba , 0x0083 /* HCenter */ , writebool ( false ) ) ;
write _biff _rec ( ba , 0x0084 /* VCenter */ , writebool ( false ) ) ;
2017-09-22 22:18:51 +00:00
/* ... */
2022-03-16 03:18:09 +00:00
if ( b8 ) write _ws _cols _biff8 ( ba , ws [ "!cols" ] ) ;
2021-09-16 01:50:33 +00:00
/* ... */
2022-05-22 23:51:41 +00:00
write _biff _rec ( ba , 0x0200 /* Dimensions */ , write _Dimensions ( range , opts ) ) ;
2017-09-22 22:18:51 +00:00
/* ... */
2017-12-15 01:18:40 +00:00
if ( b8 ) ws [ '!links' ] = [ ] ;
2022-05-27 20:26:39 +00:00
var comments = [ ] ;
2017-09-22 22:18:51 +00:00
for ( var R = range . s . r ; R <= range . e . r ; ++ R ) {
rr = encode _row ( R ) ;
for ( var C = range . s . c ; C <= range . e . c ; ++ C ) {
if ( R === range . s . r ) cols [ C ] = encode _col ( C ) ;
ref = cols [ C ] + rr ;
var cell = dense ? ( ws [ R ] || [ ] ) [ C ] : ws [ ref ] ;
if ( ! cell ) continue ;
/* write cell */
write _ws _biff8 _cell ( ba , cell , R , C , opts ) ;
2017-12-15 01:18:40 +00:00
if ( b8 && cell . l ) ws [ '!links' ] . push ( [ ref , cell . l ] ) ;
2022-05-27 20:26:39 +00:00
if ( b8 && cell . c ) comments . push ( [ ref , cell . c ] ) ;
2017-09-22 22:18:51 +00:00
}
}
2017-11-20 01:51:14 +00:00
var cname /*:string*/ = _sheet . CodeName || _sheet . name || s ;
2017-12-15 01:18:40 +00:00
/* ... */
2022-05-27 20:26:39 +00:00
// if(b8) comments.forEach(function(comment) { write_biff_rec(ba, 0x001c /* Note */, write_NoteSh(comment)); });
/* ... */
2022-03-12 14:05:57 +00:00
if ( b8 ) write _biff _rec ( ba , 0x023e /* Window2 */ , write _Window2 ( ( _WB . Views || [ ] ) [ 0 ] ) ) ;
2017-12-30 05:40:35 +00:00
/* ... */
2022-03-12 14:05:57 +00:00
if ( b8 && ( ws [ '!merges' ] || [ ] ) . length ) write _biff _rec ( ba , 0x00e5 /* MergeCells */ , write _MergeCells ( ws [ '!merges' ] ) ) ;
2019-11-01 03:09:14 +00:00
/* [LRng] *QUERYTABLE [PHONETICINFO] CONDFMTS */
2017-12-15 01:18:40 +00:00
if ( b8 ) write _ws _biff8 _hlinks ( ba , ws ) ;
2019-11-01 03:09:14 +00:00
/* [DVAL] */
2022-03-12 14:05:57 +00:00
write _biff _rec ( ba , 0x01ba /* CodeName */ , write _XLUnicodeString ( cname , opts ) ) ;
2019-11-01 03:09:14 +00:00
/* *WebPub *CellWatch [SheetExt] */
2018-02-14 20:06:35 +00:00
if ( b8 ) write _FEAT ( ba , ws ) ;
2019-11-01 03:09:14 +00:00
/* *FEAT11 *RECORD12 */
2022-03-12 14:05:57 +00:00
write _biff _rec ( ba , 0x000a /* EOF */ ) ;
2017-09-22 22:18:51 +00:00
return ba . end ( ) ;
}
/* [MS-XLS] 2.1.7.20.3 */
function write _biff8 _global ( wb /*:Workbook*/ , bufs , opts /*:WriteOpts*/ ) {
var A = buf _array ( ) ;
2018-02-14 20:06:35 +00:00
var _WB /*:WBWBProps*/ = ( ( wb || { } ) . Workbook || { } /*:any*/ ) ;
var _sheets /*:Array<WBWSProp>*/ = ( _WB . Sheets || [ ] ) ;
var _wb /*:WBProps*/ = /*::((*/ _WB . WBProps || { /*::CodeName:"ThisWorkbook"*/ } /*:: ):any)*/ ;
2017-09-22 22:18:51 +00:00
var b8 = opts . biff == 8 , b5 = opts . biff == 5 ;
write _biff _rec ( A , 0x0809 , write _BOF ( wb , 0x05 , opts ) ) ;
2022-03-12 14:05:57 +00:00
if ( opts . bookType == "xla" ) write _biff _rec ( A , 0x0087 /* Addin */ ) ;
write _biff _rec ( A , 0x00e1 /* InterfaceHdr */ , b8 ? writeuint16 ( 0x04b0 ) : null ) ;
write _biff _rec ( A , 0x00c1 /* Mms */ , writezeroes ( 2 ) ) ;
if ( b5 ) write _biff _rec ( A , 0x00bf /* ToolbarHdr */ ) ;
if ( b5 ) write _biff _rec ( A , 0x00c0 /* ToolbarEnd */ ) ;
write _biff _rec ( A , 0x00e2 /* InterfaceEnd */ ) ;
write _biff _rec ( A , 0x005c /* WriteAccess */ , write _WriteAccess ( "SheetJS" , opts ) ) ;
2019-11-01 03:09:14 +00:00
/* [FileSharing] */
2022-03-12 14:05:57 +00:00
write _biff _rec ( A , 0x0042 /* CodePage */ , writeuint16 ( b8 ? 0x04b0 : 0x04E4 ) ) ;
2019-11-01 03:09:14 +00:00
/* *2047 Lel */
2022-03-12 14:05:57 +00:00
if ( b8 ) write _biff _rec ( A , 0x0161 /* DSF */ , writeuint16 ( 0 ) ) ;
if ( b8 ) write _biff _rec ( A , 0x01c0 /* Excel9File */ ) ;
write _biff _rec ( A , 0x013d /* RRTabId */ , write _RRTabId ( wb . SheetNames . length ) ) ;
if ( b8 && wb . vbaraw ) write _biff _rec ( A , 0x00d3 /* ObProj */ ) ;
2019-11-01 03:09:14 +00:00
/* [ObNoMacros] */
2017-10-27 16:25:54 +00:00
if ( b8 && wb . vbaraw ) {
2017-11-20 01:51:14 +00:00
var cname /*:string*/ = _wb . CodeName || "ThisWorkbook" ;
2022-03-12 14:05:57 +00:00
write _biff _rec ( A , 0x01ba /* CodeName */ , write _XLUnicodeString ( cname , opts ) ) ;
2017-10-27 16:25:54 +00:00
}
2022-03-12 14:05:57 +00:00
write _biff _rec ( A , 0x009c /* BuiltInFnGroupCount */ , writeuint16 ( 0x11 ) ) ;
2019-11-01 03:09:14 +00:00
/* *FnGroupName *FnGrp12 */
/* *Lbl */
/* [OleObjectSize] */
2022-03-12 14:05:57 +00:00
write _biff _rec ( A , 0x0019 /* WinProtect */ , writebool ( false ) ) ;
write _biff _rec ( A , 0x0012 /* Protect */ , writebool ( false ) ) ;
write _biff _rec ( A , 0x0013 /* Password */ , writeuint16 ( 0 ) ) ;
if ( b8 ) write _biff _rec ( A , 0x01af /* Prot4Rev */ , writebool ( false ) ) ;
if ( b8 ) write _biff _rec ( A , 0x01bc /* Prot4RevPass */ , writeuint16 ( 0 ) ) ;
write _biff _rec ( A , 0x003d /* Window1 */ , write _Window1 ( opts ) ) ;
write _biff _rec ( A , 0x0040 /* Backup */ , writebool ( false ) ) ;
write _biff _rec ( A , 0x008d /* HideObj */ , writeuint16 ( 0 ) ) ;
write _biff _rec ( A , 0x0022 /* Date1904 */ , writebool ( safe1904 ( wb ) == "true" ) ) ;
write _biff _rec ( A , 0x000e /* CalcPrecision */ , writebool ( true ) ) ;
if ( b8 ) write _biff _rec ( A , 0x01b7 /* RefreshAll */ , writebool ( false ) ) ;
write _biff _rec ( A , 0x00DA /* BookBool */ , writeuint16 ( 0 ) ) ;
2017-09-22 22:18:51 +00:00
/* ... */
2018-02-14 20:06:35 +00:00
write _FONTS _biff8 ( A , wb , opts ) ;
write _FMTS _biff8 ( A , wb . SSF , opts ) ;
write _CELLXFS _biff8 ( A , opts ) ;
2018-02-08 18:21:39 +00:00
/* ... */
2022-03-12 14:05:57 +00:00
if ( b8 ) write _biff _rec ( A , 0x0160 /* UsesELFs */ , writebool ( false ) ) ;
2017-09-22 22:18:51 +00:00
var a = A . end ( ) ;
var C = buf _array ( ) ;
2019-11-01 03:09:14 +00:00
/* METADATA [MTRSettings] [ForceFullCalculation] */
2022-05-22 23:51:41 +00:00
if ( b8 ) write _biff _rec ( C , 0x008C /* Country */ , write _Country ( ) ) ;
2019-11-01 03:09:14 +00:00
/* *SUPBOOK *LBL *RTD [RecalcId] *HFPicture *MSODRAWINGGROUP */
2020-06-29 08:07:23 +00:00
2017-09-22 22:18:51 +00:00
/* BIFF8: [SST *Continue] ExtSST */
2022-05-22 23:51:41 +00:00
if ( b8 && opts . Strings ) write _biff _continue ( C , 0x00FC /* SST */ , write _SST ( opts . Strings , opts ) ) ;
2020-06-29 08:07:23 +00:00
2019-11-01 03:09:14 +00:00
/* *WebPub [WOpt] [CrErr] [BookExt] *FeatHdr *DConn [THEME] [CompressPictures] [Compat12] [GUIDTypeLib] */
2022-03-12 14:05:57 +00:00
write _biff _rec ( C , 0x000A /* EOF */ ) ;
2017-09-22 22:18:51 +00:00
var c = C . end ( ) ;
var B = buf _array ( ) ;
var blen = 0 , j = 0 ;
2017-10-17 00:14:32 +00:00
for ( j = 0 ; j < wb . SheetNames . length ; ++ j ) blen += ( b8 ? 12 : 11 ) + ( b8 ? 2 : 1 ) * wb . SheetNames [ j ] . length ;
2017-09-22 22:18:51 +00:00
var start = a . length + blen + c . length ;
for ( j = 0 ; j < wb . SheetNames . length ; ++ j ) {
2018-02-14 20:06:35 +00:00
var _sheet /*:WBWSProp*/ = _sheets [ j ] || ( { } /*:any*/ ) ;
2022-03-12 14:05:57 +00:00
write _biff _rec ( B , 0x0085 /* BoundSheet8 */ , write _BoundSheet8 ( { pos : start , hs : _sheet . Hidden || 0 , dt : 0 , name : wb . SheetNames [ j ] } , opts ) ) ;
2017-09-22 22:18:51 +00:00
start += bufs [ j ] . length ;
}
/* 1*BoundSheet8 */
var b = B . end ( ) ;
if ( blen != b . length ) throw new Error ( "BS8 " + blen + " != " + b . length ) ;
var out = [ ] ;
if ( a . length ) out . push ( a ) ;
if ( b . length ) out . push ( b ) ;
if ( c . length ) out . push ( c ) ;
2022-02-10 12:40:50 +00:00
return bconcat ( out ) ;
2017-09-22 22:18:51 +00:00
}
/* [MS-XLS] 2.1.7.20 Workbook Stream */
function write _biff8 _buf ( wb /*:Workbook*/ , opts /*:WriteOpts*/ ) {
var o = opts || { } ;
var bufs = [ ] ;
2018-02-08 18:21:39 +00:00
if ( wb && ! wb . SSF ) {
2022-03-20 05:29:24 +00:00
wb . SSF = dup ( table _fmt ) ;
2018-02-08 18:21:39 +00:00
}
if ( wb && wb . SSF ) {
2022-03-20 05:29:24 +00:00
make _ssf ( ) ; SSF _load _table ( wb . SSF ) ;
2018-02-08 18:21:39 +00:00
// $FlowIgnore
o . revssf = evert _num ( wb . SSF ) ; o . revssf [ wb . SSF [ 65535 ] ] = 0 ;
o . ssf = wb . SSF ;
}
2019-11-01 03:09:14 +00:00
2018-02-08 18:21:39 +00:00
o . Strings = /*::((*/ [ ] /*:: :any):SST)*/ ; o . Strings . Count = 0 ; o . Strings . Unique = 0 ;
2019-11-01 03:09:14 +00:00
fix _write _opts ( o ) ;
o . cellXfs = [ ] ;
2018-02-08 18:21:39 +00:00
get _cell _style ( o . cellXfs , { } , { revssf : { "General" : 0 } } ) ;
2019-11-01 03:09:14 +00:00
if ( ! wb . Props ) wb . Props = { } ;
2017-09-22 22:18:51 +00:00
for ( var i = 0 ; i < wb . SheetNames . length ; ++ i ) bufs [ bufs . length ] = write _ws _biff8 ( i , o , wb ) ;
bufs . unshift ( write _biff8 _global ( wb , bufs , o ) ) ;
2022-02-10 12:40:50 +00:00
return bconcat ( bufs ) ;
2017-09-22 22:18:51 +00:00
}
function write _biff _buf ( wb /*:Workbook*/ , opts /*:WriteOpts*/ ) {
2022-01-10 18:45:50 +00:00
for ( var i = 0 ; i <= wb . SheetNames . length ; ++ i ) {
var ws = wb . Sheets [ wb . SheetNames [ i ] ] ;
if ( ! ws || ! ws [ "!ref" ] ) continue ;
var range = decode _range ( ws [ "!ref" ] ) ;
if ( range . e . c > 255 ) { // note: 255 is IV
2022-05-22 23:51:41 +00:00
if ( typeof console != "undefined" && console . error ) console . error ( "Worksheet '" + wb . SheetNames [ i ] + "' extends beyond column IV (255). Data may be lost." ) ;
2022-01-10 18:45:50 +00:00
}
}
2017-09-22 22:18:51 +00:00
var o = opts || { } ;
switch ( o . biff || 2 ) {
case 8 : case 5 : return write _biff8 _buf ( wb , opts ) ;
case 4 : case 3 : case 2 : return write _biff2 _buf ( wb , opts ) ;
}
throw new Error ( "invalid type " + o . bookType + " for BIFF" ) ;
}
2017-05-17 04:23:36 +00:00
/* note: browser DOM element cannot see mso- style attrs, must parse */
2022-03-20 05:29:24 +00:00
function html _to _sheet ( str /*:string*/ , _opts ) /*:Workbook*/ {
var opts = _opts || { } ;
if ( DENSE != null && opts . dense == null ) opts . dense = DENSE ;
var ws /*:Worksheet*/ = opts . dense ? ( [ ] /*:any*/ ) : ( { } /*:any*/ ) ;
str = str . replace ( /<!--.*?-->/g , "" ) ;
var mtch /*:any*/ = str . match ( /<table/i ) ;
if ( ! mtch ) throw new Error ( "Invalid HTML: could not find <table>" ) ;
var mtch2 /*:any*/ = str . match ( /<\/table/i ) ;
var i /*:number*/ = mtch . index , j /*:number*/ = mtch2 && mtch2 . index || str . length ;
var rows = split _regex ( str . slice ( i , j ) , /(:?<tr[^>]*>)/i , "<tr>" ) ;
var R = - 1 , C = 0 , RS = 0 , CS = 0 ;
var range /*:Range*/ = { s : { r : 10000000 , c : 10000000 } , e : { r : 0 , c : 0 } } ;
var merges /*:Array<Range>*/ = [ ] ;
for ( i = 0 ; i < rows . length ; ++ i ) {
var row = rows [ i ] . trim ( ) ;
var hd = row . slice ( 0 , 3 ) . toLowerCase ( ) ;
if ( hd == "<tr" ) { ++ R ; if ( opts . sheetRows && opts . sheetRows <= R ) { -- R ; break ; } C = 0 ; continue ; }
if ( hd != "<td" && hd != "<th" ) continue ;
var cells = row . split ( /<\/t[dh]>/i ) ;
for ( j = 0 ; j < cells . length ; ++ j ) {
var cell = cells [ j ] . trim ( ) ;
if ( ! cell . match ( /<t[dh]/i ) ) continue ;
var m = cell , cc = 0 ;
/* TODO: parse styles etc */
while ( m . charAt ( 0 ) == "<" && ( cc = m . indexOf ( ">" ) ) > - 1 ) m = m . slice ( cc + 1 ) ;
for ( var midx = 0 ; midx < merges . length ; ++ midx ) {
var _merge /*:Range*/ = merges [ midx ] ;
if ( _merge . s . c == C && _merge . s . r < R && R <= _merge . e . r ) { C = _merge . e . c + 1 ; midx = - 1 ; }
2017-04-16 04:32:13 +00:00
}
2022-03-20 05:29:24 +00:00
var tag = parsexmltag ( cell . slice ( 0 , cell . indexOf ( ">" ) ) ) ;
CS = tag . colspan ? + tag . colspan : 1 ;
if ( ( RS = + tag . rowspan ) > 1 || CS > 1 ) merges . push ( { s : { r : R , c : C } , e : { r : R + ( RS || 1 ) - 1 , c : C + CS - 1 } } ) ;
var _t /*:string*/ = tag . t || tag [ "data-t" ] || "" ;
/* TODO: generate stub cells */
if ( ! m . length ) { C += CS ; continue ; }
m = htmldecode ( m ) ;
if ( range . s . r > R ) range . s . r = R ; if ( range . e . r < R ) range . e . r = R ;
if ( range . s . c > C ) range . s . c = C ; if ( range . e . c < C ) range . e . c = C ;
if ( ! m . length ) { C += CS ; continue ; }
var o /*:Cell*/ = { t : 's' , v : m } ;
if ( opts . raw || ! m . trim ( ) . length || _t == 's' ) { }
else if ( m === 'TRUE' ) o = { t : 'b' , v : true } ;
else if ( m === 'FALSE' ) o = { t : 'b' , v : false } ;
else if ( ! isNaN ( fuzzynum ( m ) ) ) o = { t : 'n' , v : fuzzynum ( m ) } ;
else if ( ! isNaN ( fuzzydate ( m ) . getDate ( ) ) ) {
o = ( { t : 'd' , v : parseDate ( m ) } /*:any*/ ) ;
if ( ! opts . cellDates ) o = ( { t : 'n' , v : datenum ( o . v ) } /*:any*/ ) ;
o . z = opts . dateNF || table _fmt [ 14 ] ;
2021-10-13 07:20:25 +00:00
}
2022-03-20 05:29:24 +00:00
if ( opts . dense ) { if ( ! ws [ R ] ) ws [ R ] = [ ] ; ws [ R ] [ C ] = o ; }
else ws [ encode _cell ( { r : R , c : C } ) ] = o ;
C += CS ;
2017-04-16 04:32:13 +00:00
}
2017-06-10 01:47:42 +00:00
}
2022-03-20 05:29:24 +00:00
ws [ '!ref' ] = encode _range ( range ) ;
if ( merges . length ) ws [ "!merges" ] = merges ;
return ws ;
}
function make _html _row ( ws /*:Worksheet*/ , r /*:Range*/ , R /*:number*/ , o /*:Sheet2HTMLOpts*/ ) /*:string*/ {
var M /*:Array<Range>*/ = ( ws [ '!merges' ] || [ ] ) ;
var oo /*:Array<string>*/ = [ ] ;
2022-05-25 01:45:55 +00:00
var sp = ( { } /*:any*/ ) ;
2022-03-20 05:29:24 +00:00
for ( var C = r . s . c ; C <= r . e . c ; ++ C ) {
var RS = 0 , CS = 0 ;
for ( var j = 0 ; j < M . length ; ++ j ) {
if ( M [ j ] . s . r > R || M [ j ] . s . c > C ) continue ;
if ( M [ j ] . e . r < R || M [ j ] . e . c < C ) continue ;
if ( M [ j ] . s . r < R || M [ j ] . s . c < C ) { RS = - 1 ; break ; }
RS = M [ j ] . e . r - M [ j ] . s . r + 1 ; CS = M [ j ] . e . c - M [ j ] . s . c + 1 ; break ;
}
if ( RS < 0 ) continue ;
var coord = encode _cell ( { r : R , c : C } ) ;
var cell = o . dense ? ( ws [ R ] || [ ] ) [ C ] : ws [ coord ] ;
/* TODO: html entities */
var w = ( cell && cell . v != null ) && ( cell . h || escapehtml ( cell . w || ( format _cell ( cell ) , cell . w ) || "" ) ) || "" ;
2022-05-25 01:45:55 +00:00
sp = ( { } /*:any*/ ) ;
2022-03-20 05:29:24 +00:00
if ( RS > 1 ) sp . rowspan = RS ;
if ( CS > 1 ) sp . colspan = CS ;
if ( o . editable ) w = '<span contenteditable="true">' + w + '</span>' ;
else if ( cell ) {
sp [ "data-t" ] = cell && cell . t || 'z' ;
if ( cell . v != null ) sp [ "data-v" ] = cell . v ;
if ( cell . z != null ) sp [ "data-z" ] = cell . z ;
if ( cell . l && ( cell . l . Target || "#" ) . charAt ( 0 ) != "#" ) w = '<a href="' + cell . l . Target + '">' + w + '</a>' ;
}
sp . id = ( o . id || "sjs" ) + "-" + coord ;
oo . push ( writextag ( 'td' , w , sp ) ) ;
2017-04-16 07:31:21 +00:00
}
2022-03-20 05:29:24 +00:00
var preamble = "<tr>" ;
return preamble + oo . join ( "" ) + "</tr>" ;
}
2017-04-16 04:32:13 +00:00
2022-03-20 05:29:24 +00:00
var HTML _BEGIN = '<html><head><meta charset="utf-8"/><title>SheetJS Table Export</title></head><body>' ;
var HTML _END = '</body></html>' ;
function html _to _workbook ( str /*:string*/ , opts ) /*:Workbook*/ {
var mtch = str . match ( /<table[\s\S]*?>[\s\S]*?<\/table>/gi ) ;
if ( ! mtch || mtch . length == 0 ) throw new Error ( "Invalid HTML: could not find <table>" ) ;
if ( mtch . length == 1 ) return sheet _to _workbook ( html _to _sheet ( mtch [ 0 ] , opts ) , opts ) ;
var wb = book _new ( ) ;
mtch . forEach ( function ( s , idx ) { book _append _sheet ( wb , html _to _sheet ( s , opts ) , "Sheet" + ( idx + 1 ) ) ; } ) ;
return wb ;
}
function make _html _preamble ( ws /*:Worksheet*/ , R /*:Range*/ , o /*:Sheet2HTMLOpts*/ ) /*:string*/ {
var out /*:Array<string>*/ = [ ] ;
return out . join ( "" ) + '<table' + ( o && o . id ? ' id="' + o . id + '"' : "" ) + '>' ;
}
function sheet _to _html ( ws /*:Worksheet*/ , opts /*:?Sheet2HTMLOpts*/ /*, wb:?Workbook*/ ) /*:string*/ {
var o = opts || { } ;
var header = o . header != null ? o . header : HTML _BEGIN ;
var footer = o . footer != null ? o . footer : HTML _END ;
var out /*:Array<string>*/ = [ header ] ;
var r = decode _range ( ws [ '!ref' ] ) ;
o . dense = Array . isArray ( ws ) ;
out . push ( make _html _preamble ( ws , r , o ) ) ;
for ( var R = r . s . r ; R <= r . e . r ; ++ R ) out . push ( make _html _row ( ws , r , R , o ) ) ;
out . push ( "</table>" + footer ) ;
return out . join ( "" ) ;
}
2017-03-29 19:14:15 +00:00
2020-07-31 03:38:44 +00:00
function sheet _add _dom ( ws /*:Worksheet*/ , table /*:HTMLElement*/ , _opts /*:?any*/ ) /*:Worksheet*/ {
2022-05-25 01:45:55 +00:00
var rows /*:HTMLCollection<HTMLTableRowElement>*/ = table . rows ;
if ( ! rows ) {
/* not an HTML TABLE */
throw "Unsupported origin when " + table . tagName + " is not a TABLE" ;
}
2017-04-08 06:55:35 +00:00
var opts = _opts || { } ;
if ( DENSE != null ) opts . dense = DENSE ;
2020-07-31 03:38:44 +00:00
var or _R = 0 , or _C = 0 ;
if ( opts . origin != null ) {
if ( typeof opts . origin == 'number' ) or _R = opts . origin ;
else {
var _origin /*:CellAddress*/ = typeof opts . origin == "string" ? decode _cell ( opts . origin ) : opts . origin ;
or _R = _origin . r ; or _C = _origin . c ;
}
}
2022-02-10 12:40:50 +00:00
2020-07-31 03:38:44 +00:00
var sheetRows = Math . min ( opts . sheetRows || 10000000 , rows . length ) ;
var range /*:Range*/ = { s : { r : 0 , c : 0 } , e : { r : or _R , c : or _C } } ;
if ( ws [ "!ref" ] ) {
var _range /*:Range*/ = decode _range ( ws [ "!ref" ] ) ;
range . s . r = Math . min ( range . s . r , _range . s . r ) ;
range . s . c = Math . min ( range . s . c , _range . s . c ) ;
range . e . r = Math . max ( range . e . r , _range . e . r ) ;
range . e . c = Math . max ( range . e . c , _range . e . c ) ;
if ( or _R == - 1 ) range . e . r = or _R = _range . e . r + 1 ;
}
2017-12-30 05:40:35 +00:00
var merges /*:Array<Range>*/ = [ ] , midx = 0 ;
2020-07-31 03:38:44 +00:00
var rowinfo /*:Array<RowInfo>*/ = ws [ "!rows" ] || ( ws [ "!rows" ] = [ ] ) ;
2019-11-01 03:09:14 +00:00
var _R = 0 , R = 0 , _C = 0 , C = 0 , RS = 0 , CS = 0 ;
2020-07-31 03:38:44 +00:00
if ( ! ws [ "!cols" ] ) ws [ '!cols' ] = [ ] ;
2018-05-27 07:27:47 +00:00
for ( ; _R < rows . length && R < sheetRows ; ++ _R ) {
var row /*:HTMLTableRowElement*/ = rows [ _R ] ;
if ( is _dom _element _hidden ( row ) ) {
if ( opts . display ) continue ;
rowinfo [ R ] = { hidden : true } ;
}
2022-05-25 01:45:55 +00:00
var elts /*:HTMLCollection<HTMLTableCellElement>*/ = ( row . cells ) ;
2017-03-29 19:14:15 +00:00
for ( _C = C = 0 ; _C < elts . length ; ++ _C ) {
2018-05-27 07:27:47 +00:00
var elt /*:HTMLTableCellElement*/ = elts [ _C ] ;
if ( opts . display && is _dom _element _hidden ( elt ) ) continue ;
2021-10-13 07:20:25 +00:00
var v /*:?string*/ = elt . hasAttribute ( 'data-v' ) ? elt . getAttribute ( 'data-v' ) : elt . hasAttribute ( 'v' ) ? elt . getAttribute ( 'v' ) : htmldecode ( elt . innerHTML ) ;
var z /*:?string*/ = elt . getAttribute ( 'data-z' ) || elt . getAttribute ( 'z' ) ;
2017-03-29 19:14:15 +00:00
for ( midx = 0 ; midx < merges . length ; ++ midx ) {
2017-12-30 05:40:35 +00:00
var m /*:Range*/ = merges [ midx ] ;
2020-07-31 03:38:44 +00:00
if ( m . s . c == C + or _C && m . s . r < R + or _R && R + or _R <= m . e . r ) { C = m . e . c + 1 - or _C ; midx = - 1 ; }
2017-03-29 19:14:15 +00:00
}
/* TODO: figure out how to extract nonstandard mso- style */
CS = + elt . getAttribute ( "colspan" ) || 1 ;
2020-07-31 03:38:44 +00:00
if ( ( ( RS = ( + elt . getAttribute ( "rowspan" ) || 1 ) ) ) > 1 || CS > 1 ) merges . push ( { s : { r : R + or _R , c : C + or _C } , e : { r : R + or _R + ( RS || 1 ) - 1 , c : C + or _C + ( CS || 1 ) - 1 } } ) ;
2017-05-17 04:23:36 +00:00
var o /*:Cell*/ = { t : 's' , v : v } ;
2021-10-13 07:20:25 +00:00
var _t /*:string*/ = elt . getAttribute ( "data-t" ) || elt . getAttribute ( "t" ) || "" ;
2017-08-18 18:10:18 +00:00
if ( v != null ) {
2017-12-12 06:21:28 +00:00
if ( v . length == 0 ) o . t = _t || 'z' ;
else if ( opts . raw || v . trim ( ) . length == 0 || _t == "s" ) { }
2017-08-18 18:10:18 +00:00
else if ( v === 'TRUE' ) o = { t : 'b' , v : true } ;
else if ( v === 'FALSE' ) o = { t : 'b' , v : false } ;
2017-08-09 22:38:23 +00:00
else if ( ! isNaN ( fuzzynum ( v ) ) ) o = { t : 'n' , v : fuzzynum ( v ) } ;
2017-05-17 04:23:36 +00:00
else if ( ! isNaN ( fuzzydate ( v ) . getDate ( ) ) ) {
o = ( { t : 'd' , v : parseDate ( v ) } /*:any*/ ) ;
if ( ! opts . cellDates ) o = ( { t : 'n' , v : datenum ( o . v ) } /*:any*/ ) ;
2022-03-20 05:29:24 +00:00
o . z = opts . dateNF || table _fmt [ 14 ] ;
2017-05-17 04:23:36 +00:00
}
}
2020-05-16 19:45:54 +00:00
if ( o . z === undefined && z != null ) o . z = z ;
2021-10-13 07:20:25 +00:00
/ * T h e f i r s t l i n k i s u s e d . L i n k s a r e a s s u m e d t o b e f u l l y s p e c i f i e d .
* TODO : The right way to process relative links is to make a new < a > * /
var l = "" , Aelts = elt . getElementsByTagName ( "A" ) ;
if ( Aelts && Aelts . length ) for ( var Aelti = 0 ; Aelti < Aelts . length ; ++ Aelti ) if ( Aelts [ Aelti ] . hasAttribute ( "href" ) ) {
l = Aelts [ Aelti ] . getAttribute ( "href" ) ; if ( l . charAt ( 0 ) != "#" ) break ;
}
2022-05-09 06:49:17 +00:00
if ( l && l . charAt ( 0 ) != "#" && l . slice ( 0 , 11 ) . toLowerCase ( ) != 'javascript:' ) o . l = ( { Target : l } ) ;
2020-07-31 03:38:44 +00:00
if ( opts . dense ) { if ( ! ws [ R + or _R ] ) ws [ R + or _R ] = [ ] ; ws [ R + or _R ] [ C + or _C ] = o ; }
else ws [ encode _cell ( { c : C + or _C , r : R + or _R } ) ] = o ;
if ( range . e . c < C + or _C ) range . e . c = C + or _C ;
2017-03-29 19:14:15 +00:00
C += CS ;
}
2018-05-27 07:27:47 +00:00
++ R ;
2017-03-29 19:14:15 +00:00
}
2020-07-31 03:38:44 +00:00
if ( merges . length ) ws [ '!merges' ] = ( ws [ "!merges" ] || [ ] ) . concat ( merges ) ;
range . e . r = Math . max ( range . e . r , R - 1 + or _R ) ;
2017-04-01 07:32:12 +00:00
ws [ '!ref' ] = encode _range ( range ) ;
2020-07-31 03:38:44 +00:00
if ( R >= sheetRows ) ws [ '!fullref' ] = encode _range ( ( range . e . r = rows . length - _R + R - 1 + or _R , range ) ) ; // We can count the real number of rows to parse but we don't to improve the performance
2017-03-29 19:14:15 +00:00
return ws ;
}
2020-07-31 03:38:44 +00:00
function parse _dom _table ( table /*:HTMLElement*/ , _opts /*:?any*/ ) /*:Worksheet*/ {
var opts = _opts || { } ;
var ws /*:Worksheet*/ = opts . dense ? ( [ ] /*:any*/ ) : ( { } /*:any*/ ) ;
return sheet _add _dom ( ws , table , _opts ) ;
}
2017-03-29 19:14:15 +00:00
function table _to _book ( table /*:HTMLElement*/ , opts /*:?any*/ ) /*:Workbook*/ {
return sheet _to _workbook ( parse _dom _table ( table , opts ) , opts ) ;
}
2018-05-27 07:27:47 +00:00
function is _dom _element _hidden ( element /*:HTMLElement*/ ) /*:boolean*/ {
var display /*:string*/ = '' ;
var get _computed _style /*:?function*/ = get _get _computed _style _function ( element ) ;
if ( get _computed _style ) display = get _computed _style ( element ) . getPropertyValue ( 'display' ) ;
2022-02-10 12:40:50 +00:00
if ( ! display ) display = element . style && element . style . display ;
2018-05-27 07:27:47 +00:00
return display === 'none' ;
}
/* global getComputedStyle */
function get _get _computed _style _function ( element /*:HTMLElement*/ ) /*:?function*/ {
// The proper getComputedStyle implementation is the one defined in the element window
if ( element . ownerDocument . defaultView && typeof element . ownerDocument . defaultView . getComputedStyle === 'function' ) return element . ownerDocument . defaultView . getComputedStyle ;
// If it is not available, try to get one from the global namespace
if ( typeof getComputedStyle === 'function' ) return getComputedStyle ;
return null ;
2022-05-25 01:45:55 +00:00
}
/* OpenDocument */
2022-03-12 14:05:57 +00:00
function parse _text _p ( text /*:string*/ /*::, tag*/ ) /*:Array<any>*/ {
/* 6.1.2 White Space Characters */
var fixed = text
. replace ( /[\t\r\n]/g , " " ) . trim ( ) . replace ( / +/g , " " )
. replace ( /<text:s\/>/g , " " )
. replace ( /<text:s text:c="(\d+)"\/>/g , function ( $$ , $1 ) { return Array ( parseInt ( $1 , 10 ) + 1 ) . join ( " " ) ; } )
. replace ( /<text:tab[^>]*\/>/g , "\t" )
. replace ( /<text:line-break\/>/g , "\n" ) ;
var v = unescapexml ( fixed . replace ( /<[^>]*>/g , "" ) ) ;
return [ v ] ;
}
2022-06-09 04:45:22 +00:00
/* Note: ODS can stick styles in content.xml or styles.xml, FODS blurs lines */
function parse _ods _styles ( d /*:string*/ , _opts , _nfm ) {
var number _format _map = _nfm || { } ;
var str = xlml _normalize ( d ) ;
xlmlregex . lastIndex = 0 ;
str = str . replace ( /<!--([\s\S]*?)-->/mg , "" ) . replace ( /<!DOCTYPE[^\[]*\[[^\]]*\]>/gm , "" ) ;
var Rn , NFtag , NF = "" , tNF = "" , y , etpos = 0 , tidx = - 1 , infmt = false , payload = "" ;
while ( ( Rn = xlmlregex . exec ( str ) ) ) {
switch ( ( Rn [ 3 ] = Rn [ 3 ] . replace ( /_.*$/ , "" ) ) ) {
/* Number Format Definitions */
case 'number-style' : // <number:number-style> 16.29.2
case 'currency-style' : // <number:currency-style> 16.29.8
case 'percentage-style' : // <number:percentage-style> 16.29.10
case 'date-style' : // <number:date-style> 16.29.11
case 'time-style' : // <number:time-style> 16.29.19
case 'text-style' : // <number:text-style> 16.29.26
if ( Rn [ 1 ] === '/' ) {
infmt = false ;
if ( NFtag [ 'truncate-on-overflow' ] == "false" ) {
if ( NF . match ( /h/ ) ) NF = NF . replace ( /h+/ , "[$&]" ) ;
else if ( NF . match ( /m/ ) ) NF = NF . replace ( /m+/ , "[$&]" ) ;
else if ( NF . match ( /s/ ) ) NF = NF . replace ( /s+/ , "[$&]" ) ;
}
number _format _map [ NFtag . name ] = NF ;
NF = "" ;
} else if ( Rn [ 0 ] . charAt ( Rn [ 0 ] . length - 2 ) !== '/' ) {
infmt = true ;
NF = "" ;
NFtag = parsexmltag ( Rn [ 0 ] , false ) ;
} break ;
// LibreOffice bug https://bugs.documentfoundation.org/show_bug.cgi?id=149484
case 'boolean-style' : // <number:boolean-style> 16.29.24
if ( Rn [ 1 ] === '/' ) {
infmt = false ;
number _format _map [ NFtag . name ] = "General" ;
NF = "" ;
} else if ( Rn [ 0 ] . charAt ( Rn [ 0 ] . length - 2 ) !== '/' ) {
infmt = true ;
NF = "" ;
NFtag = parsexmltag ( Rn [ 0 ] , false ) ;
} break ;
/* Number Format Elements */
case 'boolean' : // <number:boolean> 16.29.25
NF += "General" ; // ODF spec is unfortunately underspecified here
break ;
case 'text' : // <number:text> 16.29.27
if ( Rn [ 1 ] === '/' ) {
payload = str . slice ( tidx , xlmlregex . lastIndex - Rn [ 0 ] . length ) ;
// NOTE: Excel has a different interpretation of "%%" and friends
if ( payload == "%" && NFtag [ 0 ] == '<number:percentage-style' ) NF += "%" ;
else NF += '"' + payload . replace ( /"/g , '""' ) + '"' ;
} else if ( Rn [ 0 ] . charAt ( Rn [ 0 ] . length - 2 ) !== '/' ) {
tidx = xlmlregex . lastIndex ;
} break ;
case 'day' : { // <number:day> 16.29.12
y = parsexmltag ( Rn [ 0 ] , false ) ;
switch ( y [ "style" ] ) {
case "short" : NF += "d" ; break ;
case "long" : NF += "dd" ; break ;
default : NF += "dd" ; break ; // TODO: error condition
}
} break ;
case 'day-of-week' : { // <number:day-of-week> 16.29.16
y = parsexmltag ( Rn [ 0 ] , false ) ;
switch ( y [ "style" ] ) {
case "short" : NF += "ddd" ; break ;
case "long" : NF += "dddd" ; break ;
default : NF += "ddd" ; break ;
}
} break ;
case 'era' : { // <number:era> 16.29.15 TODO: proper mapping
y = parsexmltag ( Rn [ 0 ] , false ) ;
switch ( y [ "style" ] ) {
case "short" : NF += "ee" ; break ;
case "long" : NF += "eeee" ; break ;
default : NF += "eeee" ; break ; // TODO: error condition
}
} break ;
case 'hours' : { // <number:hours> 16.29.20
y = parsexmltag ( Rn [ 0 ] , false ) ;
switch ( y [ "style" ] ) {
case "short" : NF += "h" ; break ;
case "long" : NF += "hh" ; break ;
default : NF += "hh" ; break ; // TODO: error condition
}
} break ;
2017-03-10 01:09:18 +00:00
2022-06-09 04:45:22 +00:00
case 'minutes' : { // <number:minutes> 16.29.21
y = parsexmltag ( Rn [ 0 ] , false ) ;
switch ( y [ "style" ] ) {
case "short" : NF += "m" ; break ;
case "long" : NF += "mm" ; break ;
default : NF += "mm" ; break ; // TODO: error condition
}
} break ;
2017-03-10 01:09:18 +00:00
2022-06-09 04:45:22 +00:00
case 'month' : { // <number:month> 16.29.13
y = parsexmltag ( Rn [ 0 ] , false ) ;
if ( y [ "textual" ] ) NF += "mm" ;
switch ( y [ "style" ] ) {
case "short" : NF += "m" ; break ;
case "long" : NF += "mm" ; break ;
default : NF += "m" ; break ;
}
} break ;
case 'seconds' : { // <number:seconds> 16.29.22
y = parsexmltag ( Rn [ 0 ] , false ) ;
switch ( y [ "style" ] ) {
case "short" : NF += "s" ; break ;
case "long" : NF += "ss" ; break ;
default : NF += "ss" ; break ; // TODO: error condition
}
if ( y [ "decimal-places" ] ) NF += "." + fill ( "0" , + y [ "decimal-places" ] ) ;
} break ;
case 'year' : { // <number:year> 16.29.14
y = parsexmltag ( Rn [ 0 ] , false ) ;
switch ( y [ "style" ] ) {
case "short" : NF += "yy" ; break ;
case "long" : NF += "yyyy" ; break ;
default : NF += "yy" ; break ; // TODO: error condition
}
} break ;
case 'am-pm' : // <number:am-pm> 16.29.23
NF += "AM/PM" ; // LO autocorrects A/P -> AM/PM
break ;
case 'week-of-year' : // <number:week-of-year> 16.29.17
case 'quarter' : // <number:quarter> 16.29.18
console . error ( "Excel does not support ODS format token " + Rn [ 3 ] ) ;
break ;
case 'fill-character' : // <number:fill-character> 16.29.5
if ( Rn [ 1 ] === '/' ) {
payload = str . slice ( tidx , xlmlregex . lastIndex - Rn [ 0 ] . length ) ;
// NOTE: Excel has a different interpretation of "%%" and friends
NF += '"' + payload . replace ( /"/g , '""' ) + '"*' ;
} else if ( Rn [ 0 ] . charAt ( Rn [ 0 ] . length - 2 ) !== '/' ) {
tidx = xlmlregex . lastIndex ;
} break ;
case 'scientific-number' : // <number:scientific-number> 16.29.6
// TODO: find a mapping for all parameters
y = parsexmltag ( Rn [ 0 ] , false ) ;
NF += "0." + fill ( "0" , + y [ "min-decimal-places" ] || + y [ "decimal-places" ] || 2 ) + fill ( "?" , + y [ "decimal-places" ] - + y [ "min-decimal-places" ] || 0 ) + "E" + ( parsexmlbool ( y [ "forced-exponent-sign" ] ) ? "+" : "" ) + fill ( "0" , + y [ "min-exponent-digits" ] || 2 ) ;
break ;
case 'fraction' : // <number:fraction> 16.29.7
// TODO: find a mapping for all parameters
y = parsexmltag ( Rn [ 0 ] , false ) ;
if ( ! + y [ "min-integer-digits" ] ) NF += "#" ;
else NF += fill ( "0" , + y [ "min-integer-digits" ] ) ;
NF += " " ;
NF += fill ( "?" , + y [ "min-numerator-digits" ] || 1 ) ;
NF += "/" ;
if ( + y [ "denominator-value" ] ) NF += y [ "denominator-value" ] ;
else NF += fill ( "?" , + y [ "min-denominator-digits" ] || 1 ) ;
break ;
case 'currency-symbol' : // <number:currency-symbol> 16.29.9
// TODO: localization with [$-...]
if ( Rn [ 1 ] === '/' ) {
NF += '"' + str . slice ( tidx , xlmlregex . lastIndex - Rn [ 0 ] . length ) . replace ( /"/g , '""' ) + '"' ;
} else if ( Rn [ 0 ] . charAt ( Rn [ 0 ] . length - 2 ) !== '/' ) {
tidx = xlmlregex . lastIndex ;
} else NF += "$" ;
break ;
case 'text-properties' : // <style:text-properties> 16.29.29
y = parsexmltag ( Rn [ 0 ] , false ) ;
switch ( ( y [ "color" ] || "" ) . toLowerCase ( ) . replace ( "#" , "" ) ) {
case "ff0000" : case "red" : NF = "[Red]" + NF ; break ;
}
break ;
case 'text-content' : // <number:text-content> 16.29.28
NF += "@" ;
break ;
case 'map' : // <style:map> 16.3
// TODO: handle more complex maps
y = parsexmltag ( Rn [ 0 ] , false ) ;
if ( unescapexml ( y [ "condition" ] ) == "value()>=0" ) NF = number _format _map [ y [ "apply-style-name" ] ] + ";" + NF ;
else console . error ( "ODS number format may be incorrect: " + y [ "condition" ] ) ;
break ;
case 'number' : // <number:number> 16.29.3
// TODO: handle all the attributes
if ( Rn [ 1 ] === '/' ) break ;
y = parsexmltag ( Rn [ 0 ] , false ) ;
tNF = "" ;
tNF += fill ( "0" , + y [ "min-integer-digits" ] || 1 ) ;
if ( parsexmlbool ( y [ "grouping" ] ) ) tNF = commaify ( fill ( "#" , Math . max ( 0 , 4 - tNF . length ) ) + tNF ) ;
if ( + y [ "min-decimal-places" ] || + y [ "decimal-places" ] ) tNF += "." ;
if ( + y [ "min-decimal-places" ] ) tNF += fill ( "0" , + y [ "min-decimal-places" ] || 1 ) ;
if ( + y [ "decimal-places" ] - ( + y [ "min-decimal-places" ] || 0 ) ) tNF += fill ( "0" , + y [ "decimal-places" ] - ( + y [ "min-decimal-places" ] || 0 ) ) ; // TODO: should this be "#" ?
NF += tNF ;
break ;
case 'embedded-text' : // <number:embedded-text> 16.29.4
// TODO: verify interplay with grouping et al
if ( Rn [ 1 ] === '/' ) {
if ( etpos == 0 ) NF += '"' + str . slice ( tidx , xlmlregex . lastIndex - Rn [ 0 ] . length ) . replace ( /"/g , '""' ) + '"' ;
else NF = NF . slice ( 0 , etpos ) + '"' + str . slice ( tidx , xlmlregex . lastIndex - Rn [ 0 ] . length ) . replace ( /"/g , '""' ) + '"' + NF . slice ( etpos ) ;
} else if ( Rn [ 0 ] . charAt ( Rn [ 0 ] . length - 2 ) !== '/' ) {
tidx = xlmlregex . lastIndex ;
etpos = - + parsexmltag ( Rn [ 0 ] , false ) [ "position" ] || 0 ;
} break ;
} }
return number _format _map ;
}
function parse _content _xml ( d /*:string*/ , _opts , _nfm ) /*:Workbook*/ {
2017-03-10 01:09:18 +00:00
var opts = _opts || { } ;
2017-04-09 04:03:19 +00:00
if ( DENSE != null && opts . dense == null ) opts . dense = DENSE ;
2017-03-10 01:09:18 +00:00
var str = xlml _normalize ( d ) ;
var state /*:Array<any>*/ = [ ] , tmp ;
var tag /*:: = {}*/ ;
2022-06-09 04:45:22 +00:00
var nfidx , NF = "" , pidx = 0 ;
2017-03-10 01:09:18 +00:00
var sheetag /*:: = {name:"", '名称':""}*/ ;
var rowtag /*:: = {'行号':""}*/ ;
2017-04-08 06:55:35 +00:00
var Sheets = { } , SheetNames /*:Array<string>*/ = [ ] ;
var ws = opts . dense ? ( [ ] /*:any*/ ) : ( { } /*:any*/ ) ;
2017-12-15 01:18:40 +00:00
var Rn , q /*:: :any = ({t:"", v:null, z:null, w:"",c:[],}:any)*/ ;
2017-10-17 00:14:32 +00:00
var ctag = ( { value : "" } /*:any*/ ) ;
2017-03-10 01:09:18 +00:00
var textp = "" , textpidx = 0 , textptag /*:: = {}*/ ;
2019-04-01 14:25:15 +00:00
var textR = [ ] ;
2017-03-10 01:09:18 +00:00
var R = - 1 , C = - 1 , range = { s : { r : 1000000 , c : 10000000 } , e : { r : 0 , c : 0 } } ;
2017-10-17 00:14:32 +00:00
var row _ol = 0 ;
2022-06-09 04:45:22 +00:00
var number _format _map = _nfm || { } , styles = { } ;
2017-12-30 05:40:35 +00:00
var merges /*:Array<Range>*/ = [ ] , mrange = { } , mR = 0 , mC = 0 ;
var rowinfo /*:Array<RowInfo>*/ = [ ] , rowpeat = 1 , colpeat = 1 ;
var arrayf /*:Array<[Range, string]>*/ = [ ] ;
2022-06-06 23:05:27 +00:00
var WB = { Names : [ ] , WBProps : { } } ;
2017-12-15 01:18:40 +00:00
var atag = ( { } /*:any*/ ) ;
var _Ref /*:[string, string]*/ = [ "" , "" ] ;
2017-12-30 05:40:35 +00:00
var comments /*:Array<Comment>*/ = [ ] , comment /*:Comment*/ = ( { } /*:any*/ ) ;
2017-04-02 06:47:25 +00:00
var creator = "" , creatoridx = 0 ;
2017-12-15 01:18:40 +00:00
var isstub = false , intable = false ;
2017-03-10 01:09:18 +00:00
var i = 0 ;
2022-06-09 04:45:22 +00:00
var baddate = 0 ;
2017-03-10 01:09:18 +00:00
xlmlregex . lastIndex = 0 ;
2017-06-24 06:51:37 +00:00
str = str . replace ( /<!--([\s\S]*?)-->/mg , "" ) . replace ( /<!DOCTYPE[^\[]*\[[^\]]*\]>/gm , "" ) ;
2017-03-10 01:09:18 +00:00
while ( ( Rn = xlmlregex . exec ( str ) ) ) switch ( ( Rn [ 3 ] = Rn [ 3 ] . replace ( /_.*$/ , "" ) ) ) {
case 'table' : case '工作表' : // 9.1.2 <table:table>
if ( Rn [ 1 ] === '/' ) {
if ( range . e . c >= range . s . c && range . e . r >= range . s . r ) ws [ '!ref' ] = encode _range ( range ) ;
2020-10-06 21:13:46 +00:00
else ws [ '!ref' ] = "A1:A1" ;
2018-04-06 06:39:48 +00:00
if ( opts . sheetRows > 0 && opts . sheetRows <= range . e . r ) {
ws [ '!fullref' ] = ws [ '!ref' ] ;
range . e . r = opts . sheetRows - 1 ;
ws [ '!ref' ] = encode _range ( range ) ;
}
2017-03-10 01:09:18 +00:00
if ( merges . length ) ws [ '!merges' ] = merges ;
2017-10-17 00:14:32 +00:00
if ( rowinfo . length ) ws [ "!rows" ] = rowinfo ;
2018-08-25 23:44:35 +00:00
sheetag . name = sheetag [ '名称' ] || sheetag . name ;
2018-02-28 10:41:49 +00:00
if ( typeof JSON !== 'undefined' ) JSON . stringify ( sheetag ) ;
2017-03-10 01:09:18 +00:00
SheetNames . push ( sheetag . name ) ;
Sheets [ sheetag . name ] = ws ;
2017-12-15 01:18:40 +00:00
intable = false ;
2017-03-10 01:09:18 +00:00
}
else if ( Rn [ 0 ] . charAt ( Rn [ 0 ] . length - 2 ) !== '/' ) {
sheetag = parsexmltag ( Rn [ 0 ] , false ) ;
R = C = - 1 ;
range . s . r = range . s . c = 10000000 ; range . e . r = range . e . c = 0 ;
2017-04-08 06:55:35 +00:00
ws = opts . dense ? ( [ ] /*:any*/ ) : ( { } /*:any*/ ) ; merges = [ ] ;
2017-10-17 00:14:32 +00:00
rowinfo = [ ] ;
2017-12-15 01:18:40 +00:00
intable = true ;
2017-03-10 01:09:18 +00:00
}
break ;
2017-10-17 00:14:32 +00:00
case 'table-row-group' : // 9.1.9 <table:table-row-group>
if ( Rn [ 1 ] === "/" ) -- row _ol ; else ++ row _ol ;
break ;
2017-03-10 01:09:18 +00:00
case 'table-row' : case '行' : // 9.1.3 <table:table-row>
2017-10-17 00:14:32 +00:00
if ( Rn [ 1 ] === '/' ) { R += rowpeat ; rowpeat = 1 ; break ; }
2017-03-10 01:09:18 +00:00
rowtag = parsexmltag ( Rn [ 0 ] , false ) ;
2017-10-17 00:14:32 +00:00
if ( rowtag [ '行号' ] ) R = rowtag [ '行号' ] - 1 ; else if ( R == - 1 ) R = 0 ;
rowpeat = + rowtag [ 'number-rows-repeated' ] || 1 ;
/* TODO: remove magic */
if ( rowpeat < 10 ) for ( i = 0 ; i < rowpeat ; ++ i ) if ( row _ol > 0 ) rowinfo [ R + i ] = { level : row _ol } ;
2017-03-10 01:09:18 +00:00
C = - 1 ; break ;
2017-03-15 08:19:02 +00:00
case 'covered-table-cell' : // 9.1.5 <table:covered-table-cell>
2019-04-01 14:25:15 +00:00
if ( Rn [ 1 ] !== '/' ) ++ C ;
2017-04-08 06:55:35 +00:00
if ( opts . sheetStubs ) {
if ( opts . dense ) { if ( ! ws [ R ] ) ws [ R ] = [ ] ; ws [ R ] [ C ] = { t : 'z' } ; }
else ws [ encode _cell ( { r : R , c : C } ) ] = { t : 'z' } ;
}
2019-04-01 14:25:15 +00:00
textp = "" ; textR = [ ] ;
2017-03-15 08:19:02 +00:00
break ; /* stub */
2017-03-10 01:09:18 +00:00
case 'table-cell' : case '数据' :
if ( Rn [ 0 ] . charAt ( Rn [ 0 ] . length - 2 ) === '/' ) {
2017-10-17 00:14:32 +00:00
++ C ;
2017-03-10 01:09:18 +00:00
ctag = parsexmltag ( Rn [ 0 ] , false ) ;
2017-10-17 00:14:32 +00:00
colpeat = parseInt ( ctag [ 'number-columns-repeated' ] || "1" , 10 ) ;
q = ( { t : 'z' , v : null /*:: , z:null, w:"",c:[]*/ } /*:any*/ ) ;
if ( ctag . formula && opts . cellFormula != false ) q . f = ods _to _csf _formula ( unescapexml ( ctag . formula ) ) ;
2022-06-09 04:45:22 +00:00
if ( ctag [ "style-name" ] && styles [ ctag [ "style-name" ] ] ) q . z = styles [ ctag [ "style-name" ] ] ;
2017-10-17 00:14:32 +00:00
if ( ( ctag [ '数据类型' ] || ctag [ 'value-type' ] ) == "string" ) {
q . t = "s" ; q . v = unescapexml ( ctag [ 'string-value' ] || "" ) ;
if ( opts . dense ) {
if ( ! ws [ R ] ) ws [ R ] = [ ] ;
ws [ R ] [ C ] = q ;
} else {
ws [ encode _cell ( { r : R , c : C } ) ] = q ;
}
}
C += colpeat - 1 ;
} else if ( Rn [ 1 ] !== '/' ) {
2017-03-10 01:09:18 +00:00
++ C ;
2021-11-14 04:38:00 +00:00
textp = "" ; textpidx = 0 ; textR = [ ] ;
2017-10-17 00:14:32 +00:00
colpeat = 1 ;
2018-01-23 09:07:51 +00:00
var rptR = rowpeat ? R + rowpeat - 1 : R ;
2017-03-10 01:09:18 +00:00
if ( C > range . e . c ) range . e . c = C ;
if ( C < range . s . c ) range . s . c = C ;
if ( R < range . s . r ) range . s . r = R ;
2018-01-23 09:07:51 +00:00
if ( rptR > range . e . r ) range . e . r = rptR ;
2017-03-10 01:09:18 +00:00
ctag = parsexmltag ( Rn [ 0 ] , false ) ;
2017-12-30 05:40:35 +00:00
comments = [ ] ; comment = ( { } /*:any*/ ) ;
2017-04-03 00:16:03 +00:00
q = ( { t : ctag [ '数据类型' ] || ctag [ 'value-type' ] , v : null /*:: , z:null, w:"",c:[]*/ } /*:any*/ ) ;
2022-06-09 04:45:22 +00:00
if ( ctag [ "style-name" ] && styles [ ctag [ "style-name" ] ] ) q . z = styles [ ctag [ "style-name" ] ] ;
2017-03-10 01:09:18 +00:00
if ( opts . cellFormula ) {
2017-03-18 00:45:06 +00:00
if ( ctag . formula ) ctag . formula = unescapexml ( ctag . formula ) ;
2017-03-10 01:09:18 +00:00
if ( ctag [ 'number-matrix-columns-spanned' ] && ctag [ 'number-matrix-rows-spanned' ] ) {
mR = parseInt ( ctag [ 'number-matrix-rows-spanned' ] , 10 ) || 0 ;
mC = parseInt ( ctag [ 'number-matrix-columns-spanned' ] , 10 ) || 0 ;
mrange = { s : { r : R , c : C } , e : { r : R + mR - 1 , c : C + mC - 1 } } ;
q . F = encode _range ( mrange ) ;
arrayf . push ( [ mrange , q . F ] ) ;
}
if ( ctag . formula ) q . f = ods _to _csf _formula ( ctag . formula ) ;
else for ( i = 0 ; i < arrayf . length ; ++ i )
if ( R >= arrayf [ i ] [ 0 ] . s . r && R <= arrayf [ i ] [ 0 ] . e . r )
if ( C >= arrayf [ i ] [ 0 ] . s . c && C <= arrayf [ i ] [ 0 ] . e . c )
q . F = arrayf [ i ] [ 1 ] ;
}
if ( ctag [ 'number-columns-spanned' ] || ctag [ 'number-rows-spanned' ] ) {
mR = parseInt ( ctag [ 'number-rows-spanned' ] , 10 ) || 0 ;
mC = parseInt ( ctag [ 'number-columns-spanned' ] , 10 ) || 0 ;
mrange = { s : { r : R , c : C } , e : { r : R + mR - 1 , c : C + mC - 1 } } ;
merges . push ( mrange ) ;
}
/* 19.675.2 table:number-columns-repeated */
2017-10-17 00:14:32 +00:00
if ( ctag [ 'number-columns-repeated' ] ) colpeat = parseInt ( ctag [ 'number-columns-repeated' ] , 10 ) ;
2017-03-10 01:09:18 +00:00
/* 19.385 office:value-type */
switch ( q . t ) {
2022-06-09 04:45:22 +00:00
case 'boolean' : q . t = 'b' ; q . v = parsexmlbool ( ctag [ 'boolean-value' ] ) || ( + ctag [ 'boolean-value' ] >= 1 ) ; break ;
2017-03-10 01:09:18 +00:00
case 'float' : q . t = 'n' ; q . v = parseFloat ( ctag . value ) ; break ;
case 'percentage' : q . t = 'n' ; q . v = parseFloat ( ctag . value ) ; break ;
case 'currency' : q . t = 'n' ; q . v = parseFloat ( ctag . value ) ; break ;
2017-03-23 01:18:40 +00:00
case 'date' : q . t = 'd' ; q . v = parseDate ( ctag [ 'date-value' ] ) ;
2022-06-06 23:05:27 +00:00
if ( ! opts . cellDates ) { q . t = 'n' ; q . v = datenum ( q . v , WB . WBProps . date1904 ) - baddate ; }
2022-06-09 04:45:22 +00:00
if ( ! q . z ) q . z = 'm/d/yy' ; break ;
2021-10-13 07:20:25 +00:00
case 'time' : q . t = 'n' ; q . v = parse _isodur ( ctag [ 'time-value' ] ) / 86400 ;
if ( opts . cellDates ) { q . t = 'd' ; q . v = numdate ( q . v ) ; }
2022-06-09 04:45:22 +00:00
if ( ! q . z ) q . z = 'HH:MM:SS' ; break ;
2017-03-10 01:09:18 +00:00
case 'number' : q . t = 'n' ; q . v = parseFloat ( ctag [ '数据数值' ] ) ; break ;
default :
if ( q . t === 'string' || q . t === 'text' || ! q . t ) {
q . t = 's' ;
2019-04-01 14:25:15 +00:00
if ( ctag [ 'string-value' ] != null ) { textp = unescapexml ( ctag [ 'string-value' ] ) ; textR = [ ] ; }
2017-03-10 01:09:18 +00:00
} else throw new Error ( 'Unsupported value type ' + q . t ) ;
}
} else {
isstub = false ;
if ( q . t === 's' ) {
q . v = textp || '' ;
2019-04-01 14:25:15 +00:00
if ( textR . length ) q . R = textR ;
2017-03-10 01:09:18 +00:00
isstub = textpidx == 0 ;
}
2017-12-15 01:18:40 +00:00
if ( atag . Target ) q . l = atag ;
2017-04-02 06:47:25 +00:00
if ( comments . length > 0 ) { q . c = comments ; comments = [ ] ; }
2017-04-26 02:27:12 +00:00
if ( textp && opts . cellText !== false ) q . w = textp ;
2020-03-15 07:42:05 +00:00
if ( isstub ) { q . t = "z" ; delete q . v ; }
2017-03-15 08:19:02 +00:00
if ( ! isstub || opts . sheetStubs ) {
2018-04-06 06:39:48 +00:00
if ( ! ( opts . sheetRows && opts . sheetRows <= R ) ) {
2017-10-17 00:14:32 +00:00
for ( var rpt = 0 ; rpt < rowpeat ; ++ rpt ) {
colpeat = parseInt ( ctag [ 'number-columns-repeated' ] || "1" , 10 ) ;
if ( opts . dense ) {
if ( ! ws [ R + rpt ] ) ws [ R + rpt ] = [ ] ;
ws [ R + rpt ] [ C ] = rpt == 0 ? q : dup ( q ) ;
while ( -- colpeat > 0 ) ws [ R + rpt ] [ C + colpeat ] = dup ( q ) ;
} else {
ws [ encode _cell ( { r : R + rpt , c : C } ) ] = q ;
while ( -- colpeat > 0 ) ws [ encode _cell ( { r : R + rpt , c : C + colpeat } ) ] = dup ( q ) ;
}
if ( range . e . c <= C ) range . e . c = C ;
2017-04-08 06:55:35 +00:00
}
2017-03-10 01:09:18 +00:00
}
2017-10-17 00:14:32 +00:00
}
colpeat = parseInt ( ctag [ 'number-columns-repeated' ] || "1" , 10 ) ;
C += colpeat - 1 ; colpeat = 0 ;
2017-04-03 00:16:03 +00:00
q = { /*:: t:"", v:null, z:null, w:"",c:[]*/ } ;
2019-04-01 14:25:15 +00:00
textp = "" ; textR = [ ] ;
2017-03-10 01:09:18 +00:00
}
2017-12-15 01:18:40 +00:00
atag = ( { } /*:any*/ ) ;
2017-03-10 01:09:18 +00:00
break ; // 9.1.4 <table:table-cell>
/* pure state */
case 'document' : // TODO: <office:document> is the root for FODS
case 'document-content' : case '电子表格文档' : // 3.1.3.2 <office:document-content>
case 'spreadsheet' : case '主体' : // 3.7 <office:spreadsheet>
case 'scripts' : // 3.12 <office:scripts>
case 'styles' : // TODO <office:styles>
case 'font-face-decls' : // 3.14 <office:font-face-decls>
2021-10-13 07:20:25 +00:00
case 'master-styles' : // 3.15.4 <office:master-styles> -- relevant for FODS
2017-03-10 01:09:18 +00:00
if ( Rn [ 1 ] === '/' ) { if ( ( tmp = state . pop ( ) ) [ 0 ] !== Rn [ 3 ] ) throw "Bad state: " + tmp ; }
else if ( Rn [ 0 ] . charAt ( Rn [ 0 ] . length - 2 ) !== '/' ) state . push ( [ Rn [ 3 ] , true ] ) ;
break ;
2017-04-02 06:47:25 +00:00
case 'annotation' : // 14.1 <office:annotation>
if ( Rn [ 1 ] === '/' ) {
if ( ( tmp = state . pop ( ) ) [ 0 ] !== Rn [ 3 ] ) throw "Bad state: " + tmp ;
comment . t = textp ;
2019-11-01 03:09:14 +00:00
if ( textR . length ) /*::(*/ comment /*:: :any)*/ . R = textR ;
2017-04-02 06:47:25 +00:00
comment . a = creator ;
comments . push ( comment ) ;
}
else if ( Rn [ 0 ] . charAt ( Rn [ 0 ] . length - 2 ) !== '/' ) { state . push ( [ Rn [ 3 ] , false ] ) ; }
2017-04-03 00:16:03 +00:00
creator = "" ; creatoridx = 0 ;
2019-04-01 14:25:15 +00:00
textp = "" ; textpidx = 0 ; textR = [ ] ;
2017-04-02 06:47:25 +00:00
break ;
case 'creator' : // 4.3.2.7 <dc:creator>
if ( Rn [ 1 ] === '/' ) { creator = str . slice ( creatoridx , Rn . index ) ; }
else creatoridx = Rn . index + Rn [ 0 ] . length ;
break ;
2017-03-10 01:09:18 +00:00
/* ignore state */
case 'meta' : case '元数据' : // TODO: <office:meta> <uof:元数据> FODS/UOF
case 'settings' : // TODO: <office:settings>
case 'config-item-set' : // TODO: <office:config-item-set>
case 'config-item-map-indexed' : // TODO: <office:config-item-map-indexed>
case 'config-item-map-entry' : // TODO: <office:config-item-map-entry>
case 'config-item-map-named' : // TODO: <office:config-item-map-entry>
case 'shapes' : // 9.2.8 <table:shapes>
case 'frame' : // 10.4.2 <draw:frame>
case 'text-box' : // 10.4.3 <draw:text-box>
case 'image' : // 10.4.4 <draw:image>
case 'data-pilot-tables' : // 9.6.2 <table:data-pilot-tables>
case 'list-style' : // 16.30 <text:list-style>
case 'form' : // 13.13 <form:form>
case 'dde-links' : // 9.8 <table:dde-links>
case 'event-listeners' : // TODO
2017-10-17 00:14:32 +00:00
case 'chart' : // TODO
2017-03-10 01:09:18 +00:00
if ( Rn [ 1 ] === '/' ) { if ( ( tmp = state . pop ( ) ) [ 0 ] !== Rn [ 3 ] ) throw "Bad state: " + tmp ; }
else if ( Rn [ 0 ] . charAt ( Rn [ 0 ] . length - 2 ) !== '/' ) state . push ( [ Rn [ 3 ] , false ] ) ;
2019-04-01 14:25:15 +00:00
textp = "" ; textpidx = 0 ; textR = [ ] ;
2017-03-10 01:09:18 +00:00
break ;
2022-06-09 04:45:22 +00:00
case 'scientific-number' : // <number:scientific-number>
case 'currency-symbol' : // <number:currency-symbol>
case 'fill-character' : // 16.29.5 <number:fill-character>
2017-03-10 01:09:18 +00:00
break ;
2022-06-09 04:45:22 +00:00
case 'text-style' : // 16.27.25 <number:text-style>
case 'boolean-style' : // 16.27.23 <number:boolean-style>
2017-03-10 01:09:18 +00:00
case 'number-style' : // 16.27.2 <number:number-style>
2022-06-09 04:45:22 +00:00
case 'currency-style' : // 16.29.8 <number:currency-style>
2017-03-10 01:09:18 +00:00
case 'percentage-style' : // 16.27.9 <number:percentage-style>
case 'date-style' : // 16.27.10 <number:date-style>
case 'time-style' : // 16.27.18 <number:time-style>
if ( Rn [ 1 ] === '/' ) {
2022-06-09 04:45:22 +00:00
var xlmlidx = xlmlregex . lastIndex ;
parse _ods _styles ( str . slice ( nfidx , xlmlregex . lastIndex ) , _opts , number _format _map ) ;
xlmlregex . lastIndex = xlmlidx ;
2017-03-10 01:09:18 +00:00
} else if ( Rn [ 0 ] . charAt ( Rn [ 0 ] . length - 2 ) !== '/' ) {
2022-06-09 04:45:22 +00:00
nfidx = xlmlregex . lastIndex - Rn [ 0 ] . length ;
2017-03-10 01:09:18 +00:00
} break ;
case 'script' : break ; // 3.13 <office:script>
case 'libraries' : break ; // TODO: <ooo:libraries>
case 'automatic-styles' : break ; // 3.15.3 <office:automatic-styles>
case 'default-style' : // TODO: <style:default-style>
case 'page-layout' : break ; // TODO: <style:page-layout>
2022-06-09 04:45:22 +00:00
case 'style' : { // 16.2 <style:style>
var styletag = parsexmltag ( Rn [ 0 ] , false ) ;
if ( styletag [ "family" ] == "table-cell" && number _format _map [ styletag [ "data-style-name" ] ] ) styles [ styletag [ "name" ] ] = number _format _map [ styletag [ "data-style-name" ] ] ;
} break ;
2017-03-10 01:09:18 +00:00
case 'map' : break ; // 16.3 <style:map>
case 'font-face' : break ; // 16.21 <style:font-face>
case 'paragraph-properties' : break ; // 17.6 <style:paragraph-properties>
case 'table-properties' : break ; // 17.15 <style:table-properties>
case 'table-column-properties' : break ; // 17.16 <style:table-column-properties>
case 'table-row-properties' : break ; // 17.17 <style:table-row-properties>
case 'table-cell-properties' : break ; // 17.18 <style:table-cell-properties>
case 'number' : // 16.27.3 <number:number>
2022-06-09 04:45:22 +00:00
break ;
2017-03-10 01:09:18 +00:00
case 'fraction' : break ; // TODO 16.27.6 <number:fraction>
case 'day' : // 16.27.11 <number:day>
case 'month' : // 16.27.12 <number:month>
case 'year' : // 16.27.13 <number:year>
case 'era' : // 16.27.14 <number:era>
case 'day-of-week' : // 16.27.15 <number:day-of-week>
case 'week-of-year' : // 16.27.16 <number:week-of-year>
case 'quarter' : // 16.27.17 <number:quarter>
case 'hours' : // 16.27.19 <number:hours>
case 'minutes' : // 16.27.20 <number:minutes>
case 'seconds' : // 16.27.21 <number:seconds>
case 'am-pm' : // 16.27.22 <number:am-pm>
2022-06-09 04:45:22 +00:00
break ;
2017-03-10 01:09:18 +00:00
case 'boolean' : break ; // 16.27.24 <number:boolean>
case 'text' : // 16.27.26 <number:text>
if ( Rn [ 0 ] . slice ( - 2 ) === "/>" ) break ;
else if ( Rn [ 1 ] === "/" ) switch ( state [ state . length - 1 ] [ 0 ] ) {
case 'number-style' :
case 'date-style' :
case 'time-style' :
NF += str . slice ( pidx , Rn . index ) ;
break ;
}
else pidx = Rn . index + Rn [ 0 ] . length ;
break ;
2017-12-15 01:18:40 +00:00
case 'named-range' : // 9.4.12 <table:named-range>
tag = parsexmltag ( Rn [ 0 ] , false ) ;
_Ref = ods _to _csf _3D ( tag [ 'cell-range-address' ] ) ;
var nrange = ( { Name : tag . name , Ref : _Ref [ 0 ] + '!' + _Ref [ 1 ] } /*:any*/ ) ;
if ( intable ) nrange . Sheet = SheetNames . length ;
WB . Names . push ( nrange ) ;
break ;
2017-03-10 01:09:18 +00:00
case 'text-content' : break ; // 16.27.27 <number:text-content>
case 'text-properties' : break ; // 16.27.27 <style:text-properties>
2017-10-17 00:14:32 +00:00
case 'embedded-text' : break ; // 16.27.4 <number:embedded-text>
2017-03-10 01:09:18 +00:00
case 'body' : case '电子表格' : break ; // 3.3 16.9.6 19.726.3
case 'forms' : break ; // 12.25.2 13.2
case 'table-column' : break ; // 9.1.6 <table:table-column>
2017-07-26 08:35:28 +00:00
case 'table-header-rows' : break ; // 9.1.7 <table:table-header-rows>
2017-10-17 00:14:32 +00:00
case 'table-rows' : break ; // 9.1.12 <table:table-rows>
2017-07-09 17:37:45 +00:00
/* TODO: outline levels */
case 'table-column-group' : break ; // 9.1.10 <table:table-column-group>
2017-07-26 08:35:28 +00:00
case 'table-header-columns' : break ; // 9.1.11 <table:table-header-columns>
2017-10-17 00:14:32 +00:00
case 'table-columns' : break ; // 9.1.12 <table:table-columns>
2017-03-10 01:09:18 +00:00
2022-06-06 23:05:27 +00:00
case 'null-date' : // 9.4.2 <table:null-date>
tag = parsexmltag ( Rn [ 0 ] , false ) ;
switch ( tag [ "date-value" ] ) {
case "1904-01-01" : WB . WBProps . date1904 = true ;
/* falls through */
case "1900-01-01" : baddate = 0 ;
}
break ;
2017-03-10 01:09:18 +00:00
case 'graphic-properties' : break ; // 17.21 <style:graphic-properties>
case 'calculation-settings' : break ; // 9.4.1 <table:calculation-settings>
case 'named-expressions' : break ; // 9.4.11 <table:named-expressions>
2017-07-26 08:35:28 +00:00
case 'label-range' : break ; // 9.4.9 <table:label-range>
case 'label-ranges' : break ; // 9.4.10 <table:label-ranges>
2017-03-10 01:09:18 +00:00
case 'named-expression' : break ; // 9.4.13 <table:named-expression>
case 'sort' : break ; // 9.4.19 <table:sort>
case 'sort-by' : break ; // 9.4.20 <table:sort-by>
case 'sort-groups' : break ; // 9.4.22 <table:sort-groups>
2017-07-26 08:35:28 +00:00
case 'tab' : break ; // 6.1.4 <text:tab>
2017-03-10 01:09:18 +00:00
case 'line-break' : break ; // 6.1.5 <text:line-break>
2017-07-26 08:35:28 +00:00
case 'span' : break ; // 6.1.7 <text:span>
case 'p' : case '文本串' : // 5.1.3 <text:p>
2020-11-20 07:05:27 +00:00
if ( [ 'master-styles' ] . indexOf ( state [ state . length - 1 ] [ 0 ] ) > - 1 ) break ;
2019-04-01 14:25:15 +00:00
if ( Rn [ 1 ] === '/' && ( ! ctag || ! ctag [ 'string-value' ] ) ) {
var ptp = parse _text _p ( str . slice ( textpidx , Rn . index ) , textptag ) ;
textp = ( textp . length > 0 ? textp + "\n" : "" ) + ptp [ 0 ] ;
} else { textptag = parsexmltag ( Rn [ 0 ] , false ) ; textpidx = Rn . index + Rn [ 0 ] . length ; }
2017-03-10 01:09:18 +00:00
break ; // <text:p>
2017-10-17 00:14:32 +00:00
case 's' : break ; // <text:s>
2017-04-10 05:10:54 +00:00
case 'database-range' : // 9.4.15 <table:database-range>
if ( Rn [ 1 ] === '/' ) break ;
try {
2017-12-15 01:18:40 +00:00
_Ref = ods _to _csf _3D ( parsexmltag ( Rn [ 0 ] ) [ 'target-range-address' ] ) ;
Sheets [ _Ref [ 0 ] ] [ '!autofilter' ] = { ref : _Ref [ 1 ] } ;
2017-05-09 18:07:57 +00:00
} catch ( e ) { /* empty */ }
2017-04-10 05:10:54 +00:00
break ;
2017-03-10 01:09:18 +00:00
case 'date' : break ; // <*:date>
case 'object' : break ; // 10.4.6.2 <draw:object>
case 'title' : case '标题' : break ; // <*:title> OR <uof:标题>
case 'desc' : break ; // <*:desc>
2017-10-17 00:14:32 +00:00
case 'binary-data' : break ; // 10.4.5 TODO: b64 blob
2017-03-10 01:09:18 +00:00
2017-07-26 08:35:28 +00:00
/* 9.2 Advanced Tables */
2017-03-10 01:09:18 +00:00
case 'table-source' : break ; // 9.2.6
2017-07-26 08:35:28 +00:00
case 'scenario' : break ; // 9.2.6
2017-03-10 01:09:18 +00:00
case 'iteration' : break ; // 9.4.3 <table:iteration>
case 'content-validations' : break ; // 9.4.4 <table:
case 'content-validation' : break ; // 9.4.5 <table:
2017-07-26 08:35:28 +00:00
case 'help-message' : break ; // 9.4.6 <table:
2017-03-10 01:09:18 +00:00
case 'error-message' : break ; // 9.4.7 <table:
case 'database-ranges' : break ; // 9.4.14 <table:database-ranges>
case 'filter' : break ; // 9.5.2 <table:filter>
case 'filter-and' : break ; // 9.5.3 <table:filter-and>
case 'filter-or' : break ; // 9.5.4 <table:filter-or>
case 'filter-condition' : break ; // 9.5.5 <table:filter-condition>
case 'list-level-style-bullet' : break ; // 16.31 <text:
case 'list-level-style-number' : break ; // 16.32 <text:
case 'list-level-properties' : break ; // 17.19 <style:
/* 7.3 Document Fields */
case 'sender-firstname' : // 7.3.6.2
case 'sender-lastname' : // 7.3.6.3
case 'sender-initials' : // 7.3.6.4
case 'sender-title' : // 7.3.6.5
case 'sender-position' : // 7.3.6.6
case 'sender-email' : // 7.3.6.7
case 'sender-phone-private' : // 7.3.6.8
case 'sender-fax' : // 7.3.6.9
case 'sender-company' : // 7.3.6.10
case 'sender-phone-work' : // 7.3.6.11
case 'sender-street' : // 7.3.6.12
case 'sender-city' : // 7.3.6.13
case 'sender-postal-code' : // 7.3.6.14
case 'sender-country' : // 7.3.6.15
case 'sender-state-or-province' : // 7.3.6.16
case 'author-name' : // 7.3.7.1
case 'author-initials' : // 7.3.7.2
case 'chapter' : // 7.3.8
case 'file-name' : // 7.3.9
case 'template-name' : // 7.3.9
case 'sheet-name' : // 7.3.9
break ;
2017-05-09 18:07:57 +00:00
case 'event-listener' :
break ;
2017-03-10 01:09:18 +00:00
/* TODO: FODS Properties */
case 'initial-creator' :
case 'creation-date' :
2017-10-17 00:14:32 +00:00
case 'print-date' :
2017-03-10 01:09:18 +00:00
case 'generator' :
case 'document-statistic' :
case 'user-defined' :
2017-10-17 00:14:32 +00:00
case 'editing-duration' :
case 'editing-cycles' :
2017-03-10 01:09:18 +00:00
break ;
/* TODO: FODS Config */
case 'config-item' :
break ;
/* TODO: style tokens */
case 'page-number' : break ; // TODO <text:page-number>
case 'page-count' : break ; // TODO <text:page-count>
case 'time' : break ; // TODO <text:time>
2017-07-26 08:35:28 +00:00
/* 9.3 Advanced Table Cells */
case 'cell-range-source' : break ; // 9.3.1 <table:
case 'detective' : break ; // 9.3.2 <table:
case 'operation' : break ; // 9.3.3 <table:
case 'highlighted-range' : break ; // 9.3.4 <table:
2017-03-10 01:09:18 +00:00
/* 9.6 Data Pilot Tables <table: */
case 'data-pilot-table' : // 9.6.3
case 'source-cell-range' : // 9.6.5
case 'source-service' : // 9.6.6
case 'data-pilot-field' : // 9.6.7
case 'data-pilot-level' : // 9.6.8
case 'data-pilot-subtotals' : // 9.6.9
case 'data-pilot-subtotal' : // 9.6.10
case 'data-pilot-members' : // 9.6.11
case 'data-pilot-member' : // 9.6.12
case 'data-pilot-display-info' : // 9.6.13
case 'data-pilot-sort-info' : // 9.6.14
case 'data-pilot-layout-info' : // 9.6.15
case 'data-pilot-field-reference' : // 9.6.16
case 'data-pilot-groups' : // 9.6.17
case 'data-pilot-group' : // 9.6.18
case 'data-pilot-group-member' : // 9.6.19
break ;
/* 10.3 Drawing Shapes */
case 'rect' : // 10.3.2
break ;
/* 14.6 DDE Connections */
case 'dde-connection-decls' : // 14.6.2 <text:
case 'dde-connection-decl' : // 14.6.3 <text:
case 'dde-link' : // 14.6.4 <table:
case 'dde-source' : // 14.6.5 <office:
break ;
case 'properties' : break ; // 13.7 <form:properties>
case 'property' : break ; // 13.8 <form:property>
2017-12-15 01:18:40 +00:00
case 'a' : // 6.1.8 hyperlink
if ( Rn [ 1 ] !== '/' ) {
atag = parsexmltag ( Rn [ 0 ] , false ) ;
if ( ! atag . href ) break ;
2021-10-13 07:20:25 +00:00
atag . Target = unescapexml ( atag . href ) ; delete atag . href ;
2017-12-15 01:18:40 +00:00
if ( atag . Target . charAt ( 0 ) == "#" && atag . Target . indexOf ( "." ) > - 1 ) {
_Ref = ods _to _csf _3D ( atag . Target . slice ( 1 ) ) ;
atag . Target = "#" + _Ref [ 0 ] + "!" + _Ref [ 1 ] ;
2021-10-13 07:20:25 +00:00
} else if ( atag . Target . match ( /^\.\.[\\\/]/ ) ) atag . Target = atag . Target . slice ( 3 ) ;
2017-12-15 01:18:40 +00:00
}
break ;
2017-03-10 01:09:18 +00:00
/* non-standard */
case 'table-protection' : break ;
case 'data-pilot-grand-total' : break ; // <table:
2017-07-26 08:35:28 +00:00
case 'office-document-common-attrs' : break ; // bare
2017-10-17 00:14:32 +00:00
default : switch ( Rn [ 2 ] ) {
case 'dc:' : // TODO: properties
case 'calcext:' : // ignore undocumented extensions
case 'loext:' : // ignore undocumented extensions
case 'ooo:' : // ignore undocumented extensions
case 'chartooo:' : // ignore undocumented extensions
case 'draw:' : // TODO: drawing
case 'style:' : // TODO: styles
case 'chart:' : // TODO: charts
case 'form:' : // TODO: forms
case 'uof:' : // TODO: uof
case '表:' : // TODO: uof
case '字:' : // TODO: uof
break ;
default : if ( opts . WTF ) throw new Error ( Rn ) ;
}
2017-03-10 01:09:18 +00:00
}
2017-12-15 01:18:40 +00:00
var out /*:Workbook*/ = ( {
2017-03-10 01:09:18 +00:00
Sheets : Sheets ,
2017-12-15 01:18:40 +00:00
SheetNames : SheetNames ,
Workbook : WB
} /*:any*/ ) ;
2019-11-01 03:09:14 +00:00
if ( opts . bookSheets ) delete /*::(*/ out /*:: :any)*/ . Sheets ;
2017-03-10 01:09:18 +00:00
return out ;
2022-03-12 14:05:57 +00:00
}
2017-05-11 07:29:59 +00:00
2017-10-17 00:14:32 +00:00
function parse _ods ( zip /*:ZIPFile*/ , opts /*:?ParseOpts*/ ) /*:Workbook*/ {
2017-05-11 07:29:59 +00:00
opts = opts || ( { } /*:any*/ ) ;
2021-11-14 04:38:00 +00:00
if ( safegetzipfile ( zip , 'META-INF/manifest.xml' ) ) parse _manifest ( getzipdata ( zip , 'META-INF/manifest.xml' ) , opts ) ;
2022-06-09 04:45:22 +00:00
var styles = getzipstr ( zip , 'styles.xml' ) ;
var Styles = styles && parse _ods _styles ( utf8read ( styles ) , opts ) ;
2017-05-11 07:29:59 +00:00
var content = getzipstr ( zip , 'content.xml' ) ;
2021-11-14 04:38:00 +00:00
if ( ! content ) throw new Error ( "Missing content.xml in ODS / UOF file" ) ;
2022-06-09 04:45:22 +00:00
var wb = parse _content _xml ( utf8read ( content ) , opts , Styles ) ;
2017-09-30 06:18:11 +00:00
if ( safegetzipfile ( zip , 'meta.xml' ) ) wb . Props = parse _core _props ( getzipdata ( zip , 'meta.xml' ) ) ;
return wb ;
2017-05-11 07:29:59 +00:00
}
2017-10-17 00:14:32 +00:00
function parse _fods ( data /*:string*/ , opts /*:?ParseOpts*/ ) /*:Workbook*/ {
2017-05-11 07:29:59 +00:00
return parse _content _xml ( data , opts ) ;
}
/* OpenDocument */
2022-03-12 14:05:57 +00:00
var write _styles _ods /*:{(wb:any, opts:any):string}*/ = /* @__PURE__ */ ( function ( ) {
2022-01-10 18:45:50 +00:00
var master _styles = [
'<office:master-styles>' ,
'<style:master-page style:name="mp1" style:page-layout-name="mp1">' ,
'<style:header/>' ,
'<style:header-left style:display="false"/>' ,
'<style:footer/>' ,
'<style:footer-left style:display="false"/>' ,
'</style:master-page>' ,
'</office:master-styles>'
] . join ( "" ) ;
2021-11-14 04:38:00 +00:00
2017-10-17 00:14:32 +00:00
var payload = '<office:document-styles ' + wxt _helper ( {
'xmlns:office' : "urn:oasis:names:tc:opendocument:xmlns:office:1.0" ,
'xmlns:table' : "urn:oasis:names:tc:opendocument:xmlns:table:1.0" ,
'xmlns:style' : "urn:oasis:names:tc:opendocument:xmlns:style:1.0" ,
'xmlns:text' : "urn:oasis:names:tc:opendocument:xmlns:text:1.0" ,
'xmlns:draw' : "urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" ,
'xmlns:fo' : "urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" ,
'xmlns:xlink' : "http://www.w3.org/1999/xlink" ,
'xmlns:dc' : "http://purl.org/dc/elements/1.1/" ,
'xmlns:number' : "urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0" ,
'xmlns:svg' : "urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" ,
'xmlns:of' : "urn:oasis:names:tc:opendocument:xmlns:of:1.2" ,
'office:version' : "1.2"
2021-11-14 04:38:00 +00:00
} ) + '>' + master _styles + '</office:document-styles>' ;
2018-01-23 09:07:51 +00:00
return function wso ( /*::wb, opts*/ ) {
2017-10-17 00:14:32 +00:00
return XML _HEADER + payload ;
2017-05-11 07:29:59 +00:00
} ;
} ) ( ) ;
2022-06-09 04:45:22 +00:00
// TODO: find out if anyone actually read the spec. LO has some wild errors
function write _number _format _ods ( nf /*:string*/ , nfidx /*:string*/ ) /*:string*/ {
var type = "number" , payload = "" , nopts = { "style:name" : nfidx } , c = "" , i = 0 ;
nf = nf . replace ( /"[$]"/g , "$" ) ;
/* TODO: replace with an actual parser based on a real grammar */
j : {
// TODO: support style maps
if ( nf . indexOf ( ";" ) > - 1 ) {
console . error ( "Unsupported ODS Style Map exported. Using first branch of " + nf ) ;
nf = nf . slice ( 0 , nf . indexOf ( ";" ) ) ;
}
if ( nf == "@" ) { type = "text" ; payload = "<number:text-content/>" ; break j ; }
/* currency flag */
if ( nf . indexOf ( /\$/ ) > - 1 ) { type = "currency" ; }
/* opening string literal */
if ( nf [ i ] == '"' ) {
c = "" ;
while ( nf [ ++ i ] != '"' || nf [ ++ i ] == '"' ) c += nf [ i ] ; -- i ;
if ( nf [ i + 1 ] == "*" ) {
i ++ ;
payload += '<number:fill-character>' + escapexml ( c . replace ( /""/g , '"' ) ) + '</number:fill-character>' ;
} else {
payload += '<number:text>' + escapexml ( c . replace ( /""/g , '"' ) ) + '</number:text>' ;
}
nf = nf . slice ( i + 1 ) ; i = 0 ;
}
/* fractions */
var t = nf . match ( /# (\?+)\/(\?+)/ ) ;
if ( t ) { payload += writextag ( "number:fraction" , null , { "number:min-integer-digits" : 0 , "number:min-numerator-digits" : t [ 1 ] . length , "number:max-denominator-value" : Math . max ( + ( t [ 1 ] . replace ( /./g , "9" ) ) , + ( t [ 2 ] . replace ( /./g , "9" ) ) ) } ) ; break j ; }
if ( ( t = nf . match ( /# (\?+)\/(\d+)/ ) ) ) { payload += writextag ( "number:fraction" , null , { "number:min-integer-digits" : 0 , "number:min-numerator-digits" : t [ 1 ] . length , "number:denominator-value" : + t [ 2 ] } ) ; break j ; }
/* percentages */
if ( ( t = nf . match ( /(\d+)(|\.\d+)%/ ) ) ) { type = "percentage" ; payload += writextag ( "number:number" , null , { "number:decimal-places" : t [ 2 ] && t . length - 1 || 0 , "number:min-decimal-places" : t [ 2 ] && t . length - 1 || 0 , "number:min-integer-digits" : t [ 1 ] . length } ) + "<number:text>%</number:text>" ; break j ; }
/* datetime */
var has _time = false ;
if ( [ "y" , "m" , "d" ] . indexOf ( nf [ 0 ] ) > - 1 ) {
type = "date" ;
k : for ( ; i < nf . length ; ++ i ) switch ( ( c = nf [ i ] . toLowerCase ( ) ) ) {
case "h" : case "s" : has _time = true ; -- i ; break k ;
case "m" :
l : for ( var h = i + 1 ; h < nf . length ; ++ h ) switch ( nf [ h ] ) {
case "y" : case "d" : break l ;
case "h" : case "s" : has _time = true ; -- i ; break k ;
}
/* falls through */
case "y" : case "d" :
while ( ( nf [ ++ i ] || "" ) . toLowerCase ( ) == c [ 0 ] ) c += c [ 0 ] ; -- i ;
switch ( c ) {
case "y" : case "yy" : payload += "<number:year/>" ; break ;
case "yyy" : case "yyyy" : payload += '<number:year number:style="long"/>' ; break ;
case "mmmmm" : console . error ( "ODS has no equivalent of format |mmmmm|" ) ;
/* falls through */
case "m" : case "mm" : case "mmm" : case "mmmm" :
payload += '<number:month number:style="' + ( c . length % 2 ? "short" : "long" ) + '" number:textual="' + ( c . length >= 3 ? "true" : "false" ) + '"/>' ;
break ;
case "d" : case "dd" : payload += '<number:day number:style="' + ( c . length % 2 ? "short" : "long" ) + '"/>' ; break ;
case "ddd" : case "dddd" : payload += '<number:day-of-week number:style="' + ( c . length % 2 ? "short" : "long" ) + '"/>' ; break ;
}
break ;
case '"' :
while ( nf [ ++ i ] != '"' || nf [ ++ i ] == '"' ) c += nf [ i ] ; -- i ;
payload += '<number:text>' + escapexml ( c . slice ( 1 ) . replace ( /""/g , '"' ) ) + '</number:text>' ;
break ;
case '/' : payload += '<number:text>' + escapexml ( c ) + '</number:text>' ; break ;
default : console . error ( "unrecognized character " + c + " in ODF format " + nf ) ;
}
if ( ! has _time ) break j ;
nf = nf . slice ( i + 1 ) ; i = 0 ;
}
if ( nf . match ( /^\[?[hms]/ ) ) {
if ( type == "number" ) type = "time" ;
if ( nf . match ( /\[/ ) ) {
nf = nf . replace ( /[\[\]]/g , "" ) ;
nopts [ 'number:truncate-on-overflow' ] = "false" ;
}
for ( ; i < nf . length ; ++ i ) switch ( ( c = nf [ i ] . toLowerCase ( ) ) ) {
case "h" : case "m" : case "s" :
while ( ( nf [ ++ i ] || "" ) . toLowerCase ( ) == c [ 0 ] ) c += c [ 0 ] ; -- i ;
switch ( c ) {
case "h" : case "hh" : payload += '<number:hours number:style="' + ( c . length % 2 ? "short" : "long" ) + '"/>' ; break ;
case "m" : case "mm" : payload += '<number:minutes number:style="' + ( c . length % 2 ? "short" : "long" ) + '"/>' ; break ;
case "s" : case "ss" :
if ( nf [ i + 1 ] == "." ) do { c += nf [ i + 1 ] ; ++ i ; } while ( nf [ i + 1 ] == "0" ) ;
payload += '<number:seconds number:style="' + ( c . match ( "ss" ) ? "long" : "short" ) + '"' + ( c . match ( /\./ ) ? ' number:decimal-places="' + ( c . match ( /0+/ ) || [ "" ] ) [ 0 ] . length + '"' : "" ) + '/>' ; break ;
}
break ;
case '"' :
while ( nf [ ++ i ] != '"' || nf [ ++ i ] == '"' ) c += nf [ i ] ; -- i ;
payload += '<number:text>' + escapexml ( c . slice ( 1 ) . replace ( /""/g , '"' ) ) + '</number:text>' ;
break ;
case '/' : payload += '<number:text>' + escapexml ( c ) + '</number:text>' ; break ;
case "a" :
if ( nf . slice ( i , i + 3 ) . toLowerCase ( ) == "a/p" ) { payload += '<number:am-pm/>' ; i += 2 ; break ; } // Note: ODF does not support A/P
if ( nf . slice ( i , i + 5 ) . toLowerCase ( ) == "am/pm" ) { payload += '<number:am-pm/>' ; i += 4 ; break ; }
/* falls through */
default : console . error ( "unrecognized character " + c + " in ODF format " + nf ) ;
}
break j ;
}
/* currency flag */
if ( nf . indexOf ( /\$/ ) > - 1 ) { type = "currency" ; }
/* should be in a char loop */
if ( nf [ 0 ] == "$" ) { payload += '<number:currency-symbol number:language="en" number:country="US">$</number:currency-symbol>' ; nf = nf . slice ( 1 ) ; i = 0 ; }
i = 0 ; if ( nf [ i ] == '"' ) {
while ( nf [ ++ i ] != '"' || nf [ ++ i ] == '"' ) c += nf [ i ] ; -- i ;
if ( nf [ i + 1 ] == "*" ) {
i ++ ;
payload += '<number:fill-character>' + escapexml ( c . replace ( /""/g , '"' ) ) + '</number:fill-character>' ;
} else {
payload += '<number:text>' + escapexml ( c . replace ( /""/g , '"' ) ) + '</number:text>' ;
}
nf = nf . slice ( i + 1 ) ; i = 0 ;
}
/* number TODO: interstitial text e.g. 000)000-0000 */
var np = nf . match ( /([#0][0#,]*)(\.[0#]*|)(E[+]?0*|)/i ) ;
if ( ! np || ! np [ 0 ] ) console . error ( "Could not find numeric part of " + nf ) ;
else {
var base = np [ 1 ] . replace ( /,/g , "" ) ;
payload += '<number:' + ( np [ 3 ] ? "scientific-" : "" ) + 'number' +
' number:min-integer-digits="' + ( base . indexOf ( "0" ) == - 1 ? "0" : base . length - base . indexOf ( "0" ) ) + '"' +
( np [ 0 ] . indexOf ( "," ) > - 1 ? ' number:grouping="true"' : "" ) +
( np [ 2 ] && ' number:decimal-places="' + ( np [ 2 ] . length - 1 ) + '"' || ' number:decimal-places="0"' ) +
( np [ 3 ] && np [ 3 ] . indexOf ( "+" ) > - 1 ? ' number:forced-exponent-sign="true"' : "" ) +
( np [ 3 ] ? ' number:min-exponent-digits="' + np [ 3 ] . match ( /0+/ ) [ 0 ] . length + '"' : "" ) +
'>' +
/* TODO: interstitial text placeholders */
'</number:' + ( np [ 3 ] ? "scientific-" : "" ) + 'number>' ;
i = np . index + np [ 0 ] . length ;
}
/* residual text */
if ( nf [ i ] == '"' ) {
c = "" ;
while ( nf [ ++ i ] != '"' || nf [ ++ i ] == '"' ) c += nf [ i ] ; -- i ;
payload += '<number:text>' + escapexml ( c . replace ( /""/g , '"' ) ) + '</number:text>' ;
}
}
if ( ! payload ) { console . error ( "Could not generate ODS number format for |" + nf + "|" ) ; return "" ; }
return writextag ( "number:" + type + "-style" , payload , nopts ) ;
}
2022-05-25 01:45:55 +00:00
function write _names _ods ( Names , SheetNames , idx ) {
var scoped = Names . filter ( function ( name ) { return name . Sheet == ( idx == - 1 ? null : idx ) ; } ) ;
if ( ! scoped . length ) return "" ;
return " <table:named-expressions>\n" + scoped . map ( function ( name ) {
var odsref = csf _to _ods _3D ( name . Ref ) ;
return " " + writextag ( "table:named-range" , null , {
"table:name" : name . Name ,
"table:cell-range-address" : odsref ,
"table:base-cell-address" : odsref . replace ( /[\.]?[^\.]*$/ , ".$A$1" )
} ) ;
} ) . join ( "\n" ) + "\n </table:named-expressions>\n" ;
}
2022-03-12 14:05:57 +00:00
var write _content _ods /*:{(wb:any, opts:any):string}*/ = /* @__PURE__ */ ( function ( ) {
2017-10-17 00:14:32 +00:00
/* 6.1.2 White Space Characters */
var write _text _p = function ( text /*:string*/ ) /*:string*/ {
return escapexml ( text )
. replace ( / +/g , function ( $$ ) { return '<text:s text:c="' + $$ . length + '"/>' ; } )
. replace ( /\t/g , "<text:tab/>" )
2021-09-16 01:50:33 +00:00
. replace ( /\n/g , "</text:p><text:p>" )
2017-10-17 00:14:32 +00:00
. replace ( /^ / , "<text:s/>" ) . replace ( / $/ , "<text:s/>" ) ;
} ;
2017-03-10 01:09:18 +00:00
var null _cell _xml = ' <table:table-cell />\n' ;
2017-03-16 01:17:24 +00:00
var covered _cell _xml = ' <table:covered-table-cell/>\n' ;
2022-06-09 04:45:22 +00:00
var write _ws = function ( ws , wb /*:Workbook*/ , i /*:number*/ , opts , nfs ) /*:string*/ {
2017-03-10 01:09:18 +00:00
/* Section 9 Tables */
2017-12-30 05:40:35 +00:00
var o /*:Array<string>*/ = [ ] ;
2020-09-11 08:38:33 +00:00
o . push ( ' <table:table table:name="' + escapexml ( wb . SheetNames [ i ] ) + '" table:style-name="ta1">\n' ) ;
2021-10-13 07:20:25 +00:00
var R = 0 , C = 0 , range = decode _range ( ws [ '!ref' ] || "A1" ) ;
2017-12-30 05:40:35 +00:00
var marr /*:Array<Range>*/ = ws [ '!merges' ] || [ ] , mi = 0 ;
2017-04-08 06:55:35 +00:00
var dense = Array . isArray ( ws ) ;
2021-10-13 07:20:25 +00:00
if ( ws [ "!cols" ] ) {
for ( C = 0 ; C <= range . e . c ; ++ C ) o . push ( ' <table:table-column' + ( ws [ "!cols" ] [ C ] ? ' table:style-name="co' + ws [ "!cols" ] [ C ] . ods + '"' : '' ) + '></table:table-column>\n' ) ;
}
var H = "" , ROWS = ws [ "!rows" ] || [ ] ;
for ( R = 0 ; R < range . s . r ; ++ R ) {
H = ROWS [ R ] ? ' table:style-name="ro' + ROWS [ R ] . ods + '"' : "" ;
o . push ( ' <table:table-row' + H + '></table:table-row>\n' ) ;
}
2017-03-10 01:09:18 +00:00
for ( ; R <= range . e . r ; ++ R ) {
2021-10-13 07:20:25 +00:00
H = ROWS [ R ] ? ' table:style-name="ro' + ROWS [ R ] . ods + '"' : "" ;
o . push ( ' <table:table-row' + H + '>\n' ) ;
2017-03-10 01:09:18 +00:00
for ( C = 0 ; C < range . s . c ; ++ C ) o . push ( null _cell _xml ) ;
for ( ; C <= range . e . c ; ++ C ) {
2017-04-30 16:27:03 +00:00
var skip = false , ct = { } , textp = "" ;
2017-03-16 01:17:24 +00:00
for ( mi = 0 ; mi != marr . length ; ++ mi ) {
if ( marr [ mi ] . s . c > C ) continue ;
if ( marr [ mi ] . s . r > R ) continue ;
if ( marr [ mi ] . e . c < C ) continue ;
if ( marr [ mi ] . e . r < R ) continue ;
if ( marr [ mi ] . s . c != C || marr [ mi ] . s . r != R ) skip = true ;
2017-04-30 16:27:03 +00:00
ct [ 'table:number-columns-spanned' ] = ( marr [ mi ] . e . c - marr [ mi ] . s . c + 1 ) ;
ct [ 'table:number-rows-spanned' ] = ( marr [ mi ] . e . r - marr [ mi ] . s . r + 1 ) ;
2017-03-16 01:17:24 +00:00
break ;
}
if ( skip ) { o . push ( covered _cell _xml ) ; continue ; }
2017-04-08 06:55:35 +00:00
var ref = encode _cell ( { r : R , c : C } ) , cell = dense ? ( ws [ R ] || [ ] ) [ C ] : ws [ ref ] ;
2017-03-18 00:45:06 +00:00
if ( cell && cell . f ) {
2017-04-30 16:27:03 +00:00
ct [ 'table:formula' ] = escapexml ( csf _to _ods _formula ( cell . f ) ) ;
2017-03-18 00:45:06 +00:00
if ( cell . F ) {
2018-01-11 08:01:25 +00:00
if ( cell . F . slice ( 0 , ref . length ) == ref ) {
2017-03-18 00:45:06 +00:00
var _Fref = decode _range ( cell . F ) ;
2017-04-30 16:27:03 +00:00
ct [ 'table:number-matrix-columns-spanned' ] = ( _Fref . e . c - _Fref . s . c + 1 ) ;
ct [ 'table:number-matrix-rows-spanned' ] = ( _Fref . e . r - _Fref . s . r + 1 ) ;
}
2017-03-18 00:45:06 +00:00
}
}
2017-04-30 16:27:03 +00:00
if ( ! cell ) { o . push ( null _cell _xml ) ; continue ; }
switch ( cell . t ) {
case 'b' :
textp = ( cell . v ? 'TRUE' : 'FALSE' ) ;
ct [ 'office:value-type' ] = "boolean" ;
ct [ 'office:boolean-value' ] = ( cell . v ? 'true' : 'false' ) ;
break ;
case 'n' :
textp = ( cell . w || String ( cell . v || 0 ) ) ;
ct [ 'office:value-type' ] = "float" ;
ct [ 'office:value' ] = ( cell . v || 0 ) ;
break ;
case 's' : case 'str' :
2020-07-16 21:47:39 +00:00
textp = cell . v == null ? "" : cell . v ;
2017-04-30 16:27:03 +00:00
ct [ 'office:value-type' ] = "string" ;
break ;
case 'd' :
textp = ( cell . w || ( parseDate ( cell . v ) . toISOString ( ) ) ) ;
ct [ 'office:value-type' ] = "date" ;
ct [ 'office:date-value' ] = ( parseDate ( cell . v ) . toISOString ( ) ) ;
ct [ 'table:style-name' ] = "ce1" ;
break ;
2017-03-10 01:09:18 +00:00
//case 'e':
2017-04-30 16:27:03 +00:00
default : o . push ( null _cell _xml ) ; continue ;
}
2017-12-15 01:18:40 +00:00
var text _p = write _text _p ( textp ) ;
if ( cell . l && cell . l . Target ) {
2021-10-13 07:20:25 +00:00
var _tgt = cell . l . Target ;
_tgt = _tgt . charAt ( 0 ) == "#" ? "#" + csf _to _ods _3D ( _tgt . slice ( 1 ) ) : _tgt ;
// TODO: choose correct parent path format based on link delimiters
if ( _tgt . charAt ( 0 ) != "#" && ! _tgt . match ( /^\w+:/ ) ) _tgt = '../' + _tgt ;
text _p = writextag ( 'text:a' , text _p , { 'xlink:href' : _tgt . replace ( /&/g , "&" ) } ) ;
2017-12-15 01:18:40 +00:00
}
2022-06-09 04:45:22 +00:00
if ( nfs [ cell . z ] ) ct [ "table:style-name" ] = "ce" + nfs [ cell . z ] . slice ( 1 ) ;
2017-12-15 01:18:40 +00:00
o . push ( ' ' + writextag ( 'table:table-cell' , writextag ( 'text:p' , text _p , { } ) , ct ) + '\n' ) ;
2017-03-10 01:09:18 +00:00
}
o . push ( ' </table:table-row>\n' ) ;
}
2022-05-25 01:45:55 +00:00
if ( ( wb . Workbook || { } ) . Names ) o . push ( write _names _ods ( wb . Workbook . Names , wb . SheetNames , i ) ) ;
2017-03-10 01:09:18 +00:00
o . push ( ' </table:table>\n' ) ;
return o . join ( "" ) ;
} ;
2021-10-13 07:20:25 +00:00
var write _automatic _styles _ods = function ( o /*:Array<string>*/ , wb ) {
2017-04-30 16:27:03 +00:00
o . push ( ' <office:automatic-styles>\n' ) ;
2020-09-11 08:38:33 +00:00
2021-10-13 07:20:25 +00:00
/* column styles */
var cidx = 0 ;
wb . SheetNames . map ( function ( n ) { return wb . Sheets [ n ] ; } ) . forEach ( function ( ws ) {
if ( ! ws ) return ;
if ( ws [ "!cols" ] ) {
for ( var C = 0 ; C < ws [ "!cols" ] . length ; ++ C ) if ( ws [ "!cols" ] [ C ] ) {
var colobj = ws [ "!cols" ] [ C ] ;
if ( colobj . width == null && colobj . wpx == null && colobj . wch == null ) continue ;
process _col ( colobj ) ;
colobj . ods = cidx ;
var w = ws [ "!cols" ] [ C ] . wpx + "px" ;
o . push ( ' <style:style style:name="co' + cidx + '" style:family="table-column">\n' ) ;
o . push ( ' <style:table-column-properties fo:break-before="auto" style:column-width="' + w + '"/>\n' ) ;
o . push ( ' </style:style>\n' ) ;
++ cidx ;
}
}
} ) ;
/* row styles */
var ridx = 0 ;
wb . SheetNames . map ( function ( n ) { return wb . Sheets [ n ] ; } ) . forEach ( function ( ws ) {
if ( ! ws ) return ;
if ( ws [ "!rows" ] ) {
for ( var R = 0 ; R < ws [ "!rows" ] . length ; ++ R ) if ( ws [ "!rows" ] [ R ] ) {
ws [ "!rows" ] [ R ] . ods = ridx ;
var h = ws [ "!rows" ] [ R ] . hpx + "px" ;
o . push ( ' <style:style style:name="ro' + ridx + '" style:family="table-row">\n' ) ;
o . push ( ' <style:table-row-properties fo:break-before="auto" style:row-height="' + h + '"/>\n' ) ;
o . push ( ' </style:style>\n' ) ;
++ ridx ;
}
}
} ) ;
2020-09-11 08:38:33 +00:00
/* table */
2021-11-14 04:38:00 +00:00
o . push ( ' <style:style style:name="ta1" style:family="table" style:master-page-name="mp1">\n' ) ;
2020-03-15 07:42:05 +00:00
o . push ( ' <style:table-properties table:display="true" style:writing-mode="lr-tb"/>\n' ) ;
o . push ( ' </style:style>\n' ) ;
2022-06-09 04:45:22 +00:00
o . push ( ' <number:date-style style:name="N37" number:automatic-order="true">\n' ) ;
o . push ( ' <number:month number:style="long"/>\n' ) ;
o . push ( ' <number:text>/</number:text>\n' ) ;
o . push ( ' <number:day number:style="long"/>\n' ) ;
o . push ( ' <number:text>/</number:text>\n' ) ;
o . push ( ' <number:year/>\n' ) ;
o . push ( ' </number:date-style>\n' ) ;
/* number formats, table cells, text */
var nfs = { } ;
var nfi = 69 ;
wb . SheetNames . map ( function ( n ) { return wb . Sheets [ n ] ; } ) . forEach ( function ( ws ) {
if ( ! ws ) return ;
var range = decode _range ( ws [ "!ref" ] ) ;
for ( var R = 0 ; R <= range . e . r ; ++ R ) for ( var C = 0 ; C <= range . e . c ; ++ C ) {
var c = Array . isArray ( ws ) ? ( ws [ R ] || [ ] ) [ C ] : ws [ encode _cell ( { r : R , c : C } ) ] ;
if ( ! c || ! c . z || c . z . toLowerCase ( ) == "general" ) continue ;
if ( ! nfs [ c . z ] ) {
var out = write _number _format _ods ( c . z , "N" + nfi ) ;
if ( out ) { nfs [ c . z ] = "N" + nfi ; ++ nfi ; o . push ( out + "\n" ) ; }
}
}
} ) ;
2017-04-30 16:27:03 +00:00
o . push ( ' <style:style style:name="ce1" style:family="table-cell" style:parent-style-name="Default" style:data-style-name="N37"/>\n' ) ;
2022-06-09 04:45:22 +00:00
keys ( nfs ) . forEach ( function ( nf ) {
o . push ( '<style:style style:name="ce' + nfs [ nf ] . slice ( 1 ) + '" style:family="table-cell" style:parent-style-name="Default" style:data-style-name="' + nfs [ nf ] + '"/>\n' ) ;
} ) ;
2020-09-11 08:38:33 +00:00
/* page-layout */
2017-04-30 16:27:03 +00:00
o . push ( ' </office:automatic-styles>\n' ) ;
2022-06-09 04:45:22 +00:00
return nfs ;
2017-04-30 16:27:03 +00:00
} ;
2017-03-10 01:09:18 +00:00
return function wcx ( wb , opts ) {
var o = [ XML _HEADER ] ;
/* 3.1.3.2 */
2017-04-30 16:27:03 +00:00
var attr = wxt _helper ( {
'xmlns:office' : "urn:oasis:names:tc:opendocument:xmlns:office:1.0" ,
'xmlns:table' : "urn:oasis:names:tc:opendocument:xmlns:table:1.0" ,
'xmlns:style' : "urn:oasis:names:tc:opendocument:xmlns:style:1.0" ,
'xmlns:text' : "urn:oasis:names:tc:opendocument:xmlns:text:1.0" ,
'xmlns:draw' : "urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" ,
'xmlns:fo' : "urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" ,
'xmlns:xlink' : "http://www.w3.org/1999/xlink" ,
'xmlns:dc' : "http://purl.org/dc/elements/1.1/" ,
'xmlns:meta' : "urn:oasis:names:tc:opendocument:xmlns:meta:1.0" ,
'xmlns:number' : "urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0" ,
'xmlns:presentation' : "urn:oasis:names:tc:opendocument:xmlns:presentation:1.0" ,
'xmlns:svg' : "urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" ,
'xmlns:chart' : "urn:oasis:names:tc:opendocument:xmlns:chart:1.0" ,
'xmlns:dr3d' : "urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0" ,
'xmlns:math' : "http://www.w3.org/1998/Math/MathML" ,
'xmlns:form' : "urn:oasis:names:tc:opendocument:xmlns:form:1.0" ,
'xmlns:script' : "urn:oasis:names:tc:opendocument:xmlns:script:1.0" ,
'xmlns:ooo' : "http://openoffice.org/2004/office" ,
'xmlns:ooow' : "http://openoffice.org/2004/writer" ,
'xmlns:oooc' : "http://openoffice.org/2004/calc" ,
'xmlns:dom' : "http://www.w3.org/2001/xml-events" ,
'xmlns:xforms' : "http://www.w3.org/2002/xforms" ,
'xmlns:xsd' : "http://www.w3.org/2001/XMLSchema" ,
'xmlns:xsi' : "http://www.w3.org/2001/XMLSchema-instance" ,
'xmlns:sheet' : "urn:oasis:names:tc:opendocument:sh33tjs:1.0" ,
'xmlns:rpt' : "http://openoffice.org/2005/report" ,
'xmlns:of' : "urn:oasis:names:tc:opendocument:xmlns:of:1.2" ,
'xmlns:xhtml' : "http://www.w3.org/1999/xhtml" ,
'xmlns:grddl' : "http://www.w3.org/2003/g/data-view#" ,
'xmlns:tableooo' : "http://openoffice.org/2009/table" ,
'xmlns:drawooo' : "http://openoffice.org/2010/draw" ,
'xmlns:calcext' : "urn:org:documentfoundation:names:experimental:calc:xmlns:calcext:1.0" ,
'xmlns:loext' : "urn:org:documentfoundation:names:experimental:office:xmlns:loext:1.0" ,
'xmlns:field' : "urn:openoffice:names:experimental:ooo-ms-interop:xmlns:field:1.0" ,
'xmlns:formx' : "urn:openoffice:names:experimental:ooxml-odf-interop:xmlns:form:1.0" ,
'xmlns:css3t' : "http://www.w3.org/TR/css3-text/" ,
'office:version' : "1.2"
} ) ;
var fods = wxt _helper ( {
2017-10-17 00:14:32 +00:00
'xmlns:config' : "urn:oasis:names:tc:opendocument:xmlns:config:1.0" ,
'office:mimetype' : "application/vnd.oasis.opendocument.spreadsheet"
2017-04-30 16:27:03 +00:00
} ) ;
2021-10-13 07:20:25 +00:00
if ( opts . bookType == "fods" ) {
o . push ( '<office:document' + attr + fods + '>\n' ) ;
2022-06-09 04:45:22 +00:00
o . push ( write _meta _ods ( ) . replace ( /<office:document-meta.*?>/ , "" ) . replace ( /<\/office:document-meta>/ , "" ) + "\n" ) ;
2021-10-13 07:20:25 +00:00
// TODO: settings (equiv of settings.xml for ODS)
} else o . push ( '<office:document-content' + attr + '>\n' ) ;
// o.push(' <office:scripts/>\n');
2022-06-09 04:45:22 +00:00
var nfs = write _automatic _styles _ods ( o , wb ) ;
2017-03-10 01:09:18 +00:00
o . push ( ' <office:body>\n' ) ;
o . push ( ' <office:spreadsheet>\n' ) ;
2022-06-06 23:05:27 +00:00
if ( ( ( wb . Workbook || { } ) . WBProps || { } ) . date1904 ) o . push ( ' <table:calculation-settings table:case-sensitive="false" table:search-criteria-must-apply-to-whole-cell="true" table:use-wildcards="true" table:use-regular-expressions="false" table:automatic-find-labels="false">\n <table:null-date table:date-value="1904-01-01"/>\n </table:calculation-settings>\n' ) ;
2022-06-09 04:45:22 +00:00
for ( var i = 0 ; i != wb . SheetNames . length ; ++ i ) o . push ( write _ws ( wb . Sheets [ wb . SheetNames [ i ] ] , wb , i , opts , nfs ) ) ;
2022-05-25 01:45:55 +00:00
if ( ( wb . Workbook || { } ) . Names ) o . push ( write _names _ods ( wb . Workbook . Names , wb . SheetNames , - 1 ) ) ;
2017-03-10 01:09:18 +00:00
o . push ( ' </office:spreadsheet>\n' ) ;
o . push ( ' </office:body>\n' ) ;
if ( opts . bookType == "fods" ) o . push ( '</office:document>' ) ;
else o . push ( '</office:document-content>' ) ;
return o . join ( "" ) ;
} ;
} ) ( ) ;
function write _ods ( wb /*:any*/ , opts /*:any*/ ) {
2017-05-11 07:29:59 +00:00
if ( opts . bookType == "fods" ) return write _content _ods ( wb , opts ) ;
2017-03-10 01:09:18 +00:00
2019-08-04 19:50:49 +00:00
var zip = zip _new ( ) ;
2017-03-10 01:09:18 +00:00
var f = "" ;
var manifest /*:Array<Array<string> >*/ = [ ] ;
2017-12-30 05:40:35 +00:00
var rdf /*:Array<[string, string]>*/ = [ ] ;
2017-03-10 01:09:18 +00:00
2017-10-17 00:14:32 +00:00
/* Part 3 Section 3.3 MIME Media Type */
2017-03-10 01:09:18 +00:00
f = "mimetype" ;
2019-08-04 19:50:49 +00:00
zip _add _file ( zip , f , "application/vnd.oasis.opendocument.spreadsheet" ) ;
2017-03-10 01:09:18 +00:00
/* Part 1 Section 2.2 Documents */
f = "content.xml" ;
2019-08-04 19:50:49 +00:00
zip _add _file ( zip , f , write _content _ods ( wb , opts ) ) ;
2017-03-10 01:09:18 +00:00
manifest . push ( [ f , "text/xml" ] ) ;
rdf . push ( [ f , "ContentFile" ] ) ;
2017-05-11 07:29:59 +00:00
/* TODO: these are hard-coded styles to satiate excel */
f = "styles.xml" ;
2019-08-04 19:50:49 +00:00
zip _add _file ( zip , f , write _styles _ods ( wb , opts ) ) ;
2017-05-11 07:29:59 +00:00
manifest . push ( [ f , "text/xml" ] ) ;
rdf . push ( [ f , "StylesFile" ] ) ;
/* TODO: this is hard-coded to satiate excel */
f = "meta.xml" ;
2021-10-13 07:20:25 +00:00
zip _add _file ( zip , f , XML _HEADER + write _meta _ods ( /*::wb, opts*/ ) ) ;
2017-05-11 07:29:59 +00:00
manifest . push ( [ f , "text/xml" ] ) ;
rdf . push ( [ f , "MetadataFile" ] ) ;
2017-10-17 00:14:32 +00:00
/* Part 3 Section 6 Metadata Manifest File */
f = "manifest.rdf" ;
2019-08-04 19:50:49 +00:00
zip _add _file ( zip , f , write _rdf ( rdf /*, opts*/ ) ) ;
2017-10-17 00:14:32 +00:00
manifest . push ( [ f , "application/rdf+xml" ] ) ;
2017-03-10 01:09:18 +00:00
/* Part 3 Section 4 Manifest File */
f = "META-INF/manifest.xml" ;
2019-08-04 19:50:49 +00:00
zip _add _file ( zip , f , write _manifest ( manifest /*, opts*/ ) ) ;
2017-03-10 01:09:18 +00:00
return zip ;
2017-02-22 06:57:59 +00:00
}
2017-05-11 07:29:59 +00:00
2022-03-16 03:18:09 +00:00
/*! sheetjs (C) 2013-present SheetJS -- http://sheetjs.com */
2022-03-21 01:39:16 +00:00
function u8 _to _dataview ( array ) {
2022-03-16 03:18:09 +00:00
return new DataView ( array . buffer , array . byteOffset , array . byteLength ) ;
2022-03-21 01:39:16 +00:00
}
function u8str ( u8 ) {
2022-03-16 03:18:09 +00:00
return typeof TextDecoder != "undefined" ? new TextDecoder ( ) . decode ( u8 ) : utf8read ( a2s ( u8 ) ) ;
2022-03-21 01:39:16 +00:00
}
2022-03-24 13:59:49 +00:00
function stru8 ( str ) {
return typeof TextEncoder != "undefined" ? new TextEncoder ( ) . encode ( str ) : s2a ( utf8write ( str ) ) ;
}
function u8contains ( body , search ) {
outer :
for ( var L = 0 ; L <= body . length - search . length ; ++ L ) {
for ( var j = 0 ; j < search . length ; ++ j )
if ( body [ L + j ] != search [ j ] )
continue outer ;
return true ;
}
return false ;
}
2022-03-21 01:39:16 +00:00
function u8concat ( u8a ) {
2022-03-16 03:18:09 +00:00
var len = u8a . reduce ( function ( acc , x ) {
return acc + x . length ;
} , 0 ) ;
var out = new Uint8Array ( len ) ;
var off = 0 ;
u8a . forEach ( function ( u8 ) {
out . set ( u8 , off ) ;
off += u8 . length ;
2022-02-01 05:58:45 +00:00
} ) ;
2022-03-16 03:18:09 +00:00
return out ;
2022-03-21 01:39:16 +00:00
}
function popcnt ( x ) {
2022-03-16 03:18:09 +00:00
x -= x >> 1 & 1431655765 ;
x = ( x & 858993459 ) + ( x >> 2 & 858993459 ) ;
return ( x + ( x >> 4 ) & 252645135 ) * 16843009 >>> 24 ;
2022-03-21 01:39:16 +00:00
}
function readDecimal128LE ( buf , offset ) {
2022-03-16 03:18:09 +00:00
var exp = ( buf [ offset + 15 ] & 127 ) << 7 | buf [ offset + 14 ] >> 1 ;
var mantissa = buf [ offset + 14 ] & 1 ;
for ( var j = offset + 13 ; j >= offset ; -- j )
mantissa = mantissa * 256 + buf [ j ] ;
return ( buf [ offset + 15 ] & 128 ? - mantissa : mantissa ) * Math . pow ( 10 , exp - 6176 ) ;
2022-03-21 01:39:16 +00:00
}
2022-03-24 13:59:49 +00:00
function writeDecimal128LE ( buf , offset , value ) {
2022-03-26 21:50:27 +00:00
var exp = Math . floor ( value == 0 ? 0 : Math . LOG10E * Math . log ( Math . abs ( value ) ) ) + 6176 - 16 ;
2022-03-24 13:59:49 +00:00
var mantissa = value / Math . pow ( 10 , exp - 6176 ) ;
buf [ offset + 15 ] |= exp >> 7 ;
buf [ offset + 14 ] |= ( exp & 127 ) << 1 ;
for ( var i = 0 ; mantissa >= 1 ; ++ i , mantissa /= 256 )
buf [ offset + i ] = mantissa & 255 ;
buf [ offset + 15 ] |= value >= 0 ? 0 : 128 ;
}
2022-03-16 03:18:09 +00:00
function parse _varint49 ( buf , ptr ) {
var l = ptr ? ptr [ 0 ] : 0 ;
var usz = buf [ l ] & 127 ;
varint :
if ( buf [ l ++ ] >= 128 ) {
usz |= ( buf [ l ] & 127 ) << 7 ;
if ( buf [ l ++ ] < 128 )
break varint ;
usz |= ( buf [ l ] & 127 ) << 14 ;
if ( buf [ l ++ ] < 128 )
break varint ;
usz |= ( buf [ l ] & 127 ) << 21 ;
if ( buf [ l ++ ] < 128 )
break varint ;
usz += ( buf [ l ] & 127 ) * Math . pow ( 2 , 28 ) ;
++ l ;
if ( buf [ l ++ ] < 128 )
break varint ;
usz += ( buf [ l ] & 127 ) * Math . pow ( 2 , 35 ) ;
++ l ;
if ( buf [ l ++ ] < 128 )
break varint ;
usz += ( buf [ l ] & 127 ) * Math . pow ( 2 , 42 ) ;
++ l ;
if ( buf [ l ++ ] < 128 )
break varint ;
2022-02-01 05:58:45 +00:00
}
2022-03-16 03:18:09 +00:00
if ( ptr )
ptr [ 0 ] = l ;
return usz ;
}
2022-03-21 01:39:16 +00:00
function write _varint49 ( v ) {
var usz = new Uint8Array ( 7 ) ;
usz [ 0 ] = v & 127 ;
var L = 1 ;
sz :
if ( v > 127 ) {
usz [ L - 1 ] |= 128 ;
usz [ L ] = v >> 7 & 127 ;
++ L ;
if ( v <= 16383 )
break sz ;
usz [ L - 1 ] |= 128 ;
usz [ L ] = v >> 14 & 127 ;
++ L ;
if ( v <= 2097151 )
break sz ;
usz [ L - 1 ] |= 128 ;
usz [ L ] = v >> 21 & 127 ;
++ L ;
if ( v <= 268435455 )
break sz ;
usz [ L - 1 ] |= 128 ;
usz [ L ] = v / 256 >>> 21 & 127 ;
++ L ;
if ( v <= 34359738367 )
break sz ;
usz [ L - 1 ] |= 128 ;
usz [ L ] = v / 65536 >>> 21 & 127 ;
++ L ;
if ( v <= 4398046511103 )
break sz ;
usz [ L - 1 ] |= 128 ;
usz [ L ] = v / 16777216 >>> 21 & 127 ;
++ L ;
}
return usz . slice ( 0 , L ) ;
}
2022-03-16 03:18:09 +00:00
function varint _to _i32 ( buf ) {
var l = 0 , i32 = buf [ l ] & 127 ;
varint :
if ( buf [ l ++ ] >= 128 ) {
i32 |= ( buf [ l ] & 127 ) << 7 ;
if ( buf [ l ++ ] < 128 )
break varint ;
i32 |= ( buf [ l ] & 127 ) << 14 ;
if ( buf [ l ++ ] < 128 )
break varint ;
i32 |= ( buf [ l ] & 127 ) << 21 ;
if ( buf [ l ++ ] < 128 )
break varint ;
i32 |= ( buf [ l ] & 127 ) << 28 ;
2022-02-01 05:58:45 +00:00
}
2022-03-16 03:18:09 +00:00
return i32 ;
}
function parse _shallow ( buf ) {
var out = [ ] , ptr = [ 0 ] ;
while ( ptr [ 0 ] < buf . length ) {
var off = ptr [ 0 ] ;
var num = parse _varint49 ( buf , ptr ) ;
var type = num & 7 ;
num = Math . floor ( num / 8 ) ;
var len = 0 ;
var res ;
if ( num == 0 )
break ;
switch ( type ) {
2022-02-01 05:58:45 +00:00
case 0 :
{
2022-03-16 03:18:09 +00:00
var l = ptr [ 0 ] ;
while ( buf [ ptr [ 0 ] ++ ] >= 128 )
;
res = buf . slice ( l , ptr [ 0 ] ) ;
2022-02-01 05:58:45 +00:00
}
break ;
2022-02-10 12:40:50 +00:00
case 5 :
2022-03-16 03:18:09 +00:00
len = 4 ;
res = buf . slice ( ptr [ 0 ] , ptr [ 0 ] + len ) ;
ptr [ 0 ] += len ;
2022-02-10 12:40:50 +00:00
break ;
2022-03-16 03:18:09 +00:00
case 1 :
len = 8 ;
res = buf . slice ( ptr [ 0 ] , ptr [ 0 ] + len ) ;
ptr [ 0 ] += len ;
2022-02-10 12:40:50 +00:00
break ;
2022-03-16 03:18:09 +00:00
case 2 :
len = parse _varint49 ( buf , ptr ) ;
res = buf . slice ( ptr [ 0 ] , ptr [ 0 ] + len ) ;
ptr [ 0 ] += len ;
2022-02-10 12:40:50 +00:00
break ;
2022-02-01 05:58:45 +00:00
case 3 :
case 4 :
default :
2022-03-16 03:18:09 +00:00
throw new Error ( "PB Type " . concat ( type , " for Field " ) . concat ( num , " at offset " ) . concat ( off ) ) ;
2022-02-01 05:58:45 +00:00
}
2022-03-24 13:59:49 +00:00
var v = { data : res , type : type } ;
2022-03-16 03:18:09 +00:00
if ( out [ num ] == null )
out [ num ] = [ v ] ;
else
out [ num ] . push ( v ) ;
2022-02-01 05:58:45 +00:00
}
2022-03-16 03:18:09 +00:00
return out ;
}
2022-03-22 20:08:08 +00:00
function write _shallow ( proto ) {
var out = [ ] ;
proto . forEach ( function ( field , idx ) {
2022-03-26 21:50:27 +00:00
if ( idx == 0 )
return ;
2022-03-22 20:08:08 +00:00
field . forEach ( function ( item ) {
2022-03-24 13:59:49 +00:00
if ( ! item . data )
return ;
2022-03-22 20:08:08 +00:00
out . push ( write _varint49 ( idx * 8 + item . type ) ) ;
if ( item . type == 2 )
out . push ( write _varint49 ( item . data . length ) ) ;
out . push ( item . data ) ;
} ) ;
} ) ;
return u8concat ( out ) ;
}
2022-03-16 03:18:09 +00:00
function mappa ( data , cb ) {
2022-03-24 13:59:49 +00:00
return ( data == null ? void 0 : data . map ( function ( d ) {
return cb ( d . data ) ;
} ) ) || [ ] ;
2022-03-16 03:18:09 +00:00
}
function parse _iwa _file ( buf ) {
2022-03-24 13:59:49 +00:00
var _a ;
2022-03-16 03:18:09 +00:00
var out = [ ] , ptr = [ 0 ] ;
while ( ptr [ 0 ] < buf . length ) {
var len = parse _varint49 ( buf , ptr ) ;
var ai = parse _shallow ( buf . slice ( ptr [ 0 ] , ptr [ 0 ] + len ) ) ;
ptr [ 0 ] += len ;
var res = {
id : varint _to _i32 ( ai [ 1 ] [ 0 ] . data ) ,
messages : [ ]
} ;
ai [ 2 ] . forEach ( function ( b ) {
var mi = parse _shallow ( b . data ) ;
var fl = varint _to _i32 ( mi [ 3 ] [ 0 ] . data ) ;
res . messages . push ( {
meta : mi ,
data : buf . slice ( ptr [ 0 ] , ptr [ 0 ] + fl )
} ) ;
ptr [ 0 ] += fl ;
} ) ;
2022-03-24 13:59:49 +00:00
if ( ( _a = ai [ 3 ] ) == null ? void 0 : _a [ 0 ] )
res . merge = varint _to _i32 ( ai [ 3 ] [ 0 ] . data ) >>> 0 > 0 ;
2022-03-16 03:18:09 +00:00
out . push ( res ) ;
}
return out ;
}
2022-03-24 13:59:49 +00:00
function write _iwa _file ( ias ) {
var bufs = [ ] ;
ias . forEach ( function ( ia ) {
2022-03-26 21:50:27 +00:00
var ai = [
[ ] ,
[ { data : write _varint49 ( ia . id ) , type : 0 } ] ,
[ ]
] ;
2022-03-24 13:59:49 +00:00
if ( ia . merge != null )
ai [ 3 ] = [ { data : write _varint49 ( + ! ! ia . merge ) , type : 0 } ] ;
var midata = [ ] ;
ia . messages . forEach ( function ( mi ) {
midata . push ( mi . data ) ;
mi . meta [ 3 ] = [ { type : 0 , data : write _varint49 ( mi . data . length ) } ] ;
ai [ 2 ] . push ( { data : write _shallow ( mi . meta ) , type : 2 } ) ;
} ) ;
var aipayload = write _shallow ( ai ) ;
bufs . push ( write _varint49 ( aipayload . length ) ) ;
bufs . push ( aipayload ) ;
midata . forEach ( function ( mid ) {
return bufs . push ( mid ) ;
} ) ;
} ) ;
return u8concat ( bufs ) ;
}
2022-03-16 03:18:09 +00:00
function parse _snappy _chunk ( type , buf ) {
if ( type != 0 )
throw new Error ( "Unexpected Snappy chunk type " . concat ( type ) ) ;
var ptr = [ 0 ] ;
var usz = parse _varint49 ( buf , ptr ) ;
var chunks = [ ] ;
while ( ptr [ 0 ] < buf . length ) {
var tag = buf [ ptr [ 0 ] ] & 3 ;
if ( tag == 0 ) {
var len = buf [ ptr [ 0 ] ++ ] >> 2 ;
if ( len < 60 )
++ len ;
else {
var c = len - 59 ;
len = buf [ ptr [ 0 ] ] ;
if ( c > 1 )
len |= buf [ ptr [ 0 ] + 1 ] << 8 ;
if ( c > 2 )
len |= buf [ ptr [ 0 ] + 2 ] << 16 ;
if ( c > 3 )
len |= buf [ ptr [ 0 ] + 3 ] << 24 ;
len >>>= 0 ;
len ++ ;
ptr [ 0 ] += c ;
2022-02-01 05:58:45 +00:00
}
2022-03-16 03:18:09 +00:00
chunks . push ( buf . slice ( ptr [ 0 ] , ptr [ 0 ] + len ) ) ;
ptr [ 0 ] += len ;
continue ;
} else {
var offset = 0 , length = 0 ;
if ( tag == 1 ) {
length = ( buf [ ptr [ 0 ] ] >> 2 & 7 ) + 4 ;
offset = ( buf [ ptr [ 0 ] ++ ] & 224 ) << 3 ;
offset |= buf [ ptr [ 0 ] ++ ] ;
} else {
length = ( buf [ ptr [ 0 ] ++ ] >> 2 ) + 1 ;
if ( tag == 2 ) {
offset = buf [ ptr [ 0 ] ] | buf [ ptr [ 0 ] + 1 ] << 8 ;
ptr [ 0 ] += 2 ;
} else {
offset = ( buf [ ptr [ 0 ] ] | buf [ ptr [ 0 ] + 1 ] << 8 | buf [ ptr [ 0 ] + 2 ] << 16 | buf [ ptr [ 0 ] + 3 ] << 24 ) >>> 0 ;
ptr [ 0 ] += 4 ;
2022-02-01 05:58:45 +00:00
}
}
2022-03-16 03:18:09 +00:00
chunks = [ u8concat ( chunks ) ] ;
if ( offset == 0 )
throw new Error ( "Invalid offset 0" ) ;
if ( offset > chunks [ 0 ] . length )
throw new Error ( "Invalid offset beyond length" ) ;
if ( length >= offset ) {
chunks . push ( chunks [ 0 ] . slice ( - offset ) ) ;
length -= offset ;
while ( length >= chunks [ chunks . length - 1 ] . length ) {
chunks . push ( chunks [ chunks . length - 1 ] ) ;
length -= chunks [ chunks . length - 1 ] . length ;
}
2022-02-01 05:58:45 +00:00
}
2022-03-16 03:18:09 +00:00
chunks . push ( chunks [ 0 ] . slice ( - offset , - offset + length ) ) ;
}
}
var o = u8concat ( chunks ) ;
if ( o . length != usz )
throw new Error ( "Unexpected length: " . concat ( o . length , " != " ) . concat ( usz ) ) ;
return o ;
}
2022-03-21 01:39:16 +00:00
function decompress _iwa _file ( buf ) {
2022-03-16 03:18:09 +00:00
var out = [ ] ;
var l = 0 ;
while ( l < buf . length ) {
var t = buf [ l ++ ] ;
var len = buf [ l ] | buf [ l + 1 ] << 8 | buf [ l + 2 ] << 16 ;
l += 3 ;
out . push ( parse _snappy _chunk ( t , buf . slice ( l , l + len ) ) ) ;
l += len ;
}
if ( l !== buf . length )
throw new Error ( "data is not a valid framed stream!" ) ;
return u8concat ( out ) ;
}
2022-03-21 01:39:16 +00:00
function compress _iwa _file ( buf ) {
var out = [ ] ;
var l = 0 ;
while ( l < buf . length ) {
var c = Math . min ( buf . length - l , 268435455 ) ;
var frame = new Uint8Array ( 4 ) ;
out . push ( frame ) ;
var usz = write _varint49 ( c ) ;
var L = usz . length ;
out . push ( usz ) ;
if ( c <= 60 ) {
L ++ ;
out . push ( new Uint8Array ( [ c - 1 << 2 ] ) ) ;
} else if ( c <= 256 ) {
L += 2 ;
out . push ( new Uint8Array ( [ 240 , c - 1 & 255 ] ) ) ;
} else if ( c <= 65536 ) {
L += 3 ;
out . push ( new Uint8Array ( [ 244 , c - 1 & 255 , c - 1 >> 8 & 255 ] ) ) ;
} else if ( c <= 16777216 ) {
L += 4 ;
out . push ( new Uint8Array ( [ 248 , c - 1 & 255 , c - 1 >> 8 & 255 , c - 1 >> 16 & 255 ] ) ) ;
} else if ( c <= 4294967296 ) {
L += 5 ;
out . push ( new Uint8Array ( [ 252 , c - 1 & 255 , c - 1 >> 8 & 255 , c - 1 >> 16 & 255 , c - 1 >>> 24 & 255 ] ) ) ;
}
out . push ( buf . slice ( l , l + c ) ) ;
L += c ;
frame [ 0 ] = 0 ;
frame [ 1 ] = L & 255 ;
frame [ 2 ] = L >> 8 & 255 ;
frame [ 3 ] = L >> 16 & 255 ;
l += c ;
}
return u8concat ( out ) ;
}
function parse _old _storage ( buf , sst , rsst , v ) {
2022-03-16 03:18:09 +00:00
var dv = u8 _to _dataview ( buf ) ;
var flags = dv . getUint32 ( 4 , true ) ;
2022-03-21 01:39:16 +00:00
var data _offset = ( v > 1 ? 12 : 8 ) + popcnt ( flags & ( v > 1 ? 3470 : 398 ) ) * 4 ;
2022-03-16 03:18:09 +00:00
var ridx = - 1 , sidx = - 1 , ieee = NaN , dt = new Date ( 2001 , 0 , 1 ) ;
if ( flags & 512 ) {
ridx = dv . getUint32 ( data _offset , true ) ;
data _offset += 4 ;
}
2022-03-21 01:39:16 +00:00
data _offset += popcnt ( flags & ( v > 1 ? 12288 : 4096 ) ) * 4 ;
2022-03-16 03:18:09 +00:00
if ( flags & 16 ) {
sidx = dv . getUint32 ( data _offset , true ) ;
data _offset += 4 ;
}
if ( flags & 32 ) {
ieee = dv . getFloat64 ( data _offset , true ) ;
data _offset += 8 ;
}
if ( flags & 64 ) {
dt . setTime ( dt . getTime ( ) + dv . getFloat64 ( data _offset , true ) * 1e3 ) ;
data _offset += 8 ;
}
var ret ;
2022-03-21 01:39:16 +00:00
switch ( buf [ 2 ] ) {
2022-03-16 03:18:09 +00:00
case 0 :
break ;
case 2 :
ret = { t : "n" , v : ieee } ;
break ;
case 3 :
ret = { t : "s" , v : sst [ sidx ] } ;
break ;
case 5 :
ret = { t : "d" , v : dt } ;
break ;
case 6 :
ret = { t : "b" , v : ieee > 0 } ;
break ;
case 7 :
2022-03-24 13:59:49 +00:00
ret = { t : "n" , v : ieee / 86400 } ;
2022-03-16 03:18:09 +00:00
break ;
case 8 :
ret = { t : "e" , v : 0 } ;
break ;
case 9 :
{
if ( ridx > - 1 )
ret = { t : "s" , v : rsst [ ridx ] } ;
else
throw new Error ( "Unsupported cell type " . concat ( buf . slice ( 0 , 4 ) ) ) ;
2022-02-01 05:58:45 +00:00
}
2022-03-16 03:18:09 +00:00
break ;
default :
throw new Error ( "Unsupported cell type " . concat ( buf . slice ( 0 , 4 ) ) ) ;
}
return ret ;
}
2022-03-24 13:59:49 +00:00
function parse _new _storage ( buf , sst , rsst ) {
2022-03-16 03:18:09 +00:00
var dv = u8 _to _dataview ( buf ) ;
var flags = dv . getUint32 ( 8 , true ) ;
var data _offset = 12 ;
var ridx = - 1 , sidx = - 1 , d128 = NaN , ieee = NaN , dt = new Date ( 2001 , 0 , 1 ) ;
if ( flags & 1 ) {
d128 = readDecimal128LE ( buf , data _offset ) ;
data _offset += 16 ;
2022-02-01 05:58:45 +00:00
}
2022-03-16 03:18:09 +00:00
if ( flags & 2 ) {
ieee = dv . getFloat64 ( data _offset , true ) ;
data _offset += 8 ;
2022-02-01 05:58:45 +00:00
}
2022-03-16 03:18:09 +00:00
if ( flags & 4 ) {
dt . setTime ( dt . getTime ( ) + dv . getFloat64 ( data _offset , true ) * 1e3 ) ;
data _offset += 8 ;
}
if ( flags & 8 ) {
sidx = dv . getUint32 ( data _offset , true ) ;
data _offset += 4 ;
}
if ( flags & 16 ) {
ridx = dv . getUint32 ( data _offset , true ) ;
data _offset += 4 ;
}
var ret ;
2022-03-21 01:39:16 +00:00
switch ( buf [ 1 ] ) {
2022-03-16 03:18:09 +00:00
case 0 :
break ;
case 2 :
ret = { t : "n" , v : d128 } ;
break ;
case 3 :
ret = { t : "s" , v : sst [ sidx ] } ;
break ;
case 5 :
ret = { t : "d" , v : dt } ;
break ;
case 6 :
ret = { t : "b" , v : ieee > 0 } ;
break ;
case 7 :
2022-03-24 13:59:49 +00:00
ret = { t : "n" , v : ieee / 86400 } ;
2022-03-16 03:18:09 +00:00
break ;
case 8 :
ret = { t : "e" , v : 0 } ;
break ;
case 9 :
{
if ( ridx > - 1 )
ret = { t : "s" , v : rsst [ ridx ] } ;
else
2022-03-21 01:39:16 +00:00
throw new Error ( "Unsupported cell type " . concat ( buf [ 1 ] , " : " ) . concat ( flags & 31 , " : " ) . concat ( buf . slice ( 0 , 4 ) ) ) ;
2022-02-01 05:58:45 +00:00
}
2022-03-16 03:18:09 +00:00
break ;
case 10 :
ret = { t : "n" , v : d128 } ;
break ;
default :
2022-03-21 01:39:16 +00:00
throw new Error ( "Unsupported cell type " . concat ( buf [ 1 ] , " : " ) . concat ( flags & 31 , " : " ) . concat ( buf . slice ( 0 , 4 ) ) ) ;
2022-03-16 03:18:09 +00:00
}
return ret ;
}
2022-03-24 13:59:49 +00:00
function write _new _storage ( cell , sst ) {
var out = new Uint8Array ( 32 ) , dv = u8 _to _dataview ( out ) , l = 12 , flags = 0 ;
out [ 0 ] = 5 ;
switch ( cell . t ) {
case "n" :
out [ 1 ] = 2 ;
writeDecimal128LE ( out , l , cell . v ) ;
flags |= 1 ;
l += 16 ;
break ;
case "b" :
out [ 1 ] = 6 ;
dv . setFloat64 ( l , cell . v ? 1 : 0 , true ) ;
flags |= 2 ;
l += 8 ;
break ;
case "s" :
if ( sst . indexOf ( cell . v ) == - 1 )
throw new Error ( "Value " . concat ( cell . v , " missing from SST!" ) ) ;
out [ 1 ] = 3 ;
dv . setUint32 ( l , sst . indexOf ( cell . v ) , true ) ;
flags |= 8 ;
l += 4 ;
break ;
default :
throw "unsupported cell type " + cell . t ;
}
dv . setUint32 ( 8 , flags , true ) ;
return out . slice ( 0 , l ) ;
}
function write _old _storage ( cell , sst ) {
var out = new Uint8Array ( 32 ) , dv = u8 _to _dataview ( out ) , l = 12 , flags = 0 ;
out [ 0 ] = 3 ;
switch ( cell . t ) {
case "n" :
out [ 2 ] = 2 ;
dv . setFloat64 ( l , cell . v , true ) ;
flags |= 32 ;
l += 8 ;
break ;
case "b" :
out [ 2 ] = 6 ;
dv . setFloat64 ( l , cell . v ? 1 : 0 , true ) ;
flags |= 32 ;
l += 8 ;
break ;
case "s" :
if ( sst . indexOf ( cell . v ) == - 1 )
throw new Error ( "Value " . concat ( cell . v , " missing from SST!" ) ) ;
out [ 2 ] = 3 ;
dv . setUint32 ( l , sst . indexOf ( cell . v ) , true ) ;
flags |= 16 ;
l += 4 ;
break ;
default :
throw "unsupported cell type " + cell . t ;
}
dv . setUint32 ( 4 , flags , true ) ;
return out . slice ( 0 , l ) ;
}
2022-03-16 03:18:09 +00:00
function parse _cell _storage ( buf , sst , rsst ) {
switch ( buf [ 0 ] ) {
2022-03-21 01:39:16 +00:00
case 0 :
case 1 :
case 2 :
2022-03-16 03:18:09 +00:00
case 3 :
2022-03-21 01:39:16 +00:00
return parse _old _storage ( buf , sst , rsst , buf [ 0 ] ) ;
2022-03-16 03:18:09 +00:00
case 5 :
2022-03-24 13:59:49 +00:00
return parse _new _storage ( buf , sst , rsst ) ;
2022-03-16 03:18:09 +00:00
default :
throw new Error ( "Unsupported payload version " . concat ( buf [ 0 ] ) ) ;
2022-02-01 05:58:45 +00:00
}
2022-03-16 03:18:09 +00:00
}
function parse _TSP _Reference ( buf ) {
var pb = parse _shallow ( buf ) ;
return parse _varint49 ( pb [ 1 ] [ 0 ] . data ) ;
}
2022-03-24 13:59:49 +00:00
function write _TSP _Reference ( idx ) {
2022-03-26 21:50:27 +00:00
return write _shallow ( [
[ ] ,
[ { type : 0 , data : write _varint49 ( idx ) } ]
] ) ;
2022-03-24 13:59:49 +00:00
}
2022-03-16 03:18:09 +00:00
function parse _TST _TableDataList ( M , root ) {
var pb = parse _shallow ( root . data ) ;
var type = varint _to _i32 ( pb [ 1 ] [ 0 ] . data ) ;
var entries = pb [ 3 ] ;
var data = [ ] ;
( entries || [ ] ) . forEach ( function ( entry ) {
var le = parse _shallow ( entry . data ) ;
var key = varint _to _i32 ( le [ 1 ] [ 0 ] . data ) >>> 0 ;
switch ( type ) {
case 1 :
data [ key ] = u8str ( le [ 3 ] [ 0 ] . data ) ;
break ;
case 8 :
{
var rt = M [ parse _TSP _Reference ( le [ 9 ] [ 0 ] . data ) ] [ 0 ] ;
var rtp = parse _shallow ( rt . data ) ;
var rtpref = M [ parse _TSP _Reference ( rtp [ 1 ] [ 0 ] . data ) ] [ 0 ] ;
var mtype = varint _to _i32 ( rtpref . meta [ 1 ] [ 0 ] . data ) ;
if ( mtype != 2001 )
throw new Error ( "2000 unexpected reference to " . concat ( mtype ) ) ;
var tswpsa = parse _shallow ( rtpref . data ) ;
data [ key ] = tswpsa [ 3 ] . map ( function ( x ) {
return u8str ( x . data ) ;
} ) . join ( "" ) ;
2022-02-10 12:40:50 +00:00
}
2022-03-16 03:18:09 +00:00
break ;
}
} ) ;
return data ;
}
2022-03-21 01:39:16 +00:00
function parse _TST _TileRowInfo ( u8 , type ) {
var _a , _b , _c , _d , _e , _f , _g , _h , _i , _j , _k , _l , _m , _n ;
2022-03-16 03:18:09 +00:00
var pb = parse _shallow ( u8 ) ;
var R = varint _to _i32 ( pb [ 1 ] [ 0 ] . data ) >>> 0 ;
2022-03-21 01:39:16 +00:00
var cnt = varint _to _i32 ( pb [ 2 ] [ 0 ] . data ) >>> 0 ;
var wide _offsets = ( ( _b = ( _a = pb [ 8 ] ) == null ? void 0 : _a [ 0 ] ) == null ? void 0 : _b . data ) && varint _to _i32 ( pb [ 8 ] [ 0 ] . data ) > 0 || false ;
var used _storage _u8 , used _storage ;
if ( ( ( _d = ( _c = pb [ 7 ] ) == null ? void 0 : _c [ 0 ] ) == null ? void 0 : _d . data ) && type != 0 ) {
used _storage _u8 = ( _f = ( _e = pb [ 7 ] ) == null ? void 0 : _e [ 0 ] ) == null ? void 0 : _f . data ;
used _storage = ( _h = ( _g = pb [ 6 ] ) == null ? void 0 : _g [ 0 ] ) == null ? void 0 : _h . data ;
} else if ( ( ( _j = ( _i = pb [ 4 ] ) == null ? void 0 : _i [ 0 ] ) == null ? void 0 : _j . data ) && type != 1 ) {
used _storage _u8 = ( _l = ( _k = pb [ 4 ] ) == null ? void 0 : _k [ 0 ] ) == null ? void 0 : _l . data ;
used _storage = ( _n = ( _m = pb [ 3 ] ) == null ? void 0 : _m [ 0 ] ) == null ? void 0 : _n . data ;
} else
throw "NUMBERS Tile missing " . concat ( type , " cell storage" ) ;
2022-03-16 03:18:09 +00:00
var width = wide _offsets ? 4 : 1 ;
2022-03-21 01:39:16 +00:00
var used _storage _offsets = u8 _to _dataview ( used _storage _u8 ) ;
var offsets = [ ] ;
for ( var C = 0 ; C < used _storage _u8 . length / 2 ; ++ C ) {
var off = used _storage _offsets . getUint16 ( C * 2 , true ) ;
if ( off < 65535 )
offsets . push ( [ C , off ] ) ;
2022-02-01 05:58:45 +00:00
}
2022-03-21 01:39:16 +00:00
if ( offsets . length != cnt )
throw "Expected " . concat ( cnt , " cells, found " ) . concat ( offsets . length ) ;
var cells = [ ] ;
for ( C = 0 ; C < offsets . length - 1 ; ++ C )
cells [ offsets [ C ] [ 0 ] ] = used _storage . subarray ( offsets [ C ] [ 1 ] * width , offsets [ C + 1 ] [ 1 ] * width ) ;
2022-03-24 13:59:49 +00:00
if ( offsets . length >= 1 )
cells [ offsets [ offsets . length - 1 ] [ 0 ] ] = used _storage . subarray ( offsets [ offsets . length - 1 ] [ 1 ] * width ) ;
2022-03-16 03:18:09 +00:00
return { R : R , cells : cells } ;
}
function parse _TST _Tile ( M , root ) {
2022-03-21 01:39:16 +00:00
var _a ;
2022-03-16 03:18:09 +00:00
var pb = parse _shallow ( root . data ) ;
2022-04-11 04:11:47 +00:00
var storage = - 1 ;
if ( ( _a = pb == null ? void 0 : pb [ 7 ] ) == null ? void 0 : _a [ 0 ] ) {
if ( varint _to _i32 ( pb [ 7 ] [ 0 ] . data ) >>> 0 )
storage = 1 ;
else
storage = 0 ;
}
2022-03-21 01:39:16 +00:00
var ri = mappa ( pb [ 5 ] , function ( u8 ) {
return parse _TST _TileRowInfo ( u8 , storage ) ;
} ) ;
return {
nrows : varint _to _i32 ( pb [ 4 ] [ 0 ] . data ) >>> 0 ,
data : ri . reduce ( function ( acc , x ) {
if ( ! acc [ x . R ] )
acc [ x . R ] = [ ] ;
x . cells . forEach ( function ( cell , C ) {
if ( acc [ x . R ] [ C ] )
throw new Error ( "Duplicate cell r=" . concat ( x . R , " c=" ) . concat ( C ) ) ;
acc [ x . R ] [ C ] = cell ;
} ) ;
return acc ;
} , [ ] )
} ;
2022-03-16 03:18:09 +00:00
}
function parse _TST _TableModelArchive ( M , root , ws ) {
2022-03-26 21:50:27 +00:00
var _a , _b , _c ;
2022-03-16 03:18:09 +00:00
var pb = parse _shallow ( root . data ) ;
var range = { s : { r : 0 , c : 0 } , e : { r : 0 , c : 0 } } ;
range . e . r = ( varint _to _i32 ( pb [ 6 ] [ 0 ] . data ) >>> 0 ) - 1 ;
if ( range . e . r < 0 )
throw new Error ( "Invalid row varint " . concat ( pb [ 6 ] [ 0 ] . data ) ) ;
range . e . c = ( varint _to _i32 ( pb [ 7 ] [ 0 ] . data ) >>> 0 ) - 1 ;
if ( range . e . c < 0 )
throw new Error ( "Invalid col varint " . concat ( pb [ 7 ] [ 0 ] . data ) ) ;
ws [ "!ref" ] = encode _range ( range ) ;
2022-03-21 01:39:16 +00:00
var store = parse _shallow ( pb [ 4 ] [ 0 ] . data ) ;
var sst = parse _TST _TableDataList ( M , M [ parse _TSP _Reference ( store [ 4 ] [ 0 ] . data ) ] [ 0 ] ) ;
var rsst = ( ( _a = store [ 17 ] ) == null ? void 0 : _a [ 0 ] ) ? parse _TST _TableDataList ( M , M [ parse _TSP _Reference ( store [ 17 ] [ 0 ] . data ) ] [ 0 ] ) : [ ] ;
var tile = parse _shallow ( store [ 3 ] [ 0 ] . data ) ;
var _R = 0 ;
tile [ 1 ] . forEach ( function ( t ) {
var tl = parse _shallow ( t . data ) ;
2022-03-26 21:50:27 +00:00
var ref2 = M [ parse _TSP _Reference ( tl [ 2 ] [ 0 ] . data ) ] [ 0 ] ;
var mtype2 = varint _to _i32 ( ref2 . meta [ 1 ] [ 0 ] . data ) ;
if ( mtype2 != 6002 )
throw new Error ( "6001 unexpected reference to " . concat ( mtype2 ) ) ;
var _tile = parse _TST _Tile ( M , ref2 ) ;
2022-03-21 01:39:16 +00:00
_tile . data . forEach ( function ( row , R ) {
row . forEach ( function ( buf , C ) {
var addr = encode _cell ( { r : _R + R , c : C } ) ;
var res = parse _cell _storage ( buf , sst , rsst ) ;
if ( res )
ws [ addr ] = res ;
2022-03-16 03:18:09 +00:00
} ) ;
2022-03-21 01:39:16 +00:00
} ) ;
_R += _tile . nrows ;
} ) ;
2022-03-26 21:50:27 +00:00
if ( ( _b = store [ 13 ] ) == null ? void 0 : _b [ 0 ] ) {
var ref = M [ parse _TSP _Reference ( store [ 13 ] [ 0 ] . data ) ] [ 0 ] ;
var mtype = varint _to _i32 ( ref . meta [ 1 ] [ 0 ] . data ) ;
if ( mtype != 6144 )
throw new Error ( "Expected merge type 6144, found " . concat ( mtype ) ) ;
ws [ "!merges" ] = ( _c = parse _shallow ( ref . data ) ) == null ? void 0 : _c [ 1 ] . map ( function ( pi ) {
var merge = parse _shallow ( pi . data ) ;
var origin = u8 _to _dataview ( parse _shallow ( merge [ 1 ] [ 0 ] . data ) [ 1 ] [ 0 ] . data ) , size = u8 _to _dataview ( parse _shallow ( merge [ 2 ] [ 0 ] . data ) [ 1 ] [ 0 ] . data ) ;
return {
s : { r : origin . getUint16 ( 0 , true ) , c : origin . getUint16 ( 2 , true ) } ,
e : {
r : origin . getUint16 ( 0 , true ) + size . getUint16 ( 0 , true ) - 1 ,
c : origin . getUint16 ( 2 , true ) + size . getUint16 ( 2 , true ) - 1
}
} ;
} ) ;
}
2022-03-16 03:18:09 +00:00
}
function parse _TST _TableInfoArchive ( M , root ) {
var pb = parse _shallow ( root . data ) ;
var out = { "!ref" : "A1" } ;
var tableref = M [ parse _TSP _Reference ( pb [ 2 ] [ 0 ] . data ) ] ;
var mtype = varint _to _i32 ( tableref [ 0 ] . meta [ 1 ] [ 0 ] . data ) ;
if ( mtype != 6001 )
throw new Error ( "6000 unexpected reference to " . concat ( mtype ) ) ;
parse _TST _TableModelArchive ( M , tableref [ 0 ] , out ) ;
return out ;
}
function parse _TN _SheetArchive ( M , root ) {
var _a ;
var pb = parse _shallow ( root . data ) ;
var out = {
name : ( ( _a = pb [ 1 ] ) == null ? void 0 : _a [ 0 ] ) ? u8str ( pb [ 1 ] [ 0 ] . data ) : "" ,
sheets : [ ]
} ;
var shapeoffs = mappa ( pb [ 2 ] , parse _TSP _Reference ) ;
shapeoffs . forEach ( function ( off ) {
M [ off ] . forEach ( function ( m ) {
var mtype = varint _to _i32 ( m . meta [ 1 ] [ 0 ] . data ) ;
if ( mtype == 6e3 )
out . sheets . push ( parse _TST _TableInfoArchive ( M , m ) ) ;
2022-02-01 05:58:45 +00:00
} ) ;
2022-03-16 03:18:09 +00:00
} ) ;
return out ;
}
function parse _TN _DocumentArchive ( M , root ) {
2022-03-26 21:50:27 +00:00
var _a ;
2022-03-16 03:18:09 +00:00
var out = book _new ( ) ;
var pb = parse _shallow ( root . data ) ;
2022-03-26 21:50:27 +00:00
if ( ( _a = pb [ 2 ] ) == null ? void 0 : _a [ 0 ] )
throw new Error ( "Keynote presentations are not supported" ) ;
2022-03-16 03:18:09 +00:00
var sheetoffs = mappa ( pb [ 1 ] , parse _TSP _Reference ) ;
sheetoffs . forEach ( function ( off ) {
M [ off ] . forEach ( function ( m ) {
var mtype = varint _to _i32 ( m . meta [ 1 ] [ 0 ] . data ) ;
if ( mtype == 2 ) {
var root2 = parse _TN _SheetArchive ( M , m ) ;
2022-03-21 01:39:16 +00:00
root2 . sheets . forEach ( function ( sheet , idx ) {
book _append _sheet ( out , sheet , idx == 0 ? root2 . name : root2 . name + "_" + idx , true ) ;
2022-03-16 03:18:09 +00:00
} ) ;
}
2022-02-01 05:58:45 +00:00
} ) ;
2022-03-16 03:18:09 +00:00
} ) ;
if ( out . SheetNames . length == 0 )
throw new Error ( "Empty NUMBERS file" ) ;
return out ;
}
function parse _numbers _iwa ( cfb ) {
2022-03-26 21:50:27 +00:00
var _a , _b , _c , _d , _e , _f , _g , _h ;
2022-03-24 13:59:49 +00:00
var M = { } , indices = [ ] ;
2022-03-16 03:18:09 +00:00
cfb . FullPaths . forEach ( function ( p ) {
if ( p . match ( /\.iwpv2/ ) )
throw new Error ( "Unsupported password protection" ) ;
} ) ;
cfb . FileIndex . forEach ( function ( s ) {
if ( ! s . name . match ( /\.iwa$/ ) )
return ;
var o ;
try {
2022-03-21 01:39:16 +00:00
o = decompress _iwa _file ( s . content ) ;
2022-03-16 03:18:09 +00:00
} catch ( e ) {
return console . log ( "?? " + s . content . length + " " + ( e . message || e ) ) ;
}
var packets ;
try {
packets = parse _iwa _file ( o ) ;
} catch ( e ) {
return console . log ( "## " + ( e . message || e ) ) ;
}
packets . forEach ( function ( packet ) {
2022-03-24 13:59:49 +00:00
M [ packet . id ] = packet . messages ;
2022-03-21 01:39:16 +00:00
indices . push ( packet . id ) ;
2022-03-16 03:18:09 +00:00
} ) ;
} ) ;
2022-03-21 01:39:16 +00:00
if ( ! indices . length )
2022-03-16 03:18:09 +00:00
throw new Error ( "File has no messages" ) ;
2022-03-26 21:50:27 +00:00
if ( ( ( _d = ( _c = ( _b = ( _a = M == null ? void 0 : M [ 1 ] ) == null ? void 0 : _a [ 0 ] ) == null ? void 0 : _b . meta ) == null ? void 0 : _c [ 1 ] ) == null ? void 0 : _d [ 0 ] . data ) && varint _to _i32 ( M [ 1 ] [ 0 ] . meta [ 1 ] [ 0 ] . data ) == 1e4 )
throw new Error ( "Pages documents are not supported" ) ;
var docroot = ( ( _h = ( _g = ( _f = ( _e = M == null ? void 0 : M [ 1 ] ) == null ? void 0 : _e [ 0 ] ) == null ? void 0 : _f . meta ) == null ? void 0 : _g [ 1 ] ) == null ? void 0 : _h [ 0 ] . data ) && varint _to _i32 ( M [ 1 ] [ 0 ] . meta [ 1 ] [ 0 ] . data ) == 1 && M [ 1 ] [ 0 ] ;
2022-03-21 01:39:16 +00:00
if ( ! docroot )
indices . forEach ( function ( idx ) {
2022-03-24 13:59:49 +00:00
M [ idx ] . forEach ( function ( iwam ) {
2022-03-21 01:39:16 +00:00
var mtype = varint _to _i32 ( iwam . meta [ 1 ] [ 0 ] . data ) >>> 0 ;
if ( mtype == 1 ) {
if ( ! docroot )
docroot = iwam ;
else
throw new Error ( "Document has multiple roots" ) ;
}
} ) ;
2022-03-16 03:18:09 +00:00
} ) ;
if ( ! docroot )
throw new Error ( "Cannot find Document root" ) ;
2022-03-24 13:59:49 +00:00
return parse _TN _DocumentArchive ( M , docroot ) ;
}
2022-04-11 04:11:47 +00:00
function write _tile _row ( tri , data , SST , wide ) {
var _a , _b ;
2022-03-24 13:59:49 +00:00
if ( ! ( ( _a = tri [ 6 ] ) == null ? void 0 : _a [ 0 ] ) || ! ( ( _b = tri [ 7 ] ) == null ? void 0 : _b [ 0 ] ) )
throw "Mutation only works on post-BNC storages!" ;
var cnt = 0 ;
2022-04-11 04:11:47 +00:00
if ( tri [ 7 ] [ 0 ] . data . length < 2 * data . length ) {
var new _7 = new Uint8Array ( 2 * data . length ) ;
new _7 . set ( tri [ 7 ] [ 0 ] . data ) ;
tri [ 7 ] [ 0 ] . data = new _7 ;
}
if ( tri [ 4 ] [ 0 ] . data . length < 2 * data . length ) {
var new _4 = new Uint8Array ( 2 * data . length ) ;
new _4 . set ( tri [ 4 ] [ 0 ] . data ) ;
tri [ 4 ] [ 0 ] . data = new _4 ;
}
2022-03-24 13:59:49 +00:00
var dv = u8 _to _dataview ( tri [ 7 ] [ 0 ] . data ) , last _offset = 0 , cell _storage = [ ] ;
var _dv = u8 _to _dataview ( tri [ 4 ] [ 0 ] . data ) , _last _offset = 0 , _cell _storage = [ ] ;
2022-04-11 04:11:47 +00:00
var width = wide ? 4 : 1 ;
2022-03-24 13:59:49 +00:00
for ( var C = 0 ; C < data . length ; ++ C ) {
if ( data [ C ] == null ) {
dv . setUint16 ( C * 2 , 65535 , true ) ;
_dv . setUint16 ( C * 2 , 65535 ) ;
continue ;
}
2022-04-11 04:11:47 +00:00
dv . setUint16 ( C * 2 , last _offset / width , true ) ;
_dv . setUint16 ( C * 2 , _last _offset / width , true ) ;
2022-03-24 13:59:49 +00:00
var celload , _celload ;
switch ( typeof data [ C ] ) {
case "string" :
celload = write _new _storage ( { t : "s" , v : data [ C ] } , SST ) ;
_celload = write _old _storage ( { t : "s" , v : data [ C ] } , SST ) ;
break ;
case "number" :
celload = write _new _storage ( { t : "n" , v : data [ C ] } , SST ) ;
_celload = write _old _storage ( { t : "n" , v : data [ C ] } , SST ) ;
break ;
case "boolean" :
celload = write _new _storage ( { t : "b" , v : data [ C ] } , SST ) ;
_celload = write _old _storage ( { t : "b" , v : data [ C ] } , SST ) ;
break ;
default :
throw new Error ( "Unsupported value " + data [ C ] ) ;
}
cell _storage . push ( celload ) ;
last _offset += celload . length ;
2022-04-11 04:11:47 +00:00
{
_cell _storage . push ( _celload ) ;
_last _offset += _celload . length ;
}
2022-03-24 13:59:49 +00:00
++ cnt ;
}
tri [ 2 ] [ 0 ] . data = write _varint49 ( cnt ) ;
2022-04-11 04:11:47 +00:00
tri [ 5 ] [ 0 ] . data = write _varint49 ( 5 ) ;
2022-03-24 13:59:49 +00:00
for ( ; C < tri [ 7 ] [ 0 ] . data . length / 2 ; ++ C ) {
dv . setUint16 ( C * 2 , 65535 , true ) ;
_dv . setUint16 ( C * 2 , 65535 , true ) ;
}
tri [ 6 ] [ 0 ] . data = u8concat ( cell _storage ) ;
tri [ 3 ] [ 0 ] . data = u8concat ( _cell _storage ) ;
2022-04-11 04:11:47 +00:00
tri [ 8 ] = [ { type : 0 , data : write _varint49 ( wide ? 1 : 0 ) } ] ;
2022-03-24 13:59:49 +00:00
return cnt ;
}
2022-03-26 21:50:27 +00:00
function write _iwam ( type , payload ) {
return {
meta : [ [ ] , [ { type : 0 , data : write _varint49 ( type ) } ] ] ,
data : payload
} ;
}
2022-04-11 04:11:47 +00:00
var USE _WIDE _ROWS = true ;
2022-03-24 13:59:49 +00:00
function write _numbers _iwa ( wb , opts ) {
2022-04-11 04:11:47 +00:00
var _a ;
2022-03-24 13:59:49 +00:00
if ( ! opts || ! opts . numbers )
throw new Error ( "Must pass a `numbers` option -- check the README" ) ;
var ws = wb . Sheets [ wb . SheetNames [ 0 ] ] ;
if ( wb . SheetNames . length > 1 )
console . error ( "The Numbers writer currently writes only the first table" ) ;
var range = decode _range ( ws [ "!ref" ] ) ;
range . s . r = range . s . c = 0 ;
var trunc = false ;
2022-04-11 04:11:47 +00:00
if ( range . e . c > 999 ) {
2022-03-24 13:59:49 +00:00
trunc = true ;
2022-04-11 04:11:47 +00:00
range . e . c = 999 ;
2022-03-24 13:59:49 +00:00
}
2022-04-11 04:11:47 +00:00
if ( range . e . r > 254 ) {
2022-03-24 13:59:49 +00:00
trunc = true ;
2022-04-11 04:11:47 +00:00
range . e . r = 254 ;
2022-03-24 13:59:49 +00:00
}
if ( trunc )
console . error ( "The Numbers writer is currently limited to " . concat ( encode _range ( range ) ) ) ;
var data = sheet _to _json ( ws , { range : range , header : 1 } ) ;
var SST = [ "~Sh33tJ5~" ] ;
data . forEach ( function ( row ) {
return row . forEach ( function ( cell ) {
if ( typeof cell == "string" )
SST . push ( cell ) ;
} ) ;
} ) ;
var dependents = { } ;
var indices = [ ] ;
var cfb = CFB . read ( opts . numbers , { type : "base64" } ) ;
cfb . FileIndex . map ( function ( fi , idx ) {
return [ fi , cfb . FullPaths [ idx ] ] ;
} ) . forEach ( function ( row ) {
var fi = row [ 0 ] , fp = row [ 1 ] ;
if ( fi . type != 2 )
return ;
if ( ! fi . name . match ( /\.iwa/ ) )
return ;
var old _content = fi . content ;
var raw1 = decompress _iwa _file ( old _content ) ;
var x2 = parse _iwa _file ( raw1 ) ;
x2 . forEach ( function ( packet2 ) {
indices . push ( packet2 . id ) ;
dependents [ packet2 . id ] = { deps : [ ] , location : fp , type : varint _to _i32 ( packet2 . messages [ 0 ] . meta [ 1 ] [ 0 ] . data ) } ;
} ) ;
} ) ;
2022-03-26 21:50:27 +00:00
indices . sort ( function ( x2 , y ) {
return x2 - y ;
2022-03-24 13:59:49 +00:00
} ) ;
var indices _varint = indices . filter ( function ( x2 ) {
return x2 > 1 ;
} ) . map ( function ( x2 ) {
return [ x2 , write _varint49 ( x2 ) ] ;
} ) ;
cfb . FileIndex . map ( function ( fi , idx ) {
return [ fi , cfb . FullPaths [ idx ] ] ;
} ) . forEach ( function ( row ) {
2022-04-14 07:27:38 +00:00
var fi = row [ 0 ] ;
2022-03-24 13:59:49 +00:00
if ( ! fi . name . match ( /\.iwa/ ) )
return ;
var x2 = parse _iwa _file ( decompress _iwa _file ( fi . content ) ) ;
x2 . forEach ( function ( ia ) {
2022-04-14 07:27:38 +00:00
indices _varint . forEach ( function ( ivi ) {
if ( ia . messages . some ( function ( mess ) {
return varint _to _i32 ( mess . meta [ 1 ] [ 0 ] . data ) != 11006 && u8contains ( mess . data , ivi [ 1 ] ) ;
} ) ) {
dependents [ ivi [ 0 ] ] . deps . push ( ia . id ) ;
}
2022-03-24 13:59:49 +00:00
} ) ;
} ) ;
} ) ;
2022-03-26 21:50:27 +00:00
function get _unique _msgid ( dep ) {
2022-03-24 13:59:49 +00:00
for ( var i = 927262 ; i < 2e6 ; ++ i )
2022-03-26 21:50:27 +00:00
if ( ! dependents [ i ] ) {
dependents [ i ] = dep ;
2022-03-24 13:59:49 +00:00
return i ;
2022-03-26 21:50:27 +00:00
}
2022-03-24 13:59:49 +00:00
throw new Error ( "Too many messages" ) ;
}
var entry = CFB . find ( cfb , dependents [ 1 ] . location ) ;
var x = parse _iwa _file ( decompress _iwa _file ( entry . content ) ) ;
var docroot ;
for ( var xi = 0 ; xi < x . length ; ++ xi ) {
var packet = x [ xi ] ;
if ( packet . id == 1 )
docroot = packet ;
}
var sheetrootref = parse _TSP _Reference ( parse _shallow ( docroot . messages [ 0 ] . data ) [ 1 ] [ 0 ] . data ) ;
entry = CFB . find ( cfb , dependents [ sheetrootref ] . location ) ;
x = parse _iwa _file ( decompress _iwa _file ( entry . content ) ) ;
for ( xi = 0 ; xi < x . length ; ++ xi ) {
packet = x [ xi ] ;
if ( packet . id == sheetrootref )
docroot = packet ;
}
2022-03-26 21:50:27 +00:00
var sheetref = parse _shallow ( docroot . messages [ 0 ] . data ) ;
{
sheetref [ 1 ] = [ { type : 2 , data : stru8 ( wb . SheetNames [ 0 ] ) } ] ;
}
docroot . messages [ 0 ] . data = write _shallow ( sheetref ) ;
entry . content = compress _iwa _file ( write _iwa _file ( x ) ) ;
entry . size = entry . content . length ;
sheetrootref = parse _TSP _Reference ( sheetref [ 2 ] [ 0 ] . data ) ;
2022-03-24 13:59:49 +00:00
entry = CFB . find ( cfb , dependents [ sheetrootref ] . location ) ;
x = parse _iwa _file ( decompress _iwa _file ( entry . content ) ) ;
for ( xi = 0 ; xi < x . length ; ++ xi ) {
packet = x [ xi ] ;
if ( packet . id == sheetrootref )
docroot = packet ;
}
sheetrootref = parse _TSP _Reference ( parse _shallow ( docroot . messages [ 0 ] . data ) [ 2 ] [ 0 ] . data ) ;
entry = CFB . find ( cfb , dependents [ sheetrootref ] . location ) ;
x = parse _iwa _file ( decompress _iwa _file ( entry . content ) ) ;
for ( xi = 0 ; xi < x . length ; ++ xi ) {
packet = x [ xi ] ;
if ( packet . id == sheetrootref )
docroot = packet ;
}
var pb = parse _shallow ( docroot . messages [ 0 ] . data ) ;
{
pb [ 6 ] [ 0 ] . data = write _varint49 ( range . e . r + 1 ) ;
pb [ 7 ] [ 0 ] . data = write _varint49 ( range . e . c + 1 ) ;
var cruidsref = parse _TSP _Reference ( pb [ 46 ] [ 0 ] . data ) ;
var oldbucket = CFB . find ( cfb , dependents [ cruidsref ] . location ) ;
var _x = parse _iwa _file ( decompress _iwa _file ( oldbucket . content ) ) ;
{
for ( var j = 0 ; j < _x . length ; ++ j ) {
if ( _x [ j ] . id == cruidsref )
break ;
}
if ( _x [ j ] . id != cruidsref )
throw "Bad ColumnRowUIDMapArchive" ;
var cruids = parse _shallow ( _x [ j ] . messages [ 0 ] . data ) ;
cruids [ 1 ] = [ ] ;
cruids [ 2 ] = [ ] , cruids [ 3 ] = [ ] ;
for ( var C = 0 ; C <= range . e . c ; ++ C ) {
2022-03-26 21:50:27 +00:00
cruids [ 1 ] . push ( { type : 2 , data : write _shallow ( [
[ ] ,
[ { type : 0 , data : write _varint49 ( C + 420690 ) } ] ,
[ { type : 0 , data : write _varint49 ( C + 420690 ) } ]
] ) } ) ;
2022-03-24 13:59:49 +00:00
cruids [ 2 ] . push ( { type : 0 , data : write _varint49 ( C ) } ) ;
cruids [ 3 ] . push ( { type : 0 , data : write _varint49 ( C ) } ) ;
}
cruids [ 4 ] = [ ] ;
cruids [ 5 ] = [ ] , cruids [ 6 ] = [ ] ;
for ( var R = 0 ; R <= range . e . r ; ++ R ) {
2022-03-26 21:50:27 +00:00
cruids [ 4 ] . push ( { type : 2 , data : write _shallow ( [
[ ] ,
[ { type : 0 , data : write _varint49 ( R + 726270 ) } ] ,
[ { type : 0 , data : write _varint49 ( R + 726270 ) } ]
] ) } ) ;
2022-03-24 13:59:49 +00:00
cruids [ 5 ] . push ( { type : 0 , data : write _varint49 ( R ) } ) ;
cruids [ 6 ] . push ( { type : 0 , data : write _varint49 ( R ) } ) ;
}
_x [ j ] . messages [ 0 ] . data = write _shallow ( cruids ) ;
}
oldbucket . content = compress _iwa _file ( write _iwa _file ( _x ) ) ;
oldbucket . size = oldbucket . content . length ;
delete pb [ 46 ] ;
var store = parse _shallow ( pb [ 4 ] [ 0 ] . data ) ;
{
store [ 7 ] [ 0 ] . data = write _varint49 ( range . e . r + 1 ) ;
var row _headers = parse _shallow ( store [ 1 ] [ 0 ] . data ) ;
var row _header _ref = parse _TSP _Reference ( row _headers [ 2 ] [ 0 ] . data ) ;
oldbucket = CFB . find ( cfb , dependents [ row _header _ref ] . location ) ;
_x = parse _iwa _file ( decompress _iwa _file ( oldbucket . content ) ) ;
{
if ( _x [ 0 ] . id != row _header _ref )
throw "Bad HeaderStorageBucket" ;
var base _bucket = parse _shallow ( _x [ 0 ] . messages [ 0 ] . data ) ;
2022-04-11 04:11:47 +00:00
if ( ( _a = base _bucket == null ? void 0 : base _bucket [ 2 ] ) == null ? void 0 : _a [ 0 ] )
for ( R = 0 ; R < data . length ; ++ R ) {
var _bucket = parse _shallow ( base _bucket [ 2 ] [ 0 ] . data ) ;
_bucket [ 1 ] [ 0 ] . data = write _varint49 ( R ) ;
_bucket [ 4 ] [ 0 ] . data = write _varint49 ( data [ R ] . length ) ;
base _bucket [ 2 ] [ R ] = { type : base _bucket [ 2 ] [ 0 ] . type , data : write _shallow ( _bucket ) } ;
}
2022-03-24 13:59:49 +00:00
_x [ 0 ] . messages [ 0 ] . data = write _shallow ( base _bucket ) ;
}
oldbucket . content = compress _iwa _file ( write _iwa _file ( _x ) ) ;
oldbucket . size = oldbucket . content . length ;
var col _header _ref = parse _TSP _Reference ( store [ 2 ] [ 0 ] . data ) ;
oldbucket = CFB . find ( cfb , dependents [ col _header _ref ] . location ) ;
_x = parse _iwa _file ( decompress _iwa _file ( oldbucket . content ) ) ;
{
if ( _x [ 0 ] . id != col _header _ref )
throw "Bad HeaderStorageBucket" ;
base _bucket = parse _shallow ( _x [ 0 ] . messages [ 0 ] . data ) ;
for ( C = 0 ; C <= range . e . c ; ++ C ) {
_bucket = parse _shallow ( base _bucket [ 2 ] [ 0 ] . data ) ;
_bucket [ 1 ] [ 0 ] . data = write _varint49 ( C ) ;
_bucket [ 4 ] [ 0 ] . data = write _varint49 ( range . e . r + 1 ) ;
base _bucket [ 2 ] [ C ] = { type : base _bucket [ 2 ] [ 0 ] . type , data : write _shallow ( _bucket ) } ;
}
_x [ 0 ] . messages [ 0 ] . data = write _shallow ( base _bucket ) ;
}
oldbucket . content = compress _iwa _file ( write _iwa _file ( _x ) ) ;
oldbucket . size = oldbucket . content . length ;
2022-03-26 21:50:27 +00:00
if ( ws [ "!merges" ] ) {
var mergeid = get _unique _msgid ( {
type : 6144 ,
deps : [ sheetrootref ] ,
location : dependents [ sheetrootref ] . location
} ) ;
var mergedata = [ [ ] , [ ] ] ;
ws [ "!merges" ] . forEach ( function ( m ) {
mergedata [ 1 ] . push ( { type : 2 , data : write _shallow ( [
[ ] ,
[ { type : 2 , data : write _shallow ( [
[ ] ,
[ { type : 5 , data : new Uint8Array ( new Uint16Array ( [ m . s . r , m . s . c ] ) . buffer ) } ]
] ) } ] ,
[ { type : 2 , data : write _shallow ( [
[ ] ,
[ { type : 5 , data : new Uint8Array ( new Uint16Array ( [ m . e . r - m . s . r + 1 , m . e . c - m . s . c + 1 ] ) . buffer ) } ]
] ) } ]
] ) } ) ;
} ) ;
store [ 13 ] = [ { type : 2 , data : write _TSP _Reference ( mergeid ) } ] ;
x . push ( {
id : mergeid ,
messages : [ write _iwam ( 6144 , write _shallow ( mergedata ) ) ]
} ) ;
}
2022-03-24 13:59:49 +00:00
var sstref = parse _TSP _Reference ( store [ 4 ] [ 0 ] . data ) ;
( function ( ) {
var sentry = CFB . find ( cfb , dependents [ sstref ] . location ) ;
var sx = parse _iwa _file ( decompress _iwa _file ( sentry . content ) ) ;
var sstroot ;
for ( var sxi = 0 ; sxi < sx . length ; ++ sxi ) {
var packet2 = sx [ sxi ] ;
if ( packet2 . id == sstref )
sstroot = packet2 ;
}
var sstdata = parse _shallow ( sstroot . messages [ 0 ] . data ) ;
{
sstdata [ 3 ] = [ ] ;
SST . forEach ( function ( str , i ) {
2022-03-26 21:50:27 +00:00
sstdata [ 3 ] . push ( { type : 2 , data : write _shallow ( [
[ ] ,
[ { type : 0 , data : write _varint49 ( i ) } ] ,
[ { type : 0 , data : write _varint49 ( 1 ) } ] ,
[ { type : 2 , data : stru8 ( str ) } ]
] ) } ) ;
2022-03-24 13:59:49 +00:00
} ) ;
}
sstroot . messages [ 0 ] . data = write _shallow ( sstdata ) ;
2022-03-26 21:50:27 +00:00
sentry . content = compress _iwa _file ( write _iwa _file ( sx ) ) ;
2022-03-24 13:59:49 +00:00
sentry . size = sentry . content . length ;
} ) ( ) ;
var tile = parse _shallow ( store [ 3 ] [ 0 ] . data ) ;
{
var t = tile [ 1 ] [ 0 ] ;
2022-04-11 04:11:47 +00:00
tile [ 3 ] = [ { type : 0 , data : write _varint49 ( USE _WIDE _ROWS ? 1 : 0 ) } ] ;
2022-03-24 13:59:49 +00:00
var tl = parse _shallow ( t . data ) ;
{
var tileref = parse _TSP _Reference ( tl [ 2 ] [ 0 ] . data ) ;
( function ( ) {
var tentry = CFB . find ( cfb , dependents [ tileref ] . location ) ;
var tx = parse _iwa _file ( decompress _iwa _file ( tentry . content ) ) ;
var tileroot ;
for ( var sxi = 0 ; sxi < tx . length ; ++ sxi ) {
var packet2 = tx [ sxi ] ;
if ( packet2 . id == tileref )
tileroot = packet2 ;
}
var tiledata = parse _shallow ( tileroot . messages [ 0 ] . data ) ;
{
delete tiledata [ 6 ] ;
delete tile [ 7 ] ;
var rowload = new Uint8Array ( tiledata [ 5 ] [ 0 ] . data ) ;
tiledata [ 5 ] = [ ] ;
for ( var R2 = 0 ; R2 <= range . e . r ; ++ R2 ) {
var tilerow = parse _shallow ( rowload ) ;
2022-04-14 07:27:38 +00:00
write _tile _row ( tilerow , data [ R2 ] , SST , USE _WIDE _ROWS ) ;
2022-03-24 13:59:49 +00:00
tilerow [ 1 ] [ 0 ] . data = write _varint49 ( R2 ) ;
tiledata [ 5 ] . push ( { data : write _shallow ( tilerow ) , type : 2 } ) ;
}
2022-04-11 04:11:47 +00:00
tiledata [ 1 ] = [ { type : 0 , data : write _varint49 ( 0 ) } ] ;
tiledata [ 2 ] = [ { type : 0 , data : write _varint49 ( 0 ) } ] ;
tiledata [ 3 ] = [ { type : 0 , data : write _varint49 ( 0 ) } ] ;
2022-03-24 13:59:49 +00:00
tiledata [ 4 ] = [ { type : 0 , data : write _varint49 ( range . e . r + 1 ) } ] ;
2022-04-11 04:11:47 +00:00
tiledata [ 6 ] = [ { type : 0 , data : write _varint49 ( 5 ) } ] ;
tiledata [ 7 ] = [ { type : 0 , data : write _varint49 ( 1 ) } ] ;
tiledata [ 8 ] = [ { type : 0 , data : write _varint49 ( USE _WIDE _ROWS ? 1 : 0 ) } ] ;
2022-03-24 13:59:49 +00:00
}
tileroot . messages [ 0 ] . data = write _shallow ( tiledata ) ;
2022-03-26 21:50:27 +00:00
tentry . content = compress _iwa _file ( write _iwa _file ( tx ) ) ;
2022-03-24 13:59:49 +00:00
tentry . size = tentry . content . length ;
} ) ( ) ;
}
t . data = write _shallow ( tl ) ;
}
store [ 3 ] [ 0 ] . data = write _shallow ( tile ) ;
}
pb [ 4 ] [ 0 ] . data = write _shallow ( store ) ;
}
docroot . messages [ 0 ] . data = write _shallow ( pb ) ;
2022-03-26 21:50:27 +00:00
entry . content = compress _iwa _file ( write _iwa _file ( x ) ) ;
2022-03-24 13:59:49 +00:00
entry . size = entry . content . length ;
return cfb ;
2022-03-16 03:18:09 +00:00
}
2017-02-10 19:23:01 +00:00
function fix _opts _func ( defaults /*:Array<Array<any> >*/ ) /*:{(o:any):void}*/ {
2017-02-03 20:50:45 +00:00
return function fix _opts ( opts ) {
for ( var i = 0 ; i != defaults . length ; ++ i ) {
var d = defaults [ i ] ;
if ( opts [ d [ 0 ] ] === undefined ) opts [ d [ 0 ] ] = d [ 1 ] ;
if ( d [ 2 ] === 'n' ) opts [ d [ 0 ] ] = Number ( opts [ d [ 0 ] ] ) ;
}
} ;
}
2022-03-16 03:18:09 +00:00
function fix _read _opts ( opts ) {
2020-09-11 08:38:33 +00:00
fix _opts _func ( [
2017-02-03 20:50:45 +00:00
[ 'cellNF' , false ] , /* emit cell number format string as .z */
[ 'cellHTML' , true ] , /* emit html string as .h */
[ 'cellFormula' , true ] , /* emit formulae as .f */
[ 'cellStyles' , false ] , /* emits style/theme as .s */
2017-04-21 22:02:02 +00:00
[ 'cellText' , true ] , /* emit formatted text as .w */
2017-02-03 20:50:45 +00:00
[ 'cellDates' , false ] , /* emit date cells with type `d` */
[ 'sheetStubs' , false ] , /* emit empty cells */
[ 'sheetRows' , 0 , 'n' ] , /* read n rows (0 = read all rows) */
[ 'bookDeps' , false ] , /* parse calculation chains */
[ 'bookSheets' , false ] , /* only try to get sheet names (no Sheets) */
[ 'bookProps' , false ] , /* only try to get properties (no Sheets) */
[ 'bookFiles' , false ] , /* include raw file structure (keys, files, cfb) */
[ 'bookVBA' , false ] , /* include vba raw data (vbaraw) */
[ 'password' , '' ] , /* password */
[ 'WTF' , false ] /* WTF mode (throws errors) */
2020-09-11 08:38:33 +00:00
] ) ( opts ) ;
2022-03-16 03:18:09 +00:00
}
2017-02-03 20:50:45 +00:00
2022-03-16 03:18:09 +00:00
function fix _write _opts ( opts ) {
fix _opts _func ( [
2017-02-03 20:50:45 +00:00
[ 'cellDates' , false ] , /* write date cells with type `d` */
[ 'bookSST' , false ] , /* Generate Shared String Table */
[ 'bookType' , 'xlsx' ] , /* Type of workbook (xlsx/m/b) */
[ 'compression' , false ] , /* Use file compression */
[ 'WTF' , false ] /* WTF mode (throws errors) */
2022-03-16 03:18:09 +00:00
] ) ( opts ) ;
}
2017-05-13 18:21:22 +00:00
function get _sheet _type ( n /*:string*/ ) /*:string*/ {
2017-03-28 04:41:01 +00:00
if ( RELS . WS . indexOf ( n ) > - 1 ) return "sheet" ;
if ( RELS . CS && n == RELS . CS ) return "chart" ;
if ( RELS . DS && n == RELS . DS ) return "dialog" ;
if ( RELS . MS && n == RELS . MS ) return "macro" ;
2017-09-30 06:18:11 +00:00
return ( n && n . length ) ? n : "sheet" ;
2017-03-28 04:41:01 +00:00
}
2017-02-03 20:50:45 +00:00
function safe _parse _wbrels ( wbrels , sheets ) {
if ( ! wbrels ) return 0 ;
try {
2017-03-28 04:41:01 +00:00
wbrels = sheets . map ( function pwbr ( w ) { if ( ! w . id ) w . id = w . strRelID ; return [ w . name , wbrels [ '!id' ] [ w . id ] . Target , get _sheet _type ( wbrels [ '!id' ] [ w . id ] . Type ) ] ; } ) ;
2017-02-03 20:50:45 +00:00
} catch ( e ) { return null ; }
return ! wbrels || wbrels . length === 0 ? null : wbrels ;
}
2017-11-20 01:51:14 +00:00
function safe _parse _sheet ( zip , path /*:string*/ , relsPath /*:string*/ , sheet , idx /*:number*/ , sheetRels , sheets , stype /*:string*/ , opts , wb , themes , styles ) {
2017-02-03 20:50:45 +00:00
try {
2017-02-10 19:23:01 +00:00
sheetRels [ sheet ] = parse _rels ( getzipstr ( zip , relsPath , true ) , path ) ;
2017-03-27 21:35:15 +00:00
var data = getzipdata ( zip , path ) ;
2018-06-22 21:40:01 +00:00
var _ws ;
2017-03-27 21:35:15 +00:00
switch ( stype ) {
2018-06-22 21:40:01 +00:00
case 'sheet' : _ws = parse _ws ( data , path , idx , opts , sheetRels [ sheet ] , wb , themes , styles ) ; break ;
case 'chart' : _ws = parse _cs ( data , path , idx , opts , sheetRels [ sheet ] , wb , themes , styles ) ;
2019-11-15 01:46:49 +00:00
if ( ! _ws || ! _ws [ '!drawel' ] ) break ;
var dfile = resolve _path ( _ws [ '!drawel' ] . Target , path ) ;
2017-03-27 21:35:15 +00:00
var drelsp = get _rels _path ( dfile ) ;
2017-11-20 01:51:14 +00:00
var draw = parse _drawing ( getzipstr ( zip , dfile , true ) , parse _rels ( getzipstr ( zip , drelsp , true ) , dfile ) ) ;
2017-03-27 21:35:15 +00:00
var chartp = resolve _path ( draw , dfile ) ;
var crelsp = get _rels _path ( chartp ) ;
2018-06-22 21:40:01 +00:00
_ws = parse _chart ( getzipstr ( zip , chartp , true ) , chartp , opts , parse _rels ( getzipstr ( zip , crelsp , true ) , chartp ) , wb , _ws ) ;
2017-03-27 21:35:15 +00:00
break ;
2018-06-22 21:40:01 +00:00
case 'macro' : _ws = parse _ms ( data , path , idx , opts , sheetRels [ sheet ] , wb , themes , styles ) ; break ;
case 'dialog' : _ws = parse _ds ( data , path , idx , opts , sheetRels [ sheet ] , wb , themes , styles ) ; break ;
2019-11-01 03:09:14 +00:00
default : throw new Error ( "Unrecognized sheet type " + stype ) ;
2017-03-27 21:35:15 +00:00
}
2018-06-22 21:40:01 +00:00
sheets [ sheet ] = _ws ;
2019-11-01 03:09:14 +00:00
2022-03-16 03:18:09 +00:00
/* scan rels for comments and threaded comments */
var tcomments = [ ] ;
2019-11-01 03:09:14 +00:00
if ( sheetRels && sheetRels [ sheet ] ) keys ( sheetRels [ sheet ] ) . forEach ( function ( n ) {
2022-03-16 03:18:09 +00:00
var dfile = "" ;
2019-11-01 03:09:14 +00:00
if ( sheetRels [ sheet ] [ n ] . Type == RELS . CMNT ) {
2022-03-16 03:18:09 +00:00
dfile = resolve _path ( sheetRels [ sheet ] [ n ] . Target , path ) ;
var comments = parse _cmnt ( getzipdata ( zip , dfile , true ) , dfile , opts ) ;
2019-11-01 03:09:14 +00:00
if ( ! comments || ! comments . length ) return ;
2022-03-16 03:18:09 +00:00
sheet _insert _comments ( _ws , comments , false ) ;
}
if ( sheetRels [ sheet ] [ n ] . Type == RELS . TCMNT ) {
dfile = resolve _path ( sheetRels [ sheet ] [ n ] . Target , path ) ;
tcomments = tcomments . concat ( parse _tcmnt _xml ( getzipdata ( zip , dfile , true ) , opts ) ) ;
2019-11-01 03:09:14 +00:00
}
} ) ;
2022-03-16 03:18:09 +00:00
if ( tcomments && tcomments . length ) sheet _insert _comments ( _ws , tcomments , true , opts . people || [ ] ) ;
2017-02-03 20:50:45 +00:00
} catch ( e ) { if ( opts . WTF ) throw e ; }
}
2017-08-19 23:06:34 +00:00
function strip _front _slash ( x /*:string*/ ) /*:string*/ { return x . charAt ( 0 ) == '/' ? x . slice ( 1 ) : x ; }
2017-02-10 19:23:01 +00:00
function parse _zip ( zip /*:ZIP*/ , opts /*:?ParseOpts*/ ) /*:Workbook*/ {
2022-03-20 05:29:24 +00:00
make _ssf ( ) ;
2017-02-03 20:50:45 +00:00
opts = opts || { } ;
fix _read _opts ( opts ) ;
/* OpenDocument Part 3 Section 2.2.1 OpenDocument Package */
if ( safegetzipfile ( zip , 'META-INF/manifest.xml' ) ) return parse _ods ( zip , opts ) ;
2017-02-22 06:57:59 +00:00
/* UOC */
if ( safegetzipfile ( zip , 'objectdata.xml' ) ) return parse _ods ( zip , opts ) ;
2017-10-17 00:14:32 +00:00
/* Numbers */
2022-02-01 05:58:45 +00:00
if ( safegetzipfile ( zip , 'Index/Document.iwa' ) ) {
if ( typeof Uint8Array == "undefined" ) throw new Error ( 'NUMBERS file parsing requires Uint8Array support' ) ;
2022-03-16 03:18:09 +00:00
if ( typeof parse _numbers _iwa != "undefined" ) {
if ( zip . FileIndex ) return parse _numbers _iwa ( zip ) ;
2022-02-01 05:58:45 +00:00
var _zip = CFB . utils . cfb _new ( ) ;
zipentries ( zip ) . forEach ( function ( e ) { zip _add _file ( _zip , e , getzipbin ( zip , e ) ) ; } ) ;
2022-03-16 03:18:09 +00:00
return parse _numbers _iwa ( _zip ) ;
2022-02-01 05:58:45 +00:00
}
throw new Error ( 'Unsupported NUMBERS file' ) ;
}
2022-01-10 18:45:50 +00:00
if ( ! safegetzipfile ( zip , '[Content_Types].xml' ) ) {
if ( safegetzipfile ( zip , 'index.xml.gz' ) ) throw new Error ( 'Unsupported NUMBERS 08 file' ) ;
if ( safegetzipfile ( zip , 'index.xml' ) ) throw new Error ( 'Unsupported NUMBERS 09 file' ) ;
throw new Error ( 'Unsupported ZIP file' ) ;
}
2017-02-03 20:50:45 +00:00
2018-02-28 10:41:49 +00:00
var entries = zipentries ( zip ) ;
2018-01-23 09:07:51 +00:00
var dir = parse _ct ( ( getzipstr ( zip , '[Content_Types].xml' ) /*:?any*/ ) ) ;
2017-02-03 20:50:45 +00:00
var xlsb = false ;
var sheets , binname ;
if ( dir . workbooks . length === 0 ) {
binname = "xl/workbook.xml" ;
if ( getzipdata ( zip , binname , true ) ) dir . workbooks . push ( binname ) ;
}
if ( dir . workbooks . length === 0 ) {
binname = "xl/workbook.bin" ;
2017-07-05 22:27:54 +00:00
if ( ! getzipdata ( zip , binname , true ) ) throw new Error ( "Could not find workbook" ) ;
2017-02-03 20:50:45 +00:00
dir . workbooks . push ( binname ) ;
xlsb = true ;
}
2017-02-22 06:57:59 +00:00
if ( dir . workbooks [ 0 ] . slice ( - 3 ) == "bin" ) xlsb = true ;
2017-02-03 20:50:45 +00:00
2017-03-18 23:25:50 +00:00
var themes = ( { } /*:any*/ ) ;
var styles = ( { } /*:any*/ ) ;
2017-02-03 20:50:45 +00:00
if ( ! opts . bookSheets && ! opts . bookProps ) {
strs = [ ] ;
2018-05-05 06:34:37 +00:00
if ( dir . sst ) try { strs = parse _sst ( getzipdata ( zip , strip _front _slash ( dir . sst ) ) , dir . sst , opts ) ; } catch ( e ) { if ( opts . WTF ) throw e ; }
2017-02-03 20:50:45 +00:00
2022-04-14 07:27:38 +00:00
if ( opts . cellStyles && dir . themes . length ) themes = parse _theme _xml ( getzipstr ( zip , dir . themes [ 0 ] . replace ( /^\// , '' ) , true ) || "" , opts ) ;
2017-03-19 06:50:30 +00:00
2017-08-19 23:06:34 +00:00
if ( dir . style ) styles = parse _sty ( getzipdata ( zip , strip _front _slash ( dir . style ) ) , dir . style , themes , opts ) ;
2017-02-03 20:50:45 +00:00
}
2018-01-23 09:07:51 +00:00
/*var externbooks = */ dir . links . map ( function ( link ) {
2019-11-01 03:09:14 +00:00
try {
var rels = parse _rels ( getzipstr ( zip , get _rels _path ( strip _front _slash ( link ) ) ) , link ) ;
return parse _xlink ( getzipdata ( zip , strip _front _slash ( link ) ) , rels , link , opts ) ;
} catch ( e ) { }
2017-08-19 23:06:34 +00:00
} ) ;
var wb = parse _wb ( getzipdata ( zip , strip _front _slash ( dir . workbooks [ 0 ] ) ) , dir . workbooks [ 0 ] , opts ) ;
2017-02-03 20:50:45 +00:00
var props = { } , propdata = "" ;
2017-08-19 23:06:34 +00:00
if ( dir . coreprops . length ) {
2017-09-30 06:18:11 +00:00
propdata = getzipdata ( zip , strip _front _slash ( dir . coreprops [ 0 ] ) , true ) ;
2017-02-03 20:50:45 +00:00
if ( propdata ) props = parse _core _props ( propdata ) ;
if ( dir . extprops . length !== 0 ) {
2017-09-30 06:18:11 +00:00
propdata = getzipdata ( zip , strip _front _slash ( dir . extprops [ 0 ] ) , true ) ;
2017-08-03 15:51:16 +00:00
if ( propdata ) parse _ext _props ( propdata , props , opts ) ;
2017-02-03 20:50:45 +00:00
}
}
var custprops = { } ;
if ( ! opts . bookSheets || opts . bookProps ) {
if ( dir . custprops . length !== 0 ) {
2017-08-19 23:06:34 +00:00
propdata = getzipstr ( zip , strip _front _slash ( dir . custprops [ 0 ] ) , true ) ;
2017-02-03 20:50:45 +00:00
if ( propdata ) custprops = parse _cust _props ( propdata , opts ) ;
}
}
2017-03-12 18:02:43 +00:00
var out = ( { } /*:any*/ ) ;
2017-02-03 20:50:45 +00:00
if ( opts . bookSheets || opts . bookProps ) {
2017-03-27 21:35:15 +00:00
if ( wb . Sheets ) sheets = wb . Sheets . map ( function pluck ( x ) { return x . name ; } ) ;
else if ( props . Worksheets && props . SheetNames . length > 0 ) sheets = props . SheetNames ;
2017-02-03 20:50:45 +00:00
if ( opts . bookProps ) { out . Props = props ; out . Custprops = custprops ; }
2017-03-12 18:02:43 +00:00
if ( opts . bookSheets && typeof sheets !== 'undefined' ) out . SheetNames = sheets ;
2017-02-03 20:50:45 +00:00
if ( opts . bookSheets ? out . SheetNames : opts . bookProps ) return out ;
}
sheets = { } ;
var deps = { } ;
2017-08-19 23:06:34 +00:00
if ( opts . bookDeps && dir . calcchain ) deps = parse _cc ( getzipdata ( zip , strip _front _slash ( dir . calcchain ) ) , dir . calcchain , opts ) ;
2017-02-03 20:50:45 +00:00
var i = 0 ;
2017-02-10 19:23:01 +00:00
var sheetRels = ( { } /*:any*/ ) ;
2017-02-03 20:50:45 +00:00
var path , relsPath ;
2017-03-31 18:46:42 +00:00
2017-04-08 06:55:35 +00:00
{
2017-02-03 20:50:45 +00:00
var wbsheets = wb . Sheets ;
props . Worksheets = wbsheets . length ;
props . SheetNames = [ ] ;
for ( var j = 0 ; j != wbsheets . length ; ++ j ) {
props . SheetNames [ j ] = wbsheets [ j ] . name ;
}
2017-04-08 06:55:35 +00:00
}
2017-02-03 20:50:45 +00:00
var wbext = xlsb ? "bin" : "xml" ;
2018-04-13 04:48:21 +00:00
var wbrelsi = dir . workbooks [ 0 ] . lastIndexOf ( "/" ) ;
var wbrelsfile = ( dir . workbooks [ 0 ] . slice ( 0 , wbrelsi + 1 ) + "_rels/" + dir . workbooks [ 0 ] . slice ( wbrelsi + 1 ) + ".rels" ) . replace ( /^\// , "" ) ;
if ( ! safegetzipfile ( zip , wbrelsfile ) ) wbrelsfile = 'xl/_rels/workbook.' + wbext + '.rels' ;
2022-03-03 08:35:39 +00:00
var wbrels = parse _rels ( getzipstr ( zip , wbrelsfile , true ) , wbrelsfile . replace ( /_rels.*/ , "s5s" ) ) ;
if ( ( dir . metadata || [ ] ) . length >= 1 ) {
/* TODO: MDX and other types of metadata */
opts . xlmeta = parse _xlmeta ( getzipdata ( zip , strip _front _slash ( dir . metadata [ 0 ] ) ) , dir . metadata [ 0 ] , opts ) ;
}
2022-03-16 03:18:09 +00:00
if ( ( dir . people || [ ] ) . length >= 1 ) {
opts . people = parse _people _xml ( getzipdata ( zip , strip _front _slash ( dir . people [ 0 ] ) ) , opts ) ;
}
2018-04-13 04:48:21 +00:00
2022-03-16 03:18:09 +00:00
if ( wbrels ) wbrels = safe _parse _wbrels ( wbrels , wb . Sheets ) ;
2022-03-03 08:35:39 +00:00
2017-02-03 20:50:45 +00:00
/* Numbers iOS hack */
var nmode = ( getzipdata ( zip , "xl/worksheets/sheet.xml" , true ) ) ? 1 : 0 ;
2020-01-28 01:20:38 +00:00
wsloop : for ( i = 0 ; i != props . Worksheets ; ++ i ) {
2017-03-27 21:35:15 +00:00
var stype = "sheet" ;
if ( wbrels && wbrels [ i ] ) {
path = 'xl/' + ( wbrels [ i ] [ 1 ] ) . replace ( /[\/]?xl\// , "" ) ;
2018-04-13 04:48:21 +00:00
if ( ! safegetzipfile ( zip , path ) ) path = wbrels [ i ] [ 1 ] ;
if ( ! safegetzipfile ( zip , path ) ) path = wbrelsfile . replace ( /_rels\/.*$/ , "" ) + wbrels [ i ] [ 1 ] ;
2017-03-27 21:35:15 +00:00
stype = wbrels [ i ] [ 2 ] ;
} else {
2017-02-03 20:50:45 +00:00
path = 'xl/worksheets/sheet' + ( i + 1 - nmode ) + "." + wbext ;
path = path . replace ( /sheet0\./ , "sheet." ) ;
}
relsPath = path . replace ( /^(.*)(\/)([^\/]*)$/ , "$1/_rels/$3.rels" ) ;
2020-01-28 01:20:38 +00:00
if ( opts && opts . sheets != null ) switch ( typeof opts . sheets ) {
case "number" : if ( i != opts . sheets ) continue wsloop ; break ;
case "string" : if ( props . SheetNames [ i ] . toLowerCase ( ) != opts . sheets . toLowerCase ( ) ) continue wsloop ; break ;
default : if ( Array . isArray && Array . isArray ( opts . sheets ) ) {
var snjseen = false ;
for ( var snj = 0 ; snj != opts . sheets . length ; ++ snj ) {
if ( typeof opts . sheets [ snj ] == "number" && opts . sheets [ snj ] == i ) snjseen = 1 ;
if ( typeof opts . sheets [ snj ] == "string" && opts . sheets [ snj ] . toLowerCase ( ) == props . SheetNames [ i ] . toLowerCase ( ) ) snjseen = 1 ;
}
if ( ! snjseen ) continue wsloop ;
}
}
2017-11-20 01:51:14 +00:00
safe _parse _sheet ( zip , path , relsPath , props . SheetNames [ i ] , i , sheetRels , sheets , stype , opts , wb , themes , styles ) ;
2017-02-03 20:50:45 +00:00
}
2017-02-10 19:23:01 +00:00
out = ( {
2017-02-03 20:50:45 +00:00
Directory : dir ,
Workbook : wb ,
Props : props ,
Custprops : custprops ,
Deps : deps ,
Sheets : sheets ,
SheetNames : props . SheetNames ,
Strings : strs ,
Styles : styles ,
Themes : themes ,
2022-03-20 05:29:24 +00:00
SSF : dup ( table _fmt )
2017-02-10 19:23:01 +00:00
} /*:any*/ ) ;
2020-01-28 01:20:38 +00:00
if ( opts && opts . bookFiles ) {
2021-10-13 07:20:25 +00:00
if ( zip . files ) {
out . keys = entries ;
out . files = zip . files ;
} else {
out . keys = [ ] ;
out . files = { } ;
zip . FullPaths . forEach ( function ( p , idx ) {
p = p . replace ( /^Root Entry[\/]/ , "" ) ;
out . keys . push ( p ) ;
out . files [ p ] = zip . FileIndex [ idx ] ;
} ) ;
}
2017-02-03 20:50:45 +00:00
}
2020-01-28 01:20:38 +00:00
if ( opts && opts . bookVBA ) {
2017-08-19 23:06:34 +00:00
if ( dir . vba . length > 0 ) out . vbaraw = getzipdata ( zip , strip _front _slash ( dir . vba [ 0 ] ) , true ) ;
2018-02-04 23:58:00 +00:00
else if ( dir . defaults && dir . defaults . bin === CT _VBA ) out . vbaraw = getzipdata ( zip , 'xl/vbaProject.bin' , true ) ;
2017-02-03 20:50:45 +00:00
}
return out ;
}
2017-04-13 01:29:38 +00:00
2017-12-01 05:48:10 +00:00
/* [MS-OFFCRYPTO] 2.1.1 */
function parse _xlsxcfb ( cfb , _opts /*:?ParseOpts*/ ) /*:Workbook*/ {
var opts = _opts || { } ;
2018-06-22 21:40:01 +00:00
var f = 'Workbook' , data = CFB . find ( cfb , f ) ;
try {
f = '/!DataSpaces/Version' ;
data = CFB . find ( cfb , f ) ; if ( ! data || ! data . content ) throw new Error ( "ECMA-376 Encrypted file missing " + f ) ;
2018-01-23 09:07:51 +00:00
/*var version = */ parse _DataSpaceVersionInfo ( data . content ) ;
2017-04-13 01:29:38 +00:00
/* 2.3.4.1 */
2017-12-01 05:48:10 +00:00
f = '/!DataSpaces/DataSpaceMap' ;
data = CFB . find ( cfb , f ) ; if ( ! data || ! data . content ) throw new Error ( "ECMA-376 Encrypted file missing " + f ) ;
2017-04-13 01:29:38 +00:00
var dsm = parse _DataSpaceMap ( data . content ) ;
2017-10-17 00:14:32 +00:00
if ( dsm . length !== 1 || dsm [ 0 ] . comps . length !== 1 || dsm [ 0 ] . comps [ 0 ] . t !== 0 || dsm [ 0 ] . name !== "StrongEncryptionDataSpace" || dsm [ 0 ] . comps [ 0 ] . v !== "EncryptedPackage" )
2017-04-13 01:29:38 +00:00
throw new Error ( "ECMA-376 Encrypted file bad " + f ) ;
2017-12-01 05:48:10 +00:00
/* 2.3.4.2 */
f = '/!DataSpaces/DataSpaceInfo/StrongEncryptionDataSpace' ;
data = CFB . find ( cfb , f ) ; if ( ! data || ! data . content ) throw new Error ( "ECMA-376 Encrypted file missing " + f ) ;
2017-04-13 01:29:38 +00:00
var seds = parse _DataSpaceDefinition ( data . content ) ;
if ( seds . length != 1 || seds [ 0 ] != "StrongEncryptionTransform" )
throw new Error ( "ECMA-376 Encrypted file bad " + f ) ;
/* 2.3.4.3 */
2017-12-01 05:48:10 +00:00
f = '/!DataSpaces/TransformInfo/StrongEncryptionTransform/!Primary' ;
data = CFB . find ( cfb , f ) ; if ( ! data || ! data . content ) throw new Error ( "ECMA-376 Encrypted file missing " + f ) ;
2018-01-23 09:07:51 +00:00
/*var hdr = */ parse _Primary ( data . content ) ;
2018-06-22 21:40:01 +00:00
} catch ( e ) { }
2017-04-13 01:29:38 +00:00
2017-12-01 05:48:10 +00:00
f = '/EncryptionInfo' ;
data = CFB . find ( cfb , f ) ; if ( ! data || ! data . content ) throw new Error ( "ECMA-376 Encrypted file missing " + f ) ;
2017-04-13 01:29:38 +00:00
var einfo = parse _EncryptionInfo ( data . content ) ;
2017-12-01 05:48:10 +00:00
/* 2.3.4.4 */
f = '/EncryptedPackage' ;
data = CFB . find ( cfb , f ) ; if ( ! data || ! data . content ) throw new Error ( "ECMA-376 Encrypted file missing " + f ) ;
2018-01-23 09:07:51 +00:00
/*global decrypt_agile */
2017-12-01 05:48:10 +00:00
/*:: declare var decrypt_agile:any; */
if ( einfo [ 0 ] == 0x04 && typeof decrypt _agile !== 'undefined' ) return decrypt _agile ( einfo [ 1 ] , data . content , opts . password || "" , opts ) ;
2018-01-23 09:07:51 +00:00
/*global decrypt_std76 */
2017-12-15 01:18:40 +00:00
/*:: declare var decrypt_std76:any; */
if ( einfo [ 0 ] == 0x02 && typeof decrypt _std76 !== 'undefined' ) return decrypt _std76 ( einfo [ 1 ] , data . content , opts . password || "" , opts ) ;
2017-04-13 01:29:38 +00:00
throw new Error ( "File is password-protected" ) ;
}
2022-04-11 04:11:47 +00:00
function write _zip _xlsb ( wb /*:Workbook*/ , opts /*:WriteOpts*/ ) /*:ZIP*/ {
2017-02-03 20:50:45 +00:00
if ( wb && ! wb . SSF ) {
2022-03-20 05:29:24 +00:00
wb . SSF = dup ( table _fmt ) ;
2017-02-03 20:50:45 +00:00
}
if ( wb && wb . SSF ) {
2022-03-20 05:29:24 +00:00
make _ssf ( ) ; SSF _load _table ( wb . SSF ) ;
2017-03-12 18:02:43 +00:00
// $FlowIgnore
2017-02-03 20:50:45 +00:00
opts . revssf = evert _num ( wb . SSF ) ; opts . revssf [ wb . SSF [ 65535 ] ] = 0 ;
2017-05-09 18:07:57 +00:00
opts . ssf = wb . SSF ;
2017-02-03 20:50:45 +00:00
}
opts . rels = { } ; opts . wbrels = { } ;
2017-03-12 18:02:43 +00:00
opts . Strings = /*::((*/ [ ] /*:: :any):SST)*/ ; opts . Strings . Count = 0 ; opts . Strings . Unique = 0 ;
2018-06-22 21:40:01 +00:00
if ( browser _has _Map ) opts . revStrings = new Map ( ) ;
else { opts . revStrings = { } ; opts . revStrings . foo = [ ] ; delete opts . revStrings . foo ; }
2022-04-25 09:02:14 +00:00
var wbext = "bin" ;
var vbafmt = true ;
2017-07-27 20:07:51 +00:00
var ct = new _ct ( ) ;
2017-02-03 20:50:45 +00:00
fix _write _opts ( opts = opts || { } ) ;
2019-08-04 19:50:49 +00:00
var zip = zip _new ( ) ;
2017-02-03 20:50:45 +00:00
var f = "" , rId = 0 ;
opts . cellXfs = [ ] ;
get _cell _style ( opts . cellXfs , { } , { revssf : { "General" : 0 } } ) ;
2017-02-10 19:23:01 +00:00
if ( ! wb . Props ) wb . Props = { } ;
2017-02-03 20:50:45 +00:00
f = "docProps/core.xml" ;
2019-08-04 19:50:49 +00:00
zip _add _file ( zip , f , write _core _props ( wb . Props , opts ) ) ;
2017-02-03 20:50:45 +00:00
ct . coreprops . push ( f ) ;
add _rels ( opts . rels , 2 , f , RELS . CORE _PROPS ) ;
2017-03-12 18:02:43 +00:00
/*::if(!wb.Props) throw "unreachable"; */
2017-02-03 20:50:45 +00:00
f = "docProps/app.xml" ;
2017-05-09 18:07:57 +00:00
if ( wb . Props && wb . Props . SheetNames ) { /* empty */ }
2017-04-03 00:16:03 +00:00
else if ( ! wb . Workbook || ! wb . Workbook . Sheets ) wb . Props . SheetNames = wb . SheetNames ;
2018-02-28 10:41:49 +00:00
else {
var _sn = [ ] ;
for ( var _i = 0 ; _i < wb . SheetNames . length ; ++ _i )
if ( ( wb . Workbook . Sheets [ _i ] || { } ) . Hidden != 2 ) _sn . push ( wb . SheetNames [ _i ] ) ;
wb . Props . SheetNames = _sn ;
}
2017-03-31 18:46:42 +00:00
wb . Props . Worksheets = wb . Props . SheetNames . length ;
2019-08-04 19:50:49 +00:00
zip _add _file ( zip , f , write _ext _props ( wb . Props , opts ) ) ;
2017-02-03 20:50:45 +00:00
ct . extprops . push ( f ) ;
add _rels ( opts . rels , 3 , f , RELS . EXT _PROPS ) ;
if ( wb . Custprops !== wb . Props && keys ( wb . Custprops || { } ) . length > 0 ) {
f = "docProps/custom.xml" ;
2019-08-04 19:50:49 +00:00
zip _add _file ( zip , f , write _cust _props ( wb . Custprops , opts ) ) ;
2017-02-03 20:50:45 +00:00
ct . custprops . push ( f ) ;
add _rels ( opts . rels , 4 , f , RELS . CUST _PROPS ) ;
}
for ( rId = 1 ; rId <= wb . SheetNames . length ; ++ rId ) {
2017-03-31 00:47:35 +00:00
var wsrels = { '!id' : { } } ;
2017-04-02 06:47:25 +00:00
var ws = wb . Sheets [ wb . SheetNames [ rId - 1 ] ] ;
2017-04-08 06:55:35 +00:00
var _type = ( ws || { } ) [ "!type" ] || "sheet" ;
switch ( _type ) {
2019-11-15 01:46:49 +00:00
case "chart" :
2017-04-08 06:55:35 +00:00
/* falls through */
default :
f = "xl/worksheets/sheet" + rId + "." + wbext ;
2022-04-14 07:27:38 +00:00
zip _add _file ( zip , f , write _ws _bin ( rId - 1 , opts , wb , wsrels ) ) ;
2017-04-08 06:55:35 +00:00
ct . sheets . push ( f ) ;
add _rels ( opts . wbrels , - 1 , "worksheets/sheet" + rId + "." + wbext , RELS . WS [ 0 ] ) ;
}
2017-04-02 06:47:25 +00:00
if ( ws ) {
var comments = ws [ '!comments' ] ;
2019-04-01 14:25:15 +00:00
var need _vml = false ;
2022-03-16 03:18:09 +00:00
var cf = "" ;
2017-04-02 06:47:25 +00:00
if ( comments && comments . length > 0 ) {
2022-03-16 03:18:09 +00:00
cf = "xl/comments" + rId + "." + wbext ;
2022-04-14 07:27:38 +00:00
zip _add _file ( zip , cf , write _comments _bin ( comments , opts ) ) ;
2017-04-02 06:47:25 +00:00
ct . comments . push ( cf ) ;
add _rels ( wsrels , - 1 , "../comments" + rId + "." + wbext , RELS . CMNT ) ;
2019-04-01 14:25:15 +00:00
need _vml = true ;
2017-04-02 06:47:25 +00:00
}
if ( ws [ '!legacy' ] ) {
2022-05-22 23:51:41 +00:00
if ( need _vml ) zip _add _file ( zip , "xl/drawings/vmlDrawing" + ( rId ) + ".vml" , write _vml ( rId , ws [ '!comments' ] ) ) ;
2017-04-02 06:47:25 +00:00
}
delete ws [ '!comments' ] ;
delete ws [ '!legacy' ] ;
}
2019-08-04 19:50:49 +00:00
if ( wsrels [ '!id' ] . rId1 ) zip _add _file ( zip , get _rels _path ( f ) , write _rels ( wsrels ) ) ;
2017-02-03 20:50:45 +00:00
}
if ( opts . Strings != null && opts . Strings . length > 0 ) {
f = "xl/sharedStrings." + wbext ;
2022-04-14 07:27:38 +00:00
zip _add _file ( zip , f , write _sst _bin ( opts . Strings , opts ) ) ;
2017-02-03 20:50:45 +00:00
ct . strs . push ( f ) ;
2017-04-02 06:47:25 +00:00
add _rels ( opts . wbrels , - 1 , "sharedStrings." + wbext , RELS . SST ) ;
2017-02-03 20:50:45 +00:00
}
2018-06-22 21:40:01 +00:00
f = "xl/workbook." + wbext ;
2022-04-14 07:27:38 +00:00
zip _add _file ( zip , f , write _wb _bin ( wb , opts ) ) ;
2018-06-22 21:40:01 +00:00
ct . workbooks . push ( f ) ;
add _rels ( opts . rels , 1 , f , RELS . WB ) ;
2017-02-03 20:50:45 +00:00
/* TODO: something more intelligent with themes */
f = "xl/theme/theme1.xml" ;
2019-08-04 19:50:49 +00:00
zip _add _file ( zip , f , write _theme ( wb . Themes , opts ) ) ;
2017-02-03 20:50:45 +00:00
ct . themes . push ( f ) ;
2017-04-02 06:47:25 +00:00
add _rels ( opts . wbrels , - 1 , "theme/theme1.xml" , RELS . THEME ) ;
2017-02-03 20:50:45 +00:00
/* TODO: something more intelligent with styles */
f = "xl/styles." + wbext ;
2022-04-14 07:27:38 +00:00
zip _add _file ( zip , f , write _sty _bin ( wb , opts ) ) ;
2017-02-03 20:50:45 +00:00
ct . styles . push ( f ) ;
2017-04-02 06:47:25 +00:00
add _rels ( opts . wbrels , - 1 , "styles." + wbext , RELS . STY ) ;
2017-02-03 20:50:45 +00:00
2017-03-28 04:41:01 +00:00
if ( wb . vbaraw && vbafmt ) {
f = "xl/vbaProject.bin" ;
2019-08-04 19:50:49 +00:00
zip _add _file ( zip , f , wb . vbaraw ) ;
2017-03-28 04:41:01 +00:00
ct . vba . push ( f ) ;
2017-04-02 06:47:25 +00:00
add _rels ( opts . wbrels , - 1 , "vbaProject.bin" , RELS . VBA ) ;
2017-03-28 04:41:01 +00:00
}
2022-03-03 08:35:39 +00:00
f = "xl/metadata." + wbext ;
2022-04-14 07:27:38 +00:00
zip _add _file ( zip , f , write _xlmeta _bin ( ) ) ;
2022-03-03 08:35:39 +00:00
ct . metadata . push ( f ) ;
add _rels ( opts . wbrels , - 1 , "metadata." + wbext , RELS . XLMETA ) ;
2019-08-04 19:50:49 +00:00
zip _add _file ( zip , "[Content_Types].xml" , write _ct ( ct , opts ) ) ;
zip _add _file ( zip , '_rels/.rels' , write _rels ( opts . rels ) ) ;
zip _add _file ( zip , 'xl/_rels/workbook.' + wbext + '.rels' , write _rels ( opts . wbrels ) ) ;
2017-05-09 18:07:57 +00:00
delete opts . revssf ; delete opts . ssf ;
2017-02-03 20:50:45 +00:00
return zip ;
}
2022-02-14 01:28:13 +00:00
function write _zip _xlsx ( wb /*:Workbook*/ , opts /*:WriteOpts*/ ) /*:ZIP*/ {
if ( wb && ! wb . SSF ) {
2022-03-20 05:29:24 +00:00
wb . SSF = dup ( table _fmt ) ;
2022-02-14 01:28:13 +00:00
}
if ( wb && wb . SSF ) {
2022-03-20 05:29:24 +00:00
make _ssf ( ) ; SSF _load _table ( wb . SSF ) ;
2022-02-14 01:28:13 +00:00
// $FlowIgnore
opts . revssf = evert _num ( wb . SSF ) ; opts . revssf [ wb . SSF [ 65535 ] ] = 0 ;
opts . ssf = wb . SSF ;
}
opts . rels = { } ; opts . wbrels = { } ;
opts . Strings = /*::((*/ [ ] /*:: :any):SST)*/ ; opts . Strings . Count = 0 ; opts . Strings . Unique = 0 ;
if ( browser _has _Map ) opts . revStrings = new Map ( ) ;
else { opts . revStrings = { } ; opts . revStrings . foo = [ ] ; delete opts . revStrings . foo ; }
var wbext = "xml" ;
var vbafmt = VBAFMTS . indexOf ( opts . bookType ) > - 1 ;
var ct = new _ct ( ) ;
fix _write _opts ( opts = opts || { } ) ;
var zip = zip _new ( ) ;
var f = "" , rId = 0 ;
opts . cellXfs = [ ] ;
get _cell _style ( opts . cellXfs , { } , { revssf : { "General" : 0 } } ) ;
if ( ! wb . Props ) wb . Props = { } ;
f = "docProps/core.xml" ;
zip _add _file ( zip , f , write _core _props ( wb . Props , opts ) ) ;
ct . coreprops . push ( f ) ;
add _rels ( opts . rels , 2 , f , RELS . CORE _PROPS ) ;
/*::if(!wb.Props) throw "unreachable"; */
f = "docProps/app.xml" ;
if ( wb . Props && wb . Props . SheetNames ) { /* empty */ }
else if ( ! wb . Workbook || ! wb . Workbook . Sheets ) wb . Props . SheetNames = wb . SheetNames ;
else {
var _sn = [ ] ;
for ( var _i = 0 ; _i < wb . SheetNames . length ; ++ _i )
if ( ( wb . Workbook . Sheets [ _i ] || { } ) . Hidden != 2 ) _sn . push ( wb . SheetNames [ _i ] ) ;
wb . Props . SheetNames = _sn ;
}
wb . Props . Worksheets = wb . Props . SheetNames . length ;
zip _add _file ( zip , f , write _ext _props ( wb . Props , opts ) ) ;
ct . extprops . push ( f ) ;
add _rels ( opts . rels , 3 , f , RELS . EXT _PROPS ) ;
if ( wb . Custprops !== wb . Props && keys ( wb . Custprops || { } ) . length > 0 ) {
f = "docProps/custom.xml" ;
zip _add _file ( zip , f , write _cust _props ( wb . Custprops , opts ) ) ;
ct . custprops . push ( f ) ;
add _rels ( opts . rels , 4 , f , RELS . CUST _PROPS ) ;
}
2022-03-16 03:18:09 +00:00
var people = [ "SheetJ5" ] ;
opts . tcid = 0 ;
2022-02-14 01:28:13 +00:00
for ( rId = 1 ; rId <= wb . SheetNames . length ; ++ rId ) {
var wsrels = { '!id' : { } } ;
var ws = wb . Sheets [ wb . SheetNames [ rId - 1 ] ] ;
var _type = ( ws || { } ) [ "!type" ] || "sheet" ;
switch ( _type ) {
case "chart" :
/* falls through */
default :
f = "xl/worksheets/sheet" + rId + "." + wbext ;
zip _add _file ( zip , f , write _ws _xml ( rId - 1 , opts , wb , wsrels ) ) ;
ct . sheets . push ( f ) ;
add _rels ( opts . wbrels , - 1 , "worksheets/sheet" + rId + "." + wbext , RELS . WS [ 0 ] ) ;
}
if ( ws ) {
var comments = ws [ '!comments' ] ;
var need _vml = false ;
2022-03-16 03:18:09 +00:00
var cf = "" ;
2022-02-14 01:28:13 +00:00
if ( comments && comments . length > 0 ) {
2022-03-16 03:18:09 +00:00
var needtc = false ;
comments . forEach ( function ( carr ) {
carr [ 1 ] . forEach ( function ( c ) { if ( c . T == true ) needtc = true ; } ) ;
} ) ;
if ( needtc ) {
2022-04-25 09:02:14 +00:00
cf = "xl/threadedComments/threadedComment" + rId + ".xml" ;
2022-03-16 03:18:09 +00:00
zip _add _file ( zip , cf , write _tcmnt _xml ( comments , people , opts ) ) ;
ct . threadedcomments . push ( cf ) ;
2022-04-25 09:02:14 +00:00
add _rels ( wsrels , - 1 , "../threadedComments/threadedComment" + rId + ".xml" , RELS . TCMNT ) ;
2022-03-16 03:18:09 +00:00
}
cf = "xl/comments" + rId + "." + wbext ;
2022-02-14 01:28:13 +00:00
zip _add _file ( zip , cf , write _comments _xml ( comments , opts ) ) ;
ct . comments . push ( cf ) ;
add _rels ( wsrels , - 1 , "../comments" + rId + "." + wbext , RELS . CMNT ) ;
need _vml = true ;
}
if ( ws [ '!legacy' ] ) {
2022-05-22 23:51:41 +00:00
if ( need _vml ) zip _add _file ( zip , "xl/drawings/vmlDrawing" + ( rId ) + ".vml" , write _vml ( rId , ws [ '!comments' ] ) ) ;
2022-02-14 01:28:13 +00:00
}
delete ws [ '!comments' ] ;
delete ws [ '!legacy' ] ;
}
if ( wsrels [ '!id' ] . rId1 ) zip _add _file ( zip , get _rels _path ( f ) , write _rels ( wsrels ) ) ;
}
if ( opts . Strings != null && opts . Strings . length > 0 ) {
f = "xl/sharedStrings." + wbext ;
zip _add _file ( zip , f , write _sst _xml ( opts . Strings , opts ) ) ;
ct . strs . push ( f ) ;
add _rels ( opts . wbrels , - 1 , "sharedStrings." + wbext , RELS . SST ) ;
}
f = "xl/workbook." + wbext ;
zip _add _file ( zip , f , write _wb _xml ( wb , opts ) ) ;
ct . workbooks . push ( f ) ;
add _rels ( opts . rels , 1 , f , RELS . WB ) ;
/* TODO: something more intelligent with themes */
f = "xl/theme/theme1.xml" ;
zip _add _file ( zip , f , write _theme ( wb . Themes , opts ) ) ;
ct . themes . push ( f ) ;
add _rels ( opts . wbrels , - 1 , "theme/theme1.xml" , RELS . THEME ) ;
/* TODO: something more intelligent with styles */
f = "xl/styles." + wbext ;
zip _add _file ( zip , f , write _sty _xml ( wb , opts ) ) ;
ct . styles . push ( f ) ;
add _rels ( opts . wbrels , - 1 , "styles." + wbext , RELS . STY ) ;
if ( wb . vbaraw && vbafmt ) {
f = "xl/vbaProject.bin" ;
zip _add _file ( zip , f , wb . vbaraw ) ;
ct . vba . push ( f ) ;
add _rels ( opts . wbrels , - 1 , "vbaProject.bin" , RELS . VBA ) ;
}
2022-03-03 08:35:39 +00:00
f = "xl/metadata." + wbext ;
zip _add _file ( zip , f , write _xlmeta _xml ( ) ) ;
ct . metadata . push ( f ) ;
add _rels ( opts . wbrels , - 1 , "metadata." + wbext , RELS . XLMETA ) ;
2022-03-16 03:18:09 +00:00
if ( people . length > 1 ) {
f = "xl/persons/person.xml" ;
zip _add _file ( zip , f , write _people _xml ( people , opts ) ) ;
ct . people . push ( f ) ;
add _rels ( opts . wbrels , - 1 , "persons/person.xml" , RELS . PEOPLE ) ;
}
2022-02-14 01:28:13 +00:00
zip _add _file ( zip , "[Content_Types].xml" , write _ct ( ct , opts ) ) ;
zip _add _file ( zip , '_rels/.rels' , write _rels ( opts . rels ) ) ;
zip _add _file ( zip , 'xl/_rels/workbook.' + wbext + '.rels' , write _rels ( opts . wbrels ) ) ;
delete opts . revssf ; delete opts . ssf ;
return zip ;
}
2017-03-22 07:50:11 +00:00
function firstbyte ( f /*:RawData*/ , o /*:?TypeOpts*/ ) /*:Array<number>*/ {
var x = "" ;
2017-02-03 20:50:45 +00:00
switch ( ( o || { } ) . type || "base64" ) {
2020-07-03 23:46:07 +00:00
case 'buffer' : return [ f [ 0 ] , f [ 1 ] , f [ 2 ] , f [ 3 ] , f [ 4 ] , f [ 5 ] , f [ 6 ] , f [ 7 ] ] ;
2022-03-22 20:08:08 +00:00
case 'base64' : x = Base64 _decode ( f . slice ( 0 , 12 ) ) ; break ;
2017-03-22 07:50:11 +00:00
case 'binary' : x = f ; break ;
2020-07-03 23:46:07 +00:00
case 'array' : return [ f [ 0 ] , f [ 1 ] , f [ 2 ] , f [ 3 ] , f [ 4 ] , f [ 5 ] , f [ 6 ] , f [ 7 ] ] ;
2017-07-26 08:35:28 +00:00
default : throw new Error ( "Unrecognized type " + ( o && o . type || "undefined" ) ) ;
2017-02-03 20:50:45 +00:00
}
2020-07-03 23:46:07 +00:00
return [ x . charCodeAt ( 0 ) , x . charCodeAt ( 1 ) , x . charCodeAt ( 2 ) , x . charCodeAt ( 3 ) , x . charCodeAt ( 4 ) , x . charCodeAt ( 5 ) , x . charCodeAt ( 6 ) , x . charCodeAt ( 7 ) ] ;
2017-02-03 20:50:45 +00:00
}
2017-08-09 22:38:23 +00:00
function read _cfb ( cfb /*:CFBContainer*/ , opts /*:?ParseOpts*/ ) /*:Workbook*/ {
if ( CFB . find ( cfb , "EncryptedPackage" ) ) return parse _xlsxcfb ( cfb , opts ) ;
2017-04-13 01:29:38 +00:00
return parse _xlscfb ( cfb , opts ) ;
}
2017-02-10 19:23:01 +00:00
function read _zip ( data /*:RawData*/ , opts /*:?ParseOpts*/ ) /*:Workbook*/ {
2017-02-03 20:50:45 +00:00
var zip , d = data ;
var o = opts || { } ;
if ( ! o . type ) o . type = ( has _buf && Buffer . isBuffer ( data ) ) ? "buffer" : "base64" ;
2019-08-04 19:50:49 +00:00
zip = zip _read ( d , o ) ;
2017-02-03 20:50:45 +00:00
return parse _zip ( zip , o ) ;
}
2017-07-26 08:35:28 +00:00
function read _plaintext ( data /*:string*/ , o /*:ParseOpts*/ ) /*:Workbook*/ {
var i = 0 ;
main : while ( i < data . length ) switch ( data . charCodeAt ( i ) ) {
case 0x0A : case 0x0D : case 0x20 : ++ i ; break ;
case 0x3C : return parse _xlml ( data . slice ( i ) , o ) ;
default : break main ;
}
return PRN . to _workbook ( data , o ) ;
}
function read _plaintext _raw ( data /*:RawData*/ , o /*:ParseOpts*/ ) /*:Workbook*/ {
var str = "" , bytes = firstbyte ( data , o ) ;
switch ( o . type ) {
2022-03-22 20:08:08 +00:00
case 'base64' : str = Base64 _decode ( data ) ; break ;
2017-07-26 08:35:28 +00:00
case 'binary' : str = data ; break ;
case 'buffer' : str = data . toString ( 'binary' ) ; break ;
case 'array' : str = cc2str ( data ) ; break ;
default : throw new Error ( "Unrecognized type " + o . type ) ;
}
if ( bytes [ 0 ] == 0xEF && bytes [ 1 ] == 0xBB && bytes [ 2 ] == 0xBF ) str = utf8read ( str ) ;
2022-03-03 08:35:39 +00:00
o . type = "binary" ;
2017-07-26 08:35:28 +00:00
return read _plaintext ( str , o ) ;
}
2017-04-03 06:02:02 +00:00
function read _utf16 ( data /*:RawData*/ , o /*:ParseOpts*/ ) /*:Workbook*/ {
var d = data ;
2022-03-22 20:08:08 +00:00
if ( o . type == 'base64' ) d = Base64 _decode ( d ) ;
2022-03-12 14:05:57 +00:00
d = $cptable . utils . decode ( 1200 , d . slice ( 2 ) , 'str' ) ;
2017-04-03 06:02:02 +00:00
o . type = "binary" ;
2017-07-26 08:35:28 +00:00
return read _plaintext ( d , o ) ;
2017-04-03 06:02:02 +00:00
}
2017-09-30 06:18:11 +00:00
function bstrify ( data /*:string*/ ) /*:string*/ {
return ! data . match ( /[^\x00-\x7F]/ ) ? data : utf8write ( data ) ;
}
function read _prn ( data , d , o , str ) {
if ( str ) { o . type = "string" ; return PRN . to _workbook ( data , o ) ; }
return PRN . to _workbook ( d , o ) ;
}
2017-02-10 19:23:01 +00:00
function readSync ( data /*:RawData*/ , opts /*:?ParseOpts*/ ) /*:Workbook*/ {
2017-12-30 05:40:35 +00:00
reset _cp ( ) ;
2017-02-03 20:50:45 +00:00
var o = opts || { } ;
2021-10-13 07:20:25 +00:00
if ( typeof ArrayBuffer !== 'undefined' && data instanceof ArrayBuffer ) return readSync ( new Uint8Array ( data ) , ( o = dup ( o ) , o . type = "array" , o ) ) ;
2022-02-14 01:28:13 +00:00
if ( typeof Uint8Array !== 'undefined' && data instanceof Uint8Array && ! o . type ) o . type = typeof Deno !== "undefined" ? "buffer" : "array" ;
2021-10-13 07:20:25 +00:00
var d = data , n = [ 0 , 0 , 0 , 0 ] , str = false ;
2020-03-15 07:42:05 +00:00
if ( o . cellStyles ) { o . cellNF = true ; o . sheetStubs = true ; }
2017-04-30 16:27:03 +00:00
_ssfopts = { } ;
if ( o . dateNF ) _ssfopts . dateNF = o . dateNF ;
2017-02-03 20:50:45 +00:00
if ( ! o . type ) o . type = ( has _buf && Buffer . isBuffer ( data ) ) ? "buffer" : "base64" ;
2022-02-14 01:28:13 +00:00
if ( o . type == "file" ) { o . type = has _buf ? "buffer" : "binary" ; d = read _binary ( data ) ; if ( typeof Uint8Array !== 'undefined' && ! has _buf ) o . type = "array" ; }
2018-05-20 01:34:59 +00:00
if ( o . type == "string" ) { str = true ; o . type = "binary" ; o . codepage = 65001 ; d = bstrify ( data ) ; }
2018-01-23 09:07:51 +00:00
if ( o . type == 'array' && typeof Uint8Array !== 'undefined' && data instanceof Uint8Array && typeof ArrayBuffer !== 'undefined' ) {
2018-01-11 08:01:25 +00:00
// $FlowIgnore
var ab = new ArrayBuffer ( 3 ) , vu = new Uint8Array ( ab ) ; vu . foo = "bar" ;
// $FlowIgnore
if ( ! vu . foo ) { o = dup ( o ) ; o . type = 'array' ; return readSync ( ab2a ( d ) , o ) ; }
}
2017-03-22 07:50:11 +00:00
switch ( ( n = firstbyte ( d , o ) ) [ 0 ] ) {
2020-07-03 23:46:07 +00:00
case 0xD0 : if ( n [ 1 ] === 0xCF && n [ 2 ] === 0x11 && n [ 3 ] === 0xE0 && n [ 4 ] === 0xA1 && n [ 5 ] === 0xB1 && n [ 6 ] === 0x1A && n [ 7 ] === 0xE1 ) return read _cfb ( CFB . read ( d , o ) , o ) ; break ;
2021-10-13 07:20:25 +00:00
case 0x09 : if ( n [ 1 ] <= 0x08 ) return parse _xlscfb ( d , o ) ; break ;
2017-02-03 20:50:45 +00:00
case 0x3C : return parse _xlml ( d , o ) ;
2021-08-11 02:53:38 +00:00
case 0x49 :
if ( n [ 1 ] === 0x49 && n [ 2 ] === 0x2a && n [ 3 ] === 0x00 ) throw new Error ( "TIFF Image File is not a spreadsheet" ) ;
if ( n [ 1 ] === 0x44 ) return read _wb _ID ( d , o ) ;
break ;
2017-10-17 00:14:32 +00:00
case 0x54 : if ( n [ 1 ] === 0x41 && n [ 2 ] === 0x42 && n [ 3 ] === 0x4C ) return DIF . to _workbook ( d , o ) ; break ;
2018-03-06 00:34:04 +00:00
case 0x50 : return ( n [ 1 ] === 0x4B && n [ 2 ] < 0x09 && n [ 3 ] < 0x09 ) ? read _zip ( d , o ) : read _prn ( data , d , o , str ) ;
2017-10-17 00:14:32 +00:00
case 0xEF : return n [ 3 ] === 0x3C ? parse _xlml ( d , o ) : read _prn ( data , d , o , str ) ;
2022-01-10 18:45:50 +00:00
case 0xFF :
if ( n [ 1 ] === 0xFE ) { return read _utf16 ( d , o ) ; }
else if ( n [ 1 ] === 0x00 && n [ 2 ] === 0x02 && n [ 3 ] === 0x00 ) return WK _ . to _workbook ( d , o ) ;
break ;
case 0x00 :
if ( n [ 1 ] === 0x00 ) {
if ( n [ 2 ] >= 0x02 && n [ 3 ] === 0x00 ) return WK _ . to _workbook ( d , o ) ;
if ( n [ 2 ] === 0x00 && ( n [ 3 ] === 0x08 || n [ 3 ] === 0x09 ) ) return WK _ . to _workbook ( d , o ) ;
}
break ;
2017-10-17 00:14:32 +00:00
case 0x03 : case 0x83 : case 0x8B : case 0x8C : return DBF . to _workbook ( d , o ) ;
case 0x7B : if ( n [ 1 ] === 0x5C && n [ 2 ] === 0x72 && n [ 3 ] === 0x74 ) return RTF . to _workbook ( d , o ) ; break ;
2017-07-26 08:35:28 +00:00
case 0x0A : case 0x0D : case 0x20 : return read _plaintext _raw ( d , o ) ;
2022-01-10 18:45:50 +00:00
case 0x89 : if ( n [ 1 ] === 0x50 && n [ 2 ] === 0x4E && n [ 3 ] === 0x47 ) throw new Error ( "PNG Image File is not a spreadsheet" ) ; break ;
2022-05-09 06:49:17 +00:00
case 0x08 : if ( n [ 1 ] === 0xE7 ) throw new Error ( "Unsupported Multiplan 1.x file!" ) ; break ;
case 0x0C :
if ( n [ 1 ] === 0xEC ) throw new Error ( "Unsupported Multiplan 2.x file!" ) ;
if ( n [ 1 ] === 0xED ) throw new Error ( "Unsupported Multiplan 3.x file!" ) ;
break ;
2017-02-03 20:50:45 +00:00
}
2022-03-12 14:05:57 +00:00
if ( DBF _SUPPORTED _VERSIONS . indexOf ( n [ 0 ] ) > - 1 && n [ 2 ] <= 12 && n [ 3 ] <= 31 ) return DBF . to _workbook ( d , o ) ;
2017-09-30 06:18:11 +00:00
return read _prn ( data , d , o , str ) ;
2017-02-03 20:50:45 +00:00
}
2017-02-10 19:23:01 +00:00
function readFileSync ( filename /*:string*/ , opts /*:?ParseOpts*/ ) /*:Workbook*/ {
2017-02-03 20:50:45 +00:00
var o = opts || { } ; o . type = 'file' ;
2017-02-10 19:23:01 +00:00
return readSync ( filename , o ) ;
2017-02-03 20:50:45 +00:00
}
2018-06-22 21:40:01 +00:00
function write _cfb _ctr ( cfb /*:CFBContainer*/ , o /*:WriteOpts*/ ) /*:any*/ {
switch ( o . type ) {
case "base64" : case "binary" : break ;
case "buffer" : case "array" : o . type = "" ; break ;
case "file" : return write _dl ( o . file , CFB . write ( cfb , { type : has _buf ? 'buffer' : "" } ) ) ;
case "string" : throw new Error ( "'string' output type invalid for '" + o . bookType + "' files" ) ;
default : throw new Error ( "Unrecognized type " + o . type ) ;
}
return CFB . write ( cfb , o ) ;
}
2022-04-11 04:11:47 +00:00
function write _zip ( wb /*:Workbook*/ , opts /*:WriteOpts*/ ) /*:ZIP*/ {
switch ( opts . bookType ) {
case "ods" : return write _ods ( wb , opts ) ;
case "numbers" : return write _numbers _iwa ( wb , opts ) ;
case "xlsb" : return write _zip _xlsb ( wb , opts ) ;
default : return write _zip _xlsx ( wb , opts ) ;
}
}
2018-06-22 21:40:01 +00:00
/*:: declare var encrypt_agile:any; */
2017-09-30 06:18:11 +00:00
function write _zip _type ( wb /*:Workbook*/ , opts /*:?WriteOpts*/ ) /*:any*/ {
2021-10-13 07:20:25 +00:00
var o = dup ( opts || { } ) ;
2017-02-03 20:50:45 +00:00
var z = write _zip ( wb , o ) ;
2022-02-14 01:28:13 +00:00
return write _zip _denouement ( z , o ) ;
}
function write _zip _typeXLSX ( wb /*:Workbook*/ , opts /*:?WriteOpts*/ ) /*:any*/ {
var o = dup ( opts || { } ) ;
var z = write _zip _xlsx ( wb , o ) ;
return write _zip _denouement ( z , o ) ;
}
function write _zip _denouement ( z /*:any*/ , o /*:?WriteOpts*/ ) /*:any*/ {
2017-02-03 20:50:45 +00:00
var oopts = { } ;
2022-03-03 08:35:39 +00:00
var ftype = has _buf ? "nodebuffer" : ( typeof Uint8Array !== "undefined" ? "array" : "string" ) ;
2017-02-10 19:23:01 +00:00
if ( o . compression ) oopts . compression = 'DEFLATE' ;
2022-03-03 08:35:39 +00:00
if ( o . password ) oopts . type = ftype ;
2018-06-22 21:40:01 +00:00
else switch ( o . type ) {
2017-02-03 20:50:45 +00:00
case "base64" : oopts . type = "base64" ; break ;
case "binary" : oopts . type = "string" ; break ;
2018-02-03 20:46:32 +00:00
case "string" : throw new Error ( "'string' output type invalid for '" + o . bookType + "' files" ) ;
2017-02-03 20:50:45 +00:00
case "buffer" :
2022-03-03 08:35:39 +00:00
case "file" : oopts . type = ftype ; break ;
2017-02-03 20:50:45 +00:00
default : throw new Error ( "Unrecognized type " + o . type ) ;
}
2022-02-14 01:28:13 +00:00
var out = z . FullPaths ? CFB . write ( z , { fileType : "zip" , type : /*::(*/ { "nodebuffer" : "buffer" , "string" : "binary" } /*:: :any)*/ [ oopts . type ] || oopts . type , compression : ! ! o . compression } ) : z . generate ( oopts ) ;
if ( typeof Deno !== "undefined" ) {
if ( typeof out == "string" ) {
if ( o . type == "binary" || o . type == "base64" ) return out ;
out = new Uint8Array ( s2ab ( out ) ) ;
}
}
2020-03-15 07:42:05 +00:00
/*jshint -W083 */
if ( o . password && typeof encrypt _agile !== 'undefined' ) return write _cfb _ctr ( encrypt _agile ( out , o . password ) , o ) ; // eslint-disable-line no-undef
/*jshint +W083 */
2018-06-22 21:40:01 +00:00
if ( o . type === "file" ) return write _dl ( o . file , out ) ;
2019-11-01 03:09:14 +00:00
return o . type == "string" ? utf8read ( /*::(*/ out /*:: :any)*/ ) : out ;
2017-02-03 20:50:45 +00:00
}
2017-09-30 06:18:11 +00:00
function write _cfb _type ( wb /*:Workbook*/ , opts /*:?WriteOpts*/ ) /*:any*/ {
2017-09-22 22:18:51 +00:00
var o = opts || { } ;
var cfb /*:CFBContainer*/ = write _xlscfb ( wb , o ) ;
2018-06-22 21:40:01 +00:00
return write _cfb _ctr ( cfb , o ) ;
2017-09-22 22:18:51 +00:00
}
2017-09-30 06:18:11 +00:00
function write _string _type ( out /*:string*/ , opts /*:WriteOpts*/ , bom /*:?string*/ ) /*:any*/ {
if ( ! bom ) bom = "" ;
var o = bom + out ;
2017-04-03 00:16:03 +00:00
switch ( opts . type ) {
2022-03-22 20:08:08 +00:00
case "base64" : return Base64 _encode ( utf8write ( o ) ) ;
2017-09-30 06:18:11 +00:00
case "binary" : return utf8write ( o ) ;
case "string" : return out ;
2018-02-03 20:46:32 +00:00
case "file" : return write _dl ( opts . file , o , 'utf8' ) ;
2017-04-03 00:16:03 +00:00
case "buffer" : {
2018-07-09 03:46:11 +00:00
if ( has _buf ) return Buffer _from ( o , 'utf8' ) ;
2022-02-14 01:28:13 +00:00
else if ( typeof TextEncoder !== "undefined" ) return new TextEncoder ( ) . encode ( o ) ;
2017-09-30 06:18:11 +00:00
else return write _string _type ( o , { type : 'binary' } ) . split ( "" ) . map ( function ( c ) { return c . charCodeAt ( 0 ) ; } ) ;
2017-04-03 00:16:03 +00:00
}
}
throw new Error ( "Unrecognized type " + opts . type ) ;
}
2017-09-30 06:18:11 +00:00
function write _stxt _type ( out /*:string*/ , opts /*:WriteOpts*/ ) /*:any*/ {
2017-02-22 06:57:59 +00:00
switch ( opts . type ) {
2022-03-22 20:08:08 +00:00
case "base64" : return Base64 _encode ( out ) ;
2017-02-24 10:33:01 +00:00
case "binary" : return out ;
2017-09-30 06:18:11 +00:00
case "string" : return out ; /* override in sheet_to_txt */
2018-02-03 20:46:32 +00:00
case "file" : return write _dl ( opts . file , out , 'binary' ) ;
2017-02-24 10:33:01 +00:00
case "buffer" : {
2018-07-09 03:46:11 +00:00
if ( has _buf ) return Buffer _from ( out , 'binary' ) ;
2017-02-24 10:33:01 +00:00
else return out . split ( "" ) . map ( function ( c ) { return c . charCodeAt ( 0 ) ; } ) ;
2017-03-12 18:02:43 +00:00
}
2017-02-22 06:57:59 +00:00
}
2017-03-12 18:02:43 +00:00
throw new Error ( "Unrecognized type " + opts . type ) ;
2017-02-22 06:57:59 +00:00
}
2017-02-24 10:33:01 +00:00
/* TODO: test consistency */
2017-09-30 06:18:11 +00:00
function write _binary _type ( out , opts /*:WriteOpts*/ ) /*:any*/ {
2017-02-22 06:57:59 +00:00
switch ( opts . type ) {
2017-09-30 06:18:11 +00:00
case "string" :
2017-02-24 10:33:01 +00:00
case "base64" :
2017-02-22 06:57:59 +00:00
case "binary" :
var bstr = "" ;
2017-11-20 01:51:14 +00:00
// $FlowIgnore
2017-02-22 06:57:59 +00:00
for ( var i = 0 ; i < out . length ; ++ i ) bstr += String . fromCharCode ( out [ i ] ) ;
2022-03-22 20:08:08 +00:00
return opts . type == 'base64' ? Base64 _encode ( bstr ) : opts . type == 'string' ? utf8read ( bstr ) : bstr ;
2018-02-03 20:46:32 +00:00
case "file" : return write _dl ( opts . file , out ) ;
2017-02-22 06:57:59 +00:00
case "buffer" : return out ;
default : throw new Error ( "Unrecognized type " + opts . type ) ;
}
}
2022-02-14 01:28:13 +00:00
function writeSyncXLSX ( wb /*:Workbook*/ , opts /*:?WriteOpts*/ ) {
reset _cp ( ) ;
check _wb ( wb ) ;
var o = dup ( opts || { } ) ;
if ( o . cellStyles ) { o . cellNF = true ; o . sheetStubs = true ; }
if ( o . type == "array" ) { o . type = "binary" ; var out /*:string*/ = ( writeSyncXLSX ( wb , o ) /*:any*/ ) ; o . type = "array" ; return s2ab ( out ) ; }
return write _zip _typeXLSX ( wb , o ) ;
}
2017-02-10 19:23:01 +00:00
function writeSync ( wb /*:Workbook*/ , opts /*:?WriteOpts*/ ) {
2019-11-01 03:09:14 +00:00
reset _cp ( ) ;
2017-03-10 08:39:51 +00:00
check _wb ( wb ) ;
2021-10-13 07:20:25 +00:00
var o = dup ( opts || { } ) ;
2020-03-15 07:42:05 +00:00
if ( o . cellStyles ) { o . cellNF = true ; o . sheetStubs = true ; }
2017-12-30 05:40:35 +00:00
if ( o . type == "array" ) { o . type = "binary" ; var out /*:string*/ = ( writeSync ( wb , o ) /*:any*/ ) ; o . type = "array" ; return s2ab ( out ) ; }
2022-03-12 14:05:57 +00:00
var idx = 0 ;
if ( o . sheet ) {
if ( typeof o . sheet == "number" ) idx = o . sheet ;
else idx = wb . SheetNames . indexOf ( o . sheet ) ;
if ( ! wb . SheetNames [ idx ] ) throw new Error ( "Sheet not found: " + o . sheet + " : " + ( typeof o . sheet ) ) ;
}
2017-04-02 06:47:25 +00:00
switch ( o . bookType || 'xlsb' ) {
2017-03-14 08:19:51 +00:00
case 'xml' :
case 'xlml' : return write _string _type ( write _xlml ( wb , o ) , o ) ;
2017-04-01 07:32:12 +00:00
case 'slk' :
2022-06-06 23:05:27 +00:00
case 'sylk' : return write _string _type ( SYLK . from _sheet ( wb . Sheets [ wb . SheetNames [ idx ] ] , o , wb ) , o ) ;
2018-02-08 18:21:39 +00:00
case 'htm' :
2022-03-20 05:29:24 +00:00
case 'html' : return write _string _type ( sheet _to _html ( wb . Sheets [ wb . SheetNames [ idx ] ] , o ) , o ) ;
2022-03-12 14:05:57 +00:00
case 'txt' : return write _stxt _type ( sheet _to _txt ( wb . Sheets [ wb . SheetNames [ idx ] ] , o ) , o ) ;
case 'csv' : return write _string _type ( sheet _to _csv ( wb . Sheets [ wb . SheetNames [ idx ] ] , o ) , o , "\ufeff" ) ;
case 'dif' : return write _string _type ( DIF . from _sheet ( wb . Sheets [ wb . SheetNames [ idx ] ] , o ) , o ) ;
case 'dbf' : return write _binary _type ( DBF . from _sheet ( wb . Sheets [ wb . SheetNames [ idx ] ] , o ) , o ) ;
case 'prn' : return write _string _type ( PRN . from _sheet ( wb . Sheets [ wb . SheetNames [ idx ] ] , o ) , o ) ;
case 'rtf' : return write _string _type ( RTF . from _sheet ( wb . Sheets [ wb . SheetNames [ idx ] ] , o ) , o ) ;
case 'eth' : return write _string _type ( ETH . from _sheet ( wb . Sheets [ wb . SheetNames [ idx ] ] , o ) , o ) ;
2017-02-22 06:57:59 +00:00
case 'fods' : return write _string _type ( write _ods ( wb , o ) , o ) ;
2022-03-12 14:05:57 +00:00
case 'wk1' : return write _binary _type ( WK _ . sheet _to _wk1 ( wb . Sheets [ wb . SheetNames [ idx ] ] , o ) , o ) ;
2021-11-14 04:38:00 +00:00
case 'wk3' : return write _binary _type ( WK _ . book _to _wk3 ( wb , o ) , o ) ;
2017-09-30 06:18:11 +00:00
case 'biff2' : if ( ! o . biff ) o . biff = 2 ; /* falls through */
case 'biff3' : if ( ! o . biff ) o . biff = 3 ; /* falls through */
2017-09-22 22:18:51 +00:00
case 'biff4' : if ( ! o . biff ) o . biff = 4 ; return write _binary _type ( write _biff _buf ( wb , o ) , o ) ;
2017-10-27 16:25:54 +00:00
case 'biff5' : if ( ! o . biff ) o . biff = 5 ; /* falls through */
2017-09-22 22:18:51 +00:00
case 'biff8' :
2017-12-30 05:40:35 +00:00
case 'xla' :
2017-09-22 22:18:51 +00:00
case 'xls' : if ( ! o . biff ) o . biff = 8 ; return write _cfb _type ( wb , o ) ;
2017-02-24 10:33:01 +00:00
case 'xlsx' :
case 'xlsm' :
2017-12-30 05:40:35 +00:00
case 'xlam' :
2017-02-24 10:33:01 +00:00
case 'xlsb' :
2022-03-24 13:59:49 +00:00
case 'numbers' :
2017-02-24 10:33:01 +00:00
case 'ods' : return write _zip _type ( wb , o ) ;
default : throw new Error ( "Unrecognized bookType |" + o . bookType + "|" ) ;
2017-02-03 20:50:45 +00:00
}
}
2017-10-27 16:25:54 +00:00
function resolve _book _type ( o /*:WriteFileOpts*/ ) {
if ( o . bookType ) return ;
var _BT = {
"xls" : "biff8" ,
"htm" : "html" ,
"slk" : "sylk" ,
2017-12-04 04:41:41 +00:00
"socialcalc" : "eth" ,
2017-10-27 16:25:54 +00:00
"Sh33tJS" : "WTF"
} ;
var ext = o . file . slice ( o . file . lastIndexOf ( "." ) ) . toLowerCase ( ) ;
if ( ext . match ( /^\.[a-z]+$/ ) ) o . bookType = ext . slice ( 1 ) ;
o . bookType = _BT [ o . bookType ] || o . bookType ;
2017-03-25 01:36:40 +00:00
}
function writeFileSync ( wb /*:Workbook*/ , filename /*:string*/ , opts /*:?WriteFileOpts*/ ) {
var o = opts || { } ; o . type = 'file' ;
o . file = filename ;
resolve _book _type ( o ) ;
2017-02-03 20:50:45 +00:00
return writeSync ( wb , o ) ;
}
2022-02-14 01:28:13 +00:00
function writeFileSyncXLSX ( wb /*:Workbook*/ , filename /*:string*/ , opts /*:?WriteFileOpts*/ ) {
var o = opts || { } ; o . type = 'file' ;
o . file = filename ;
resolve _book _type ( o ) ;
return writeSyncXLSX ( wb , o ) ;
}
2017-03-25 01:36:40 +00:00
function writeFileAsync ( filename /*:string*/ , wb /*:Workbook*/ , opts /*:?WriteFileOpts*/ , cb /*:?(e?:ErrnoError)=>void*/ ) {
var o = opts || { } ; o . type = 'file' ;
o . file = filename ;
resolve _book _type ( o ) ;
o . type = 'buffer' ;
var _cb = cb ; if ( ! ( _cb instanceof Function ) ) _cb = ( opts /*:any*/ ) ;
return _fs . writeFile ( filename , writeSync ( wb , o ) , _cb ) ;
}
2018-07-09 03:46:11 +00:00
/ * : :
type MJRObject = {
row : any ;
isempty : boolean ;
} ;
* /
function make _json _row ( sheet /*:Worksheet*/ , r /*:Range*/ , R /*:number*/ , cols /*:Array<string>*/ , header /*:number*/ , hdr /*:Array<any>*/ , dense /*:boolean*/ , o /*:Sheet2JSONOpts*/ ) /*:MJRObject*/ {
var rr = encode _row ( R ) ;
2020-03-15 07:42:05 +00:00
var defval = o . defval , raw = o . raw || ! Object . prototype . hasOwnProperty . call ( o , "raw" ) ;
2018-07-09 03:46:11 +00:00
var isempty = true ;
var row /*:any*/ = ( header === 1 ) ? [ ] : { } ;
if ( header !== 1 ) {
if ( Object . defineProperty ) try { Object . defineProperty ( row , '__rowNum__' , { value : R , enumerable : false } ) ; } catch ( e ) { row . _ _rowNum _ _ = R ; }
else row . _ _rowNum _ _ = R ;
}
if ( ! dense || sheet [ R ] ) for ( var C = r . s . c ; C <= r . e . c ; ++ C ) {
var val = dense ? sheet [ R ] [ C ] : sheet [ cols [ C ] + rr ] ;
if ( val === undefined || val . t === undefined ) {
if ( defval === undefined ) continue ;
if ( hdr [ C ] != null ) { row [ hdr [ C ] ] = defval ; }
continue ;
}
var v = val . v ;
switch ( val . t ) {
case 'z' : if ( v == null ) break ; continue ;
2021-10-13 07:20:25 +00:00
case 'e' : v = ( v == 0 ? null : void 0 ) ; break ;
2018-07-09 03:46:11 +00:00
case 's' : case 'd' : case 'b' : case 'n' : break ;
default : throw new Error ( 'unrecognized type ' + val . t ) ;
}
if ( hdr [ C ] != null ) {
if ( v == null ) {
2021-10-13 07:20:25 +00:00
if ( val . t == "e" && v === null ) row [ hdr [ C ] ] = null ;
else if ( defval !== undefined ) row [ hdr [ C ] ] = defval ;
2018-07-09 03:46:11 +00:00
else if ( raw && v === null ) row [ hdr [ C ] ] = null ;
else continue ;
} else {
2022-03-20 05:29:24 +00:00
row [ hdr [ C ] ] = raw && ( val . t !== "n" || ( val . t === "n" && o . rawNumbers !== false ) ) ? v : format _cell ( val , v , o ) ;
2018-07-09 03:46:11 +00:00
}
if ( v != null ) isempty = false ;
}
}
return { row : row , isempty : isempty } ;
}
2017-08-09 22:38:23 +00:00
function sheet _to _json ( sheet /*:Worksheet*/ , opts /*:?Sheet2JSONOpts*/ ) {
2017-04-09 04:03:19 +00:00
if ( sheet == null || sheet [ "!ref" ] == null ) return [ ] ;
2018-07-09 03:46:11 +00:00
var val = { t : 'n' , v : 0 } , header = 0 , offset = 1 , hdr /*:Array<any>*/ = [ ] , v = 0 , vv = "" ;
2017-04-09 04:03:19 +00:00
var r = { s : { r : 0 , c : 0 } , e : { r : 0 , c : 0 } } ;
2017-08-09 22:38:23 +00:00
var o = opts || { } ;
2017-04-09 04:03:19 +00:00
var range = o . range != null ? o . range : sheet [ "!ref" ] ;
2017-02-03 20:50:45 +00:00
if ( o . header === 1 ) header = 1 ;
else if ( o . header === "A" ) header = 2 ;
else if ( Array . isArray ( o . header ) ) header = 3 ;
2019-11-01 03:09:14 +00:00
else if ( o . header == null ) header = 0 ;
2017-02-03 20:50:45 +00:00
switch ( typeof range ) {
case 'string' : r = safe _decode _range ( range ) ; break ;
case 'number' : r = safe _decode _range ( sheet [ "!ref" ] ) ; r . s . r = range ; break ;
default : r = range ;
}
if ( header > 0 ) offset = 0 ;
var rr = encode _row ( r . s . r ) ;
2017-08-09 22:38:23 +00:00
var cols /*:Array<string>*/ = [ ] ;
var out /*:Array<any>*/ = [ ] ;
2017-04-09 04:03:19 +00:00
var outi = 0 , counter = 0 ;
2017-04-08 06:55:35 +00:00
var dense = Array . isArray ( sheet ) ;
2022-03-10 05:31:13 +00:00
var R = r . s . r , C = 0 ;
var header _cnt = { } ;
2017-05-11 07:29:59 +00:00
if ( dense && ! sheet [ R ] ) sheet [ R ] = [ ] ;
2022-03-12 14:05:57 +00:00
var colinfo /*:Array<ColInfo>*/ = o . skipHidden && sheet [ "!cols" ] || [ ] ;
var rowinfo /*:Array<ColInfo>*/ = o . skipHidden && sheet [ "!rows" ] || [ ] ;
2017-02-03 20:50:45 +00:00
for ( C = r . s . c ; C <= r . e . c ; ++ C ) {
2022-03-12 14:05:57 +00:00
if ( ( ( colinfo [ C ] || { } ) . hidden ) ) continue ;
2017-02-03 20:50:45 +00:00
cols [ C ] = encode _col ( C ) ;
2017-04-09 04:03:19 +00:00
val = dense ? sheet [ R ] [ C ] : sheet [ cols [ C ] + rr ] ;
2017-02-03 20:50:45 +00:00
switch ( header ) {
2017-04-26 15:32:42 +00:00
case 1 : hdr [ C ] = C - r . s . c ; break ;
2017-02-03 20:50:45 +00:00
case 2 : hdr [ C ] = cols [ C ] ; break ;
case 3 : hdr [ C ] = o . header [ C - r . s . c ] ; break ;
default :
2017-12-14 11:11:57 +00:00
if ( val == null ) val = { w : "__EMPTY" , t : "s" } ;
2017-03-25 01:36:40 +00:00
vv = v = format _cell ( val , null , o ) ;
2022-03-10 05:31:13 +00:00
counter = header _cnt [ v ] || 0 ;
if ( ! counter ) header _cnt [ v ] = 1 ;
else {
do { vv = v + "_" + ( counter ++ ) ; } while ( header _cnt [ vv ] ) ; header _cnt [ v ] = counter ;
header _cnt [ vv ] = 1 ;
}
2015-03-29 02:12:16 +00:00
hdr [ C ] = vv ;
2017-02-03 20:50:45 +00:00
}
}
for ( R = r . s . r + offset ; R <= r . e . r ; ++ R ) {
2022-03-12 14:05:57 +00:00
if ( ( rowinfo [ R ] || { } ) . hidden ) continue ;
2018-07-09 03:46:11 +00:00
var row = make _json _row ( sheet , r , R , cols , header , hdr , dense , o ) ;
if ( ( row . isempty === false ) || ( header === 1 ? o . blankrows !== false : ! ! o . blankrows ) ) out [ outi ++ ] = row . row ;
2017-02-03 20:50:45 +00:00
}
out . length = outi ;
return out ;
}
2017-04-16 04:32:13 +00:00
var qreg = /"/g ;
function make _csv _row ( sheet /*:Worksheet*/ , r /*:Range*/ , R /*:number*/ , cols /*:Array<string>*/ , fs /*:number*/ , rs /*:number*/ , FS /*:string*/ , o /*:Sheet2CSVOpts*/ ) /*:?string*/ {
var isempty = true ;
2017-08-09 22:38:23 +00:00
var row /*:Array<string>*/ = [ ] , txt = "" , rr = encode _row ( R ) ;
2017-04-16 04:32:13 +00:00
for ( var C = r . s . c ; C <= r . e . c ; ++ C ) {
2017-08-02 16:41:44 +00:00
if ( ! cols [ C ] ) continue ;
2017-04-16 04:32:13 +00:00
var val = o . dense ? ( sheet [ R ] || [ ] ) [ C ] : sheet [ cols [ C ] + rr ] ;
if ( val == null ) txt = "" ;
else if ( val . v != null ) {
isempty = false ;
2020-06-18 21:34:04 +00:00
txt = '' + ( o . rawNumbers && val . t == "n" ? val . v : format _cell ( val , null , o ) ) ;
2020-06-18 01:34:04 +00:00
for ( var i = 0 , cc = 0 ; i !== txt . length ; ++ i ) if ( ( cc = txt . charCodeAt ( i ) ) === fs || cc === rs || cc === 34 || o . forceQuotes ) { txt = "\"" + txt . replace ( qreg , '""' ) + "\"" ; break ; }
2017-05-11 18:23:21 +00:00
if ( txt == "ID" ) txt = '"ID"' ;
2017-04-16 04:32:13 +00:00
} else if ( val . f != null && ! val . F ) {
isempty = false ;
txt = '=' + val . f ; if ( txt . indexOf ( "," ) >= 0 ) txt = '"' + txt . replace ( qreg , '""' ) + '"' ;
} else txt = "" ;
/* NOTE: Excel CSV does not support array formulae */
2017-08-02 16:41:44 +00:00
row . push ( txt ) ;
2017-04-16 04:32:13 +00:00
}
if ( o . blankrows === false && isempty ) return null ;
2017-08-02 16:41:44 +00:00
return row . join ( FS ) ;
2017-04-16 04:32:13 +00:00
}
function sheet _to _csv ( sheet /*:Worksheet*/ , opts /*:?Sheet2CSVOpts*/ ) /*:string*/ {
2017-12-30 05:40:35 +00:00
var out /*:Array<string>*/ = [ ] ;
2017-02-03 20:50:45 +00:00
var o = opts == null ? { } : opts ;
if ( sheet == null || sheet [ "!ref" ] == null ) return "" ;
var r = safe _decode _range ( sheet [ "!ref" ] ) ;
var FS = o . FS !== undefined ? o . FS : "," , fs = FS . charCodeAt ( 0 ) ;
var RS = o . RS !== undefined ? o . RS : "\n" , rs = RS . charCodeAt ( 0 ) ;
2017-03-25 01:36:40 +00:00
var endregex = new RegExp ( ( FS == "|" ? "\\|" : FS ) + "+$" ) ;
2017-12-30 05:40:35 +00:00
var row = "" , cols /*:Array<string>*/ = [ ] ;
2017-04-16 04:32:13 +00:00
o . dense = Array . isArray ( sheet ) ;
2017-12-30 05:40:35 +00:00
var colinfo /*:Array<ColInfo>*/ = o . skipHidden && sheet [ "!cols" ] || [ ] ;
var rowinfo /*:Array<ColInfo>*/ = o . skipHidden && sheet [ "!rows" ] || [ ] ;
for ( var C = r . s . c ; C <= r . e . c ; ++ C ) if ( ! ( ( colinfo [ C ] || { } ) . hidden ) ) cols [ C ] = encode _col ( C ) ;
2022-03-09 01:44:10 +00:00
var w = 0 ;
2017-04-16 04:32:13 +00:00
for ( var R = r . s . r ; R <= r . e . r ; ++ R ) {
2017-12-30 05:40:35 +00:00
if ( ( rowinfo [ R ] || { } ) . hidden ) continue ;
2017-04-16 04:32:13 +00:00
row = make _csv _row ( sheet , r , R , cols , fs , rs , FS , o ) ;
if ( row == null ) { continue ; }
2017-03-22 07:50:11 +00:00
if ( o . strip ) row = row . replace ( endregex , "" ) ;
2022-03-09 01:44:10 +00:00
if ( row || ( o . blankrows !== false ) ) out . push ( ( w ++ ? RS : "" ) + row ) ;
2017-02-03 20:50:45 +00:00
}
2017-04-16 04:32:13 +00:00
delete o . dense ;
2017-04-20 03:24:48 +00:00
return out . join ( "" ) ;
2017-02-03 20:50:45 +00:00
}
2017-04-08 06:55:35 +00:00
2017-04-03 00:16:03 +00:00
function sheet _to _txt ( sheet /*:Worksheet*/ , opts /*:?Sheet2CSVOpts*/ ) {
if ( ! opts ) opts = { } ; opts . FS = "\t" ; opts . RS = "\n" ;
var s = sheet _to _csv ( sheet , opts ) ;
2022-03-12 14:05:57 +00:00
if ( typeof $cptable == 'undefined' || opts . type == 'string' ) return s ;
var o = $cptable . utils . encode ( 1200 , s , 'str' ) ;
2018-02-03 20:46:32 +00:00
return String . fromCharCode ( 255 ) + String . fromCharCode ( 254 ) + o ;
2017-04-03 00:16:03 +00:00
}
2017-02-03 20:50:45 +00:00
2017-02-19 20:36:32 +00:00
function sheet _to _formulae ( sheet /*:Worksheet*/ ) /*:Array<string>*/ {
var y = "" , x , val = "" ;
if ( sheet == null || sheet [ "!ref" ] == null ) return [ ] ;
2017-12-30 05:40:35 +00:00
var r = safe _decode _range ( sheet [ '!ref' ] ) , rr = "" , cols /*:Array<string>*/ = [ ] , C ;
2017-07-05 22:27:54 +00:00
var cmds /*:Array<string>*/ = [ ] ;
2017-04-08 06:55:35 +00:00
var dense = Array . isArray ( sheet ) ;
2017-02-03 20:50:45 +00:00
for ( C = r . s . c ; C <= r . e . c ; ++ C ) cols [ C ] = encode _col ( C ) ;
for ( var R = r . s . r ; R <= r . e . r ; ++ R ) {
rr = encode _row ( R ) ;
for ( C = r . s . c ; C <= r . e . c ; ++ C ) {
y = cols [ C ] + rr ;
2017-04-08 06:55:35 +00:00
x = dense ? ( sheet [ R ] || [ ] ) [ C ] : sheet [ y ] ;
2017-02-03 20:50:45 +00:00
val = "" ;
if ( x === undefined ) continue ;
2017-02-19 20:36:32 +00:00
else if ( x . F != null ) {
y = x . F ;
if ( ! x . f ) continue ;
val = x . f ;
if ( y . indexOf ( ":" ) == - 1 ) y = y + ":" + y ;
}
2017-02-03 20:50:45 +00:00
if ( x . f != null ) val = x . f ;
2017-03-15 08:19:02 +00:00
else if ( x . t == 'z' ) continue ;
2017-02-19 20:36:32 +00:00
else if ( x . t == 'n' && x . v != null ) val = "" + x . v ;
else if ( x . t == 'b' ) val = x . v ? "TRUE" : "FALSE" ;
2017-02-03 20:50:45 +00:00
else if ( x . w !== undefined ) val = "'" + x . w ;
else if ( x . v === undefined ) continue ;
2017-02-19 20:36:32 +00:00
else if ( x . t == 's' ) val = "'" + x . v ;
2017-02-03 20:50:45 +00:00
else val = "" + x . v ;
2017-07-05 22:27:54 +00:00
cmds [ cmds . length ] = y + "=" + val ;
2017-02-03 20:50:45 +00:00
}
}
return cmds ;
}
2018-01-09 07:36:02 +00:00
function sheet _add _json ( _ws /*:?Worksheet*/ , js /*:Array<any>*/ , opts ) /*:Worksheet*/ {
2017-05-11 18:23:21 +00:00
var o = opts || { } ;
2018-01-09 07:36:02 +00:00
var offset = + ! o . skipHeader ;
var ws /*:Worksheet*/ = _ws || ( { } /*:any*/ ) ;
var _R = 0 , _C = 0 ;
if ( ws && o . origin != null ) {
if ( typeof o . origin == 'number' ) _R = o . origin ;
else {
var _origin /*:CellAddress*/ = typeof o . origin == "string" ? decode _cell ( o . origin ) : o . origin ;
_R = _origin . r ; _C = _origin . c ;
}
}
2017-05-17 04:23:36 +00:00
var cell /*:Cell*/ ;
2018-01-09 07:36:02 +00:00
var range /*:Range*/ = ( { s : { c : 0 , r : 0 } , e : { c : _C , r : _R + js . length - 1 + offset } } /*:any*/ ) ;
if ( ws [ '!ref' ] ) {
var _range = safe _decode _range ( ws [ '!ref' ] ) ;
range . e . c = Math . max ( range . e . c , _range . e . c ) ;
range . e . r = Math . max ( range . e . r , _range . e . r ) ;
2020-04-20 01:17:44 +00:00
if ( _R == - 1 ) { _R = _range . e . r + 1 ; range . e . r = _R + js . length - 1 + offset ; }
2020-07-31 03:38:44 +00:00
} else {
if ( _R == - 1 ) { _R = 0 ; range . e . r = js . length - 1 + offset ; }
2018-01-09 07:36:02 +00:00
}
2017-12-30 05:40:35 +00:00
var hdr /*:Array<string>*/ = o . header || [ ] , C = 0 ;
2017-05-11 18:23:21 +00:00
2018-01-09 07:36:02 +00:00
js . forEach ( function ( JS , R /*:number*/ ) {
2018-02-28 10:41:49 +00:00
keys ( JS ) . forEach ( function ( k ) {
2017-05-11 18:23:21 +00:00
if ( ( C = hdr . indexOf ( k ) ) == - 1 ) hdr [ C = hdr . length ] = k ;
2017-10-17 00:14:32 +00:00
var v = JS [ k ] ;
2017-05-11 18:23:21 +00:00
var t = 'z' ;
2017-05-17 04:23:36 +00:00
var z = "" ;
2019-11-01 03:09:14 +00:00
var ref = encode _cell ( { c : _C + C , r : _R + R + offset } ) ;
2022-03-12 14:05:57 +00:00
cell = ws _get _cell _stub ( ws , ref ) ;
2018-07-09 03:46:11 +00:00
if ( v && typeof v === 'object' && ! ( v instanceof Date ) ) {
2019-11-01 03:09:14 +00:00
ws [ ref ] = v ;
2018-07-09 03:46:11 +00:00
} else {
if ( typeof v == 'number' ) t = 'n' ;
else if ( typeof v == 'boolean' ) t = 'b' ;
else if ( typeof v == 'string' ) t = 's' ;
else if ( v instanceof Date ) {
t = 'd' ;
if ( ! o . cellDates ) { t = 'n' ; v = datenum ( v ) ; }
2022-05-25 01:45:55 +00:00
z = ( cell . z && fmt _is _date ( cell . z ) ) ? cell . z : ( o . dateNF || table _fmt [ 14 ] ) ;
2019-11-01 03:09:14 +00:00
}
2021-10-13 07:20:25 +00:00
else if ( v === null && o . nullError ) { t = 'e' ; v = 0 ; }
2019-11-01 03:09:14 +00:00
if ( ! cell ) ws [ ref ] = cell = ( { t : t , v : v } /*:any*/ ) ;
else {
cell . t = t ; cell . v = v ;
delete cell . w ; delete cell . R ;
if ( z ) cell . z = z ;
2018-07-09 03:46:11 +00:00
}
if ( z ) cell . z = z ;
2017-05-17 04:23:36 +00:00
}
2017-05-11 18:23:21 +00:00
} ) ;
2017-10-17 00:14:32 +00:00
} ) ;
2018-01-09 07:36:02 +00:00
range . e . c = Math . max ( range . e . c , _C + hdr . length - 1 ) ;
var _ _R = encode _row ( _R ) ;
if ( offset ) for ( C = 0 ; C < hdr . length ; ++ C ) ws [ encode _col ( C + _C ) + _ _R ] = { t : 's' , v : hdr [ C ] } ;
2017-05-11 18:23:21 +00:00
ws [ '!ref' ] = encode _range ( range ) ;
return ws ;
}
2018-01-09 07:36:02 +00:00
function json _to _sheet ( js /*:Array<any>*/ , opts ) /*:Worksheet*/ { return sheet _add _json ( null , js , opts ) ; }
2017-05-11 18:23:21 +00:00
2017-05-11 07:29:59 +00:00
/* get cell, creating a stub if necessary */
function ws _get _cell _stub ( ws /*:Worksheet*/ , R , C /*:?number*/ ) /*:Cell*/ {
/* A1 cell address */
2019-11-01 03:09:14 +00:00
if ( typeof R == "string" ) {
/* dense */
if ( Array . isArray ( ws ) ) {
var RC = decode _cell ( R ) ;
if ( ! ws [ RC . r ] ) ws [ RC . r ] = [ ] ;
return ws [ RC . r ] [ RC . c ] || ( ws [ RC . r ] [ RC . c ] = { t : 'z' } ) ;
}
return ws [ R ] || ( ws [ R ] = { t : 'z' } ) ;
}
2017-05-11 07:29:59 +00:00
/* cell address object */
if ( typeof R != "number" ) return ws _get _cell _stub ( ws , encode _cell ( R ) ) ;
/* R and C are 0-based indices */
2017-05-13 18:21:22 +00:00
return ws _get _cell _stub ( ws , encode _cell ( { r : R , c : C || 0 } ) ) ;
2017-05-11 07:29:59 +00:00
}
/* find sheet index for given name / validate index */
function wb _sheet _idx ( wb /*:Workbook*/ , sh /*:number|string*/ ) {
if ( typeof sh == "number" ) {
if ( sh >= 0 && wb . SheetNames . length > sh ) return sh ;
throw new Error ( "Cannot find sheet # " + sh ) ;
} else if ( typeof sh == "string" ) {
var idx = wb . SheetNames . indexOf ( sh ) ;
if ( idx > - 1 ) return idx ;
throw new Error ( "Cannot find sheet name |" + sh + "|" ) ;
} else throw new Error ( "Cannot find sheet |" + sh + "|" ) ;
}
/* simple blank workbook object */
2022-03-12 14:05:57 +00:00
function book _new ( ) /*:Workbook*/ {
2017-05-11 07:29:59 +00:00
return { SheetNames : [ ] , Sheets : { } } ;
2022-03-12 14:05:57 +00:00
}
2017-05-11 07:29:59 +00:00
/* add a worksheet to the end of a given workbook */
2022-03-21 01:39:16 +00:00
function book _append _sheet ( wb /*:Workbook*/ , ws /*:Worksheet*/ , name /*:?string*/ , roll /*:?boolean*/ ) /*:string*/ {
var i = 1 ;
if ( ! name ) for ( ; i <= 0xFFFF ; ++ i , name = undefined ) if ( wb . SheetNames . indexOf ( name = "Sheet" + i ) == - 1 ) break ;
2020-08-12 21:58:02 +00:00
if ( ! name || wb . SheetNames . length >= 0xFFFF ) throw new Error ( "Too many worksheets" ) ;
2022-03-21 01:39:16 +00:00
if ( roll && wb . SheetNames . indexOf ( name ) >= 0 ) {
var m = name . match ( /(^.*?)(\d+)$/ ) ;
i = m && + m [ 2 ] || 0 ;
var root = m && m [ 1 ] || name ;
for ( ++ i ; i <= 0xFFFF ; ++ i ) if ( wb . SheetNames . indexOf ( name = root + i ) == - 1 ) break ;
}
2017-05-11 07:29:59 +00:00
check _ws _name ( name ) ;
if ( wb . SheetNames . indexOf ( name ) >= 0 ) throw new Error ( "Worksheet with name |" + name + "| already exists!" ) ;
wb . SheetNames . push ( name ) ;
wb . Sheets [ name ] = ws ;
2022-03-21 01:39:16 +00:00
return name ;
2022-03-12 14:05:57 +00:00
}
2017-05-11 07:29:59 +00:00
/* set sheet visibility (visible/hidden/very hidden) */
2022-03-12 14:05:57 +00:00
function book _set _sheet _visibility ( wb /*:Workbook*/ , sh /*:number|string*/ , vis /*:number*/ ) {
if ( ! wb . Workbook ) wb . Workbook = { } ;
if ( ! wb . Workbook . Sheets ) wb . Workbook . Sheets = [ ] ;
2017-05-11 07:29:59 +00:00
var idx = wb _sheet _idx ( wb , sh ) ;
2017-05-13 18:21:22 +00:00
// $FlowIgnore
2022-03-12 14:05:57 +00:00
if ( ! wb . Workbook . Sheets [ idx ] ) wb . Workbook . Sheets [ idx ] = { } ;
2017-05-11 07:29:59 +00:00
switch ( vis ) {
case 0 : case 1 : case 2 : break ;
default : throw new Error ( "Bad sheet visibility setting " + vis ) ;
}
2017-05-13 18:21:22 +00:00
// $FlowIgnore
2017-05-11 07:29:59 +00:00
wb . Workbook . Sheets [ idx ] . Hidden = vis ;
2022-03-12 14:05:57 +00:00
}
2017-05-11 07:29:59 +00:00
/* set number format */
2022-03-12 14:05:57 +00:00
function cell _set _number _format ( cell /*:Cell*/ , fmt /*:string|number*/ ) {
2017-05-11 07:29:59 +00:00
cell . z = fmt ;
return cell ;
2022-03-12 14:05:57 +00:00
}
2017-05-11 07:29:59 +00:00
/* set cell hyperlink */
2022-03-12 14:05:57 +00:00
function cell _set _hyperlink ( cell /*:Cell*/ , target /*:string*/ , tooltip /*:?string*/ ) {
2017-05-11 07:29:59 +00:00
if ( ! target ) {
delete cell . l ;
} else {
2017-05-13 18:21:22 +00:00
cell . l = ( { Target : target } /*:Hyperlink*/ ) ;
2017-05-11 07:29:59 +00:00
if ( tooltip ) cell . l . Tooltip = tooltip ;
}
return cell ;
2022-03-12 14:05:57 +00:00
}
function cell _set _internal _link ( cell /*:Cell*/ , range /*:string*/ , tooltip /*:?string*/ ) { return cell _set _hyperlink ( cell , "#" + range , tooltip ) ; }
2017-05-11 07:29:59 +00:00
/* add to cell comments */
2022-03-12 14:05:57 +00:00
function cell _add _comment ( cell /*:Cell*/ , text /*:string*/ , author /*:?string*/ ) {
2017-05-11 07:29:59 +00:00
if ( ! cell . c ) cell . c = [ ] ;
cell . c . push ( { t : text , a : author || "SheetJS" } ) ;
2022-03-12 14:05:57 +00:00
}
2017-05-11 07:29:59 +00:00
/* set array formula and flush related cells */
2022-03-12 14:05:57 +00:00
function sheet _set _array _formula ( ws /*:Worksheet*/ , range , formula /*:string*/ , dynamic /*:boolean*/ ) {
2017-05-11 07:29:59 +00:00
var rng = typeof range != "string" ? range : safe _decode _range ( range ) ;
var rngstr = typeof range == "string" ? range : encode _range ( range ) ;
for ( var R = rng . s . r ; R <= rng . e . r ; ++ R ) for ( var C = rng . s . c ; C <= rng . e . c ; ++ C ) {
var cell = ws _get _cell _stub ( ws , R , C ) ;
cell . t = 'n' ;
cell . F = rngstr ;
2017-05-11 18:23:21 +00:00
delete cell . v ;
2022-03-03 08:35:39 +00:00
if ( R == rng . s . r && C == rng . s . c ) {
cell . f = formula ;
if ( dynamic ) cell . D = true ;
}
2017-05-11 07:29:59 +00:00
}
2022-05-17 01:26:22 +00:00
var wsr = decode _range ( ws [ "!ref" ] ) ;
if ( wsr . s . r > rng . s . r ) wsr . s . r = rng . s . r ;
if ( wsr . s . c > rng . s . c ) wsr . s . c = rng . s . c ;
if ( wsr . e . r < rng . e . r ) wsr . e . r = rng . e . r ;
if ( wsr . e . c < rng . e . c ) wsr . e . c = rng . e . c ;
2022-05-22 23:51:41 +00:00
ws [ "!ref" ] = encode _range ( wsr ) ;
2017-05-11 07:29:59 +00:00
return ws ;
2022-03-12 14:05:57 +00:00
}
2017-05-11 07:29:59 +00:00
2022-03-12 14:05:57 +00:00
var utils /*:any*/ = {
encode _col : encode _col ,
encode _row : encode _row ,
encode _cell : encode _cell ,
encode _range : encode _range ,
decode _col : decode _col ,
decode _row : decode _row ,
split _cell : split _cell ,
decode _cell : decode _cell ,
decode _range : decode _range ,
format _cell : format _cell ,
sheet _add _aoa : sheet _add _aoa ,
sheet _add _json : sheet _add _json ,
sheet _add _dom : sheet _add _dom ,
aoa _to _sheet : aoa _to _sheet ,
json _to _sheet : json _to _sheet ,
table _to _sheet : parse _dom _table ,
table _to _book : table _to _book ,
sheet _to _csv : sheet _to _csv ,
sheet _to _txt : sheet _to _txt ,
sheet _to _json : sheet _to _json ,
2022-03-20 05:29:24 +00:00
sheet _to _html : sheet _to _html ,
2022-03-12 14:05:57 +00:00
sheet _to _formulae : sheet _to _formulae ,
sheet _to _row _object _array : sheet _to _json ,
sheet _get _cell : ws _get _cell _stub ,
book _new : book _new ,
book _append _sheet : book _append _sheet ,
book _set _sheet _visibility : book _set _sheet _visibility ,
cell _set _number _format : cell _set _number _format ,
cell _set _hyperlink : cell _set _hyperlink ,
cell _set _internal _link : cell _set _internal _link ,
cell _add _comment : cell _add _comment ,
sheet _set _array _formula : sheet _set _array _formula ,
consts : {
SHEET _VISIBLE : 0 ,
SHEET _HIDDEN : 1 ,
SHEET _VERY _HIDDEN : 2
}
} ;
2017-05-11 07:29:59 +00:00
2022-03-09 01:44:10 +00:00
var _Readable ;
function set _readable ( R ) { _Readable = R ; }
function write _csv _stream ( sheet /*:Worksheet*/ , opts /*:?Sheet2CSVOpts*/ ) {
var stream = _Readable ( ) ;
var o = opts == null ? { } : opts ;
if ( sheet == null || sheet [ "!ref" ] == null ) { stream . push ( null ) ; return stream ; }
var r = safe _decode _range ( sheet [ "!ref" ] ) ;
var FS = o . FS !== undefined ? o . FS : "," , fs = FS . charCodeAt ( 0 ) ;
var RS = o . RS !== undefined ? o . RS : "\n" , rs = RS . charCodeAt ( 0 ) ;
var endregex = new RegExp ( ( FS == "|" ? "\\|" : FS ) + "+$" ) ;
var row /*:?string*/ = "" , cols /*:Array<string>*/ = [ ] ;
o . dense = Array . isArray ( sheet ) ;
var colinfo /*:Array<ColInfo>*/ = o . skipHidden && sheet [ "!cols" ] || [ ] ;
var rowinfo /*:Array<RowInfo>*/ = o . skipHidden && sheet [ "!rows" ] || [ ] ;
for ( var C = r . s . c ; C <= r . e . c ; ++ C ) if ( ! ( ( colinfo [ C ] || { } ) . hidden ) ) cols [ C ] = encode _col ( C ) ;
var R = r . s . r ;
var BOM = false , w = 0 ;
stream . _read = function ( ) {
if ( ! BOM ) { BOM = true ; return stream . push ( "\uFEFF" ) ; }
while ( R <= r . e . r ) {
++ R ;
if ( ( rowinfo [ R - 1 ] || { } ) . hidden ) continue ;
row = make _csv _row ( sheet , r , R - 1 , cols , fs , rs , FS , o ) ;
if ( row != null ) {
if ( o . strip ) row = row . replace ( endregex , "" ) ;
if ( row || ( o . blankrows !== false ) ) return stream . push ( ( w ++ ? RS : "" ) + row ) ;
2017-04-09 04:03:19 +00:00
}
2022-03-09 01:44:10 +00:00
}
return stream . push ( null ) ;
2017-04-09 04:03:19 +00:00
} ;
2022-03-09 01:44:10 +00:00
return stream ;
}
2017-04-09 04:03:19 +00:00
2022-03-09 01:44:10 +00:00
function write _html _stream ( ws /*:Worksheet*/ , opts /*:?Sheet2HTMLOpts*/ ) {
var stream = _Readable ( ) ;
2017-04-16 07:31:21 +00:00
2022-03-09 01:44:10 +00:00
var o = opts || { } ;
2022-03-20 05:29:24 +00:00
var header = o . header != null ? o . header : HTML _BEGIN ;
var footer = o . footer != null ? o . footer : HTML _END ;
2022-03-09 01:44:10 +00:00
stream . push ( header ) ;
var r = decode _range ( ws [ '!ref' ] ) ;
o . dense = Array . isArray ( ws ) ;
2022-03-20 05:29:24 +00:00
stream . push ( make _html _preamble ( ws , r , o ) ) ;
2022-03-09 01:44:10 +00:00
var R = r . s . r ;
var end = false ;
stream . _read = function ( ) {
if ( R > r . e . r ) {
if ( ! end ) { end = true ; stream . push ( "</table>" + footer ) ; }
return stream . push ( null ) ;
}
while ( R <= r . e . r ) {
2022-03-20 05:29:24 +00:00
stream . push ( make _html _row ( ws , r , R , o ) ) ;
2022-03-09 01:44:10 +00:00
++ R ;
break ;
}
2017-04-16 07:31:21 +00:00
} ;
2022-03-09 01:44:10 +00:00
return stream ;
}
2017-04-09 04:03:19 +00:00
2022-03-09 01:44:10 +00:00
function write _json _stream ( sheet /*:Worksheet*/ , opts /*:?Sheet2CSVOpts*/ ) {
var stream = _Readable ( { objectMode : true } ) ;
2018-07-09 03:46:11 +00:00
2022-03-09 01:44:10 +00:00
if ( sheet == null || sheet [ "!ref" ] == null ) { stream . push ( null ) ; return stream ; }
var val = { t : 'n' , v : 0 } , header = 0 , offset = 1 , hdr /*:Array<any>*/ = [ ] , v = 0 , vv = "" ;
var r = { s : { r : 0 , c : 0 } , e : { r : 0 , c : 0 } } ;
var o = opts || { } ;
var range = o . range != null ? o . range : sheet [ "!ref" ] ;
if ( o . header === 1 ) header = 1 ;
else if ( o . header === "A" ) header = 2 ;
else if ( Array . isArray ( o . header ) ) header = 3 ;
switch ( typeof range ) {
case 'string' : r = safe _decode _range ( range ) ; break ;
case 'number' : r = safe _decode _range ( sheet [ "!ref" ] ) ; r . s . r = range ; break ;
default : r = range ;
}
if ( header > 0 ) offset = 0 ;
var rr = encode _row ( r . s . r ) ;
var cols /*:Array<string>*/ = [ ] ;
var counter = 0 ;
var dense = Array . isArray ( sheet ) ;
2022-03-10 05:31:13 +00:00
var R = r . s . r , C = 0 ;
var header _cnt = { } ;
2022-03-09 01:44:10 +00:00
if ( dense && ! sheet [ R ] ) sheet [ R ] = [ ] ;
2022-03-12 14:05:57 +00:00
var colinfo /*:Array<ColInfo>*/ = o . skipHidden && sheet [ "!cols" ] || [ ] ;
var rowinfo /*:Array<RowInfo>*/ = o . skipHidden && sheet [ "!rows" ] || [ ] ;
2022-03-09 01:44:10 +00:00
for ( C = r . s . c ; C <= r . e . c ; ++ C ) {
2022-03-12 14:05:57 +00:00
if ( ( ( colinfo [ C ] || { } ) . hidden ) ) continue ;
2022-03-09 01:44:10 +00:00
cols [ C ] = encode _col ( C ) ;
val = dense ? sheet [ R ] [ C ] : sheet [ cols [ C ] + rr ] ;
switch ( header ) {
case 1 : hdr [ C ] = C - r . s . c ; break ;
case 2 : hdr [ C ] = cols [ C ] ; break ;
case 3 : hdr [ C ] = o . header [ C - r . s . c ] ; break ;
default :
if ( val == null ) val = { w : "__EMPTY" , t : "s" } ;
vv = v = format _cell ( val , null , o ) ;
2022-03-10 05:31:13 +00:00
counter = header _cnt [ v ] || 0 ;
if ( ! counter ) header _cnt [ v ] = 1 ;
else {
do { vv = v + "_" + ( counter ++ ) ; } while ( header _cnt [ vv ] ) ; header _cnt [ v ] = counter ;
header _cnt [ vv ] = 1 ;
}
2022-03-09 01:44:10 +00:00
hdr [ C ] = vv ;
2018-07-09 03:46:11 +00:00
}
2022-03-09 01:44:10 +00:00
}
R = r . s . r + offset ;
stream . _read = function ( ) {
while ( R <= r . e . r ) {
2022-03-12 14:05:57 +00:00
if ( ( rowinfo [ R - 1 ] || { } ) . hidden ) continue ;
2022-03-09 01:44:10 +00:00
var row = make _json _row ( sheet , r , R , cols , header , hdr , dense , o ) ;
++ R ;
if ( ( row . isempty === false ) || ( header === 1 ? o . blankrows !== false : ! ! o . blankrows ) ) {
stream . push ( row . row ) ;
return ;
2018-07-09 03:46:11 +00:00
}
}
2022-03-09 01:44:10 +00:00
return stream . push ( null ) ;
2018-07-09 03:46:11 +00:00
} ;
2022-03-09 01:44:10 +00:00
return stream ;
2022-03-10 05:31:13 +00:00
}
2018-07-09 03:46:11 +00:00
2022-03-09 01:44:10 +00:00
var _ _stream = {
to _json : write _json _stream ,
to _html : write _html _stream ,
to _csv : write _csv _stream ,
2022-05-22 23:51:41 +00:00
set _readable : set _readable
2022-03-09 01:44:10 +00:00
} ;
2019-08-04 19:50:49 +00:00
if ( typeof parse _xlscfb !== "undefined" ) XLSX . parse _xlscfb = parse _xlscfb ;
2017-02-03 20:50:45 +00:00
XLSX . parse _zip = parse _zip ;
XLSX . read = readSync ; //xlsread
XLSX . readFile = readFileSync ; //readFile
XLSX . readFileSync = readFileSync ;
XLSX . write = writeSync ;
XLSX . writeFile = writeFileSync ;
XLSX . writeFileSync = writeFileSync ;
2017-03-25 01:36:40 +00:00
XLSX . writeFileAsync = writeFileAsync ;
2017-02-03 20:50:45 +00:00
XLSX . utils = utils ;
2022-02-14 01:28:13 +00:00
XLSX . writeXLSX = writeSyncXLSX ;
XLSX . writeFileXLSX = writeFileSyncXLSX ;
2017-02-03 20:50:45 +00:00
XLSX . SSF = SSF ;
2022-03-09 01:44:10 +00:00
if ( typeof _ _stream !== "undefined" ) XLSX . stream = _ _stream ;
2019-08-04 19:50:49 +00:00
if ( typeof CFB !== "undefined" ) XLSX . CFB = CFB ;
2022-03-09 01:44:10 +00:00
if ( typeof require !== "undefined" ) {
var strmod = require ( 'stream' ) ;
if ( ( strmod || { } ) . Readable ) set _readable ( strmod . Readable ) ;
2022-05-22 23:51:41 +00:00
try { _fs = require ( 'fs' ) ; } catch ( e ) { }
2022-03-09 01:44:10 +00:00
}
2018-06-01 16:32:08 +00:00
}
/*global define */
/*:: declare var define:any; */
if ( typeof exports !== 'undefined' ) make _xlsx _lib ( exports ) ;
else if ( typeof module !== 'undefined' && module . exports ) make _xlsx _lib ( module . exports ) ;
2021-11-14 04:38:00 +00:00
else if ( typeof define === 'function' && define . amd ) define ( 'xlsx' , function ( ) { if ( ! XLSX . version ) make _xlsx _lib ( XLSX ) ; return XLSX ; } ) ;
2018-06-01 16:32:08 +00:00
else make _xlsx _lib ( XLSX ) ;
2021-10-13 07:20:25 +00:00
/* NOTE: the following extra line is needed for "Lightning Locker Service" */
2022-01-10 18:45:50 +00:00
if ( typeof window !== 'undefined' && ! window . XLSX ) try { window . XLSX = XLSX ; } catch ( e ) { }