2018-06-01 16:34:26 +00:00
/*! xlsx.js (C) 2013-present SheetJS -- http://sheetjs.com */
2012-12-03 19:47:44 +00:00
/* vim: set ts=2: */
2017-03-10 00:36:03 +00:00
/*exported XLSX */
2018-01-23 09:09:53 +00:00
/*global global, exports, module, require:false, process:false, Buffer:false, ArrayBuffer:false */
2014-04-15 08:24:40 +00:00
var XLSX = { } ;
2018-06-01 16:34:26 +00:00
function make _xlsx _lib ( XLSX ) {
2018-08-26 00:09:59 +00:00
XLSX . version = '0.13.5' ;
2017-12-30 05:41:41 +00:00
var current _codepage = 1200 , current _ansi = 1252 ;
2018-05-05 06:42:56 +00:00
/*global cptable:true, window */
2014-05-03 18:52:00 +00:00
if ( typeof module !== "undefined" && typeof require !== 'undefined' ) {
2018-05-05 06:42:56 +00:00
if ( typeof cptable === 'undefined' ) {
if ( typeof global !== 'undefined' ) global . cptable = require ( './dist/cpexcel.js' ) ;
else if ( typeof window !== 'undefined' ) window . cptable = require ( './dist/cpexcel.js' ) ;
}
2014-05-03 18:52:00 +00:00
}
2017-12-30 05:41:41 +00:00
var VALID _ANSI = [ 874 , 932 , 936 , 949 , 950 ] ;
for ( var i = 0 ; i <= 8 ; ++ i ) VALID _ANSI . push ( 1250 + i ) ;
/* 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 */
} ) ;
var set _ansi = function ( cp ) { if ( VALID _ANSI . indexOf ( cp ) == - 1 ) return ; current _ansi = CS2CP [ 0 ] = cp ; } ;
function reset _ansi ( ) { set _ansi ( 1252 ) ; }
var set _cp = function ( cp ) { current _codepage = cp ; set _ansi ( cp ) ; } ;
function reset _cp ( ) { set _cp ( 1200 ) ; reset _ansi ( ) ; }
2014-05-03 18:52:00 +00:00
2014-07-28 15:32:28 +00:00
function char _codes ( data ) { var o = [ ] ; for ( var i = 0 , len = data . length ; i < len ; ++ i ) o [ i ] = data . charCodeAt ( i ) ; return o ; }
2017-06-24 06:48:44 +00:00
function utf16leread ( data ) {
var o = [ ] ;
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 ) {
var o = [ ] ;
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 11:14:53 +00:00
var debom = function ( data ) {
var c1 = data . charCodeAt ( 0 ) , c2 = data . charCodeAt ( 1 ) ;
2018-01-23 09:09:53 +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 11:14:53 +00:00
return data ;
} ;
2014-07-28 15:32:28 +00:00
2015-04-02 22:14:07 +00:00
var _getchar = function _gc1 ( x ) { return String . fromCharCode ( x ) ; } ;
2014-07-28 15:32:28 +00:00
if ( typeof cptable !== 'undefined' ) {
2017-05-09 18:11:15 +00:00
set _cp = function ( cp ) { current _codepage = cp ; } ;
2017-02-24 11:14:53 +00:00
debom = function ( data ) {
2018-01-23 09:09:53 +00:00
if ( data . charCodeAt ( 0 ) === 0xFF && data . charCodeAt ( 1 ) === 0xFE ) { return cptable . utils . decode ( 1200 , char _codes ( data . slice ( 2 ) ) ) ; }
2014-07-28 15:32:28 +00:00
return data ;
} ;
2015-04-02 22:14:07 +00:00
_getchar = function _gc2 ( x ) {
if ( current _codepage === 1200 ) return String . fromCharCode ( x ) ;
return cptable . utils . decode ( current _codepage , [ x & 255 , x >> 8 ] ) [ 0 ] ;
} ;
}
2017-04-09 04:07:43 +00:00
var DENSE = null ;
2017-04-30 16:28:24 +00:00
var DIF _XL = true ;
2015-04-02 22:14:07 +00:00
var Base64 = ( function make _b64 ( ) {
var map = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=" ;
return {
2017-05-09 18:11:15 +00:00
encode : function ( input ) {
2015-04-02 22:14:07 +00:00
var o = "" ;
2017-11-20 02:13:37 +00:00
var c1 = 0 , c2 = 0 , c3 = 0 , e1 = 0 , e2 = 0 , e3 = 0 , e4 = 0 ;
2015-04-02 22:14:07 +00:00
for ( var i = 0 ; i < input . length ; ) {
c1 = input . charCodeAt ( i ++ ) ;
2018-03-06 01:09:57 +00:00
e1 = ( c1 >> 2 ) ;
2015-04-02 22:14:07 +00:00
c2 = input . charCodeAt ( i ++ ) ;
2017-11-20 02:13:37 +00:00
e2 = ( ( c1 & 3 ) << 4 ) | ( c2 >> 4 ) ;
2018-03-06 01:09:57 +00:00
c3 = input . charCodeAt ( i ++ ) ;
2017-11-20 02:13:37 +00:00
e3 = ( ( c2 & 15 ) << 2 ) | ( c3 >> 6 ) ;
2018-03-06 01:09:57 +00:00
e4 = ( c3 & 63 ) ;
2015-04-02 22:14:07 +00:00
if ( isNaN ( c2 ) ) { e3 = e4 = 64 ; }
else if ( isNaN ( c3 ) ) { e4 = 64 ; }
o += map . charAt ( e1 ) + map . charAt ( e2 ) + map . charAt ( e3 ) + map . charAt ( e4 ) ;
}
return o ;
} ,
2017-05-09 18:11:15 +00:00
decode : function b64 _decode ( input ) {
2015-04-02 22:14:07 +00:00
var o = "" ;
2018-03-06 01:09:57 +00:00
var c1 = 0 , c2 = 0 , c3 = 0 , e1 = 0 , e2 = 0 , e3 = 0 , e4 = 0 ;
input = input . replace ( /[^\w\+\/\=]/g , "" ) ;
2015-04-02 22:14:07 +00:00
for ( var i = 0 ; i < input . length ; ) {
e1 = map . indexOf ( input . charAt ( i ++ ) ) ;
e2 = map . indexOf ( input . charAt ( i ++ ) ) ;
2017-11-20 02:13:37 +00:00
c1 = ( e1 << 2 ) | ( e2 >> 4 ) ;
2015-04-02 22:14:07 +00:00
o += String . fromCharCode ( c1 ) ;
2018-03-06 01:09:57 +00:00
e3 = map . indexOf ( input . charAt ( i ++ ) ) ;
c2 = ( ( e2 & 15 ) << 4 ) | ( e3 >> 2 ) ;
2017-11-20 02:13:37 +00:00
if ( e3 !== 64 ) { o += String . fromCharCode ( c2 ) ; }
2018-03-06 01:09:57 +00:00
e4 = map . indexOf ( input . charAt ( i ++ ) ) ;
c3 = ( ( e3 & 3 ) << 6 ) | e4 ;
2017-11-20 02:13:37 +00:00
if ( e4 !== 64 ) { o += String . fromCharCode ( c3 ) ; }
2015-04-02 22:14:07 +00:00
}
return o ;
}
} ;
} ) ( ) ;
2017-04-03 06:04:35 +00:00
var has _buf = ( typeof Buffer !== 'undefined' && typeof process !== 'undefined' && typeof process . versions !== 'undefined' && process . versions . node ) ;
2015-04-02 22:14:07 +00:00
2018-07-09 07:07:59 +00:00
var Buffer _from = function ( ) { } ;
2018-05-05 06:42:56 +00:00
if ( typeof Buffer !== 'undefined' ) {
2018-07-09 07:07:59 +00:00
var nbfs = ! Buffer . from ;
if ( ! nbfs ) try { Buffer . from ( "foo" , "utf8" ) ; } catch ( e ) { nbfs = true ; }
Buffer _from = nbfs ? function ( buf , enc ) { return ( enc ) ? new Buffer ( buf , enc ) : new Buffer ( buf ) ; } : Buffer . from . bind ( Buffer ) ;
2018-05-05 06:42:56 +00:00
// $FlowIgnore
if ( ! Buffer . alloc ) Buffer . alloc = function ( n ) { return new Buffer ( n ) ; } ;
}
2015-04-02 22:14:07 +00:00
function new _raw _buf ( len ) {
/* jshint -W056 */
2018-05-05 06:42:56 +00:00
return has _buf ? Buffer . alloc ( len ) : new Array ( len ) ;
2015-04-02 22:14:07 +00:00
/* jshint +W056 */
}
2018-05-05 06:42:56 +00:00
var s2a = function s2a ( s ) {
2018-07-09 07:07:59 +00:00
// $FlowIgnore
if ( has _buf ) return Buffer _from ( s , "binary" ) ;
2015-04-02 22:14:07 +00:00
return s . split ( "" ) . map ( function ( x ) { return x . charCodeAt ( 0 ) & 0xff ; } ) ;
2018-05-05 06:42:56 +00:00
} ;
2015-04-02 22:14:07 +00:00
2017-12-30 05:41:41 +00:00
function s2ab ( s ) {
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:43:07 +00:00
function a2s ( data ) {
2017-12-30 05:41:41 +00:00
if ( Array . isArray ( data ) ) return data . map ( _chr ) . join ( "" ) ;
var o = [ ] ; for ( var i = 0 ; i < data . length ; ++ i ) o [ i ] = _chr ( data [ i ] ) ; return o . join ( "" ) ;
}
2018-02-03 20:43:07 +00:00
function a2u ( data ) {
if ( typeof Uint8Array === 'undefined' ) throw new Error ( "Unsupported" ) ;
return new Uint8Array ( data ) ;
}
2018-01-23 09:09:53 +00:00
function ab2a ( data ) {
if ( typeof ArrayBuffer == 'undefined' ) throw new Error ( "Unsupported" ) ;
if ( data instanceof ArrayBuffer ) return ab2a ( new Uint8Array ( data ) ) ;
var o = new Array ( data . length ) ;
for ( var i = 0 ; i < data . length ; ++ i ) o [ i ] = data [ i ] ;
return o ;
}
2015-04-02 22:14:07 +00:00
var bconcat = function ( bufs ) { return [ ] . concat . apply ( [ ] , bufs ) ; } ;
2017-12-01 05:51:31 +00:00
var chr0 = /\u0000/g , chr1 = /[\u0001-\u0006]/g ;
2017-03-13 07:34:05 +00:00
/* ssf.js (C) 2013-present SheetJS -- http://sheetjs.com */
2014-06-29 18:35:10 +00:00
/*jshint -W041 */
2017-07-28 23:54:51 +00:00
var SSF = ( { } ) ;
2014-06-29 18:35:10 +00:00
var make _ssf = function make _ssf ( SSF ) {
2018-02-21 06:20:15 +00:00
SSF . version = '0.10.2' ;
2014-06-29 18:35:10 +00:00
function _strrev ( x ) { var o = "" , i = x . length - 1 ; while ( i >= 0 ) o += x . charAt ( i -- ) ; return o ; }
function fill ( c , l ) { var o = "" ; while ( o . length < l ) o += c ; return o ; }
function pad0 ( v , d ) { var t = "" + v ; return t . length >= d ? t : fill ( '0' , d - t . length ) + t ; }
function pad _ ( v , d ) { var t = "" + v ; return t . length >= d ? t : fill ( ' ' , d - t . length ) + t ; }
function rpad _ ( v , d ) { var t = "" + v ; return t . length >= d ? t : t + fill ( ' ' , d - t . length ) ; }
function pad0r1 ( v , d ) { var t = "" + Math . round ( v ) ; return t . length >= d ? t : fill ( '0' , d - t . length ) + t ; }
function pad0r2 ( v , d ) { var t = "" + v ; return t . length >= d ? t : fill ( '0' , d - t . length ) + t ; }
var p2 _32 = Math . pow ( 2 , 32 ) ;
function pad0r ( v , d ) { if ( v > p2 _32 || v < - p2 _32 ) return pad0r1 ( v , d ) ; var i = Math . round ( v ) ; return pad0r2 ( i , d ) ; }
2017-03-13 07:34:05 +00:00
function isgeneral ( s , i ) { 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 ; }
2012-12-03 19:47:44 +00:00
var days = [
[ 'Sun' , 'Sunday' ] ,
[ 'Mon' , 'Monday' ] ,
[ 'Tue' , 'Tuesday' ] ,
[ 'Wed' , 'Wednesday' ] ,
[ 'Thu' , 'Thursday' ] ,
[ 'Fri' , 'Friday' ] ,
[ 'Sat' , 'Saturday' ]
] ;
var months = [
[ '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' ]
] ;
2017-04-30 16:28:24 +00:00
function init _table ( t ) {
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"秒 "' ;
t [ 65535 ] = 'General' ;
}
var table _fmt = { } ;
init _table ( table _fmt ) ;
2014-06-29 18:35:10 +00:00
function frac ( x , D , mixed ) {
2013-12-31 17:20:13 +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 ;
2014-01-23 06:21:21 +00:00
var A = Math . floor ( B ) ;
2013-12-31 17:20:13 +00:00
while ( Q _1 < D ) {
2014-01-23 06:21:21 +00:00
A = Math . floor ( B ) ;
2013-12-31 17:20:13 +00:00
P = A * P _1 + P _2 ;
Q = A * Q _1 + Q _2 ;
2017-04-30 16:28:24 +00:00
if ( ( B - A ) < 0.00000005 ) break ;
2013-12-31 17:20:13 +00:00
B = 1 / ( B - A ) ;
P _2 = P _1 ; P _1 = P ;
Q _2 = Q _1 ; Q _1 = Q ;
}
2017-04-30 16:28:24 +00:00
if ( Q > D ) { if ( Q _1 > D ) { Q = Q _2 ; P = P _2 ; } else { Q = Q _1 ; P = P _1 ; } }
2013-12-31 17:20:13 +00:00
if ( ! mixed ) return [ 0 , sgn * P , Q ] ;
var q = Math . floor ( sgn * P / Q ) ;
return [ q , sgn * P - q * Q , Q ] ;
2014-06-29 18:35:10 +00:00
}
2017-07-28 23:54:51 +00:00
function parse _date _code ( v , opts , b2 ) {
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 ;
if ( b2 ) dow = fix _hijri ( d , dout ) ;
}
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 ;
}
SSF . parse _date _code = parse _date _code ;
var basedate = new Date ( 1899 , 11 , 31 , 0 , 0 , 0 ) ;
var dnthresh = basedate . getTime ( ) ;
var base1904 = new Date ( 1900 , 2 , 1 , 0 , 0 , 0 ) ;
function datenum _local ( v , date1904 ) {
var epoch = v . getTime ( ) ;
if ( date1904 ) epoch -= 1461 * 24 * 60 * 60 * 1000 ;
else if ( v >= base1904 ) epoch += 24 * 60 * 60 * 1000 ;
return ( epoch - ( dnthresh + ( v . getTimezoneOffset ( ) - basedate . getTimezoneOffset ( ) ) * 60000 ) ) / ( 24 * 60 * 60 * 1000 ) ;
}
function general _fmt _int ( v ) { return v . toString ( 10 ) ; }
2014-06-29 18:35:10 +00:00
SSF . _general _int = general _fmt _int ;
var general _fmt _num = ( function make _general _fmt _num ( ) {
var gnr1 = /\.(\d*[1-9])0+$/ , gnr2 = /\.0*$/ , gnr4 = /\.(\d*[1-9])0+/ , gnr5 = /\.0*[Ee]/ , gnr6 = /(E[+-])(\d)$/ ;
function gfn2 ( v ) {
var w = ( v < 0 ? 12 : 11 ) ;
var o = gfn5 ( v . toFixed ( 12 ) ) ; if ( o . length <= w ) return o ;
o = v . toPrecision ( 10 ) ; if ( o . length <= w ) return o ;
return v . toExponential ( 5 ) ;
}
function gfn3 ( v ) {
var o = v . toFixed ( 11 ) . replace ( gnr1 , ".$1" ) ;
if ( o . length > ( v < 0 ? 12 : 11 ) ) o = v . toPrecision ( 6 ) ;
return o ;
}
function gfn4 ( o ) {
for ( var i = 0 ; i != o . length ; ++ i ) if ( ( o . charCodeAt ( i ) | 0x20 ) === 101 ) return o . replace ( gnr4 , ".$1" ) . replace ( gnr5 , "E" ) . replace ( "e" , "E" ) . replace ( gnr6 , "$10$2" ) ;
return o ;
}
function gfn5 ( o ) {
return o . indexOf ( "." ) > - 1 ? o . replace ( gnr2 , "" ) . replace ( gnr1 , ".$1" ) : o ;
}
2017-05-11 18:57:52 +00:00
return function general _fmt _num ( v ) {
2014-06-29 18:35:10 +00:00
var V = Math . floor ( Math . log ( Math . abs ( v ) ) * Math . LOG10E ) , o ;
if ( V >= - 4 && V <= - 1 ) o = v . toPrecision ( 10 + V ) ;
else if ( Math . abs ( V ) <= 9 ) o = gfn2 ( v ) ;
else if ( V === 10 ) o = v . toFixed ( 10 ) . substr ( 0 , 12 ) ;
else o = gfn3 ( v ) ;
return gfn5 ( gfn4 ( o ) ) ;
} ; } ) ( ) ;
SSF . _general _num = general _fmt _num ;
2017-07-28 23:54:51 +00:00
function general _fmt ( v , opts ) {
2014-06-29 18:35:10 +00:00
switch ( typeof v ) {
case 'string' : return v ;
case 'boolean' : return v ? "TRUE" : "FALSE" ;
2017-07-28 23:54:51 +00:00
case 'number' : return ( v | 0 ) === v ? general _fmt _int ( v ) : general _fmt _num ( v ) ;
2017-04-30 16:28:24 +00:00
case 'undefined' : return "" ;
2017-07-28 23:54:51 +00:00
case 'object' :
if ( v == null ) return "" ;
if ( v instanceof Date ) return format ( 14 , datenum _local ( v , opts && opts . date1904 ) , opts ) ;
2013-12-31 17:20:13 +00:00
}
2014-02-17 08:51:25 +00:00
throw new Error ( "unsupported value in General format: " + v ) ;
2014-06-29 18:35:10 +00:00
}
2012-12-03 19:47:44 +00:00
SSF . _general = general _fmt ;
2017-07-28 23:54:51 +00:00
function fix _hijri ( ) { return 0 ; }
2014-01-22 05:02:45 +00:00
/*jshint -W086 */
2014-06-29 18:35:10 +00:00
function write _date ( type , fmt , val , ss0 ) {
var o = "" , ss = 0 , tt = 0 , y = val . y , out , outl = 0 ;
2012-12-03 19:47:44 +00:00
switch ( type ) {
2014-06-29 18:35:10 +00:00
case 98 : /* 'b' buddhist year */
y = val . y + 543 ;
2014-04-03 23:24:56 +00:00
/* falls through */
2014-06-29 18:35:10 +00:00
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 ] ;
2014-02-12 06:19:45 +00:00
default : return months [ val . m - 1 ] [ 2 ] ;
2014-06-29 18:35:10 +00:00
} 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 ] ;
2014-02-12 06:19:45 +00:00
default : return days [ val . q ] [ 1 ] ;
2014-06-29 18:35:10 +00:00
} break ;
case 104 : /* 'h' 12-hour */
switch ( fmt . length ) {
case 1 : case 2 : out = 1 + ( val . H + 11 ) % 12 ; outl = fmt . length ; break ;
2012-12-03 19:47:44 +00:00
default : throw 'bad hour format: ' + fmt ;
2014-06-29 18:35:10 +00:00
} break ;
case 72 : /* 'H' 24-hour */
switch ( fmt . length ) {
case 1 : case 2 : out = val . H ; outl = fmt . length ; break ;
2012-12-03 19:47:44 +00:00
default : throw 'bad hour format: ' + fmt ;
2014-06-29 18:35:10 +00:00
} break ;
case 77 : /* 'M' minutes */
switch ( fmt . length ) {
case 1 : case 2 : out = val . M ; outl = fmt . length ; break ;
2012-12-03 19:47:44 +00:00
default : throw 'bad minute format: ' + fmt ;
2014-06-29 18:35:10 +00:00
} break ;
case 115 : /* 's' seconds */
2017-07-28 23:54:51 +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 ) ;
2017-03-13 07:34:05 +00:00
if ( ss0 >= 2 ) tt = ss0 === 3 ? 1000 : 100 ;
2017-07-28 23:54:51 +00:00
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 ) ;
2014-06-29 18:35:10 +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 ;
2013-12-31 17:20:13 +00:00
default : throw 'bad abstime format: ' + fmt ;
2014-06-29 18:35:10 +00:00
} outl = fmt . length === 3 ? 1 : 2 ; break ;
case 101 : /* 'e' era */
out = y ; outl = 1 ;
2012-12-03 19:47:44 +00:00
}
2014-06-29 18:35:10 +00:00
if ( outl > 0 ) return pad0 ( out , outl ) ; else return "" ;
}
2014-01-22 05:02:45 +00:00
/*jshint +W086 */
2014-06-29 18:35:10 +00:00
function commaify ( s ) {
2017-07-28 23:54:51 +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 ) ;
2014-06-29 18:35:10 +00:00
return o ;
}
var write _num = ( function make _write _num ( ) {
var pct1 = /%/g ;
function write _num _pct ( type , fmt , val ) {
var sfmt = fmt . replace ( pct1 , "" ) , mul = fmt . length - sfmt . length ;
return write _num ( type , sfmt , val * Math . pow ( 10 , 2 * mul ) ) + fill ( "%" , mul ) ;
}
function write _num _cm ( type , fmt , val ) {
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 ) ) ) ;
}
function write _num _exp ( fmt , val ) {
var o ;
var idx = fmt . indexOf ( "E" ) - fmt . indexOf ( "." ) - 1 ;
if ( fmt . match ( /^#+0.0E\+0$/ ) ) {
2017-05-09 18:11:15 +00:00
if ( val == 0 ) return "0.0E+0" ;
else if ( val < 0 ) return "-" + write _num _exp ( fmt , - val ) ;
2014-06-29 18:35:10 +00:00
var period = fmt . indexOf ( "." ) ; if ( period === - 1 ) period = fmt . indexOf ( 'E' ) ;
2017-05-09 18:11:15 +00:00
var ee = Math . floor ( Math . log ( val ) * Math . LOG10E ) % period ;
2014-06-29 18:35:10 +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:11:15 +00:00
var fakee = Math . floor ( Math . log ( val ) * Math . LOG10E ) ;
2017-03-13 07:34:05 +00:00
if ( o . indexOf ( "." ) === - 1 ) o = o . charAt ( 0 ) + "." + o . substr ( 1 ) + "E+" + ( fakee - o . length + ee ) ;
2014-06-29 18:35:10 +00:00
else o += "E+" + ( fakee - ee ) ;
while ( o . substr ( 0 , 2 ) === "0." ) {
2017-03-13 07:34:05 +00:00
o = o . charAt ( 0 ) + o . substr ( 2 , period ) + "." + o . substr ( 2 + period ) ;
2014-06-29 18:35:10 +00:00
o = o . replace ( /^0+([1-9])/ , "$1" ) . replace ( /^0+\./ , "0." ) ;
2014-01-23 06:21:21 +00:00
}
2014-06-29 18:35:10 +00:00
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-13 07:34:05 +00:00
if ( fmt . match ( /E\+00$/ ) && o . match ( /e[+-]\d$/ ) ) o = o . substr ( 0 , o . length - 1 ) + "0" + o . charAt ( o . length - 1 ) ;
2014-06-29 18:35:10 +00:00
if ( fmt . match ( /E\-/ ) && o . match ( /e\+/ ) ) o = o . replace ( /e\+/ , "e" ) ;
return o . replace ( "e" , "E" ) ;
}
var frac1 = /# (\?+)( ?)\/( ?)(\d+)/ ;
function write _num _f1 ( r , aval , sign ) {
2017-03-13 07:34:05 +00:00
var den = parseInt ( r [ 4 ] , 10 ) , rr = Math . round ( aval * den ) , base = Math . floor ( rr / den ) ;
2014-06-29 18:35:10 +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 ) ) ;
}
function write _num _f2 ( r , aval , sign ) {
return sign + ( aval === 0 ? "" : "" + aval ) + fill ( " " , r [ 1 ] . length + 2 + r [ 4 ] . length ) ;
}
2017-06-10 01:56:23 +00:00
var dec1 = /^#*0*\.([0#]+)/ ;
2014-06-29 18:35:10 +00:00
var closeparen = /\).*[0#]/ ;
var phone = /\(###\) ###\\?-####/ ;
function hashq ( str ) {
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 ) ;
2013-12-31 17:20:13 +00:00
}
2014-06-29 18:35:10 +00:00
return o ;
}
function rnd ( val , d ) { var dd = Math . pow ( 10 , d ) ; return "" + ( Math . round ( val * dd ) / dd ) ; }
2017-03-20 21:57:44 +00:00
function dec ( val , d ) {
if ( d < ( '' + Math . round ( ( val - Math . floor ( val ) ) * Math . pow ( 10 , d ) ) ) . length ) {
return 0 ;
}
return Math . round ( ( val - Math . floor ( val ) ) * Math . pow ( 10 , d ) ) ;
}
function carry ( val , d ) {
if ( d < ( '' + Math . round ( ( val - Math . floor ( val ) ) * Math . pow ( 10 , d ) ) ) . length ) {
return 1 ;
}
return 0 ;
}
2014-06-29 18:35:10 +00:00
function flr ( val ) { if ( val < 2147483647 && val > - 2147483648 ) return "" + ( val >= 0 ? ( val | 0 ) : ( val - 1 | 0 ) ) ; return "" + Math . floor ( val ) ; }
function write _num _flt ( type , fmt , val ) {
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 ) + ')' ;
2014-01-23 06:21:21 +00:00
}
2014-06-29 18:35:10 +00:00
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 22:38:26 +00:00
if ( fmt . charCodeAt ( 0 ) === 36 ) return "$" + write _num _flt ( type , fmt . substr ( fmt . charAt ( 1 ) == ' ' ? 2 : 1 ) , val ) ;
2017-03-13 07:34:05 +00:00
var o ;
2014-06-29 18:35:10 +00:00
var r , ri , ff , aval = Math . abs ( val ) , sign = val < 0 ? "-" : "" ;
if ( fmt . match ( /^00+$/ ) ) return sign + pad0r ( aval , fmt . length ) ;
2014-06-05 07:07:10 +00:00
if ( fmt . match ( /^[#?]+$/ ) ) {
2014-06-29 18:35:10 +00:00
o = pad0r ( val , 0 ) ; if ( o === "0" ) o = "" ;
return o . length > fmt . length ? o : hashq ( fmt . substr ( 0 , fmt . length - o . length ) ) + o ;
2014-06-05 07:07:10 +00:00
}
2017-03-13 07:34:05 +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-10 01:56:23 +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 ) ; } ) ;
2014-06-29 18:35:10 +00:00
return fmt . indexOf ( "0." ) !== - 1 ? o : o . replace ( /^0\./ , "." ) ;
2014-01-23 06:21:21 +00:00
}
2014-03-29 02:12:07 +00:00
fmt = fmt . replace ( /^#+([0.])/ , "$1" ) ;
2017-03-13 07:34:05 +00:00
if ( ( r = fmt . match ( /^(0*)\.(#*)$/ ) ) ) {
2014-06-29 18:35:10 +00:00
return sign + rnd ( aval , r [ 2 ] . length ) . replace ( /\.(\d*[1-9])0*$/ , ".$1" ) . replace ( /^(-?\d*)$/ , "$1." ) . replace ( /^0\./ , r [ 1 ] . length ? "0." : "." ) ;
2014-02-17 08:51:25 +00:00
}
2017-05-09 18:11:15 +00:00
if ( ( r = fmt . match ( /^#{1,3},##0(\.?)$/ ) ) ) return sign + commaify ( pad0r ( aval , 0 ) ) ;
2017-03-13 07:34:05 +00:00
if ( ( r = fmt . match ( /^#,##0\.([#0]*0)$/ ) ) ) {
2017-03-20 21:57:44 +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 ) ;
2014-02-17 08:51:25 +00:00
}
2017-03-13 07:34:05 +00:00
if ( ( r = fmt . match ( /^#,#*,#0/ ) ) ) return write _num _flt ( type , fmt . replace ( /^#,#*,/ , "" ) , val ) ;
if ( ( r = fmt . match ( /^([0#]+)(\\?-([0#]+))+$/ ) ) ) {
2014-06-29 18:35:10 +00:00
o = _strrev ( write _num _flt ( type , fmt . replace ( /[\\-]/g , "" ) , val ) ) ;
ri = 0 ;
2017-03-25 22:38:26 +00:00
return _strrev ( _strrev ( fmt . replace ( /\\/g , "" ) ) . replace ( /[0#]/g , function ( x ) { return ri < o . length ? o . charAt ( ri ++ ) : x === '0' ? '0' : "" ; } ) ) ;
2014-03-29 22:53:44 +00:00
}
2017-03-13 07:34:05 +00:00
if ( fmt . match ( phone ) ) {
2014-06-29 18:35:10 +00:00
o = write _num _flt ( type , "##########" , val ) ;
return "(" + o . substr ( 0 , 3 ) + ") " + o . substr ( 3 , 3 ) + "-" + o . substr ( 6 ) ;
2014-03-29 22:53:44 +00:00
}
2014-06-05 07:07:10 +00:00
var oa = "" ;
2017-03-13 07:34:05 +00:00
if ( ( r = fmt . match ( /^([#0?]+)( ?)\/( ?)([#0?]+)/ ) ) ) {
2014-06-29 18:35:10 +00:00
ri = Math . min ( r [ 4 ] . length , 7 ) ;
ff = frac ( aval , Math . pow ( 10 , ri ) - 1 , false ) ;
o = "" + sign ;
2014-06-05 07:07:10 +00:00
oa = write _num ( "n" , r [ 1 ] , ff [ 1 ] ) ;
2017-03-25 22:38:26 +00:00
if ( oa . charAt ( oa . length - 1 ) == " " ) oa = oa . substr ( 0 , oa . length - 1 ) + "0" ;
2014-06-29 18:35:10 +00:00
o += oa + r [ 2 ] + "/" + r [ 3 ] ;
oa = rpad _ ( ff [ 2 ] , ri ) ;
if ( oa . length < r [ 4 ] . length ) oa = hashq ( r [ 4 ] . substr ( r [ 4 ] . length - oa . length ) ) + oa ;
2014-06-05 07:07:10 +00:00
o += oa ;
2014-06-29 18:35:10 +00:00
return o ;
}
2017-03-13 07:34:05 +00:00
if ( ( r = fmt . match ( /^# ([#0?]+)( ?)\/( ?)([#0?]+)/ ) ) ) {
2014-06-29 18:35:10 +00:00
ri = Math . min ( Math . max ( r [ 1 ] . length , r [ 4 ] . length ) , 7 ) ;
ff = frac ( aval , Math . pow ( 10 , ri ) - 1 , true ) ;
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-13 07:34:05 +00:00
if ( ( r = fmt . match ( /^[#0?]+$/ ) ) ) {
2014-06-29 18:35:10 +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-13 07:34:05 +00:00
if ( ( r = fmt . match ( /^([#0?]+)\.([#0]+)$/ ) ) ) {
2014-06-29 18:35:10 +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-13 07:34:05 +00:00
if ( ( r = fmt . match ( /^00,000\.([#0]*0)$/ ) ) ) {
2014-06-29 18:35:10 +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:11:15 +00:00
case "###,##0.00" : return write _num _flt ( type , "#,##0.00" , val ) ;
case "###,###" :
case "##,###" :
2014-06-29 18:35:10 +00:00
case "#,###" : var x = commaify ( pad0r ( aval , 0 ) ) ; return x !== "0" ? sign + x : "" ;
2017-05-09 18:11:15 +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\./ , "." ) ;
2014-06-29 18:35:10 +00:00
default :
}
throw new Error ( "unsupported format |" + fmt + "|" ) ;
}
function write _num _cm2 ( type , fmt , val ) {
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 ) ) ) ;
}
function write _num _pct2 ( type , fmt , val ) {
var sfmt = fmt . replace ( pct1 , "" ) , mul = fmt . length - sfmt . length ;
return write _num ( type , sfmt , val * Math . pow ( 10 , 2 * mul ) ) + fill ( "%" , mul ) ;
}
function write _num _exp2 ( fmt , val ) {
var o ;
var idx = fmt . indexOf ( "E" ) - fmt . indexOf ( "." ) - 1 ;
if ( fmt . match ( /^#+0.0E\+0$/ ) ) {
2017-05-09 18:11:15 +00:00
if ( val == 0 ) return "0.0E+0" ;
else if ( val < 0 ) return "-" + write _num _exp2 ( fmt , - val ) ;
2014-06-29 18:35:10 +00:00
var period = fmt . indexOf ( "." ) ; if ( period === - 1 ) period = fmt . indexOf ( 'E' ) ;
2017-05-09 18:11:15 +00:00
var ee = Math . floor ( Math . log ( val ) * Math . LOG10E ) % period ;
2014-06-29 18:35:10 +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:11:15 +00:00
var fakee = Math . floor ( Math . log ( val ) * Math . LOG10E ) ;
2017-03-13 07:34:05 +00:00
if ( o . indexOf ( "." ) === - 1 ) o = o . charAt ( 0 ) + "." + o . substr ( 1 ) + "E+" + ( fakee - o . length + ee ) ;
2014-06-29 18:35:10 +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-13 07:34:05 +00:00
if ( fmt . match ( /E\+00$/ ) && o . match ( /e[+-]\d$/ ) ) o = o . substr ( 0 , o . length - 1 ) + "0" + o . charAt ( o . length - 1 ) ;
2014-06-29 18:35:10 +00:00
if ( fmt . match ( /E\-/ ) && o . match ( /e\+/ ) ) o = o . replace ( /e\+/ , "e" ) ;
return o . replace ( "e" , "E" ) ;
}
function write _num _int ( type , fmt , val ) {
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 22:38:26 +00:00
if ( fmt . charCodeAt ( 0 ) === 36 ) return "$" + write _num _int ( type , fmt . substr ( fmt . charAt ( 1 ) == ' ' ? 2 : 1 ) , val ) ;
2014-06-29 18:35:10 +00:00
var o ;
var r , ri , ff , aval = Math . abs ( val ) , sign = val < 0 ? "-" : "" ;
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-13 07:34:05 +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-06-10 01:56:23 +00:00
o = ( "" + val ) . replace ( /^([^\.]+)$/ , "$1." + hashq ( r [ 1 ] ) ) . replace ( /\.$/ , "." + hashq ( r [ 1 ] ) ) ;
2017-03-23 01:56:21 +00:00
o = o . replace ( /\.(\d*)$/ , function ( $$ , $1 ) {
2017-06-10 01:56:23 +00:00
return "." + $1 + fill ( "0" , hashq ( r [ 1 ] ) . length - $1 . length ) ; } ) ;
2014-06-29 18:35:10 +00:00
return fmt . indexOf ( "0." ) !== - 1 ? o : o . replace ( /^0\./ , "." ) ;
}
fmt = fmt . replace ( /^#+([0.])/ , "$1" ) ;
2017-03-13 07:34:05 +00:00
if ( ( r = fmt . match ( /^(0*)\.(#*)$/ ) ) ) {
2014-06-29 18:35:10 +00:00
return sign + ( "" + aval ) . replace ( /\.(\d*[1-9])0*$/ , ".$1" ) . replace ( /^(-?\d*)$/ , "$1." ) . replace ( /^0\./ , r [ 1 ] . length ? "0." : "." ) ;
}
2017-05-09 18:11:15 +00:00
if ( ( r = fmt . match ( /^#{1,3},##0(\.?)$/ ) ) ) return sign + commaify ( ( "" + aval ) ) ;
2017-03-13 07:34:05 +00:00
if ( ( r = fmt . match ( /^#,##0\.([#0]*0)$/ ) ) ) {
2014-06-29 18:35:10 +00:00
return val < 0 ? "-" + write _num _int ( type , fmt , - val ) : commaify ( ( "" + val ) ) + "." + fill ( '0' , r [ 1 ] . length ) ;
}
2017-03-13 07:34:05 +00:00
if ( ( r = fmt . match ( /^#,#*,#0/ ) ) ) return write _num _int ( type , fmt . replace ( /^#,#*,/ , "" ) , val ) ;
if ( ( r = fmt . match ( /^([0#]+)(\\?-([0#]+))+$/ ) ) ) {
2014-06-29 18:35:10 +00:00
o = _strrev ( write _num _int ( type , fmt . replace ( /[\\-]/g , "" ) , val ) ) ;
ri = 0 ;
2017-03-25 22:38:26 +00:00
return _strrev ( _strrev ( fmt . replace ( /\\/g , "" ) ) . replace ( /[0#]/g , function ( x ) { return ri < o . length ? o . charAt ( ri ++ ) : x === '0' ? '0' : "" ; } ) ) ;
2014-06-29 18:35:10 +00:00
}
2017-03-13 07:34:05 +00:00
if ( fmt . match ( phone ) ) {
2014-06-29 18:35:10 +00:00
o = write _num _int ( type , "##########" , val ) ;
return "(" + o . substr ( 0 , 3 ) + ") " + o . substr ( 3 , 3 ) + "-" + o . substr ( 6 ) ;
}
var oa = "" ;
2017-03-13 07:34:05 +00:00
if ( ( r = fmt . match ( /^([#0?]+)( ?)\/( ?)([#0?]+)/ ) ) ) {
2014-06-29 18:35:10 +00:00
ri = Math . min ( r [ 4 ] . length , 7 ) ;
ff = frac ( aval , Math . pow ( 10 , ri ) - 1 , false ) ;
o = "" + sign ;
oa = write _num ( "n" , r [ 1 ] , ff [ 1 ] ) ;
2017-03-25 22:38:26 +00:00
if ( oa . charAt ( oa . length - 1 ) == " " ) oa = oa . substr ( 0 , oa . length - 1 ) + "0" ;
2014-06-29 18:35:10 +00:00
o += oa + r [ 2 ] + "/" + r [ 3 ] ;
oa = rpad _ ( ff [ 2 ] , ri ) ;
if ( oa . length < r [ 4 ] . length ) oa = hashq ( r [ 4 ] . substr ( r [ 4 ] . length - oa . length ) ) + oa ;
2014-06-05 07:07:10 +00:00
o += oa ;
return o ;
2014-03-29 02:12:07 +00:00
}
2017-03-13 07:34:05 +00:00
if ( ( r = fmt . match ( /^# ([#0?]+)( ?)\/( ?)([#0?]+)/ ) ) ) {
2014-06-29 18:35:10 +00:00
ri = Math . min ( Math . max ( r [ 1 ] . length , r [ 4 ] . length ) , 7 ) ;
ff = frac ( aval , Math . pow ( 10 , ri ) - 1 , true ) ;
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 ) ) ;
2013-12-31 17:20:13 +00:00
}
2017-03-13 07:34:05 +00:00
if ( ( r = fmt . match ( /^[#0?]+$/ ) ) ) {
2014-06-29 18:35:10 +00:00
o = "" + val ;
2014-05-22 12:09:29 +00:00
if ( fmt . length <= o . length ) return o ;
2014-06-29 18:35:10 +00:00
return hashq ( fmt . substr ( 0 , fmt . length - o . length ) ) + o ;
2014-05-22 12:09:29 +00:00
}
2017-03-13 07:34:05 +00:00
if ( ( r = fmt . match ( /^([#0]+)\.([#0]+)$/ ) ) ) {
2014-05-22 12:09:29 +00:00
o = "" + val . toFixed ( Math . min ( r [ 2 ] . length , 10 ) ) . replace ( /([^0])0+$/ , "$1" ) ;
2014-06-29 18:35:10 +00:00
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 ) ) ;
2014-05-22 12:09:29 +00:00
}
2017-03-13 07:34:05 +00:00
if ( ( r = fmt . match ( /^00,000\.([#0]*0)$/ ) ) ) {
2014-06-29 18:35:10 +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 ) ;
2014-03-29 02:12:07 +00:00
}
2013-12-31 17:20:13 +00:00
switch ( fmt ) {
2017-05-09 18:11:15 +00:00
case "###,###" :
case "##,###" :
2014-06-29 18:35:10 +00:00
case "#,###" : var x = commaify ( "" + aval ) ; return x !== "0" ? sign + x : "" ;
2013-12-31 17:20:13 +00:00
default :
2017-05-11 18:57:52 +00:00
if ( fmt . match ( /\.[0#?]*$/ ) ) return write _num _int ( type , fmt . slice ( 0 , fmt . lastIndexOf ( "." ) ) , val ) + hashq ( fmt . slice ( fmt . lastIndexOf ( "." ) ) ) ;
2013-12-31 17:20:13 +00:00
}
throw new Error ( "unsupported format |" + fmt + "|" ) ;
2014-06-29 18:35:10 +00:00
}
return function write _num ( type , fmt , val ) {
return ( val | 0 ) === val ? write _num _int ( type , fmt , val ) : write _num _flt ( type , fmt , val ) ;
} ; } ) ( ) ;
2012-12-03 19:47:44 +00:00
function split _fmt ( fmt ) {
2013-12-31 17:20:13 +00:00
var out = [ ] ;
2017-05-11 18:57:52 +00:00
var in _str = false /*, cc*/ ;
for ( var i = 0 , j = 0 ; i < fmt . length ; ++ i ) switch ( ( /*cc=*/ fmt . charCodeAt ( i ) ) ) {
2014-06-29 18:35:10 +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 ;
2013-12-31 17:20:13 +00:00
}
2014-06-29 18:35:10 +00:00
out [ out . length ] = fmt . substr ( j ) ;
if ( in _str === true ) throw new Error ( "Format |" + fmt + "| unterminated string " ) ;
2013-12-31 17:20:13 +00:00
return out ;
2012-12-03 19:47:44 +00:00
}
SSF . _split = split _fmt ;
2014-06-29 18:35:10 +00:00
var abstime = /\[[HhMmSs]*\]/ ;
2017-03-23 01:56:21 +00:00
function fmt _is _date ( fmt ) {
2017-05-11 18:57:52 +00:00
var i = 0 , /*cc = 0,*/ c = "" , o = "" ;
2017-03-23 01:56:21 +00:00
while ( i < fmt . length ) {
switch ( ( c = fmt . charAt ( i ) ) ) {
case 'G' : if ( isgeneral ( fmt , i ) ) i += 6 ; i ++ ; break ;
2017-05-11 18:57:52 +00:00
case '"' : for ( ; ( /*cc=*/ fmt . charCodeAt ( ++ i ) ) !== 34 && i < fmt . length ; ) ++ i ; ++ i ; break ;
2017-03-23 01:56:21 +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 ;
2017-06-10 01:56:23 +00:00
case 'A' : case 'a' :
if ( fmt . substr ( i , 3 ) . toUpperCase ( ) === "A/P" ) return true ;
if ( fmt . substr ( i , 5 ) . toUpperCase ( ) === "AM/PM" ) return true ;
2017-03-23 01:56:21 +00:00
++ i ; break ;
case '[' :
o = c ;
while ( fmt . charAt ( i ++ ) !== ']' && i < fmt . length ) o += fmt . charAt ( i ) ;
if ( o . match ( abstime ) ) return true ;
break ;
case '.' :
/* falls through */
case '0' : case '#' :
2017-05-11 18:57:52 +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-23 01:56:21 +00:00
break ;
2017-05-11 18:57:52 +00:00
case '?' : while ( fmt . charAt ( ++ i ) === c ) { /* empty */ } break ;
2017-03-23 01:56:21 +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 18:57:52 +00:00
while ( i < fmt . length && "0123456789" . indexOf ( fmt . charAt ( ++ i ) ) > - 1 ) { /* empty */ } break ;
2017-03-23 01:56:21 +00:00
case ' ' : ++ i ; break ;
default : ++ i ; break ;
}
}
return false ;
}
SSF . is _date = fmt _is _date ;
2013-12-31 17:20:13 +00:00
function eval _fmt ( fmt , v , opts , flen ) {
2017-07-28 23:54:51 +00:00
var out = [ ] , o = "" , i = 0 , c = "" , lst = 't' , dt , j , cc ;
2012-12-03 19:47:44 +00:00
var hr = 'H' ;
/* Tokenize */
while ( i < fmt . length ) {
2017-03-13 07:34:05 +00:00
switch ( ( c = fmt . charAt ( i ) ) ) {
2014-01-23 06:21:21 +00:00
case 'G' : /* General */
2014-06-29 18:35:10 +00:00
if ( ! isgeneral ( fmt , i ) ) throw new Error ( 'unrecognized character ' + c + ' in ' + fmt ) ;
out [ out . length ] = { t : 'G' , v : 'General' } ; i += 7 ; break ;
2012-12-03 19:47:44 +00:00
case '"' : /* Literal text */
2014-06-29 18:35:10 +00:00
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-23 01:56:21 +00:00
case '\\' : var w = fmt . charAt ( ++ i ) , t = ( w === "(" || w === ")" ) ? w : 't' ;
2014-06-29 18:35:10 +00:00
out [ out . length ] = { t : t , v : w } ; ++ i ; break ;
case '_' : out [ out . length ] = { t : 't' , v : " " } ; i += 2 ; break ;
2012-12-03 19:47:44 +00:00
case '@' : /* Text Placeholder */
2014-06-29 18:35:10 +00:00
out [ out . length ] = { t : 'T' , v : v } ; ++ i ; break ;
2014-04-03 23:24:56 +00:00
case 'B' : case 'b' :
2017-03-23 01:56:21 +00:00
if ( fmt . charAt ( i + 1 ) === "1" || fmt . charAt ( i + 1 ) === "2" ) {
if ( dt == null ) { dt = parse _date _code ( v , opts , fmt . charAt ( i + 1 ) === "2" ) ; if ( dt == null ) return "" ; }
2014-06-29 18:35:10 +00:00
out [ out . length ] = { t : 'X' , v : fmt . substr ( i , 2 ) } ; lst = c ; i += 2 ; break ;
2014-04-03 23:24:56 +00:00
}
/* falls through */
2014-01-23 06:21:21 +00:00
case 'M' : case 'D' : case 'Y' : case 'H' : case 'S' : case 'E' :
c = c . toLowerCase ( ) ;
/* falls through */
2014-03-29 02:12:07 +00:00
case 'm' : case 'd' : case 'y' : case 'h' : case 's' : case 'e' : case 'g' :
2013-12-31 17:20:13 +00:00
if ( v < 0 ) return "" ;
2014-06-29 18:35:10 +00:00
if ( dt == null ) { dt = parse _date _code ( v , opts ) ; if ( dt == null ) return "" ; }
2017-07-28 23:54:51 +00:00
o = c ; while ( ++ i < fmt . length && fmt . charAt ( i ) . toLowerCase ( ) === c ) o += c ;
2017-05-09 18:11:15 +00:00
if ( c === 'm' && lst . toLowerCase ( ) === 'h' ) c = 'M' ;
2012-12-03 19:47:44 +00:00
if ( c === 'h' ) c = hr ;
2014-06-29 18:35:10 +00:00
out [ out . length ] = { t : c , v : o } ; lst = c ; break ;
2017-06-10 01:56:23 +00:00
case 'A' : case 'a' :
2017-07-28 23:54:51 +00:00
var q = { t : c , v : c } ;
2014-06-29 18:35:10 +00:00
if ( dt == null ) dt = parse _date _code ( v , opts ) ;
2017-06-10 01:56:23 +00:00
if ( fmt . substr ( i , 3 ) . toUpperCase ( ) === "A/P" ) { if ( dt != null ) q . v = dt . H >= 12 ? "P" : "A" ; q . t = 'T' ; hr = 'h' ; i += 3 ; }
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' ; }
2014-06-29 18:35:10 +00:00
else { q . t = "t" ; ++ i ; }
if ( dt == null && q . t === 'T' ) return "" ;
out [ out . length ] = q ; lst = c ; break ;
2014-04-03 23:24:56 +00:00
case '[' :
2013-12-31 17:20:13 +00:00
o = c ;
2017-03-23 01:56:21 +00:00
while ( fmt . charAt ( i ++ ) !== ']' && i < fmt . length ) o += fmt . charAt ( i ) ;
if ( o . slice ( - 1 ) !== ']' ) throw 'unterminated "[" block: |' + o + '|' ;
2014-06-29 18:35:10 +00:00
if ( o . match ( abstime ) ) {
if ( dt == null ) { dt = parse _date _code ( v , opts ) ; if ( dt == null ) return "" ; }
out [ out . length ] = { t : 'Z' , v : o . toLowerCase ( ) } ;
2017-05-09 18:11:15 +00:00
lst = o . charAt ( 1 ) ;
2017-04-30 16:28:24 +00:00
} else if ( o . indexOf ( "$" ) > - 1 ) {
o = ( o . match ( /\$([^-\[\]]*)/ ) || [ ] ) [ 1 ] || "$" ;
if ( ! fmt _is _date ( fmt ) ) out [ out . length ] = { t : 't' , v : o } ;
}
2013-12-31 17:20:13 +00:00
break ;
/* Numbers */
2014-05-22 12:09:29 +00:00
case '.' :
2014-06-29 18:35:10 +00:00
if ( dt != null ) {
2017-07-28 23:54:51 +00:00
o = c ; while ( ++ i < fmt . length && ( c = fmt . charAt ( i ) ) === "0" ) o += c ;
2014-06-29 18:35:10 +00:00
out [ out . length ] = { t : 's' , v : o } ; break ;
2014-05-22 12:09:29 +00:00
}
/* falls through */
case '0' : case '#' :
2017-05-11 18:57:52 +00:00
o = c ; while ( ( ++ i < fmt . length && "0#?.,E+-%" . indexOf ( c = fmt . charAt ( i ) ) > - 1 ) || ( c == '\\' && fmt . charAt ( i + 1 ) == "-" && i < fmt . length - 2 && "0#" . indexOf ( fmt . charAt ( i + 2 ) ) > - 1 ) ) o += c ;
2014-06-29 18:35:10 +00:00
out [ out . length ] = { t : 'n' , v : o } ; break ;
2013-12-31 17:20:13 +00:00
case '?' :
2017-03-23 01:56:21 +00:00
o = c ; while ( fmt . charAt ( ++ i ) === c ) o += c ;
2017-07-28 23:54:51 +00:00
out [ out . length ] = { t : c , v : o } ; lst = c ; break ;
2017-03-23 01:56:21 +00:00
case '*' : ++ i ; if ( fmt . charAt ( i ) == ' ' || fmt . charAt ( i ) == '*' ) ++ i ; break ; // **
2014-06-29 18:35:10 +00:00
case '(' : case ')' : out [ out . length ] = { t : ( flen === 1 ? 't' : c ) , v : c } ; ++ i ; break ;
2013-12-31 17:20:13 +00:00
case '1' : case '2' : case '3' : case '4' : case '5' : case '6' : case '7' : case '8' : case '9' :
2017-03-23 01:56:21 +00:00
o = c ; while ( i < fmt . length && "0123456789" . indexOf ( fmt . charAt ( ++ i ) ) > - 1 ) o += fmt . charAt ( i ) ;
2014-06-29 18:35:10 +00:00
out [ out . length ] = { t : 'D' , v : o } ; break ;
case ' ' : out [ out . length ] = { t : c , v : c } ; ++ i ; break ;
2012-12-03 19:47:44 +00:00
default :
2017-06-10 01:56:23 +00:00
if ( ",$-+/():!^&'~{}<>=€acfijklopqrtuvwxzP" . indexOf ( c ) === - 1 ) throw new Error ( 'unrecognized character ' + c + ' in ' + fmt ) ;
2014-06-29 18:35:10 +00:00
out [ out . length ] = { t : 't' , v : c } ; ++ i ; break ;
2012-12-03 19:47:44 +00:00
}
}
2014-05-22 12:09:29 +00:00
var bt = 0 , ss0 = 0 , ssm ;
2012-12-03 19:47:44 +00:00
for ( i = out . length - 1 , lst = 't' ; i >= 0 ; -- i ) {
switch ( out [ i ] . t ) {
2014-03-29 02:12:07 +00:00
case 'h' : case 'H' : out [ i ] . t = hr ; lst = 'h' ; if ( bt < 1 ) bt = 1 ; break ;
2014-05-22 12:09:29 +00:00
case 's' :
if ( ( ssm = out [ i ] . v . match ( /\.0+$/ ) ) ) ss0 = Math . max ( ss0 , ssm [ 0 ] . length - 1 ) ;
if ( bt < 3 ) bt = 3 ;
2014-03-29 02:12:07 +00:00
/* 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:28:24 +00:00
case 'X' : /*if(out[i].v === "B2");*/
2014-04-03 23:24:56 +00:00
break ;
2014-03-29 02:12:07 +00:00
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 ;
2012-12-03 19:47:44 +00:00
}
}
2014-03-29 02:12:07 +00:00
switch ( bt ) {
case 0 : break ;
case 1 :
2017-03-13 07:34:05 +00:00
if ( dt . u >= 0.5 ) { dt . u = 0 ; ++ dt . S ; }
2014-06-29 18:35:10 +00:00
if ( dt . S >= 60 ) { dt . S = 0 ; ++ dt . M ; }
if ( dt . M >= 60 ) { dt . M = 0 ; ++ dt . H ; }
2014-03-29 02:12:07 +00:00
break ;
case 2 :
2017-03-13 07:34:05 +00:00
if ( dt . u >= 0.5 ) { dt . u = 0 ; ++ dt . S ; }
2014-06-29 18:35:10 +00:00
if ( dt . S >= 60 ) { dt . S = 0 ; ++ dt . M ; }
2014-03-29 02:12:07 +00:00
break ;
}
2012-12-03 19:47:44 +00:00
/* replace fields */
2014-05-22 12:09:29 +00:00
var nstr = "" , jj ;
2012-12-03 19:47:44 +00:00
for ( i = 0 ; i < out . length ; ++ i ) {
switch ( out [ i ] . t ) {
2014-02-12 06:19:45 +00:00
case 't' : case 'T' : case ' ' : case 'D' : break ;
2017-03-13 07:34:05 +00:00
case 'X' : out [ i ] . v = "" ; out [ i ] . t = ";" ; break ;
2014-04-03 23:24:56 +00:00
case 'd' : case 'm' : case 'y' : case 'h' : case 'H' : case 'M' : case 's' : case 'e' : case 'b' : case 'Z' :
2017-03-13 07:34:05 +00:00
out [ i ] . v = write _date ( out [ i ] . t . charCodeAt ( 0 ) , out [ i ] . v , dt , ss0 ) ;
2012-12-03 19:47:44 +00:00
out [ i ] . t = 't' ; break ;
2014-01-23 06:21:21 +00:00
case 'n' : case '(' : case '?' :
2014-05-22 12:09:29 +00:00
jj = i + 1 ;
2014-06-29 18:35:10 +00:00
while ( out [ jj ] != null && (
( c = out [ jj ] . t ) === "?" || c === "D" ||
2017-05-11 18:57:52 +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 == '?' ) )
2014-06-29 18:35:10 +00:00
) ) {
2014-01-23 06:21:21 +00:00
out [ i ] . v += out [ jj ] . v ;
2017-03-13 07:34:05 +00:00
out [ jj ] = { v : "" , t : ";" } ; ++ jj ;
2013-12-31 17:20:13 +00:00
}
2014-05-22 12:09:29 +00:00
nstr += out [ i ] . v ;
2014-01-23 06:21:21 +00:00
i = jj - 1 ; break ;
case 'G' : out [ i ] . t = 't' ; out [ i ] . v = general _fmt ( v , opts ) ; break ;
2012-12-03 19:47:44 +00:00
}
}
2014-06-29 18:35:10 +00:00
var vv = "" , myv , ostr ;
if ( nstr . length > 0 ) {
2017-04-30 16:28:24 +00:00
if ( nstr . charCodeAt ( 0 ) == 40 ) /* '(' */ {
myv = ( v < 0 && nstr . charCodeAt ( 0 ) === 45 ? - v : v ) ;
ostr = write _num ( '(' , nstr , myv ) ;
} 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 ;
}
}
2014-05-22 12:09:29 +00:00
jj = ostr . length - 1 ;
var decpt = out . length ;
2017-04-30 16:28:24 +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 ; }
2014-06-29 18:35:10 +00:00
var lasti = out . length ;
if ( decpt === out . length && ostr . indexOf ( "E" ) === - 1 ) {
2014-05-22 12:09:29 +00:00
for ( i = out . length - 1 ; i >= 0 ; -- i ) {
2014-06-29 18:35:10 +00:00
if ( out [ i ] == null || 'n?(' . indexOf ( out [ i ] . t ) === - 1 ) continue ;
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 ; }
2014-05-22 12:09:29 +00:00
out [ i ] . t = 't' ;
lasti = i ;
}
if ( jj >= 0 && lasti < out . length ) out [ lasti ] . v = ostr . substr ( 0 , jj + 1 ) + out [ lasti ] . v ;
}
2014-06-29 18:35:10 +00:00
else if ( decpt !== out . length && ostr . indexOf ( "E" ) === - 1 ) {
2014-05-22 12:09:29 +00:00
jj = ostr . indexOf ( "." ) - 1 ;
for ( i = decpt ; i >= 0 ; -- i ) {
2014-06-29 18:35:10 +00:00
if ( out [ i ] == null || 'n?(' . indexOf ( out [ i ] . t ) === - 1 ) continue ;
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 22:38:26 +00:00
if ( jj >= 0 && ( out [ i ] . v . charAt ( j ) === "0" || out [ i ] . v . charAt ( j ) === "#" ) ) vv = ostr . charAt ( jj -- ) + vv ;
2014-05-22 12:09:29 +00:00
}
2014-06-29 18:35:10 +00:00
out [ i ] . v = vv ;
2014-05-22 12:09:29 +00:00
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 18:57:52 +00:00
if ( out [ i ] == null || ( 'n?(' . indexOf ( out [ i ] . t ) === - 1 && i !== decpt ) ) continue ;
2014-06-29 18:35:10 +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 22:38:26 +00:00
if ( jj < ostr . length ) vv += ostr . charAt ( jj ++ ) ;
2014-05-22 12:09:29 +00:00
}
2014-06-29 18:35:10 +00:00
out [ i ] . v = vv ;
2014-05-22 12:09:29 +00:00
out [ i ] . t = 't' ;
lasti = i ;
}
}
}
2014-06-29 18:35:10 +00:00
for ( i = 0 ; i < out . length ; ++ i ) if ( out [ i ] != null && 'n(?' . indexOf ( out [ i ] . t ) > - 1 ) {
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 ) ;
2014-05-22 12:09:29 +00:00
out [ i ] . t = 't' ;
}
2014-06-05 07:07:10 +00:00
var retval = "" ;
2014-06-29 18:35:10 +00:00
for ( i = 0 ; i !== out . length ; ++ i ) if ( out [ i ] != null ) retval += out [ i ] . v ;
2014-06-05 07:07:10 +00:00
return retval ;
2012-12-03 19:47:44 +00:00
}
SSF . _eval = eval _fmt ;
2014-06-29 18:35:10 +00:00
var cfregex = /\[[=<>]/ ;
2018-02-21 06:20:15 +00:00
var cfregex2 = /\[(=|>[=]?|<[>=]?)(-?\d+(?:\.\d*)?)\]/ ;
2014-06-29 18:35:10 +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 ;
}
function choose _fmt ( f , v ) {
var fmt = split _fmt ( f ) ;
var l = fmt . length , lat = fmt [ l - 1 ] . indexOf ( "@" ) ;
if ( l < 4 && lat > - 1 ) -- l ;
2017-03-13 07:34:05 +00:00
if ( fmt . length > 4 ) throw new Error ( "cannot find right format for |" + fmt . join ( "|" ) + "|" ) ;
2014-06-29 18:35:10 +00:00
if ( typeof v !== "number" ) return [ 4 , fmt . length === 4 || lat > - 1 ? fmt [ fmt . length - 1 ] : "@" ] ;
2013-12-31 17:20:13 +00:00
switch ( fmt . length ) {
2014-06-29 18:35:10 +00:00
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 ;
2013-12-31 17:20:13 +00:00
case 4 : break ;
}
2014-03-29 22:53:44 +00:00
var ff = v > 0 ? fmt [ 0 ] : v < 0 ? fmt [ 1 ] : fmt [ 2 ] ;
2014-06-29 18:35:10 +00:00
if ( fmt [ 0 ] . indexOf ( "[" ) === - 1 && fmt [ 1 ] . indexOf ( "[" ) === - 1 ) return [ l , ff ] ;
if ( fmt [ 0 ] . match ( cfregex ) != null || fmt [ 1 ] . match ( cfregex ) != null ) {
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 ] ] ;
2014-03-29 22:53:44 +00:00
}
return [ l , ff ] ;
2012-12-03 19:47:44 +00:00
}
2014-06-29 18:35:10 +00:00
function format ( fmt , v , o ) {
2017-04-30 16:28:24 +00:00
if ( o == null ) o = { } ;
2014-06-29 18:35:10 +00:00
var sfmt = "" ;
switch ( typeof fmt ) {
2017-04-30 16:28:24 +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 ) : table _fmt ) [ fmt ] ;
break ;
2014-06-29 18:35:10 +00:00
}
if ( isgeneral ( sfmt , 0 ) ) return general _fmt ( v , o ) ;
2017-07-28 23:54:51 +00:00
if ( v instanceof Date ) v = datenum _local ( v , o . date1904 ) ;
2014-06-29 18:35:10 +00:00
var f = choose _fmt ( sfmt , v ) ;
if ( isgeneral ( f [ 1 ] ) ) return general _fmt ( v , o ) ;
if ( v === true ) v = "TRUE" ; else if ( v === false ) v = "FALSE" ;
else if ( v === "" || v == null ) return "" ;
2013-12-31 17:20:13 +00:00
return eval _fmt ( f [ 1 ] , v , o , f [ 0 ] ) ;
2014-06-29 18:35:10 +00:00
}
2017-07-28 23:54:51 +00:00
function load _entry ( fmt , idx ) {
if ( typeof idx != 'number' ) {
idx = + idx || - 1 ;
for ( var i = 0 ; i < 0x0188 ; ++ i ) {
if ( table _fmt [ i ] == undefined ) { if ( idx < 0 ) idx = i ; continue ; }
if ( table _fmt [ i ] == fmt ) { idx = i ; break ; }
}
if ( idx < 0 ) idx = 0x187 ;
}
table _fmt [ idx ] = fmt ;
return idx ;
}
SSF . load = load _entry ;
2012-12-03 19:47:44 +00:00
SSF . _table = table _fmt ;
2014-06-29 18:35:10 +00:00
SSF . get _table = function get _table ( ) { return table _fmt ; } ;
2017-07-28 23:54:51 +00:00
SSF . load _table = function load _table ( tbl ) {
for ( var i = 0 ; i != 0x0188 ; ++ i )
if ( tbl [ i ] !== undefined ) load _entry ( tbl [ i ] , i ) ;
} ;
2017-04-30 16:28:24 +00:00
SSF . init _table = init _table ;
2017-07-28 23:54:51 +00:00
SSF . format = format ;
2013-12-31 17:20:13 +00:00
} ;
make _ssf ( SSF ) ;
2015-04-02 22:14:07 +00:00
/* map from xlml named formats to SSF TODO: localize */
2017-02-11 01:58:22 +00:00
var XLMLFormatMap /*{[string]:string}*/ = ( {
2015-04-02 22:14:07 +00:00
"General Number" : "General" ,
"General Date" : SSF . _table [ 22 ] ,
"Long Date" : "dddd, mmmm dd, yyyy" ,
"Medium Date" : SSF . _table [ 15 ] ,
"Short Date" : SSF . _table [ 14 ] ,
"Long Time" : SSF . _table [ 19 ] ,
"Medium Time" : SSF . _table [ 18 ] ,
"Short Time" : SSF . _table [ 20 ] ,
"Currency" : '"$"#,##0.00_);[Red]\\("$"#,##0.00\\)' ,
"Fixed" : SSF . _table [ 2 ] ,
"Standard" : SSF . _table [ 4 ] ,
"Percent" : SSF . _table [ 10 ] ,
"Scientific" : SSF . _table [ 11 ] ,
"Yes/No" : '"Yes";"Yes";"No";@' ,
"True/False" : '"True";"True";"False";@' ,
"On/Off" : '"Yes";"Yes";"No";@'
2017-02-11 01:58:22 +00:00
} ) ;
2015-04-02 22:14:07 +00:00
2018-02-14 05:26:28 +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'
} ) ;
2017-06-03 07:23:15 +00:00
/* dateNF parse TODO: move to SSF */
var dateNFregex = /[dD]+|[mM]+|[yYeE]+|[Hh]+|[Ss]+/g ;
function dateNF _regex ( dateNF ) {
var fmt = typeof dateNF == "number" ? SSF . _table [ dateNF ] : dateNF ;
fmt = fmt . replace ( dateNFregex , "(\\d+)" ) ;
return new RegExp ( "^" + fmt + "$" ) ;
}
function dateNF _fix ( str , dateNF , match ) {
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 ;
}
2015-04-02 22:14:07 +00:00
var DO _NOT _EXPORT _CFB = true ;
2017-02-24 11:14:53 +00:00
/* cfb.js (C) 2013-present SheetJS -- http://sheetjs.com */
2015-04-02 22:14:07 +00:00
/* vim: set ts=2: */
/*jshint eqnull:true */
2017-09-22 22:40:09 +00:00
/*exported CFB */
/*global module, require:false, process:false, Buffer:false, Uint8Array:false */
2015-04-02 22:14:07 +00:00
2018-03-06 01:09:57 +00:00
/* [MS-CFB] v20171201 */
2015-04-02 22:14:07 +00:00
var CFB = ( function _CFB ( ) {
var exports = { } ;
2018-07-09 07:07:59 +00:00
exports . version = '1.0.8' ;
2017-09-22 22:40:09 +00:00
/* [MS-CFB] 2.6.4 */
function namecmp ( l , r ) {
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 ) {
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 ) {
if ( p . charAt ( p . length - 1 ) == "/" ) return filename ( p . slice ( 0 , - 1 ) ) ;
var c = p . lastIndexOf ( "/" ) ;
return ( c === - 1 ) ? p : p . slice ( c + 1 ) ;
}
2017-10-27 19:55:07 +00:00
var fs ;
function get _fs ( ) { return fs || ( fs = require ( 'fs' ) ) ; }
2017-07-28 23:54:51 +00:00
function parse ( file , options ) {
2018-03-06 01:09:57 +00:00
if ( file . length < 512 ) throw new Error ( "CFB file size " + file . length + " < 512" ) ;
2017-09-22 22:40:09 +00:00
var mver = 3 ;
var ssz = 512 ;
2015-04-02 22:14:07 +00:00
var nmfs = 0 ; // number of mini FAT sectors
2017-09-22 22:40:09 +00:00
var difat _sec _cnt = 0 ;
var dir _start = 0 ;
var minifat _start = 0 ;
var difat _start = 0 ;
2015-04-02 22:14:07 +00:00
var fat _addrs = [ ] ; // locations of FAT sectors
/* [MS-CFB] 2.2 Compound File Header */
var blob = file . slice ( 0 , 512 ) ;
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 ;
2017-03-31 21:50:32 +00:00
default : throw new Error ( "Major Version: Expected 3 or 4 saw " + mver ) ;
2015-04-02 22:14:07 +00:00
}
/* reprocess header */
if ( ssz !== 512 ) { blob = file . slice ( 0 , ssz ) ; prep _blob ( blob , 28 /* blob.l */ ) ; }
/* Save header for final object */
var header = file . slice ( 0 , ssz ) ;
check _shifts ( blob , mver ) ;
// Number of Directory Sectors
2017-09-22 22:40:09 +00:00
var dir _cnt = blob . read _shift ( 4 , 'i' ) ;
if ( mver === 3 && dir _cnt !== 0 ) throw new Error ( '# Directory Sectors: Expected 0 saw ' + dir _cnt ) ;
2015-04-02 22:14:07 +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:40:09 +00:00
difat _sec _cnt = blob . read _shift ( 4 , 'i' ) ;
2015-04-02 22:14:07 +00:00
// Grab FAT Sector Locations
2017-07-28 23:54:51 +00:00
for ( var q = - 1 , j = 0 ; j < 109 ; ++ j ) { /* 109 = (512 - blob.l)>>>2; */
2015-04-02 22:14:07 +00:00
q = blob . read _shift ( 4 , 'i' ) ;
if ( q < 0 ) break ;
fat _addrs [ j ] = q ;
}
/** Break the file up into sectors */
var sectors = sectorify ( file , ssz ) ;
2017-09-22 22:40:09 +00:00
sleuth _fat ( difat _start , difat _sec _cnt , sectors , ssz , fat _addrs ) ;
2015-04-02 22:14:07 +00:00
/** Chains */
var sector _list = make _sector _list ( sectors , dir _start , fat _addrs , ssz ) ;
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:19:49 +00:00
var files = { } , Paths = [ ] , FileIndex = [ ] , FullPaths = [ ] ;
read _directory ( dir _start , sector _list , sectors , Paths , nmfs , files , FileIndex , minifat _start ) ;
2015-04-02 22:14:07 +00:00
2017-11-05 19:19:49 +00:00
build _full _paths ( FileIndex , FullPaths , Paths ) ;
2017-09-22 22:40:09 +00:00
Paths . shift ( ) ;
2015-04-02 22:14:07 +00:00
2017-09-22 22:40:09 +00:00
var o = {
2015-04-02 22:14:07 +00:00
FileIndex : FileIndex ,
2017-11-05 19:19:49 +00:00
FullPaths : FullPaths
2015-04-02 22:14:07 +00:00
} ;
2017-09-22 22:40:09 +00:00
// $FlowIgnore
if ( options && options . raw ) o . raw = { header : header , sectors : sectors } ;
return o ;
2015-04-02 22:14:07 +00:00
} // parse
/* [MS-CFB] 2.2 Compound File Header -- read up to major version */
function check _get _mver ( blob ) {
// header signature 8
blob . chk ( HEADER _SIGNATURE , 'Header Signature: ' ) ;
// clsid 16
blob . chk ( HEADER _CLSID , 'CLSID: ' ) ;
// minor version 2
var mver = blob . read _shift ( 2 , 'u' ) ;
return [ blob . read _shift ( 2 , 'u' ) , mver ] ;
}
function check _shifts ( blob , mver ) {
var shift = 0x09 ;
// Byte Order
2017-03-31 21:50:32 +00:00
//blob.chk('feff', 'Byte Order: '); // note: some writers put 0xffff
blob . l += 2 ;
2015-04-02 22:14:07 +00:00
// Sector Shift
switch ( ( shift = blob . read _shift ( 2 ) ) ) {
2017-03-31 21:50:32 +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 ) ;
2015-04-02 22:14:07 +00:00
}
// Mini Sector Shift
blob . chk ( '0600' , 'Mini Sector Shift: ' ) ;
// Reserved
blob . chk ( '000000000000' , 'Reserved: ' ) ;
}
/** Break the file up into sectors */
function sectorify ( file , ssz ) {
var nsectors = Math . ceil ( file . length / ssz ) - 1 ;
2017-07-28 23:54:51 +00:00
var sectors = [ ] ;
2015-04-02 22:14:07 +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:19:49 +00:00
function build _full _paths ( FI , FP , Paths ) {
2015-04-02 22:14:07 +00:00
var i = 0 , L = 0 , R = 0 , C = 0 , j = 0 , pl = Paths . length ;
2017-07-28 23:54:51 +00:00
var dad = [ ] , q = [ ] ;
2015-04-02 22:14:07 +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 ;
2018-04-13 04:49:43 +00:00
if ( L !== - 1 ) { dad [ L ] = dad [ i ] ; if ( q . lastIndexOf ( L ) < j ) q . push ( L ) ; }
if ( R !== - 1 ) { dad [ R ] = dad [ i ] ; if ( q . lastIndexOf ( R ) < j ) q . push ( R ) ; }
2015-04-02 22:14:07 +00:00
}
2018-03-06 01:09:57 +00:00
for ( i = 1 ; i < pl ; ++ i ) if ( dad [ i ] === i ) {
2015-04-02 22:14:07 +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 ;
j = dad [ i ] ;
if ( j === 0 ) FP [ i ] = FP [ 0 ] + "/" + FP [ i ] ;
2017-08-10 23:55:45 +00:00
else while ( j !== 0 && j !== dad [ j ] ) {
2015-04-02 22:14:07 +00:00
FP [ i ] = FP [ j ] + "/" + FP [ i ] ;
j = dad [ j ] ;
}
dad [ i ] = 0 ;
}
FP [ 0 ] += "/" ;
for ( i = 1 ; i < pl ; ++ i ) {
if ( FI [ i ] . type !== 2 /* stream */ ) FP [ i ] += "/" ;
}
}
2017-11-05 19:19:49 +00:00
function get _mfat _entry ( entry , payload , mini ) {
var start = entry . start , size = entry . size ;
//return (payload.slice(start*MSSZ, start*MSSZ + size));
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 ) ) ;
return ( bconcat ( o ) . slice ( 0 , entry . size ) ) ;
}
2015-04-02 22:14:07 +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:40:09 +00:00
DIFAT chains by storing the next sector number as the last 32 bits * /
2015-04-02 22:14:07 +00:00
function sleuth _fat ( idx , cnt , sectors , ssz , fat _addrs ) {
2017-07-28 23:54:51 +00:00
var q = ENDOFCHAIN ;
2015-04-02 22:14:07 +00:00
if ( idx === ENDOFCHAIN ) {
2017-03-31 21:50:32 +00:00
if ( cnt !== 0 ) throw new Error ( "DIFAT chain shorter than expected" ) ;
2015-04-02 22:14:07 +00:00
} else if ( idx !== - 1 /*FREESECT*/ ) {
var sector = sectors [ idx ] , m = ( ssz >>> 2 ) - 1 ;
2017-02-24 11:14:53 +00:00
if ( ! sector ) return ;
2015-04-02 22:14:07 +00:00
for ( var i = 0 ; i < m ; ++ i ) {
if ( ( q = _ _readInt32LE ( sector , i * 4 ) ) === ENDOFCHAIN ) break ;
fat _addrs . push ( q ) ;
}
sleuth _fat ( _ _readInt32LE ( sector , ssz - 4 ) , cnt - 1 , sectors , ssz , fat _addrs ) ;
}
}
/** Follow the linked list of sectors for a given starting point */
function get _sector _list ( sectors , start , fat _addrs , ssz , chkd ) {
2017-07-28 23:54:51 +00:00
var buf = [ ] , buf _chain = [ ] ;
if ( ! chkd ) chkd = [ ] ;
var modulus = ssz - 1 , j = 0 , jj = 0 ;
2015-04-02 22:14:07 +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 21:50:32 +00:00
if ( ssz < 4 + jj ) throw new Error ( "FAT boundary crossed: " + j + " 4 " + ssz ) ;
2017-02-24 11:14:53 +00:00
if ( ! sectors [ addr ] ) break ;
2015-04-02 22:14:07 +00:00
j = _ _readInt32LE ( sectors [ addr ] , jj ) ;
}
return { nodes : buf , data : _ _toBuffer ( [ buf _chain ] ) } ;
}
/** Chase down the sector linked lists */
function make _sector _list ( sectors , dir _start , fat _addrs , ssz ) {
2017-07-28 23:54:51 +00:00
var sl = sectors . length , sector _list = ( [ ] ) ;
var chkd = [ ] , buf = [ ] , buf _chain = [ ] ;
var modulus = ssz - 1 , i = 0 , j = 0 , k = 0 , jj = 0 ;
2015-04-02 22:14:07 +00:00
for ( i = 0 ; i < sl ; ++ i ) {
2017-07-28 23:54:51 +00:00
buf = ( [ ] ) ;
2015-04-02 22:14:07 +00:00
k = ( i + dir _start ) ; if ( k >= sl ) k -= sl ;
2017-07-28 23:54:51 +00:00
if ( chkd [ k ] ) continue ;
2015-04-02 22:14:07 +00:00
buf _chain = [ ] ;
for ( j = k ; 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 21:50:32 +00:00
if ( ssz < 4 + jj ) throw new Error ( "FAT boundary crossed: " + j + " 4 " + ssz ) ;
2017-02-24 11:14:53 +00:00
if ( ! sectors [ addr ] ) break ;
2015-04-02 22:14:07 +00:00
j = _ _readInt32LE ( sectors [ addr ] , jj ) ;
}
2017-07-28 23:54:51 +00:00
sector _list [ k ] = ( { nodes : buf , data : _ _toBuffer ( [ buf _chain ] ) } ) ;
2015-04-02 22:14:07 +00:00
}
return sector _list ;
}
/* [MS-CFB] 2.6.1 Compound File Directory Entry */
2017-11-05 19:19:49 +00:00
function read _directory ( dir _start , sector _list , sectors , Paths , nmfs , files , FileIndex , mini ) {
2015-04-02 22:14:07 +00:00
var minifat _store = 0 , pl = ( Paths . length ? 2 : 0 ) ;
var sector = sector _list [ dir _start ] . data ;
2017-07-28 23:54:51 +00:00
var i = 0 , namelen = 0 , name ;
2015-04-02 22:14:07 +00:00
for ( ; i < sector . length ; i += 128 ) {
2017-07-28 23:54:51 +00:00
var blob = sector . slice ( i , i + 128 ) ;
2015-04-02 22:14:07 +00:00
prep _blob ( blob , 64 ) ;
namelen = blob . read _shift ( 2 ) ;
name = _ _utf16le ( blob , 0 , namelen - pl ) ;
Paths . push ( name ) ;
2017-07-28 23:54:51 +00:00
var o = ( {
2015-04-02 22:14:07 +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:54:51 +00:00
state : blob . read _shift ( 4 , 'i' ) ,
start : 0 ,
size : 0
2017-02-24 11:14:53 +00:00
} ) ;
2017-07-28 23:54:51 +00:00
var ctime = 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 = 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 ) ;
2015-04-02 22:14:07 +00:00
o . start = blob . read _shift ( 4 , 'i' ) ;
o . size = blob . read _shift ( 4 , 'i' ) ;
2017-08-10 23:55:45 +00:00
if ( o . size < 0 && o . start < 0 ) { o . size = o . type = 0 ; o . start = ENDOFCHAIN ; o . name = "" ; }
2015-04-02 22:14:07 +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:54:51 +00:00
o . content = ( sector _list [ o . start ] . data . slice ( 0 , o . size ) ) ;
2015-04-02 22:14:07 +00:00
} else {
o . storage = 'minifat' ;
2018-02-14 05:26:28 +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:19:49 +00:00
o . content = get _mfat _entry ( o , sector _list [ minifat _store ] . data , ( sector _list [ mini ] || { } ) . data ) ;
2015-04-02 22:14:07 +00:00
}
}
2018-02-14 05:26:28 +00:00
if ( o . content ) prep _blob ( o . content , 0 ) ;
2015-04-02 22:14:07 +00:00
files [ name ] = o ;
FileIndex . push ( o ) ;
}
}
function read _date ( blob , offset ) {
return new Date ( ( ( ( _ _readUInt32LE ( blob , offset + 4 ) / 1e7 ) * Math . pow ( 2 , 32 ) + _ _readUInt32LE ( blob , offset ) / 1e7 ) - 11644473600 ) * 1000 ) ;
}
2017-09-22 22:40:09 +00:00
function read _file ( filename , options ) {
2017-10-27 19:55:07 +00:00
get _fs ( ) ;
2015-04-02 22:14:07 +00:00
return parse ( fs . readFileSync ( filename ) , options ) ;
}
2017-09-22 22:40:09 +00:00
function read ( blob , options ) {
2017-07-28 23:54:51 +00:00
switch ( options && options . type || "base64" ) {
2017-09-22 22:40:09 +00:00
case "file" : return read _file ( blob , options ) ;
2015-04-02 22:14:07 +00:00
case "base64" : return parse ( s2a ( Base64 . decode ( blob ) ) , options ) ;
case "binary" : return parse ( s2a ( blob ) , options ) ;
}
2017-07-28 23:54:51 +00:00
return parse ( blob , options ) ;
2015-04-02 22:14:07 +00:00
}
2017-09-22 22:40:09 +00:00
function init _cfb ( cfb , opts ) {
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 } ) ;
}
if ( o . CLSID ) cfb . FileIndex [ 0 ] . clsid = o . CLSID ;
seed _cfb ( cfb ) ;
}
function seed _cfb ( cfb ) {
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 } ) ) ;
cfb . FullPaths . push ( cfb . FullPaths [ 0 ] + nm ) ;
rebuild _cfb ( cfb ) ;
}
function rebuild _cfb ( cfb , f ) {
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 ;
var data = [ ] ;
for ( i = 0 ; i < cfb . FullPaths . length ; ++ i ) {
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 ] ) ;
s = false ;
for ( j = 0 ; j < data . length ; ++ j ) if ( data [ j ] [ 0 ] === dad ) s = true ;
if ( ! s ) data . push ( [ dad , ( {
name : filename ( dad ) . replace ( "/" , "" ) ,
type : 1 ,
clsid : HEADER _CLSID ,
ct : now , mt : now ,
content : null
} ) ] ) ;
}
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 ;
}
}
}
function _write ( cfb , options ) {
2018-01-23 09:09:53 +00:00
var _opts = options || { } ;
2017-09-22 22:40:09 +00:00
rebuild _cfb ( cfb ) ;
var L = ( function ( cfb ) {
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:09:53 +00:00
if ( flen > 0 ) {
if ( flen < 0x1000 ) mini _size += ( flen + 0x3F ) >> 6 ;
else fat _size += ( flen + 0x01FF ) >> 9 ;
}
2017-09-22 22:40:09 +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 ) {
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 = 0 , flen = 0 ;
var file = cfb . FileIndex [ 0 ] ;
for ( ; j < cfb . FileIndex . length ; ++ j ) {
file = cfb . FileIndex [ j ] ;
if ( ! file . content ) continue ;
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 ;
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:09:53 +00:00
var _nm = ( i === 0 && _opts . root ) || file . name ;
flen = 2 * ( _nm . length + 1 ) ;
o . write _shift ( 64 , _nm , "utf16le" ) ;
2017-09-22 22:40:09 +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 . size >= 0x1000 ) {
o . l = ( file . start + 1 ) << 9 ;
for ( j = 0 ; j < file . size ; ++ j ) o . write _shift ( 1 , file . content [ j ] ) ;
for ( ; j & 0x1FF ; ++ j ) o . write _shift ( 1 , 0 ) ;
}
}
for ( i = 1 ; i < cfb . FileIndex . length ; ++ i ) {
file = cfb . FileIndex [ i ] ;
if ( file . size > 0 && file . size < 0x1000 ) {
for ( j = 0 ; j < file . size ; ++ j ) o . write _shift ( 1 , file . content [ j ] ) ;
for ( ; j & 0x3F ; ++ j ) o . write _shift ( 1 , 0 ) ;
}
}
while ( o . l < o . length ) o . write _shift ( 1 , 0 ) ;
return o ;
}
/* [MS-CFB] 2.6.4 (Unicode 3.0.1 case conversion) */
2017-08-10 23:55:45 +00:00
function find ( cfb , path ) {
2017-09-22 22:40:09 +00:00
var UCFullPaths = cfb . FullPaths . map ( function ( x ) { return x . toUpperCase ( ) ; } ) ;
var UCPaths = UCFullPaths . map ( function ( x ) { var y = x . split ( "/" ) ; return y [ y . length - ( x . slice ( - 1 ) == "/" ? 2 : 1 ) ] ; } ) ;
var k = false ;
if ( path . charCodeAt ( 0 ) === 47 /* "/" */ ) { k = true ; path = UCFullPaths [ 0 ] . slice ( 0 , - 1 ) + path ; }
else k = path . indexOf ( "/" ) !== - 1 ;
var UCPath = path . toUpperCase ( ) ;
var w = k === true ? UCFullPaths . indexOf ( UCPath ) : UCPaths . indexOf ( UCPath ) ;
if ( w !== - 1 ) return cfb . FileIndex [ w ] ;
2018-03-06 01:09:57 +00:00
var m = ! UCPath . match ( chr1 ) ;
UCPath = UCPath . replace ( chr0 , '' ) ;
if ( m ) UCPath = UCPath . replace ( chr1 , '!' ) ;
2017-09-22 22:40:09 +00:00
for ( w = 0 ; w < UCFullPaths . length ; ++ w ) {
2018-03-06 01:09:57 +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:40:09 +00:00
}
return null ;
2017-08-10 23:55:45 +00:00
}
2015-04-02 22:14:07 +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:40:09 +00:00
var HEADER _SIG = [ 0xD0 , 0xCF , 0x11 , 0xE0 , 0xA1 , 0xB1 , 0x1A , 0xE1 ] ;
2015-04-02 22:14:07 +00:00
var HEADER _CLSID = '00000000000000000000000000000000' ;
var consts = {
/* 2.1 Compund File Sector Numbers and Types */
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:40:09 +00:00
function write _file ( cfb , filename , options ) {
2017-10-27 19:55:07 +00:00
get _fs ( ) ;
2017-09-22 22:40:09 +00:00
var o = _write ( cfb , options ) ;
fs . writeFileSync ( filename , o ) ;
}
function a2s ( o ) {
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 , options ) {
var o = _write ( cfb , options ) ;
switch ( options && options . type ) {
2017-10-27 19:55:07 +00:00
case "file" : get _fs ( ) ; fs . writeFileSync ( options . filename , ( o ) ) ; return o ;
2017-09-22 22:40:09 +00:00
case "binary" : return a2s ( o ) ;
case "base64" : return Base64 . encode ( a2s ( o ) ) ;
}
return o ;
}
function cfb _new ( opts ) {
var o = ( { } ) ;
init _cfb ( o , opts ) ;
return o ;
}
function cfb _add ( cfb , name , content , opts ) {
2018-04-13 04:49:43 +00:00
var unsafe = opts && opts . unsafe ;
if ( ! unsafe ) init _cfb ( cfb ) ;
var file = ! unsafe && CFB . find ( cfb , name ) ;
2017-09-22 22:40:09 +00:00
if ( ! file ) {
var fpath = cfb . FullPaths [ 0 ] ;
if ( name . slice ( 0 , fpath . length ) == fpath ) fpath = name ;
else {
if ( fpath . slice ( - 1 ) != "/" ) fpath += "/" ;
fpath = ( fpath + name ) . replace ( "//" , "/" ) ;
}
2017-10-27 19:55:07 +00:00
file = ( { name : filename ( name ) , type : 2 } ) ;
2017-09-22 22:40:09 +00:00
cfb . FileIndex . push ( file ) ;
cfb . FullPaths . push ( fpath ) ;
2018-04-13 04:49:43 +00:00
if ( ! unsafe ) CFB . utils . cfb _gc ( cfb ) ;
2017-09-22 22:40:09 +00:00
}
file . content = ( content ) ;
file . size = content ? content . length : 0 ;
if ( opts ) {
if ( opts . CLSID ) file . clsid = opts . CLSID ;
}
return file ;
}
function cfb _del ( cfb , name ) {
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 , old _name , new _name ) {
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 ) { rebuild _cfb ( cfb , true ) ; }
2017-08-10 23:55:45 +00:00
exports . find = find ;
2017-09-22 22:40:09 +00:00
exports . read = read ;
2015-04-02 22:14:07 +00:00
exports . parse = parse ;
2017-09-22 22:40:09 +00:00
exports . write = write ;
exports . writeFile = write _file ;
2015-04-02 22:14:07 +00:00
exports . utils = {
2017-09-22 22:40:09 +00:00
cfb _new : cfb _new ,
cfb _add : cfb _add ,
cfb _del : cfb _del ,
cfb _mov : cfb _mov ,
cfb _gc : cfb _gc ,
2015-04-02 22:14:07 +00:00
ReadShift : ReadShift ,
CheckField : CheckField ,
prep _blob : prep _blob ,
bconcat : bconcat ,
consts : consts
} ;
return exports ;
} ) ( ) ;
if ( typeof require !== 'undefined' && typeof module !== 'undefined' && typeof DO _NOT _EXPORT _CFB === 'undefined' ) { module . exports = CFB ; }
2018-02-03 20:43:07 +00:00
var _fs ;
if ( typeof require !== 'undefined' ) try { _fs = require ( 'fs' ) ; } catch ( e ) { }
/* 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 , payload , enc ) {
2018-03-29 04:33:39 +00:00
/*global IE_SaveFile, Blob, navigator, saveAs, URL, document, File, chrome */
2018-02-03 20:43:07 +00:00
if ( typeof _fs !== 'undefined' && _fs . writeFileSync ) return enc ? _fs . writeFileSync ( fname , payload , enc ) : _fs . writeFileSync ( fname , payload ) ;
var data = ( enc == "utf8" ) ? utf8write ( payload ) : payload ;
if ( typeof IE _SaveFile !== 'undefined' ) return IE _SaveFile ( data , fname ) ;
if ( typeof Blob !== 'undefined' ) {
var blob = new Blob ( [ blobify ( data ) ] , { type : "application/octet-stream" } ) ;
if ( typeof navigator !== 'undefined' && navigator . msSaveBlob ) return navigator . msSaveBlob ( blob , fname ) ;
if ( typeof saveAs !== 'undefined' ) return saveAs ( blob , fname ) ;
if ( typeof URL !== 'undefined' && typeof document !== 'undefined' && document . createElement && URL . createObjectURL ) {
2018-03-29 04:33:39 +00:00
var url = URL . createObjectURL ( blob ) ;
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:43:07 +00:00
var a = document . createElement ( "a" ) ;
if ( a . download != null ) {
a . download = fname ; a . href = url ; document . body . appendChild ( a ) ; a . click ( ) ;
document . body . removeChild ( a ) ;
if ( URL . revokeObjectURL && typeof setTimeout !== 'undefined' ) setTimeout ( function ( ) { URL . revokeObjectURL ( url ) ; } , 60000 ) ;
return url ;
}
}
}
2018-02-08 19:13:10 +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:43:07 +00:00
}
2018-02-08 19:13:10 +00:00
/* read binary data from file */
function read _binary ( path ) {
if ( typeof _fs !== 'undefined' ) return _fs . readFileSync ( path ) ;
// $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 09:58:43 +00:00
function keys ( o ) {
var ks = Object . keys ( o ) , o2 = [ ] ;
for ( var i = 0 ; i < ks . length ; ++ i ) if ( o . hasOwnProperty ( ks [ i ] ) ) o2 . push ( ks [ i ] ) ;
return o2 ;
}
2014-05-16 00:16:51 +00:00
2014-06-29 18:35:10 +00:00
function evert _key ( obj , key ) {
2017-02-11 01:58:22 +00:00
var o = ( [ ] ) , K = keys ( obj ) ;
2018-02-14 05:26:28 +00:00
for ( var i = 0 ; i !== K . length ; ++ i ) if ( o [ obj [ K [ i ] ] [ key ] ] == null ) o [ obj [ K [ i ] ] [ key ] ] = K [ i ] ;
2014-06-29 18:35:10 +00:00
return o ;
}
function evert ( obj ) {
2017-02-11 01:58:22 +00:00
var o = ( [ ] ) , K = keys ( obj ) ;
2014-06-29 18:35:10 +00:00
for ( var i = 0 ; i !== K . length ; ++ i ) o [ obj [ K [ i ] ] ] = K [ i ] ;
return o ;
}
function evert _num ( obj ) {
2017-02-11 01:58:22 +00:00
var o = ( [ ] ) , K = keys ( obj ) ;
2014-06-29 18:35:10 +00:00
for ( var i = 0 ; i !== K . length ; ++ i ) o [ obj [ K [ i ] ] ] = parseInt ( K [ i ] , 10 ) ;
return o ;
}
function evert _arr ( obj ) {
2017-02-11 01:58:22 +00:00
var o = ( [ ] ) , K = keys ( obj ) ;
2014-06-29 18:35:10 +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 ] ) ;
}
2014-05-16 00:16:51 +00:00
return o ;
}
2014-05-22 12:09:29 +00:00
2017-06-03 07:23:15 +00:00
var basedate = new Date ( 1899 , 11 , 30 , 0 , 0 , 0 ) ; // 2209161600000
var dnthresh = basedate . getTime ( ) + ( new Date ( ) . getTimezoneOffset ( ) - basedate . getTimezoneOffset ( ) ) * 60000 ;
2014-05-22 12:09:29 +00:00
function datenum ( v , date1904 ) {
2017-03-09 05:49:24 +00:00
var epoch = v . getTime ( ) ;
2017-08-05 06:58:40 +00:00
if ( date1904 ) epoch -= 1462 * 24 * 60 * 60 * 1000 ;
2017-06-03 07:23:15 +00:00
return ( epoch - dnthresh ) / ( 24 * 60 * 60 * 1000 ) ;
2014-06-29 18:35:10 +00:00
}
2017-03-25 22:38:26 +00:00
function numdate ( v ) {
2017-06-03 07:23:15 +00:00
var out = new Date ( ) ;
out . setTime ( v * 24 * 60 * 60 * 1000 + dnthresh ) ;
return out ;
2017-03-25 22:38:26 +00:00
}
2014-06-29 18:35:10 +00:00
2017-03-10 00:36:03 +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-23 09:09:53 +00:00
switch ( m [ i ] . slice ( m [ i ] . length - 1 ) ) {
2017-03-10 00:36:03 +00:00
case 'Y' :
2018-01-23 09:09:53 +00:00
throw new Error ( "Unsupported ISO Duration Field: " + m [ i ] . slice ( m [ i ] . length - 1 ) ) ;
2017-03-10 00:36:03 +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 ;
}
2017-03-23 01:56:21 +00:00
var good _pd _date = new Date ( '2017-02-19T19:06:09.000Z' ) ;
2017-05-17 04:27:55 +00:00
if ( isNaN ( good _pd _date . getFullYear ( ) ) ) good _pd _date = new Date ( '2/19/17' ) ;
2017-03-23 01:56:21 +00:00
var good _pd = good _pd _date . getFullYear ( ) == 2017 ;
2017-08-10 23:55:45 +00:00
/* parses a date as a local date */
2017-06-03 07:23:15 +00:00
function parseDate ( str , fixdate ) {
2017-05-17 04:27:55 +00:00
var d = new Date ( str ) ;
2017-06-03 07:23:15 +00:00
if ( good _pd ) {
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:56:21 +00:00
if ( str instanceof Date ) return str ;
2017-05-17 04:27:55 +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:56:21 +00:00
var n = str . match ( /\d+/g ) || [ "2017" , "2" , "19" , "0" , "0" , "0" ] ;
2017-08-10 23:55:45 +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:56:21 +00:00
}
2014-06-29 18:35:10 +00:00
function cc2str ( arr ) {
var o = "" ;
for ( var i = 0 ; i != arr . length ; ++ i ) o += String . fromCharCode ( arr [ i ] ) ;
return o ;
2014-05-22 12:09:29 +00:00
}
2014-07-28 15:32:28 +00:00
2017-02-19 21:11:48 +00:00
function dup ( o ) {
2017-03-20 21:57:44 +00:00
if ( typeof JSON != 'undefined' && ! Array . isArray ( o ) ) return JSON . parse ( JSON . stringify ( o ) ) ;
if ( typeof o != 'object' || o == null ) return o ;
2018-01-23 09:09:53 +00:00
if ( o instanceof Date ) return new Date ( o . getTime ( ) ) ;
2017-02-19 21:11:48 +00:00
var out = { } ;
for ( var k in o ) if ( o . hasOwnProperty ( k ) ) out [ k ] = dup ( o [ k ] ) ;
return out ;
}
function fill ( c , l ) { var o = "" ; while ( o . length < l ) o += c ; return o ; }
2017-05-11 18:57:52 +00:00
/* TODO: stress test */
2017-08-10 23:55:45 +00:00
function fuzzynum ( s ) {
var v = Number ( s ) ;
if ( ! isNaN ( v ) ) return v ;
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 ;
return v ;
}
2017-05-11 18:57:52 +00:00
function fuzzydate ( s ) {
var o = new Date ( s ) , n = new Date ( NaN ) ;
var y = o . getYear ( ) , m = o . getMonth ( ) , d = o . getDate ( ) ;
if ( isNaN ( d ) ) return n ;
if ( y < 0 || y > 8099 ) return n ;
if ( ( m > 0 || d > 1 ) && y != 101 ) return o ;
if ( s . toLowerCase ( ) . match ( /jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec/ ) ) return o ;
2017-08-19 23:13:21 +00:00
if ( s . match ( /[^-0-9:,\/\\]/ ) ) return n ;
return o ;
2017-05-11 18:57:52 +00:00
}
2017-08-10 23:55:45 +00:00
var safe _split _regex = "abacaba" . split ( /(:?b)/i ) . length == 5 ;
function split _regex ( str , re , def ) {
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-11 01:58:22 +00:00
function getdatastr ( data ) {
2014-01-28 16:35:26 +00:00
if ( ! data ) return null ;
2017-02-24 11:14:53 +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 ) ) ) ;
2014-01-28 16:35:26 +00:00
return null ;
}
2017-02-11 01:58:22 +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 07:48:52 +00:00
if ( data . _data && data . _data . getContent ) {
var o = data . _data . getContent ( ) ;
2017-12-30 05:41:41 +00:00
if ( typeof o == "string" ) return char _codes ( o ) ;
2017-02-22 07:48:52 +00:00
return Array . prototype . slice . call ( o ) ;
}
2017-02-11 01:58:22 +00:00
return null ;
}
2017-02-22 07:48:52 +00:00
function getdata ( data ) { return ( data && data . name . slice ( - 4 ) === ".bin" ) ? getdatabin ( data ) : getdatastr ( data ) ; }
2017-02-11 01:58:22 +00:00
2017-02-24 11:14:53 +00:00
/* Part 2 Section 10.1.2 "Mapping Content Types" Names are case-insensitive */
2017-03-10 00:36:03 +00:00
/* OASIS does not comment on filename case sensitivity */
2014-10-10 02:12:25 +00:00
function safegetzipfile ( zip , file ) {
2017-02-24 11:14:53 +00:00
var k = keys ( zip . files ) ;
var f = file . toLowerCase ( ) , g = f . replace ( /\//g , '\\' ) ;
for ( var i = 0 ; i < k . length ; ++ i ) {
var n = k [ i ] . toLowerCase ( ) ;
if ( f == n || g == n ) return zip . files [ k [ i ] ] ;
}
2014-10-10 02:12:25 +00:00
return null ;
}
function getzipfile ( zip , file ) {
var o = safegetzipfile ( zip , file ) ;
if ( o == null ) throw new Error ( "Cannot find file " + file + " in zip" ) ;
return o ;
2014-01-28 16:35:26 +00:00
}
2014-02-15 05:10:56 +00:00
function getzipdata ( zip , file , safe ) {
if ( ! safe ) return getdata ( getzipfile ( zip , file ) ) ;
if ( ! file ) return null ;
try { return getzipdata ( zip , file ) ; } catch ( e ) { return null ; }
}
2017-02-11 01:58:22 +00:00
function getzipstr ( zip , file , safe ) {
if ( ! safe ) return getdatastr ( getzipfile ( zip , file ) ) ;
if ( ! file ) return null ;
try { return getzipstr ( zip , file ) ; } catch ( e ) { return null ; }
}
2018-02-28 09:58:43 +00:00
function zipentries ( zip ) {
var k = keys ( zip . files ) , o = [ ] ;
for ( var i = 0 ; i < k . length ; ++ i ) if ( k [ i ] . slice ( - 1 ) != '/' ) o . push ( k [ i ] ) ;
return o . sort ( ) ;
}
2018-02-03 20:43:07 +00:00
var jszip ;
2018-03-06 01:09:57 +00:00
/*global JSZipSync:true */
if ( typeof JSZipSync !== 'undefined' ) jszip = JSZipSync ;
2018-02-03 20:43:07 +00:00
if ( typeof exports !== 'undefined' ) {
if ( typeof module !== 'undefined' && module . exports ) {
2017-03-05 01:44:52 +00:00
if ( typeof jszip === 'undefined' ) jszip = require ( './jszip.js' ) ;
2014-01-28 16:35:26 +00:00
}
}
2017-03-28 22:07:46 +00:00
function resolve _path ( path , base ) {
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:40:09 +00:00
var XML _HEADER = '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>\r\n' ;
2017-12-30 05:41:41 +00:00
var attregexg = /([^"\s?>\/]+)\s*=\s*((?:")([^"]*)(?:")|(?:')([^']*)(?:')|([^'">\s]+))/g ;
2018-02-21 06:20:15 +00:00
var tagregex = /<[\/\?]?[a-zA-Z0-9:]+(?:\s+[^"\s?>\/]+\s*=\s*(?:"[^"]*"|'[^']*'|[^'">\s=]+))*\s?[\/\?]?>/g ;
2017-09-22 22:40:09 +00:00
if ( ! ( XML _HEADER . match ( tagregex ) ) ) tagregex = /<[^>]*>/g ;
2014-06-29 18:35:10 +00:00
var nsregex = /<\w*:/ , nsregex2 = /<(\/?)\w+:/ ;
2014-06-05 07:07:10 +00:00
function parsexmltag ( tag , skip _root ) {
2017-03-23 01:56:21 +00:00
var z = ( { } ) ;
2014-06-29 18:35:10 +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-23 09:09:53 +00:00
if ( ! skip _root ) z [ 0 ] = tag . slice ( 0 , eq ) ;
2014-06-29 18:35:10 +00:00
if ( eq === tag . length ) return z ;
2017-04-16 07:35:56 +00:00
var m = tag . match ( attregexg ) , j = 0 , v = "" , i = 0 , q = "" , cc = "" , quot = 1 ;
2014-06-02 05:16:51 +00:00
if ( m ) for ( i = 0 ; i != m . length ; ++ i ) {
2014-06-29 18:35:10 +00:00
cc = m [ i ] ;
for ( c = 0 ; c != cc . length ; ++ c ) if ( cc . charCodeAt ( c ) === 61 ) break ;
2018-01-23 09:09:53 +00:00
q = cc . slice ( 0 , c ) . trim ( ) ;
2017-12-30 05:41:41 +00:00
while ( cc . charCodeAt ( c + 1 ) == 32 ) ++ c ;
2017-04-16 07:35:56 +00:00
quot = ( ( eq = cc . charCodeAt ( c + 1 ) ) == 34 || eq == 39 ) ? 1 : 0 ;
2018-01-23 09:09:53 +00:00
v = cc . slice ( c + 1 + quot , cc . length - quot ) ;
2014-06-29 18:35:10 +00:00
for ( j = 0 ; j != q . length ; ++ j ) if ( q . charCodeAt ( j ) === 58 ) break ;
2017-03-10 00:36:03 +00:00
if ( j === q . length ) {
2018-01-23 09:09:53 +00:00
if ( q . indexOf ( "_" ) > 0 ) q = q . slice ( 0 , q . indexOf ( "_" ) ) ; // from ods
2017-03-10 00:36:03 +00:00
z [ q ] = v ;
2018-08-15 20:01:20 +00:00
z [ q . toLowerCase ( ) ] = v ;
2017-03-10 00:36:03 +00:00
}
else {
2018-01-23 09:09:53 +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 00:36:03 +00:00
z [ k ] = v ;
2018-08-15 20:01:20 +00:00
z [ k . toLowerCase ( ) ] = v ;
2017-03-10 00:36:03 +00:00
}
2014-06-02 05:16:51 +00:00
}
2012-12-03 19:47:44 +00:00
return z ;
}
2014-06-29 18:35:10 +00:00
function strip _ns ( x ) { return x . replace ( nsregex2 , "<$1" ) ; }
2012-12-03 19:47:44 +00:00
var encodings = {
'"' : '"' ,
''' : "'" ,
'>' : '>' ,
'<' : '<' ,
'&' : '&'
} ;
2014-01-29 06:03:34 +00:00
var rencoding = evert ( encodings ) ;
2017-05-09 18:11:15 +00:00
//var rencstr = "&<>'\"".split("");
2014-01-29 06:03:34 +00:00
2012-12-03 19:47:44 +00:00
// TODO: CP remap (need to read file version to determine OS)
2015-04-02 22:14:07 +00:00
var unescapexml = ( function ( ) {
2017-03-09 05:49:24 +00:00
/* 22.4.2.4 bstr (Basic String) */
2017-03-16 04:39:50 +00:00
var encregex = /&(?:quot|apos|gt|lt|amp|#x?([\da-fA-F]+));/g , coderegex = /_x([\da-fA-F]{4})_/g ;
2017-02-11 01:58:22 +00:00
return function unescapexml ( text ) {
2017-08-10 23:55:45 +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 ( "]]>" ) ;
return unescapexml ( s . slice ( 0 , i ) ) + s . slice ( i + 9 , j ) + unescapexml ( s . slice ( j + 3 ) ) ;
2015-04-02 22:14:07 +00:00
} ;
} ) ( ) ;
2014-06-29 18:35:10 +00:00
var decregex = /[&<>'"]/g , charegex = /[\u0000-\u0008\u000b-\u001f]/g ;
2018-01-23 09:09:53 +00:00
function escapexml ( text ) {
2014-01-28 16:35:26 +00:00
var s = text + '' ;
2017-02-22 07:48:52 +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 ) + "_" ; } ) ;
2014-01-28 16:35:26 +00:00
}
2017-03-16 04:39:50 +00:00
function escapexmltag ( text ) { return escapexml ( text ) . replace ( / /g , "_x0020_" ) ; }
2014-01-28 16:35:26 +00:00
2017-04-16 07:35:56 +00:00
var htmlcharegex = /[\u0000-\u001f]/g ;
function escapehtml ( text ) {
var s = text + '' ;
2018-08-26 00:09:59 +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-16 07:35:56 +00:00
}
2018-01-09 07:40:54 +00:00
function escapexlml ( text ) {
var s = text + '' ;
return s . replace ( decregex , function ( y ) { return rencoding [ y ] ; } ) . replace ( htmlcharegex , function ( s ) { return "&#x" + ( s . charCodeAt ( 0 ) . toString ( 16 ) ) . toUpperCase ( ) + ";" ; } ) ;
}
2015-04-02 22:14:07 +00:00
/* TODO: handle codepages */
var xlml _fixstr = ( function ( ) {
var entregex = /&#(\d+);/g ;
function entrepl ( $$ , $1 ) { return String . fromCharCode ( parseInt ( $1 , 10 ) ) ; }
return function xlml _fixstr ( str ) { return str . replace ( entregex , entrepl ) ; } ;
} ) ( ) ;
2017-04-03 06:04:35 +00:00
var xlml _unfixstr = ( function ( ) {
return function xlml _unfixstr ( str ) { return str . replace ( /(\r\n|[\r\n])/g , "\ " ) ; } ;
} ) ( ) ;
2015-04-02 22:14:07 +00:00
2018-01-23 09:09:53 +00:00
function parsexmlbool ( value ) {
2012-12-03 19:47:44 +00:00
switch ( value ) {
2017-06-03 07:23:15 +00:00
case 1 : case true : case '1' : case 'true' : case 'TRUE' : return true ;
2014-06-29 18:35:10 +00:00
/* case '0': case 'false': case 'FALSE':*/
default : return false ;
2012-12-03 19:47:44 +00:00
}
}
2014-06-29 18:35:10 +00:00
var utf8read = function utf8reada ( orig ) {
var out = "" , i = 0 , c = 0 , d = 0 , e = 0 , f = 0 , w = 0 ;
2012-12-03 19:47:44 +00:00
while ( i < orig . length ) {
c = orig . charCodeAt ( i ++ ) ;
2014-06-29 18:35:10 +00:00
if ( c < 128 ) { out += String . fromCharCode ( c ) ; continue ; }
d = orig . charCodeAt ( i ++ ) ;
2017-07-10 22:29:24 +00:00
if ( c > 191 && c < 224 ) { f = ( ( c & 31 ) << 6 ) ; f |= ( d & 63 ) ; out += String . fromCharCode ( f ) ; continue ; }
2014-06-29 18:35:10 +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 ) ) ;
2012-12-03 19:47:44 +00:00
}
2014-06-29 18:35:10 +00:00
return out ;
2012-12-03 19:47:44 +00:00
} ;
2017-09-30 06:19:01 +00:00
var utf8write = function ( orig ) {
var out = [ ] , i = 0 , c = 0 , d = 0 ;
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 ( "" ) ;
} ;
2014-06-29 18:35:10 +00:00
2014-07-28 15:32:28 +00:00
if ( has _buf ) {
2014-06-29 18:35:10 +00:00
var utf8readb = function utf8readb ( data ) {
2018-05-05 06:42:56 +00:00
var out = Buffer . alloc ( 2 * data . length ) , w , i , j = 1 , k = 0 , ww = 0 , c ;
2014-06-29 18:35:10 +00:00
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 ;
}
2017-05-17 04:27:55 +00:00
return out . slice ( 0 , k ) . toString ( 'ucs2' ) ;
2014-06-29 18:35:10 +00:00
} ;
var corpus = "foo bar baz\u00e2\u0098\u0083\u00f0\u009f\u008d\u00a3" ;
if ( utf8read ( corpus ) == utf8readb ( corpus ) ) utf8read = utf8readb ;
2018-07-09 07:07:59 +00:00
// $FlowIgnore
var utf8readc = function utf8readc ( data ) { return Buffer _from ( data , 'binary' ) . toString ( 'utf8' ) ; } ;
2014-06-29 18:35:10 +00:00
if ( utf8read ( corpus ) == utf8readc ( corpus ) ) utf8read = utf8readc ;
2017-09-30 06:19:01 +00:00
2018-07-09 07:07:59 +00:00
// $FlowIgnore
utf8write = function ( data ) { return Buffer _from ( data , 'utf8' ) . toString ( "binary" ) ; } ;
2014-06-29 18:35:10 +00:00
}
2012-12-03 19:47:44 +00:00
// matches <foo>...</foo> extracts content
2014-06-29 18:35:10 +00:00
var matchtag = ( function ( ) {
2017-03-13 07:34:05 +00:00
var mtcache = ( { } ) ;
2014-06-29 18:35:10 +00:00
return function matchtag ( f , g ) {
2017-02-11 01:58:22 +00:00
var t = f + "|" + ( g || "" ) ;
2017-03-13 07:34:05 +00:00
if ( mtcache [ t ] ) return mtcache [ t ] ;
2017-06-24 06:48:44 +00:00
return ( mtcache [ t ] = new RegExp ( '<(?:\\w+:)?' + f + '(?: xml:space="preserve")?(?:[^>]*)>([\\s\\S]*?)</(?:\\w+:)?' + f + '>' , ( ( g || "" ) ) ) ) ;
2014-06-29 18:35:10 +00:00
} ;
} ) ( ) ;
2012-12-03 19:47:44 +00:00
2017-12-09 07:23:04 +00:00
var htmldecode = ( function ( ) {
var entities = [
[ 'nbsp' , ' ' ] , [ 'middot' , '·' ] ,
[ 'quot' , '"' ] , [ 'apos' , "'" ] , [ 'gt' , '>' ] , [ 'lt' , '<' ] , [ 'amp' , '&' ]
] . map ( function ( x ) { return [ new RegExp ( '&' + x [ 0 ] + ';' , "g" ) , x [ 1 ] ] ; } ) ;
return function htmldecode ( str ) {
2018-07-25 06:43:29 +00:00
var o = str . replace ( /^[\t\n\r ]+/ , "" ) . replace ( /[\t\n\r ]+$/ , "" ) . replace ( /[\t\n\r ]+/g , " " ) . replace ( /<\s*[bB][rR]\s*\/?>/g , "\n" ) . replace ( /<[^>]*>/g , "" ) ;
2017-12-09 07:23:04 +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:19:01 +00:00
2014-06-29 18:35:10 +00:00
var vtregex = ( function ( ) { var vt _cache = { } ;
return function vt _regex ( bt ) {
if ( vt _cache [ bt ] !== undefined ) return vt _cache [ bt ] ;
2017-07-05 21:02:14 +00:00
return ( vt _cache [ bt ] = new RegExp ( "<(?:vt:)?" + bt + ">([\\s\\S]*?)</(?:vt:)?" + bt + ">" , 'g' ) ) ;
2014-06-29 18:35:10 +00:00
} ; } ) ( ) ;
2017-07-05 21:02:14 +00:00
var vtvregex = /<\/?(?:vt:)?variant>/g , vtmregex = /<(?:vt:)([^>]*)>([\s\S]*)</ ;
2017-08-05 06:58:40 +00:00
function parseVector ( data , opts ) {
2012-12-03 19:47:44 +00:00
var h = parsexmltag ( data ) ;
2014-06-29 18:35:10 +00:00
var matches = data . match ( vtregex ( h . baseType ) ) || [ ] ;
2012-12-03 19:47:44 +00:00
var res = [ ] ;
2017-08-05 06:58:40 +00:00
if ( matches . length != h . size ) {
if ( opts . WTF ) throw new Error ( "unexpected vector length " + matches . length + " != " + h . size ) ;
return res ;
}
2012-12-03 19:47:44 +00:00
matches . forEach ( function ( x ) {
2014-06-29 18:35:10 +00:00
var v = x . replace ( vtvregex , "" ) . match ( vtmregex ) ;
2017-12-30 05:41:41 +00:00
if ( v ) res . push ( { v : utf8read ( v [ 2 ] ) , t : v [ 1 ] } ) ;
2012-12-03 19:47:44 +00:00
} ) ;
return res ;
}
2014-06-29 18:35:10 +00:00
var wtregex = /(^\s|\s$|\n)/ ;
2017-12-30 05:41:41 +00:00
function writetag ( f , g ) { return '<' + f + ( g . match ( wtregex ) ? ' xml:space="preserve"' : "" ) + '>' + g + '</' + f + '>' ; }
2014-05-16 00:16:51 +00:00
2014-06-29 18:35:10 +00:00
function wxt _helper ( h ) { return keys ( h ) . map ( function ( k ) { return " " + k + '="' + h [ k ] + '"' ; } ) . join ( "" ) ; }
2017-12-30 05:41:41 +00:00
function writextag ( f , g , h ) { return '<' + f + ( ( h != null ) ? wxt _helper ( h ) : "" ) + ( ( g != null ) ? ( g . match ( wtregex ) ? ' xml:space="preserve"' : "" ) + '>' + g + '</' + f : "/" ) + '>' ; }
2014-05-16 00:16:51 +00:00
2017-02-11 01:58:22 +00:00
function write _w3cdtf ( d , t ) { try { return d . toISOString ( ) . replace ( /\.\d*/ , "" ) ; } catch ( e ) { if ( t ) throw e ; } return "" ; }
2014-05-16 00:16:51 +00:00
function write _vt ( s ) {
2014-06-29 18:35:10 +00:00
switch ( typeof s ) {
case 'string' : return writextag ( 'vt:lpwstr' , s ) ;
case 'number' : return writextag ( ( s | 0 ) == s ? 'vt:i4' : 'vt:r8' , String ( s ) ) ;
case 'boolean' : return writextag ( 'vt:bool' , s ? 'true' : 'false' ) ;
}
2014-05-16 00:16:51 +00:00
if ( s instanceof Date ) return writextag ( 'vt:filetime' , write _w3cdtf ( s ) ) ;
throw new Error ( "Unable to serialize " + s ) ;
}
2017-02-11 01:58:22 +00:00
var XMLNS = ( {
2014-05-16 00:16:51 +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-11 01:58:22 +00:00
} ) ;
2014-05-16 00:16:51 +00:00
XMLNS . main = [
'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'
] ;
2015-04-02 22:14:07 +00:00
2017-03-16 04:39:50 +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-03 06:04:35 +00:00
'mv' : 'http://macVmlSchemaUri' ,
'v' : 'urn:schemas-microsoft-com:vml' ,
2017-03-16 04:39:50 +00:00
'html' : 'http://www.w3.org/TR/REC-html40'
} ) ;
2017-02-11 01:58:22 +00:00
function read _double _le ( b , idx ) {
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 19:13:10 +00:00
if ( e == 0x7ff ) return m == 0 ? ( s * Infinity ) : NaN ;
2017-02-11 01:58:22 +00:00
if ( e == 0 ) e = - 1022 ;
else { e -= 1023 ; m += Math . pow ( 2 , 52 ) ; }
return s * Math . pow ( 2 , e - 52 ) * m ;
}
function write _double _le ( b , v , idx ) {
2018-02-08 19:13:10 +00:00
var bs = ( ( ( ( v < 0 ) || ( 1 / v == - Infinity ) ) ? 1 : 0 ) << 7 ) , e = 0 , m = 0 ;
var av = bs ? ( - v ) : v ;
2017-02-11 01:58:22 +00:00
if ( ! isFinite ( av ) ) { e = 0x7ff ; m = isNaN ( v ) ? 0x6969 : 0 ; }
2017-09-22 22:40:09 +00:00
else if ( av == 0 ) e = m = 0 ;
2017-02-11 01:58:22 +00:00
else {
2017-09-22 22:40:09 +00:00
e = Math . floor ( Math . log ( av ) / Math . LN2 ) ;
m = av * Math . pow ( 2 , 52 - e ) ;
2018-02-08 19:13:10 +00:00
if ( ( e <= - 1023 ) && ( ! isFinite ( m ) || ( m < Math . pow ( 2 , 52 ) ) ) ) { e = - 1022 ; }
2017-02-11 01:58:22 +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 19:13:10 +00:00
b [ idx + 6 ] = ( ( e & 0x0f ) << 4 ) | ( m & 0xf ) ;
2017-02-11 01:58:22 +00:00
b [ idx + 7 ] = ( e >> 4 ) | bs ;
2014-01-28 16:35:26 +00:00
}
2018-02-21 06:20:15 +00:00
var _ _toBuffer = function ( bufs ) { 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 ; } ;
2017-09-30 06:19:01 +00:00
var _ _ _toBuffer = _ _toBuffer ;
2017-10-17 00:36:51 +00:00
var _ _utf16le = function ( b , s , e ) { var ss = [ ] ; for ( var i = s ; i < e ; i += 2 ) ss . push ( String . fromCharCode ( _ _readUInt16LE ( b , i ) ) ) ; return ss . join ( "" ) . replace ( chr0 , '' ) ; } ;
2017-09-30 06:19:01 +00:00
var _ _ _utf16le = _ _utf16le ;
2017-08-19 23:13:21 +00:00
var _ _hexlify = function ( b , s , l ) { var ss = [ ] ; for ( var i = s ; i < s + l ; ++ i ) ss . push ( ( "0" + b [ i ] . toString ( 16 ) ) . slice ( - 2 ) ) ; return ss . join ( "" ) ; } ;
var _ _ _hexlify = _ _hexlify ;
2017-09-30 06:19:01 +00:00
var _ _utf8 = function ( b , s , e ) { var ss = [ ] ; for ( var i = s ; i < e ; i ++ ) ss . push ( String . fromCharCode ( _ _readUInt8 ( b , i ) ) ) ; return ss . join ( "" ) ; } ;
2018-02-21 06:20:15 +00:00
var _ _ _utf8 = _ _utf8 ;
2017-09-30 06:19:01 +00:00
var _ _lpstr = function ( b , i ) { var len = _ _readUInt32LE ( b , i ) ; return len > 0 ? _ _utf8 ( b , i + 4 , i + 4 + len - 1 ) : "" ; } ;
var _ _ _lpstr = _ _lpstr ;
2017-12-30 05:41:41 +00:00
var _ _cpstr = function ( b , i ) { var len = _ _readUInt32LE ( b , i ) ; return len > 0 ? _ _utf8 ( b , i + 4 , i + 4 + len - 1 ) : "" ; } ;
var _ _ _cpstr = _ _cpstr ;
2017-09-30 06:19:01 +00:00
var _ _lpwstr = function ( b , i ) { var len = 2 * _ _readUInt32LE ( b , i ) ; return len > 0 ? _ _utf8 ( b , i + 4 , i + 4 + len - 1 ) : "" ; } ;
var _ _ _lpwstr = _ _lpwstr ;
2017-04-16 07:35:56 +00:00
var _ _lpp4 , _ _ _lpp4 ;
_ _lpp4 = _ _ _lpp4 = function lpp4 _ ( b , i ) { var len = _ _readUInt32LE ( b , i ) ; return len > 0 ? _ _utf16le ( b , i + 4 , i + 4 + len ) : "" ; } ;
2017-09-30 06:19:01 +00:00
var _ _8lpp4 = function ( b , i ) { var len = _ _readUInt32LE ( b , i ) ; return len > 0 ? _ _utf8 ( b , i + 4 , i + 4 + len ) : "" ; } ;
var _ _ _8lpp4 = _ _8lpp4 ;
2014-07-28 15:32:28 +00:00
var _ _double , _ _ _double ;
2017-02-11 01:58:22 +00:00
_ _double = _ _ _double = function ( b , idx ) { return read _double _le ( b , idx ) ; } ;
2014-07-28 15:32:28 +00:00
var is _buf = function is _buf _a ( a ) { return Array . isArray ( a ) ; } ;
2017-09-30 06:19:01 +00:00
2014-07-28 15:32:28 +00:00
if ( has _buf ) {
2017-10-17 00:36:51 +00:00
_ _utf16le = function ( b , s , e ) { if ( ! Buffer . isBuffer ( b ) ) return _ _ _utf16le ( b , s , e ) ; return b . toString ( 'utf16le' , s , e ) . replace ( chr0 , '' ) /*.replace(chr1,'!')*/ ; } ;
2015-04-02 22:14:07 +00:00
_ _hexlify = function ( b , s , l ) { return Buffer . isBuffer ( b ) ? b . toString ( 'hex' , s , s + l ) : _ _ _hexlify ( b , s , l ) ; } ;
2017-09-30 06:19:01 +00:00
_ _lpstr = function lpstr _b ( b , i ) { if ( ! Buffer . isBuffer ( b ) ) 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:41:41 +00:00
_ _cpstr = function cpstr _b ( b , i ) { if ( ! Buffer . isBuffer ( b ) ) 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:19:01 +00:00
_ _lpwstr = function lpwstr _b ( b , i ) { if ( ! Buffer . isBuffer ( b ) ) 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 , i ) { if ( ! Buffer . isBuffer ( b ) ) return _ _ _lpp4 ( b , i ) ; var len = b . readUInt32LE ( i ) ; return b . toString ( 'utf16le' , i + 4 , i + 4 + len ) ; } ;
_ _8lpp4 = function lpp4 _8b ( b , i ) { if ( ! Buffer . isBuffer ( b ) ) return _ _ _8lpp4 ( b , i ) ; var len = b . readUInt32LE ( i ) ; return b . toString ( 'utf8' , i + 4 , i + 4 + len ) ; } ;
2018-02-21 06:20:15 +00:00
_ _utf8 = function utf8 _b ( b , s , e ) { return ( Buffer . isBuffer ( b ) ) ? b . toString ( 'utf8' , s , e ) : _ _ _utf8 ( b , s , e ) ; } ;
2014-06-29 18:35:10 +00:00
_ _toBuffer = function ( bufs ) { return ( bufs [ 0 ] . length > 0 && Buffer . isBuffer ( bufs [ 0 ] [ 0 ] ) ) ? Buffer . concat ( bufs [ 0 ] ) : _ _ _toBuffer ( bufs ) ; } ;
2015-04-02 22:14:07 +00:00
bconcat = function ( bufs ) { return Buffer . isBuffer ( bufs [ 0 ] ) ? Buffer . concat ( bufs ) : [ ] . concat . apply ( [ ] , bufs ) ; } ;
2017-09-30 06:19:01 +00:00
_ _double = function double _ ( b , i ) { if ( Buffer . isBuffer ( b ) ) return b . readDoubleLE ( i ) ; return _ _ _double ( b , i ) ; } ;
2014-07-28 15:32:28 +00:00
is _buf = function is _buf _b ( a ) { return Buffer . isBuffer ( a ) || Array . isArray ( a ) ; } ;
2014-01-28 16:35:26 +00:00
}
2015-04-02 22:14:07 +00:00
/* from js-xls */
if ( typeof cptable !== 'undefined' ) {
2017-10-17 00:36:51 +00:00
_ _utf16le = function ( b , s , e ) { return cptable . utils . decode ( 1200 , b . slice ( s , e ) ) . replace ( chr0 , '' ) ; } ;
2015-04-02 22:14:07 +00:00
_ _utf8 = function ( b , s , e ) { return cptable . utils . decode ( 65001 , b . slice ( s , e ) ) ; } ;
2017-12-30 05:41:41 +00:00
_ _lpstr = function ( b , i ) { var len = _ _readUInt32LE ( b , i ) ; return len > 0 ? cptable . utils . decode ( current _ansi , b . slice ( i + 4 , i + 4 + len - 1 ) ) : "" ; } ;
_ _cpstr = function ( b , i ) { var len = _ _readUInt32LE ( b , i ) ; return len > 0 ? cptable . utils . decode ( current _codepage , b . slice ( i + 4 , i + 4 + len - 1 ) ) : "" ; } ;
2015-04-02 22:14:07 +00:00
_ _lpwstr = function ( b , i ) { var len = 2 * _ _readUInt32LE ( b , i ) ; return len > 0 ? cptable . utils . decode ( 1200 , b . slice ( i + 4 , i + 4 + len - 1 ) ) : "" ; } ;
2017-04-16 07:35:56 +00:00
_ _lpp4 = function ( b , i ) { var len = _ _readUInt32LE ( b , i ) ; return len > 0 ? cptable . utils . decode ( 1200 , b . slice ( i + 4 , i + 4 + len ) ) : "" ; } ;
_ _8lpp4 = function ( b , i ) { var len = _ _readUInt32LE ( b , i ) ; return len > 0 ? cptable . utils . decode ( 65001 , b . slice ( i + 4 , i + 4 + len ) ) : "" ; } ;
2015-04-02 22:14:07 +00:00
}
2014-06-29 18:35:10 +00:00
2014-07-28 15:32:28 +00:00
var _ _readUInt8 = function ( b , idx ) { return b [ idx ] ; } ;
2018-02-08 19:13:10 +00:00
var _ _readUInt16LE = function ( b , idx ) { return ( b [ idx + 1 ] * ( 1 << 8 ) ) + b [ idx ] ; } ;
var _ _readInt16LE = function ( b , idx ) { var u = ( b [ idx + 1 ] * ( 1 << 8 ) ) + b [ idx ] ; return ( u < 0x8000 ) ? u : ( ( 0xffff - u + 1 ) * - 1 ) ; } ;
2014-07-28 15:32:28 +00:00
var _ _readUInt32LE = function ( b , idx ) { return b [ idx + 3 ] * ( 1 << 24 ) + ( b [ idx + 2 ] << 16 ) + ( b [ idx + 1 ] << 8 ) + b [ idx ] ; } ;
var _ _readInt32LE = function ( b , idx ) { return ( b [ idx + 3 ] << 24 ) | ( b [ idx + 2 ] << 16 ) | ( b [ idx + 1 ] << 8 ) | b [ idx ] ; } ;
2017-10-17 00:36:51 +00:00
var _ _readInt32BE = function ( b , idx ) { return ( b [ idx ] << 24 ) | ( b [ idx + 1 ] << 16 ) | ( b [ idx + 2 ] << 8 ) | b [ idx + 3 ] ; } ;
2014-01-28 16:35:26 +00:00
function ReadShift ( size , t ) {
2015-04-02 22:14:07 +00:00
var o = "" , oI , oR , oo = [ ] , w , vv , i , loc ;
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 19:13:10 +00:00
else for ( i = 0 ; i < size ; ++ i ) { o += String . fromCharCode ( _ _readUInt16LE ( this , loc ) ) ; loc += 2 ; }
2015-04-02 22:14:07 +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 07:48:52 +00:00
case 'wstr' :
if ( typeof cptable !== 'undefined' ) o = cptable . utils . decode ( current _codepage , this . slice ( this . l , this . l + 2 * size ) ) ;
else return ReadShift . call ( this , size , 'dbcs' ) ;
2017-03-11 00:01:58 +00:00
size = 2 * size ; break ;
2017-02-19 21:11:48 +00:00
2015-04-02 22:14:07 +00:00
/* [MS-OLEDS] 2.1.4 LengthPrefixedAnsiString */
2017-12-30 05:41:41 +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 ;
2015-04-02 22:14:07 +00:00
/* [MS-OLEDS] 2.1.5 LengthPrefixedUnicodeString */
2017-12-30 05:41:41 +00:00
case 'lpwstr' : o = _ _lpwstr ( this , this . l ) ; size = 4 + 2 * _ _readUInt32LE ( this , this . l ) ; break ;
2017-04-16 07:35:56 +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 ;
2015-04-02 22:14:07 +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:07:46 +00:00
case '_wstr' : size = 0 ; o = "" ;
2015-04-02 22:14:07 +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 19:13:10 +00:00
for ( i = 0 ; i < size ; ++ i ) {
2015-04-02 22:14:07 +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 05:21:43 +00:00
case 'cpstr' :
if ( typeof cptable !== 'undefined' ) {
o = cptable . utils . decode ( current _codepage , this . slice ( this . l , this . l + size ) ) ;
break ;
}
/* falls through */
2015-04-02 22:14:07 +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:36:51 +00:00
case 4 : case - 4 :
2018-02-08 19:13:10 +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-13 07:34:05 +00:00
else { oR = _ _readUInt32LE ( this , this . l ) ; this . l += 4 ; } return oR ;
2017-10-17 00:36:51 +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 ;
2015-04-02 22:14:07 +00:00
/* falls through */
case 16 : o = _ _hexlify ( this , this . l , size ) ; break ;
} }
2014-01-28 16:35:26 +00:00
this . l += size ; return o ;
}
2017-02-11 01:58:22 +00:00
var _ _writeUInt32LE = function ( b , val , idx ) { 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 , val , idx ) { b [ idx ] = ( val & 0xFF ) ; b [ idx + 1 ] = ( ( val >> 8 ) & 0xFF ) ; b [ idx + 2 ] = ( ( val >> 16 ) & 0xFF ) ; b [ idx + 3 ] = ( ( val >> 24 ) & 0xFF ) ; } ;
2017-09-30 06:19:01 +00:00
var _ _writeUInt16LE = function ( b , val , idx ) { b [ idx ] = ( val & 0xFF ) ; b [ idx + 1 ] = ( ( val >>> 8 ) & 0xFF ) ; } ;
2017-02-11 01:58:22 +00:00
2014-05-29 22:32:13 +00:00
function WriteShift ( t , val , f ) {
2017-03-13 07:34:05 +00:00
var size = 0 , i = 0 ;
2014-06-29 18:35:10 +00:00
if ( f === 'dbcs' ) {
2017-03-13 07:34:05 +00:00
for ( i = 0 ; i != val . length ; ++ i ) _ _writeUInt16LE ( this , val . charCodeAt ( i ) , this . l + 2 * i ) ;
2014-06-29 18:35:10 +00:00
size = 2 * val . length ;
2017-02-11 01:58:22 +00:00
} else if ( f === 'sbcs' ) {
2017-10-17 00:36:51 +00:00
/* TODO: codepage */
val = val . replace ( /[^\x00-\x7F]/g , "_" ) ;
2018-02-08 19:13:10 +00:00
for ( i = 0 ; i != val . length ; ++ i ) this [ this . l + i ] = ( val . charCodeAt ( i ) & 0xFF ) ;
2017-02-11 01:58:22 +00:00
size = val . length ;
2017-09-22 22:40:09 +00:00
} else if ( f === 'hex' ) {
for ( ; i < t ; ++ i ) {
2018-02-08 19:13:10 +00:00
this [ this . l ++ ] = ( parseInt ( val . slice ( 2 * i , 2 * i + 2 ) , 16 ) || 0 ) ;
2017-09-22 22:40:09 +00:00
} return this ;
} else if ( f === 'utf16le' ) {
2018-02-14 05:26:28 +00:00
var end = Math . min ( this . l + t , this . length ) ;
2017-09-22 22:40:09 +00:00
for ( i = 0 ; i < Math . min ( val . length , t ) ; ++ i ) {
var cc = val . charCodeAt ( i ) ;
2018-02-08 19:13:10 +00:00
this [ this . l ++ ] = ( cc & 0xff ) ;
this [ this . l ++ ] = ( cc >> 8 ) ;
2017-09-22 22:40:09 +00:00
}
while ( this . l < end ) this [ this . l ++ ] = 0 ;
return this ;
2017-03-13 07:34:05 +00:00
} else switch ( t ) {
2017-02-11 01:58:22 +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 ; }
2014-05-29 22:32:13 +00:00
/* falls through */
case 16 : break ;
2017-02-11 01:58:22 +00:00
case - 4 : size = 4 ; _ _writeInt32LE ( this , val , this . l ) ; break ;
2014-05-29 22:32:13 +00:00
}
this . l += size ; return this ;
}
2015-04-02 22:14:07 +00:00
function CheckField ( hexstr , fld ) {
var m = _ _hexlify ( this , this . l , hexstr . length >> 1 ) ;
2017-09-30 06:19:01 +00:00
if ( m !== hexstr ) throw new Error ( fld + 'Expected ' + hexstr + ' saw ' + m ) ;
2015-04-02 22:14:07 +00:00
this . l += hexstr . length >> 1 ;
}
2014-06-29 18:35:10 +00:00
function prep _blob ( blob , pos ) {
2014-07-28 15:32:28 +00:00
blob . l = pos ;
2014-06-29 18:35:10 +00:00
blob . read _shift = ReadShift ;
2015-04-02 22:14:07 +00:00
blob . chk = CheckField ;
2014-06-29 18:35:10 +00:00
blob . write _shift = WriteShift ;
2014-01-28 16:35:26 +00:00
}
function parsenoop ( blob , length ) { blob . l += length ; }
2014-05-29 22:32:13 +00:00
2014-06-29 18:35:10 +00:00
function new _buf ( sz ) {
2015-04-02 22:14:07 +00:00
var o = new _raw _buf ( sz ) ;
2014-06-29 18:35:10 +00:00
prep _blob ( o , 0 ) ;
2014-05-29 22:32:13 +00:00
return o ;
2014-06-29 18:35:10 +00:00
}
2014-05-29 22:32:13 +00:00
2014-01-28 16:35:26 +00:00
/* [MS-XLSB] 2.1.4 Record */
2014-06-29 18:35:10 +00:00
function recordhopper ( data , cb , opts ) {
2017-02-11 01:58:22 +00:00
if ( ! data ) return ;
2014-01-29 06:03:34 +00:00
var tmpbyte , cntbyte , length ;
2014-01-28 16:35:26 +00:00
prep _blob ( data , data . l || 0 ) ;
2017-04-09 04:07:43 +00:00
var L = data . length , RT = 0 , tgt = 0 ;
while ( data . l < L ) {
RT = data . read _shift ( 1 ) ;
2014-01-28 16:35:26 +00:00
if ( RT & 0x80 ) RT = ( RT & 0x7F ) + ( ( data . read _shift ( 1 ) & 0x7F ) << 7 ) ;
2015-04-02 22:14:07 +00:00
var R = XLSBRecordEnum [ RT ] || XLSBRecordEnum [ 0xFFFF ] ;
2014-02-12 06:19:45 +00:00
tmpbyte = data . read _shift ( 1 ) ;
length = tmpbyte & 0x7F ;
2014-01-28 16:35:26 +00:00
for ( cntbyte = 1 ; cntbyte < 4 && ( tmpbyte & 0x80 ) ; ++ cntbyte ) length += ( ( tmpbyte = data . read _shift ( 1 ) ) & 0x7F ) << ( 7 * cntbyte ) ;
2017-04-09 04:07:43 +00:00
tgt = data . l + length ;
2017-09-22 22:40:09 +00:00
var d = ( R . f || parsenoop ) ( data , length , opts ) ;
2017-04-03 06:04:35 +00:00
data . l = tgt ;
2017-04-09 04:07:43 +00:00
if ( cb ( d , R . n , RT ) ) return ;
2014-01-28 16:35:26 +00:00
}
2014-06-29 18:35:10 +00:00
}
2014-02-12 06:19:45 +00:00
2014-05-16 00:16:51 +00:00
/* control buffer usage for fixed-length buffers */
2014-06-29 18:35:10 +00:00
function buf _array ( ) {
2017-11-15 18:50:04 +00:00
var bufs = [ ] , blksz = has _buf ? 256 : 2048 ;
2014-06-29 18:35:10 +00:00
var newblk = function ba _newblk ( sz ) {
2017-03-13 07:34:05 +00:00
var o = ( new _buf ( sz ) ) ;
2014-06-29 18:35:10 +00:00
prep _blob ( o , 0 ) ;
2014-05-29 22:32:13 +00:00
return o ;
} ;
2014-06-29 18:35:10 +00:00
var curbuf = newblk ( blksz ) ;
2014-05-29 22:32:13 +00:00
2014-06-29 18:35:10 +00:00
var endbuf = function ba _endbuf ( ) {
2017-02-11 01:58:22 +00:00
if ( ! curbuf ) return ;
2018-02-08 19:13:10 +00:00
if ( curbuf . length > curbuf . l ) { curbuf = curbuf . slice ( 0 , curbuf . l ) ; curbuf . l = curbuf . length ; }
2014-05-29 22:32:13 +00:00
if ( curbuf . length > 0 ) bufs . push ( curbuf ) ;
curbuf = null ;
} ;
2014-06-29 18:35:10 +00:00
var next = function ba _next ( sz ) {
2018-02-08 19:13:10 +00:00
if ( curbuf && ( sz < ( curbuf . length - curbuf . l ) ) ) return curbuf ;
2014-05-29 22:32:13 +00:00
endbuf ( ) ;
return ( curbuf = newblk ( Math . max ( sz + 1 , blksz ) ) ) ;
} ;
2014-06-29 18:35:10 +00:00
var end = function ba _end ( ) {
2014-05-29 22:32:13 +00:00
endbuf ( ) ;
return _ _toBuffer ( [ bufs ] ) ;
} ;
2018-02-08 19:13:10 +00:00
var push = function ba _push ( buf ) { endbuf ( ) ; curbuf = buf ; if ( curbuf . l == null ) curbuf . l = curbuf . length ; next ( blksz ) ; } ;
2014-05-29 22:32:13 +00:00
2017-02-11 01:58:22 +00:00
return ( { next : next , push : push , end : end , _bufs : bufs } ) ;
2014-06-29 18:35:10 +00:00
}
2014-05-29 22:32:13 +00:00
2014-06-29 18:35:10 +00:00
function write _record ( ba , type , payload , length ) {
2017-09-22 22:40:09 +00:00
var t = + XLSBRE [ type ] , l ;
2017-02-11 01:58:22 +00:00
if ( isNaN ( t ) ) return ; // TODO: throw something here?
2015-04-02 22:14:07 +00:00
if ( ! length ) length = XLSBRecordEnum [ t ] . p || ( payload || [ ] ) . length || 0 ;
2017-12-30 05:41:41 +00:00
l = 1 + ( t >= 0x80 ? 1 : 0 ) + 1 /* + length*/ ;
2014-05-29 22:32:13 +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 > 0 && is _buf ( payload ) ) ba . push ( payload ) ;
2014-06-29 18:35:10 +00:00
}
2015-04-02 22:14:07 +00:00
/* XLS ranges enforced */
2017-02-19 21:11:48 +00:00
function shift _cell _xls ( cell , tgt , opts ) {
var out = dup ( cell ) ;
2015-04-02 22:14:07 +00:00
if ( tgt . s ) {
2017-02-19 21:11:48 +00:00
if ( out . cRel ) out . c += tgt . s . c ;
if ( out . rRel ) out . r += tgt . s . r ;
2015-04-02 22:14:07 +00:00
} else {
2018-01-09 07:40:54 +00:00
if ( out . cRel ) out . c += tgt . c ;
if ( out . rRel ) out . r += tgt . r ;
2015-04-02 22:14:07 +00:00
}
2017-02-19 21:11:48 +00:00
if ( ! opts || opts . biff < 12 ) {
while ( out . c >= 0x100 ) out . c -= 0x100 ;
while ( out . r >= 0x10000 ) out . r -= 0x10000 ;
}
return out ;
2015-04-02 22:14:07 +00:00
}
2017-03-11 00:01:58 +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 ;
2015-04-02 22:14:07 +00:00
}
2018-02-21 06:20:15 +00:00
function encode _cell _xls ( c , biff ) {
if ( c . cRel && c . c < 0 ) { c = dup ( c ) ; c . c += ( biff > 8 ) ? 0x4000 : 0x100 ; }
if ( c . rRel && c . r < 0 ) { c = dup ( c ) ; c . r += ( biff > 8 ) ? 0x100000 : ( ( biff > 5 ) ? 0x10000 : 0x4000 ) ; }
2017-02-19 21:11:48 +00:00
var s = encode _cell ( c ) ;
if ( c . cRel === 0 ) s = fix _col ( s ) ;
if ( c . rRel === 0 ) s = fix _row ( s ) ;
return s ;
}
2017-03-11 00:01:58 +00:00
function encode _range _xls ( r , opts ) {
if ( r . s . r == 0 && ! r . s . rRel ) {
2018-02-21 06:20:15 +00:00
if ( r . e . r == ( opts . biff >= 12 ? 0xFFFFF : ( opts . biff >= 8 ? 0x10000 : 0x4000 ) ) && ! r . e . rRel ) {
2017-03-11 00:01:58 +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 ) {
2017-07-28 23:54:51 +00:00
if ( r . e . c == ( opts . biff >= 12 ? 0xFFFF : 0xFF ) && ! r . e . cRel ) {
2017-03-11 00:01:58 +00:00
return ( r . s . rRel ? "" : "$" ) + encode _row ( r . s . r ) + ":" + ( r . e . rRel ? "" : "$" ) + encode _row ( r . e . r ) ;
}
}
2018-02-21 06:20:15 +00:00
return encode _cell _xls ( r . s , opts . biff ) + ":" + encode _cell _xls ( r . e , opts . biff ) ;
2017-02-19 21:11:48 +00:00
}
2015-04-02 22:14:07 +00:00
var OFFCRYPTO = { } ;
2017-03-13 07:34:05 +00:00
2015-04-02 22:14:07 +00:00
var make _offcrypto = function ( O , _crypto ) {
var crypto ;
if ( typeof _crypto !== 'undefined' ) crypto = _crypto ;
else if ( typeof require !== 'undefined' ) {
2017-03-05 01:44:52 +00:00
try { crypto = require ( 'crypto' ) ; }
2015-04-02 22:14:07 +00:00
catch ( e ) { crypto = null ; }
}
O . rc4 = function ( key , data ) {
var S = new Array ( 256 ) ;
var c = 0 , i = 0 , j = 0 , t = 0 ;
for ( i = 0 ; i != 256 ; ++ i ) S [ i ] = i ;
for ( i = 0 ; i != 256 ; ++ i ) {
j = ( j + S [ i ] + ( key [ i % key . length ] ) . charCodeAt ( 0 ) ) & 255 ;
t = S [ i ] ; S [ i ] = S [ j ] ; S [ j ] = t ;
}
2017-03-13 07:34:05 +00:00
// $FlowIgnore
i = j = 0 ; var out = Buffer ( data . length ) ;
2015-04-02 22:14:07 +00:00
for ( c = 0 ; c != data . length ; ++ c ) {
i = ( i + 1 ) & 255 ;
j = ( j + S [ i ] ) % 256 ;
t = S [ i ] ; S [ i ] = S [ j ] ; S [ j ] = t ;
out [ c ] = ( data [ c ] ^ S [ ( S [ i ] + S [ j ] ) & 255 ] ) ;
}
return out ;
} ;
2017-02-11 01:58:22 +00:00
O . md5 = function ( hex ) {
if ( ! crypto ) throw new Error ( "Unsupported crypto" ) ;
return crypto . createHash ( 'md5' ) . update ( hex ) . digest ( 'hex' ) ;
} ;
2015-04-02 22:14:07 +00:00
} ;
2017-05-09 18:11:15 +00:00
/*global crypto:true */
2015-04-02 22:14:07 +00:00
make _offcrypto ( OFFCRYPTO , typeof crypto !== "undefined" ? crypto : undefined ) ;
2017-04-21 22:03:40 +00:00
function decode _row ( rowstr ) { return parseInt ( unfix _row ( rowstr ) , 10 ) - 1 ; }
function encode _row ( row ) { return "" + ( row + 1 ) ; }
function fix _row ( cstr ) { return cstr . replace ( /([A-Z]|^)(\d+)$/ , "$1$$$2" ) ; }
function unfix _row ( cstr ) { return cstr . replace ( /\$(\d+)$/ , "$1" ) ; }
function decode _col ( colstr ) { var c = unfix _col ( colstr ) , d = 0 , i = 0 ; for ( ; i !== c . length ; ++ i ) d = 26 * d + c . charCodeAt ( i ) - 64 ; return d - 1 ; }
function encode _col ( col ) { var s = "" ; for ( ++ col ; col ; col = Math . floor ( ( col - 1 ) / 26 ) ) s = String . fromCharCode ( ( ( col - 1 ) % 26 ) + 65 ) + s ; return s ; }
function fix _col ( cstr ) { return cstr . replace ( /^([A-Z])/ , "$$$1" ) ; }
function unfix _col ( cstr ) { return cstr . replace ( /^\$([A-Z])/ , "$1" ) ; }
function split _cell ( cstr ) { return cstr . replace ( /(\$?[A-Z]*)(\$?\d*)/ , "$1,$2" ) . split ( "," ) ; }
function decode _cell ( cstr ) { var splt = split _cell ( cstr ) ; return { c : decode _col ( splt [ 0 ] ) , r : decode _row ( splt [ 1 ] ) } ; }
function encode _cell ( cell ) { return encode _col ( cell . c ) + encode _row ( cell . r ) ; }
function decode _range ( range ) { var x = range . split ( ":" ) . map ( decode _cell ) ; return { s : x [ 0 ] , e : x [ x . length - 1 ] } ; }
function encode _range ( cs , ce ) {
if ( typeof ce === 'undefined' || typeof ce === 'number' ) {
return encode _range ( cs . s , cs . e ) ;
}
if ( typeof cs !== 'string' ) cs = encode _cell ( ( cs ) ) ;
if ( typeof ce !== 'string' ) ce = encode _cell ( ( ce ) ) ;
return cs == ce ? cs : cs + ":" + ce ;
}
function safe _decode _range ( 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 ;
if ( i === len || range . charCodeAt ( ++ i ) === 58 ) { o . e . c = o . s . c ; o . e . r = o . s . r ; return o ; }
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 , v ) {
var q = ( cell . t == 'd' && v instanceof Date ) ;
if ( cell . z != null ) try { return ( cell . w = SSF . format ( cell . z , q ? datenum ( v ) : v ) ) ; } catch ( e ) { }
2017-07-28 23:54:51 +00:00
try { return ( cell . w = SSF . format ( ( cell . XF || { } ) . numFmtId || ( q ? 14 : 0 ) , q ? datenum ( v ) : v ) ) ; } catch ( e ) { return '' + v ; }
2017-04-21 22:03:40 +00:00
}
function format _cell ( cell , v , o ) {
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 ;
2017-07-28 23:54:51 +00:00
if ( v == undefined ) return safe _format _cell ( cell , cell . v ) ;
return safe _format _cell ( cell , v ) ;
2017-04-21 22:03:40 +00:00
}
2017-03-25 22:38:26 +00:00
function sheet _to _workbook ( sheet , opts ) {
var n = opts && opts . sheet ? opts . sheet : "Sheet1" ;
var sheets = { } ; sheets [ n ] = sheet ;
return { SheetNames : [ n ] , Sheets : sheets } ;
}
2018-01-09 07:40:54 +00:00
function sheet _add _aoa ( _ws , data , opts ) {
2017-03-25 22:38:26 +00:00
var o = opts || { } ;
2018-01-09 07:40:54 +00:00
var dense = _ws ? Array . isArray ( _ws ) : o . dense ;
if ( DENSE != null && dense == null ) dense = DENSE ;
var ws = _ws || ( dense ? ( [ ] ) : ( { } ) ) ;
var _R = 0 , _C = 0 ;
if ( ws && o . origin != null ) {
if ( typeof o . origin == 'number' ) _R = o . origin ;
else {
var _origin = typeof o . origin == "string" ? decode _cell ( o . origin ) : o . origin ;
_R = _origin . r ; _C = _origin . c ;
}
}
2017-03-25 22:38:26 +00:00
var range = ( { s : { c : 10000000 , r : 10000000 } , e : { c : 0 , r : 0 } } ) ;
2018-01-09 07:40:54 +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 22:38:26 +00:00
for ( var R = 0 ; R != data . length ; ++ R ) {
2018-08-15 20:01:20 +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 22:38:26 +00:00
for ( var C = 0 ; C != data [ R ] . length ; ++ C ) {
if ( typeof data [ R ] [ C ] === 'undefined' ) continue ;
var cell = ( { v : data [ R ] [ C ] } ) ;
2017-05-11 18:57:52 +00:00
if ( Array . isArray ( cell . v ) ) { cell . f = data [ R ] [ C ] [ 1 ] ; cell . v = cell . v [ 0 ] ; }
2018-01-09 07:40:54 +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 ;
2017-05-11 18:57:52 +00:00
if ( cell . v === null ) { if ( cell . f ) cell . t = 'n' ; else if ( ! o . cellStubs ) continue ; else cell . t = 'z' ; }
2017-03-25 22:38:26 +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 ) {
cell . z = o . dateNF || SSF . _table [ 14 ] ;
2017-04-03 06:04:35 +00:00
if ( o . cellDates ) { cell . t = 'd' ; cell . w = SSF . format ( cell . z , datenum ( cell . v ) ) ; }
else { cell . t = 'n' ; cell . v = datenum ( cell . v ) ; cell . w = SSF . format ( cell . z , cell . v ) ; }
2017-03-25 22:38:26 +00:00
}
else cell . t = 's' ;
2018-01-09 07:40:54 +00:00
if ( dense ) {
if ( ! ws [ _ _R ] ) ws [ _ _R ] = [ ] ;
ws [ _ _R ] [ _ _C ] = cell ;
2017-04-09 04:07:43 +00:00
} else {
2018-01-09 07:40:54 +00:00
var cell _ref = encode _cell ( ( { c : _ _C , r : _ _R } ) ) ;
2017-04-09 04:07:43 +00:00
ws [ cell _ref ] = cell ;
}
2017-03-25 22:38:26 +00:00
}
}
if ( range . s . c < 10000000 ) ws [ '!ref' ] = encode _range ( range ) ;
return ws ;
}
2018-01-09 07:40:54 +00:00
function aoa _to _sheet ( data , opts ) { return sheet _add _aoa ( null , data , opts ) ; }
2017-03-25 22:38:26 +00:00
2017-05-09 18:11:15 +00:00
function write _UInt32LE ( x , o ) {
if ( ! o ) o = new _buf ( 4 ) ;
o . write _shift ( 4 , x ) ;
return o ;
}
/* [MS-XLSB] 2.5.168 */
function parse _XLWideString ( data ) {
var cchCharacters = data . read _shift ( 4 ) ;
return cchCharacters === 0 ? "" : data . read _shift ( cchCharacters , 'dbcs' ) ;
}
function write _XLWideString ( data , o ) {
var _null = false ; if ( o == null ) { _null = true ; o = new _buf ( 4 + 2 * data . length ) ; }
o . write _shift ( 4 , data . length ) ;
if ( data . length > 0 ) o . write _shift ( 0 , data , 'dbcs' ) ;
return _null ? o . slice ( 0 , o . l ) : o ;
}
2014-05-16 00:16:51 +00:00
2014-02-12 06:19:45 +00:00
/* [MS-XLSB] 2.5.143 */
2018-01-23 09:09:53 +00:00
function parse _StrRun ( data ) {
2014-02-12 06:19:45 +00:00
return { ich : data . read _shift ( 2 ) , ifnt : data . read _shift ( 2 ) } ;
2014-06-29 18:35:10 +00:00
}
2017-05-09 18:11:15 +00:00
function write _StrRun ( run , o ) {
if ( ! o ) o = new _buf ( 4 ) ;
o . write _shift ( 2 , run . ich || 0 ) ;
o . write _shift ( 2 , run . ifnt || 0 ) ;
return o ;
}
2014-02-12 06:19:45 +00:00
2018-02-14 05:26:28 +00:00
/* [MS-XLSB] 2.5.121 */
2014-06-29 18:35:10 +00:00
function parse _RichStr ( data , length ) {
2014-01-28 16:35:26 +00:00
var start = data . l ;
var flags = data . read _shift ( 1 ) ;
var str = parse _XLWideString ( data ) ;
2014-02-12 06:19:45 +00:00
var rgsStrRun = [ ] ;
2017-02-11 01:58:22 +00:00
var z = ( { t : str , h : str } ) ;
2014-06-29 18:35:10 +00:00
if ( ( flags & 1 ) !== 0 ) { /* fRichStr */
2014-01-28 16:35:26 +00:00
/* TODO: formatted string */
var dwSizeStrRun = data . read _shift ( 4 ) ;
2014-02-12 06:19:45 +00:00
for ( var i = 0 ; i != dwSizeStrRun ; ++ i ) rgsStrRun . push ( parse _StrRun ( data ) ) ;
2014-06-29 18:35:10 +00:00
z . r = rgsStrRun ;
2014-01-28 16:35:26 +00:00
}
2017-04-03 06:04:35 +00:00
else z . r = [ { ich : 0 , ifnt : 0 } ] ;
2017-03-31 21:50:32 +00:00
//if((flags & 2) !== 0) { /* fExtStr */
// /* TODO: phonetic string */
//}
2014-01-28 16:35:26 +00:00
data . l = start + length ;
return z ;
2014-06-29 18:35:10 +00:00
}
2014-07-28 15:32:28 +00:00
function write _RichStr ( str , o ) {
/* TODO: formatted string */
2017-04-03 06:04:35 +00:00
var _null = false ; if ( o == null ) { _null = true ; o = new _buf ( 15 + 4 * str . t . length ) ; }
2014-07-28 15:32:28 +00:00
o . write _shift ( 1 , 0 ) ;
write _XLWideString ( str . t , o ) ;
2017-04-03 06:04:35 +00:00
return _null ? o . slice ( 0 , o . l ) : o ;
2014-07-28 15:32:28 +00:00
}
2018-02-14 05:26:28 +00:00
/* [MS-XLSB] 2.4.328 BrtCommentText (RichStr w/1 run) */
2017-05-09 18:11:15 +00:00
var parse _BrtCommentText = parse _RichStr ;
function write _BrtCommentText ( str , o ) {
/* TODO: formatted string */
var _null = false ; if ( o == null ) { _null = true ; o = new _buf ( 23 + 4 * str . t . length ) ; }
o . write _shift ( 1 , 1 ) ;
write _XLWideString ( str . t , o ) ;
o . write _shift ( 4 , 1 ) ;
write _StrRun ( { ich : 0 , ifnt : 0 } , o ) ;
return _null ? o . slice ( 0 , o . l ) : o ;
}
2014-01-28 16:35:26 +00:00
/* [MS-XLSB] 2.5.9 */
2015-04-02 22:14:07 +00:00
function parse _XLSBCell ( data ) {
2014-01-28 16:35:26 +00:00
var col = data . read _shift ( 4 ) ;
var iStyleRef = data . read _shift ( 2 ) ;
iStyleRef += data . read _shift ( 1 ) << 16 ;
2018-01-23 09:09:53 +00:00
data . l ++ ; //var fPhShow = data.read_shift(1);
2014-01-31 11:55:29 +00:00
return { c : col , iStyleRef : iStyleRef } ;
2014-01-28 16:35:26 +00:00
}
2015-04-02 22:14:07 +00:00
function write _XLSBCell ( cell , o ) {
2014-07-28 15:32:28 +00:00
if ( o == null ) o = new _buf ( 8 ) ;
o . write _shift ( - 4 , cell . c ) ;
2017-02-11 01:58:22 +00:00
o . write _shift ( 3 , cell . iStyleRef || cell . s ) ;
2014-07-28 15:32:28 +00:00
o . write _shift ( 1 , 0 ) ; /* fPhShow */
return o ;
}
2014-01-28 16:35:26 +00:00
/* [MS-XLSB] 2.5.21 */
2017-03-31 21:50:32 +00:00
var parse _XLSBCodeName = parse _XLWideString ;
var write _XLSBCodeName = write _XLWideString ;
2014-01-28 16:35:26 +00:00
2014-05-29 22:32:13 +00:00
/* [MS-XLSB] 2.5.166 */
2014-06-29 18:35:10 +00:00
function parse _XLNullableWideString ( data ) {
2014-05-29 22:32:13 +00:00
var cchCharacters = data . read _shift ( 4 ) ;
2014-06-29 18:35:10 +00:00
return cchCharacters === 0 || cchCharacters === 0xFFFFFFFF ? "" : data . read _shift ( cchCharacters , 'dbcs' ) ;
}
function write _XLNullableWideString ( data , o ) {
2017-04-03 06:04:35 +00:00
var _null = false ; if ( o == null ) { _null = true ; o = new _buf ( 127 ) ; }
2014-06-29 18:35:10 +00:00
o . write _shift ( 4 , data . length > 0 ? data . length : 0xFFFFFFFF ) ;
if ( data . length > 0 ) o . write _shift ( 0 , data , 'dbcs' ) ;
2017-04-03 06:04:35 +00:00
return _null ? o . slice ( 0 , o . l ) : o ;
2014-06-29 18:35:10 +00:00
}
2014-05-29 22:32:13 +00:00
2017-02-19 21:11:48 +00:00
/* [MS-XLSB] 2.5.165 */
var parse _XLNameWideString = parse _XLWideString ;
2018-01-23 09:09:53 +00:00
//var write_XLNameWideString = write_XLWideString;
2017-02-19 21:11:48 +00:00
2014-01-28 16:35:26 +00:00
/* [MS-XLSB] 2.5.114 */
2014-05-29 22:32:13 +00:00
var parse _RelID = parse _XLNullableWideString ;
var write _RelID = write _XLNullableWideString ;
2014-01-28 16:35:26 +00:00
2018-02-14 05:26:28 +00:00
/* [MS-XLS] 2.5.217 ; [MS-XLSB] 2.5.122 */
2014-01-28 16:35:26 +00:00
function parse _RkNumber ( data ) {
var b = data . slice ( data . l , data . l + 4 ) ;
2018-02-08 19:13:10 +00:00
var fX100 = ( b [ 0 ] & 1 ) , fInt = ( b [ 0 ] & 2 ) ;
2014-01-28 16:35:26 +00:00
data . l += 4 ;
2015-04-02 22:14:07 +00:00
b [ 0 ] &= 0xFC ; // b[0] &= ~3;
2014-07-28 15:32:28 +00:00
var RK = fInt === 0 ? _ _double ( [ 0 , 0 , 0 , 0 , b [ 0 ] , b [ 1 ] , b [ 2 ] , b [ 3 ] ] , 0 ) : _ _readInt32LE ( b , 0 ) >> 2 ;
2018-02-08 19:13:10 +00:00
return fX100 ? ( RK / 100 ) : RK ;
2014-01-28 16:35:26 +00:00
}
2017-02-04 00:14:24 +00:00
function write _RkNumber ( data , o ) {
if ( o == null ) o = new _buf ( 4 ) ;
var fX100 = 0 , fInt = 0 , d100 = data * 100 ;
2018-02-08 19:13:10 +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 ; }
2017-02-04 00:14:24 +00:00
if ( fInt ) o . write _shift ( - 4 , ( ( fX100 ? d100 : data ) << 2 ) + ( fX100 + 2 ) ) ;
else throw new Error ( "unsupported RkNumber " + data ) ; // TODO
}
2014-01-28 16:35:26 +00:00
2017-02-19 21:11:48 +00:00
/* [MS-XLSB] 2.5.117 RfX */
2017-07-05 21:02:14 +00:00
function parse _RfX ( data ) {
2017-02-11 01:58:22 +00:00
var cell = ( { s : { } , e : { } } ) ;
2014-01-28 16:35:26 +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 ;
2014-06-29 18:35:10 +00:00
}
2017-02-19 21:11:48 +00:00
function write _RfX ( r , o ) {
2014-05-29 22:32:13 +00:00
if ( ! o ) o = new _buf ( 16 ) ;
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 ;
2014-06-29 18:35:10 +00:00
}
2014-01-28 16:35:26 +00:00
2017-02-19 21:11:48 +00:00
/* [MS-XLSB] 2.5.153 UncheckedRfX */
var parse _UncheckedRfX = parse _RfX ;
var write _UncheckedRfX = write _RfX ;
2018-02-14 05:26:28 +00:00
/* [MS-XLS] 2.5.342 ; [MS-XLSB] 2.5.171 */
2017-02-04 00:14:24 +00:00
/* TODO: error checking, NaN and Infinity values are not valid Xnum */
2018-01-23 09:09:53 +00:00
function parse _Xnum ( data ) { return data . read _shift ( 8 , 'f' ) ; }
2017-02-04 00:14:24 +00:00
function write _Xnum ( data , o ) { return ( o || new _buf ( 8 ) ) . write _shift ( 8 , data , 'f' ) ; }
2014-01-28 16:35:26 +00:00
2018-02-14 05:26:28 +00:00
/* [MS-XLSB] 2.5.97.2 */
2014-01-28 16:35:26 +00:00
var BErr = {
2017-02-11 01:58:22 +00:00
0x00 : "#NULL!" ,
0x07 : "#DIV/0!" ,
0x0F : "#VALUE!" ,
0x17 : "#REF!" ,
0x1D : "#NAME?" ,
0x24 : "#NUM!" ,
0x2A : "#N/A" ,
0x2B : "#GETTING_DATA" ,
0xFF : "#WTF?"
2014-01-28 16:35:26 +00:00
} ;
2014-06-29 18:35:10 +00:00
var RBErr = evert _num ( BErr ) ;
2014-01-28 16:35:26 +00:00
2018-02-14 05:26:28 +00:00
/* [MS-XLSB] 2.4.324 BrtColor */
2018-01-23 09:09:53 +00:00
function parse _BrtColor ( data ) {
2014-03-29 02:12:07 +00:00
var out = { } ;
2014-06-29 18:35:10 +00:00
var d = data . read _shift ( 1 ) ;
2017-05-09 18:11:15 +00:00
2018-01-23 09:09:53 +00:00
//var fValidRGB = d & 1;
2017-05-09 18:11:15 +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:09:53 +00:00
data . l ++ ; //var bAlpha = data.read_shift(1);
2017-05-09 18:11:15 +00:00
switch ( xColorType ) {
case 0 : out . auto = 1 ; break ;
case 1 :
out . index = index ;
var icv = XLSIcv [ index ] ;
/* automatic pseudo index 81 */
2017-07-28 23:54:51 +00:00
if ( icv ) out . rgb = rgb2Hex ( icv ) ;
2017-05-09 18:11:15 +00:00
break ;
case 2 :
/* if(!fValidRGB) throw new Error("invalid"); */
2017-07-28 23:54:51 +00:00
out . rgb = rgb2Hex ( [ bR , bG , bB ] ) ;
2017-05-09 18:11:15 +00:00
break ;
case 3 : out . theme = index ; break ;
}
if ( nTS != 0 ) out . tint = nTS > 0 ? nTS / 32767 : nTS / 32768 ;
return out ;
}
function write _BrtColor ( color , o ) {
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 ) {
o . write _shift ( 1 , 0x02 ) ;
o . write _shift ( 1 , color . index ) ;
} else if ( color . theme ) {
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 ;
if ( nTS > 0 ) nTS *= 32767 ;
else if ( nTS < 0 ) nTS *= 32768 ;
o . write _shift ( 2 , nTS ) ;
if ( ! color . rgb ) {
o . write _shift ( 2 , 0 ) ;
o . write _shift ( 1 , 0 ) ;
o . write _shift ( 1 , 0 ) ;
} else {
var rgb = ( color . rgb || 'FFFFFF' ) ;
2018-01-23 09:09:53 +00:00
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:11:15 +00:00
o . write _shift ( 1 , 0xFF ) ;
}
return o ;
2014-03-29 02:12:07 +00:00
}
2014-05-29 22:32:13 +00:00
/* [MS-XLSB] 2.5.52 */
2018-01-23 09:09:53 +00:00
function parse _FontFlags ( data ) {
2014-03-29 02:12:07 +00:00
var d = data . read _shift ( 1 ) ;
data . l ++ ;
var out = {
2017-05-09 18:11:15 +00:00
/* fBold: d & 0x01 */
fItalic : d & 0x02 ,
/* fUnderline: d & 0x04 */
fStrikeout : d & 0x08 ,
2014-03-29 02:12:07 +00:00
fOutline : d & 0x10 ,
fShadow : d & 0x20 ,
fCondense : d & 0x40 ,
2014-05-17 18:52:07 +00:00
fExtend : d & 0x80
2014-03-29 02:12:07 +00:00
} ;
return out ;
}
2017-05-09 18:11:15 +00:00
function write _FontFlags ( font , o ) {
if ( ! o ) o = new _buf ( 2 ) ;
var grbit =
( font . italic ? 0x02 : 0 ) |
( font . strike ? 0x08 : 0 ) |
( font . outline ? 0x10 : 0 ) |
( font . shadow ? 0x20 : 0 ) |
( font . condense ? 0x40 : 0 ) |
( font . extend ? 0x80 : 0 ) ;
o . write _shift ( 1 , grbit ) ;
o . write _shift ( 1 , 0 ) ;
return o ;
}
2017-12-30 05:41:41 +00:00
/* [MS-OLEDS] 2.3.1 and 2.3.2 */
function parse _ClipboardFormatOrString ( o , w ) {
// $FlowIgnore
var ClipFmt = { 2 : "BITMAP" , 3 : "METAFILEPICT" , 8 : "DIB" , 14 : "ENHMETAFILE" } ;
var m = o . read _shift ( 4 ) ;
switch ( m ) {
case 0x00000000 : return "" ;
case 0xffffffff : case 0xfffffffe : return ClipFmt [ o . read _shift ( 4 ) ] || "" ;
}
if ( m > 0x190 ) throw new Error ( "Unsupported Clipboard: " + m . toString ( 16 ) ) ;
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 ) ; }
2015-04-02 22:14:07 +00:00
/* [MS-OLEPS] 2.2 PropertyType */
2017-10-17 00:36:51 +00:00
//var VT_EMPTY = 0x0000;
//var VT_NULL = 0x0001;
var VT _I2 = 0x0002 ;
var VT _I4 = 0x0003 ;
//var VT_R4 = 0x0004;
//var VT_R8 = 0x0005;
//var VT_CY = 0x0006;
//var VT_DATE = 0x0007;
//var VT_BSTR = 0x0008;
//var VT_ERROR = 0x000A;
var VT _BOOL = 0x000B ;
var VT _VARIANT = 0x000C ;
//var VT_DECIMAL = 0x000E;
//var VT_I1 = 0x0010;
//var VT_UI1 = 0x0011;
//var VT_UI2 = 0x0012;
var VT _UI4 = 0x0013 ;
//var VT_I8 = 0x0014;
2018-01-23 09:09:53 +00:00
//var VT_UI8 = 0x0015;
2017-10-17 00:36:51 +00:00
//var VT_INT = 0x0016;
//var VT_UINT = 0x0017;
var VT _LPSTR = 0x001E ;
//var VT_LPWSTR = 0x001F;
var VT _FILETIME = 0x0040 ;
2018-02-21 06:20:15 +00:00
var VT _BLOB = 0x0041 ;
2017-10-17 00:36:51 +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;
var VT _CF = 0x0047 ;
//var VT_CLSID = 0x0048;
//var VT_VERSIONED_STREAM = 0x0049;
var VT _VECTOR = 0x1000 ;
//var VT_ARRAY = 0x2000;
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 ] ;
2015-04-02 22:14:07 +00:00
/* [MS-OSHARED] 2.3.3.2.2.1 Document Summary Information PIDDSI */
var DocSummaryPIDDSI = {
2017-02-11 01:58:22 +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:42:56 +00:00
0x0b : { n : 'ScaleCrop' , t : VT _BOOL } ,
0x0c : { n : 'HeadingPairs' , t : VT _VECTOR | VT _VARIANT } ,
0x0d : { n : 'TitlesOfParts' , t : VT _VECTOR | VT _LPSTR } ,
2017-02-11 01:58:22 +00:00
0x0e : { n : 'Manager' , t : VT _STRING } ,
0x0f : { n : 'Company' , t : VT _STRING } ,
2018-05-05 06:42:56 +00:00
0x10 : { n : 'LinksUpToDate' , t : VT _BOOL } ,
2017-02-11 01:58:22 +00:00
0x11 : { n : 'CharacterCount' , t : VT _I4 } ,
0x13 : { n : 'SharedDoc' , t : VT _BOOL } ,
2018-05-05 06:42:56 +00:00
0x16 : { n : 'HyperlinksChanged' , t : VT _BOOL } ,
2017-02-11 01:58:22 +00:00
0x17 : { n : 'AppVersion' , t : VT _I4 , p : 'version' } ,
2018-02-21 06:20:15 +00:00
0x18 : { n : 'DigSig' , t : VT _BLOB } ,
2017-02-11 01:58:22 +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 } ,
0xFF : { }
2015-04-02 22:14:07 +00:00
} ;
/* [MS-OSHARED] 2.3.3.2.1.1 Summary Information Property Set PIDSI */
var SummaryPIDSI = {
2017-02-11 01:58:22 +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:42:56 +00:00
0x12 : { n : 'Application' , t : VT _STRING } ,
0x13 : { n : 'DocSecurity' , t : VT _I4 } ,
2017-02-11 01:58:22 +00:00
0xFF : { }
2015-04-02 22:14:07 +00:00
} ;
/* [MS-OLEPS] 2.18 */
var SpecialProperties = {
2017-02-11 01:58:22 +00:00
0x80000000 : { n : 'Locale' , t : VT _UI4 } ,
0x80000003 : { n : 'Behavior' , t : VT _UI4 } ,
0x72627262 : { }
2015-04-02 22:14:07 +00:00
} ;
( function ( ) {
for ( var y in SpecialProperties ) if ( SpecialProperties . hasOwnProperty ( y ) )
DocSummaryPIDDSI [ y ] = SummaryPIDSI [ y ] = SpecialProperties [ y ] ;
} ) ( ) ;
2018-05-05 06:42:56 +00:00
var DocSummaryRE = evert _key ( DocSummaryPIDDSI , "n" ) ;
var SummaryRE = evert _key ( SummaryPIDSI , "n" ) ;
2015-04-02 22:14:07 +00:00
/* [MS-XLS] 2.4.63 Country/Region codes */
var CountryEnum = {
2017-02-11 01:58:22 +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
2015-04-02 22:14:07 +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'
] ;
function rgbify ( arr ) { return arr . map ( function ( x ) { return [ ( x >> 16 ) & 255 , ( x >> 8 ) & 255 , x & 255 ] ; } ) ; }
/* [MS-XLS] 2.5.161 */
2018-02-14 05:26:28 +00:00
/* [MS-XLSB] 2.5.75 Icv */
2015-04-02 22:14:07 +00:00
var XLSIcv = rgbify ( [
/* Color Constants */
0x000000 ,
0xFFFFFF ,
0xFF0000 ,
0x00FF00 ,
0x0000FF ,
0xFFFF00 ,
0xFF00FF ,
0x00FFFF ,
2017-05-09 18:11:15 +00:00
/* Overridable Defaults */
2015-04-02 22:14:07 +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:11:15 +00:00
/* Other entries to appease BIFF8/12 */
0xFFFFFF , /* 0x40 icvForeground ?? */
0x000000 , /* 0x41 icvBackground ?? */
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 ?? */
2015-04-02 22:14:07 +00:00
] ) ;
2014-05-16 00:16:51 +00:00
/* Parts enumerated in OPC spec, MS-XLSB and MS-XLSX */
/* 12.3 Part Summary <SpreadsheetML> */
/* 14.2 Part Summary <DrawingML> */
2018-02-14 05:26:28 +00:00
/* [MS-XLSX] 2.1 Part Enumerations ; [MS-XLSB] 2.1.7 Part Enumeration */
2017-02-11 01:58:22 +00:00
var ct2type /*{[string]:string}*/ = ( {
2014-05-16 00:16:51 +00:00
/* Workbook */
"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml" : "workbooks" ,
2014-04-23 01:21:59 +00:00
2014-05-16 00:16:51 +00:00
/* Worksheet */
"application/vnd.ms-excel.binIndexWs" : "TODO" , /* Binary Index */
2014-01-22 05:02:45 +00:00
2014-05-16 00:16:51 +00:00
/* Macrosheet */
"application/vnd.ms-excel.intlmacrosheet" : "TODO" ,
"application/vnd.ms-excel.binIndexMs" : "TODO" , /* Binary Index */
2014-01-22 05:02:45 +00:00
2014-05-16 00:16:51 +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" ,
2014-01-22 05:02:45 +00:00
2014-05-16 00:16:51 +00:00
/* Custom Data Properties */
"application/vnd.openxmlformats-officedocument.customXmlProperties+xml" : "TODO" ,
2017-03-28 22:07:46 +00:00
"application/vnd.openxmlformats-officedocument.spreadsheetml.customProperty" : "TODO" ,
2014-01-22 05:02:45 +00:00
2014-05-16 00:16:51 +00:00
/* PivotTable */
"application/vnd.ms-excel.pivotTable" : "TODO" ,
"application/vnd.openxmlformats-officedocument.spreadsheetml.pivotTable+xml" : "TODO" ,
2014-01-22 05:02:45 +00:00
2017-02-19 21:11:48 +00:00
/* Chart Colors */
"application/vnd.ms-office.chartcolorstyle+xml" : "TODO" ,
/* Chart Style */
"application/vnd.ms-office.chartstyle+xml" : "TODO" ,
2014-05-16 00:16:51 +00:00
/* Calculation Chain */
"application/vnd.ms-excel.calcChain" : "calcchains" ,
"application/vnd.openxmlformats-officedocument.spreadsheetml.calcChain+xml" : "calcchains" ,
2014-01-22 05:02:45 +00:00
2014-05-16 00:16:51 +00:00
/* Printer Settings */
"application/vnd.openxmlformats-officedocument.spreadsheetml.printerSettings" : "TODO" ,
2014-01-22 05:02:45 +00:00
2014-05-16 00:16:51 +00:00
/* ActiveX */
"application/vnd.ms-office.activeX" : "TODO" ,
"application/vnd.ms-office.activeX+xml" : "TODO" ,
2014-01-22 05:02:45 +00:00
2014-05-16 00:16:51 +00:00
/* Custom Toolbars */
"application/vnd.ms-excel.attachedToolbars" : "TODO" ,
2014-01-22 05:02:45 +00:00
2014-05-16 00:16:51 +00:00
/* External Data Connections */
"application/vnd.ms-excel.connections" : "TODO" ,
"application/vnd.openxmlformats-officedocument.spreadsheetml.connections+xml" : "TODO" ,
2014-01-22 05:02:45 +00:00
2014-05-16 00:16:51 +00:00
/* External Links */
2017-07-28 23:54:51 +00:00
"application/vnd.ms-excel.externalLink" : "links" ,
"application/vnd.openxmlformats-officedocument.spreadsheetml.externalLink+xml" : "links" ,
2012-12-03 19:47:44 +00:00
2014-05-16 00:16:51 +00:00
/* Metadata */
"application/vnd.ms-excel.sheetMetadata" : "TODO" ,
"application/vnd.openxmlformats-officedocument.spreadsheetml.sheetMetadata+xml" : "TODO" ,
2014-01-22 05:02:45 +00:00
2014-05-16 00:16:51 +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" ,
2014-04-23 01:21:59 +00:00
2014-05-16 00:16:51 +00:00
/* Query Table */
"application/vnd.ms-excel.queryTable" : "TODO" ,
"application/vnd.openxmlformats-officedocument.spreadsheetml.queryTable+xml" : "TODO" ,
2012-12-03 19:47:44 +00:00
2014-05-16 00:16:51 +00:00
/* 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" ,
2012-12-03 19:47:44 +00:00
2014-05-16 00:16:51 +00:00
/* Single Cell Table */
"application/vnd.ms-excel.tableSingleCells" : "TODO" ,
"application/vnd.openxmlformats-officedocument.spreadsheetml.tableSingleCells+xml" : "TODO" ,
2012-12-03 19:47:44 +00:00
2014-05-16 00:16:51 +00:00
/* 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" ,
2014-04-03 23:24:56 +00:00
/* 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-28 22:07:46 +00:00
/* Theme Override */
"application/vnd.openxmlformats-officedocument.themeOverride+xml" : "TODO" ,
2014-04-03 23:24:56 +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" ,
"application/vnd.ms-office.vbaProjectSignature" : "vba" ,
/* 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-09 04:07:43 +00:00
"application/vnd.openxmlformats-officedocument.drawing+xml" : "drawings" ,
2014-04-03 23:24:56 +00:00
"application/vnd.openxmlformats-officedocument.drawingml.chart+xml" : "TODO" ,
"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" ,
2014-05-16 00:16:51 +00:00
/* VML */
"application/vnd.openxmlformats-officedocument.vmlDrawing" : "TODO" ,
"application/vnd.openxmlformats-package.relationships+xml" : "rels" ,
"application/vnd.openxmlformats-officedocument.oleObject" : "TODO" ,
2017-03-28 22:07:46 +00:00
/* Image */
"image/png" : "TODO" ,
2014-05-16 00:16:51 +00:00
"sheet" : "js"
2017-02-11 01:58:22 +00:00
} ) ;
2014-05-16 00:16:51 +00:00
var CT _LIST = ( function ( ) {
var o = {
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" ,
2017-12-25 02:44:14 +00:00
xlam : "application/vnd.ms-excel.addin.macroEnabled.main+xml" ,
2014-05-16 00:16:51 +00:00
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"
} ,
2017-04-03 06:04:35 +00:00
comments : { /* Comments */
xlsx : "application/vnd.openxmlformats-officedocument.spreadsheetml.comments+xml" ,
xlsb : "application/vnd.ms-excel.comments"
} ,
2017-03-28 22:07:46 +00:00
sheets : { /* Worksheet */
2014-05-16 00:16:51 +00:00
xlsx : "application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml" ,
xlsb : "application/vnd.ms-excel.worksheet"
} ,
2017-03-28 22:07:46 +00:00
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"
} ,
styles : { /* Styles */
2014-05-16 00:16:51 +00:00
xlsx : "application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml" ,
xlsb : "application/vnd.ms-excel.styles"
}
} ;
2017-12-30 05:41:41 +00:00
keys ( o ) . forEach ( function ( k ) { [ "xlsm" , "xlam" ] . forEach ( function ( v ) { if ( ! o [ k ] [ v ] ) o [ k ] [ v ] = o [ k ] . xlsx ; } ) ; } ) ;
2014-05-16 00:16:51 +00:00
keys ( o ) . forEach ( function ( k ) { keys ( o [ k ] ) . forEach ( function ( v ) { ct2type [ o [ k ] [ v ] ] = k ; } ) ; } ) ;
return o ;
} ) ( ) ;
2017-02-11 01:58:22 +00:00
var type2ct /*{[string]:Array<string>}*/ = evert _arr ( ct2type ) ;
2014-05-16 00:16:51 +00:00
XMLNS . CT = 'http://schemas.openxmlformats.org/package/2006/content-types' ;
2017-07-28 23:54:51 +00:00
function new _ct ( ) {
return ( {
2017-03-28 22:07:46 +00:00
workbooks : [ ] , sheets : [ ] , charts : [ ] , dialogs : [ ] , macros : [ ] ,
2017-07-28 23:54:51 +00:00
rels : [ ] , strs : [ ] , comments : [ ] , links : [ ] ,
2017-03-28 22:07:46 +00:00
coreprops : [ ] , extprops : [ ] , custprops : [ ] , themes : [ ] , styles : [ ] ,
2017-04-09 04:07:43 +00:00
calcchains : [ ] , vba : [ ] , drawings : [ ] ,
2017-03-28 22:07:46 +00:00
TODO : [ ] , xmlns : "" } ) ;
2017-07-28 23:54:51 +00:00
}
2018-01-23 09:09:53 +00:00
function parse _ct ( data ) {
2017-07-28 23:54:51 +00:00
var ct = new _ct ( ) ;
2017-02-11 01:58:22 +00:00
if ( ! data || ! data . match ) return ct ;
var ctext = { } ;
2014-06-29 18:35:10 +00:00
( data . match ( tagregex ) || [ ] ) . forEach ( function ( x ) {
2014-05-16 00:16:51 +00:00
var y = parsexmltag ( x ) ;
2014-06-29 18:35:10 +00:00
switch ( y [ 0 ] . replace ( nsregex , "<" ) ) {
2014-05-16 00:16:51 +00:00
case '<?xml' : break ;
2014-05-22 12:09:29 +00:00
case '<Types' : ct . xmlns = y [ 'xmlns' + ( y [ 0 ] . match ( /<(\w+):/ ) || [ "" , "" ] ) [ 1 ] ] ; break ;
2014-05-16 00:16:51 +00:00
case '<Default' : ctext [ y . Extension ] = y . ContentType ; break ;
case '<Override' :
2014-06-29 18:35:10 +00:00
if ( ct [ ct2type [ y . ContentType ] ] !== undefined ) ct [ ct2type [ y . ContentType ] ] . push ( y . PartName ) ;
2014-05-16 00:16:51 +00:00
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 ;
}
var CTYPE _XML _ROOT = writextag ( 'Types' , null , {
'xmlns' : XMLNS . CT ,
'xmlns:xsd' : XMLNS . xsd ,
'xmlns:xsi' : XMLNS . xsi
} ) ;
var CTYPE _DEFAULTS = [
[ 'xml' , 'application/xml' ] ,
2014-05-29 22:32:13 +00:00
[ 'bin' , 'application/vnd.ms-excel.sheet.binary.macroEnabled.main' ] ,
2017-04-03 06:04:35 +00:00
[ 'vml' , 'application/vnd.openxmlformats-officedocument.vmlDrawing' ] ,
2017-03-28 22:07:46 +00:00
/* 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' ] ,
2014-05-16 00:16:51 +00:00
[ 'rels' , type2ct . rels [ 0 ] ]
] . map ( function ( x ) {
return writextag ( 'Default' , null , { 'Extension' : x [ 0 ] , 'ContentType' : x [ 1 ] } ) ;
} ) ;
function write _ct ( ct , opts ) {
var o = [ ] , v ;
2014-06-29 18:35:10 +00:00
o [ o . length ] = ( XML _HEADER ) ;
o [ o . length ] = ( CTYPE _XML _ROOT ) ;
2014-05-16 00:16:51 +00:00
o = o . concat ( CTYPE _DEFAULTS ) ;
var f1 = function ( w ) {
if ( ct [ w ] && ct [ w ] . length > 0 ) {
v = ct [ w ] [ 0 ] ;
2014-06-29 18:35:10 +00:00
o [ o . length ] = ( writextag ( 'Override' , null , {
2014-05-16 00:16:51 +00:00
'PartName' : ( v [ 0 ] == '/' ? "" : "/" ) + v ,
2014-05-16 03:03:55 +00:00
'ContentType' : CT _LIST [ w ] [ opts . bookType || 'xlsx' ]
2014-05-16 00:16:51 +00:00
} ) ) ;
}
} ;
var f2 = function ( w ) {
2017-04-09 04:07:43 +00:00
( ct [ w ] || [ ] ) . forEach ( function ( v ) {
2014-06-29 18:35:10 +00:00
o [ o . length ] = ( writextag ( 'Override' , null , {
2014-05-16 00:16:51 +00:00
'PartName' : ( v [ 0 ] == '/' ? "" : "/" ) + v ,
2014-05-16 03:03:55 +00:00
'ContentType' : CT _LIST [ w ] [ opts . bookType || 'xlsx' ]
2014-05-16 00:16:51 +00:00
} ) ) ;
} ) ;
} ;
var f3 = function ( t ) {
( ct [ t ] || [ ] ) . forEach ( function ( v ) {
2014-06-29 18:35:10 +00:00
o [ o . length ] = ( writextag ( 'Override' , null , {
2014-05-16 00:16:51 +00:00
'PartName' : ( v [ 0 ] == '/' ? "" : "/" ) + v ,
'ContentType' : type2ct [ t ] [ 0 ]
} ) ) ;
} ) ;
} ;
f1 ( 'workbooks' ) ;
f2 ( 'sheets' ) ;
2017-04-09 04:07:43 +00:00
f2 ( 'charts' ) ;
2014-05-16 03:03:55 +00:00
f3 ( 'themes' ) ;
2014-05-16 00:16:51 +00:00
[ 'strs' , 'styles' ] . forEach ( f1 ) ;
[ 'coreprops' , 'extprops' , 'custprops' ] . forEach ( f3 ) ;
2017-03-28 22:07:46 +00:00
f3 ( 'vba' ) ;
2017-04-09 04:07:43 +00:00
f3 ( 'comments' ) ;
f3 ( 'drawings' ) ;
2014-06-29 18:35:10 +00:00
if ( o . length > 2 ) { o [ o . length ] = ( '</Types>' ) ; o [ 1 ] = o [ 1 ] . replace ( "/>" , ">" ) ; }
2014-05-16 00:16:51 +00:00
return o . join ( "" ) ;
}
2017-03-28 22:07:46 +00:00
/* 9.3 Relationships */
2017-02-11 01:58:22 +00:00
var RELS = ( {
2014-05-16 00:16:51 +00:00
WB : "http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument" ,
2017-03-28 22:07:46 +00:00
SHEET : "http://sheetjs.openxmlformats.org/officeDocument/2006/relationships/officeDocument" ,
2017-03-31 21:50:32 +00:00
HLINK : "http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink" ,
2017-04-03 06:04:35 +00:00
VML : "http://schemas.openxmlformats.org/officeDocument/2006/relationships/vmlDrawing" ,
2017-03-28 22:07:46 +00:00
VBA : "http://schemas.microsoft.com/office/2006/relationships/vbaProject"
2017-02-11 01:58:22 +00:00
} ) ;
2014-05-16 00:16:51 +00:00
2017-03-28 22:07:46 +00:00
/* 9.3.3 Representing Relationships */
function get _rels _path ( file ) {
var n = file . lastIndexOf ( "/" ) ;
2018-01-23 09:09:53 +00:00
return file . slice ( 0 , n + 1 ) + '_rels/' + file . slice ( n + 1 ) + ".rels" ;
2017-03-28 22:07:46 +00:00
}
2014-05-16 00:16:51 +00:00
function parse _rels ( data , currentFilePath ) {
if ( ! data ) return data ;
if ( currentFilePath . charAt ( 0 ) !== '/' ) {
currentFilePath = '/' + currentFilePath ;
}
var rels = { } ;
var hash = { } ;
2017-02-11 01:58:22 +00:00
( data . match ( tagregex ) || [ ] ) . forEach ( function ( x ) {
2014-05-16 00:16:51 +00:00
var y = parsexmltag ( x ) ;
/* 9.3.2.2 OPC_Relationships */
if ( y [ 0 ] === '<Relationship' ) {
var rel = { } ; rel . Type = y . Type ; rel . Target = y . Target ; rel . Id = y . Id ; rel . TargetMode = y . TargetMode ;
2017-03-28 22:07:46 +00:00
var canonictarget = y . TargetMode === 'External' ? y . Target : resolve _path ( y . Target , currentFilePath ) ;
2014-05-16 00:16:51 +00:00
rels [ canonictarget ] = rel ;
hash [ y . Id ] = rel ;
}
} ) ;
rels [ "!id" ] = hash ;
return rels ;
}
XMLNS . RELS = 'http://schemas.openxmlformats.org/package/2006/relationships' ;
var RELS _ROOT = writextag ( 'Relationships' , null , {
//'xmlns:ns0': XMLNS.RELS,
'xmlns' : XMLNS . RELS
} ) ;
/* TODO */
function write _rels ( rels ) {
2017-04-09 04:07:43 +00:00
var o = [ XML _HEADER , RELS _ROOT ] ;
keys ( rels [ '!id' ] ) . forEach ( function ( rid ) {
o [ o . length ] = ( writextag ( 'Relationship' , null , rels [ '!id' ] [ rid ] ) ) ;
2014-05-16 00:16:51 +00:00
} ) ;
2014-06-29 18:35:10 +00:00
if ( o . length > 2 ) { o [ o . length ] = ( '</Relationships>' ) ; o [ 1 ] = o [ 1 ] . replace ( "/>" , ">" ) ; }
2014-05-16 00:16:51 +00:00
return o . join ( "" ) ;
}
2017-03-31 21:50:32 +00:00
function add _rels ( rels , rId , f , type , relobj ) {
if ( ! relobj ) relobj = { } ;
if ( ! rels [ '!id' ] ) rels [ '!id' ] = { } ;
2017-05-09 18:11:15 +00:00
if ( rId < 0 ) for ( rId = 1 ; rels [ '!id' ] [ 'rId' + rId ] ; ++ rId ) { /* empty */ }
2017-03-31 21:50:32 +00:00
relobj . Id = 'rId' + rId ;
relobj . Type = type ;
relobj . Target = f ;
if ( relobj . Type == RELS . HLINK ) relobj . TargetMode = "External" ;
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 00:36:03 +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:09:53 +00:00
function write _manifest ( manifest ) {
2017-03-10 00:36:03 +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 , res , tag ) {
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 , file ) {
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:09:53 +00:00
function write _rdf ( rdf ) {
2017-03-10 00:36:03 +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 18:57:52 +00:00
/* TODO: pull properties */
var write _meta _ods = ( function ( ) {
var payload = '<?xml version="1.0" encoding="UTF-8" standalone="yes"?><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>' ;
2018-01-23 09:09:53 +00:00
return function wmo ( ) {
2017-05-11 18:57:52 +00:00
return payload ;
} ;
} ) ( ) ;
2014-05-16 00:16:51 +00:00
/* ECMA-376 Part II 11.1 Core Properties Part */
/* [MS-OSHARED] 2.3.3.2.[1-2].1 (PIDSI/PIDDSI) */
var CORE _PROPS = [
[ "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' ]
] ;
XMLNS . CORE _PROPS = "http://schemas.openxmlformats.org/package/2006/metadata/core-properties" ;
RELS . CORE _PROPS = 'http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties' ;
2014-07-28 15:32:28 +00:00
var CORE _PROPS _REGEX = ( function ( ) {
var r = new Array ( CORE _PROPS . length ) ;
for ( var i = 0 ; i < CORE _PROPS . length ; ++ i ) {
var f = CORE _PROPS [ i ] ;
2018-01-23 09:09:53 +00:00
var g = "(?:" + f [ 0 ] . slice ( 0 , f [ 0 ] . indexOf ( ":" ) ) + ":)" + f [ 0 ] . slice ( f [ 0 ] . indexOf ( ":" ) + 1 ) ;
2017-07-05 21:02:14 +00:00
r [ i ] = new RegExp ( "<" + g + "[^>]*>([\\s\\S]*?)<\/" + g + ">" ) ;
2014-07-28 15:32:28 +00:00
}
return r ;
} ) ( ) ;
2014-05-16 00:16:51 +00:00
function parse _core _props ( data ) {
var p = { } ;
2017-09-30 06:19:01 +00:00
data = utf8read ( data ) ;
2014-05-16 00:16:51 +00:00
2014-07-28 15:32:28 +00:00
for ( var i = 0 ; i < CORE _PROPS . length ; ++ i ) {
var f = CORE _PROPS [ i ] , cur = data . match ( CORE _PROPS _REGEX [ i ] ) ;
2014-06-29 18:35:10 +00:00
if ( cur != null && cur . length > 0 ) p [ f [ 1 ] ] = cur [ 1 ] ;
2017-03-23 01:56:21 +00:00
if ( f [ 2 ] === 'date' && p [ f [ 1 ] ] ) p [ f [ 1 ] ] = parseDate ( p [ f [ 1 ] ] ) ;
2014-06-29 18:35:10 +00:00
}
2014-05-16 00:16:51 +00:00
return p ;
}
var CORE _PROPS _XML _ROOT = 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
} ) ;
2014-06-29 18:35:10 +00:00
function cp _doit ( f , g , h , o , p ) {
if ( p [ f ] != null || g == null || g === "" ) return ;
p [ f ] = g ;
o [ o . length ] = ( h ? writextag ( f , g , h ) : writetag ( f , g ) ) ;
}
2017-04-16 07:35:56 +00:00
function write _core _props ( cp , _opts ) {
var opts = _opts || { } ;
2014-06-29 18:35:10 +00:00
var o = [ XML _HEADER , CORE _PROPS _XML _ROOT ] , p = { } ;
2017-04-16 07:35:56 +00:00
if ( ! cp && ! opts . Props ) return o . join ( "" ) ;
2014-05-16 00:16:51 +00:00
2017-04-16 07:35:56 +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 ) ;
}
2014-05-16 00:16:51 +00:00
2017-04-16 07:35:56 +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 ) ;
}
2014-06-29 18:35:10 +00:00
if ( o . length > 2 ) { o [ o . length ] = ( '</cp:coreProperties>' ) ; o [ 1 ] = o [ 1 ] . replace ( "/>" , ">" ) ; }
2014-05-16 00:16:51 +00:00
return o . join ( "" ) ;
}
/* 15.2.12.3 Extended File Properties Part */
/* [MS-OSHARED] 2.3.3.2.[1-2].1 (PIDSI/PIDDSI) */
var EXT _PROPS = [
[ "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" ] ,
2014-06-05 07:07:10 +00:00
[ "TitlesOfParts" , "TitlesOfParts" , "raw" ]
2014-05-16 00:16:51 +00:00
] ;
2014-04-03 23:24:56 +00:00
2014-05-16 00:16:51 +00:00
XMLNS . EXT _PROPS = "http://schemas.openxmlformats.org/officeDocument/2006/extended-properties" ;
RELS . EXT _PROPS = 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/extended-properties' ;
2014-03-29 02:12:07 +00:00
2018-05-05 06:42:56 +00:00
var PseudoPropsPairs = [
"Worksheets" , "SheetNames" ,
"NamedRanges" , "DefinedNames" ,
"Chartsheets" , "ChartNames"
] ;
function load _props _pairs ( HP , 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" :
case "Werkbladen" :
props . Worksheets = len ;
props . SheetNames = parts . slice ( idx , idx + len ) ;
break ;
case "Named Ranges" :
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-05 06:58:40 +00:00
function parse _ext _props ( data , p , opts ) {
2014-05-16 00:16:51 +00:00
var q = { } ; if ( ! p ) p = { } ;
2017-09-30 06:19:01 +00:00
data = utf8read ( data ) ;
2014-01-28 16:35:26 +00:00
2014-05-16 00:16:51 +00:00
EXT _PROPS . forEach ( function ( f ) {
switch ( f [ 2 ] ) {
case "string" : p [ f [ 1 ] ] = ( data . match ( matchtag ( f [ 0 ] ) ) || [ ] ) [ 1 ] ; break ;
case "bool" : p [ f [ 1 ] ] = ( data . match ( matchtag ( f [ 0 ] ) ) || [ ] ) [ 1 ] === "true" ; break ;
case "raw" :
2017-07-05 21:02:14 +00:00
var cur = data . match ( new RegExp ( "<" + f [ 0 ] + "[^>]*>([\\s\\S]*?)<\/" + f [ 0 ] + ">" ) ) ;
2014-05-16 00:16:51 +00:00
if ( cur && cur . length > 0 ) q [ f [ 1 ] ] = cur [ 1 ] ;
break ;
}
2012-12-03 19:47:44 +00:00
} ) ;
2018-05-05 06:42:56 +00:00
if ( q . HeadingPairs && q . TitlesOfParts ) load _props _pairs ( q . HeadingPairs , q . TitlesOfParts , p , opts ) ;
2017-03-31 21:50:32 +00:00
2012-12-03 19:47:44 +00:00
return p ;
}
2014-05-16 00:16:51 +00:00
var EXT _PROPS _XML _ROOT = writextag ( 'Properties' , null , {
'xmlns' : XMLNS . EXT _PROPS ,
'xmlns:vt' : XMLNS . vt
} ) ;
2018-01-23 09:09:53 +00:00
function write _ext _props ( cp ) {
var o = [ ] , W = writextag ;
2014-05-22 12:09:29 +00:00
if ( ! cp ) cp = { } ;
cp . Application = "SheetJS" ;
2014-06-29 18:35:10 +00:00
o [ o . length ] = ( XML _HEADER ) ;
o [ o . length ] = ( EXT _PROPS _XML _ROOT ) ;
2014-05-16 00:16:51 +00:00
EXT _PROPS . forEach ( function ( f ) {
2014-07-28 15:32:28 +00:00
if ( cp [ f [ 1 ] ] === undefined ) return ;
2014-05-16 00:16:51 +00:00
var v ;
switch ( f [ 2 ] ) {
2017-04-16 07:35:56 +00:00
case 'string' : v = String ( cp [ f [ 1 ] ] ) ; break ;
2014-05-16 00:16:51 +00:00
case 'bool' : v = cp [ f [ 1 ] ] ? 'true' : 'false' ; break ;
}
2014-07-28 15:32:28 +00:00
if ( v !== undefined ) o [ o . length ] = ( W ( f [ 0 ] , v ) ) ;
2014-05-16 00:16:51 +00:00
} ) ;
/* TODO: HeadingPairs, TitlesOfParts */
2014-06-29 18:35:10 +00:00
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 07:34:05 +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" } ) ) ) ;
2014-06-29 18:35:10 +00:00
if ( o . length > 2 ) { o [ o . length ] = ( '</Properties>' ) ; o [ 1 ] = o [ 1 ] . replace ( "/>" , ">" ) ; }
2014-05-16 00:16:51 +00:00
return o . join ( "" ) ;
}
2014-02-14 06:27:51 +00:00
/* 15.2.12.2 Custom File Properties Part */
2014-05-16 00:16:51 +00:00
XMLNS . CUST _PROPS = "http://schemas.openxmlformats.org/officeDocument/2006/custom-properties" ;
RELS . CUST _PROPS = 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/custom-properties' ;
2014-06-29 18:35:10 +00:00
var custregex = /<[^>]+>[^<]*/g ;
2014-05-16 00:16:51 +00:00
function parse _cust _props ( data , opts ) {
2017-02-11 01:58:22 +00:00
var p = { } , name = "" ;
2014-06-29 18:35:10 +00:00
var m = data . match ( custregex ) ;
if ( m ) for ( var i = 0 ; i != m . length ; ++ i ) {
var x = m [ i ] , y = parsexmltag ( x ) ;
2014-02-14 06:27:51 +00:00
switch ( y [ 0 ] ) {
2014-05-16 00:16:51 +00:00
case '<?xml' : break ;
2017-02-19 21:11:48 +00:00
case '<Properties' : break ;
2014-02-14 06:27:51 +00:00
case '<property' : name = y . name ; break ;
case '</property>' : name = null ; break ;
default : if ( x . indexOf ( '<vt:' ) === 0 ) {
var toks = x . split ( '>' ) ;
2018-01-23 09:09:53 +00:00
var type = toks [ 0 ] . slice ( 4 ) , text = toks [ 1 ] ;
2014-02-14 06:27:51 +00:00
/* 22.4.2.32 (CT_Variant). Omit the binary types from 22.4 (Variant Types) */
switch ( type ) {
2017-03-28 22:07:46 +00:00
case 'lpstr' : case 'bstr' : case 'lpwstr' :
2014-02-14 06:27:51 +00:00
p [ name ] = unescapexml ( text ) ;
break ;
case 'bool' :
2018-01-23 09:09:53 +00:00
p [ name ] = parsexmlbool ( text ) ;
2014-02-14 06:27:51 +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:56:21 +00:00
p [ name ] = parseDate ( text ) ;
2014-02-14 06:27:51 +00:00
break ;
case 'cy' : case 'error' :
p [ name ] = unescapexml ( text ) ;
break ;
default :
2017-07-28 23:54:51 +00:00
if ( type . slice ( - 1 ) == '/' ) break ;
2017-02-04 00:14:24 +00:00
if ( opts . WTF && typeof console !== 'undefined' ) console . warn ( 'Unexpected' , x , type , toks ) ;
2014-02-14 06:27:51 +00:00
}
2018-01-23 09:09:53 +00:00
} else if ( x . slice ( 0 , 2 ) === "</" ) { /* empty */
2014-05-16 00:16:51 +00:00
} else if ( opts . WTF ) throw new Error ( x ) ;
2014-02-14 06:27:51 +00:00
}
2014-06-29 18:35:10 +00:00
}
2014-02-14 06:27:51 +00:00
return p ;
}
2014-05-16 00:16:51 +00:00
var CUST _PROPS _XML _ROOT = writextag ( 'Properties' , null , {
'xmlns' : XMLNS . CUST _PROPS ,
'xmlns:vt' : XMLNS . vt
} ) ;
2018-01-23 09:09:53 +00:00
function write _cust _props ( cp ) {
2014-06-29 18:35:10 +00:00
var o = [ XML _HEADER , CUST _PROPS _XML _ROOT ] ;
2014-05-16 00:16:51 +00:00
if ( ! cp ) return o . join ( "" ) ;
var pid = 1 ;
2014-06-29 18:35:10 +00:00
keys ( cp ) . forEach ( function custprop ( k ) { ++ pid ;
o [ o . length ] = ( writextag ( 'property' , write _vt ( cp [ k ] ) , {
2014-05-16 00:16:51 +00:00
'fmtid' : '{D5CDD505-2E9C-101B-9397-08002B2CF9AE}' ,
'pid' : pid ,
'name' : k
} ) ) ;
} ) ;
2014-06-29 18:35:10 +00:00
if ( o . length > 2 ) { o [ o . length ] = '</Properties>' ; o [ 1 ] = o [ 1 ] . replace ( "/>" , ">" ) ; }
2014-05-16 00:16:51 +00:00
return o . join ( "" ) ;
}
2017-04-16 07:35:56 +00:00
/* Common Name -> XLML Name */
var XLMLDocPropsMap = {
2017-04-30 16:28:24 +00:00
Title : 'Title' ,
Subject : 'Subject' ,
Author : 'Author' ,
2017-04-16 07:35:56 +00:00
Keywords : 'Keywords' ,
2017-04-30 16:28:24 +00:00
Comments : 'Description' ,
2017-04-16 07:35:56 +00:00
LastAuthor : 'LastAuthor' ,
RevNumber : 'Revision' ,
2017-04-30 16:28:24 +00:00
Application : 'AppName' ,
/* TotalTime: 'TotalTime', */
LastPrinted : 'LastPrinted' ,
2017-04-16 07:35:56 +00:00
CreatedDate : 'Created' ,
ModifiedDate : 'LastSaved' ,
2017-04-30 16:28:24 +00:00
/* Pages */
/* Words */
/* Characters */
Category : 'Category' ,
/* PresentationFormat */
2017-04-16 07:35:56 +00:00
Manager : 'Manager' ,
2017-04-30 16:28:24 +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-16 07:35:56 +00:00
} ;
var evert _XLMLDPM = evert ( XLMLDocPropsMap ) ;
2015-04-02 22:14:07 +00:00
function xlml _set _prop ( Props , tag , val ) {
2017-04-16 07:35:56 +00:00
tag = evert _XLMLDPM [ tag ] || tag ;
2015-04-02 22:14:07 +00:00
Props [ tag ] = val ;
}
2014-05-16 00:16:51 +00:00
2017-04-16 07:35:56 +00:00
function xlml _write _docprops ( Props , opts ) {
2017-03-16 04:39:50 +00:00
var o = [ ] ;
2017-04-30 16:28:24 +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-16 07:35:56 +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-16 04:39:50 +00:00
switch ( p [ 2 ] ) {
2017-04-30 16:28:24 +00:00
case 'date' : m = new Date ( m ) . toISOString ( ) . replace ( /\.\d*Z/ , "Z" ) ; break ;
2017-03-16 04:39:50 +00:00
}
2017-04-16 07:35:56 +00:00
if ( typeof m == 'number' ) m = String ( m ) ;
else if ( m === true || m === false ) { m = m ? "1" : "0" ; }
2017-04-30 16:28:24 +00:00
else if ( m instanceof Date ) m = new Date ( m ) . toISOString ( ) . replace ( /\.\d*Z/ , "" ) ;
2017-04-16 07:35:56 +00:00
o . push ( writetag ( XLMLDocPropsMap [ p [ 1 ] ] || p [ 1 ] , m ) ) ;
2017-03-16 04:39:50 +00:00
} ) ;
2017-04-16 07:35:56 +00:00
return writextag ( 'DocumentProperties' , o . join ( "" ) , { xmlns : XLMLNS . o } ) ;
2017-03-16 04:39:50 +00:00
}
2018-01-23 09:09:53 +00:00
function xlml _write _custprops ( Props , Custprops ) {
2017-04-16 07:35:56 +00:00
var BLACKLIST = [ "Worksheets" , "SheetNames" ] ;
2017-03-16 04:39:50 +00:00
var T = 'CustomDocumentProperties' ;
var o = [ ] ;
if ( Props ) keys ( Props ) . forEach ( function ( k ) {
if ( ! Props . hasOwnProperty ( k ) ) return ;
2017-04-16 07:35:56 +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-16 04:39:50 +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 . hasOwnProperty ( k ) ) return ;
2018-01-09 07:40:54 +00:00
if ( Props && Props . hasOwnProperty ( k ) ) return ;
2017-03-16 04:39:50 +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 + '>' ;
}
2015-04-02 22:14:07 +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:42:56 +00:00
function write _FILETIME ( time ) {
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 ;
}
2014-05-16 00:16:51 +00:00
2015-04-02 22:14:07 +00:00
/* [MS-OSHARED] 2.3.3.1.4 Lpstr */
function parse _lpstr ( blob , type , pad ) {
2017-12-30 05:41:41 +00:00
var start = blob . l ;
var str = blob . read _shift ( 0 , 'lpstr-cp' ) ;
if ( pad ) while ( ( blob . l - start ) & 3 ) ++ blob . l ;
2015-04-02 22:14:07 +00:00
return str ;
}
2014-05-16 00:16:51 +00:00
2015-04-02 22:14:07 +00:00
/* [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 ;
}
2014-05-16 00:16:51 +00:00
2015-04-02 22:14:07 +00:00
/* [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 ) ;
}
2014-05-16 00:16:51 +00:00
2015-04-02 22:14:07 +00:00
function parse _VtString ( blob , t , pad ) { return parse _VtStringBase ( blob , t , pad === false ? 0 : 4 ) ; }
2017-08-05 06:58:40 +00:00
function parse _VtUnalignedString ( blob , t ) { if ( ! t ) throw new Error ( "VtUnalignedString must have positive length" ) ; return parse _VtStringBase ( blob , t , 0 ) ; }
2014-05-16 00:16:51 +00:00
2015-04-02 22:14:07 +00:00
/* [MS-OSHARED] 2.3.3.1.9 VtVecUnalignedLpstrValue */
function parse _VtVecUnalignedLpstrValue ( blob ) {
var length = blob . read _shift ( 4 ) ;
var ret = [ ] ;
2017-12-30 05:41:41 +00:00
for ( var i = 0 ; i != length ; ++ i ) ret [ i ] = blob . read _shift ( 0 , 'lpstr-cp' ) . replace ( chr0 , '' ) ;
2015-04-02 22:14:07 +00:00
return ret ;
}
2014-05-16 00:16:51 +00:00
2015-04-02 22:14:07 +00:00
/* [MS-OSHARED] 2.3.3.1.10 VtVecUnalignedLpstr */
function parse _VtVecUnalignedLpstr ( blob ) {
return parse _VtVecUnalignedLpstrValue ( blob ) ;
}
2014-05-16 00:16:51 +00:00
2015-04-02 22:14:07 +00:00
/* [MS-OSHARED] 2.3.3.1.13 VtHeadingPair */
function parse _VtHeadingPair ( blob ) {
var headingString = parse _TypedPropertyValue ( blob , VT _USTR ) ;
var headerParts = parse _TypedPropertyValue ( blob , VT _I4 ) ;
return [ headingString , headerParts ] ;
}
2014-05-16 00:16:51 +00:00
2015-04-02 22:14:07 +00:00
/* [MS-OSHARED] 2.3.3.1.14 VtVecHeadingPairValue */
function parse _VtVecHeadingPairValue ( blob ) {
var cElements = blob . read _shift ( 4 ) ;
var out = [ ] ;
for ( var i = 0 ; i != cElements / 2 ; ++ i ) out . push ( parse _VtHeadingPair ( blob ) ) ;
return out ;
}
2014-05-16 00:16:51 +00:00
2015-04-02 22:14:07 +00:00
/* [MS-OSHARED] 2.3.3.1.15 VtVecHeadingPair */
function parse _VtVecHeadingPair ( blob ) {
// NOTE: When invoked, wType & padding were already consumed
return parse _VtVecHeadingPairValue ( blob ) ;
}
2014-05-16 00:16:51 +00:00
2015-04-02 22:14:07 +00:00
/* [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 01:44:52 +00:00
var dict = ( { } ) ;
2015-04-02 22:14:07 +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:42:56 +00:00
if ( CodePage === 0x4B0 && ( len % 2 ) ) blob . l += 2 ;
2015-04-02 22:14:07 +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 06:20:15 +00:00
blob . l += size ;
2017-02-11 01:58:22 +00:00
if ( ( size & 3 ) > 0 ) blob . l += ( 4 - ( size & 3 ) ) & 3 ;
2015-04-02 22:14:07 +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 06:20:15 +00:00
blob . l += o . Size + 3 - ( o . Size - 1 ) % 4 ;
2015-04-02 22:14:07 +00:00
return o ;
}
/* [MS-OLEPS] 2.15 TypedPropertyValue */
function parse _TypedPropertyValue ( blob , type , _opts ) {
var t = blob . read _shift ( 2 ) , ret , opts = _opts || { } ;
blob . l += 2 ;
if ( type !== VT _VARIANT )
if ( t !== type && VT _CUSTOM . indexOf ( type ) === - 1 ) throw new Error ( 'Expected type ' + type + ' saw ' + t ) ;
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:58:40 +00:00
case 0x50 /*VT_STRING*/ : return parse _VtString ( blob , t , ! opts . raw ) . replace ( chr0 , '' ) ;
2017-07-05 21:02:14 +00:00
case 0x51 /*VT_USTR*/ : return parse _VtUnalignedString ( blob , t /*, 4*/ ) . replace ( chr0 , '' ) ;
2015-04-02 22:14:07 +00:00
case 0x100C /*VT_VECTOR|VT_VARIANT*/ : return parse _VtVecHeadingPair ( blob ) ;
case 0x101E /*VT_LPSTR*/ : return parse _VtVecUnalignedLpstr ( blob ) ;
default : throw new Error ( "TypedPropertyValue unrecognized type " + type + " " + t ) ;
}
}
2018-05-05 06:42:56 +00:00
function write _TypedPropertyValue ( type , 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 03:03:23 +00:00
case 0x40 /*VT_FILETIME*/ : p = write _FILETIME ( value ) ; break ;
2018-05-05 06:42:56 +00:00
case 0x1F /*VT_LPWSTR*/ :
case 0x50 /*VT_STRING*/ :
2018-05-20 03:03:23 +00:00
p = new _buf ( 4 + 2 * ( value . length + 1 ) + ( value . length % 2 ? 0 : 2 ) ) ;
2018-05-05 06:42:56 +00:00
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 ] ) ;
}
2015-04-02 22:14:07 +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 01:44:52 +00:00
var Dictionary = - 1 , DictObj = ( { } ) ;
2015-04-02 22:14:07 +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:41:41 +00:00
Props . sort ( function ( x , y ) { return x [ 1 ] - y [ 1 ] ; } ) ;
2015-04-02 22:14:07 +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:41:41 +00:00
case 0x02 /*VT_I2*/ : if ( blob . l + 2 === Props [ i ] [ 1 ] ) { blob . l += 2 ; fail = false ; } break ;
2015-04-02 22:14:07 +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:41:41 +00:00
if ( ( ! PIDSI || i == 0 ) && blob . l <= Props [ i ] [ 1 ] ) { fail = false ; blob . l = Props [ i ] [ 1 ] ; }
2015-04-02 22:14:07 +00:00
if ( fail ) throw new Error ( "Read Error: Expected address " + Props [ i ] [ 1 ] + ' at ' + blob . l + ' :' + i ) ;
}
if ( PIDSI ) {
var piddsi = PIDSI [ Props [ i ] [ 0 ] ] ;
PropH [ piddsi . n ] = parse _TypedPropertyValue ( blob , piddsi . t , { raw : true } ) ;
2018-05-05 06:42:56 +00:00
if ( piddsi . p === 'version' ) PropH [ piddsi . n ] = String ( PropH [ piddsi . n ] >> 16 ) + "." + ( "0000" + String ( PropH [ piddsi . n ] & 0xFFFF ) ) . slice ( - 4 ) ;
2015-04-02 22:14:07 +00:00
if ( piddsi . n == "CodePage" ) switch ( PropH [ piddsi . n ] ) {
case 0 : PropH [ piddsi . n ] = 1252 ;
/* falls through */
2017-05-09 18:11:15 +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:36:51 +00:00
set _cp ( CodePage = ( PropH [ piddsi . n ] >>> 0 ) & 0xFFFF ) ; break ;
2015-04-02 22:14:07 +00:00
default : throw new Error ( "Unsupported CodePage: " + PropH [ piddsi . n ] ) ;
}
} else {
if ( Props [ i ] [ 0 ] === 0x1 ) {
2017-10-17 00:36:51 +00:00
CodePage = PropH . CodePage = ( parse _TypedPropertyValue ( blob , VT _I2 ) ) ;
2015-04-02 22:14:07 +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:42:56 +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 ;
2015-04-02 22:14:07 +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:56:21 +00:00
case 0x40 /*VT_FILETIME*/ : blob . l += 4 ; val = parseDate ( parse _FILETIME ( blob ) ) ; break ;
2015-04-02 22:14:07 +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 ;
}
2018-05-05 06:42:56 +00:00
var XLSPSSkip = [ "CodePage" , "Thumbnail" , "_PID_LINKBASE" , "_PID_HLINKS" , "SystemIdentifier" , "FMTID" ] . concat ( PseudoPropsPairs ) ;
function guess _property _type ( val ) {
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 ;
if ( XLSPSSkip . indexOf ( entries [ i ] [ 0 ] ) > - 1 ) continue ;
if ( entries [ i ] [ 1 ] == null ) continue ;
var val = entries [ i ] [ 1 ] , idx = 0 ;
if ( RE ) {
idx = + RE [ entries [ i ] [ 0 ] ] ;
2018-05-20 03:03:23 +00:00
var pinfo = ( PIDSI ) [ idx ] ;
if ( pinfo . p == "version" && typeof val == "string" ) {
var arr = val . split ( "." ) ;
val = ( ( + arr [ 0 ] ) << 16 ) + ( ( + arr [ 1 ] ) || 0 ) ;
}
2018-05-05 06:42:56 +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 ) ) ;
}
2015-04-02 22:14:07 +00:00
/* [MS-OLEPS] 2.21 PropertySetStream */
2018-02-14 05:26:28 +00:00
function parse _PropertySetStream ( file , PIDSI , clsid ) {
2015-04-02 22:14:07 +00:00
var blob = file . content ;
2017-09-30 06:19:01 +00:00
if ( ! blob ) return ( { } ) ;
2015-04-02 22:14:07 +00:00
prep _blob ( blob , 0 ) ;
2017-02-11 01:58:22 +00:00
var NumSets , FMTID0 , FMTID1 , Offset0 , Offset1 = 0 ;
2015-04-02 22:14:07 +00:00
blob . chk ( 'feff' , 'Byte Order: ' ) ;
2018-01-23 09:09:53 +00:00
/*var vers = */ blob . read _shift ( 2 ) ; // TODO: check version
2015-04-02 22:14:07 +00:00
var SystemIdentifier = blob . read _shift ( 4 ) ;
2018-02-14 05:26:28 +00:00
var CLSID = blob . read _shift ( 16 ) ;
if ( CLSID !== CFB . utils . consts . HEADER _CLSID && CLSID !== clsid ) throw new Error ( "Bad PropertySet CLSID " + CLSID ) ;
2015-04-02 22:14:07 +00:00
NumSets = blob . read _shift ( 4 ) ;
2017-03-28 22:07:46 +00:00
if ( NumSets !== 1 && NumSets !== 2 ) throw new Error ( "Unrecognized #Sets: " + NumSets ) ;
2015-04-02 22:14:07 +00:00
FMTID0 = blob . read _shift ( 16 ) ; Offset0 = blob . read _shift ( 4 ) ;
2017-03-28 22:07:46 +00:00
if ( NumSets === 1 && Offset0 !== blob . l ) throw new Error ( "Length mismatch: " + Offset0 + " !== " + blob . l ) ;
2015-04-02 22:14:07 +00:00
else if ( NumSets === 2 ) { FMTID1 = blob . read _shift ( 16 ) ; Offset1 = blob . read _shift ( 4 ) ; }
var PSet0 = parse _PropertySet ( blob , PIDSI ) ;
2017-02-11 01:58:22 +00:00
var rval = ( { SystemIdentifier : SystemIdentifier } ) ;
2015-04-02 22:14:07 +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 06:20:15 +00:00
if ( Offset1 - blob . l == 2 ) blob . l += 2 ;
2017-02-11 01:58:22 +00:00
if ( blob . l !== Offset1 ) throw new Error ( "Length mismatch 2: " + blob . l + " !== " + Offset1 ) ;
2015-04-02 22:14:07 +00:00
var PSet1 ;
2017-05-09 18:11:15 +00:00
try { PSet1 = parse _PropertySet ( blob , null ) ; } catch ( e ) { /* empty */ }
2015-04-02 22:14:07 +00:00
for ( y in PSet1 ) rval [ y ] = PSet1 [ y ] ;
rval . FMTID = [ FMTID0 , FMTID1 ] ; // TODO: verify FMTID0/1
return rval ;
}
2018-05-05 06:42:56 +00:00
function write _PropertySetStream ( entries , clsid , RE , PIDSI , entries2 , clsid2 ) {
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 ) ;
2015-04-02 22:14:07 +00:00
2018-05-05 06:42:56 +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 ) ;
}
2015-04-02 22:14:07 +00:00
function parsenoop2 ( blob , length ) { blob . read _shift ( length ) ; return null ; }
2017-09-22 22:40:09 +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 ; }
2015-04-02 22:14:07 +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 ;
}
function parsebool ( blob , length ) { return blob . read _shift ( length ) === 0x1 ; }
2017-09-22 22:40:09 +00:00
function writebool ( v , o ) { if ( ! o ) o = new _buf ( 2 ) ; o . write _shift ( 2 , + ! ! v ) ; return o ; }
2015-04-02 22:14:07 +00:00
function parseuint16 ( blob ) { return blob . read _shift ( 2 , 'u' ) ; }
2017-09-22 22:40:09 +00:00
function writeuint16 ( v , o ) { if ( ! o ) o = new _buf ( 2 ) ; o . write _shift ( 2 , v ) ; return o ; }
2015-04-02 22:14:07 +00:00
function parseuint16a ( blob , length ) { return parslurp ( blob , length , parseuint16 ) ; }
/* --- 2.5 Structures --- */
/* [MS-XLS] 2.5.10 Bes (boolean or error) */
function parse _Bes ( blob ) {
var v = blob . read _shift ( 1 ) , t = blob . read _shift ( 1 ) ;
return t === 0x01 ? v : v === 0x01 ;
}
2017-09-22 22:40:09 +00:00
function write _Bes ( v , t , o ) {
if ( ! o ) o = new _buf ( 2 ) ;
o . write _shift ( 1 , + v ) ;
2018-02-14 05:26:28 +00:00
o . write _shift ( 1 , ( ( t == 'e' ) ? 1 : 0 ) ) ;
2017-09-22 22:40:09 +00:00
return o ;
}
2015-04-02 22:14:07 +00:00
/* [MS-XLS] 2.5.240 ShortXLUnicodeString */
function parse _ShortXLUnicodeString ( blob , length , opts ) {
2017-02-19 21:11:48 +00:00
var cch = blob . read _shift ( opts && opts . biff >= 12 ? 2 : 1 ) ;
2018-01-23 09:09:53 +00:00
var encoding = 'sbcs-cont' ;
2015-04-02 22:14:07 +00:00
var cp = current _codepage ;
if ( opts && opts . biff >= 8 ) current _codepage = 1200 ;
2017-02-19 21:11:48 +00:00
if ( ! opts || opts . biff == 8 ) {
2015-04-02 22:14:07 +00:00
var fHighByte = blob . read _shift ( 1 ) ;
2018-01-23 09:09:53 +00:00
if ( fHighByte ) { encoding = 'dbcs-cont' ; }
2017-02-19 21:11:48 +00:00
} else if ( opts . biff == 12 ) {
2018-01-23 09:09:53 +00:00
encoding = 'wstr' ;
2015-04-02 22:14:07 +00:00
}
2018-01-23 09:09:53 +00:00
if ( opts . biff >= 2 && opts . biff <= 5 ) encoding = 'cpstr' ;
2015-04-02 22:14:07 +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:09:53 +00:00
var /*fHighByte = flags & 0x1,*/ fExtSt = flags & 0x4 , fRichSt = flags & 0x8 ;
2015-04-02 22:14:07 +00:00
var width = 1 + ( flags & 0x1 ) ; // 0x0 -> utf8, 0x1 -> dbcs
2017-02-11 01:58:22 +00:00
var cRun = 0 , cbExtRst ;
2015-04-02 22:14:07 +00:00
var z = { } ;
if ( fRichSt ) cRun = blob . read _shift ( 2 ) ;
if ( fExtSt ) cbExtRst = blob . read _shift ( 4 ) ;
2017-12-30 05:41:41 +00:00
var encoding = width == 2 ? 'dbcs-cont' : 'sbcs-cont' ;
2015-04-02 22:14:07 +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 ;
}
/* 2.5.296 XLUnicodeStringNoCch */
function parse _XLUnicodeStringNoCch ( blob , cch , opts ) {
var retval ;
2017-02-19 21:11:48 +00:00
if ( opts ) {
2018-01-23 09:09:53 +00:00
if ( opts . biff >= 2 && opts . biff <= 5 ) return blob . read _shift ( cch , 'cpstr' ) ;
2017-02-19 21:11:48 +00:00
if ( opts . biff >= 12 ) return blob . read _shift ( cch , 'dbcs-cont' ) ;
}
2015-04-02 22:14:07 +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 21:11:48 +00:00
var cch = blob . read _shift ( opts && opts . biff == 2 ? 1 : 2 ) ;
2015-04-02 22:14:07 +00:00
if ( cch === 0 ) { blob . l ++ ; return "" ; }
return parse _XLUnicodeStringNoCch ( blob , cch , opts ) ;
}
/* BIFF5 override */
function parse _XLUnicodeString2 ( blob , length , opts ) {
2017-02-11 01:58:22 +00:00
if ( opts . biff > 5 ) return parse _XLUnicodeString ( blob , length , opts ) ;
2015-04-02 22:14:07 +00:00
var cch = blob . read _shift ( 1 ) ;
if ( cch === 0 ) { blob . l ++ ; return "" ; }
2018-01-23 09:09:53 +00:00
return blob . read _shift ( cch , ( opts . biff <= 4 || ! blob . lens ) ? 'cpstr' : 'sbcs-cont' ) ;
2015-04-02 22:14:07 +00:00
}
2017-10-27 19:55:07 +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 ;
}
2015-04-02 22:14:07 +00:00
/* [MS-XLS] 2.5.61 ControlInfo */
2018-01-23 09:09:53 +00:00
function parse _ControlInfo ( blob ) {
2017-07-28 23:54:51 +00:00
var flags = blob . read _shift ( 1 ) ;
blob . l ++ ;
var accel = blob . read _shift ( 2 ) ;
blob . l += 2 ;
return [ flags , accel ] ;
}
2015-04-02 22:14:07 +00:00
/* [MS-OSHARED] 2.3.7.6 URLMoniker TODO: flags */
2017-09-22 22:40:09 +00:00
function parse _URLMoniker ( blob ) {
2015-04-02 22:14:07 +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:40:09 +00:00
}
2015-04-02 22:14:07 +00:00
/* [MS-OSHARED] 2.3.7.8 FileMoniker TODO: all fields */
2018-01-23 09:09:53 +00:00
function parse _FileMoniker ( blob ) {
blob . l += 2 ; //var cAnti = blob.read_shift(2);
2017-12-30 05:41:41 +00:00
var ansiPath = blob . read _shift ( 0 , 'lpstr-ansi' ) ;
2018-01-23 09:09:53 +00:00
blob . l += 2 ; //var endServer = blob.read_shift(2);
2017-12-30 05:41:41 +00:00
if ( blob . read _shift ( 2 ) != 0xDEAD ) throw new Error ( "Bad FileMoniker" ) ;
var sz = blob . read _shift ( 4 ) ;
if ( sz === 0 ) return ansiPath . replace ( /\\/g , "/" ) ;
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 , "" ) ;
2015-04-02 22:14:07 +00:00
return unicodePath ;
2017-09-22 22:40:09 +00:00
}
2015-04-02 22:14:07 +00:00
/* [MS-OSHARED] 2.3.7.2 HyperlinkMoniker TODO: all the monikers */
2017-09-22 22:40:09 +00:00
function parse _HyperlinkMoniker ( blob , length ) {
2015-04-02 22:14:07 +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-28 22:07:46 +00:00
default : throw new Error ( "Unsupported Moniker " + clsid ) ;
2015-04-02 22:14:07 +00:00
}
2017-09-22 22:40:09 +00:00
}
2015-04-02 22:14:07 +00:00
/* [MS-OSHARED] 2.3.7.9 HyperlinkString */
2018-01-23 09:09:53 +00:00
function parse _HyperlinkString ( blob ) {
2015-04-02 22:14:07 +00:00
var len = blob . read _shift ( 4 ) ;
2017-12-15 02:01:07 +00:00
var o = len > 0 ? blob . read _shift ( len , 'utf16le' ) . replace ( chr0 , "" ) : "" ;
2015-04-02 22:14:07 +00:00
return o ;
2017-09-22 22:40:09 +00:00
}
2015-04-02 22:14:07 +00:00
2017-12-15 02:01:07 +00:00
/* [MS-OSHARED] 2.3.7.1 Hyperlink Object */
2017-09-22 22:40:09 +00:00
function parse _Hyperlink ( blob , length ) {
2015-04-02 22:14:07 +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:09:53 +00:00
var displayName , targetFrameName , moniker , oleMoniker , Loc = "" , guid , fileTime ;
2015-04-02 22:14:07 +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:09:53 +00:00
if ( flags & 0x0008 ) Loc = parse _HyperlinkString ( blob , end - blob . l ) ;
2015-04-02 22:14:07 +00:00
if ( flags & 0x0020 ) guid = blob . read _shift ( 16 ) ;
2017-07-28 23:54:51 +00:00
if ( flags & 0x0040 ) fileTime = parse _FILETIME ( blob /*, 8*/ ) ;
2015-04-02 22:14:07 +00:00
blob . l = end ;
2017-12-15 02:01:07 +00:00
var target = targetFrameName || moniker || oleMoniker || "" ;
2018-01-23 09:09:53 +00:00
if ( target && Loc ) target += "#" + Loc ;
if ( ! target ) target = "#" + Loc ;
var out = ( { Target : target } ) ;
if ( guid ) out . guid = guid ;
if ( fileTime ) out . time = fileTime ;
if ( displayName ) out . Tooltip = displayName ;
return out ;
2017-09-22 22:40:09 +00:00
}
2017-12-15 02:01:07 +00:00
function write _Hyperlink ( hl ) {
var out = new _buf ( 512 ) , i = 0 ;
var Target = hl . Target ;
var F = Target . indexOf ( "#" ) > - 1 ? 0x1f : 0x17 ;
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 ) ;
out . write _shift ( 4 , Target . length + 1 ) ;
for ( i = 0 ; i < Target . length ; ++ i ) out . write _shift ( 2 , Target . charCodeAt ( i ) ) ;
out . write _shift ( 2 , 0 ) ;
} 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 ) ) ;
out . write _shift ( 4 , 2 * ( Target . length + 1 ) ) ;
for ( i = 0 ; i < Target . length ; ++ i ) out . write _shift ( 2 , Target . charCodeAt ( i ) ) ;
out . write _shift ( 2 , 0 ) ;
} 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 ) ;
out . write _shift ( 4 , Target . length + 1 ) ;
for ( i = 0 ; i < Target . length ; ++ i ) out . write _shift ( 1 , Target . charCodeAt ( i ) & 0xFF ) ;
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 ) ;
}
2015-04-02 22:14:07 +00:00
/* 2.5.178 LongRGBA */
2018-01-23 09:09:53 +00:00
function parse _LongRGBA ( blob ) { 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 ] ; }
2015-04-02 22:14:07 +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 05:26:28 +00:00
/* [MS-XLS] 2.5.19 */
2018-01-23 09:09:53 +00:00
function parse _XLSCell ( blob ) {
2015-04-02 22:14:07 +00:00
var rw = blob . read _shift ( 2 ) ; // 0-indexed
var col = blob . read _shift ( 2 ) ;
var ixfe = blob . read _shift ( 2 ) ;
2017-02-11 01:58:22 +00:00
return ( { r : rw , c : col , ixfe : ixfe } ) ;
2015-04-02 22:14:07 +00:00
}
2017-09-22 22:40:09 +00:00
function write _XLSCell ( R , C , ixfe , o ) {
if ( ! o ) o = new _buf ( 6 ) ;
o . write _shift ( 2 , R ) ;
o . write _shift ( 2 , C ) ;
o . write _shift ( 2 , ixfe || 0 ) ;
return o ;
}
2015-04-02 22:14:07 +00:00
2018-02-14 05:26:28 +00:00
/* [MS-XLS] 2.5.134 */
2015-04-02 22:14:07 +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 05:26:28 +00:00
/* [MS-XLS] 2.5.344 */
2017-07-28 23:54: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' ) ;
2015-04-02 22:14:07 +00:00
return [ iSupBook , itabFirst , itabLast ] ;
}
2018-02-14 05:26:28 +00:00
/* [MS-XLS] 2.5.218 */
2018-01-23 09:09:53 +00:00
function parse _RkRec ( blob ) {
2015-04-02 22:14:07 +00:00
var ixfe = blob . read _shift ( 2 ) ;
var RK = parse _RkNumber ( blob ) ;
return [ ixfe , RK ] ;
}
2018-02-14 05:26:28 +00:00
/* [MS-XLS] 2.5.1 */
2017-02-19 21:11:48 +00:00
function parse _AddinUdf ( blob , length , opts ) {
2015-04-02 22:14:07 +00:00
blob . l += 4 ; length -= 4 ;
var l = blob . l + length ;
2017-02-19 21:11:48 +00:00
var udfName = parse _ShortXLUnicodeString ( blob , length , opts ) ;
2015-04-02 22:14:07 +00:00
var cb = blob . read _shift ( 2 ) ;
l -= blob . l ;
2017-03-28 22:07:46 +00:00
if ( cb !== l ) throw new Error ( "Malformed AddinUdf: padding = " + l + " != " + cb ) ;
2015-04-02 22:14:07 +00:00
blob . l += cb ;
return udfName ;
}
2018-02-14 05:26:28 +00:00
/* [MS-XLS] 2.5.209 TODO: Check sizes */
2018-01-23 09:09:53 +00:00
function parse _Ref8U ( blob ) {
2015-04-02 22:14:07 +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:41:41 +00:00
function write _Ref8U ( r , 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 ;
}
2015-04-02 22:14:07 +00:00
2018-02-14 05:26:28 +00:00
/* [MS-XLS] 2.5.211 */
2018-01-23 09:09:53 +00:00
function parse _RefU ( blob ) {
2015-04-02 22:14:07 +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 05:26:28 +00:00
/* [MS-XLS] 2.5.207 */
2015-04-02 22:14:07 +00:00
var parse _Ref = parse _RefU ;
2018-02-14 05:26:28 +00:00
/* [MS-XLS] 2.5.143 */
2018-01-23 09:09:53 +00:00
function parse _FtCmo ( blob ) {
2015-04-02 22:14:07 +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 05:26:28 +00:00
/* [MS-XLS] 2.5.149 */
2018-01-23 09:09:53 +00:00
function parse _FtNts ( blob ) {
2015-04-02 22:14:07 +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 05:26:28 +00:00
/* [MS-XLS] 2.5.142 */
2018-01-23 09:09:53 +00:00
function parse _FtCf ( blob ) {
2015-04-02 22:14:07 +00:00
var out = { } ;
blob . l += 4 ;
blob . cf = blob . read _shift ( 2 ) ;
return out ;
}
2018-02-14 05:26:28 +00:00
/* [MS-XLS] 2.5.140 - 2.5.154 and friends */
2018-01-23 09:09:53 +00:00
function parse _FtSkip ( blob ) { blob . l += 2 ; blob . l += blob . read _shift ( 2 ) ; }
2015-04-02 22:14:07 +00:00
var FtTab = {
2017-05-09 18:11:15 +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
2015-04-02 22:14:07 +00:00
} ;
2018-01-23 09:09:53 +00:00
function parse _FtArray ( blob , length ) {
2017-05-09 18:11:15 +00:00
var tgt = blob . l + length ;
2015-04-02 22:14:07 +00:00
var fts = [ ] ;
2017-05-09 18:11:15 +00:00
while ( blob . l < tgt ) {
2015-04-02 22:14:07 +00:00
var ft = blob . read _shift ( 2 ) ;
blob . l -= 2 ;
try {
2017-05-09 18:11:15 +00:00
fts . push ( FtTab [ ft ] ( blob , tgt - blob . l ) ) ;
} catch ( e ) { blob . l = tgt ; return fts ; }
2015-04-02 22:14:07 +00:00
}
2017-05-09 18:11:15 +00:00
if ( blob . l != tgt ) blob . l = tgt ; //throw new Error("bad Object Ft-sequence");
2015-04-02 22:14:07 +00:00
return fts ;
}
/* --- 2.4 Records --- */
2018-02-14 05:26:28 +00:00
/* [MS-XLS] 2.4.21 */
2015-04-02 22:14:07 +00:00
function parse _BOF ( blob , length ) {
2017-03-28 22:07:46 +00:00
var o = { BIFFVer : 0 , dt : 0 } ;
2015-04-02 22:14:07 +00:00
o . BIFFVer = blob . read _shift ( 2 ) ; length -= 2 ;
2017-03-28 22:07:46 +00:00
if ( length >= 2 ) { o . dt = blob . read _shift ( 2 ) ; blob . l -= 2 ; }
2015-04-02 22:14:07 +00:00
switch ( o . BIFFVer ) {
case 0x0600 : /* BIFF8 */
case 0x0500 : /* BIFF5 */
2018-02-21 06:20:15 +00:00
case 0x0400 : /* BIFF4 */
case 0x0300 : /* BIFF3 */
case 0x0200 : /* BIFF2 */
2015-04-02 22:14:07 +00:00
case 0x0002 : case 0x0007 : /* BIFF2 */
break ;
2017-02-11 01:58:22 +00:00
default : if ( length > 6 ) throw new Error ( "Unexpected BIFF Ver " + o . BIFFVer ) ;
2015-04-02 22:14:07 +00:00
}
2017-03-28 22:07:46 +00:00
2015-04-02 22:14:07 +00:00
blob . read _shift ( length ) ;
return o ;
}
2017-09-22 22:40:09 +00:00
function write _BOF ( wb , t , 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:41:41 +00:00
case 'xla' : break ;
2017-09-22 22:40:09 +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 ;
}
2015-04-02 22:14:07 +00:00
2018-02-14 05:26:28 +00:00
/* [MS-XLS] 2.4.146 */
2015-04-02 22:14:07 +00:00
function parse _InterfaceHdr ( blob , length ) {
if ( length === 0 ) return 0x04b0 ;
2018-01-23 09:09:53 +00:00
if ( ( blob . read _shift ( 2 ) ) !== 0x04b0 ) { /* empty */ }
2015-04-02 22:14:07 +00:00
return 0x04b0 ;
}
2018-02-14 05:26:28 +00:00
/* [MS-XLS] 2.4.349 */
2015-04-02 22:14:07 +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:09:53 +00:00
var UserName = parse _XLUnicodeString2 ( blob , 0 , opts ) ;
2015-04-02 22:14:07 +00:00
blob . read _shift ( length + l - blob . l ) ;
return UserName ;
}
2017-09-22 22:40:09 +00:00
function write _WriteAccess ( s , opts ) {
2017-10-17 00:36:51 +00:00
var b8 = ! opts || opts . biff == 8 ;
var o = new _buf ( b8 ? 112 : 54 ) ;
2017-09-22 22:40:09 +00:00
o . write _shift ( opts . biff == 8 ? 2 : 1 , 7 ) ;
2018-02-14 05:26:28 +00:00
if ( b8 ) o . write _shift ( 1 , 0 ) ;
2017-09-22 22:40:09 +00:00
o . write _shift ( 4 , 0x33336853 ) ;
2018-02-14 05:26:28 +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:40:09 +00:00
return o ;
}
2015-04-02 22:14:07 +00:00
2018-02-14 05:26:28 +00:00
/* [MS-XLS] 2.4.351 */
2017-11-20 02:13:37 +00:00
function parse _WsBool ( blob , length , opts ) {
var flags = opts && opts . biff == 8 || length == 2 ? blob . read _shift ( 2 ) : ( blob . l += length , 0 ) ;
return { fDialog : flags & 0x10 } ;
}
2018-02-14 05:26:28 +00:00
/* [MS-XLS] 2.4.28 */
2015-04-02 22:14:07 +00:00
function parse _BoundSheet8 ( blob , length , opts ) {
var pos = blob . read _shift ( 4 ) ;
2017-02-11 01:58:22 +00:00
var hidden = blob . read _shift ( 1 ) & 0x03 ;
2015-04-02 22:14:07 +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:40:09 +00:00
function write _BoundSheet8 ( data , opts ) {
2017-10-17 00:36:51 +00:00
var w = ( ! opts || opts . biff >= 8 ? 2 : 1 ) ;
var o = new _buf ( 8 + w * data . name . length ) ;
2017-09-22 22:40:09 +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:36:51 +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 19:13:10 +00:00
var out = o . slice ( 0 , o . l ) ;
out . l = o . l ; return out ;
2017-09-22 22:40:09 +00:00
}
2015-04-02 22:14:07 +00:00
2018-02-14 05:26:28 +00:00
/* [MS-XLS] 2.4.265 TODO */
2015-04-02 22:14:07 +00:00
function parse _SST ( blob , length ) {
2017-07-28 23:54:51 +00:00
var end = blob . l + length ;
2015-04-02 22:14:07 +00:00
var cnt = blob . read _shift ( 4 ) ;
var ucnt = blob . read _shift ( 4 ) ;
2017-03-13 07:34:05 +00:00
var strs = ( [ ] ) ;
2017-07-28 23:54:51 +00:00
for ( var i = 0 ; i != ucnt && blob . l < end ; ++ i ) {
2015-04-02 22:14:07 +00:00
strs . push ( parse _XLUnicodeRichExtendedString ( blob ) ) ;
}
strs . Count = cnt ; strs . Unique = ucnt ;
return strs ;
}
2018-02-14 05:26:28 +00:00
/* [MS-XLS] 2.4.107 */
2015-04-02 22:14:07 +00:00
function parse _ExtSST ( blob , length ) {
var extsst = { } ;
extsst . dsst = blob . read _shift ( 2 ) ;
blob . l += length - 2 ;
return extsst ;
}
2018-02-14 05:26:28 +00:00
/* [MS-XLS] 2.4.221 TODO: check BIFF2-4 */
2018-01-23 09:09:53 +00:00
function parse _Row ( blob ) {
2017-04-30 16:28:24 +00:00
var z = ( { } ) ;
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)
2015-04-02 22:14:07 +00:00
var flags = blob . read _shift ( 1 ) ; // various flags
2017-04-30 16:28:24 +00:00
blob . l += 3 ; // reserved(8), ixfe(12), flags(4)
2017-07-10 22:29:24 +00:00
if ( flags & 0x07 ) z . level = flags & 0x07 ;
// collapsed: flags & 0x10
2017-04-30 16:28:24 +00:00
if ( flags & 0x20 ) z . hidden = true ;
if ( flags & 0x40 ) z . hpt = miyRw / 20 ;
return z ;
2015-04-02 22:14:07 +00:00
}
2018-02-14 05:26:28 +00:00
/* [MS-XLS] 2.4.125 */
2018-01-23 09:09:53 +00:00
function parse _ForceFullCalculation ( blob ) {
2015-04-02 22:14:07 +00:00
var header = parse _frtHeader ( blob ) ;
2017-03-28 22:07:46 +00:00
if ( header . type != 0x08A3 ) throw new Error ( "Invalid Future Record " + header . type ) ;
2015-04-02 22:14:07 +00:00
var fullcalc = blob . read _shift ( 4 ) ;
return fullcalc !== 0x0 ;
}
2018-02-14 05:26:28 +00:00
/* [MS-XLS] 2.4.215 rt */
2018-01-23 09:09:53 +00:00
function parse _RecalcId ( blob ) {
2015-04-02 22:14:07 +00:00
blob . read _shift ( 2 ) ;
return blob . read _shift ( 4 ) ;
}
2018-02-14 05:26:28 +00:00
/* [MS-XLS] 2.4.87 */
2017-05-09 18:11:15 +00:00
function parse _DefaultRowHeight ( blob , length , opts ) {
var f = 0 ;
if ( ! ( opts && opts . biff == 2 ) ) {
f = blob . read _shift ( 2 ) ;
}
2017-03-20 21:57:44 +00:00
var miyRw = blob . read _shift ( 2 ) ;
2017-05-09 18:11:15 +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 } ;
2015-04-02 22:14:07 +00:00
return [ fl , miyRw ] ;
}
2018-02-14 05:26:28 +00:00
/* [MS-XLS] 2.4.345 TODO */
2018-01-23 09:09:53 +00:00
function parse _Window1 ( blob ) {
2015-04-02 22:14:07 +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:09:53 +00:00
function write _Window1 ( ) {
2017-09-22 22:40:09 +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 05:26:28 +00:00
/* [MS-XLS] 2.4.346 TODO */
2017-12-30 05:41:41 +00:00
function parse _Window2 ( blob , length , opts ) {
if ( opts && opts . biff >= 2 && opts . biff < 8 ) return { } ;
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 ;
}
2015-04-02 22:14:07 +00:00
2018-02-14 05:26:28 +00:00
/* [MS-XLS] 2.4.122 TODO */
2015-04-02 22:14:07 +00:00
function parse _Font ( blob , length , opts ) {
2017-05-09 18:11:15 +00:00
var o = {
dyHeight : blob . read _shift ( 2 ) ,
fl : blob . read _shift ( 2 )
} ;
2018-02-14 05:26:28 +00:00
switch ( ( opts && opts . biff ) || 8 ) {
2017-05-09 18:11:15 +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 ;
2015-04-02 22:14:07 +00:00
}
2018-02-14 05:26:28 +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 ;
}
2015-04-02 22:14:07 +00:00
2018-02-14 05:26:28 +00:00
/* [MS-XLS] 2.4.149 */
2018-01-23 09:09:53 +00:00
function parse _LabelSst ( blob ) {
2015-04-02 22:14:07 +00:00
var cell = parse _XLSCell ( blob ) ;
cell . isst = blob . read _shift ( 4 ) ;
return cell ;
}
2018-02-14 05:26:28 +00:00
/* [MS-XLS] 2.4.148 */
2015-04-02 22:14:07 +00:00
function parse _Label ( blob , length , opts ) {
2017-02-19 21:11:48 +00:00
var target = blob . l + length ;
2015-04-02 22:14:07 +00:00
var cell = parse _XLSCell ( blob , 6 ) ;
2017-02-19 21:11:48 +00:00
if ( opts . biff == 2 ) blob . l ++ ;
var str = parse _XLUnicodeString ( blob , target - blob . l , opts ) ;
2015-04-02 22:14:07 +00:00
cell . val = str ;
return cell ;
}
2018-02-08 19:13:10 +00:00
function write _Label ( R , C , v , os , opts ) {
2017-10-17 00:36:51 +00:00
var b8 = ! opts || opts . biff == 8 ;
var o = new _buf ( 6 + 2 + ( + b8 ) + ( 1 + b8 ) * v . length ) ;
2018-02-08 19:13:10 +00:00
write _XLSCell ( R , C , os , o ) ;
2017-09-22 22:40:09 +00:00
o . write _shift ( 2 , v . length ) ;
2017-10-17 00:36:51 +00:00
if ( b8 ) o . write _shift ( 1 , 1 ) ;
o . write _shift ( ( 1 + b8 ) * v . length , v , b8 ? 'utf16le' : 'sbcs' ) ;
2017-09-22 22:40:09 +00:00
return o ;
}
2015-04-02 22:14:07 +00:00
2018-02-14 05:26:28 +00:00
/* [MS-XLS] 2.4.126 Number Formats */
2015-04-02 22:14:07 +00:00
function parse _Format ( blob , length , opts ) {
2017-07-28 23:54:51 +00:00
var numFmtId = blob . read _shift ( 2 ) ;
2015-04-02 22:14:07 +00:00
var fmtstr = parse _XLUnicodeString2 ( blob , 0 , opts ) ;
2017-07-28 23:54:51 +00:00
return [ numFmtId , fmtstr ] ;
2015-04-02 22:14:07 +00:00
}
2018-02-14 05:26:28 +00:00
function write _Format ( i , f , opts , o ) {
var b5 = ( opts && ( opts . biff == 5 ) ) ;
if ( ! o ) o = new _buf ( b5 ? ( 3 + f . length ) : ( 5 + 2 * f . length ) ) ;
2018-02-08 19:13:10 +00:00
o . write _shift ( 2 , i ) ;
2018-02-14 05:26:28 +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 19:13:10 +00:00
var out = ( o . length > o . l ) ? o . slice ( 0 , o . l ) : o ;
2018-02-14 05:26:28 +00:00
if ( out . l == null ) out . l = out . length ;
2018-02-08 19:13:10 +00:00
return out ;
}
2017-02-11 01:58:22 +00:00
var parse _BIFF2Format = parse _XLUnicodeString2 ;
2015-04-02 22:14:07 +00:00
2018-02-14 05:26:28 +00:00
/* [MS-XLS] 2.4.90 */
2017-02-19 21:11:48 +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:11:15 +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 21:11:48 +00:00
blob . l = end ;
2015-04-02 22:14:07 +00:00
return { s : { r : r , c : c } , e : { r : R , c : C } } ;
}
2017-09-22 22:40:09 +00:00
function write _Dimensions ( range , opts ) {
2017-10-17 00:36:51 +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:40:09 +00:00
o . write _shift ( 2 , range . s . c ) ;
o . write _shift ( 2 , range . e . c + 1 ) ;
o . write _shift ( 2 , 0 ) ;
return o ;
}
2015-04-02 22:14:07 +00:00
2018-02-14 05:26:28 +00:00
/* [MS-XLS] 2.4.220 */
2018-01-23 09:09:53 +00:00
function parse _RK ( blob ) {
2015-04-02 22:14:07 +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 05:26:28 +00:00
/* [MS-XLS] 2.4.175 */
2015-04-02 22:14:07 +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-28 22:07:46 +00:00
if ( blob . l !== target ) throw new Error ( "MulRK read error" ) ;
2015-04-02 22:14:07 +00:00
var lastcol = blob . read _shift ( 2 ) ;
2017-03-28 22:07:46 +00:00
if ( rkrecs . length != lastcol - col + 1 ) throw new Error ( "MulRK length mismatch" ) ;
2015-04-02 22:14:07 +00:00
return { r : rw , c : col , C : lastcol , rkrec : rkrecs } ;
}
2018-02-14 05:26:28 +00:00
/* [MS-XLS] 2.4.174 */
2017-03-16 04:39:50 +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-28 22:07:46 +00:00
if ( blob . l !== target ) throw new Error ( "MulBlank read error" ) ;
2017-03-16 04:39:50 +00:00
var lastcol = blob . read _shift ( 2 ) ;
2017-03-28 22:07:46 +00:00
if ( ixfes . length != lastcol - col + 1 ) throw new Error ( "MulBlank length mismatch" ) ;
2017-03-16 04:39:50 +00:00
return { r : rw , c : col , C : lastcol , ixfe : ixfes } ;
}
2015-04-02 22:14:07 +00:00
2018-02-14 05:26:28 +00:00
/* [MS-XLS] 2.5.20 2.5.249 TODO: interpret values here */
2017-03-20 21:57:44 +00:00
function parse _CellStyleXF ( blob , length , style , opts ) {
2015-04-02 22:14:07 +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-16 04:39:50 +00:00
2017-03-20 21:57:44 +00:00
if ( ! opts . cellStyles ) return o ;
2017-03-16 04:39:50 +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 ;
2015-04-02 22:14:07 +00:00
o . icvFore = d & 0x7F ;
o . icvBack = ( d >> 7 ) & 0x7F ;
2017-03-16 04:39:50 +00:00
o . fsxButton = ( d >> 14 ) & 0x01 ;
2015-04-02 22:14:07 +00:00
return o ;
}
2018-01-23 09:09:53 +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);}
2015-04-02 22:14:07 +00:00
2018-02-14 05:26:28 +00:00
/* [MS-XLS] 2.4.353 TODO: actually do this right */
2017-03-20 21:57:44 +00:00
function parse _XF ( blob , length , opts ) {
2015-04-02 22:14:07 +00:00
var o = { } ;
2017-07-28 23:54:51 +00:00
o . ifnt = blob . read _shift ( 2 ) ; o . numFmtId = blob . read _shift ( 2 ) ; o . flags = blob . read _shift ( 2 ) ;
2015-04-02 22:14:07 +00:00
o . fStyle = ( o . flags >> 2 ) & 0x01 ;
length -= 6 ;
2017-03-20 21:57:44 +00:00
o . data = parse _CellStyleXF ( blob , length , o . fStyle , opts ) ;
2015-04-02 22:14:07 +00:00
return o ;
}
2018-02-14 05:26:28 +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 19:13:10 +00:00
o . write _shift ( 2 , 0 ) ;
2018-02-14 05:26:28 +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 ) ) ;
}
2018-02-08 19:13:10 +00:00
o . write _shift ( 4 , 0 ) ;
o . write _shift ( 4 , 0 ) ;
2018-02-14 05:26:28 +00:00
if ( ! b5 ) o . write _shift ( 4 , 0 ) ;
2018-02-08 19:13:10 +00:00
o . write _shift ( 2 , 0 ) ;
return o ;
}
2015-04-02 22:14:07 +00:00
2018-02-14 05:26:28 +00:00
/* [MS-XLS] 2.4.134 */
2018-01-23 09:09:53 +00:00
function parse _Guts ( blob ) {
2015-04-02 22:14:07 +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-28 22:07:46 +00:00
if ( out [ 0 ] > 7 || out [ 1 ] > 7 ) throw new Error ( "Bad Gutters: " + out . join ( "|" ) ) ;
2015-04-02 22:14:07 +00:00
return out ;
}
2017-09-22 22:40:09 +00:00
function write _Guts ( guts ) {
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 ;
}
2015-04-02 22:14:07 +00:00
2018-02-14 05:26:28 +00:00
/* [MS-XLS] 2.4.24 */
2017-02-11 01:58:22 +00:00
function parse _BoolErr ( blob , length , opts ) {
2015-04-02 22:14:07 +00:00
var cell = parse _XLSCell ( blob , 6 ) ;
2017-02-11 01:58:22 +00:00
if ( opts . biff == 2 ) ++ blob . l ;
2015-04-02 22:14:07 +00:00
var val = parse _Bes ( blob , 2 ) ;
cell . val = val ;
cell . t = ( val === true || val === false ) ? 'b' : 'e' ;
return cell ;
}
2018-02-08 19:13:10 +00:00
function write _BoolErr ( R , C , v , os , opts , t ) {
2017-09-22 22:40:09 +00:00
var o = new _buf ( 8 ) ;
2018-02-08 19:13:10 +00:00
write _XLSCell ( R , C , os , o ) ;
2017-09-22 22:40:09 +00:00
write _Bes ( v , t , o ) ;
return o ;
}
2015-04-02 22:14:07 +00:00
2018-02-14 05:26:28 +00:00
/* [MS-XLS] 2.4.180 Number */
2018-01-23 09:09:53 +00:00
function parse _Number ( blob ) {
2015-04-02 22:14:07 +00:00
var cell = parse _XLSCell ( blob , 6 ) ;
var xnum = parse _Xnum ( blob , 8 ) ;
cell . val = xnum ;
return cell ;
}
2018-02-08 19:13:10 +00:00
function write _Number ( R , C , v , os ) {
2017-09-22 22:40:09 +00:00
var o = new _buf ( 14 ) ;
2018-02-08 19:13:10 +00:00
write _XLSCell ( R , C , os , o ) ;
2017-09-22 22:40:09 +00:00
write _Xnum ( v , o ) ;
return o ;
}
2015-04-02 22:14:07 +00:00
var parse _XLHeaderFooter = parse _OptXLUnicodeString ; // TODO: parse 2.4.136
2018-02-14 05:26:28 +00:00
/* [MS-XLS] 2.4.271 */
2015-04-02 22:14:07 +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:56:23 +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-28 23:54:51 +00:00
/* TODO: 2.5.277 Virtual Path */
var rgst = [ ] ;
while ( end > blob . l ) rgst . push ( parse _XLUnicodeString ( blob ) ) ;
2015-04-02 22:14:07 +00:00
return [ cch , ctab , virtPath , rgst ] ;
}
2018-02-14 05:26:28 +00:00
/* [MS-XLS] 2.4.105 TODO */
2015-04-02 22:14:07 +00:00
function parse _ExternName ( blob , length , opts ) {
var flags = blob . read _shift ( 2 ) ;
var body ;
2017-02-11 01:58:22 +00:00
var o = ( {
2015-04-02 22:14:07 +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-11 01:58:22 +00:00
} ) ;
2017-02-19 21:11:48 +00:00
if ( opts . sbcch === 0x3A01 ) body = parse _AddinUdf ( blob , length - 2 , opts ) ;
2015-04-02 22:14:07 +00:00
//else throw new Error("unsupported SupBook cch: " + opts.sbcch);
o . body = body || blob . read _shift ( length - 2 ) ;
2017-04-16 07:35:56 +00:00
if ( typeof body === "string" ) o . Name = body ;
2015-04-02 22:14:07 +00:00
return o ;
}
2018-02-14 05:26:28 +00:00
/* [MS-XLS] 2.4.150 TODO */
2017-06-10 01:56:23 +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"
] ;
2015-04-02 22:14:07 +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 21:11:48 +00:00
var cce = blob . read _shift ( opts && opts . biff == 2 ? 1 : 2 ) ;
2017-04-16 07:35:56 +00:00
var itab = 0 ;
2017-02-19 21:11:48 +00:00
if ( ! opts || opts . biff >= 5 ) {
2017-12-15 02:01:07 +00:00
if ( opts . biff != 5 ) blob . l += 2 ;
2017-04-16 07:35:56 +00:00
itab = blob . read _shift ( 2 ) ;
2017-12-15 02:01:07 +00:00
if ( opts . biff == 5 ) blob . l += 2 ;
2017-02-19 21:11:48 +00:00
blob . l += 4 ;
}
2015-04-02 22:14:07 +00:00
var name = parse _XLUnicodeStringNoCch ( blob , cch , opts ) ;
2017-06-10 01:56:23 +00:00
if ( flags & 0x20 ) name = XLSLblBuiltIn [ name . charCodeAt ( 0 ) ] ;
2017-02-19 21:11:48 +00:00
var npflen = target - blob . l ; if ( opts && opts . biff == 2 ) -- npflen ;
2017-10-17 00:36:51 +00:00
var rgce = target == blob . l || cce === 0 ? [ ] : parse _NameParsedFormula ( blob , npflen , opts , cce ) ;
2015-04-02 22:14:07 +00:00
return {
chKey : chKey ,
Name : name ,
2017-04-16 07:35:56 +00:00
itab : itab ,
2015-04-02 22:14:07 +00:00
rgce : rgce
} ;
}
2018-02-14 05:26:28 +00:00
/* [MS-XLS] 2.4.106 TODO: verify filename encoding */
2015-04-02 22:14:07 +00:00
function parse _ExternSheet ( blob , length , opts ) {
2017-07-28 23:54: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-16 07:35:56 +00:00
// [iSupBook, itabFirst, itabLast];
2018-01-23 09:09:53 +00:00
if ( blob . l != target ) throw new Error ( "Bad ExternSheet: " + blob . l + " != " + target ) ;
2017-04-16 07:35:56 +00:00
return o ;
}
2017-07-28 23:54: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-16 07:35:56 +00:00
2018-02-14 05:26:28 +00:00
/* [MS-XLS] 2.4.176 TODO: check older biff */
2017-04-16 07:35:56 +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 ] ;
2015-04-02 22:14:07 +00:00
}
2018-02-14 05:26:28 +00:00
/* [MS-XLS] 2.4.260 */
2015-04-02 22:14:07 +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:40:54 +00:00
return [ parse _SharedParsedFormula ( blob , length , opts ) , cUse , ref ] ;
2015-04-02 22:14:07 +00:00
}
2018-02-14 05:26:28 +00:00
/* [MS-XLS] 2.4.4 TODO */
2015-04-02 22:14:07 +00:00
function parse _Array ( blob , length , opts ) {
var ref = parse _Ref ( blob , 6 ) ;
2017-02-19 21:11:48 +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 ;
}
2015-04-02 22:14:07 +00:00
return [ ref , parse _ArrayParsedFormula ( blob , length , opts , ref ) ] ;
}
2018-02-14 05:26:28 +00:00
/* [MS-XLS] 2.4.173 */
2018-01-23 09:09:53 +00:00
function parse _MTRSettings ( blob ) {
2015-04-02 22:14:07 +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 05:26:28 +00:00
/* [MS-XLS] 2.5.186 TODO: BIFF5 */
2015-04-02 22:14:07 +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 05:26:28 +00:00
/* [MS-XLS] 2.4.179 */
2015-04-02 22:14:07 +00:00
function parse _Note ( blob , length , opts ) {
/* TODO: Support revisions */
return parse _NoteSh ( blob , length , opts ) ;
}
2018-02-14 05:26:28 +00:00
/* [MS-XLS] 2.4.168 */
2015-04-02 22:14:07 +00:00
function parse _MergeCells ( blob , length ) {
var merges = [ ] ;
var cmcs = blob . read _shift ( 2 ) ;
while ( cmcs -- ) merges . push ( parse _Ref8U ( blob , length ) ) ;
return merges ;
}
2017-12-30 05:41:41 +00:00
function write _MergeCells ( merges ) {
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 ;
}
2015-04-02 22:14:07 +00:00
2018-02-14 05:26:28 +00:00
/* [MS-XLS] 2.4.181 TODO: parse all the things! */
2017-05-09 18:11:15 +00:00
function parse _Obj ( blob , length , opts ) {
if ( opts && opts . biff < 8 ) return parse _BIFF5Obj ( blob , length , opts ) ;
2015-04-02 22:14:07 +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:11:15 +00:00
/* from older spec */
var parse _BIFF5OT = [ ] ;
2018-01-23 09:09:53 +00:00
parse _BIFF5OT [ 0x08 ] = function ( blob , length ) {
2017-05-09 18:11:15 +00:00
var tgt = blob . l + length ;
blob . l += 10 ; // todo
var cf = blob . read _shift ( 2 ) ;
blob . l += 4 ;
2018-01-23 09:09:53 +00:00
blob . l += 2 ; //var cbPictFmla = blob.read_shift(2);
2017-05-09 18:11:15 +00:00
blob . l += 2 ;
2018-01-23 09:09:53 +00:00
blob . l += 2 ; //var grbit = blob.read_shift(2);
2017-05-09 18:11:15 +00:00
blob . l += 4 ;
var cchName = blob . read _shift ( 1 ) ;
blob . l += cchName ; // TODO: stName
blob . l = tgt ; // TODO: fmla
return { fmt : cf } ;
} ;
function parse _BIFF5Obj ( blob , length , opts ) {
2018-01-23 09:09:53 +00:00
blob . l += 4 ; //var cnt = blob.read_shift(4);
2017-05-09 18:11:15 +00:00
var ot = blob . read _shift ( 2 ) ;
var id = blob . read _shift ( 2 ) ;
var grbit = blob . read _shift ( 2 ) ;
2018-01-23 09:09:53 +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:11:15 +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 } ;
}
2015-04-02 22:14:07 +00:00
2018-02-14 05:26:28 +00:00
/* [MS-XLS] 2.4.329 TODO: parse properly */
2015-04-02 22:14:07 +00:00
function parse _TxO ( blob , length , opts ) {
var s = blob . l ;
2017-02-11 01:58:22 +00:00
var texts = "" ;
2015-04-02 22:14:07 +00:00
try {
blob . l += 4 ;
var ot = ( opts . lastobj || { cmo : [ 0 , 0 ] } ) . cmo [ 1 ] ;
2018-01-23 09:09:53 +00:00
var controlInfo ; // eslint-disable-line no-unused-vars
2015-04-02 22:14:07 +00:00
if ( [ 0 , 5 , 7 , 11 , 12 , 14 ] . indexOf ( ot ) == - 1 ) blob . l += 6 ;
else controlInfo = parse _ControlInfo ( blob , 6 , opts ) ;
var cchText = blob . read _shift ( 2 ) ;
2018-01-23 09:09:53 +00:00
/*var cbRuns = */ blob . read _shift ( 2 ) ;
/*var ifntEmpty = */ parseuint16 ( blob , 2 ) ;
2015-04-02 22:14:07 +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-28 22:07:46 +00:00
if ( blob . l - s != blob . lens [ i ] ) throw new Error ( "TxO: bad continue record" ) ;
2015-04-02 22:14:07 +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-28 22:07:46 +00:00
throw new Error ( "cchText: " + cchText + " != " + texts . length ) ;
2015-04-02 22:14:07 +00:00
}
blob . l = s + length ;
2018-02-14 05:26:28 +00:00
/* [MS-XLS] 2.5.272 TxORuns */
2015-04-02 22:14:07 +00:00
// var rgTxoRuns = [];
// for(var j = 0; j != cbRuns/8-1; ++j) blob.l += 8;
// var cchText2 = blob.read_shift(2);
2017-03-28 22:07:46 +00:00
// if(cchText2 !== cchText) throw new Error("TxOLastRun mismatch: " + cchText2 + " " + cchText);
2015-04-02 22:14:07 +00:00
// blob.l += 6;
2017-03-28 22:07:46 +00:00
// if(s + length != blob.l) throw new Error("TxO " + (s + length) + ", at " + blob.l);
2015-04-02 22:14:07 +00:00
return { t : texts } ;
2017-02-11 01:58:22 +00:00
} catch ( e ) { blob . l = s + length ; return { t : texts } ; }
2015-04-02 22:14:07 +00:00
}
2018-02-14 05:26:28 +00:00
/* [MS-XLS] 2.4.140 */
2017-09-22 22:40:09 +00:00
function parse _HLink ( blob , length ) {
2015-04-02 22:14:07 +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:40:09 +00:00
}
2017-12-15 02:01:07 +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 ] ) ] ) ;
}
2015-04-02 22:14:07 +00:00
2018-02-14 05:26:28 +00:00
/* [MS-XLS] 2.4.141 */
2017-09-22 22:40:09 +00:00
function parse _HLinkTooltip ( blob , length ) {
2015-04-02 22:14:07 +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:40:09 +00:00
}
2017-12-15 02:01:07 +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 ;
}
2015-04-02 22:14:07 +00:00
2018-02-14 05:26:28 +00:00
/* [MS-XLS] 2.4.63 */
2018-01-23 09:09:53 +00:00
function parse _Country ( blob ) {
2017-12-30 05:41:41 +00:00
var o = [ 0 , 0 ] , d ;
2015-04-02 22:14:07 +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:40:09 +00:00
function write _Country ( o ) {
if ( ! o ) o = new _buf ( 4 ) ;
o . write _shift ( 2 , 0x01 ) ;
o . write _shift ( 2 , 0x01 ) ;
return o ;
}
2015-04-02 22:14:07 +00:00
2018-02-14 05:26:28 +00:00
/* [MS-XLS] 2.4.50 ClrtClient */
2018-01-23 09:09:53 +00:00
function parse _ClrtClient ( blob ) {
2015-04-02 22:14:07 +00:00
var ccv = blob . read _shift ( 2 ) ;
var o = [ ] ;
while ( ccv -- > 0 ) o . push ( parse _LongRGB ( blob , 8 ) ) ;
return o ;
}
2018-02-14 05:26:28 +00:00
/* [MS-XLS] 2.4.188 */
2018-01-23 09:09:53 +00:00
function parse _Palette ( blob ) {
2015-04-02 22:14:07 +00:00
var ccv = blob . read _shift ( 2 ) ;
var o = [ ] ;
while ( ccv -- > 0 ) o . push ( parse _LongRGB ( blob , 8 ) ) ;
return o ;
}
2018-02-14 05:26:28 +00:00
/* [MS-XLS] 2.4.354 */
2018-01-23 09:09:53 +00:00
function parse _XFCRC ( blob ) {
2015-04-02 22:14:07 +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 05:26:28 +00:00
/* [MS-XLS] 2.4.53 TODO: parse flags */
2017-03-20 21:57:44 +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 ;
return { s : colFirst , e : colLast , w : coldx , ixfe : ixfe , flags : flags } ;
}
2018-02-14 05:26:28 +00:00
/* [MS-XLS] 2.4.257 */
function parse _Setup ( blob , length ) {
2017-04-16 07:35:56 +00:00
var o = { } ;
2018-02-14 05:26:28 +00:00
if ( length < 32 ) return o ;
2017-04-16 07:35:56 +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 05:26:28 +00:00
/* [MS-XLS] 2.4.261 */
2017-03-28 22:07:46 +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 05:26:28 +00:00
/* [MS-XLS] 2.4.241 */
2017-09-22 22:40:09 +00:00
function write _RRTabId ( n ) {
var out = new _buf ( 2 * n ) ;
for ( var i = 0 ; i < n ; ++ i ) out . write _shift ( 2 , i + 1 ) ;
return out ;
}
2015-04-02 22:14:07 +00:00
2018-02-14 05:26:28 +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 */
2015-04-02 22:14:07 +00:00
/* --- Specific to versions before BIFF8 --- */
2018-01-23 09:09:53 +00:00
function parse _ImData ( blob ) {
2017-05-09 18:11:15 +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 ;
}
2015-04-02 22:14:07 +00:00
/* BIFF2_??? where ??? is the name from [XLS] */
function parse _BIFF2STR ( blob , length , opts ) {
var cell = parse _XLSCell ( blob , 6 ) ;
++ blob . l ;
var str = parse _XLUnicodeString2 ( blob , length - 7 , opts ) ;
2017-02-19 21:11:48 +00:00
cell . t = 'str' ;
2015-04-02 22:14:07 +00:00
cell . val = str ;
return cell ;
}
2018-01-23 09:09:53 +00:00
function parse _BIFF2NUM ( blob ) {
2015-04-02 22:14:07 +00:00
var cell = parse _XLSCell ( blob , 6 ) ;
++ blob . l ;
var num = parse _Xnum ( blob , 8 ) ;
2017-02-19 21:11:48 +00:00
cell . t = 'n' ;
2015-04-02 22:14:07 +00:00
cell . val = num ;
return cell ;
}
2017-09-22 22:40:09 +00:00
function write _BIFF2NUM ( r , c , val ) {
var out = new _buf ( 15 ) ;
write _BIFF2Cell ( out , r , c ) ;
out . write _shift ( 8 , val , 'f' ) ;
return out ;
}
2015-04-02 22:14:07 +00:00
2018-01-23 09:09:53 +00:00
function parse _BIFF2INT ( blob ) {
2017-02-11 01:58:22 +00:00
var cell = parse _XLSCell ( blob , 6 ) ;
++ blob . l ;
var num = blob . read _shift ( 2 ) ;
2017-02-19 21:11:48 +00:00
cell . t = 'n' ;
2017-02-11 01:58:22 +00:00
cell . val = num ;
return cell ;
}
2017-09-22 22:40:09 +00:00
function write _BIFF2INT ( r , c , val ) {
var out = new _buf ( 9 ) ;
write _BIFF2Cell ( out , r , c ) ;
out . write _shift ( 2 , val ) ;
return out ;
}
2017-02-11 01:58:22 +00:00
2018-01-23 09:09:53 +00:00
function parse _BIFF2STRING ( blob ) {
2017-02-11 01:58:22 +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:11:15 +00:00
blob . l += length - 13 ;
2017-02-11 01:58:22 +00:00
}
2017-02-19 21:11:48 +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 22:07:46 +00:00
/* from js-harb (C) 2014-present SheetJS */
var DBF = ( function ( ) {
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 ,
0x59 : 1252 ,
0xFF : 16969
} ;
/* TODO: find an actual specification */
function dbf _to _aoa ( buf , opts ) {
var out = [ ] ;
/* TODO: browser based */
var d = ( new _raw _buf ( 1 ) ) ;
switch ( opts . type ) {
case 'base64' : d = s2a ( Base64 . decode ( buf ) ) ; break ;
case 'binary' : d = s2a ( buf ) ; break ;
case 'buffer' :
case 'array' : d = buf ; break ;
}
prep _blob ( d , 0 ) ;
/* header */
var ft = d . read _shift ( 1 ) ;
var memo = false ;
2017-10-17 00:36:51 +00:00
var vfp = false , l7 = false ;
2017-03-28 22:07:46 +00:00
switch ( ft ) {
2017-04-03 06:04:35 +00:00
case 0x02 : case 0x03 : break ;
2017-03-28 22:07:46 +00:00
case 0x30 : vfp = true ; memo = true ; break ;
case 0x31 : vfp = true ; break ;
case 0x83 : memo = true ; break ;
case 0x8B : memo = true ; break ;
2017-10-17 00:36:51 +00:00
case 0x8C : memo = true ; l7 = true ; break ;
2017-03-28 22:07:46 +00:00
case 0xF5 : memo = true ; break ;
2017-03-31 21:50:32 +00:00
default : throw new Error ( "DBF Unsupported Version: " + ft . toString ( 16 ) ) ;
2017-03-28 22:07:46 +00:00
}
2018-01-23 09:09:53 +00:00
var /*filedate = new Date(),*/ nrow = 0 , fpos = 0 ;
2017-04-03 06:04:35 +00:00
if ( ft == 0x02 ) nrow = d . read _shift ( 2 ) ;
2018-01-23 09:09:53 +00:00
/*filedate = new Date(d.read_shift(1) + 1900, d.read_shift(1) - 1, d.read_shift(1));*/ d . l += 3 ;
2017-04-03 06:04:35 +00:00
if ( ft != 0x02 ) nrow = d . read _shift ( 4 ) ;
if ( ft != 0x02 ) fpos = d . read _shift ( 2 ) ;
2017-03-28 22:07:46 +00:00
var rlen = d . read _shift ( 2 ) ;
2018-01-23 09:09:53 +00:00
var /*flags = 0,*/ current _cp = 1252 ;
2017-04-03 06:04:35 +00:00
if ( ft != 0x02 ) {
d . l += 16 ;
2018-01-23 09:09:53 +00:00
/*flags = */ d . read _shift ( 1 ) ;
2017-03-28 22:07:46 +00:00
//if(memo && ((flags & 0x02) === 0)) throw new Error("DBF Flags " + flags.toString(16) + " ft " + ft.toString(16));
/* codepage present in FoxPro */
if ( d [ d . l ] !== 0 ) current _cp = dbf _codepage _map [ d [ d . l ] ] ;
d . l += 1 ;
d . l += 2 ;
2017-04-03 06:04:35 +00:00
}
2017-10-17 00:36:51 +00:00
if ( l7 ) d . l += 36 ;
2017-12-30 05:41:41 +00:00
var fields = [ ] , field = ( { } ) ;
2017-10-17 00:36:51 +00:00
var hend = fpos - 10 - ( vfp ? 264 : 0 ) , ww = l7 ? 32 : 11 ;
2017-04-03 06:04:35 +00:00
while ( ft == 0x02 ? d . l < d . length && d [ d . l ] != 0x0d : d . l < hend ) {
2017-12-30 05:41:41 +00:00
field = ( { } ) ;
2017-10-17 00:36:51 +00:00
field . name = cptable . utils . decode ( current _cp , d . slice ( d . l , d . l + ww ) ) . replace ( /[\u0000\r\n].*$/g , "" ) ;
d . l += ww ;
2017-03-28 22:07:46 +00:00
field . type = String . fromCharCode ( d . read _shift ( 1 ) ) ;
2017-10-17 00:36:51 +00:00
if ( ft != 0x02 && ! l7 ) field . offset = d . read _shift ( 4 ) ;
2017-03-28 22:07:46 +00:00
field . len = d . read _shift ( 1 ) ;
2017-04-03 06:04:35 +00:00
if ( ft == 0x02 ) field . offset = d . read _shift ( 2 ) ;
2017-03-28 22:07:46 +00:00
field . dec = d . read _shift ( 1 ) ;
if ( field . name . length ) fields . push ( field ) ;
2017-10-17 00:36:51 +00:00
if ( ft != 0x02 ) d . l += l7 ? 13 : 14 ;
2017-03-28 22:07:46 +00:00
switch ( field . type ) {
2017-10-17 00:36:51 +00:00
case 'B' : // VFP Double
if ( ( ! vfp || field . len != 8 ) && opts . WTF ) console . log ( 'Skipping ' + field . name + ':' + field . type ) ;
break ;
case 'G' : // General
case 'P' : // Picture
if ( opts . WTF ) console . log ( 'Skipping ' + field . name + ':' + field . type ) ;
break ;
case 'C' : // character
case 'D' : // date
case 'F' : // floating point
case 'I' : // long
case 'L' : // boolean
case 'M' : // memo
case 'N' : // number
case 'O' : // double
case 'T' : // datetime
case 'Y' : // currency
case '0' : // VFP _NullFlags
case '@' : // timestamp
case '+' : // autoincrement
break ;
2017-03-28 22:07:46 +00:00
default : throw new Error ( 'Unknown Field Type: ' + field . type ) ;
}
}
if ( d [ d . l ] !== 0x0D ) d . l = fpos - 1 ;
2017-04-03 06:04:35 +00:00
else if ( ft == 0x02 ) d . l = 0x209 ;
if ( ft != 0x02 ) {
if ( d . read _shift ( 1 ) !== 0x0D ) throw new Error ( "DBF Terminator not found " + d . l + " " + d [ d . l ] ) ;
d . l = fpos ;
}
2017-03-28 22:07:46 +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 ) {
if ( d [ d . l ] === 0x2A ) { d . l += rlen ; continue ; }
++ 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 ) ;
var s = cptable . utils . decode ( current _cp , dd ) ;
switch ( fields [ C ] . type ) {
case 'C' :
out [ R ] [ C ] = cptable . utils . decode ( current _cp , dd ) ;
out [ R ] [ C ] = out [ R ] [ C ] . trim ( ) ;
break ;
case 'D' :
2018-01-23 09:09:53 +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 22:07:46 +00:00
else out [ R ] [ C ] = s ;
break ;
case 'F' : out [ R ] [ C ] = parseFloat ( s . trim ( ) ) ; break ;
2017-10-17 00:36:51 +00:00
case '+' : case 'I' : out [ R ] [ C ] = l7 ? dd . read _shift ( - 4 , 'i' ) ^ 0x80000000 : dd . read _shift ( 4 , 'i' ) ; break ;
2017-03-28 22:07:46 +00:00
case 'L' : switch ( s . toUpperCase ( ) ) {
case 'Y' : case 'T' : out [ R ] [ C ] = true ; break ;
case 'N' : case 'F' : out [ R ] [ C ] = false ; break ;
2017-09-22 22:40:09 +00:00
case ' ' : case '?' : out [ R ] [ C ] = false ; break ; /* NOTE: technically uninitialized */
2017-03-28 22:07:46 +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:36:51 +00:00
out [ R ] [ C ] = "##MEMO##" + ( l7 ? parseInt ( s . trim ( ) , 10 ) : dd . read _shift ( 4 ) ) ;
2017-03-28 22:07:46 +00:00
break ;
case 'N' : out [ R ] [ C ] = + s . replace ( /\u0000/g , "" ) . trim ( ) ; break ;
2017-10-17 00:36:51 +00:00
case '@' : out [ R ] [ C ] = new Date ( dd . read _shift ( - 8 , 'f' ) - 0x388317533400 ) ; break ;
case 'T' : out [ R ] [ C ] = new Date ( ( dd . read _shift ( 4 ) - 0x253D8C ) * 0x5265C00 + dd . read _shift ( 4 ) ) ; break ;
case 'Y' : out [ R ] [ C ] = dd . read _shift ( 4 , 'i' ) / 1e4 ; break ;
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 22:07:46 +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 06:04:35 +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:36:52 +00:00
if ( opts && opts . sheetRows ) out = out . slice ( 0 , opts . sheetRows ) ;
2017-03-28 22:07:46 +00:00
return out ;
}
function dbf _to _sheet ( buf , opts ) {
var o = opts || { } ;
if ( ! o . dateNF ) o . dateNF = "yyyymmdd" ;
return aoa _to _sheet ( dbf _to _aoa ( buf , o ) , o ) ;
}
function dbf _to _workbook ( buf , opts ) {
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 19:55:07 +00:00
var _RLEN = { 'B' : 8 , 'C' : 250 , 'L' : 1 , 'D' : 8 , '?' : 0 , '' : 0 } ;
function sheet _to _dbf ( ws , opts ) {
var o = opts || { } ;
if ( o . type == "string" ) throw new Error ( "Cannot write DBF to JS string" ) ;
var ba = buf _array ( ) ;
var aoa = sheet _to _json ( ws , { header : 1 , raw : true , cellDates : true } ) ;
var headers = aoa [ 0 ] , data = aoa . slice ( 1 ) ;
var i = 0 , j = 0 , hcnt = 0 , rlen = 1 ;
for ( i = 0 ; i < headers . length ; ++ i ) {
if ( i == null ) continue ;
++ hcnt ;
2018-04-06 06:36:52 +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 19:55:07 +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' ] ) ;
var coltypes = [ ] ;
for ( i = 0 ; i <= range . e . c - range . s . c ; ++ i ) {
var col = [ ] ;
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 ; }
var guess = '' , _guess = '' ;
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' ;
}
guess = guess && guess != _guess ? 'C' : _guess ;
if ( guess == 'C' ) break ;
}
rlen += _RLEN [ guess ] || 0 ;
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 ) ;
h . write _shift ( 4 , 0x00000300 ) ; // TODO: CP
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 ) ;
hf . write _shift ( 1 , _RLEN [ coltypes [ i ] ] || 0 ) ;
hf . write _shift ( 1 , 0 ) ;
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 ) ;
j += _RLEN [ coltypes [ i ] ] || 0 ;
}
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 ;
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' :
var _s = String ( data [ i ] [ j ] || "" ) ;
rout . write _shift ( 1 , _s , "sbcs" ) ;
for ( hcnt = 0 ; hcnt < 250 - _s . length ; ++ hcnt ) rout . write _shift ( 1 , 0x20 ) ; break ;
}
}
// data
}
ba . next ( 1 ) . write _shift ( 1 , 0x1A ) ;
return ba . end ( ) ;
}
2017-03-28 22:07:46 +00:00
return {
to _workbook : dbf _to _workbook ,
2017-10-27 19:55:07 +00:00
to _sheet : dbf _to _sheet ,
from _sheet : sheet _to _dbf
2017-03-28 22:07:46 +00:00
} ;
} ) ( ) ;
2017-04-03 06:04:35 +00:00
var SYLK = ( function ( ) {
/* TODO: find an actual specification */
function sylk _to _aoa ( d , opts ) {
switch ( opts . type ) {
case 'base64' : return sylk _to _aoa _str ( Base64 . decode ( d ) , opts ) ;
case 'binary' : return sylk _to _aoa _str ( d , opts ) ;
case 'buffer' : return sylk _to _aoa _str ( d . toString ( 'binary' ) , opts ) ;
case 'array' : return sylk _to _aoa _str ( cc2str ( d ) , opts ) ;
}
throw new Error ( "Unrecognized type " + opts . type ) ;
}
function sylk _to _aoa _str ( str , opts ) {
var records = str . split ( /[\n\r]+/ ) , R = - 1 , C = - 1 , ri = 0 , rj = 0 , arr = [ ] ;
var formats = [ ] ;
var next _cell _format = null ;
2017-04-30 16:28:24 +00:00
var sht = { } , rowinfo = [ ] , colinfo = [ ] , cw = [ ] ;
var Mval = 0 , j ;
2017-04-03 06:04:35 +00:00
for ( ; ri !== records . length ; ++ ri ) {
2017-04-30 16:28:24 +00:00
Mval = 0 ;
2017-05-11 18:57:52 +00:00
var rstr = records [ ri ] . trim ( ) ;
var record = rstr . replace ( /;;/g , "\u0001" ) . split ( ";" ) . map ( function ( x ) { return x . replace ( /\u0001/g , ";" ) ; } ) ;
var RT = record [ 0 ] , val ;
2017-05-09 18:11:15 +00:00
if ( rstr . length > 0 ) switch ( RT ) {
case 'ID' : break ; /* header */
case 'E' : break ; /* EOF */
case 'B' : break ; /* dimensions */
case 'O' : break ; /* options? */
case 'P' :
if ( record [ 1 ] . charAt ( 0 ) == 'P' )
2018-01-23 09:09:53 +00:00
formats . push ( rstr . slice ( 3 ) . replace ( /;;/g , ";" ) ) ;
2017-04-30 16:28:24 +00:00
break ;
2017-05-09 18:11:15 +00:00
case 'C' :
2018-05-20 03:03:23 +00:00
var C _seen _K = false , C _seen _X = false ;
2017-05-09 18:11:15 +00:00
for ( rj = 1 ; rj < record . length ; ++ rj ) switch ( record [ rj ] . charAt ( 0 ) ) {
2018-05-20 03:03:23 +00:00
case 'X' : C = parseInt ( record [ rj ] . slice ( 1 ) ) - 1 ; C _seen _X = true ; break ;
2017-04-03 06:04:35 +00:00
case 'Y' :
2018-05-20 03:03:23 +00:00
R = parseInt ( record [ rj ] . slice ( 1 ) ) - 1 ; if ( ! C _seen _X ) C = 0 ;
2017-04-30 16:28:24 +00:00
for ( j = arr . length ; j <= R ; ++ j ) arr [ j ] = [ ] ;
2017-04-03 06:04:35 +00:00
break ;
case 'K' :
2018-01-23 09:09:53 +00:00
val = record [ rj ] . slice ( 1 ) ;
if ( val . charAt ( 0 ) === '"' ) val = val . slice ( 1 , val . length - 1 ) ;
2017-04-03 06:04:35 +00:00
else if ( val === 'TRUE' ) val = true ;
else if ( val === 'FALSE' ) val = false ;
2017-08-10 23:55:45 +00:00
else if ( ! isNaN ( fuzzynum ( val ) ) ) {
val = fuzzynum ( val ) ;
2017-04-30 16:28:24 +00:00
if ( next _cell _format !== null && SSF . is _date ( next _cell _format ) ) val = numdate ( val ) ;
2017-05-17 04:27:55 +00:00
} else if ( ! isNaN ( fuzzydate ( val ) . getDate ( ) ) ) {
val = parseDate ( val ) ;
2017-04-03 06:04:35 +00:00
}
2018-05-20 03:03:23 +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:42:56 +00:00
C _seen _K = true ;
2017-04-03 06:04:35 +00:00
break ;
2017-05-09 18:11:15 +00:00
case 'E' :
2018-01-23 09:09:53 +00:00
var formula = rc _to _a1 ( record [ rj ] . slice ( 1 ) , { r : R , c : C } ) ;
2017-05-11 18:57:52 +00:00
arr [ R ] [ C ] = [ arr [ R ] [ C ] , formula ] ;
break ;
2017-05-09 18:11:15 +00:00
default : if ( opts && opts . WTF ) throw new Error ( "SYLK bad record " + rstr ) ;
2018-05-05 06:42:56 +00:00
}
if ( C _seen _K ) { arr [ R ] [ C ] = val ; next _cell _format = null ; }
break ;
2017-05-09 18:11:15 +00:00
case 'F' :
2017-05-11 18:57:52 +00:00
var F _seen = 0 ;
2017-05-09 18:11:15 +00:00
for ( rj = 1 ; rj < record . length ; ++ rj ) switch ( record [ rj ] . charAt ( 0 ) ) {
2018-01-23 09:09:53 +00:00
case 'X' : C = parseInt ( record [ rj ] . slice ( 1 ) ) - 1 ; ++ F _seen ; break ;
2017-05-09 18:11:15 +00:00
case 'Y' :
2018-01-23 09:09:53 +00:00
R = parseInt ( record [ rj ] . slice ( 1 ) ) - 1 ; /*C = 0;*/
2017-05-09 18:11:15 +00:00
for ( j = arr . length ; j <= R ; ++ j ) arr [ j ] = [ ] ;
2017-05-17 04:27:55 +00:00
break ;
2018-01-23 09:09:53 +00:00
case 'M' : Mval = parseInt ( record [ rj ] . slice ( 1 ) ) / 20 ; break ;
2017-05-09 18:11:15 +00:00
case 'F' : break ; /* ??? */
2018-05-05 06:42:56 +00:00
case 'G' : break ; /* hide grid */
2017-04-03 06:04:35 +00:00
case 'P' :
2018-01-23 09:09:53 +00:00
next _cell _format = formats [ parseInt ( record [ rj ] . slice ( 1 ) ) ] ;
2017-04-30 16:28:24 +00:00
break ;
2017-05-09 18:11:15 +00:00
case 'S' : break ; /* cell style */
case 'D' : break ; /* column */
case 'N' : break ; /* font */
2017-04-30 16:28:24 +00:00
case 'W' :
2018-01-23 09:09:53 +00:00
cw = record [ rj ] . slice ( 1 ) . split ( " " ) ;
2017-04-30 16:28:24 +00:00
for ( j = parseInt ( cw [ 0 ] , 10 ) ; j <= parseInt ( cw [ 1 ] , 10 ) ; ++ j ) {
Mval = parseInt ( cw [ 2 ] , 10 ) ;
2017-10-17 00:36:51 +00:00
colinfo [ j - 1 ] = Mval === 0 ? { hidden : true } : { wch : Mval } ; process _col ( colinfo [ j - 1 ] ) ;
2017-04-30 16:28:24 +00:00
} break ;
2017-05-11 18:57:52 +00:00
case 'C' : /* default column format */
2018-01-23 09:09:53 +00:00
C = parseInt ( record [ rj ] . slice ( 1 ) ) - 1 ;
2017-05-11 18:57:52 +00:00
if ( ! colinfo [ C ] ) colinfo [ C ] = { } ;
break ;
case 'R' : /* row properties */
2018-01-23 09:09:53 +00:00
R = parseInt ( record [ rj ] . slice ( 1 ) ) - 1 ;
2017-05-11 18:57:52 +00:00
if ( ! rowinfo [ R ] ) rowinfo [ R ] = { } ;
2017-04-30 16:28:24 +00:00
if ( Mval > 0 ) { rowinfo [ R ] . hpt = Mval ; rowinfo [ R ] . hpx = pt2px ( Mval ) ; }
2017-10-17 00:36:51 +00:00
else if ( Mval === 0 ) rowinfo [ R ] . hidden = true ;
2017-05-09 18:11:15 +00:00
break ;
default : if ( opts && opts . WTF ) throw new Error ( "SYLK bad record " + rstr ) ;
2017-05-11 18:57:52 +00:00
}
2017-05-17 04:27:55 +00:00
if ( F _seen < 1 ) next _cell _format = null ; break ;
2017-05-09 18:11:15 +00:00
default : if ( opts && opts . WTF ) throw new Error ( "SYLK bad record " + rstr ) ;
2017-04-03 06:04:35 +00:00
}
}
2017-04-30 16:28:24 +00:00
if ( rowinfo . length > 0 ) sht [ '!rows' ] = rowinfo ;
if ( colinfo . length > 0 ) sht [ '!cols' ] = colinfo ;
2018-04-06 06:36:52 +00:00
if ( opts && opts . sheetRows ) arr = arr . slice ( 0 , opts . sheetRows ) ;
2017-05-17 04:27:55 +00:00
return [ arr , sht ] ;
2017-04-03 06:04:35 +00:00
}
2017-07-05 21:02:14 +00:00
function sylk _to _sheet ( d , opts ) {
var aoasht = sylk _to _aoa ( d , opts ) ;
2017-05-17 04:27:55 +00:00
var aoa = aoasht [ 0 ] , ws = aoasht [ 1 ] ;
2017-04-30 16:28:24 +00:00
var o = aoa _to _sheet ( aoa , opts ) ;
keys ( ws ) . forEach ( function ( k ) { o [ k ] = ws [ k ] ; } ) ;
return o ;
}
2017-04-03 06:04:35 +00:00
2017-07-05 21:02:14 +00:00
function sylk _to _workbook ( d , opts ) { return sheet _to _workbook ( sylk _to _sheet ( d , opts ) , opts ) ; }
2017-04-03 06:04:35 +00:00
2018-01-23 09:09:53 +00:00
function write _ws _cell _sylk ( cell , ws , R , C ) {
2017-04-03 06:04:35 +00:00
var o = "C;Y" + ( R + 1 ) + ";X" + ( C + 1 ) + ";K" ;
switch ( cell . t ) {
2017-04-30 16:28:24 +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-03 06:04:35 +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 ;
case 's' : o += '"' + cell . v . replace ( /"/g , "" ) + '"' ; break ;
}
return o ;
}
2017-04-30 16:28:24 +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 {
if ( typeof col . width == 'number' ) col . wpx = width2px ( col . width ) ;
if ( typeof col . wpx == 'number' ) col . wch = px2char ( col . wpx ) ;
if ( typeof col . wch == 'number' ) rec += Math . round ( col . wch ) ;
}
if ( rec . charAt ( rec . length - 1 ) != " " ) out . push ( rec ) ;
} ) ;
}
function write _ws _rows _sylk ( out , rows ) {
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 ) ) ;
} ) ;
}
2017-04-03 06:04:35 +00:00
function sheet _to _sylk ( ws , opts ) {
var preamble = [ "ID;PWXL;N;E" ] , o = [ ] ;
2017-09-30 06:19:01 +00:00
var r = safe _decode _range ( ws [ '!ref' ] ) , cell ;
2017-04-09 04:07:43 +00:00
var dense = Array . isArray ( ws ) ;
2017-04-30 16:28:24 +00:00
var RS = "\r\n" ;
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:11:15 +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 ( " " ) ) ;
2017-04-03 06:04:35 +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-09 04:07:43 +00:00
cell = dense ? ( ws [ R ] || [ ] ) [ C ] : ws [ coord ] ;
2018-02-08 19:13:10 +00:00
if ( ! cell || ( cell . v == null && ( ! cell . f || cell . F ) ) ) continue ;
2017-04-03 06:04:35 +00:00
o . push ( write _ws _cell _sylk ( cell , ws , R , C , opts ) ) ;
}
}
return preamble . join ( RS ) + RS + o . join ( RS ) + RS + "E" + RS ;
}
return {
to _workbook : sylk _to _workbook ,
to _sheet : sylk _to _sheet ,
from _sheet : sheet _to _sylk
} ;
} ) ( ) ;
var DIF = ( function ( ) {
function dif _to _aoa ( d , opts ) {
switch ( opts . type ) {
case 'base64' : return dif _to _aoa _str ( Base64 . decode ( d ) , opts ) ;
case 'binary' : return dif _to _aoa _str ( d , opts ) ;
case 'buffer' : return dif _to _aoa _str ( d . toString ( 'binary' ) , opts ) ;
case 'array' : return dif _to _aoa _str ( cc2str ( d ) , opts ) ;
}
throw new Error ( "Unrecognized type " + opts . type ) ;
}
2018-04-06 06:36:52 +00:00
function dif _to _aoa _str ( str , opts ) {
2017-04-03 06:04:35 +00:00
var records = str . split ( '\n' ) , R = - 1 , C = - 1 , ri = 0 , arr = [ ] ;
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 ;
var data = records [ ri ] . trim ( ) ;
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-10 23:55:45 +00:00
else if ( ! isNaN ( fuzzynum ( value ) ) ) arr [ R ] [ C ] = fuzzynum ( value ) ;
2017-05-11 18:57:52 +00:00
else if ( ! isNaN ( fuzzydate ( value ) . getDate ( ) ) ) arr [ R ] [ C ] = parseDate ( value ) ;
2017-04-03 06:04:35 +00:00
else arr [ R ] [ C ] = value ;
++ C ; break ;
case 1 :
2018-01-23 09:09:53 +00:00
data = data . slice ( 1 , data . length - 1 ) ;
2017-04-03 06:04:35 +00:00
arr [ R ] [ C ++ ] = data !== '' ? data : null ;
break ;
}
if ( data === 'EOD' ) break ;
}
2018-04-06 06:36:52 +00:00
if ( opts && opts . sheetRows ) arr = arr . slice ( 0 , opts . sheetRows ) ;
2017-04-03 06:04:35 +00:00
return arr ;
}
function dif _to _sheet ( str , opts ) { return aoa _to _sheet ( dif _to _aoa ( str , opts ) , opts ) ; }
function dif _to _workbook ( str , opts ) { return sheet _to _workbook ( dif _to _sheet ( str , opts ) , opts ) ; }
var sheet _to _dif = ( function ( ) {
var push _field = function pf ( o , topic , v , n , s ) {
o . push ( topic ) ;
o . push ( v + "," + n ) ;
o . push ( '"' + s . replace ( /"/g , '""' ) + '"' ) ;
} ;
var push _value = function po ( o , type , v , s ) {
o . push ( type + "," + v ) ;
o . push ( type == 1 ? '"' + s . replace ( /"/g , '""' ) + '"' : s ) ;
} ;
2018-01-23 09:09:53 +00:00
return function sheet _to _dif ( ws ) {
2017-04-03 06:04:35 +00:00
var o = [ ] ;
2017-09-30 06:19:01 +00:00
var r = safe _decode _range ( ws [ '!ref' ] ) , cell ;
2017-04-09 04:07:43 +00:00
var dense = Array . isArray ( ws ) ;
2017-04-03 06:04:35 +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-09 04:07:43 +00:00
cell = dense ? ( ws [ R ] || [ ] ) [ C ] : ws [ coord ] ;
2017-04-30 16:28:24 +00:00
if ( ! cell ) { push _value ( o , 1 , 0 , "" ) ; continue ; }
2017-04-03 06:04:35 +00:00
switch ( cell . t ) {
2017-04-30 16:28:24 +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' :
if ( ! cell . w ) cell . w = SSF . format ( cell . z || SSF . _table [ 14 ] , datenum ( parseDate ( cell . v ) ) ) ;
if ( DIF _XL ) push _value ( o , 0 , cell . w , "V" ) ;
else push _value ( o , 1 , 0 , cell . w ) ;
break ;
2017-04-03 06:04:35 +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-12-04 05:21:43 +00:00
var ETH = ( function ( ) {
function decode ( s ) { return s . replace ( /\\b/g , "\\" ) . replace ( /\\c/g , ":" ) . replace ( /\\n/g , "\n" ) ; }
function encode ( s ) { return s . replace ( /\\/g , "\\b" ) . replace ( /:/g , "\\c" ) . replace ( /\n/g , "\\n" ) ; }
2018-04-06 06:36:52 +00:00
function eth _to _aoa ( str , opts ) {
2017-12-04 05:21:43 +00:00
var records = str . split ( '\n' ) , R = - 1 , C = - 1 , ri = 0 , arr = [ ] ;
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:36:52 +00:00
if ( opts && opts . sheetRows ) arr = arr . slice ( 0 , opts . sheetRows ) ;
2017-12-04 05:21:43 +00:00
return arr ;
}
function eth _to _sheet ( d , opts ) { return aoa _to _sheet ( eth _to _aoa ( d , opts ) , opts ) ; }
function eth _to _workbook ( d , opts ) { 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 ) {
if ( ! ws || ! ws [ '!ref' ] ) return "" ;
2017-12-30 05:41:41 +00:00
var o = [ ] , oo = [ ] , cell , coord = "" ;
2017-12-04 05:21:43 +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:41:41 +00:00
oo [ 2 ] = 'vt' + ( cell . f ? 'f' : 'c' ) ; oo [ 3 ] = 'nl' ; oo [ 4 ] = cell . v ? "1" : "0" ;
2017-12-04 05:21:43 +00:00
oo [ 5 ] = encode ( cell . f || ( cell . v ? 'TRUE' : 'FALSE' ) ) ;
break ;
case 'd' :
var t = datenum ( parseDate ( cell . v ) ) ;
2017-12-30 05:41:41 +00:00
oo [ 2 ] = 'vtc' ; oo [ 3 ] = 'nd' ; oo [ 4 ] = "" + t ;
2017-12-04 05:21:43 +00:00
oo [ 5 ] = cell . w || SSF . format ( cell . z || SSF . _table [ 14 ] , t ) ;
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:09:53 +00:00
function sheet _to _eth ( ws ) {
2017-12-04 05:21:43 +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
} ;
} ) ( ) ;
2017-04-03 06:04:35 +00:00
var PRN = ( function ( ) {
2017-07-28 23:54:51 +00:00
function set _text _arr ( data , arr , R , C , o ) {
if ( o . raw ) arr [ R ] [ C ] = data ;
else if ( data === 'TRUE' ) arr [ R ] [ C ] = true ;
2017-04-03 06:04:35 +00:00
else if ( data === 'FALSE' ) arr [ R ] [ C ] = false ;
2017-05-09 18:11:15 +00:00
else if ( data === "" ) { /* empty */ }
2017-08-10 23:55:45 +00:00
else if ( ! isNaN ( fuzzynum ( data ) ) ) arr [ R ] [ C ] = fuzzynum ( data ) ;
2017-05-17 04:27:55 +00:00
else if ( ! isNaN ( fuzzydate ( data ) . getDate ( ) ) ) arr [ R ] [ C ] = parseDate ( data ) ;
2017-04-03 06:04:35 +00:00
else arr [ R ] [ C ] = data ;
}
function prn _to _aoa _str ( f , opts ) {
2017-07-28 23:54:51 +00:00
var o = opts || { } ;
2017-04-03 06:04:35 +00:00
var arr = ( [ ] ) ;
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-28 23:54:51 +00:00
set _text _arr ( lines [ R ] . slice ( 0 , start ) . trim ( ) , arr , R , C , o ) ;
2017-04-03 06:04:35 +00:00
for ( C = 1 ; C <= ( lines [ R ] . length - start ) / 10 + 1 ; ++ C )
2017-07-28 23:54:51 +00:00
set _text _arr ( lines [ R ] . slice ( start + ( C - 1 ) * 10 , start + C * 10 ) . trim ( ) , arr , R , C , o ) ;
2017-04-03 06:04:35 +00:00
}
2018-04-06 06:36:52 +00:00
if ( o . sheetRows ) arr = arr . slice ( 0 , o . sheetRows ) ;
2017-04-03 06:04:35 +00:00
return arr ;
}
2017-10-17 00:36:51 +00:00
// List of accepted CSV separators
var guess _seps = {
0x2C : ',' ,
0x09 : "\t" ,
0x3B : ';'
} ;
// CSV separator weights to be used in case of equal numbers
var guess _sep _weights = {
0x2C : 3 ,
0x09 : 2 ,
0x3B : 1
} ;
2017-08-19 23:13:21 +00:00
function guess _sep ( str ) {
2017-10-17 00:36:51 +00:00
var cnt = { } , instr = false , end = 0 , cc = 0 ;
2017-08-19 23:13:21 +00:00
for ( ; end < str . length ; ++ end ) {
if ( ( cc = str . charCodeAt ( end ) ) == 0x22 ) instr = ! instr ;
2017-10-17 00:36:51 +00:00
else if ( ! instr && cc in guess _seps ) cnt [ cc ] = ( cnt [ cc ] || 0 ) + 1 ;
2017-08-19 23:13:21 +00:00
}
2017-10-17 00:36:51 +00:00
cc = [ ] ;
for ( end in cnt ) if ( cnt . hasOwnProperty ( end ) ) {
cc . push ( [ cnt [ end ] , end ] ) ;
}
if ( ! cc . length ) {
cnt = guess _sep _weights ;
for ( end in cnt ) if ( cnt . hasOwnProperty ( end ) ) {
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 ] ] ; } ) ;
return guess _seps [ cc . pop ( ) [ 1 ] ] ;
2017-08-19 23:13:21 +00:00
}
2017-04-03 06:04:35 +00:00
function dsv _to _sheet _str ( str , opts ) {
2017-04-09 04:07:43 +00:00
var o = opts || { } ;
2017-04-03 06:04:35 +00:00
var sep = "" ;
2017-04-09 04:07:43 +00:00
if ( DENSE != null && o . dense == null ) o . dense = DENSE ;
var ws = o . dense ? ( [ ] ) : ( { } ) ;
2017-04-03 06:04:35 +00:00
var range = ( { s : { c : 0 , r : 0 } , e : { c : 0 , r : 0 } } ) ;
2018-01-23 09:09:53 +00:00
if ( str . slice ( 0 , 4 ) == "sep=" && str . charCodeAt ( 5 ) == 10 ) { sep = str . charAt ( 4 ) ; str = str . slice ( 6 ) ; }
else sep = guess _sep ( str . slice ( 0 , 1024 ) ) ;
2017-04-03 06:04:35 +00:00
var R = 0 , C = 0 , v = 0 ;
var start = 0 , end = 0 , sepcc = sep . charCodeAt ( 0 ) , instr = false , cc = 0 ;
2017-05-09 18:11:15 +00:00
str = str . replace ( /\r\n/mg , "\n" ) ;
2017-06-03 07:23:15 +00:00
var _re = o . dateNF != null ? dateNF _regex ( o . dateNF ) : null ;
2017-05-09 18:11:15 +00:00
function finish _cell ( ) {
2017-04-03 06:04:35 +00:00
var s = str . slice ( start , end ) ;
2017-04-09 04:07:43 +00:00
var cell = ( { } ) ;
2017-08-19 23:13:21 +00:00
if ( s . charAt ( 0 ) == '"' && s . charAt ( s . length - 1 ) == '"' ) s = s . slice ( 1 , - 1 ) . replace ( /""/g , '"' ) ;
2017-10-17 00:36:51 +00:00
if ( s . length === 0 ) cell . t = 'z' ;
2017-08-19 23:13:21 +00:00
else if ( o . raw ) { cell . t = 's' ; cell . v = s ; }
2017-10-17 00:36:51 +00:00
else if ( s . trim ( ) . length === 0 ) { cell . t = 's' ; cell . v = s ; }
2017-08-19 23:13:21 +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-23 09:09:53 +00:00
else if ( fuzzyfmla ( s ) ) { cell . t = 'n' ; cell . f = s . slice ( 1 ) ; }
2017-08-19 23:13:21 +00:00
else { cell . t = 's' ; cell . v = s ; } }
2017-04-03 06:04:35 +00:00
else if ( s == "TRUE" ) { cell . t = 'b' ; cell . v = true ; }
else if ( s == "FALSE" ) { cell . t = 'b' ; cell . v = false ; }
2017-08-19 23:13:21 +00:00
else if ( ! isNaN ( v = fuzzynum ( s ) ) ) { cell . t = 'n' ; if ( o . cellText !== false ) cell . w = s ; cell . v = v ; }
2017-06-03 07:23:15 +00:00
else if ( ! isNaN ( fuzzydate ( s ) . getDate ( ) ) || _re && s . match ( _re ) ) {
2017-05-17 04:27:55 +00:00
cell . z = o . dateNF || SSF . _table [ 14 ] ;
2017-06-03 07:23:15 +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 ) ) ; }
2017-08-19 23:13:21 +00:00
if ( o . cellText !== false ) cell . w = SSF . format ( cell . z , cell . v instanceof Date ? datenum ( cell . v ) : cell . v ) ;
if ( ! o . cellNF ) delete cell . z ;
2017-05-17 04:27:55 +00:00
} else {
2017-05-09 18:11:15 +00:00
cell . t = 's' ;
cell . v = s ;
}
2017-08-19 23:13:21 +00:00
if ( cell . t == 'z' ) { }
else if ( o . dense ) { if ( ! ws [ R ] ) ws [ R ] = [ ] ; ws [ R ] [ C ] = cell ; }
2017-04-09 04:07:43 +00:00
else ws [ encode _cell ( { c : C , r : R } ) ] = cell ;
2017-04-03 06:04:35 +00:00
start = end + 1 ;
if ( range . e . c < C ) range . e . c = C ;
if ( range . e . r < R ) range . e . r = R ;
2018-04-06 06:36:52 +00:00
if ( cc == sepcc ) ++ C ; else { C = 0 ; ++ R ; if ( o . sheetRows && o . sheetRows <= R ) return true ; }
2017-05-09 18:11:15 +00:00
}
2018-04-06 06:36:52 +00:00
outer : for ( ; end < str . length ; ++ end ) switch ( ( cc = str . charCodeAt ( end ) ) ) {
2017-05-17 18:01:23 +00:00
case 0x22 : instr = ! instr ; break ;
2018-04-06 06:36:52 +00:00
case sepcc : case 0x0a : case 0x0d : if ( ! instr && finish _cell ( ) ) break outer ; break ;
2017-04-03 06:04:35 +00:00
default : break ;
}
2017-05-09 18:11:15 +00:00
if ( end - start > 0 ) finish _cell ( ) ;
2017-04-03 06:04:35 +00:00
ws [ '!ref' ] = encode _range ( range ) ;
return ws ;
}
function prn _to _sheet _str ( str , opts ) {
2017-12-04 05:21:43 +00:00
if ( str . slice ( 0 , 4 ) == "sep=" ) return dsv _to _sheet _str ( str , opts ) ;
2017-11-15 18:50:04 +00:00
if ( str . indexOf ( "\t" ) >= 0 || str . indexOf ( "," ) >= 0 || str . indexOf ( ";" ) >= 0 ) return dsv _to _sheet _str ( str , opts ) ;
2017-04-03 06:04:35 +00:00
return aoa _to _sheet ( prn _to _aoa _str ( str , opts ) , opts ) ;
}
function prn _to _sheet ( d , opts ) {
2017-09-30 06:19:01 +00:00
var str = "" , bytes = opts . type == 'string' ? [ 0 , 0 , 0 , 0 ] : firstbyte ( d , opts ) ;
2017-04-03 06:04:35 +00:00
switch ( opts . type ) {
2017-05-11 18:57:52 +00:00
case 'base64' : str = Base64 . decode ( d ) ; break ;
case 'binary' : str = d ; break ;
2018-08-15 20:01:20 +00:00
case 'buffer' :
if ( opts . codepage == 65001 ) str = d . toString ( 'utf8' ) ;
else if ( opts . codepage && typeof cptable !== 'undefined' ) str = cptable . utils . decode ( opts . codepage , d ) ;
else str = d . toString ( 'binary' ) ;
break ;
2017-05-11 18:57:52 +00:00
case 'array' : str = cc2str ( d ) ; break ;
2017-09-30 06:19:01 +00:00
case 'string' : str = d ; break ;
2017-05-11 18:57:52 +00:00
default : throw new Error ( "Unrecognized type " + opts . type ) ;
2017-04-03 06:04:35 +00:00
}
2017-08-19 23:13:21 +00:00
if ( bytes [ 0 ] == 0xEF && bytes [ 1 ] == 0xBB && bytes [ 2 ] == 0xBF ) str = utf8read ( str . slice ( 3 ) ) ;
2018-08-15 20:01:20 +00:00
else if ( ( opts . type == 'binary' ) && typeof cptable !== 'undefined' && opts . codepage ) str = cptable . utils . decode ( opts . codepage , cptable . utils . encode ( 1252 , str ) ) ;
2017-12-04 05:21:43 +00:00
if ( str . slice ( 0 , 19 ) == "socialcalc:version:" ) return ETH . to _sheet ( opts . type == 'string' ? str : utf8read ( str ) , opts ) ;
2017-05-11 18:57:52 +00:00
return prn _to _sheet _str ( str , opts ) ;
2017-04-03 06:04:35 +00:00
}
2017-07-05 21:02:14 +00:00
function prn _to _workbook ( d , opts ) { return sheet _to _workbook ( prn _to _sheet ( d , opts ) , opts ) ; }
2017-04-03 06:04:35 +00:00
2018-01-23 09:09:53 +00:00
function sheet _to _prn ( ws ) {
2017-04-03 06:04:35 +00:00
var o = [ ] ;
2017-09-30 06:19:01 +00:00
var r = safe _decode _range ( ws [ '!ref' ] ) , cell ;
2017-04-09 04:07:43 +00:00
var dense = Array . isArray ( ws ) ;
2017-04-03 06:04:35 +00:00
for ( var R = r . s . r ; R <= r . e . r ; ++ R ) {
var oo = [ ] ;
for ( var C = r . s . c ; C <= r . e . c ; ++ C ) {
var coord = encode _cell ( { r : R , c : C } ) ;
2017-04-09 04:07:43 +00:00
cell = dense ? ( ws [ R ] || [ ] ) [ C ] : ws [ coord ] ;
if ( ! cell || cell . v == null ) { oo . push ( " " ) ; continue ; }
2018-01-23 09:09:53 +00:00
var w = ( cell . w || ( format _cell ( cell ) , cell . w ) || "" ) . slice ( 0 , 10 ) ;
2017-04-03 06:04:35 +00:00
while ( w . length < 10 ) w += " " ;
2017-10-17 00:36:51 +00:00
oo . push ( w + ( C === 0 ? " " : "" ) ) ;
2017-04-03 06:04:35 +00:00
}
o . push ( oo . join ( "" ) ) ;
}
return o . join ( "\n" ) ;
}
return {
to _workbook : prn _to _workbook ,
to _sheet : prn _to _sheet ,
from _sheet : sheet _to _prn
} ;
} ) ( ) ;
2017-05-11 18:57:52 +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 ) ;
}
}
2017-04-09 04:07:43 +00:00
var WK _ = ( function ( ) {
function lotushopper ( data , cb , opts ) {
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 ) ;
var R = Enum [ RT ] || Enum [ 0xFF ] ;
var length = data . read _shift ( 2 ) ;
var tgt = data . l + length ;
2017-11-20 02:13:37 +00:00
var d = ( R . f || parsenoop ) ( data , length , opts ) ;
2017-04-09 04:07:43 +00:00
data . l = tgt ;
if ( cb ( d , R . n , RT ) ) return ;
}
}
function lotus _to _workbook ( d , opts ) {
switch ( opts . type ) {
case 'base64' : return lotus _to _workbook _buf ( s2a ( Base64 . decode ( d ) ) , opts ) ;
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:36:52 +00:00
function lotus _to _workbook _buf ( d , opts ) {
2017-04-09 04:07:43 +00:00
if ( ! d ) return d ;
var o = opts || { } ;
if ( DENSE != null && o . dense == null ) o . dense = DENSE ;
2017-04-16 07:35:56 +00:00
var s = ( ( o . dense ? [ ] : { } ) ) , n = "Sheet1" , sidx = 0 ;
2017-04-09 04:07:43 +00:00
var sheets = { } , snames = [ n ] ;
var refguess = { s : { r : 0 , c : 0 } , e : { r : 0 , c : 0 } } ;
2018-04-06 06:36:52 +00:00
var sheetRows = o . sheetRows || 0 ;
2017-04-09 04:07:43 +00:00
if ( d [ 2 ] == 0x02 ) o . Enum = WK1Enum ;
else if ( d [ 2 ] == 0x1a ) o . Enum = WK3Enum ;
else if ( d [ 2 ] == 0x0e ) { o . Enum = WK3Enum ; o . qpro = true ; d . l = 0 ; }
else throw new Error ( "Unrecognized LOTUS BOF " + d [ 2 ] ) ;
lotushopper ( d , function ( val , Rn , RT ) {
if ( d [ 2 ] == 0x02 ) switch ( RT ) {
case 0x00 :
o . vers = val ;
if ( val >= 0x1000 ) o . qpro = true ;
break ;
case 0x06 : refguess = val ; break ; /* RANGE */
case 0x0F : /* LABEL */
2018-01-23 09:09:53 +00:00
if ( ! o . qpro ) val [ 1 ] . v = val [ 1 ] . v . slice ( 1 ) ;
2017-04-09 04:07:43 +00:00
/* falls through */
case 0x0D : /* INTEGER */
case 0x0E : /* NUMBER */
case 0x10 : /* FORMULA */
case 0x33 : /* STRING */
2017-05-17 04:27:55 +00:00
/* TODO: actual translation of the format code */
if ( RT == 0x0E && ( val [ 2 ] & 0x70 ) == 0x70 && ( val [ 2 ] & 0x0F ) > 1 && ( val [ 2 ] & 0x0F ) < 15 ) {
val [ 1 ] . z = o . dateNF || SSF . _table [ 14 ] ;
if ( o . cellDates ) { val [ 1 ] . t = 'd' ; val [ 1 ] . v = numdate ( val [ 1 ] . v ) ; }
}
2017-04-09 04:07:43 +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 ] ;
break ;
} else switch ( RT ) {
case 0x16 : /* LABEL16 */
2018-01-23 09:09:53 +00:00
val [ 1 ] . v = val [ 1 ] . v . slice ( 1 ) ;
2017-04-09 04:07:43 +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 ;
s = ( o . dense ? [ ] : { } ) ;
refguess = { s : { r : 0 , c : 0 } , e : { r : 0 , c : 0 } } ;
sidx = val [ 3 ] ; n = "Sheet" + ( sidx + 1 ) ;
snames . push ( n ) ;
}
2018-04-06 06:36:52 +00:00
if ( sheetRows > 0 && val [ 0 ] . r >= sheetRows ) break ;
2017-11-20 02:13:37 +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-09 04:07:43 +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 ;
default : break ;
}
} , o ) ;
s [ "!ref" ] = encode _range ( refguess ) ;
sheets [ n ] = s ;
return { SheetNames : snames , Sheets : sheets } ;
}
2018-01-23 09:09:53 +00:00
function parse _RANGE ( blob ) {
2017-04-09 04:07:43 +00:00
var o = { s : { c : 0 , r : 0 } , e : { c : 0 , r : 0 } } ;
o . s . c = blob . read _shift ( 2 ) ;
o . s . r = blob . read _shift ( 2 ) ;
o . e . c = blob . read _shift ( 2 ) ;
o . e . r = blob . read _shift ( 2 ) ;
if ( o . s . c == 0xFFFF ) o . s . c = o . e . c = o . s . r = o . e . r = 0 ;
return o ;
}
function parse _cell ( blob , length , opts ) {
var o = [ { c : 0 , r : 0 } , { t : 'n' , v : 0 } , 0 ] ;
if ( opts . qpro && opts . vers != 0x5120 ) {
o [ 0 ] . c = blob . read _shift ( 1 ) ;
blob . l ++ ;
o [ 0 ] . r = blob . read _shift ( 2 ) ;
blob . l += 2 ;
} 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 ;
}
function parse _INTEGER ( blob , length , opts ) {
var o = parse _cell ( blob , length , opts ) ;
o [ 1 ] . v = blob . read _shift ( 2 , 'i' ) ;
return o ;
}
function parse _NUMBER ( blob , length , opts ) {
var o = parse _cell ( blob , length , opts ) ;
o [ 1 ] . v = blob . read _shift ( 8 , 'f' ) ;
return o ;
}
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 ) ;
blob . l += flen ;
}
return o ;
}
2018-01-23 09:09:53 +00:00
function parse _cell _3 ( blob ) {
2017-04-09 04:07:43 +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 ;
}
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 ;
/* TODO: figure out all of the corner cases */
if ( o [ 1 ] . v & 0x1 ) {
switch ( v & 0x07 ) {
case 1 : v = ( v >> 3 ) * 500 ; break ;
case 2 : v = ( v >> 3 ) / 20 ; break ;
case 4 : v = ( v >> 3 ) / 2000 ; break ;
case 6 : v = ( v >> 3 ) / 16 ; break ;
case 7 : v = ( v >> 3 ) / 64 ; break ;
default : throw "unknown NUMBER_18 encoding " + ( v & 0x07 ) ;
}
}
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 ) ;
if ( e == 0xFFFF ) { o [ 1 ] . v = 0 ; return o ; }
var s = e & 0x8000 ; e = ( e & 0x7FFF ) - 16446 ;
2018-01-23 09:09:53 +00:00
o [ 1 ] . v = ( s * 2 - 1 ) * ( ( e > 0 ? ( v2 << e ) : ( v2 >>> - e ) ) + ( e > - 32 ? ( v1 << ( e + 32 ) ) : ( v1 >>> - ( e + 32 ) ) ) ) ;
2017-04-09 04:07:43 +00:00
return o ;
}
function parse _FORMULA _19 ( blob , length ) {
var o = parse _NUMBER _17 ( blob , 14 ) ;
blob . l += length - 14 ; /* TODO: formula */
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 ) {
var o = parse _NUMBER _27 ( blob , 14 ) ;
blob . l += length - 10 ; /* TODO: formula */
return o ;
}
var WK1Enum = {
0x0000 : { n : "BOF" , f : parseuint16 } ,
2017-11-20 02:13:37 +00:00
0x0001 : { n : "EOF" } ,
0x0002 : { n : "CALCMODE" } ,
0x0003 : { n : "CALCORDER" } ,
0x0004 : { n : "SPLIT" } ,
0x0005 : { n : "SYNC" } ,
2017-04-09 04:07:43 +00:00
0x0006 : { n : "RANGE" , f : parse _RANGE } ,
2017-11-20 02:13:37 +00:00
0x0007 : { n : "WINDOW1" } ,
0x0008 : { n : "COLW1" } ,
0x0009 : { n : "WINTWO" } ,
0x000A : { n : "COLW2" } ,
0x000B : { n : "NAME" } ,
0x000C : { n : "BLANK" } ,
2017-04-09 04:07:43 +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 02:13:37 +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" } ,
2017-04-09 04:07:43 +00:00
0x0033 : { n : "STRING" , f : parse _LABEL } ,
2017-11-20 02:13:37 +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" } ,
2017-04-09 04:07:43 +00:00
0x00FF : { n : "" , f : parsenoop }
} ;
var WK3Enum = {
2017-11-20 02:13:37 +00:00
0x0000 : { n : "BOF" } ,
0x0001 : { n : "EOF" } ,
0x0003 : { n : "??" } ,
0x0004 : { n : "??" } ,
0x0005 : { n : "??" } ,
0x0006 : { n : "??" } ,
0x0007 : { n : "??" } ,
0x0009 : { n : "??" } ,
0x000a : { n : "??" } ,
0x000b : { n : "??" } ,
0x000c : { n : "??" } ,
0x000e : { n : "??" } ,
0x000f : { n : "??" } ,
0x0010 : { n : "??" } ,
0x0011 : { n : "??" } ,
0x0012 : { n : "??" } ,
0x0013 : { n : "??" } ,
0x0015 : { n : "??" } ,
2017-04-09 04:07:43 +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 } ,
2017-11-20 02:13:37 +00:00
0x001a : { n : "??" } ,
0x001b : { n : "??" } ,
0x001c : { n : "??" } ,
0x001d : { n : "??" } ,
0x001e : { n : "??" } ,
0x001f : { n : "??" } ,
0x0021 : { n : "??" } ,
2017-04-09 04:07:43 +00:00
0x0025 : { n : "NUMBER25" , f : parse _NUMBER _25 } ,
0x0027 : { n : "NUMBER27" , f : parse _NUMBER _27 } ,
0x0028 : { n : "FORMULA28" , f : parse _FORMULA _28 } ,
0x00FF : { n : "" , f : parsenoop }
} ;
return {
to _workbook : lotus _to _workbook
} ;
} ) ( ) ;
2015-04-02 22:14:07 +00:00
/* Parse a list of <r> tags */
var parse _rs = ( function parse _rs _factory ( ) {
2017-02-11 01:58:22 +00:00
var tregex = matchtag ( "t" ) , rpregex = matchtag ( "rPr" ) , rregex = /<(?:\w+:)?r>/g , rend = /<\/(?:\w+:)?r>/ , nlregex = /\r\n/g ;
2015-04-02 22:14:07 +00:00
/* 18.4.7 rPr CT_RPrElt */
var parse _rpr = function parse _rpr ( rpr , intro , outro ) {
2017-04-21 22:03:40 +00:00
var font = { } , cp = 65001 , align = "" ;
2018-05-20 03:03:23 +00:00
var pass = false ;
2015-04-02 22:14:07 +00:00
var m = rpr . match ( tagregex ) , i = 0 ;
if ( m ) for ( ; i != m . length ; ++ i ) {
var y = parsexmltag ( m [ i ] ) ;
2017-03-23 01:56:21 +00:00
switch ( y [ 0 ] . replace ( /\w*:/g , "" ) ) {
2015-04-02 22:14:07 +00:00
/* 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' :
2017-04-21 22:03:40 +00:00
if ( ! y . val ) break ;
2015-04-02 22:14:07 +00:00
/* falls through */
2017-03-09 05:49:24 +00:00
case '<shadow>' :
2017-04-21 22:03:40 +00:00
case '<shadow/>' : font . shadow = 1 ; break ;
case '</shadow>' : break ;
2015-04-02 22:14:07 +00:00
/* 18.4.1 charset CT_IntProperty TODO */
case '<charset' :
if ( y . val == '1' ) break ;
cp = CS2CP [ parseInt ( y . val , 10 ) ] ;
break ;
/* 18.4.2 outline CT_BooleanProperty TODO */
case '<outline' :
2017-04-21 22:03:40 +00:00
if ( ! y . val ) break ;
2015-04-02 22:14:07 +00:00
/* falls through */
2017-03-09 05:49:24 +00:00
case '<outline>' :
2017-04-21 22:03:40 +00:00
case '<outline/>' : font . outline = 1 ; break ;
case '</outline>' : break ;
2015-04-02 22:14:07 +00:00
/* 18.4.5 rFont CT_FontName */
case '<rFont' : font . name = y . val ; break ;
/* 18.4.11 sz CT_FontSize */
case '<sz' : font . sz = y . val ; break ;
/* 18.4.10 strike CT_BooleanProperty */
case '<strike' :
if ( ! y . val ) break ;
/* falls through */
2017-03-09 05:49:24 +00:00
case '<strike>' :
2015-04-02 22:14:07 +00:00
case '<strike/>' : font . strike = 1 ; break ;
case '</strike>' : break ;
/* 18.4.13 u CT_UnderlineProperty */
case '<u' :
2017-04-21 22:03:40 +00:00
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 ;
}
2015-04-02 22:14:07 +00:00
/* falls through */
2017-03-09 05:49:24 +00:00
case '<u>' :
2015-04-02 22:14:07 +00:00
case '<u/>' : font . u = 1 ; break ;
case '</u>' : break ;
/* 18.8.2 b */
case '<b' :
2017-02-19 21:11:48 +00:00
if ( y . val == '0' ) break ;
2015-04-02 22:14:07 +00:00
/* falls through */
2017-03-09 05:49:24 +00:00
case '<b>' :
2015-04-02 22:14:07 +00:00
case '<b/>' : font . b = 1 ; break ;
case '</b>' : break ;
/* 18.8.26 i */
case '<i' :
2017-02-19 21:11:48 +00:00
if ( y . val == '0' ) break ;
2015-04-02 22:14:07 +00:00
/* falls through */
2017-03-09 05:49:24 +00:00
case '<i>' :
2015-04-02 22:14:07 +00:00
case '<i/>' : font . i = 1 ; break ;
case '</i>' : break ;
/* 18.3.1.15 color CT_Color TODO: tint, theme, auto, indexed */
case '<color' :
2018-01-23 09:09:53 +00:00
if ( y . rgb ) font . color = y . rgb . slice ( 2 , 8 ) ;
2015-04-02 22:14:07 +00:00
break ;
/* 18.8.18 family ST_FontFamily */
case '<family' : font . family = y . val ; break ;
/* 18.4.14 vertAlign CT_VerticalAlignFontProperty TODO */
2017-04-21 22:03:40 +00:00
case '<vertAlign' : align = y . val ; break ;
2014-05-16 00:16:51 +00:00
/* 18.8.35 scheme CT_FontScheme TODO */
case '<scheme' : break ;
2018-05-20 03:03:23 +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 ;
2014-05-16 00:16:51 +00:00
default :
2018-05-20 03:03:23 +00:00
if ( y [ 0 ] . charCodeAt ( 1 ) !== 47 && ! pass ) throw new Error ( 'Unrecognized rich format ' + y [ 0 ] ) ;
2014-05-16 00:16:51 +00:00
}
2014-06-29 18:35:10 +00:00
}
2014-05-16 00:16:51 +00:00
var style = [ ] ;
2017-04-21 22:03:40 +00:00
if ( font . u ) style . push ( "text-decoration: underline;" ) ;
if ( font . uval ) style . push ( "text-underline-style:" + font . uval + ";" ) ;
2018-04-20 02:27:00 +00:00
if ( font . sz ) style . push ( "font-size:" + font . sz + "pt;" ) ;
2017-04-21 22:03:40 +00:00
if ( font . outline ) style . push ( "text-effect: outline;" ) ;
if ( font . shadow ) style . push ( "text-shadow: auto;" ) ;
2014-05-16 00:16:51 +00:00
intro . push ( '<span style="' + style . join ( "" ) + '">' ) ;
2017-04-21 22:03:40 +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>" ) ; }
if ( align == "superscript" ) align = "sup" ;
else if ( align == "subscript" ) align = "sub" ;
if ( align != "" ) { intro . push ( "<" + align + ">" ) ; outro . push ( "</" + align + ">" ) ; }
2014-05-16 00:16:51 +00:00
outro . push ( "</span>" ) ;
return cp ;
} ;
/* 18.4.4 r CT_RElt */
function parse _r ( r ) {
var terms = [ [ ] , "" , [ ] ] ;
/* 18.4.12 t ST_Xstring */
2018-01-23 09:09:53 +00:00
var t = r . match ( tregex ) /*, cp = 65001*/ ;
2017-12-30 05:41:41 +00:00
if ( ! t ) return "" ;
2014-05-16 00:16:51 +00:00
terms [ 1 ] = t [ 1 ] ;
var rpr = r . match ( rpregex ) ;
2018-01-23 09:09:53 +00:00
if ( rpr ) /*cp = */ parse _rpr ( rpr [ 1 ] , terms [ 0 ] , terms [ 2 ] ) ;
2014-05-16 00:16:51 +00:00
2014-06-29 18:35:10 +00:00
return terms [ 0 ] . join ( "" ) + terms [ 1 ] . replace ( nlregex , '<br/>' ) + terms [ 2 ] . join ( "" ) ;
2014-05-16 00:16:51 +00:00
}
2014-06-29 18:35:10 +00:00
return function parse _rs ( rs ) {
return rs . replace ( rregex , "" ) . split ( rend ) . map ( parse _r ) . join ( "" ) ;
2014-05-16 00:16:51 +00:00
} ;
} ) ( ) ;
/* 18.4.8 si CT_Rst */
2017-02-11 01:58:22 +00:00
var sitregex = /<(?:\w+:)?t[^>]*>([^<]*)<\/(?:\w+:)?t>/g , sirregex = /<(?:\w+:)?r>/ ;
2017-07-05 21:02:14 +00:00
var sirphregex = /<(?:\w+:)?rPh.*?>([\s\S]*?)<\/(?:\w+:)?rPh>/g ;
2014-06-29 18:35:10 +00:00
function parse _si ( x , opts ) {
2014-05-16 00:16:51 +00:00
var html = opts ? opts . cellHTML : true ;
var z = { } ;
if ( ! x ) return null ;
2018-01-23 09:09:53 +00:00
//var y;
2014-05-16 00:16:51 +00:00
/* 18.4.12 t ST_Xstring (Plaintext String) */
2017-02-19 21:11:48 +00:00
// TODO: is whitespace actually valid here?
if ( x . match ( /^\s*<(?:\w+:)?t[^>]*>/ ) ) {
2017-09-22 22:40:09 +00:00
z . t = unescapexml ( utf8read ( x . slice ( x . indexOf ( ">" ) + 1 ) . split ( /<\/(?:\w+:)?t>/ ) [ 0 ] || "" ) ) ;
2017-02-19 21:11:48 +00:00
z . r = utf8read ( x ) ;
2017-04-16 07:35:56 +00:00
if ( html ) z . h = escapehtml ( z . t ) ;
2014-05-16 00:16:51 +00:00
}
/* 18.4.4 r CT_RElt (Rich Text Run) */
2018-01-23 09:09:53 +00:00
else if ( ( /*y = */ x . match ( sirregex ) ) ) {
2017-02-19 21:11:48 +00:00
z . r = utf8read ( x ) ;
2017-09-22 22:40:09 +00:00
z . t = unescapexml ( utf8read ( ( x . replace ( sirphregex , '' ) . match ( sitregex ) || [ ] ) . join ( "" ) . replace ( tagregex , "" ) ) ) ;
2017-02-19 21:11:48 +00:00
if ( html ) z . h = parse _rs ( z . r ) ;
2014-05-16 00:16:51 +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 ;
2014-06-29 18:35:10 +00:00
}
2014-05-16 00:16:51 +00:00
/* 18.4 Shared String Table */
2017-02-11 01:58:22 +00:00
var sstr0 = /<(?:\w+:)?sst([^>]*)>([\s\S]*)<\/(?:\w+:)?sst>/ ;
var sstr1 = /<(?:\w+:)?(?:si|sstItem)>/g ;
var sstr2 = /<\/(?:\w+:)?(?:si|sstItem)>/ ;
2014-06-29 18:35:10 +00:00
function parse _sst _xml ( data , opts ) {
2017-02-11 01:58:22 +00:00
var s = ( [ ] ) , ss = "" ;
if ( ! data ) return s ;
2014-05-16 00:16:51 +00:00
/* 18.4.9 sst CT_Sst */
2014-06-29 18:35:10 +00:00
var sst = data . match ( sstr0 ) ;
2017-12-30 05:41:41 +00:00
if ( sst ) {
2014-06-29 18:35:10 +00:00
ss = sst [ 2 ] . replace ( sstr1 , "" ) . split ( sstr2 ) ;
for ( var i = 0 ; i != ss . length ; ++ i ) {
2017-02-19 21:11:48 +00:00
var o = parse _si ( ss [ i ] . trim ( ) , opts ) ;
2014-06-29 18:35:10 +00:00
if ( o != null ) s [ s . length ] = o ;
}
2014-05-16 00:16:51 +00:00
sst = parsexmltag ( sst [ 1 ] ) ; s . Count = sst . count ; s . Unique = sst . uniqueCount ;
}
return s ;
2014-06-29 18:35:10 +00:00
}
2014-05-16 00:16:51 +00:00
RELS . SST = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/sharedStrings" ;
2014-07-28 15:32:28 +00:00
var straywsregex = /^\s|\s$|[\t\n\r]/ ;
2014-06-29 18:35:10 +00:00
function write _sst _xml ( sst , opts ) {
2014-05-16 00:16:51 +00:00
if ( ! opts . bookSST ) return "" ;
2014-06-29 18:35:10 +00:00
var o = [ XML _HEADER ] ;
o [ o . length ] = ( writextag ( 'sst' , null , {
2014-05-16 00:16:51 +00:00
xmlns : XMLNS . main [ 0 ] ,
count : sst . Count ,
uniqueCount : sst . Unique
} ) ) ;
2014-06-29 18:35:10 +00:00
for ( var i = 0 ; i != sst . length ; ++ i ) { if ( sst [ i ] == null ) continue ;
var s = sst [ i ] ;
2014-05-22 12:09:29 +00:00
var sitag = "<si>" ;
if ( s . r ) sitag += s . r ;
else {
sitag += "<t" ;
2017-03-23 01:56:21 +00:00
if ( ! s . t ) s . t = "" ;
2014-07-28 15:32:28 +00:00
if ( s . t . match ( straywsregex ) ) sitag += ' xml:space="preserve"' ;
2014-06-29 18:35:10 +00:00
sitag += ">" + escapexml ( s . t ) + "</t>" ;
2014-05-22 12:09:29 +00:00
}
sitag += "</si>" ;
2014-06-29 18:35:10 +00:00
o [ o . length ] = ( sitag ) ;
}
if ( o . length > 2 ) { o [ o . length ] = ( '</sst>' ) ; o [ 1 ] = o [ 1 ] . replace ( "/>" , ">" ) ; }
2014-05-16 00:16:51 +00:00
return o . join ( "" ) ;
2014-06-29 18:35:10 +00:00
}
2018-02-14 05:26:28 +00:00
/* [MS-XLSB] 2.4.221 BrtBeginSst */
2018-01-23 09:09:53 +00:00
function parse _BrtBeginSst ( data ) {
2014-05-16 00:16:51 +00:00
return [ data . read _shift ( 4 ) , data . read _shift ( 4 ) ] ;
2014-06-29 18:35:10 +00:00
}
2014-05-16 00:16:51 +00:00
/* [MS-XLSB] 2.1.7.45 Shared Strings */
2014-06-29 18:35:10 +00:00
function parse _sst _bin ( data , opts ) {
2017-03-13 07:34:05 +00:00
var s = ( [ ] ) ;
2014-05-16 00:16:51 +00:00
var pass = false ;
2017-04-09 04:07:43 +00:00
recordhopper ( data , function hopper _sst ( val , R _n , RT ) {
switch ( RT ) {
case 0x009F : /* 'BrtBeginSst' */
s . Count = val [ 0 ] ; s . Unique = val [ 1 ] ; break ;
case 0x0013 : /* 'BrtSSTItem' */
s . push ( val ) ; break ;
case 0x00A0 : /* 'BrtEndSst' */
return true ;
case 0x0023 : /* 'BrtFRTBegin' */
pass = true ; break ;
case 0x0024 : /* 'BrtFRTEnd' */
pass = false ; break ;
default :
2017-05-09 18:11:15 +00:00
if ( R _n . indexOf ( "Begin" ) > 0 ) { /* empty */ }
else if ( R _n . indexOf ( "End" ) > 0 ) { /* empty */ }
2017-04-09 04:07:43 +00:00
if ( ! pass || opts . WTF ) throw new Error ( "Unexpected record " + RT + " " + R _n ) ;
2014-05-16 00:16:51 +00:00
}
2015-04-02 22:14:07 +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:09:53 +00:00
function write _sst _bin ( sst ) {
2015-04-02 22:14:07 +00:00
var ba = buf _array ( ) ;
write _record ( ba , "BrtBeginSst" , write _BrtBeginSst ( sst ) ) ;
for ( var i = 0 ; i < sst . length ; ++ i ) write _record ( ba , "BrtSSTItem" , write _BrtSSTItem ( sst [ i ] ) ) ;
2017-04-09 04:07:43 +00:00
/* FRTSST */
2015-04-02 22:14:07 +00:00
write _record ( ba , "BrtEndSst" ) ;
return ba . end ( ) ;
}
2017-02-11 01:58:22 +00:00
function _JS2ANSI ( str ) {
2017-12-30 05:41:41 +00:00
if ( typeof cptable !== 'undefined' ) return cptable . utils . encode ( current _ansi , str ) ;
2017-02-11 01:58:22 +00:00
var o = [ ] , oo = str . split ( "" ) ;
for ( var i = 0 ; i < oo . length ; ++ i ) o [ i ] = oo [ i ] . charCodeAt ( 0 ) ;
return o ;
}
2015-04-02 22:14:07 +00:00
/* [MS-OFFCRYPTO] 2.1.4 Version */
2017-04-16 07:35:56 +00:00
function parse _CRYPTOVersion ( blob , length ) {
2015-04-02 22:14:07 +00:00
var o = { } ;
o . Major = blob . read _shift ( 2 ) ;
o . Minor = blob . read _shift ( 2 ) ;
2017-05-17 04:27:55 +00:00
if ( length >= 4 ) blob . l += length - 4 ;
2015-04-02 22:14:07 +00:00
return o ;
}
2017-04-16 07:35:56 +00:00
/* [MS-OFFCRYPTO] 2.1.5 DataSpaceVersionInfo */
2018-01-23 09:09:53 +00:00
function parse _DataSpaceVersionInfo ( blob ) {
2017-04-16 07:35:56 +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 ;
2015-04-02 22:14:07 +00:00
var o = { } ;
2017-04-16 07:35:56 +00:00
var cnt = blob . read _shift ( 4 ) ;
var comps = [ ] ;
2017-12-30 05:41:41 +00:00
/* [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-16 07:35:56 +00:00
o . name = blob . read _shift ( 0 , 'lpp4' ) ;
o . comps = comps ;
2017-12-01 05:51:31 +00:00
if ( blob . l != end ) throw new Error ( "Bad DataSpaceMapEntry: " + blob . l + " != " + end ) ;
2017-04-16 07:35:56 +00:00
return o ;
}
2015-04-02 22:14:07 +00:00
2017-04-16 07:35:56 +00:00
/* [MS-OFFCRYPTO] 2.1.6 DataSpaceMap */
2018-01-23 09:09:53 +00:00
function parse _DataSpaceMap ( blob ) {
2017-04-16 07:35:56 +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 ;
}
2015-04-02 22:14:07 +00:00
2017-04-16 07:35:56 +00:00
/* [MS-OFFCRYPTO] 2.1.7 DataSpaceDefinition */
2018-01-23 09:09:53 +00:00
function parse _DataSpaceDefinition ( blob ) {
2017-04-16 07:35:56 +00:00
var o = [ ] ;
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:09:53 +00:00
function parse _TransformInfoHeader ( blob ) {
2017-04-16 07:35:56 +00:00
var o = { } ;
2018-01-23 09:09:53 +00:00
/*var len = */ blob . read _shift ( 4 ) ;
2017-04-16 07:35:56 +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 ;
}
2018-01-23 09:09:53 +00:00
function parse _Primary ( blob ) {
2017-04-16 07:35:56 +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 ;
}
/* [MS-OFFCRYPTO] 2.3.2 Encryption Header */
function parse _EncryptionHeader ( blob , length ) {
var tgt = blob . l + length ;
var o = { } ;
o . Flags = ( blob . read _shift ( 4 ) & 0x3F ) ;
blob . l += 4 ;
2015-04-02 22:14:07 +00:00
o . AlgID = blob . read _shift ( 4 ) ;
2017-04-16 07:35:56 +00:00
var valid = false ;
2015-04-02 22:14:07 +00:00
switch ( o . AlgID ) {
2017-04-16 07:35:56 +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 ;
2015-04-02 22:14:07 +00:00
default : throw 'Unrecognized encryption algorithm: ' + o . AlgID ;
}
2017-04-16 07:35:56 +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 02:01:07 +00:00
o . CSPName = blob . read _shift ( ( tgt - blob . l ) >> 1 , 'utf16le' ) ;
2017-04-16 07:35:56 +00:00
blob . l = tgt ;
2015-04-02 22:14:07 +00:00
return o ;
}
/* [MS-OFFCRYPTO] 2.3.3 Encryption Verifier */
function parse _EncryptionVerifier ( blob , length ) {
2017-12-15 02:01:07 +00:00
var o = { } , tgt = blob . l + length ;
2017-04-16 07:35:56 +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:09:53 +00:00
/*var sz = */ blob . read _shift ( 4 ) ;
2017-12-15 02:01:07 +00:00
o . VerifierHash = blob . slice ( blob . l , tgt ) ; blob . l = tgt ;
2017-04-16 07:35:56 +00:00
return o ;
}
/* [MS-OFFCRYPTO] 2.3.4.* EncryptionInfo Stream */
2018-01-23 09:09:53 +00:00
function parse _EncryptionInfo ( blob ) {
2017-04-16 07:35:56 +00:00
var vers = parse _CRYPTOVersion ( blob ) ;
switch ( vers . Minor ) {
2017-10-17 00:36:51 +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-16 07:35:56 +00:00
}
2017-09-22 22:40:09 +00:00
throw new Error ( "ECMA-376 Encrypted file unrecognized Version: " + vers . Minor ) ;
2017-04-16 07:35:56 +00:00
}
/* [MS-OFFCRYPTO] 2.3.4.5 EncryptionInfo Stream (Standard Encryption) */
2018-01-23 09:09:53 +00:00
function parse _EncInfoStd ( blob ) {
2017-04-16 07:35:56 +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:09:53 +00:00
//var tgt = blob.l + sz;
2017-04-16 07:35:56 +00:00
var hdr = parse _EncryptionHeader ( blob , sz ) ;
var verifier = parse _EncryptionVerifier ( blob , blob . length - blob . l ) ;
return { t : "Std" , h : hdr , v : verifier } ;
2015-04-02 22:14:07 +00:00
}
2017-04-16 07:35:56 +00:00
/* [MS-OFFCRYPTO] 2.3.4.6 EncryptionInfo Stream (Extensible Encryption) */
2018-01-23 09:09:53 +00:00
function parse _EncInfoExt ( ) { throw new Error ( "File is password-protected: ECMA-376 Extensible" ) ; }
2017-04-16 07:35:56 +00:00
/* [MS-OFFCRYPTO] 2.3.4.10 EncryptionInfo Stream (Agile Encryption) */
2018-01-23 09:09:53 +00:00
function parse _EncInfoAgl ( blob ) {
2017-12-01 05:51:31 +00:00
var KeyData = [ "saltSize" , "blockSize" , "keyBits" , "hashSize" , "cipherAlgorithm" , "cipherChaining" , "hashAlgorithm" , "saltValue" ] ;
2017-10-17 00:36:51 +00:00
blob . l += 4 ;
2017-12-01 05:51:31 +00:00
var xml = blob . read _shift ( blob . length - blob . l , 'utf8' ) ;
var o = { } ;
2018-01-23 09:09:53 +00:00
xml . replace ( tagregex , function xml _agile ( x ) {
2017-12-01 05:51:31 +00:00
var y = 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:36:51 +00:00
}
2017-04-16 07:35:56 +00:00
2015-04-02 22:14:07 +00:00
/* [MS-OFFCRYPTO] 2.3.5.1 RC4 CryptoAPI Encryption Header */
function parse _RC4CryptoHeader ( blob , length ) {
var o = { } ;
2017-04-16 07:35:56 +00:00
var vers = o . EncryptionVersionInfo = parse _CRYPTOVersion ( blob , 4 ) ; length -= 4 ;
2017-07-28 23:54:51 +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 ) ;
2015-04-02 22:14:07 +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:09:53 +00:00
function parse _RC4Header ( blob ) {
2015-04-02 22:14:07 +00:00
var o = { } ;
2018-01-23 09:09:53 +00:00
var vers = o . EncryptionVersionInfo = parse _CRYPTOVersion ( blob , 4 ) ;
2015-04-02 22:14:07 +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 */
function crypto _CreatePasswordVerifier _Method1 ( Password ) {
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 */
var crypto _CreateXorArray _Method1 = ( function ( ) {
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 ;
} ;
return function ( password ) {
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 */
var crypto _DecryptData _Method1 = function ( password , Data , XorArrayIndex , XorArray , O ) {
/* 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 ] ;
} ;
var crypto _MakeXorDecryptor = function ( password ) {
var XorArrayIndex = 0 , XorArray = crypto _CreateXorArray _Method1 ( password ) ;
return function ( Data ) {
2017-02-11 01:58:22 +00:00
var O = crypto _DecryptData _Method1 ( "" , Data , XorArrayIndex , XorArray ) ;
2015-04-02 22:14:07 +00:00
XorArrayIndex = O [ 1 ] ;
return O [ 0 ] ;
} ;
} ;
/* 2.5.343 */
function parse _XORObfuscation ( blob , length , opts , out ) {
2017-02-11 01:58:22 +00:00
var o = ( { key : parseuint16 ( blob ) , verificationBytes : parseuint16 ( blob ) } ) ;
2015-04-02 22:14:07 +00:00
if ( opts . password ) o . verifier = crypto _CreatePasswordVerifier _Method1 ( opts . password ) ;
out . valid = o . verificationBytes === o . verifier ;
2017-10-17 00:36:51 +00:00
if ( out . valid ) out . insitu = crypto _MakeXorDecryptor ( opts . password ) ;
2015-04-02 22:14:07 +00:00
return o ;
2014-06-29 18:35:10 +00:00
}
2014-05-16 00:16:51 +00:00
2015-04-02 22:14:07 +00:00
/* 2.4.117 */
function parse _FilePassHeader ( blob , length , oo ) {
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 ;
}
function parse _FilePass ( blob , length , opts ) {
2017-08-05 06:58:40 +00:00
var o = ( { Type : opts . biff >= 8 ? blob . read _shift ( 2 ) : 0 } ) ; /* wEncryptionType */
2015-04-02 22:14:07 +00:00
if ( o . Type ) parse _FilePassHeader ( blob , length - 2 , o ) ;
2018-02-21 06:20:15 +00:00
else parse _XORObfuscation ( blob , opts . biff >= 8 ? length : length - 2 , opts , o ) ;
2014-07-28 15:32:28 +00:00
return o ;
}
2017-08-05 06:58:40 +00:00
var RTF = ( function ( ) {
function rtf _to _sheet ( d , opts ) {
switch ( opts . type ) {
case 'base64' : return rtf _to _sheet _str ( Base64 . decode ( d ) , opts ) ;
case 'binary' : return rtf _to _sheet _str ( d , opts ) ;
case 'buffer' : return rtf _to _sheet _str ( d . toString ( 'binary' ) , opts ) ;
case 'array' : return rtf _to _sheet _str ( cc2str ( d ) , opts ) ;
}
throw new Error ( "Unrecognized type " + opts . type ) ;
}
function rtf _to _sheet _str ( str , opts ) {
2017-10-17 00:36:51 +00:00
var o = opts || { } ;
2017-11-20 02:13:37 +00:00
var ws = o . dense ? ( [ ] ) : ( { } ) ;
2017-10-17 00:36:51 +00:00
var range = ( { s : { c : 0 , r : 0 } , e : { c : 0 , r : 0 } } ) ;
// TODO: parse
if ( ! str . match ( /\\trowd/ ) ) throw new Error ( "RTF missing table" ) ;
ws [ '!ref' ] = encode _range ( range ) ;
return ws ;
2017-08-05 06:58:40 +00:00
}
function rtf _to _workbook ( d , opts ) { return sheet _to _workbook ( rtf _to _sheet ( d , opts ) , opts ) ; }
2017-10-17 00:36:51 +00:00
/* TODO: this is a stub */
2018-01-23 09:09:53 +00:00
function sheet _to _rtf ( ws ) {
2017-10-17 00:36:51 +00:00
var o = [ "{\\rtf1\\ansi" ] ;
var r = safe _decode _range ( ws [ '!ref' ] ) , 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 ;
o . push ( " " + ( cell . w || ( format _cell ( cell ) , cell . w ) ) ) ;
o . push ( "\\cell" ) ;
}
o . push ( "\\pard\\intbl\\row" ) ;
}
return o . join ( "" ) + "}" ;
}
2017-08-05 06:58:40 +00:00
return {
to _workbook : rtf _to _workbook ,
to _sheet : rtf _to _sheet ,
from _sheet : sheet _to _rtf
} ;
} ) ( ) ;
2014-06-29 18:35:10 +00:00
function hex2RGB ( h ) {
2018-01-23 09:09:53 +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 ) ] ;
2014-06-29 18:35:10 +00:00
}
function rgb2Hex ( rgb ) {
2014-06-02 05:16:51 +00:00
for ( var i = 0 , o = 1 ; i != 3 ; ++ i ) o = o * 256 + ( rgb [ i ] > 255 ? 255 : rgb [ i ] < 0 ? 0 : rgb [ i ] ) ;
2018-01-23 09:09:53 +00:00
return o . toString ( 16 ) . toUpperCase ( ) . slice ( 1 ) ;
2014-06-29 18:35:10 +00:00
}
2014-06-02 05:16:51 +00:00
2014-06-29 18:35:10 +00:00
function rgb2HSL ( rgb ) {
2014-06-02 05:16:51 +00:00
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 ] ;
2014-06-29 18:35:10 +00:00
}
2014-06-02 05:16:51 +00:00
2014-06-29 18:35:10 +00:00
function hsl2RGB ( hsl ) {
2014-06-02 05:16:51 +00:00
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 ;
2014-06-29 18:35:10 +00:00
}
2014-06-02 05:16:51 +00:00
/* 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 21:57:44 +00:00
/* [MS-OI29500] 2.1.595 Column Width & Formatting */
2017-03-28 22:07:46 +00:00
var DEF _MDW = 6 , MAX _MDW = 15 , MIN _MDW = 1 , MDW = DEF _MDW ;
2017-03-20 21:57:44 +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:09:53 +00:00
//function px2char_(px) { return (((px - 5)/MDW * 100 + 0.5))/100; }
//function char2width_(chr) { return (((chr * MDW + 5)/MDW*256))/256; }
2014-06-02 05:16:51 +00:00
function cycle _width ( collw ) { return char2width ( px2char ( width2px ( collw ) ) ) ; }
2017-03-20 21:57:44 +00:00
/* XLSX/XLSB/XLS specify width in units of MDW */
function find _mdw _colw ( collw ) {
2017-06-10 01:56:23 +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 21:57:44 +00:00
MDW = _MDW ;
}
/* XLML specifies width in terms of pixels */
2018-01-23 09:09:53 +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 21:57:44 +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 ; }
2014-06-02 05:16:51 +00:00
}
2017-03-20 21:57:44 +00:00
MDW = _MDW ;
2018-01-23 09:09:53 +00:00
} * /
2017-03-20 21:57:44 +00:00
function process _col ( coll ) {
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-30 16:28:24 +00:00
} else if ( typeof coll . wch == 'number' ) {
coll . width = char2width ( coll . wch ) ;
coll . wpx = width2px ( coll . width ) ;
coll . MDW = MDW ;
2017-03-20 21:57:44 +00:00
}
if ( coll . customWidth ) delete coll . customWidth ;
2014-06-02 05:16:51 +00:00
}
2015-04-02 22:14:07 +00:00
2017-04-30 16:28:24 +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 21:50:32 +00:00
2015-04-02 22:14:07 +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-20 21:57:44 +00:00
/* 18.8.5 borders CT_Borders */
function parse _borders ( t , styles , themes , opts ) {
styles . Borders = [ ] ;
2018-01-23 09:09:53 +00:00
var border = { } /*, sub_border = {}*/ ;
2018-05-05 06:42:56 +00:00
var pass = false ;
2017-03-20 21:57:44 +00:00
t [ 0 ] . match ( tagregex ) . forEach ( function ( x ) {
var y = parsexmltag ( x ) ;
2018-06-01 16:34:26 +00:00
switch ( strip _ns ( y [ 0 ] ) ) {
2017-03-20 21:57:44 +00:00
case '<borders' : case '<borders>' : case '</borders>' : break ;
/* 18.8.4 border CT_Border */
2017-07-28 23:54:51 +00:00
case '<border' : case '<border>' : case '<border/>' :
2017-03-20 21:57:44 +00:00
border = { } ;
if ( y . diagonalUp ) { border . diagonalUp = y . diagonalUp ; }
if ( y . diagonalDown ) { border . diagonalDown = y . diagonalDown ; }
styles . Borders . push ( border ) ;
break ;
case '</border>' : break ;
/* note: not in spec, appears to be CT_BorderPr */
2017-07-05 21:02:14 +00:00
case '<left/>' : break ;
case '<left' : case '<left>' : break ;
2017-03-20 21:57:44 +00:00
case '</left>' : break ;
/* note: not in spec, appears to be CT_BorderPr */
2017-07-05 21:02:14 +00:00
case '<right/>' : break ;
case '<right' : case '<right>' : break ;
2017-03-20 21:57:44 +00:00
case '</right>' : break ;
/* 18.8.43 top CT_BorderPr */
2017-07-05 21:02:14 +00:00
case '<top/>' : break ;
case '<top' : case '<top>' : break ;
2017-03-20 21:57:44 +00:00
case '</top>' : break ;
/* 18.8.6 bottom CT_BorderPr */
2017-07-05 21:02:14 +00:00
case '<bottom/>' : break ;
case '<bottom' : case '<bottom>' : break ;
2017-03-20 21:57:44 +00:00
case '</bottom>' : break ;
/* 18.8.13 diagonal CT_BorderPr */
2017-07-05 21:02:14 +00:00
case '<diagonal' : case '<diagonal>' : case '<diagonal/>' : break ;
2017-03-20 21:57:44 +00:00
case '</diagonal>' : break ;
2014-05-16 00:16:51 +00:00
2017-03-20 21:57:44 +00:00
/* 18.8.25 horizontal CT_BorderPr */
2017-07-05 21:02:14 +00:00
case '<horizontal' : case '<horizontal>' : case '<horizontal/>' : break ;
2017-03-20 21:57:44 +00:00
case '</horizontal>' : break ;
/* 18.8.44 vertical CT_BorderPr */
2017-07-05 21:02:14 +00:00
case '<vertical' : case '<vertical>' : case '<vertical/>' : break ;
2017-03-20 21:57:44 +00:00
case '</vertical>' : break ;
/* 18.8.37 start CT_BorderPr */
2017-07-05 21:02:14 +00:00
case '<start' : case '<start>' : case '<start/>' : break ;
2017-03-20 21:57:44 +00:00
case '</start>' : break ;
/* 18.8.16 end CT_BorderPr */
2017-07-05 21:02:14 +00:00
case '<end' : case '<end>' : case '<end/>' : break ;
2017-03-20 21:57:44 +00:00
case '</end>' : break ;
/* 18.8.? color CT_Color */
2017-07-05 21:02:14 +00:00
case '<color' : case '<color>' : break ;
case '<color/>' : case '</color>' : break ;
2017-03-20 21:57:44 +00:00
2018-05-05 06:42:56 +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-20 21:57:44 +00:00
}
} ) ;
}
2014-05-29 22:32:13 +00:00
/* 18.8.21 fills CT_Fills */
2017-03-20 21:57:44 +00:00
function parse _fills ( t , styles , themes , opts ) {
2014-05-29 22:32:13 +00:00
styles . Fills = [ ] ;
var fill = { } ;
2018-05-05 06:42:56 +00:00
var pass = false ;
2014-06-29 18:35:10 +00:00
t [ 0 ] . match ( tagregex ) . forEach ( function ( x ) {
2014-05-29 22:32:13 +00:00
var y = parsexmltag ( x ) ;
2018-06-01 16:34:26 +00:00
switch ( strip _ns ( y [ 0 ] ) ) {
2014-05-29 22:32:13 +00:00
case '<fills' : case '<fills>' : case '</fills>' : break ;
/* 18.8.20 fill CT_Fill */
2017-08-05 06:58:40 +00:00
case '<fill>' : case '<fill' : case '<fill/>' :
fill = { } ; styles . Fills . push ( fill ) ; break ;
case '</fill>' : break ;
2014-05-29 22:32:13 +00:00
2017-03-20 21:57:44 +00:00
/* 18.8.24 gradientFill CT_GradientFill */
2017-03-28 22:07:46 +00:00
case '<gradientFill>' : break ;
2017-07-28 23:54:51 +00:00
case '<gradientFill' :
2017-03-28 22:07:46 +00:00
case '</gradientFill>' : styles . Fills . push ( fill ) ; fill = { } ; break ;
2017-03-20 21:57:44 +00:00
2014-05-29 22:32:13 +00:00
/* 18.8.32 patternFill CT_PatternFill */
2017-03-20 21:57:44 +00:00
case '<patternFill' : case '<patternFill>' :
2014-05-29 22:32:13 +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 = { } ;
2014-06-29 18:35:10 +00:00
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 ) ;
2014-05-29 22:32:13 +00:00
/* Excel uses ARGB strings */
2017-03-20 21:57:44 +00:00
if ( y . rgb ) fill . bgColor . rgb = y . rgb . slice ( - 6 ) ;
2014-05-29 22:32:13 +00:00
break ;
2014-06-05 07:07:10 +00:00
case '<bgColor/>' : case '</bgColor>' : break ;
2014-05-29 22:32:13 +00:00
/* 18.8.19 fgColor CT_Color */
case '<fgColor' :
if ( ! fill . fgColor ) fill . fgColor = { } ;
2014-06-29 18:35:10 +00:00
if ( y . theme ) fill . fgColor . theme = parseInt ( y . theme , 10 ) ;
if ( y . tint ) fill . fgColor . tint = parseFloat ( y . tint ) ;
2014-05-29 22:32:13 +00:00
/* Excel uses ARGB strings */
2017-03-20 21:57:44 +00:00
if ( y . rgb ) fill . fgColor . rgb = y . rgb . slice ( - 6 ) ;
2014-05-29 22:32:13 +00:00
break ;
2014-10-26 05:09:58 +00:00
case '<fgColor/>' : case '</fgColor>' : break ;
2014-05-29 22:32:13 +00:00
2017-03-20 21:57:44 +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:42:56 +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-03-20 21:57:44 +00:00
}
} ) ;
}
/* 18.8.23 fonts CT_Fonts */
function parse _fonts ( t , styles , themes , opts ) {
styles . Fonts = [ ] ;
var font = { } ;
2018-05-05 06:42:56 +00:00
var pass = false ;
2017-03-20 21:57:44 +00:00
t [ 0 ] . match ( tagregex ) . forEach ( function ( x ) {
var y = parsexmltag ( x ) ;
2018-06-01 16:34:26 +00:00
switch ( strip _ns ( y [ 0 ] ) ) {
2017-03-20 21:57:44 +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 */
case '<name' : if ( y . val ) font . name = y . val ; break ;
case '<name/>' : case '</name>' : break ;
2017-05-09 18:11:15 +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-20 21:57:44 +00:00
/* 18.8.26 i CT_BooleanProperty */
2017-05-09 18:11:15 +00:00
case '<i' : font . italic = y . val ? parsexmlbool ( y . val ) : 1 ; break ;
case '<i/>' : font . italic = 1 ; break ;
2017-03-20 21:57:44 +00:00
/* 18.4.13 u CT_UnderlineProperty */
2017-05-09 18:11:15 +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-20 21:57:44 +00:00
/* 18.4.10 strike CT_BooleanProperty */
2017-05-09 18:11:15 +00:00
case '<strike' : font . strike = y . val ? parsexmlbool ( y . val ) : 1 ; break ;
case '<strike/>' : font . strike = 1 ; break ;
2017-03-20 21:57:44 +00:00
2017-05-09 18:11:15 +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-20 21:57:44 +00:00
/* 18.8.36 shadow CT_BooleanProperty */
2017-05-09 18:11:15 +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-20 21:57:44 +00:00
/* 18.4.11 sz CT_FontSize */
2017-05-09 18:11:15 +00:00
case '<sz' : if ( y . val ) font . sz = + y . val ; break ;
2017-03-20 21:57:44 +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:11:15 +00:00
case '<family' : if ( y . val ) font . family = parseInt ( y . val , 10 ) ; break ;
2017-03-20 21:57:44 +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:11:15 +00:00
/* 18.4.1 charset CT_IntProperty */
2017-03-20 21:57:44 +00:00
case '<charset' :
if ( y . val == '1' ) break ;
y . codepage = CS2CP [ parseInt ( y . val , 10 ) ] ;
break ;
2017-05-09 18:11:15 +00:00
/* 18.?.? color CT_Color */
2017-03-20 21:57:44 +00:00
case '<color' :
if ( ! font . color ) font . color = { } ;
2017-05-09 18:11:15 +00:00
if ( y . auto ) font . color . auto = parsexmlbool ( y . auto ) ;
2017-07-05 21:02:14 +00:00
if ( y . rgb ) font . color . rgb = y . rgb . slice ( - 6 ) ;
2017-05-09 18:11:15 +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 ] ;
if ( ! icv ) throw new Error ( x ) ;
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-20 21:57:44 +00:00
break ;
case '<color/>' : case '</color>' : break ;
2018-05-05 06:42:56 +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' ) ;
}
2014-05-29 22:32:13 +00:00
}
} ) ;
}
2014-05-16 00:16:51 +00:00
/* 18.8.31 numFmts CT_NumFmts */
2017-03-20 21:57:44 +00:00
function parse _numFmts ( t , styles , opts ) {
2014-05-16 00:16:51 +00:00
styles . NumberFmt = [ ] ;
2017-02-11 01:58:22 +00:00
var k /*Array<number>*/ = ( keys ( SSF . _table ) ) ;
2014-07-28 15:32:28 +00:00
for ( var i = 0 ; i < k . length ; ++ i ) styles . NumberFmt [ k [ i ] ] = SSF . _table [ k [ i ] ] ;
2014-06-29 18:35:10 +00:00
var m = t [ 0 ] . match ( tagregex ) ;
2017-02-11 01:58:22 +00:00
if ( ! m ) return ;
2014-07-28 15:32:28 +00:00
for ( i = 0 ; i < m . length ; ++ i ) {
2014-06-29 18:35:10 +00:00
var y = parsexmltag ( m [ i ] ) ;
2018-06-01 16:34:26 +00:00
switch ( strip _ns ( y [ 0 ] ) ) {
2014-05-22 12:09:29 +00:00
case '<numFmts' : case '</numFmts>' : case '<numFmts/>' : case '<numFmts>' : break ;
2014-05-16 00:16:51 +00:00
case '<numFmt' : {
2014-07-28 15:32:28 +00:00
var f = unescapexml ( utf8read ( y . formatCode ) ) , j = parseInt ( y . numFmtId , 10 ) ;
2017-07-05 21:02:14 +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 ;
}
SSF . load ( f , j ) ;
}
2014-05-16 00:16:51 +00:00
} break ;
2017-03-11 00:01:58 +00:00
case '</numFmt>' : break ;
2017-02-11 01:58:22 +00:00
default : if ( opts . WTF ) throw new Error ( 'unrecognized ' + y [ 0 ] + ' in numFmts' ) ;
2014-05-16 00:16:51 +00:00
}
2014-06-29 18:35:10 +00:00
}
2014-05-16 00:16:51 +00:00
}
2018-01-23 09:09:53 +00:00
function write _numFmts ( NF ) {
2014-06-29 18:35:10 +00:00
var o = [ "<numFmts>" ] ;
2017-03-25 22:38:26 +00:00
[ [ 5 , 8 ] , [ 23 , 26 ] , [ 41 , 44 ] , [ /*63*/ 50 , /*66],[164,*/ 392 ] ] . forEach ( function ( r ) {
2017-03-20 21:57:44 +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 ] ) } ) ) ;
2014-05-16 00:16:51 +00:00
} ) ;
2014-07-28 15:32:28 +00:00
if ( o . length === 1 ) return "" ;
2014-06-29 18:35:10 +00:00
o [ o . length ] = ( "</numFmts>" ) ;
2014-05-16 00:16:51 +00:00
o [ 0 ] = writextag ( 'numFmts' , null , { count : o . length - 2 } ) . replace ( "/>" , ">" ) ;
return o . join ( "" ) ;
}
/* 18.8.10 cellXfs CT_CellXfs */
2017-06-10 01:56:23 +00:00
var cellXF _uint = [ "numFmtId" , "fillId" , "fontId" , "borderId" , "xfId" ] ;
var cellXF _bool = [ "applyAlignment" , "applyBorder" , "applyFill" , "applyFont" , "applyNumberFormat" , "applyProtection" , "pivotButton" , "quotePrefix" ] ;
2017-03-20 21:57:44 +00:00
function parse _cellXfs ( t , styles , opts ) {
2014-05-16 00:16:51 +00:00
styles . CellXf = [ ] ;
2017-03-20 21:57:44 +00:00
var xf ;
2018-05-05 06:42:56 +00:00
var pass = false ;
2014-06-29 18:35:10 +00:00
t [ 0 ] . match ( tagregex ) . forEach ( function ( x ) {
2017-06-10 01:56:23 +00:00
var y = parsexmltag ( x ) , i = 0 ;
2018-06-01 16:34:26 +00:00
switch ( strip _ns ( y [ 0 ] ) ) {
2014-05-22 12:09:29 +00:00
case '<cellXfs' : case '<cellXfs>' : case '<cellXfs/>' : case '</cellXfs>' : break ;
2014-05-16 00:16:51 +00:00
/* 18.8.45 xf CT_Xf */
2017-07-05 21:02:14 +00:00
case '<xf' : case '<xf/>' :
2017-03-20 21:57:44 +00:00
xf = y ;
delete xf [ 0 ] ;
2017-06-10 01:56:23 +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:09:53 +00:00
xf [ cellXF _bool [ i ] ] = parsexmlbool ( xf [ cellXF _bool [ i ] ] ) ;
2017-07-05 21:02:14 +00:00
if ( xf . numFmtId > 0x188 ) {
for ( i = 0x188 ; i > 0x3c ; -- i ) if ( styles . NumberFmt [ xf . numFmtId ] == styles . NumberFmt [ i ] ) { xf . numFmtId = i ; break ; }
}
2017-03-20 21:57:44 +00:00
styles . CellXf . push ( xf ) ; break ;
2014-05-16 00:16:51 +00:00
case '</xf>' : break ;
/* 18.8.1 alignment CT_CellAlignment */
2017-03-20 21:57:44 +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 ;
if ( y . wrapText ) alignment . wrapText = y . wrapText ;
xf . alignment = alignment ;
break ;
case '</alignment>' : break ;
2014-05-16 00:16:51 +00:00
/* 18.8.33 protection CT_CellProtection */
case '<protection' : case '</protection>' : case '<protection/>' : break ;
2017-03-20 21:57:44 +00:00
/* 18.2.10 extLst CT_ExtensionList ? */
2018-05-05 06:42:56 +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' ) ;
}
2012-12-03 19:47:44 +00:00
}
} ) ;
}
2014-05-16 00:16:51 +00:00
function write _cellXfs ( cellXfs ) {
var o = [ ] ;
2014-06-29 18:35:10 +00:00
o [ o . length ] = ( writextag ( 'cellXfs' , null ) ) ;
cellXfs . forEach ( function ( c ) { o [ o . length ] = ( writextag ( 'xf' , null , c ) ) ; } ) ;
o [ o . length ] = ( "</cellXfs>" ) ;
2014-05-16 00:16:51 +00:00
if ( o . length === 2 ) return "" ;
o [ 0 ] = writextag ( 'cellXfs' , null , { count : o . length - 2 } ) . replace ( "/>" , ">" ) ;
return o . join ( "" ) ;
}
2012-12-03 19:47:44 +00:00
2014-05-16 00:16:51 +00:00
/* 18.8 Styles CT_Stylesheet*/
2014-07-28 15:32:28 +00:00
var parse _sty _xml = ( function make _pstyx ( ) {
2018-06-01 16:34:26 +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>/ ;
2014-07-28 15:32:28 +00:00
2017-03-20 21:57:44 +00:00
return function parse _sty _xml ( data , themes , opts ) {
var styles = { } ;
2017-02-11 01:58:22 +00:00
if ( ! data ) return styles ;
2017-07-05 21:02:14 +00:00
data = data . replace ( /<!--([\s\S]*?)-->/mg , "" ) . replace ( /<!DOCTYPE[^\[]*\[[^\]]*\]>/gm , "" ) ;
2014-05-16 00:16:51 +00:00
/* 18.8.39 styleSheet CT_Stylesheet */
var t ;
2012-12-03 19:47:44 +00:00
2017-03-20 21:57:44 +00:00
/* 18.8.31 numFmts CT_NumFmts ? */
if ( ( t = data . match ( numFmtRegex ) ) ) parse _numFmts ( t , styles , opts ) ;
2014-01-22 05:02:45 +00:00
2017-03-20 21:57:44 +00:00
/* 18.8.23 fonts CT_Fonts ? */
if ( ( t = data . match ( fontsRegex ) ) ) parse _fonts ( t , styles , themes , opts ) ;
2014-05-29 22:32:13 +00:00
2017-05-09 18:11:15 +00:00
/* 18.8.21 fills CT_Fills ? */
2017-03-20 21:57:44 +00:00
if ( ( t = data . match ( fillsRegex ) ) ) parse _fills ( t , styles , themes , opts ) ;
2014-05-29 22:32:13 +00:00
2017-05-09 18:11:15 +00:00
/* 18.8.5 borders CT_Borders ? */
2017-03-20 21:57:44 +00:00
if ( ( t = data . match ( bordersRegex ) ) ) parse _borders ( t , styles , themes , opts ) ;
2014-05-16 00:16:51 +00:00
2017-05-09 18:11:15 +00:00
/* 18.8.9 cellStyleXfs CT_CellStyleXfs ? */
2014-05-16 00:16:51 +00:00
2017-03-20 21:57:44 +00:00
/* 18.8.10 cellXfs CT_CellXfs ? */
if ( ( t = data . match ( cellXfRegex ) ) ) parse _cellXfs ( t , styles , opts ) ;
2017-05-09 18:11:15 +00:00
/* 18.8.8 cellStyles CT_CellStyles ? */
2017-03-20 21:57:44 +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 ? */
2014-05-16 00:16:51 +00:00
return styles ;
2014-07-28 15:32:28 +00:00
} ;
} ) ( ) ;
2014-05-16 00:16:51 +00:00
var STYLES _XML _ROOT = writextag ( 'styleSheet' , null , {
'xmlns' : XMLNS . main [ 0 ] ,
'xmlns:vt' : XMLNS . vt
} ) ;
RELS . STY = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles" ;
function write _sty _xml ( wb , opts ) {
2014-07-28 15:32:28 +00:00
var o = [ XML _HEADER , STYLES _XML _ROOT ] , w ;
2017-03-13 07:34:05 +00:00
if ( wb . SSF && ( w = write _numFmts ( wb . SSF ) ) != null ) o [ o . length ] = w ;
2014-06-29 18:35:10 +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 ( "/>" , ">" ) ; }
2014-05-16 00:16:51 +00:00
return o . join ( "" ) ;
}
2018-02-14 05:26:28 +00:00
/* [MS-XLSB] 2.4.657 BrtFmt */
2014-05-16 00:16:51 +00:00
function parse _BrtFmt ( data , length ) {
2017-07-28 23:54:51 +00:00
var numFmtId = data . read _shift ( 2 ) ;
2014-05-16 00:16:51 +00:00
var stFmtCode = parse _XLWideString ( data , length - 2 ) ;
2017-07-28 23:54:51 +00:00
return [ numFmtId , stFmtCode ] ;
2014-05-16 00:16:51 +00:00
}
2017-05-09 18:11:15 +00:00
function write _BrtFmt ( i , f , o ) {
if ( ! o ) o = new _buf ( 6 + 4 * f . length ) ;
o . write _shift ( 2 , i ) ;
write _XLWideString ( f , o ) ;
2018-02-08 19:13:10 +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:11:15 +00:00
}
2014-05-16 00:16:51 +00:00
2018-02-14 05:26:28 +00:00
/* [MS-XLSB] 2.4.659 BrtFont TODO */
2017-05-09 18:11:15 +00:00
function parse _BrtFont ( data , length , opts ) {
var out = ( { } ) ;
out . sz = data . read _shift ( 2 ) / 20 ;
var grbit = parse _FontFlags ( data , 2 , opts ) ;
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 ;
if ( grbit . fItalic ) out . italic = 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 ;
2014-05-16 00:16:51 +00:00
data . l ++ ;
2017-05-09 18:11:15 +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 ;
}
2014-05-16 00:16:51 +00:00
out . name = parse _XLWideString ( data , length - 21 ) ;
return out ;
}
2017-05-09 18:11:15 +00:00
function write _BrtFont ( font , o ) {
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 05:26:28 +00:00
/* [MS-XLSB] 2.4.650 BrtFill */
2017-05-09 18:11:15 +00:00
var XLSBFillPTNames = [
"none" ,
"solid" ,
"mediumGray" ,
"darkGray" ,
"lightGray" ,
"darkHorizontal" ,
"darkVertical" ,
"darkDown" ,
"darkUp" ,
"darkGrid" ,
"darkTrellis" ,
"lightHorizontal" ,
"lightVertical" ,
"lightDown" ,
"lightUp" ,
"lightGrid" ,
"lightTrellis" ,
"gray125" ,
"gray0625"
] ;
2017-05-17 04:27:55 +00:00
var rev _XLSBFillPTNames = ( evert ( XLSBFillPTNames ) ) ;
2017-05-09 18:11:15 +00:00
/* TODO: gradient fill representation */
2017-08-05 06:58:40 +00:00
var parse _BrtFill = parsenoop ;
2017-05-09 18:11:15 +00:00
function write _BrtFill ( fill , o ) {
if ( ! o ) o = new _buf ( 4 * 3 + 8 * 7 + 16 * 1 ) ;
var fls = rev _XLSBFillPTNames [ fill . patternType ] ;
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 ;
}
2014-05-16 00:16:51 +00:00
2018-02-14 05:26:28 +00:00
/* [MS-XLSB] 2.4.824 BrtXF */
2014-05-16 00:16:51 +00:00
function parse _BrtXF ( data , length ) {
2017-11-20 02:13:37 +00:00
var tgt = data . l + length ;
2014-05-16 00:16:51 +00:00
var ixfeParent = data . read _shift ( 2 ) ;
var ifmt = data . read _shift ( 2 ) ;
2017-11-20 02:13:37 +00:00
data . l = tgt ;
2017-07-28 23:54:51 +00:00
return { ixfe : ixfeParent , numFmtId : ifmt } ;
2014-05-16 00:16:51 +00:00
}
2017-05-09 18:11:15 +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 */
o . write _shift ( 1 , 0 ) ; /* flags */
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 05:26:28 +00:00
/* [MS-XLSB] 2.4.302 BrtBorder TODO */
2017-08-05 06:58:40 +00:00
var parse _BrtBorder = parsenoop ;
2017-05-09 18:11:15 +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 05:26:28 +00:00
/* [MS-XLSB] 2.4.763 BrtStyle TODO */
2017-05-09 18:11:15 +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 05:26:28 +00:00
/* [MS-XLSB] 2.4.272 BrtBeginTableStyles */
2017-05-09 18:11:15 +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 ;
}
2014-05-16 00:16:51 +00:00
/* [MS-XLSB] 2.1.7.50 Styles */
2017-03-20 21:57:44 +00:00
function parse _sty _bin ( data , themes , opts ) {
var styles = { } ;
2017-02-11 01:58:22 +00:00
styles . NumberFmt = ( [ ] ) ;
2014-05-16 00:16:51 +00:00
for ( var y in SSF . _table ) styles . NumberFmt [ y ] = SSF . _table [ y ] ;
styles . CellXf = [ ] ;
2017-04-21 22:03:40 +00:00
styles . Fonts = [ ] ;
2017-04-09 04:07:43 +00:00
var state = [ ] ;
2014-05-16 00:16:51 +00:00
var pass = false ;
2017-04-09 04:07:43 +00:00
recordhopper ( data , function hopper _sty ( val , R _n , RT ) {
switch ( RT ) {
case 0x002C : /* 'BrtFmt' */
2014-05-16 00:16:51 +00:00
styles . NumberFmt [ val [ 0 ] ] = val [ 1 ] ; SSF . load ( val [ 1 ] , val [ 0 ] ) ;
break ;
2017-04-21 22:03:40 +00:00
case 0x002B : /* 'BrtFont' */
styles . Fonts . push ( val ) ;
2017-05-09 18:11:15 +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-21 22:03:40 +00:00
break ;
2017-04-09 04:07:43 +00:00
case 0x0401 : /* 'BrtKnownFonts' */ break ;
case 0x002D : /* 'BrtFill' */ break ;
case 0x002E : /* 'BrtBorder' */ break ;
case 0x002F : /* 'BrtXF' */
if ( state [ state . length - 1 ] == "BrtBeginCellXFs" ) {
2014-05-16 00:16:51 +00:00
styles . CellXf . push ( val ) ;
}
2017-04-09 04:07:43 +00:00
break ;
case 0x0030 : /* 'BrtStyle' */
case 0x01FB : /* 'BrtDXF' */
case 0x023C : /* 'BrtMRUColor' */
case 0x01DB : /* 'BrtIndexedColor': */
break ;
case 0x0493 : /* 'BrtDXF14' */
case 0x0836 : /* 'BrtDXF15' */
case 0x046A : /* 'BrtSlicerStyleElement' */
case 0x0200 : /* 'BrtTableStyleElement' */
case 0x082F : /* 'BrtTimelineStyleElement' */
2018-03-19 22:14:14 +00:00
case 0x0C00 : /* 'BrtUid' */
2017-04-09 04:07:43 +00:00
break ;
case 0x0023 : /* 'BrtFRTBegin' */
pass = true ; break ;
case 0x0024 : /* 'BrtFRTEnd' */
pass = false ; break ;
case 0x0025 : /* 'BrtACBegin' */
state . push ( R _n ) ; break ;
case 0x0026 : /* 'BrtACEnd' */
state . pop ( ) ; break ;
default :
if ( ( R _n || "" ) . indexOf ( "Begin" ) > 0 ) state . push ( R _n ) ;
else if ( ( R _n || "" ) . indexOf ( "End" ) > 0 ) state . pop ( ) ;
else if ( ! pass || opts . WTF ) throw new Error ( "Unexpected record " + RT + " " + R _n ) ;
2014-01-22 05:02:45 +00:00
}
} ) ;
2014-05-16 00:16:51 +00:00
return styles ;
2014-01-22 05:02:45 +00:00
}
2014-05-29 22:32:13 +00:00
2017-05-09 18:11:15 +00:00
function write _FMTS _bin ( ba , NF ) {
if ( ! NF ) return ;
var cnt = 0 ;
2017-07-05 21:02:14 +00:00
[ [ 5 , 8 ] , [ 23 , 26 ] , [ 41 , 44 ] , [ /*63*/ 50 , /*66],[164,*/ 392 ] ] . forEach ( function ( r ) {
2017-05-17 04:27:55 +00:00
for ( var i = r [ 0 ] ; i <= r [ 1 ] ; ++ i ) if ( NF [ i ] != null ) ++ cnt ;
2017-05-09 18:11:15 +00:00
} ) ;
if ( cnt == 0 ) return ;
write _record ( ba , "BrtBeginFmts" , write _UInt32LE ( cnt ) ) ;
2017-07-05 21:02:14 +00:00
[ [ 5 , 8 ] , [ 23 , 26 ] , [ 41 , 44 ] , [ /*63*/ 50 , /*66],[164,*/ 392 ] ] . forEach ( function ( r ) {
2017-05-17 04:27:55 +00:00
for ( var i = r [ 0 ] ; i <= r [ 1 ] ; ++ i ) if ( NF [ i ] != null ) write _record ( ba , "BrtFmt" , write _BrtFmt ( i , NF [ i ] ) ) ;
2017-05-09 18:11:15 +00:00
} ) ;
write _record ( ba , "BrtEndFmts" ) ;
}
2018-01-23 09:09:53 +00:00
function write _FONTS _bin ( ba ) {
2017-05-09 18:11:15 +00:00
var cnt = 1 ;
if ( cnt == 0 ) return ;
write _record ( ba , "BrtBeginFonts" , write _UInt32LE ( cnt ) ) ;
write _record ( ba , "BrtFont" , write _BrtFont ( {
sz : 12 ,
color : { theme : 1 } ,
name : "Calibri" ,
family : 2 ,
scheme : "minor"
} ) ) ;
/* 1*65491BrtFont [ACFONTS] */
write _record ( ba , "BrtEndFonts" ) ;
}
2018-01-23 09:09:53 +00:00
function write _FILLS _bin ( ba ) {
2017-05-09 18:11:15 +00:00
var cnt = 2 ;
if ( cnt == 0 ) return ;
write _record ( ba , "BrtBeginFills" , write _UInt32LE ( cnt ) ) ;
write _record ( ba , "BrtFill" , write _BrtFill ( { patternType : "none" } ) ) ;
write _record ( ba , "BrtFill" , write _BrtFill ( { patternType : "gray125" } ) ) ;
/* 1*65431BrtFill */
write _record ( ba , "BrtEndFills" ) ;
}
2018-01-23 09:09:53 +00:00
function write _BORDERS _bin ( ba ) {
2017-05-09 18:11:15 +00:00
var cnt = 1 ;
if ( cnt == 0 ) return ;
write _record ( ba , "BrtBeginBorders" , write _UInt32LE ( cnt ) ) ;
write _record ( ba , "BrtBorder" , write _BrtBorder ( { } ) ) ;
/* 1*65430BrtBorder */
write _record ( ba , "BrtEndBorders" ) ;
}
2018-01-23 09:09:53 +00:00
function write _CELLSTYLEXFS _bin ( ba ) {
2017-05-09 18:11:15 +00:00
var cnt = 1 ;
write _record ( ba , "BrtBeginCellStyleXFs" , write _UInt32LE ( cnt ) ) ;
write _record ( ba , "BrtXF" , write _BrtXF ( {
numFmtId : 0 ,
fontId : 0 ,
fillId : 0 ,
borderId : 0
} , 0xFFFF ) ) ;
/* 1*65430(BrtXF *FRT) */
write _record ( ba , "BrtEndCellStyleXFs" ) ;
}
function write _CELLXFS _bin ( ba , data ) {
write _record ( ba , "BrtBeginCellXFs" , write _UInt32LE ( data . length ) ) ;
data . forEach ( function ( c ) { write _record ( ba , "BrtXF" , write _BrtXF ( c , 0 ) ) ; } ) ;
/* 1*65430(BrtXF *FRT) */
write _record ( ba , "BrtEndCellXFs" ) ;
}
2018-01-23 09:09:53 +00:00
function write _STYLES _bin ( ba ) {
2017-05-09 18:11:15 +00:00
var cnt = 1 ;
2018-01-23 09:09:53 +00:00
write _record ( ba , "BrtBeginStyles" , write _UInt32LE ( cnt ) ) ;
2017-05-09 18:11:15 +00:00
write _record ( ba , "BrtStyle" , write _BrtStyle ( {
xfId : 0 ,
builtinId : 0 ,
name : "Normal"
} ) ) ;
/* 1*65430(BrtStyle *FRT) */
write _record ( ba , "BrtEndStyles" ) ;
}
2018-01-23 09:09:53 +00:00
function write _DXFS _bin ( ba ) {
2017-05-09 18:11:15 +00:00
var cnt = 0 ;
write _record ( ba , "BrtBeginDXFs" , write _UInt32LE ( cnt ) ) ;
/* *2147483647(BrtDXF *FRT) */
write _record ( ba , "BrtEndDXFs" ) ;
}
2018-01-23 09:09:53 +00:00
function write _TABLESTYLES _bin ( ba ) {
2017-05-09 18:11:15 +00:00
var cnt = 0 ;
write _record ( ba , "BrtBeginTableStyles" , write _BrtBeginTableStyles ( cnt , "TableStyleMedium9" , "PivotStyleMedium4" ) ) ;
/* *TABLESTYLE */
write _record ( ba , "BrtEndTableStyles" ) ;
}
2018-01-23 09:09:53 +00:00
function write _COLORPALETTE _bin ( ) {
2017-05-09 18:11:15 +00:00
return ;
/* BrtBeginColorPalette [INDEXEDCOLORS] [MRUCOLORS] BrtEndColorPalette */
}
2014-07-28 15:32:28 +00:00
/* [MS-XLSB] 2.1.7.50 Styles */
2017-05-09 18:11:15 +00:00
function write _sty _bin ( wb , opts ) {
2014-07-28 15:32:28 +00:00
var ba = buf _array ( ) ;
write _record ( ba , "BrtBeginStyleSheet" ) ;
2017-05-09 18:11:15 +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 ) ;
2014-07-28 15:32:28 +00:00
/* FRTSTYLESHEET*/
write _record ( ba , "BrtEndStyleSheet" ) ;
return ba . end ( ) ;
}
2014-05-16 00:16:51 +00:00
RELS . THEME = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/theme" ;
2014-01-22 05:02:45 +00:00
2014-06-02 05:16:51 +00:00
/* 20.1.6.2 clrScheme CT_ColorScheme */
2017-03-20 21:57:44 +00:00
function parse _clrScheme ( t , themes , opts ) {
2014-05-29 22:32:13 +00:00
themes . themeElements . clrScheme = [ ] ;
var color = { } ;
2017-02-11 01:58:22 +00:00
( t [ 0 ] . match ( tagregex ) || [ ] ) . forEach ( function ( x ) {
2014-05-29 22:32:13 +00:00
var y = parsexmltag ( x ) ;
switch ( y [ 0 ] ) {
2017-05-09 18:11:15 +00:00
/* 20.1.6.2 clrScheme (Color Scheme) CT_ColorScheme */
2014-05-29 22:32:13 +00:00
case '<a:clrScheme' : case '</a:clrScheme>' : break ;
/* 20.1.2.3.32 srgbClr CT_SRgbColor */
2017-05-09 18:11:15 +00:00
case '<a:srgbClr' :
color . rgb = y . val ; break ;
2014-05-29 22:32:13 +00:00
/* 20.1.2.3.33 sysClr CT_SystemColor */
2017-05-09 18:11:15 +00:00
case '<a:sysClr' :
color . rgb = y . lastClr ; break ;
2014-05-29 22:32:13 +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:11:15 +00:00
/* 20.1.4.1.9 dk1 (Dark 1) */
/* 20.1.4.1.10 dk2 (Dark 2) */
2014-05-29 22:32:13 +00:00
/* 20.1.4.1.15 folHlink (Followed Hyperlink) */
2017-05-09 18:11:15 +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:29:24 +00:00
if ( y [ 0 ] . charAt ( 1 ) === '/' ) {
2014-05-29 22:32:13 +00:00
themes . themeElements . clrScheme . push ( color ) ;
color = { } ;
} else {
2018-01-23 09:09:53 +00:00
color . name = y [ 0 ] . slice ( 3 , y [ 0 ] . length - 1 ) ;
2014-05-29 22:32:13 +00:00
}
break ;
2017-03-20 21:57:44 +00:00
default : if ( opts && opts . WTF ) throw new Error ( 'Unrecognized ' + y [ 0 ] + ' in clrScheme' ) ;
2014-05-29 22:32:13 +00:00
}
} ) ;
}
2014-10-26 05:09:58 +00:00
/* 20.1.4.1.18 fontScheme CT_FontScheme */
2018-01-23 09:09:53 +00:00
function parse _fontScheme ( ) { }
2014-10-26 05:09:58 +00:00
/* 20.1.4.1.15 fmtScheme CT_StyleMatrix */
2018-01-23 09:09:53 +00:00
function parse _fmtScheme ( ) { }
2014-10-26 05:09:58 +00:00
2017-06-24 06:48:44 +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>/ ;
2014-10-26 05:09:58 +00:00
/* 20.1.6.10 themeElements CT_BaseStyles */
2017-03-20 21:57:44 +00:00
function parse _themeElements ( data , themes , opts ) {
2014-10-26 05:09:58 +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-11 01:58:22 +00:00
if ( ! ( t = data . match ( m [ 1 ] ) ) ) throw new Error ( m [ 0 ] + ' not found in themeElements' ) ;
2017-03-20 21:57:44 +00:00
m [ 2 ] ( t , themes , opts ) ;
2014-10-26 05:09:58 +00:00
} ) ;
}
2017-06-24 06:48:44 +00:00
var themeltregex = /<a:themeElements([^>]*)>[\s\S]*<\/a:themeElements>/ ;
2014-10-26 05:09:58 +00:00
2014-05-29 22:32:13 +00:00
/* 14.2.7 Theme Part */
function parse _theme _xml ( data , opts ) {
2014-10-26 05:09:58 +00:00
/* 20.1.6.9 theme CT_OfficeStyleSheet */
2017-03-20 21:57:44 +00:00
if ( ! data || data . length === 0 ) return parse _theme _xml ( write _theme ( ) ) ;
2014-05-29 22:32:13 +00:00
var t ;
2017-03-20 21:57:44 +00:00
var themes = { } ;
2014-05-29 22:32:13 +00:00
2014-10-26 05:09:58 +00:00
/* themeElements CT_BaseStyles */
2017-03-28 22:07:46 +00:00
if ( ! ( t = data . match ( themeltregex ) ) ) throw new Error ( 'themeElements not found in theme' ) ;
2017-03-20 21:57:44 +00:00
parse _themeElements ( t [ 0 ] , themes , opts ) ;
2014-05-29 22:32:13 +00:00
return themes ;
}
2017-03-20 21:57:44 +00:00
function write _theme ( Themes , opts ) {
2017-04-21 22:03:40 +00:00
if ( opts && opts . themeXLSX ) return opts . themeXLSX ;
2017-02-11 01:58:22 +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-20 21:57:44 +00:00
2017-02-11 01:58:22 +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-20 21:57:44 +00:00
o [ o . length ] = '</a:lnDef>' ;
2017-02-11 01:58:22 +00:00
o [ o . length ] = '</a:objectDefaults>' ;
o [ o . length ] = '<a:extraClrSchemeLst/>' ;
o [ o . length ] = '</a:theme>' ;
return o . join ( "" ) ;
}
2015-04-02 22:14:07 +00:00
/* [MS-XLS] 2.4.326 TODO: payload is a zip file */
2017-03-20 21:57:44 +00:00
function parse _Theme ( blob , length , opts ) {
2017-12-30 05:41:41 +00:00
var end = blob . l + length ;
2015-04-02 22:14:07 +00:00
var dwThemeVersion = blob . read _shift ( 4 ) ;
if ( dwThemeVersion === 124226 ) return ;
2017-12-30 05:41:41 +00:00
if ( ! opts . cellStyles || ! jszip ) { blob . l = end ; return ; }
var data = blob . slice ( blob . l ) ;
blob . l = end ;
var zip ; try { zip = new jszip ( data ) ; } catch ( e ) { return ; }
var themeXML = getzipstr ( zip , "theme/theme/theme1.xml" , true ) ;
if ( ! themeXML ) return ;
return parse _theme _xml ( themeXML , opts ) ;
2015-04-02 22:14:07 +00:00
}
/* 2.5.49 */
2018-01-23 09:09:53 +00:00
function parse _ColorTheme ( blob ) { return blob . read _shift ( 4 ) ; }
2015-04-02 22:14:07 +00:00
/* 2.5.155 */
2018-01-23 09:09:53 +00:00
function parse _FullColorExt ( blob ) {
2015-04-02 22:14:07 +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 05:26:28 +00:00
/* [MS-XLS] 2.5.108 */
2018-01-23 09:09:53 +00:00
function parse _ExtProp ( blob ) {
2015-04-02 22:14:07 +00:00
var extType = blob . read _shift ( 2 ) ;
2018-02-14 05:26:28 +00:00
var cb = blob . read _shift ( 2 ) - 4 ;
2015-04-02 22:14:07 +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 05:26:28 +00:00
case 0x0E : case 0x0F : o [ 1 ] = blob . read _shift ( cb === 1 ? 1 : 2 ) ; break ;
2015-04-02 22:14:07 +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 ) ;
var ext = [ ] ;
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 07:34:05 +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 */
2015-04-02 22:14:07 +00:00
case 0x0d : break ; /* text color */
case 0x0e : break ; /* font scheme */
2017-03-13 07:34:05 +00:00
case 0x0f : break ; /* indentation level */
2015-04-02 22:14:07 +00:00
}
} ) ;
}
2014-03-29 22:53:44 +00:00
/* 18.6 Calculation Chain */
2018-01-23 09:09:53 +00:00
function parse _cc _xml ( data ) {
2014-03-29 22:53:44 +00:00
var d = [ ] ;
2017-02-11 01:58:22 +00:00
if ( ! data ) return d ;
2018-01-23 09:09:53 +00:00
var i = 1 ;
2014-06-29 18:35:10 +00:00
( data . match ( tagregex ) || [ ] ) . forEach ( function ( x ) {
2014-03-29 22:53:44 +00:00
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:09:53 +00:00
//function write_cc_xml(data, opts) { }
2017-08-19 23:13:21 +00:00
2014-03-29 22:53:44 +00:00
/* [MS-XLSB] 2.6.4.1 */
2018-01-23 09:09:53 +00:00
function parse _BrtCalcChainItem$ ( data ) {
2014-03-29 22:53:44 +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 ;
2014-06-29 18:35:10 +00:00
}
2014-03-29 22:53:44 +00:00
/* 18.6 Calculation Chain */
2017-08-19 23:13:21 +00:00
function parse _cc _bin ( data , name , opts ) {
2014-03-29 22:53:44 +00:00
var out = [ ] ;
var pass = false ;
2017-04-09 04:07:43 +00:00
recordhopper ( data , function hopper _cc ( val , R _n , RT ) {
switch ( RT ) {
case 0x003F : /* 'BrtCalcChainItem$' */
out . push ( val ) ; break ;
default :
2017-05-09 18:11:15 +00:00
if ( ( R _n || "" ) . indexOf ( "Begin" ) > 0 ) { /* empty */ }
else if ( ( R _n || "" ) . indexOf ( "End" ) > 0 ) { /* empty */ }
2017-04-09 04:07:43 +00:00
else if ( ! pass || opts . WTF ) throw new Error ( "Unexpected record " + RT + " " + R _n ) ;
2014-03-29 22:53:44 +00:00
}
} ) ;
return out ;
}
2014-05-29 22:32:13 +00:00
2018-01-23 09:09:53 +00:00
//function write_cc_bin(data, opts) { }
2017-08-19 23:13:21 +00:00
/* 18.14 Supplementary Workbook Data */
2018-01-23 09:09:53 +00:00
function parse _xlink _xml ( ) {
//var opts = _opts || {};
2017-08-19 23:13:21 +00:00
//if(opts.WTF) throw "XLSX External Link";
}
/* [MS-XLSB] 2.1.7.25 External Link */
function parse _xlink _bin ( data , name , _opts ) {
if ( ! data ) return data ;
var opts = _opts || { } ;
var pass = false , end = false ;
recordhopper ( data , function xlink _parse ( val , R _n , RT ) {
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 :
if ( ( R _n || "" ) . indexOf ( "Begin" ) > 0 ) { /* empty */ }
else if ( ( R _n || "" ) . indexOf ( "End" ) > 0 ) { /* empty */ }
else if ( ! pass || opts . WTF ) throw new Error ( "Unexpected record " + RT . toString ( 16 ) + " " + R _n ) ;
}
} , opts ) ;
}
2017-04-09 04:07:43 +00:00
RELS . IMG = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/image" ;
RELS . DRAW = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/drawing" ;
2017-03-28 22:07:46 +00:00
/* 20.5 DrawingML - SpreadsheetML Drawing */
function parse _drawing ( data , rels ) {
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
- chart reference
the actual type is based on the URI of the graphicData
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-09 04:07:43 +00:00
2017-04-03 06:04:35 +00:00
/* L.5.5.2 SpreadsheetML Comments + VML Schema */
var _shapeid = 1024 ;
function write _comments _vml ( rId , comments ) {
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 ( /\/>/ , ">" ) ,
writextag ( "o:shapelayout" , writextag ( "o:idmap" , null , { 'v:ext' : "edit" , 'data' : rId } ) , { 'v:ext' : "edit" } ) ,
writextag ( "v:shapetype" , [
writextag ( "v:stroke" , null , { joinstyle : "miter" } ) ,
writextag ( "v:path" , null , { gradientshapeok : "t" , 'o:connecttype' : "rect" } )
] . join ( "" ) , { id : "_x0000_t202" , 'o:spt' : 202 , coordsize : csize . join ( "," ) , path : bbox } )
] ;
while ( _shapeid < rId * 1000 ) _shapeid += 1000 ;
2018-03-13 01:55:12 +00:00
comments . forEach ( function ( x ) { var c = decode _cell ( x [ 0 ] ) ;
o = o . concat ( [
2017-04-03 06:04:35 +00:00
'<v:shape' + wxt _helper ( {
id : '_x0000_s' + ( ++ _shapeid ) ,
type : "#_x0000_t202" ,
2018-06-01 16:34:26 +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-03 06:04:35 +00:00
fillcolor : "#ECFAD4" ,
strokecolor : "#edeaa1"
} ) + '>' ,
writextag ( 'v:fill' , writextag ( "o:fill" , null , { type : "gradientUnscaled" , 'v:ext' : "view" } ) , { 'color2' : "#BEFF82" , 'angle' : "-180" , 'type' : "gradient" } ) ,
writextag ( "v:shadow" , null , { on : "t" , 'obscured' : "t" } ) ,
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) */
writetag ( 'x:Anchor' , [ c . c , 0 , c . r , 0 , c . c + 3 , 100 , c . r + 5 , 100 ] . join ( "," ) ) ,
writetag ( 'x:AutoFill' , "False" ) ,
writetag ( 'x:Row' , String ( c . r ) ) ,
writetag ( 'x:Column' , String ( c . c ) ) ,
2018-06-01 16:34:26 +00:00
x [ 1 ] . hidden ? '' : '<x:Visible/>' ,
2017-04-03 06:04:35 +00:00
'</x:ClientData>' ,
'</v:shape>'
] ) ; } ) ;
o . push ( '</xml>' ) ;
return o . join ( "" ) ;
}
RELS . CMNT = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/comments" ;
2014-06-02 05:16:51 +00:00
function parse _comments ( zip , dirComments , sheets , sheetRels , opts ) {
for ( var i = 0 ; i != dirComments . length ; ++ i ) {
var canonicalpath = dirComments [ i ] ;
var comments = parse _cmnt ( getzipdata ( zip , canonicalpath . replace ( /^\// , '' ) , true ) , canonicalpath , opts ) ;
if ( ! comments || ! comments . length ) continue ;
// find the sheets targeted by these comments
var sheetNames = keys ( sheets ) ;
for ( var j = 0 ; j != sheetNames . length ; ++ j ) {
var sheetName = sheetNames [ j ] ;
var rels = sheetRels [ sheetName ] ;
if ( rels ) {
var rel = rels [ canonicalpath ] ;
if ( rel ) insertCommentsIntoSheet ( sheetName , sheets [ sheetName ] , comments ) ;
}
}
}
}
function insertCommentsIntoSheet ( sheetName , sheet , comments ) {
2017-04-09 04:07:43 +00:00
var dense = Array . isArray ( sheet ) ;
var cell , r ;
2014-06-02 05:16:51 +00:00
comments . forEach ( function ( comment ) {
2017-04-09 04:07:43 +00:00
if ( dense ) {
r = decode _cell ( comment . ref ) ;
if ( ! sheet [ r . r ] ) sheet [ r . r ] = [ ] ;
cell = sheet [ r . r ] [ r . c ] ;
} else cell = sheet [ comment . ref ] ;
2014-06-02 05:16:51 +00:00
if ( ! cell ) {
cell = { } ;
2017-04-09 04:07:43 +00:00
if ( dense ) sheet [ r . r ] [ r . c ] = cell ;
else sheet [ comment . ref ] = cell ;
2014-06-29 18:35:10 +00:00
var range = safe _decode _range ( sheet [ "!ref" ] || "BDWGO1000001:A1" ) ;
2014-06-02 05:16:51 +00:00
var thisCell = decode _cell ( comment . ref ) ;
if ( range . s . r > thisCell . r ) range . s . r = thisCell . r ;
if ( range . e . r < thisCell . r ) range . e . r = thisCell . r ;
if ( range . s . c > thisCell . c ) range . s . c = thisCell . c ;
if ( range . e . c < thisCell . c ) range . e . c = thisCell . c ;
var encoded = encode _range ( range ) ;
if ( encoded !== sheet [ "!ref" ] ) sheet [ "!ref" ] = encoded ;
}
2015-04-02 22:14:07 +00:00
if ( ! cell . c ) cell . c = [ ] ;
2017-02-11 01:58:22 +00:00
var o = ( { a : comment . author , t : comment . t , r : comment . r } ) ;
2015-04-02 22:14:07 +00:00
if ( comment . h ) o . h = comment . h ;
cell . c . push ( o ) ;
} ) ;
}
2017-04-03 06:04:35 +00:00
/* 18.7 Comments */
2015-04-02 22:14:07 +00:00
function parse _comments _xml ( data , opts ) {
2017-04-03 06:04:35 +00:00
/* 18.7.6 CT_Comments */
2015-04-02 22:14:07 +00:00
if ( data . match ( /<(?:\w+:)?comments *\/>/ ) ) return [ ] ;
var authors = [ ] ;
var commentList = [ ] ;
2017-06-24 06:48:44 +00:00
var authtag = data . match ( /<(?:\w+:)?authors>([\s\S]*)<\/(?:\w+:)?authors>/ ) ;
2017-02-11 01:58:22 +00:00
if ( authtag && authtag [ 1 ] ) authtag [ 1 ] . split ( /<\/\w*:?author>/ ) . forEach ( function ( x ) {
2015-04-02 22:14:07 +00:00
if ( x === "" || x . trim ( ) === "" ) return ;
2017-02-11 01:58:22 +00:00
var a = x . match ( /<(?:\w+:)?author[^>]*>(.*)/ ) ;
if ( a ) authors . push ( a [ 1 ] ) ;
2015-04-02 22:14:07 +00:00
} ) ;
2017-06-24 06:48:44 +00:00
var cmnttag = data . match ( /<(?:\w+:)?commentList>([\s\S]*)<\/(?:\w+:)?commentList>/ ) ;
2018-01-23 09:09:53 +00:00
if ( cmnttag && cmnttag [ 1 ] ) cmnttag [ 1 ] . split ( /<\/\w*:?comment>/ ) . forEach ( function ( x ) {
2015-04-02 22:14:07 +00:00
if ( x === "" || x . trim ( ) === "" ) return ;
2017-02-11 01:58:22 +00:00
var cm = x . match ( /<(?:\w+:)?comment[^>]*>/ ) ;
if ( ! cm ) return ;
var y = parsexmltag ( cm [ 0 ] ) ;
2017-09-22 22:40:09 +00:00
var comment = ( { author : y . authorId && authors [ y . authorId ] || "sheetjsghost" , ref : y . ref , guid : y . guid } ) ;
2015-04-02 22:14:07 +00:00
var cell = decode _cell ( y . ref ) ;
if ( opts . sheetRows && opts . sheetRows <= cell . r ) return ;
2017-06-24 06:48:44 +00:00
var textMatch = x . match ( /<(?:\w+:)?text>([\s\S]*)<\/(?:\w+:)?text>/ ) ;
2017-04-03 06:04:35 +00:00
var rt = ! ! textMatch && ! ! textMatch [ 1 ] && parse _si ( textMatch [ 1 ] ) || { r : "" , t : "" , h : "" } ;
2015-04-02 22:14:07 +00:00
comment . r = rt . r ;
2017-04-03 06:04:35 +00:00
if ( rt . r == "<t></t>" ) rt . t = rt . h = "" ;
comment . t = rt . t . replace ( /\r\n/g , "\n" ) . replace ( /\r/g , "\n" ) ;
2015-04-02 22:14:07 +00:00
if ( opts . cellHTML ) comment . h = rt . h ;
commentList . push ( comment ) ;
} ) ;
return commentList ;
}
2017-04-03 06:04:35 +00:00
var CMNT _XML _ROOT = writextag ( 'comments' , null , { 'xmlns' : XMLNS . main [ 0 ] } ) ;
2018-01-23 09:09:53 +00:00
function write _comments _xml ( data ) {
2017-04-03 06:04:35 +00:00
var o = [ XML _HEADER , CMNT _XML _ROOT ] ;
var iauthor = [ ] ;
o . push ( "<authors>" ) ;
2018-03-13 01:55:12 +00:00
data . forEach ( function ( x ) { x [ 1 ] . forEach ( function ( w ) { var a = escapexml ( w . a ) ;
if ( iauthor . indexOf ( a ) > - 1 ) return ;
iauthor . push ( a ) ;
o . push ( "<author>" + a + "</author>" ) ;
} ) ; } ) ;
2017-04-03 06:04:35 +00:00
o . push ( "</authors>" ) ;
o . push ( "<commentList>" ) ;
data . forEach ( function ( d ) {
d [ 1 ] . forEach ( function ( c ) {
/* 18.7.3 CT_Comment */
o . push ( '<comment ref="' + d [ 0 ] + '" authorId="' + iauthor . indexOf ( escapexml ( c . a ) ) + '"><text>' ) ;
o . push ( writetag ( "t" , c . t == null ? "" : c . t ) ) ;
o . push ( '</text></comment>' ) ;
} ) ;
} ) ;
o . push ( "</commentList>" ) ;
if ( o . length > 2 ) { o [ o . length ] = ( '</comments>' ) ; o [ 1 ] = o [ 1 ] . replace ( "/>" , ">" ) ; }
return o . join ( "" ) ;
}
2015-04-02 22:14:07 +00:00
/* [MS-XLSB] 2.4.28 BrtBeginComment */
2018-01-23 09:09:53 +00:00
function parse _BrtBeginComment ( data ) {
2015-04-02 22:14:07 +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-03 06:04:35 +00:00
function write _BrtBeginComment ( data , o ) {
if ( o == null ) o = new _buf ( 36 ) ;
o . write _shift ( 4 , data [ 1 ] . iauthor ) ;
write _UncheckedRfX ( ( data [ 0 ] ) , o ) ;
o . write _shift ( 4 , 0 ) ;
o . write _shift ( 4 , 0 ) ;
o . write _shift ( 4 , 0 ) ;
o . write _shift ( 4 , 0 ) ;
return o ;
}
2015-04-02 22:14:07 +00:00
2018-02-14 05:26:28 +00:00
/* [MS-XLSB] 2.4.327 BrtCommentAuthor */
2015-04-02 22:14:07 +00:00
var parse _BrtCommentAuthor = parse _XLWideString ;
2017-09-22 22:40:09 +00:00
function write _BrtCommentAuthor ( data ) { return write _XLWideString ( data . slice ( 0 , 54 ) ) ; }
2015-04-02 22:14:07 +00:00
/* [MS-XLSB] 2.1.7.8 Comments */
function parse _comments _bin ( data , opts ) {
var out = [ ] ;
var authors = [ ] ;
var c = { } ;
var pass = false ;
2017-04-09 04:07:43 +00:00
recordhopper ( data , function hopper _cmnt ( val , R _n , RT ) {
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' */
2015-04-02 22:14:07 +00:00
c . author = authors [ c . iauthor ] ;
delete c . iauthor ;
if ( opts . sheetRows && opts . sheetRows <= c . rfx . r ) break ;
2017-04-03 06:04:35 +00:00
if ( ! c . t ) c . t = "" ;
2015-04-02 22:14:07 +00:00
delete c . rfx ; out . push ( c ) ; break ;
2017-04-09 04:07:43 +00:00
2018-03-19 22:14:14 +00:00
case 0x0C00 : /* 'BrtUid' */
break ;
2017-04-09 04:07:43 +00:00
case 0x0023 : /* 'BrtFRTBegin' */
pass = true ; break ;
case 0x0024 : /* 'BrtFRTEnd' */
pass = false ; break ;
case 0x0025 : /* 'BrtACBegin' */ break ;
case 0x0026 : /* 'BrtACEnd' */ break ;
default :
2017-05-09 18:11:15 +00:00
if ( ( R _n || "" ) . indexOf ( "Begin" ) > 0 ) { /* empty */ }
else if ( ( R _n || "" ) . indexOf ( "End" ) > 0 ) { /* empty */ }
2017-04-09 04:07:43 +00:00
else if ( ! pass || opts . WTF ) throw new Error ( "Unexpected record " + RT + " " + R _n ) ;
2015-04-02 22:14:07 +00:00
}
} ) ;
return out ;
}
2018-01-23 09:09:53 +00:00
function write _comments _bin ( data ) {
2017-04-03 06:04:35 +00:00
var ba = buf _array ( ) ;
var iauthor = [ ] ;
write _record ( ba , "BrtBeginComments" ) ;
2017-12-30 05:41:41 +00:00
write _record ( ba , "BrtBeginCommentAuthors" ) ;
data . forEach ( function ( comment ) {
comment [ 1 ] . forEach ( function ( c ) {
if ( iauthor . indexOf ( c . a ) > - 1 ) return ;
iauthor . push ( c . a . slice ( 0 , 54 ) ) ;
write _record ( ba , "BrtCommentAuthor" , write _BrtCommentAuthor ( c . a ) ) ;
2017-04-03 06:04:35 +00:00
} ) ;
2017-12-30 05:41:41 +00:00
} ) ;
write _record ( ba , "BrtEndCommentAuthors" ) ;
write _record ( ba , "BrtBeginCommentList" ) ;
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 ] ) } ;
write _record ( ba , "BrtBeginComment" , write _BrtBeginComment ( [ range , c ] ) ) ;
if ( c . t && c . t . length > 0 ) write _record ( ba , "BrtCommentText" , write _BrtCommentText ( c ) ) ;
write _record ( ba , "BrtEndComment" ) ;
delete c . iauthor ;
2017-04-03 06:04:35 +00:00
} ) ;
2017-12-30 05:41:41 +00:00
} ) ;
write _record ( ba , "BrtEndCommentList" ) ;
2017-04-03 06:04:35 +00:00
write _record ( ba , "BrtEndComments" ) ;
return ba . end ( ) ;
}
2018-02-08 19:13:10 +00:00
var CT _VBA = "application/vnd.ms-office.vbaProject" ;
2017-10-17 00:36:51 +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 ;
2018-02-08 19:13:10 +00:00
var newpath = p . replace ( /^[^\/]*/ , "R" ) . replace ( /\/_VBA_PROJECT_CUR\u0000*/ , "" ) ;
2017-10-17 00:36:51 +00:00
CFB . utils . cfb _add ( newcfb , newpath , cfb . FileIndex [ i ] . content ) ;
} ) ;
return CFB . write ( newcfb ) ;
}
2017-10-27 19:55:07 +00:00
function fill _vba _xls ( cfb , vba ) {
vba . FullPaths . forEach ( function ( p , i ) {
if ( i == 0 ) return ;
2018-02-08 19:13:10 +00:00
var newpath = p . replace ( /[^\/]*[\/]/ , "/_VBA_PROJECT_CUR/" ) ;
2017-10-27 19:55:07 +00:00
if ( newpath . slice ( - 1 ) !== "/" ) CFB . utils . cfb _add ( cfb , newpath , vba . FileIndex [ i ] . content ) ;
} ) ;
}
2017-12-30 05:41:41 +00:00
var VBAFMTS = [ "xlsb" , "xlsm" , "xlam" , "biff8" , "xla" ] ;
2017-03-28 22:07:46 +00:00
RELS . DS = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/dialogsheet" ;
RELS . MS = "http://schemas.microsoft.com/office/2006/relationships/xlMacrosheet" ;
/* macro and dialog sheet stubs */
2018-01-23 09:09:53 +00:00
function parse _ds _bin ( ) { return { '!type' : 'dialog' } ; }
function parse _ds _xml ( ) { return { '!type' : 'dialog' } ; }
function parse _ms _bin ( ) { return { '!type' : 'macro' } ; }
function parse _ms _xml ( ) { return { '!type' : 'macro' } ; }
2015-04-02 22:14:07 +00:00
/* TODO: it will be useful to parse the function str */
var rc _to _a1 = ( function ( ) {
var rcregex = /(^|[^A-Za-z])R(\[?)(-?\d+|)\]?C(\[?)(-?\d+|)\]?/g ;
2017-04-16 07:35:56 +00:00
var rcbase = ( { r : 0 , c : 0 } ) ;
2015-04-02 22:14:07 +00:00
function rcfunc ( $$ , $1 , $2 , $3 , $4 , $5 ) {
var R = $3 . length > 0 ? parseInt ( $3 , 10 ) | 0 : 0 , C = $5 . length > 0 ? parseInt ( $5 , 10 ) | 0 : 0 ;
if ( C < 0 && $4 . length === 0 ) C = 0 ;
2017-02-19 21:11:48 +00:00
var cRel = false , rRel = false ;
if ( $4 . length > 0 || $5 . length == 0 ) cRel = true ; if ( cRel ) C += rcbase . c ; else -- C ;
if ( $2 . length > 0 || $3 . length == 0 ) rRel = true ; if ( rRel ) R += rcbase . r ; else -- R ;
return $1 + ( cRel ? "" : "$" ) + encode _col ( C ) + ( rRel ? "" : "$" ) + encode _row ( R ) ;
2015-04-02 22:14:07 +00:00
}
return function rc _to _a1 ( fstr , base ) {
rcbase = base ;
return fstr . replace ( rcregex , rcfunc ) ;
} ;
} ) ( ) ;
2017-03-13 07:34: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])([$]?)([1-9]\d{0,5}|10[0-3]\d{4}|104[0-7]\d{3}|1048[0-4]\d{2}|10485[0-6]\d|104857[0-6])(?![_.\(A-Za-z0-9])/g ;
2017-03-16 04:39:50 +00:00
var a1 _to _rc = ( function ( ) {
return function a1 _to _rc ( fstr , base ) {
2018-01-23 09:09:53 +00:00
return fstr . replace ( crefregex , function ( $0 , $1 , $2 , $3 , $4 , $5 ) {
2018-01-09 07:40:54 +00:00
var c = decode _col ( $3 ) - ( $2 ? 0 : base . c ) ;
var r = decode _row ( $5 ) - ( $4 ? 0 : base . r ) ;
var R = ( r == 0 ? "" : ! $4 ? "[" + r + "]" : ( r + 1 ) ) ;
var C = ( c == 0 ? "" : ! $2 ? "[" + c + "]" : ( c + 1 ) ) ;
return $1 + "R" + R + "C" + C ;
2017-03-16 04:39:50 +00:00
} ) ;
} ;
} ) ( ) ;
/* no defined name can collide with a valid cell address A1:XFD1048576 ... except LOG10! */
2017-02-19 21:11:48 +00:00
function shift _formula _str ( f , delta ) {
2018-01-23 09:09:53 +00:00
return f . replace ( crefregex , function ( $0 , $1 , $2 , $3 , $4 , $5 ) {
2017-02-19 21:11:48 +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 , range , cell ) {
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-19 23:13:21 +00:00
/* TODO: parse formula */
function fuzzyfmla ( f ) {
if ( f . length == 1 ) return false ;
return true ;
}
2017-12-30 05:41:41 +00:00
function _xlfn ( f ) {
return f . replace ( /_xlfn\./g , "" ) ;
}
2017-05-09 18:11:15 +00:00
function parseread1 ( blob ) { blob . l += 1 ; return ; }
2015-04-02 22:14:07 +00:00
2018-02-14 05:26:28 +00:00
/* [MS-XLS] 2.5.51 */
2015-04-02 22:14:07 +00:00
function parse _ColRelU ( blob , length ) {
2017-02-19 21:11:48 +00:00
var c = blob . read _shift ( length == 1 ? 1 : 2 ) ;
2015-04-02 22:14:07 +00:00
return [ c & 0x3FFF , ( c >> 14 ) & 1 , ( c >> 15 ) & 1 ] ;
}
2018-02-14 05:26:28 +00:00
/* [MS-XLS] 2.5.198.105 ; [MS-XLSB] 2.5.97.89 */
2017-02-19 21:11:48 +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 ) ;
2015-04-02 22:14:07 +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 21:11:48 +00:00
/* BIFF 2-5 encodes flags in the row field */
2017-07-05 21:02:14 +00:00
function parse _RgceArea _BIFF2 ( blob ) {
2017-02-19 21:11:48 +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 ] } } ;
}
2015-04-02 22:14:07 +00:00
2018-02-14 05:26:28 +00:00
/* [MS-XLS] 2.5.198.105 ; [MS-XLSB] 2.5.97.90 */
2018-02-21 06:20:15 +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 ) ;
2015-04-02 22:14:07 +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 05:26:28 +00:00
/* [MS-XLS] 2.5.198.109 ; [MS-XLSB] 2.5.97.91 */
2017-02-19 21:11:48 +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 ) ;
2015-04-02 22:14:07 +00:00
var c = parse _ColRelU ( blob , 2 ) ;
return { r : r , c : c [ 0 ] , cRel : c [ 1 ] , rRel : c [ 2 ] } ;
}
2018-01-23 09:09:53 +00:00
function parse _RgceLoc _BIFF2 ( blob ) {
2017-02-19 21:11:48 +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 ] } ;
}
2015-04-02 22:14:07 +00:00
2018-02-14 05:26:28 +00:00
/* [MS-XLS] 2.5.198.107, 2.5.47 */
2018-01-23 09:09:53 +00:00
function parse _RgceElfLoc ( blob ) {
2017-10-17 00:36:51 +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 05:26:28 +00:00
/* [MS-XLS] 2.5.198.111 ; [MS-XLSB] 2.5.97.92 TODO */
2017-02-19 21:11:48 +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 ) ;
2015-04-02 22:14:07 +00:00
var cl = blob . read _shift ( 2 ) ;
2018-01-09 07:40:54 +00:00
var cRel = ( cl & 0x4000 ) >> 14 , rRel = ( cl & 0x8000 ) >> 15 ;
2015-04-02 22:14:07 +00:00
cl &= 0x3FFF ;
2017-02-19 21:11:48 +00:00
if ( rRel == 1 ) while ( r > 0x7FFFF ) r -= 0x100000 ;
if ( cRel == 1 ) while ( cl > 0x1FFF ) cl = cl - 0x4000 ;
2015-04-02 22:14:07 +00:00
return { r : r , c : cl , cRel : cRel , rRel : rRel } ;
}
2018-01-23 09:09:53 +00:00
function parse _RgceLocRel _BIFF2 ( blob ) {
2017-02-19 21:11:48 +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 } ;
}
2015-04-02 22:14:07 +00:00
2018-02-14 05:26:28 +00:00
/* [MS-XLS] 2.5.198.27 ; [MS-XLSB] 2.5.97.18 */
2017-02-19 21:11:48 +00:00
function parse _PtgArea ( blob , length , opts ) {
2015-04-02 22:14:07 +00:00
var type = ( blob [ blob . l ++ ] & 0x60 ) >> 5 ;
2017-02-19 21:11:48 +00:00
var area = parse _RgceArea ( blob , opts . biff >= 2 && opts . biff <= 5 ? 6 : 8 , opts ) ;
2015-04-02 22:14:07 +00:00
return [ type , area ] ;
}
2018-02-14 05:26:28 +00:00
/* [MS-XLS] 2.5.198.28 ; [MS-XLSB] 2.5.97.19 */
2017-02-19 21:11:48 +00:00
function parse _PtgArea3d ( blob , length , opts ) {
2015-04-02 22:14:07 +00:00
var type = ( blob [ blob . l ++ ] & 0x60 ) >> 5 ;
2017-02-19 21:11:48 +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 ) ;
2015-04-02 22:14:07 +00:00
return [ type , ixti , area ] ;
}
2018-02-14 05:26:28 +00:00
/* [MS-XLS] 2.5.198.29 ; [MS-XLSB] 2.5.97.20 */
2017-03-11 00:01:58 +00:00
function parse _PtgAreaErr ( blob , length , opts ) {
2015-04-02 22:14:07 +00:00
var type = ( blob [ blob . l ++ ] & 0x60 ) >> 5 ;
2018-02-28 09:58:43 +00:00
blob . l += opts && ( opts . biff > 8 ) ? 12 : ( opts . biff < 8 ? 6 : 8 ) ;
2015-04-02 22:14:07 +00:00
return [ type ] ;
}
2018-02-14 05:26:28 +00:00
/* [MS-XLS] 2.5.198.30 ; [MS-XLSB] 2.5.97.21 */
2017-02-19 21:11:48 +00:00
function parse _PtgAreaErr3d ( blob , length , opts ) {
2015-04-02 22:14:07 +00:00
var type = ( blob [ blob . l ++ ] & 0x60 ) >> 5 ;
var ixti = blob . read _shift ( 2 ) ;
2017-02-19 21:11:48 +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 ;
2015-04-02 22:14:07 +00:00
return [ type , ixti ] ;
}
2018-02-14 05:26:28 +00:00
/* [MS-XLS] 2.5.198.31 ; [MS-XLSB] 2.5.97.22 */
2017-03-11 00:01:58 +00:00
function parse _PtgAreaN ( blob , length , opts ) {
2015-04-02 22:14:07 +00:00
var type = ( blob [ blob . l ++ ] & 0x60 ) >> 5 ;
2018-02-21 06:20:15 +00:00
var area = parse _RgceAreaRel ( blob , length - 1 , opts ) ;
2015-04-02 22:14:07 +00:00
return [ type , area ] ;
}
2018-02-14 05:26:28 +00:00
/* [MS-XLS] 2.5.198.32 ; [MS-XLSB] 2.5.97.23 */
2017-02-19 21:11:48 +00:00
function parse _PtgArray ( blob , length , opts ) {
2015-04-02 22:14:07 +00:00
var type = ( blob [ blob . l ++ ] & 0x60 ) >> 5 ;
2017-02-19 21:11:48 +00:00
blob . l += opts . biff == 2 ? 6 : opts . biff == 12 ? 14 : 7 ;
2015-04-02 22:14:07 +00:00
return [ type ] ;
}
2018-02-14 05:26:28 +00:00
/* [MS-XLS] 2.5.198.33 ; [MS-XLSB] 2.5.97.24 */
2018-01-23 09:09:53 +00:00
function parse _PtgAttrBaxcel ( blob ) {
2015-04-02 22:14:07 +00:00
var bitSemi = blob [ blob . l + 1 ] & 0x01 ; /* 1 = volatile */
var bitBaxcel = 1 ;
blob . l += 4 ;
return [ bitSemi , bitBaxcel ] ;
}
2018-02-14 05:26:28 +00:00
/* [MS-XLS] 2.5.198.34 ; [MS-XLSB] 2.5.97.25 */
2017-02-19 21:11:48 +00:00
function parse _PtgAttrChoose ( blob , length , opts ) {
2015-04-02 22:14:07 +00:00
blob . l += 2 ;
2017-02-19 21:11:48 +00:00
var offset = blob . read _shift ( opts && opts . biff == 2 ? 1 : 2 ) ;
2015-04-02 22:14:07 +00:00
var o = [ ] ;
/* offset is 1 less than the number of elements */
2017-02-19 21:11:48 +00:00
for ( var i = 0 ; i <= offset ; ++ i ) o . push ( blob . read _shift ( opts && opts . biff == 2 ? 1 : 2 ) ) ;
2015-04-02 22:14:07 +00:00
return o ;
}
2018-02-14 05:26:28 +00:00
/* [MS-XLS] 2.5.198.35 ; [MS-XLSB] 2.5.97.26 */
2017-02-19 21:11:48 +00:00
function parse _PtgAttrGoto ( blob , length , opts ) {
2015-04-02 22:14:07 +00:00
var bitGoto = ( blob [ blob . l + 1 ] & 0xFF ) ? 1 : 0 ;
blob . l += 2 ;
2017-02-19 21:11:48 +00:00
return [ bitGoto , blob . read _shift ( opts && opts . biff == 2 ? 1 : 2 ) ] ;
2015-04-02 22:14:07 +00:00
}
2018-02-14 05:26:28 +00:00
/* [MS-XLS] 2.5.198.36 ; [MS-XLSB] 2.5.97.27 */
2017-02-19 21:11:48 +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:09:53 +00:00
function parse _PtgAttrIfError ( blob ) {
2015-04-02 22:14:07 +00:00
var bitIf = ( blob [ blob . l + 1 ] & 0xFF ) ? 1 : 0 ;
blob . l += 2 ;
return [ bitIf , blob . read _shift ( 2 ) ] ;
}
2018-02-14 05:26:28 +00:00
/* [MS-XLS] 2.5.198.37 ; [MS-XLSB] 2.5.97.29 */
2017-02-19 21:11:48 +00:00
function parse _PtgAttrSemi ( blob , length , opts ) {
2015-04-02 22:14:07 +00:00
var bitSemi = ( blob [ blob . l + 1 ] & 0xFF ) ? 1 : 0 ;
2017-02-19 21:11:48 +00:00
blob . l += opts && opts . biff == 2 ? 3 : 4 ;
2015-04-02 22:14:07 +00:00
return [ bitSemi ] ;
}
2018-02-14 05:26:28 +00:00
/* [MS-XLS] 2.5.198.40 ; [MS-XLSB] 2.5.97.32 */
2018-01-23 09:09:53 +00:00
function parse _PtgAttrSpaceType ( blob ) {
2015-04-02 22:14:07 +00:00
var type = blob . read _shift ( 1 ) , cch = blob . read _shift ( 1 ) ;
return [ type , cch ] ;
}
2018-02-14 05:26:28 +00:00
/* [MS-XLS] 2.5.198.38 ; [MS-XLSB] 2.5.97.30 */
2018-01-23 09:09:53 +00:00
function parse _PtgAttrSpace ( blob ) {
2015-04-02 22:14:07 +00:00
blob . read _shift ( 2 ) ;
return parse _PtgAttrSpaceType ( blob , 2 ) ;
}
2018-02-14 05:26:28 +00:00
/* [MS-XLS] 2.5.198.39 ; [MS-XLSB] 2.5.97.31 */
2018-01-23 09:09:53 +00:00
function parse _PtgAttrSpaceSemi ( blob ) {
2015-04-02 22:14:07 +00:00
blob . read _shift ( 2 ) ;
return parse _PtgAttrSpaceType ( blob , 2 ) ;
}
2018-02-14 05:26:28 +00:00
/* [MS-XLS] 2.5.198.84 ; [MS-XLSB] 2.5.97.68 TODO */
2017-02-19 21:11:48 +00:00
function parse _PtgRef ( blob , length , opts ) {
2018-01-23 09:09:53 +00:00
//var ptg = blob[blob.l] & 0x1F;
2015-04-02 22:14:07 +00:00
var type = ( blob [ blob . l ] & 0x60 ) >> 5 ;
blob . l += 1 ;
2017-02-19 21:11:48 +00:00
var loc = parse _RgceLoc ( blob , 0 , opts ) ;
2015-04-02 22:14:07 +00:00
return [ type , loc ] ;
}
2018-02-14 05:26:28 +00:00
/* [MS-XLS] 2.5.198.88 ; [MS-XLSB] 2.5.97.72 TODO */
2017-02-19 21:11:48 +00:00
function parse _PtgRefN ( blob , length , opts ) {
2015-04-02 22:14:07 +00:00
var type = ( blob [ blob . l ] & 0x60 ) >> 5 ;
blob . l += 1 ;
2017-02-19 21:11:48 +00:00
var loc = parse _RgceLocRel ( blob , 0 , opts ) ;
2015-04-02 22:14:07 +00:00
return [ type , loc ] ;
}
2018-02-14 05:26:28 +00:00
/* [MS-XLS] 2.5.198.85 ; [MS-XLSB] 2.5.97.69 TODO */
2017-02-19 21:11:48 +00:00
function parse _PtgRef3d ( blob , length , opts ) {
2015-04-02 22:14:07 +00:00
var type = ( blob [ blob . l ] & 0x60 ) >> 5 ;
blob . l += 1 ;
var ixti = blob . read _shift ( 2 ) ; // XtiIndex
2018-02-14 05:26:28 +00:00
if ( opts && opts . biff == 5 ) blob . l += 12 ;
2017-02-19 21:11:48 +00:00
var loc = parse _RgceLoc ( blob , 0 , opts ) ; // TODO: or RgceLocRel
2015-04-02 22:14:07 +00:00
return [ type , ixti , loc ] ;
}
2018-02-14 05:26:28 +00:00
/* [MS-XLS] 2.5.198.62 ; [MS-XLSB] 2.5.97.45 TODO */
2017-02-19 21:11:48 +00:00
function parse _PtgFunc ( blob , length , opts ) {
2018-01-23 09:09:53 +00:00
//var ptg = blob[blob.l] & 0x1F;
2015-04-02 22:14:07 +00:00
var type = ( blob [ blob . l ] & 0x60 ) >> 5 ;
blob . l += 1 ;
2017-02-19 21:11:48 +00:00
var iftab = blob . read _shift ( opts && opts . biff <= 3 ? 1 : 2 ) ;
return [ FtabArgc [ iftab ] , Ftab [ iftab ] , type ] ;
2015-04-02 22:14:07 +00:00
}
2018-02-14 05:26:28 +00:00
/* [MS-XLS] 2.5.198.63 ; [MS-XLSB] 2.5.97.46 TODO */
2017-02-19 21:11:48 +00:00
function parse _PtgFuncVar ( blob , length , opts ) {
2018-02-28 09:58:43 +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 ) ;
2015-04-02 22:14:07 +00:00
return [ cparams , ( tab [ 0 ] === 0 ? Ftab : Cetab ) [ tab [ 1 ] ] ] ;
}
2018-01-23 09:09:53 +00:00
function parsetab ( blob ) {
2015-04-02 22:14:07 +00:00
return [ blob [ blob . l + 1 ] >> 7 , blob . read _shift ( 2 ) & 0x7FFF ] ;
}
2018-02-14 05:26:28 +00:00
/* [MS-XLS] 2.5.198.41 ; [MS-XLSB] 2.5.97.33 */
2017-02-19 21:11:48 +00:00
function parse _PtgAttrSum ( blob , length , opts ) {
blob . l += opts && opts . biff == 2 ? 3 : 4 ; return ;
}
2018-02-14 05:26:28 +00:00
/* [MS-XLS] 2.5.198.58 ; [MS-XLSB] 2.5.97.40 */
2017-02-19 21:11:48 +00:00
function parse _PtgExp ( blob , length , opts ) {
2015-04-02 22:14:07 +00:00
blob . l ++ ;
2017-02-19 21:11:48 +00:00
if ( opts && opts . biff == 12 ) return [ blob . read _shift ( 4 , 'i' ) , 0 ] ;
2015-04-02 22:14:07 +00:00
var row = blob . read _shift ( 2 ) ;
2017-02-19 21:11:48 +00:00
var col = blob . read _shift ( opts && opts . biff == 2 ? 1 : 2 ) ;
2015-04-02 22:14:07 +00:00
return [ row , col ] ;
}
2018-02-14 05:26:28 +00:00
/* [MS-XLS] 2.5.198.57 ; [MS-XLSB] 2.5.97.39 */
2018-01-23 09:09:53 +00:00
function parse _PtgErr ( blob ) { blob . l ++ ; return BErr [ blob . read _shift ( 1 ) ] ; }
2015-04-02 22:14:07 +00:00
2018-02-14 05:26:28 +00:00
/* [MS-XLS] 2.5.198.66 ; [MS-XLSB] 2.5.97.49 */
2018-01-23 09:09:53 +00:00
function parse _PtgInt ( blob ) { blob . l ++ ; return blob . read _shift ( 2 ) ; }
2015-04-02 22:14:07 +00:00
2018-02-14 05:26:28 +00:00
/* [MS-XLS] 2.5.198.42 ; [MS-XLSB] 2.5.97.34 */
2018-01-23 09:09:53 +00:00
function parse _PtgBool ( blob ) { blob . l ++ ; return blob . read _shift ( 1 ) !== 0 ; }
2015-04-02 22:14:07 +00:00
2018-02-14 05:26:28 +00:00
/* [MS-XLS] 2.5.198.79 ; [MS-XLSB] 2.5.97.63 */
2018-01-23 09:09:53 +00:00
function parse _PtgNum ( blob ) { blob . l ++ ; return parse _Xnum ( blob , 8 ) ; }
2015-04-02 22:14:07 +00:00
2018-02-14 05:26:28 +00:00
/* [MS-XLS] 2.5.198.89 ; [MS-XLSB] 2.5.97.74 */
2017-02-19 21:11:48 +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 ) {
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 ] ) {
2015-04-02 22:14:07 +00:00
case 0x04 : /* SerBool -- boolean */
val [ 1 ] = parsebool ( blob , 1 ) ? 'TRUE' : 'FALSE' ;
2018-02-14 05:26:28 +00:00
if ( biff != 12 ) blob . l += 7 ; break ;
2018-05-05 06:42:56 +00:00
case 0x25 : /* appears to be an alias */
2015-04-02 22:14:07 +00:00
case 0x10 : /* SerErr -- error */
val [ 1 ] = BErr [ blob [ blob . l ] ] ;
2018-02-14 05:26:28 +00:00
blob . l += ( ( biff == 12 ) ? 4 : 8 ) ; break ;
2015-04-02 22:14:07 +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 21:11:48 +00:00
val [ 1 ] = parse _XLUnicodeString2 ( blob , 0 , { biff : biff > 0 && biff < 8 ? 2 : biff } ) ; break ;
2018-05-05 06:42:56 +00:00
default : throw new Error ( "Bad SerAr: " + val [ 0 ] ) ; /* Unreachable */
2015-04-02 22:14:07 +00:00
}
return val ;
}
2018-02-14 05:26:28 +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 ) ;
2015-04-02 22:14:07 +00:00
var out = [ ] ;
2018-02-14 05:26:28 +00:00
for ( var i = 0 ; i != count ; ++ i ) out . push ( ( ( opts . biff == 12 ) ? parse _UncheckedRfX : parse _Ref8U ) ( blob , 8 ) ) ;
2015-04-02 22:14:07 +00:00
return out ;
}
2018-02-14 05:26:28 +00:00
/* [MS-XLS] 2.5.198.59 ; [MS-XLSB] 2.5.97.41 */
2017-02-19 21:11:48 +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-13 07:34:05 +00:00
// $FlowIgnore
2017-12-30 05:41:41 +00:00
for ( var i = 0 , o = [ ] ; i != rows && ( o [ i ] = [ ] ) ; ++ i )
2017-02-19 21:11:48 +00:00
for ( var j = 0 ; j != cols ; ++ j ) o [ i ] [ j ] = parse _SerAr ( blob , opts . biff ) ;
2015-04-02 22:14:07 +00:00
return o ;
}
2018-02-14 05:26:28 +00:00
/* [MS-XLS] 2.5.198.76 ; [MS-XLSB] 2.5.97.60 */
2017-02-19 21:11:48 +00:00
function parse _PtgName ( blob , length , opts ) {
2015-04-02 22:14:07 +00:00
var type = ( blob . read _shift ( 1 ) >>> 5 ) & 0x03 ;
2017-02-19 21:11:48 +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 ;
}
2015-04-02 22:14:07 +00:00
return [ type , 0 , nameindex ] ;
}
2018-02-14 05:26:28 +00:00
/* [MS-XLS] 2.5.198.77 ; [MS-XLSB] 2.5.97.61 */
2017-02-19 21:11:48 +00:00
function parse _PtgNameX ( blob , length , opts ) {
if ( opts . biff == 5 ) return parse _PtgNameX _BIFF5 ( blob , length , opts ) ;
2015-04-02 22:14:07 +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:09:53 +00:00
function parse _PtgNameX _BIFF5 ( blob ) {
2017-02-19 21:11:48 +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 ] ;
}
2015-04-02 22:14:07 +00:00
2018-02-14 05:26:28 +00:00
/* [MS-XLS] 2.5.198.70 ; [MS-XLSB] 2.5.97.54 */
2017-02-19 21:11:48 +00:00
function parse _PtgMemArea ( blob , length , opts ) {
2015-04-02 22:14:07 +00:00
var type = ( blob . read _shift ( 1 ) >>> 5 ) & 0x03 ;
2017-02-19 21:11:48 +00:00
blob . l += ( opts && opts . biff == 2 ? 3 : 4 ) ;
var cce = blob . read _shift ( opts && opts . biff == 2 ? 1 : 2 ) ;
2015-04-02 22:14:07 +00:00
return [ type , cce ] ;
}
2018-02-14 05:26:28 +00:00
/* [MS-XLS] 2.5.198.72 ; [MS-XLSB] 2.5.97.56 */
2017-02-19 21:11:48 +00:00
function parse _PtgMemFunc ( blob , length , opts ) {
2015-04-02 22:14:07 +00:00
var type = ( blob . read _shift ( 1 ) >>> 5 ) & 0x03 ;
2017-02-19 21:11:48 +00:00
var cce = blob . read _shift ( opts && opts . biff == 2 ? 1 : 2 ) ;
2015-04-02 22:14:07 +00:00
return [ type , cce ] ;
}
2018-02-14 05:26:28 +00:00
/* [MS-XLS] 2.5.198.86 ; [MS-XLSB] 2.5.97.69 */
2017-02-19 21:11:48 +00:00
function parse _PtgRefErr ( blob , length , opts ) {
2015-04-02 22:14:07 +00:00
var type = ( blob . read _shift ( 1 ) >>> 5 ) & 0x03 ;
blob . l += 4 ;
2018-02-21 06:20:15 +00:00
if ( opts . biff < 8 ) blob . l -- ;
2017-02-19 21:11:48 +00:00
if ( opts . biff == 12 ) blob . l += 2 ;
2015-04-02 22:14:07 +00:00
return [ type ] ;
}
2018-02-14 05:26:28 +00:00
/* [MS-XLS] 2.5.198.87 ; [MS-XLSB] 2.5.97.71 */
2017-03-11 00:01:58 +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 05:26:28 +00:00
case 5 : w = 15 ; break ;
2017-03-11 00:01:58 +00:00
case 12 : w = 6 ; break ;
}
blob . l += w ;
return [ type , ixti ] ;
}
2018-02-14 05:26:28 +00:00
/* [MS-XLS] 2.5.198.71 ; [MS-XLSB] 2.5.97.55 */
2015-04-02 22:14:07 +00:00
var parse _PtgMemErr = parsenoop ;
2018-02-14 05:26:28 +00:00
/* [MS-XLS] 2.5.198.73 ; [MS-XLSB] 2.5.97.57 */
2015-04-02 22:14:07 +00:00
var parse _PtgMemNoMem = parsenoop ;
2018-02-14 05:26:28 +00:00
/* [MS-XLS] 2.5.198.92 */
2015-04-02 22:14:07 +00:00
var parse _PtgTbl = parsenoop ;
2017-10-17 00:36:51 +00:00
function parse _PtgElfLoc ( blob , length , opts ) {
blob . l += 2 ;
return [ parse _RgceElfLoc ( blob , 4 , opts ) ] ;
}
2018-01-23 09:09:53 +00:00
function parse _PtgElfNoop ( blob ) {
2017-10-17 00:36:51 +00:00
blob . l += 6 ;
return [ ] ;
}
2018-02-14 05:26:28 +00:00
/* [MS-XLS] 2.5.198.46 */
2017-10-17 00:36:51 +00:00
var parse _PtgElfCol = parse _PtgElfLoc ;
2018-02-14 05:26:28 +00:00
/* [MS-XLS] 2.5.198.47 */
2017-10-17 00:36:51 +00:00
var parse _PtgElfColS = parse _PtgElfNoop ;
2018-02-14 05:26:28 +00:00
/* [MS-XLS] 2.5.198.48 */
2017-10-17 00:36:51 +00:00
var parse _PtgElfColSV = parse _PtgElfNoop ;
2018-02-14 05:26:28 +00:00
/* [MS-XLS] 2.5.198.49 */
2017-10-17 00:36:51 +00:00
var parse _PtgElfColV = parse _PtgElfLoc ;
2018-02-14 05:26:28 +00:00
/* [MS-XLS] 2.5.198.50 */
2018-01-23 09:09:53 +00:00
function parse _PtgElfLel ( blob ) {
2017-10-17 00:36:51 +00:00
blob . l += 2 ;
return [ parseuint16 ( blob ) , blob . read _shift ( 2 ) & 0x01 ] ;
}
2018-02-14 05:26:28 +00:00
/* [MS-XLS] 2.5.198.51 */
2017-10-17 00:36:51 +00:00
var parse _PtgElfRadical = parse _PtgElfLoc ;
2018-02-14 05:26:28 +00:00
/* [MS-XLS] 2.5.198.52 */
2017-10-17 00:36:51 +00:00
var parse _PtgElfRadicalLel = parse _PtgElfLel ;
2018-02-14 05:26:28 +00:00
/* [MS-XLS] 2.5.198.53 */
2017-10-17 00:36:51 +00:00
var parse _PtgElfRadicalS = parse _PtgElfNoop ;
2018-02-14 05:26:28 +00:00
/* [MS-XLS] 2.5.198.54 */
2017-10-17 00:36:51 +00:00
var parse _PtgElfRw = parse _PtgElfLoc ;
2018-02-14 05:26:28 +00:00
/* [MS-XLS] 2.5.198.55 */
2017-10-17 00:36:51 +00:00
var parse _PtgElfRwV = parse _PtgElfLoc ;
2018-02-28 09:58:43 +00:00
/* [MS-XLSB] 2.5.97.52 TODO */
var PtgListRT = [
"Data" ,
"All" ,
"Headers" ,
"??" ,
"?Data2" ,
"??" ,
"?DataHeaders" ,
"??" ,
"Totals" ,
"??" ,
"??" ,
"??" ,
"?DataTotals" ,
"??" ,
"??" ,
"??" ,
"?Current"
] ;
2018-01-23 09:09:53 +00:00
function parse _PtgList ( blob ) {
2017-10-17 00:36:51 +00:00
blob . l += 2 ;
var ixti = blob . read _shift ( 2 ) ;
2018-02-28 09:58:43 +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:36:51 +00:00
}
2018-02-14 05:26:28 +00:00
/* [MS-XLS] 2.5.198.91 ; [MS-XLSB] 2.5.97.76 */
2018-01-23 09:09:53 +00:00
function parse _PtgSxName ( blob ) {
2017-10-17 00:36:51 +00:00
blob . l += 2 ;
return [ blob . read _shift ( 4 ) ] ;
}
2018-02-28 09:58:43 +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 ) {
var type = ( blob . read _shift ( 1 ) >>> 5 ) & 0x03 ;
var cce = blob . read _shift ( 2 ) ;
return [ type , cce ] ;
}
function parse _PtgMemNoMemN ( blob ) {
var type = ( blob . read _shift ( 1 ) >>> 5 ) & 0x03 ;
var cce = blob . read _shift ( 2 ) ;
return [ type , cce ] ;
}
function parse _PtgAttrNoop ( blob ) {
blob . l += 4 ;
return [ 0 , 0 ] ;
}
2018-02-14 05:26:28 +00:00
/* [MS-XLS] 2.5.198.25 ; [MS-XLSB] 2.5.97.16 */
2015-04-02 22:14:07 +00:00
var PtgTypes = {
2017-02-11 01:58:22 +00:00
0x01 : { n : 'PtgExp' , f : parse _PtgExp } ,
0x02 : { n : 'PtgTbl' , f : parse _PtgTbl } ,
2018-01-23 09:09:53 +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-11 01:58:22 +00:00
0x17 : { n : 'PtgStr' , f : parse _PtgStr } ,
2018-02-28 09:58:43 +00:00
0x1A : { n : 'PtgSheet' , f : parse _PtgSheet } ,
0x1B : { n : 'PtgEndSheet' , f : parse _PtgEndSheet } ,
2017-02-11 01:58:22 +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 09:58:43 +00:00
0x2E : { n : 'PtgMemAreaN' , f : parse _PtgMemAreaN } ,
0x2F : { n : 'PtgMemNoMemN' , f : parse _PtgMemNoMemN } ,
2017-02-11 01:58:22 +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 : { }
2015-04-02 22:14:07 +00:00
} ;
/* These are duplicated in the PtgTypes table */
var PtgDupes = {
2017-02-11 01:58:22 +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 09:58:43 +00:00
0x4E : 0x2E , 0x6E : 0x2E ,
0x4F : 0x2F , 0x6F : 0x2F ,
0x58 : 0x22 , 0x78 : 0x22 ,
2017-02-11 01:58:22 +00:00
0x59 : 0x39 , 0x79 : 0x39 ,
0x5A : 0x3A , 0x7A : 0x3A ,
0x5B : 0x3B , 0x7B : 0x3B ,
0x5C : 0x3C , 0x7C : 0x3C ,
0x5D : 0x3D , 0x7D : 0x3D
2015-04-02 22:14:07 +00:00
} ;
( function ( ) { for ( var y in PtgDupes ) PtgTypes [ y ] = PtgTypes [ PtgDupes [ y ] ] ; } ) ( ) ;
2017-02-19 21:11:48 +00:00
var Ptg18 = {
2017-10-17 00:36:51 +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 21:11:48 +00:00
} ;
2015-04-02 22:14:07 +00:00
var Ptg19 = {
2018-02-28 09:58:43 +00:00
0x00 : { n : 'PtgAttrNoop' , f : parse _PtgAttrNoop } ,
2017-02-11 01:58:22 +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 } ,
0x40 : { n : 'PtgAttrSpace' , f : parse _PtgAttrSpace } ,
0x41 : { n : 'PtgAttrSpaceSemi' , f : parse _PtgAttrSpaceSemi } ,
2017-02-19 21:11:48 +00:00
0x80 : { n : 'PtgAttrIfError' , f : parse _PtgAttrIfError } ,
2017-02-11 01:58:22 +00:00
0xFF : { }
2015-04-02 22:14:07 +00:00
} ;
2017-10-17 00:36:51 +00:00
Ptg19 [ 0x21 ] = Ptg19 [ 0x20 ] ;
2015-04-02 22:14:07 +00:00
2018-02-14 05:26:28 +00:00
/* [MS-XLS] 2.5.198.103 ; [MS-XLSB] 2.5.97.87 */
2015-04-02 22:14:07 +00:00
function parse _RgbExtra ( blob , length , rgce , opts ) {
2017-03-05 01:44:52 +00:00
if ( opts . biff < 8 ) return parsenoop ( blob , length ) ;
2015-04-02 22:14:07 +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 21:11:48 +00:00
rgce [ i ] [ 1 ] = parse _PtgExtraArray ( blob , 0 , opts ) ;
2015-04-02 22:14:07 +00:00
o . push ( rgce [ i ] [ 1 ] ) ;
break ;
case 'PtgMemArea' : /* PtgMemArea -> PtgExtraMem */
2018-02-14 05:26:28 +00:00
rgce [ i ] [ 2 ] = parse _PtgExtraMem ( blob , rgce [ i ] [ 1 ] , opts ) ;
2015-04-02 22:14:07 +00:00
o . push ( rgce [ i ] [ 2 ] ) ;
break ;
2017-02-19 21:11:48 +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:36:51 +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 ] ;
2015-04-02 22:14:07 +00:00
default : break ;
}
}
length = target - blob . l ;
2017-02-19 21:11:48 +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);
2015-04-02 22:14:07 +00:00
if ( length !== 0 ) o . push ( parsenoop ( blob , length ) ) ;
return o ;
}
2018-02-14 05:26:28 +00:00
/* [MS-XLS] 2.5.198.104 ; [MS-XLSB] 2.5.97.88 */
2017-02-19 21:11:48 +00:00
function parse _Rgce ( blob , length , opts ) {
2015-04-02 22:14:07 +00:00
var target = blob . l + length ;
var R , id , ptgs = [ ] ;
while ( target != blob . l ) {
length = target - blob . l ;
id = blob [ blob . l ] ;
R = PtgTypes [ id ] ;
2018-02-28 09:58:43 +00:00
if ( id === 0x18 || id === 0x19 ) R = ( id === 0x18 ? Ptg18 : Ptg19 ) [ blob [ blob . l + 1 ] ] ;
2017-03-13 07:34:05 +00:00
if ( ! R || ! R . f ) { /*ptgs.push*/ ( parsenoop ( blob , length ) ) ; }
2017-02-19 21:11:48 +00:00
else { ptgs . push ( [ R . n , R . f ( blob , length , opts ) ] ) ; }
2015-04-02 22:14:07 +00:00
}
return ptgs ;
}
2017-02-19 21:11:48 +00:00
function stringify _array ( f ) {
var o = [ ] ;
for ( var i = 0 ; i < f . length ; ++ i ) {
var x = f [ i ] , r = [ ] ;
for ( var j = 0 ; j < x . length ; ++ j ) {
var y = x [ j ] ;
if ( y ) switch ( y [ 0 ] ) {
// TODO: handle embedded quotes
2017-03-13 07:34:05 +00:00
case 0x02 :
r . push ( '"' + y [ 1 ] . replace ( /"/g , '""' ) + '"' ) ; break ;
2017-02-19 21:11:48 +00:00
default : r . push ( y [ 1 ] ) ;
} else r . push ( "" ) ;
}
o . push ( r . join ( "," ) ) ;
}
return o . join ( ";" ) ;
}
2018-02-14 05:26:28 +00:00
/* [MS-XLS] 2.2.2 ; [MS-XLSB] 2.2.2 TODO */
2017-02-19 21:11:48 +00:00
var PtgBinOp = {
PtgAdd : "+" ,
PtgConcat : "&" ,
PtgDiv : "/" ,
PtgEq : "=" ,
PtgGe : ">=" ,
PtgGt : ">" ,
PtgLe : "<=" ,
PtgLt : "<" ,
PtgMul : "*" ,
PtgNe : "<>" ,
PtgPower : "^" ,
PtgSub : "-"
} ;
2018-01-23 09:09:53 +00:00
function formula _quote _sheet _name ( sname , opts ) {
if ( ! sname && ! ( opts && opts . biff <= 5 && opts . biff >= 2 ) ) throw new Error ( "empty sheet name" ) ;
2017-08-05 06:58:40 +00:00
if ( sname . indexOf ( " " ) > - 1 ) return "'" + sname + "'" ;
return sname ;
}
function get _ixti _raw ( supbooks , ixti , opts ) {
2017-11-15 18:50:04 +00:00
if ( ! supbooks ) return "SH33TJSERR0" ;
if ( ! supbooks . XTI ) return "SH33TJSERR6" ;
var XTI = supbooks . XTI [ ixti ] ;
if ( opts . biff > 8 && ! supbooks . XTI [ ixti ] ) return supbooks . SheetNames [ 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:41:41 +00:00
return "SH33TJSSAME" + supbooks [ XTI [ 0 ] ] [ 0 ] ;
2017-11-15 18:50:04 +00:00
case 0x0163 : /* 'BrtSupBookSrc' */
/* falls through */
2017-12-30 05:41:41 +00:00
default : return "SH33TJSSRC" + supbooks [ XTI [ 0 ] ] [ 0 ] ;
2017-11-15 18:50:04 +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 ] ] ;
case 0x3A01 : return "SH33TJSERR8" ;
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-28 23:54:51 +00:00
}
2017-08-05 06:58:40 +00:00
function get _ixti ( supbooks , ixti , opts ) {
2018-01-23 09:09:53 +00:00
return formula _quote _sheet _name ( get _ixti _raw ( supbooks , ixti , opts ) , opts ) ;
2017-08-05 06:58:40 +00:00
}
2017-03-13 07:34:05 +00:00
function stringify _formula ( formula /*Array<any>*/ , range , cell , supbooks , opts ) {
2018-02-21 06:20:15 +00:00
var biff = ( opts && opts . biff ) || 8 ;
2017-02-19 21:11:48 +00:00
var _range = /*range != null ? range :*/ { s : { c : 0 , r : 0 } , e : { c : 0 , r : 0 } } ;
2018-01-23 09:09:53 +00:00
var stack = [ ] , e1 , e2 , c , ixti = 0 , nameidx = 0 , r , sname = "" ;
2015-04-02 22:14:07 +00:00
if ( ! formula [ 0 ] || ! formula [ 0 ] [ 0 ] ) return "" ;
2017-02-19 21:11:48 +00:00
var last _sp = - 1 , sp = "" ;
2015-04-02 22:14:07 +00:00
for ( var ff = 0 , fflen = formula [ 0 ] . length ; ff < fflen ; ++ ff ) {
var f = formula [ 0 ] [ ff ] ;
switch ( f [ 0 ] ) {
2018-02-14 05:26:28 +00:00
case 'PtgUminus' : /* [MS-XLS] 2.5.198.93 */
2017-05-09 18:11:15 +00:00
stack . push ( "-" + stack . pop ( ) ) ; break ;
2018-02-14 05:26:28 +00:00
case 'PtgUplus' : /* [MS-XLS] 2.5.198.95 */
2017-05-09 18:11:15 +00:00
stack . push ( "+" + stack . pop ( ) ) ; break ;
2018-02-14 05:26:28 +00:00
case 'PtgPercent' : /* [MS-XLS] 2.5.198.81 */
2017-05-09 18:11:15 +00:00
stack . push ( stack . pop ( ) + "%" ) ; break ;
2015-04-02 22:14:07 +00:00
2018-02-14 05:26:28 +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 */
2015-04-02 22:14:07 +00:00
e1 = stack . pop ( ) ; e2 = stack . pop ( ) ;
2017-02-19 21:11:48 +00:00
if ( last _sp >= 0 ) {
switch ( formula [ 0 ] [ last _sp ] [ 1 ] [ 0 ] ) {
2017-05-09 18:11:15 +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 21:11:48 +00:00
default :
sp = "" ;
2017-03-13 07:34:05 +00:00
// $FlowIgnore
2017-03-11 00:01:58 +00:00
if ( opts . WTF ) throw new Error ( "Unexpected PtgAttrSpaceType " + formula [ 0 ] [ last _sp ] [ 1 ] [ 0 ] ) ;
2017-02-19 21:11:48 +00:00
}
e2 = e2 + sp ;
last _sp = - 1 ;
}
stack . push ( e2 + PtgBinOp [ f [ 0 ] ] + e1 ) ;
2015-04-02 22:14:07 +00:00
break ;
2018-02-14 05:26:28 +00:00
case 'PtgIsect' : /* [MS-XLS] 2.5.198.67 */
2015-04-02 22:14:07 +00:00
e1 = stack . pop ( ) ; e2 = stack . pop ( ) ;
stack . push ( e2 + " " + e1 ) ;
break ;
2018-02-14 05:26:28 +00:00
case 'PtgUnion' : /* [MS-XLS] 2.5.198.94 */
2015-04-02 22:14:07 +00:00
e1 = stack . pop ( ) ; e2 = stack . pop ( ) ;
stack . push ( e2 + "," + e1 ) ;
break ;
2018-02-14 05:26:28 +00:00
case 'PtgRange' : /* [MS-XLS] 2.5.198.83 */
2017-02-19 21:11:48 +00:00
e1 = stack . pop ( ) ; e2 = stack . pop ( ) ;
stack . push ( e2 + ":" + e1 ) ;
break ;
2015-04-02 22:14:07 +00:00
2018-02-14 05:26:28 +00:00
case 'PtgAttrChoose' : /* [MS-XLS] 2.5.198.34 */
2017-05-09 18:11:15 +00:00
break ;
2018-02-14 05:26:28 +00:00
case 'PtgAttrGoto' : /* [MS-XLS] 2.5.198.35 */
2017-05-09 18:11:15 +00:00
break ;
2018-02-14 05:26:28 +00:00
case 'PtgAttrIf' : /* [MS-XLS] 2.5.198.36 */
2017-05-09 18:11:15 +00:00
break ;
case 'PtgAttrIfError' : /* [MS-XLSB] 2.5.97.28 */
break ;
2015-04-02 22:14:07 +00:00
2018-02-14 05:26:28 +00:00
case 'PtgRef' : /* [MS-XLS] 2.5.198.84 */
2018-01-23 09:09:53 +00:00
c = shift _cell _xls ( ( f [ 1 ] [ 1 ] ) , _range , opts ) ;
2018-02-21 06:20:15 +00:00
stack . push ( encode _cell _xls ( c , biff ) ) ;
2015-04-02 22:14:07 +00:00
break ;
2018-02-14 05:26:28 +00:00
case 'PtgRefN' : /* [MS-XLS] 2.5.198.88 */
2018-01-23 09:09:53 +00:00
c = cell ? shift _cell _xls ( ( f [ 1 ] [ 1 ] ) , cell , opts ) : ( f [ 1 ] [ 1 ] ) ;
2018-02-21 06:20:15 +00:00
stack . push ( encode _cell _xls ( c , biff ) ) ;
2015-04-02 22:14:07 +00:00
break ;
2018-02-14 05:26:28 +00:00
case 'PtgRef3d' : /* [MS-XLS] 2.5.198.85 */
2018-01-23 09:09:53 +00:00
ixti = f [ 1 ] [ 1 ] ; c = shift _cell _xls ( ( f [ 1 ] [ 2 ] ) , _range , opts ) ;
2017-07-28 23:54:51 +00:00
sname = get _ixti ( supbooks , ixti , opts ) ;
2018-01-23 09:09:53 +00:00
var w = sname ; /* IE9 fails on defined names */ // eslint-disable-line no-unused-vars
2018-02-21 06:20:15 +00:00
stack . push ( sname + "!" + encode _cell _xls ( c , biff ) ) ;
2015-04-02 22:14:07 +00:00
break ;
2018-02-14 05:26:28 +00:00
case 'PtgFunc' : /* [MS-XLS] 2.5.198.62 */
case 'PtgFuncVar' : /* [MS-XLS] 2.5.198.63 */
2017-02-19 21:11:48 +00:00
/* f[1] = [argc, func, type] */
2017-09-30 06:19:01 +00:00
var argc = ( f [ 1 ] [ 0 ] ) , func = ( f [ 1 ] [ 1 ] ) ;
2015-04-02 22:14:07 +00:00
if ( ! argc ) argc = 0 ;
2018-02-21 06:20:15 +00:00
argc &= 0x7F ;
2017-02-19 21:11:48 +00:00
var args = argc == 0 ? [ ] : stack . slice ( - argc ) ;
2015-04-02 22:14:07 +00:00
stack . length -= argc ;
if ( func === 'User' ) func = args . shift ( ) ;
stack . push ( func + "(" + args . join ( "," ) + ")" ) ;
break ;
2018-02-14 05:26:28 +00:00
case 'PtgBool' : /* [MS-XLS] 2.5.198.42 */
2017-05-09 18:11:15 +00:00
stack . push ( f [ 1 ] ? "TRUE" : "FALSE" ) ; break ;
2018-02-14 05:26:28 +00:00
case 'PtgInt' : /* [MS-XLS] 2.5.198.66 */
2017-05-09 18:11:15 +00:00
stack . push ( f [ 1 ] ) ; break ;
2018-02-14 05:26:28 +00:00
case 'PtgNum' : /* [MS-XLS] 2.5.198.79 TODO: precision? */
2017-05-09 18:11:15 +00:00
stack . push ( String ( f [ 1 ] ) ) ; break ;
2018-02-14 05:26:28 +00:00
case 'PtgStr' : /* [MS-XLS] 2.5.198.89 */
2017-05-09 18:11:15 +00:00
// $FlowIgnore
stack . push ( '"' + f [ 1 ] + '"' ) ; break ;
2018-02-14 05:26:28 +00:00
case 'PtgErr' : /* [MS-XLS] 2.5.198.57 */
2017-05-09 18:11:15 +00:00
stack . push ( f [ 1 ] ) ; break ;
2018-02-14 05:26:28 +00:00
case 'PtgAreaN' : /* [MS-XLS] 2.5.198.31 TODO */
2018-01-23 09:09:53 +00:00
r = shift _range _xls ( f [ 1 ] [ 1 ] , cell ? { s : cell } : _range , opts ) ;
2017-03-25 22:38:26 +00:00
stack . push ( encode _range _xls ( ( r ) , opts ) ) ;
2017-03-11 00:01:58 +00:00
break ;
2018-02-14 05:26:28 +00:00
case 'PtgArea' : /* [MS-XLS] 2.5.198.27 TODO: fixed points */
2018-01-23 09:09:53 +00:00
r = shift _range _xls ( f [ 1 ] [ 1 ] , _range , opts ) ;
2017-03-25 22:38:26 +00:00
stack . push ( encode _range _xls ( ( r ) , opts ) ) ;
2015-04-02 22:14:07 +00:00
break ;
2018-02-14 05:26:28 +00:00
case 'PtgArea3d' : /* [MS-XLS] 2.5.198.28 TODO */
2018-01-23 09:09:53 +00:00
ixti = f [ 1 ] [ 1 ] ; r = f [ 1 ] [ 2 ] ;
2017-11-15 18:50:04 +00:00
sname = get _ixti ( supbooks , ixti , opts ) ;
2017-08-19 23:13:21 +00:00
stack . push ( sname + "!" + encode _range _xls ( ( r ) , opts ) ) ;
2015-04-02 22:14:07 +00:00
break ;
2018-02-14 05:26:28 +00:00
case 'PtgAttrSum' : /* [MS-XLS] 2.5.198.41 */
2015-04-02 22:14:07 +00:00
stack . push ( "SUM(" + stack . pop ( ) + ")" ) ;
break ;
2018-02-21 06:20:15 +00:00
case 'PtgAttrBaxcel' : /* [MS-XLS] 2.5.198.33 */
2018-02-14 05:26:28 +00:00
case 'PtgAttrSemi' : /* [MS-XLS] 2.5.198.37 */
2017-05-09 18:11:15 +00:00
break ;
2015-04-02 22:14:07 +00:00
2018-02-14 05:26:28 +00:00
case 'PtgName' : /* [MS-XLS] 2.5.198.76 ; [MS-XLSB] 2.5.97.60 TODO: revisions */
2015-04-02 22:14:07 +00:00
/* f[1] = type, 0, nameindex */
2017-05-17 04:27:55 +00:00
nameidx = ( f [ 1 ] [ 2 ] ) ;
2017-04-16 07:35:56 +00:00
var lbl = ( supbooks . names || [ ] ) [ nameidx - 1 ] || ( supbooks [ 0 ] || [ ] ) [ nameidx ] ;
2017-12-30 05:41:41 +00:00
var name = lbl ? lbl . Name : "SH33TJSNAME" + String ( nameidx ) ;
2015-04-02 22:14:07 +00:00
if ( name in XLSXFutureFunctions ) name = XLSXFutureFunctions [ name ] ;
stack . push ( name ) ;
break ;
2018-02-14 05:26:28 +00:00
case 'PtgNameX' : /* [MS-XLS] 2.5.198.77 ; [MS-XLSB] 2.5.97.61 TODO: revisions */
2015-04-02 22:14:07 +00:00
/* f[1] = type, ixti, nameindex */
2017-05-17 04:27:55 +00:00
var bookidx = ( f [ 1 ] [ 1 ] ) ; nameidx = ( f [ 1 ] [ 2 ] ) ; var externbook ;
2015-04-02 22:14:07 +00:00
/* TODO: Properly handle missing values */
2017-04-16 07:35:56 +00:00
if ( opts . biff <= 5 ) {
2017-02-19 21:11:48 +00:00
if ( bookidx < 0 ) bookidx = - bookidx ;
if ( supbooks [ bookidx ] ) externbook = supbooks [ bookidx ] [ nameidx ] ;
} else {
2017-04-16 07:35:56 +00:00
var o = "" ;
2017-05-09 18:11:15 +00:00
if ( ( ( supbooks [ bookidx ] || [ ] ) [ 0 ] || [ ] ) [ 0 ] == 0x3A01 ) { /* empty */ }
2017-04-16 07:35:56 +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 ;
2017-07-28 23:54:51 +00:00
else o += "SH33TJSERRX" ;
2017-04-16 07:35:56 +00:00
stack . push ( o ) ;
break ;
2017-02-19 21:11:48 +00:00
}
2017-07-28 23:54:51 +00:00
if ( ! externbook ) externbook = { Name : "SH33TJSERRY" } ;
2017-04-16 07:35:56 +00:00
stack . push ( externbook . Name ) ;
2015-04-02 22:14:07 +00:00
break ;
2018-02-14 05:26:28 +00:00
case 'PtgParen' : /* [MS-XLS] 2.5.198.80 */
2017-02-19 21:11:48 +00:00
var lp = '(' , rp = ')' ;
if ( last _sp >= 0 ) {
sp = "" ;
switch ( formula [ 0 ] [ last _sp ] [ 1 ] [ 0 ] ) {
2017-03-13 07:34:05 +00:00
// $FlowIgnore
2017-02-19 21:11:48 +00:00
case 2 : lp = fill ( " " , formula [ 0 ] [ last _sp ] [ 1 ] [ 1 ] ) + lp ; break ;
2017-03-13 07:34:05 +00:00
// $FlowIgnore
2017-02-19 21:11:48 +00:00
case 3 : lp = fill ( "\r" , formula [ 0 ] [ last _sp ] [ 1 ] [ 1 ] ) + lp ; break ;
2017-03-13 07:34:05 +00:00
// $FlowIgnore
2017-03-11 00:01:58 +00:00
case 4 : rp = fill ( " " , formula [ 0 ] [ last _sp ] [ 1 ] [ 1 ] ) + rp ; break ;
2017-03-13 07:34:05 +00:00
// $FlowIgnore
2017-03-11 00:01:58 +00:00
case 5 : rp = fill ( "\r" , formula [ 0 ] [ last _sp ] [ 1 ] [ 1 ] ) + rp ; break ;
2017-02-19 21:11:48 +00:00
default :
2017-03-13 07:34:05 +00:00
// $FlowIgnore
2017-03-11 00:01:58 +00:00
if ( opts . WTF ) throw new Error ( "Unexpected PtgAttrSpaceType " + formula [ 0 ] [ last _sp ] [ 1 ] [ 0 ] ) ;
2017-02-19 21:11:48 +00:00
}
last _sp = - 1 ;
}
stack . push ( lp + stack . pop ( ) + rp ) ; break ;
2015-04-02 22:14:07 +00:00
2018-02-14 05:26:28 +00:00
case 'PtgRefErr' : /* [MS-XLS] 2.5.198.86 */
2017-05-09 18:11:15 +00:00
stack . push ( '#REF!' ) ; break ;
2015-04-02 22:14:07 +00:00
2018-02-14 05:26:28 +00:00
case 'PtgRefErr3d' : /* [MS-XLS] 2.5.198.87 */
2017-05-09 18:11:15 +00:00
stack . push ( '#REF!' ) ; break ;
2017-03-11 00:01:58 +00:00
2018-02-14 05:26:28 +00:00
case 'PtgExp' : /* [MS-XLS] 2.5.198.58 TODO */
2017-11-20 02:13:37 +00:00
c = { c : ( f [ 1 ] [ 1 ] ) , r : ( f [ 1 ] [ 0 ] ) } ;
2017-03-13 07:34:05 +00:00
var q = ( { c : cell . c , r : cell . r } ) ;
2015-04-02 22:14:07 +00:00
if ( supbooks . sharedf [ encode _cell ( c ) ] ) {
var parsedf = ( supbooks . sharedf [ encode _cell ( c ) ] ) ;
stack . push ( stringify _formula ( parsedf , _range , q , supbooks , opts ) ) ;
}
else {
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 21:11:48 +00:00
fnd = true ;
break ;
2015-04-02 22:14:07 +00:00
}
if ( ! fnd ) stack . push ( f [ 1 ] ) ;
}
break ;
2018-02-14 05:26:28 +00:00
case 'PtgArray' : /* [MS-XLS] 2.5.198.32 TODO */
2017-02-19 21:11:48 +00:00
stack . push ( "{" + stringify _array ( f [ 1 ] ) + "}" ) ;
2015-04-02 22:14:07 +00:00
break ;
2014-06-02 05:16:51 +00:00
2018-02-14 05:26:28 +00:00
case 'PtgMemArea' : /* [MS-XLS] 2.5.198.70 TODO: confirm this is a non-display */
2015-04-02 22:14:07 +00:00
//stack.push("(" + f[2].map(encode_range).join(",") + ")");
break ;
2014-05-29 22:32:13 +00:00
2018-02-14 05:26:28 +00:00
case 'PtgAttrSpace' : /* [MS-XLS] 2.5.198.38 */
case 'PtgAttrSpaceSemi' : /* [MS-XLS] 2.5.198.39 */
2017-02-19 21:11:48 +00:00
last _sp = ff ;
break ;
2014-03-29 02:12:07 +00:00
2018-02-14 05:26:28 +00:00
case 'PtgTbl' : /* [MS-XLS] 2.5.198.92 TODO */
2017-05-09 18:11:15 +00:00
break ;
2014-03-29 02:12:07 +00:00
2018-02-14 05:26:28 +00:00
case 'PtgMemErr' : /* [MS-XLS] 2.5.198.71 */
2017-05-09 18:11:15 +00:00
break ;
2014-03-29 02:12:07 +00:00
2018-02-14 05:26:28 +00:00
case 'PtgMissArg' : /* [MS-XLS] 2.5.198.74 */
2015-04-02 22:14:07 +00:00
stack . push ( "" ) ;
break ;
2018-02-14 05:26:28 +00:00
case 'PtgAreaErr' : /* [MS-XLS] 2.5.198.29 */
2017-05-09 18:11:15 +00:00
stack . push ( "#REF!" ) ; break ;
2015-04-02 22:14:07 +00:00
2018-02-14 05:26:28 +00:00
case 'PtgAreaErr3d' : /* [MS-XLS] 2.5.198.30 */
2017-05-09 18:11:15 +00:00
stack . push ( "#REF!" ) ; break ;
2017-04-16 07:35:56 +00:00
2018-02-28 09:58:43 +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 05:26:28 +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:11:15 +00:00
break ;
2017-10-17 00:36:51 +00:00
2018-02-14 05:26:28 +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:36:51 +00:00
throw new Error ( "Unsupported ELFs" ) ;
2018-02-14 05:26:28 +00:00
case 'PtgSxName' : /* [MS-XLS] 2.5.198.91 TODO -- find a test case */
2017-10-17 00:36:51 +00:00
throw new Error ( 'Unrecognized Formula Token: ' + String ( f ) ) ;
2017-03-13 07:34:05 +00:00
default : throw new Error ( 'Unrecognized Formula Token: ' + String ( f ) ) ;
2014-03-29 02:12:07 +00:00
}
2017-02-19 21:11:48 +00:00
var PtgNonDisp = [ 'PtgAttrSpace' , 'PtgAttrSpaceSemi' , 'PtgAttrGoto' ] ;
2018-02-28 09:58:43 +00:00
if ( opts . biff != 3 ) if ( last _sp >= 0 && PtgNonDisp . indexOf ( formula [ 0 ] [ ff ] [ 0 ] ) == - 1 ) {
2017-02-19 21:11:48 +00:00
f = formula [ 0 ] [ last _sp ] ;
2017-03-11 00:01:58 +00:00
var _left = true ;
2017-02-19 21:11:48 +00:00
switch ( f [ 1 ] [ 0 ] ) {
2017-03-11 00:01:58 +00:00
/* note: some bad XLSB files omit the PtgParen */
case 4 : _left = false ;
/* falls through */
2017-05-09 18:11:15 +00:00
case 0 :
// $FlowIgnore
sp = fill ( " " , f [ 1 ] [ 1 ] ) ; break ;
2017-03-11 00:01:58 +00:00
case 5 : _left = false ;
/* falls through */
2017-05-09 18:11:15 +00:00
case 1 :
// $FlowIgnore
sp = fill ( "\r" , f [ 1 ] [ 1 ] ) ; break ;
2017-02-19 21:11:48 +00:00
default :
sp = "" ;
2017-03-13 07:34:05 +00:00
// $FlowIgnore
2017-03-11 00:01:58 +00:00
if ( opts . WTF ) throw new Error ( "Unexpected PtgAttrSpaceType " + f [ 1 ] [ 0 ] ) ;
2017-02-19 21:11:48 +00:00
}
2017-03-11 00:01:58 +00:00
stack . push ( ( _left ? sp : "" ) + stack . pop ( ) + ( _left ? "" : sp ) ) ;
2017-02-19 21:11:48 +00:00
last _sp = - 1 ;
}
2015-04-02 22:14:07 +00:00
}
2017-02-19 21:11:48 +00:00
if ( stack . length > 1 && opts . WTF ) throw new Error ( "bad formula stack" ) ;
2015-04-02 22:14:07 +00:00
return stack [ 0 ] ;
2014-03-29 02:12:07 +00:00
}
2014-01-22 05:02:45 +00:00
2017-10-17 00:36:51 +00:00
/* [MS-XLS] 2.5.198.1 TODO */
2018-01-23 09:09:53 +00:00
function parse _ArrayParsedFormula ( blob , length , opts ) {
2017-10-17 00:36:51 +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:09:53 +00:00
blob . l = target ;
2017-10-17 00:36:51 +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:09:53 +00:00
blob . l = target ;
2017-10-17 00:36:51 +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 ) {
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 [ ] ;
}
/* [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:09:53 +00:00
/*var chn = */ blob . read _shift ( 4 ) ;
2017-10-17 00:36:51 +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 ] } ;
}
2017-02-19 21:11:48 +00:00
/* XLSB Parsed Formula records have the same shape */
function parse _XLSBParsedFormula ( data , length , opts ) {
2014-02-13 06:26:39 +00:00
var cce = data . read _shift ( 4 ) ;
2017-02-19 21:11:48 +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 ] ;
2014-06-29 18:35:10 +00:00
}
2017-02-19 21:11:48 +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 ;
/* [MS-XLSB] 2.5.97.12 NameParsedFormula */
var parse _XLSBNameParsedFormula = parse _XLSBParsedFormula ;
/* [MS-XLSB] 2.5.97.98 SharedParsedFormula */
var parse _XLSBSharedParsedFormula = parse _XLSBParsedFormula ;
2015-04-02 22:14:07 +00:00
/* [MS-XLS] 2.5.198.4 */
var Cetab = {
2017-02-11 01:58:22 +00:00
0x0000 : 'BEEP' ,
0x0001 : 'OPEN' ,
0x0002 : 'OPEN.LINKS' ,
0x0003 : 'CLOSE.ALL' ,
0x0004 : 'SAVE' ,
0x0005 : 'SAVE.AS' ,
0x0006 : 'FILE.DELETE' ,
0x0007 : 'PAGE.SETUP' ,
0x0008 : 'PRINT' ,
0x0009 : 'PRINTER.SETUP' ,
0x000A : 'QUIT' ,
0x000B : 'NEW.WINDOW' ,
0x000C : 'ARRANGE.ALL' ,
0x000D : 'WINDOW.SIZE' ,
0x000E : 'WINDOW.MOVE' ,
0x000F : 'FULL' ,
0x0010 : 'CLOSE' ,
0x0011 : 'RUN' ,
0x0016 : 'SET.PRINT.AREA' ,
0x0017 : 'SET.PRINT.TITLES' ,
0x0018 : 'SET.PAGE.BREAK' ,
0x0019 : 'REMOVE.PAGE.BREAK' ,
0x001A : 'FONT' ,
0x001B : 'DISPLAY' ,
0x001C : 'PROTECT.DOCUMENT' ,
0x001D : 'PRECISION' ,
0x001E : 'A1.R1C1' ,
0x001F : 'CALCULATE.NOW' ,
0x0020 : 'CALCULATION' ,
0x0022 : 'DATA.FIND' ,
0x0023 : 'EXTRACT' ,
0x0024 : 'DATA.DELETE' ,
0x0025 : 'SET.DATABASE' ,
0x0026 : 'SET.CRITERIA' ,
0x0027 : 'SORT' ,
0x0028 : 'DATA.SERIES' ,
0x0029 : 'TABLE' ,
0x002A : 'FORMAT.NUMBER' ,
0x002B : 'ALIGNMENT' ,
0x002C : 'STYLE' ,
0x002D : 'BORDER' ,
0x002E : 'CELL.PROTECTION' ,
0x002F : 'COLUMN.WIDTH' ,
0x0030 : 'UNDO' ,
0x0031 : 'CUT' ,
0x0032 : 'COPY' ,
0x0033 : 'PASTE' ,
0x0034 : 'CLEAR' ,
0x0035 : 'PASTE.SPECIAL' ,
0x0036 : 'EDIT.DELETE' ,
0x0037 : 'INSERT' ,
0x0038 : 'FILL.RIGHT' ,
0x0039 : 'FILL.DOWN' ,
0x003D : 'DEFINE.NAME' ,
0x003E : 'CREATE.NAMES' ,
0x003F : 'FORMULA.GOTO' ,
0x0040 : 'FORMULA.FIND' ,
0x0041 : 'SELECT.LAST.CELL' ,
0x0042 : 'SHOW.ACTIVE.CELL' ,
0x0043 : 'GALLERY.AREA' ,
0x0044 : 'GALLERY.BAR' ,
0x0045 : 'GALLERY.COLUMN' ,
0x0046 : 'GALLERY.LINE' ,
0x0047 : 'GALLERY.PIE' ,
0x0048 : 'GALLERY.SCATTER' ,
0x0049 : 'COMBINATION' ,
0x004A : 'PREFERRED' ,
0x004B : 'ADD.OVERLAY' ,
0x004C : 'GRIDLINES' ,
0x004D : 'SET.PREFERRED' ,
0x004E : 'AXES' ,
0x004F : 'LEGEND' ,
0x0050 : 'ATTACH.TEXT' ,
0x0051 : 'ADD.ARROW' ,
0x0052 : 'SELECT.CHART' ,
0x0053 : 'SELECT.PLOT.AREA' ,
0x0054 : 'PATTERNS' ,
0x0055 : 'MAIN.CHART' ,
0x0056 : 'OVERLAY' ,
0x0057 : 'SCALE' ,
0x0058 : 'FORMAT.LEGEND' ,
0x0059 : 'FORMAT.TEXT' ,
0x005A : 'EDIT.REPEAT' ,
0x005B : 'PARSE' ,
0x005C : 'JUSTIFY' ,
0x005D : 'HIDE' ,
0x005E : 'UNHIDE' ,
0x005F : 'WORKSPACE' ,
0x0060 : 'FORMULA' ,
0x0061 : 'FORMULA.FILL' ,
0x0062 : 'FORMULA.ARRAY' ,
0x0063 : 'DATA.FIND.NEXT' ,
0x0064 : 'DATA.FIND.PREV' ,
0x0065 : 'FORMULA.FIND.NEXT' ,
0x0066 : 'FORMULA.FIND.PREV' ,
0x0067 : 'ACTIVATE' ,
0x0068 : 'ACTIVATE.NEXT' ,
0x0069 : 'ACTIVATE.PREV' ,
0x006A : 'UNLOCKED.NEXT' ,
0x006B : 'UNLOCKED.PREV' ,
0x006C : 'COPY.PICTURE' ,
0x006D : 'SELECT' ,
0x006E : 'DELETE.NAME' ,
0x006F : 'DELETE.FORMAT' ,
0x0070 : 'VLINE' ,
0x0071 : 'HLINE' ,
0x0072 : 'VPAGE' ,
0x0073 : 'HPAGE' ,
0x0074 : 'VSCROLL' ,
0x0075 : 'HSCROLL' ,
0x0076 : 'ALERT' ,
0x0077 : 'NEW' ,
0x0078 : 'CANCEL.COPY' ,
0x0079 : 'SHOW.CLIPBOARD' ,
0x007A : 'MESSAGE' ,
0x007C : 'PASTE.LINK' ,
0x007D : 'APP.ACTIVATE' ,
0x007E : 'DELETE.ARROW' ,
0x007F : 'ROW.HEIGHT' ,
0x0080 : 'FORMAT.MOVE' ,
0x0081 : 'FORMAT.SIZE' ,
0x0082 : 'FORMULA.REPLACE' ,
0x0083 : 'SEND.KEYS' ,
0x0084 : 'SELECT.SPECIAL' ,
0x0085 : 'APPLY.NAMES' ,
0x0086 : 'REPLACE.FONT' ,
0x0087 : 'FREEZE.PANES' ,
0x0088 : 'SHOW.INFO' ,
0x0089 : 'SPLIT' ,
0x008A : 'ON.WINDOW' ,
0x008B : 'ON.DATA' ,
0x008C : 'DISABLE.INPUT' ,
0x008E : 'OUTLINE' ,
0x008F : 'LIST.NAMES' ,
0x0090 : 'FILE.CLOSE' ,
0x0091 : 'SAVE.WORKBOOK' ,
0x0092 : 'DATA.FORM' ,
0x0093 : 'COPY.CHART' ,
0x0094 : 'ON.TIME' ,
0x0095 : 'WAIT' ,
0x0096 : 'FORMAT.FONT' ,
0x0097 : 'FILL.UP' ,
0x0098 : 'FILL.LEFT' ,
0x0099 : 'DELETE.OVERLAY' ,
0x009B : 'SHORT.MENUS' ,
0x009F : 'SET.UPDATE.STATUS' ,
0x00A1 : 'COLOR.PALETTE' ,
0x00A2 : 'DELETE.STYLE' ,
0x00A3 : 'WINDOW.RESTORE' ,
0x00A4 : 'WINDOW.MAXIMIZE' ,
0x00A6 : 'CHANGE.LINK' ,
0x00A7 : 'CALCULATE.DOCUMENT' ,
0x00A8 : 'ON.KEY' ,
0x00A9 : 'APP.RESTORE' ,
0x00AA : 'APP.MOVE' ,
0x00AB : 'APP.SIZE' ,
0x00AC : 'APP.MINIMIZE' ,
0x00AD : 'APP.MAXIMIZE' ,
0x00AE : 'BRING.TO.FRONT' ,
0x00AF : 'SEND.TO.BACK' ,
0x00B9 : 'MAIN.CHART.TYPE' ,
0x00BA : 'OVERLAY.CHART.TYPE' ,
0x00BB : 'SELECT.END' ,
0x00BC : 'OPEN.MAIL' ,
0x00BD : 'SEND.MAIL' ,
0x00BE : 'STANDARD.FONT' ,
0x00BF : 'CONSOLIDATE' ,
0x00C0 : 'SORT.SPECIAL' ,
0x00C1 : 'GALLERY.3D.AREA' ,
0x00C2 : 'GALLERY.3D.COLUMN' ,
0x00C3 : 'GALLERY.3D.LINE' ,
0x00C4 : 'GALLERY.3D.PIE' ,
0x00C5 : 'VIEW.3D' ,
0x00C6 : 'GOAL.SEEK' ,
0x00C7 : 'WORKGROUP' ,
0x00C8 : 'FILL.GROUP' ,
0x00C9 : 'UPDATE.LINK' ,
0x00CA : 'PROMOTE' ,
0x00CB : 'DEMOTE' ,
0x00CC : 'SHOW.DETAIL' ,
0x00CE : 'UNGROUP' ,
0x00CF : 'OBJECT.PROPERTIES' ,
0x00D0 : 'SAVE.NEW.OBJECT' ,
0x00D1 : 'SHARE' ,
0x00D2 : 'SHARE.NAME' ,
0x00D3 : 'DUPLICATE' ,
0x00D4 : 'APPLY.STYLE' ,
0x00D5 : 'ASSIGN.TO.OBJECT' ,
0x00D6 : 'OBJECT.PROTECTION' ,
0x00D7 : 'HIDE.OBJECT' ,
0x00D8 : 'SET.EXTRACT' ,
0x00D9 : 'CREATE.PUBLISHER' ,
0x00DA : 'SUBSCRIBE.TO' ,
0x00DB : 'ATTRIBUTES' ,
0x00DC : 'SHOW.TOOLBAR' ,
0x00DE : 'PRINT.PREVIEW' ,
0x00DF : 'EDIT.COLOR' ,
0x00E0 : 'SHOW.LEVELS' ,
0x00E1 : 'FORMAT.MAIN' ,
0x00E2 : 'FORMAT.OVERLAY' ,
0x00E3 : 'ON.RECALC' ,
0x00E4 : 'EDIT.SERIES' ,
0x00E5 : 'DEFINE.STYLE' ,
0x00F0 : 'LINE.PRINT' ,
0x00F3 : 'ENTER.DATA' ,
0x00F9 : 'GALLERY.RADAR' ,
0x00FA : 'MERGE.STYLES' ,
0x00FB : 'EDITION.OPTIONS' ,
0x00FC : 'PASTE.PICTURE' ,
0x00FD : 'PASTE.PICTURE.LINK' ,
0x00FE : 'SPELLING' ,
0x0100 : 'ZOOM' ,
0x0103 : 'INSERT.OBJECT' ,
0x0104 : 'WINDOW.MINIMIZE' ,
0x0109 : 'SOUND.NOTE' ,
0x010A : 'SOUND.PLAY' ,
0x010B : 'FORMAT.SHAPE' ,
0x010C : 'EXTEND.POLYGON' ,
0x010D : 'FORMAT.AUTO' ,
0x0110 : 'GALLERY.3D.BAR' ,
0x0111 : 'GALLERY.3D.SURFACE' ,
0x0112 : 'FILL.AUTO' ,
0x0114 : 'CUSTOMIZE.TOOLBAR' ,
0x0115 : 'ADD.TOOL' ,
0x0116 : 'EDIT.OBJECT' ,
0x0117 : 'ON.DOUBLECLICK' ,
0x0118 : 'ON.ENTRY' ,
0x0119 : 'WORKBOOK.ADD' ,
0x011A : 'WORKBOOK.MOVE' ,
0x011B : 'WORKBOOK.COPY' ,
0x011C : 'WORKBOOK.OPTIONS' ,
0x011D : 'SAVE.WORKSPACE' ,
0x0120 : 'CHART.WIZARD' ,
0x0121 : 'DELETE.TOOL' ,
0x0122 : 'MOVE.TOOL' ,
0x0123 : 'WORKBOOK.SELECT' ,
0x0124 : 'WORKBOOK.ACTIVATE' ,
0x0125 : 'ASSIGN.TO.TOOL' ,
0x0127 : 'COPY.TOOL' ,
0x0128 : 'RESET.TOOL' ,
0x0129 : 'CONSTRAIN.NUMERIC' ,
0x012A : 'PASTE.TOOL' ,
0x012E : 'WORKBOOK.NEW' ,
0x0131 : 'SCENARIO.CELLS' ,
0x0132 : 'SCENARIO.DELETE' ,
0x0133 : 'SCENARIO.ADD' ,
0x0134 : 'SCENARIO.EDIT' ,
0x0135 : 'SCENARIO.SHOW' ,
0x0136 : 'SCENARIO.SHOW.NEXT' ,
0x0137 : 'SCENARIO.SUMMARY' ,
0x0138 : 'PIVOT.TABLE.WIZARD' ,
0x0139 : 'PIVOT.FIELD.PROPERTIES' ,
0x013A : 'PIVOT.FIELD' ,
0x013B : 'PIVOT.ITEM' ,
0x013C : 'PIVOT.ADD.FIELDS' ,
0x013E : 'OPTIONS.CALCULATION' ,
0x013F : 'OPTIONS.EDIT' ,
0x0140 : 'OPTIONS.VIEW' ,
0x0141 : 'ADDIN.MANAGER' ,
0x0142 : 'MENU.EDITOR' ,
0x0143 : 'ATTACH.TOOLBARS' ,
0x0144 : 'VBAActivate' ,
0x0145 : 'OPTIONS.CHART' ,
0x0148 : 'VBA.INSERT.FILE' ,
0x014A : 'VBA.PROCEDURE.DEFINITION' ,
0x0150 : 'ROUTING.SLIP' ,
0x0152 : 'ROUTE.DOCUMENT' ,
0x0153 : 'MAIL.LOGON' ,
0x0156 : 'INSERT.PICTURE' ,
0x0157 : 'EDIT.TOOL' ,
0x0158 : 'GALLERY.DOUGHNUT' ,
0x015E : 'CHART.TREND' ,
0x0160 : 'PIVOT.ITEM.PROPERTIES' ,
0x0162 : 'WORKBOOK.INSERT' ,
0x0163 : 'OPTIONS.TRANSITION' ,
0x0164 : 'OPTIONS.GENERAL' ,
0x0172 : 'FILTER.ADVANCED' ,
0x0175 : 'MAIL.ADD.MAILER' ,
0x0176 : 'MAIL.DELETE.MAILER' ,
0x0177 : 'MAIL.REPLY' ,
0x0178 : 'MAIL.REPLY.ALL' ,
0x0179 : 'MAIL.FORWARD' ,
0x017A : 'MAIL.NEXT.LETTER' ,
0x017B : 'DATA.LABEL' ,
0x017C : 'INSERT.TITLE' ,
0x017D : 'FONT.PROPERTIES' ,
0x017E : 'MACRO.OPTIONS' ,
0x017F : 'WORKBOOK.HIDE' ,
0x0180 : 'WORKBOOK.UNHIDE' ,
0x0181 : 'WORKBOOK.DELETE' ,
0x0182 : 'WORKBOOK.NAME' ,
0x0184 : 'GALLERY.CUSTOM' ,
0x0186 : 'ADD.CHART.AUTOFORMAT' ,
0x0187 : 'DELETE.CHART.AUTOFORMAT' ,
0x0188 : 'CHART.ADD.DATA' ,
0x0189 : 'AUTO.OUTLINE' ,
0x018A : 'TAB.ORDER' ,
0x018B : 'SHOW.DIALOG' ,
0x018C : 'SELECT.ALL' ,
0x018D : 'UNGROUP.SHEETS' ,
0x018E : 'SUBTOTAL.CREATE' ,
0x018F : 'SUBTOTAL.REMOVE' ,
0x0190 : 'RENAME.OBJECT' ,
0x019C : 'WORKBOOK.SCROLL' ,
0x019D : 'WORKBOOK.NEXT' ,
0x019E : 'WORKBOOK.PREV' ,
0x019F : 'WORKBOOK.TAB.SPLIT' ,
0x01A0 : 'FULL.SCREEN' ,
0x01A1 : 'WORKBOOK.PROTECT' ,
0x01A4 : 'SCROLLBAR.PROPERTIES' ,
0x01A5 : 'PIVOT.SHOW.PAGES' ,
0x01A6 : 'TEXT.TO.COLUMNS' ,
0x01A7 : 'FORMAT.CHARTTYPE' ,
0x01A8 : 'LINK.FORMAT' ,
0x01A9 : 'TRACER.DISPLAY' ,
0x01AE : 'TRACER.NAVIGATE' ,
0x01AF : 'TRACER.CLEAR' ,
0x01B0 : 'TRACER.ERROR' ,
0x01B1 : 'PIVOT.FIELD.GROUP' ,
0x01B2 : 'PIVOT.FIELD.UNGROUP' ,
0x01B3 : 'CHECKBOX.PROPERTIES' ,
0x01B4 : 'LABEL.PROPERTIES' ,
0x01B5 : 'LISTBOX.PROPERTIES' ,
0x01B6 : 'EDITBOX.PROPERTIES' ,
0x01B7 : 'PIVOT.REFRESH' ,
0x01B8 : 'LINK.COMBO' ,
0x01B9 : 'OPEN.TEXT' ,
0x01BA : 'HIDE.DIALOG' ,
0x01BB : 'SET.DIALOG.FOCUS' ,
0x01BC : 'ENABLE.OBJECT' ,
0x01BD : 'PUSHBUTTON.PROPERTIES' ,
0x01BE : 'SET.DIALOG.DEFAULT' ,
0x01BF : 'FILTER' ,
0x01C0 : 'FILTER.SHOW.ALL' ,
0x01C1 : 'CLEAR.OUTLINE' ,
0x01C2 : 'FUNCTION.WIZARD' ,
0x01C3 : 'ADD.LIST.ITEM' ,
0x01C4 : 'SET.LIST.ITEM' ,
0x01C5 : 'REMOVE.LIST.ITEM' ,
0x01C6 : 'SELECT.LIST.ITEM' ,
0x01C7 : 'SET.CONTROL.VALUE' ,
0x01C8 : 'SAVE.COPY.AS' ,
0x01CA : 'OPTIONS.LISTS.ADD' ,
0x01CB : 'OPTIONS.LISTS.DELETE' ,
0x01CC : 'SERIES.AXES' ,
0x01CD : 'SERIES.X' ,
0x01CE : 'SERIES.Y' ,
0x01CF : 'ERRORBAR.X' ,
0x01D0 : 'ERRORBAR.Y' ,
0x01D1 : 'FORMAT.CHART' ,
0x01D2 : 'SERIES.ORDER' ,
0x01D3 : 'MAIL.LOGOFF' ,
0x01D4 : 'CLEAR.ROUTING.SLIP' ,
0x01D5 : 'APP.ACTIVATE.MICROSOFT' ,
0x01D6 : 'MAIL.EDIT.MAILER' ,
0x01D7 : 'ON.SHEET' ,
0x01D8 : 'STANDARD.WIDTH' ,
0x01D9 : 'SCENARIO.MERGE' ,
0x01DA : 'SUMMARY.INFO' ,
0x01DB : 'FIND.FILE' ,
0x01DC : 'ACTIVE.CELL.FONT' ,
0x01DD : 'ENABLE.TIPWIZARD' ,
0x01DE : 'VBA.MAKE.ADDIN' ,
0x01E0 : 'INSERTDATATABLE' ,
0x01E1 : 'WORKGROUP.OPTIONS' ,
0x01E2 : 'MAIL.SEND.MAILER' ,
0x01E5 : 'AUTOCORRECT' ,
0x01E9 : 'POST.DOCUMENT' ,
0x01EB : 'PICKLIST' ,
0x01ED : 'VIEW.SHOW' ,
0x01EE : 'VIEW.DEFINE' ,
0x01EF : 'VIEW.DELETE' ,
0x01FD : 'SHEET.BACKGROUND' ,
0x01FE : 'INSERT.MAP.OBJECT' ,
0x01FF : 'OPTIONS.MENONO' ,
0x0205 : 'MSOCHECKS' ,
0x0206 : 'NORMAL' ,
0x0207 : 'LAYOUT' ,
0x0208 : 'RM.PRINT.AREA' ,
0x0209 : 'CLEAR.PRINT.AREA' ,
0x020A : 'ADD.PRINT.AREA' ,
0x020B : 'MOVE.BRK' ,
0x0221 : 'HIDECURR.NOTE' ,
0x0222 : 'HIDEALL.NOTES' ,
0x0223 : 'DELETE.NOTE' ,
0x0224 : 'TRAVERSE.NOTES' ,
0x0225 : 'ACTIVATE.NOTES' ,
0x026C : 'PROTECT.REVISIONS' ,
0x026D : 'UNPROTECT.REVISIONS' ,
0x0287 : 'OPTIONS.ME' ,
0x028D : 'WEB.PUBLISH' ,
0x029B : 'NEWWEBQUERY' ,
0x02A1 : 'PIVOT.TABLE.CHART' ,
0x02F1 : 'OPTIONS.SAVE' ,
0x02F3 : 'OPTIONS.SPELL' ,
0x0328 : 'HIDEALL.INKANNOTS'
2015-04-02 22:14:07 +00:00
} ;
/* [MS-XLS] 2.5.198.17 */
2017-02-19 21:11:48 +00:00
/* [MS-XLSB] 2.5.97.10 */
2015-04-02 22:14:07 +00:00
var Ftab = {
2017-02-11 01:58:22 +00:00
0x0000 : 'COUNT' ,
0x0001 : 'IF' ,
0x0002 : 'ISNA' ,
0x0003 : 'ISERROR' ,
0x0004 : 'SUM' ,
0x0005 : 'AVERAGE' ,
0x0006 : 'MIN' ,
0x0007 : 'MAX' ,
0x0008 : 'ROW' ,
0x0009 : 'COLUMN' ,
0x000A : 'NA' ,
0x000B : 'NPV' ,
0x000C : 'STDEV' ,
0x000D : 'DOLLAR' ,
0x000E : 'FIXED' ,
0x000F : 'SIN' ,
0x0010 : 'COS' ,
0x0011 : 'TAN' ,
0x0012 : 'ATAN' ,
0x0013 : 'PI' ,
0x0014 : 'SQRT' ,
0x0015 : 'EXP' ,
0x0016 : 'LN' ,
0x0017 : 'LOG10' ,
0x0018 : 'ABS' ,
0x0019 : 'INT' ,
0x001A : 'SIGN' ,
0x001B : 'ROUND' ,
0x001C : 'LOOKUP' ,
0x001D : 'INDEX' ,
0x001E : 'REPT' ,
0x001F : 'MID' ,
0x0020 : 'LEN' ,
0x0021 : 'VALUE' ,
0x0022 : 'TRUE' ,
0x0023 : 'FALSE' ,
0x0024 : 'AND' ,
0x0025 : 'OR' ,
0x0026 : 'NOT' ,
0x0027 : 'MOD' ,
0x0028 : 'DCOUNT' ,
0x0029 : 'DSUM' ,
0x002A : 'DAVERAGE' ,
0x002B : 'DMIN' ,
0x002C : 'DMAX' ,
0x002D : 'DSTDEV' ,
0x002E : 'VAR' ,
0x002F : 'DVAR' ,
0x0030 : 'TEXT' ,
0x0031 : 'LINEST' ,
0x0032 : 'TREND' ,
0x0033 : 'LOGEST' ,
0x0034 : 'GROWTH' ,
0x0035 : 'GOTO' ,
0x0036 : 'HALT' ,
0x0037 : 'RETURN' ,
0x0038 : 'PV' ,
0x0039 : 'FV' ,
0x003A : 'NPER' ,
0x003B : 'PMT' ,
0x003C : 'RATE' ,
0x003D : 'MIRR' ,
0x003E : 'IRR' ,
0x003F : 'RAND' ,
0x0040 : 'MATCH' ,
0x0041 : 'DATE' ,
0x0042 : 'TIME' ,
0x0043 : 'DAY' ,
0x0044 : 'MONTH' ,
0x0045 : 'YEAR' ,
0x0046 : 'WEEKDAY' ,
0x0047 : 'HOUR' ,
0x0048 : 'MINUTE' ,
0x0049 : 'SECOND' ,
0x004A : 'NOW' ,
0x004B : 'AREAS' ,
0x004C : 'ROWS' ,
0x004D : 'COLUMNS' ,
0x004E : 'OFFSET' ,
0x004F : 'ABSREF' ,
0x0050 : 'RELREF' ,
0x0051 : 'ARGUMENT' ,
0x0052 : 'SEARCH' ,
0x0053 : 'TRANSPOSE' ,
0x0054 : 'ERROR' ,
0x0055 : 'STEP' ,
0x0056 : 'TYPE' ,
0x0057 : 'ECHO' ,
0x0058 : 'SET.NAME' ,
0x0059 : 'CALLER' ,
0x005A : 'DEREF' ,
0x005B : 'WINDOWS' ,
0x005C : 'SERIES' ,
0x005D : 'DOCUMENTS' ,
0x005E : 'ACTIVE.CELL' ,
0x005F : 'SELECTION' ,
0x0060 : 'RESULT' ,
0x0061 : 'ATAN2' ,
0x0062 : 'ASIN' ,
0x0063 : 'ACOS' ,
0x0064 : 'CHOOSE' ,
0x0065 : 'HLOOKUP' ,
0x0066 : 'VLOOKUP' ,
0x0067 : 'LINKS' ,
0x0068 : 'INPUT' ,
0x0069 : 'ISREF' ,
0x006A : 'GET.FORMULA' ,
0x006B : 'GET.NAME' ,
0x006C : 'SET.VALUE' ,
0x006D : 'LOG' ,
0x006E : 'EXEC' ,
0x006F : 'CHAR' ,
0x0070 : 'LOWER' ,
0x0071 : 'UPPER' ,
0x0072 : 'PROPER' ,
0x0073 : 'LEFT' ,
0x0074 : 'RIGHT' ,
0x0075 : 'EXACT' ,
0x0076 : 'TRIM' ,
0x0077 : 'REPLACE' ,
0x0078 : 'SUBSTITUTE' ,
0x0079 : 'CODE' ,
0x007A : 'NAMES' ,
0x007B : 'DIRECTORY' ,
0x007C : 'FIND' ,
0x007D : 'CELL' ,
0x007E : 'ISERR' ,
0x007F : 'ISTEXT' ,
0x0080 : 'ISNUMBER' ,
0x0081 : 'ISBLANK' ,
0x0082 : 'T' ,
0x0083 : 'N' ,
0x0084 : 'FOPEN' ,
0x0085 : 'FCLOSE' ,
0x0086 : 'FSIZE' ,
0x0087 : 'FREADLN' ,
0x0088 : 'FREAD' ,
0x0089 : 'FWRITELN' ,
0x008A : 'FWRITE' ,
0x008B : 'FPOS' ,
0x008C : 'DATEVALUE' ,
0x008D : 'TIMEVALUE' ,
0x008E : 'SLN' ,
0x008F : 'SYD' ,
0x0090 : 'DDB' ,
0x0091 : 'GET.DEF' ,
0x0092 : 'REFTEXT' ,
0x0093 : 'TEXTREF' ,
0x0094 : 'INDIRECT' ,
0x0095 : 'REGISTER' ,
0x0096 : 'CALL' ,
0x0097 : 'ADD.BAR' ,
0x0098 : 'ADD.MENU' ,
0x0099 : 'ADD.COMMAND' ,
0x009A : 'ENABLE.COMMAND' ,
0x009B : 'CHECK.COMMAND' ,
0x009C : 'RENAME.COMMAND' ,
0x009D : 'SHOW.BAR' ,
0x009E : 'DELETE.MENU' ,
0x009F : 'DELETE.COMMAND' ,
0x00A0 : 'GET.CHART.ITEM' ,
0x00A1 : 'DIALOG.BOX' ,
0x00A2 : 'CLEAN' ,
0x00A3 : 'MDETERM' ,
0x00A4 : 'MINVERSE' ,
0x00A5 : 'MMULT' ,
0x00A6 : 'FILES' ,
0x00A7 : 'IPMT' ,
0x00A8 : 'PPMT' ,
0x00A9 : 'COUNTA' ,
0x00AA : 'CANCEL.KEY' ,
0x00AB : 'FOR' ,
0x00AC : 'WHILE' ,
0x00AD : 'BREAK' ,
0x00AE : 'NEXT' ,
0x00AF : 'INITIATE' ,
0x00B0 : 'REQUEST' ,
0x00B1 : 'POKE' ,
0x00B2 : 'EXECUTE' ,
0x00B3 : 'TERMINATE' ,
0x00B4 : 'RESTART' ,
0x00B5 : 'HELP' ,
0x00B6 : 'GET.BAR' ,
0x00B7 : 'PRODUCT' ,
0x00B8 : 'FACT' ,
0x00B9 : 'GET.CELL' ,
0x00BA : 'GET.WORKSPACE' ,
0x00BB : 'GET.WINDOW' ,
0x00BC : 'GET.DOCUMENT' ,
0x00BD : 'DPRODUCT' ,
0x00BE : 'ISNONTEXT' ,
0x00BF : 'GET.NOTE' ,
0x00C0 : 'NOTE' ,
0x00C1 : 'STDEVP' ,
0x00C2 : 'VARP' ,
0x00C3 : 'DSTDEVP' ,
0x00C4 : 'DVARP' ,
0x00C5 : 'TRUNC' ,
0x00C6 : 'ISLOGICAL' ,
0x00C7 : 'DCOUNTA' ,
0x00C8 : 'DELETE.BAR' ,
0x00C9 : 'UNREGISTER' ,
0x00CC : 'USDOLLAR' ,
0x00CD : 'FINDB' ,
0x00CE : 'SEARCHB' ,
0x00CF : 'REPLACEB' ,
0x00D0 : 'LEFTB' ,
0x00D1 : 'RIGHTB' ,
0x00D2 : 'MIDB' ,
0x00D3 : 'LENB' ,
0x00D4 : 'ROUNDUP' ,
0x00D5 : 'ROUNDDOWN' ,
0x00D6 : 'ASC' ,
0x00D7 : 'DBCS' ,
0x00D8 : 'RANK' ,
0x00DB : 'ADDRESS' ,
0x00DC : 'DAYS360' ,
0x00DD : 'TODAY' ,
0x00DE : 'VDB' ,
0x00DF : 'ELSE' ,
0x00E0 : 'ELSE.IF' ,
0x00E1 : 'END.IF' ,
0x00E2 : 'FOR.CELL' ,
0x00E3 : 'MEDIAN' ,
0x00E4 : 'SUMPRODUCT' ,
0x00E5 : 'SINH' ,
0x00E6 : 'COSH' ,
0x00E7 : 'TANH' ,
0x00E8 : 'ASINH' ,
0x00E9 : 'ACOSH' ,
0x00EA : 'ATANH' ,
0x00EB : 'DGET' ,
0x00EC : 'CREATE.OBJECT' ,
0x00ED : 'VOLATILE' ,
0x00EE : 'LAST.ERROR' ,
0x00EF : 'CUSTOM.UNDO' ,
0x00F0 : 'CUSTOM.REPEAT' ,
0x00F1 : 'FORMULA.CONVERT' ,
0x00F2 : 'GET.LINK.INFO' ,
0x00F3 : 'TEXT.BOX' ,
0x00F4 : 'INFO' ,
0x00F5 : 'GROUP' ,
0x00F6 : 'GET.OBJECT' ,
0x00F7 : 'DB' ,
0x00F8 : 'PAUSE' ,
0x00FB : 'RESUME' ,
0x00FC : 'FREQUENCY' ,
0x00FD : 'ADD.TOOLBAR' ,
0x00FE : 'DELETE.TOOLBAR' ,
0x00FF : 'User' ,
0x0100 : 'RESET.TOOLBAR' ,
0x0101 : 'EVALUATE' ,
0x0102 : 'GET.TOOLBAR' ,
0x0103 : 'GET.TOOL' ,
0x0104 : 'SPELLING.CHECK' ,
0x0105 : 'ERROR.TYPE' ,
0x0106 : 'APP.TITLE' ,
0x0107 : 'WINDOW.TITLE' ,
0x0108 : 'SAVE.TOOLBAR' ,
0x0109 : 'ENABLE.TOOL' ,
0x010A : 'PRESS.TOOL' ,
0x010B : 'REGISTER.ID' ,
0x010C : 'GET.WORKBOOK' ,
0x010D : 'AVEDEV' ,
0x010E : 'BETADIST' ,
0x010F : 'GAMMALN' ,
0x0110 : 'BETAINV' ,
0x0111 : 'BINOMDIST' ,
0x0112 : 'CHIDIST' ,
0x0113 : 'CHIINV' ,
0x0114 : 'COMBIN' ,
0x0115 : 'CONFIDENCE' ,
0x0116 : 'CRITBINOM' ,
0x0117 : 'EVEN' ,
0x0118 : 'EXPONDIST' ,
0x0119 : 'FDIST' ,
0x011A : 'FINV' ,
0x011B : 'FISHER' ,
0x011C : 'FISHERINV' ,
0x011D : 'FLOOR' ,
0x011E : 'GAMMADIST' ,
0x011F : 'GAMMAINV' ,
0x0120 : 'CEILING' ,
0x0121 : 'HYPGEOMDIST' ,
0x0122 : 'LOGNORMDIST' ,
0x0123 : 'LOGINV' ,
0x0124 : 'NEGBINOMDIST' ,
0x0125 : 'NORMDIST' ,
0x0126 : 'NORMSDIST' ,
0x0127 : 'NORMINV' ,
0x0128 : 'NORMSINV' ,
0x0129 : 'STANDARDIZE' ,
0x012A : 'ODD' ,
0x012B : 'PERMUT' ,
0x012C : 'POISSON' ,
0x012D : 'TDIST' ,
0x012E : 'WEIBULL' ,
0x012F : 'SUMXMY2' ,
0x0130 : 'SUMX2MY2' ,
0x0131 : 'SUMX2PY2' ,
0x0132 : 'CHITEST' ,
0x0133 : 'CORREL' ,
0x0134 : 'COVAR' ,
0x0135 : 'FORECAST' ,
0x0136 : 'FTEST' ,
0x0137 : 'INTERCEPT' ,
0x0138 : 'PEARSON' ,
0x0139 : 'RSQ' ,
0x013A : 'STEYX' ,
0x013B : 'SLOPE' ,
0x013C : 'TTEST' ,
0x013D : 'PROB' ,
0x013E : 'DEVSQ' ,
0x013F : 'GEOMEAN' ,
0x0140 : 'HARMEAN' ,
0x0141 : 'SUMSQ' ,
0x0142 : 'KURT' ,
0x0143 : 'SKEW' ,
0x0144 : 'ZTEST' ,
0x0145 : 'LARGE' ,
0x0146 : 'SMALL' ,
0x0147 : 'QUARTILE' ,
0x0148 : 'PERCENTILE' ,
0x0149 : 'PERCENTRANK' ,
0x014A : 'MODE' ,
0x014B : 'TRIMMEAN' ,
0x014C : 'TINV' ,
0x014E : 'MOVIE.COMMAND' ,
0x014F : 'GET.MOVIE' ,
0x0150 : 'CONCATENATE' ,
0x0151 : 'POWER' ,
0x0152 : 'PIVOT.ADD.DATA' ,
0x0153 : 'GET.PIVOT.TABLE' ,
0x0154 : 'GET.PIVOT.FIELD' ,
0x0155 : 'GET.PIVOT.ITEM' ,
0x0156 : 'RADIANS' ,
0x0157 : 'DEGREES' ,
0x0158 : 'SUBTOTAL' ,
0x0159 : 'SUMIF' ,
0x015A : 'COUNTIF' ,
0x015B : 'COUNTBLANK' ,
0x015C : 'SCENARIO.GET' ,
0x015D : 'OPTIONS.LISTS.GET' ,
0x015E : 'ISPMT' ,
0x015F : 'DATEDIF' ,
0x0160 : 'DATESTRING' ,
0x0161 : 'NUMBERSTRING' ,
0x0162 : 'ROMAN' ,
0x0163 : 'OPEN.DIALOG' ,
0x0164 : 'SAVE.DIALOG' ,
0x0165 : 'VIEW.GET' ,
0x0166 : 'GETPIVOTDATA' ,
0x0167 : 'HYPERLINK' ,
0x0168 : 'PHONETIC' ,
0x0169 : 'AVERAGEA' ,
0x016A : 'MAXA' ,
0x016B : 'MINA' ,
0x016C : 'STDEVPA' ,
0x016D : 'VARPA' ,
0x016E : 'STDEVA' ,
0x016F : 'VARA' ,
0x0170 : 'BAHTTEXT' ,
0x0171 : 'THAIDAYOFWEEK' ,
0x0172 : 'THAIDIGIT' ,
0x0173 : 'THAIMONTHOFYEAR' ,
0x0174 : 'THAINUMSOUND' ,
0x0175 : 'THAINUMSTRING' ,
0x0176 : 'THAISTRINGLENGTH' ,
0x0177 : 'ISTHAIDIGIT' ,
0x0178 : 'ROUNDBAHTDOWN' ,
0x0179 : 'ROUNDBAHTUP' ,
0x017A : 'THAIYEAR' ,
2017-02-19 21:11:48 +00:00
0x017B : 'RTD' ,
0x017C : 'CUBEVALUE' ,
0x017D : 'CUBEMEMBER' ,
0x017E : 'CUBEMEMBERPROPERTY' ,
0x017F : 'CUBERANKEDMEMBER' ,
0x0180 : 'HEX2BIN' ,
0x0181 : 'HEX2DEC' ,
0x0182 : 'HEX2OCT' ,
0x0183 : 'DEC2BIN' ,
0x0184 : 'DEC2HEX' ,
0x0185 : 'DEC2OCT' ,
0x0186 : 'OCT2BIN' ,
0x0187 : 'OCT2HEX' ,
0x0188 : 'OCT2DEC' ,
0x0189 : 'BIN2DEC' ,
0x018A : 'BIN2OCT' ,
0x018B : 'BIN2HEX' ,
0x018C : 'IMSUB' ,
0x018D : 'IMDIV' ,
0x018E : 'IMPOWER' ,
0x018F : 'IMABS' ,
0x0190 : 'IMSQRT' ,
0x0191 : 'IMLN' ,
0x0192 : 'IMLOG2' ,
0x0193 : 'IMLOG10' ,
0x0194 : 'IMSIN' ,
0x0195 : 'IMCOS' ,
0x0196 : 'IMEXP' ,
0x0197 : 'IMARGUMENT' ,
0x0198 : 'IMCONJUGATE' ,
0x0199 : 'IMAGINARY' ,
0x019A : 'IMREAL' ,
0x019B : 'COMPLEX' ,
0x019C : 'IMSUM' ,
0x019D : 'IMPRODUCT' ,
0x019E : 'SERIESSUM' ,
0x019F : 'FACTDOUBLE' ,
0x01A0 : 'SQRTPI' ,
0x01A1 : 'QUOTIENT' ,
0x01A2 : 'DELTA' ,
0x01A3 : 'GESTEP' ,
0x01A4 : 'ISEVEN' ,
0x01A5 : 'ISODD' ,
0x01A6 : 'MROUND' ,
0x01A7 : 'ERF' ,
0x01A8 : 'ERFC' ,
0x01A9 : 'BESSELJ' ,
0x01AA : 'BESSELK' ,
0x01AB : 'BESSELY' ,
0x01AC : 'BESSELI' ,
0x01AD : 'XIRR' ,
0x01AE : 'XNPV' ,
0x01AF : 'PRICEMAT' ,
0x01B0 : 'YIELDMAT' ,
0x01B1 : 'INTRATE' ,
0x01B2 : 'RECEIVED' ,
0x01B3 : 'DISC' ,
0x01B4 : 'PRICEDISC' ,
0x01B5 : 'YIELDDISC' ,
0x01B6 : 'TBILLEQ' ,
0x01B7 : 'TBILLPRICE' ,
0x01B8 : 'TBILLYIELD' ,
0x01B9 : 'PRICE' ,
0x01BA : 'YIELD' ,
0x01BB : 'DOLLARDE' ,
0x01BC : 'DOLLARFR' ,
0x01BD : 'NOMINAL' ,
0x01BE : 'EFFECT' ,
0x01BF : 'CUMPRINC' ,
0x01C0 : 'CUMIPMT' ,
0x01C1 : 'EDATE' ,
0x01C2 : 'EOMONTH' ,
0x01C3 : 'YEARFRAC' ,
0x01C4 : 'COUPDAYBS' ,
0x01C5 : 'COUPDAYS' ,
0x01C6 : 'COUPDAYSNC' ,
0x01C7 : 'COUPNCD' ,
0x01C8 : 'COUPNUM' ,
0x01C9 : 'COUPPCD' ,
0x01CA : 'DURATION' ,
0x01CB : 'MDURATION' ,
0x01CC : 'ODDLPRICE' ,
0x01CD : 'ODDLYIELD' ,
0x01CE : 'ODDFPRICE' ,
0x01CF : 'ODDFYIELD' ,
0x01D0 : 'RANDBETWEEN' ,
0x01D1 : 'WEEKNUM' ,
0x01D2 : 'AMORDEGRC' ,
0x01D3 : 'AMORLINC' ,
2017-03-11 00:01:58 +00:00
0x01D4 : 'CONVERT' ,
0x02D4 : 'SHEETJS' ,
2017-02-19 21:11:48 +00:00
0x01D5 : 'ACCRINT' ,
0x01D6 : 'ACCRINTM' ,
0x01D7 : 'WORKDAY' ,
0x01D8 : 'NETWORKDAYS' ,
0x01D9 : 'GCD' ,
0x01DA : 'MULTINOMIAL' ,
0x01DB : 'LCM' ,
0x01DC : 'FVSCHEDULE' ,
0x01DD : 'CUBEKPIMEMBER' ,
0x01DE : 'CUBESET' ,
0x01DF : 'CUBESETCOUNT' ,
0x01E0 : 'IFERROR' ,
0x01E1 : 'COUNTIFS' ,
0x01E2 : 'SUMIFS' ,
0x01E3 : 'AVERAGEIF' ,
0x01E4 : 'AVERAGEIFS'
2015-04-02 22:14:07 +00:00
} ;
var FtabArgc = {
2017-02-11 01:58:22 +00:00
0x0002 : 1 , /* ISNA */
0x0003 : 1 , /* ISERROR */
2018-02-28 09:58:43 +00:00
0x000A : 0 , /* NA */
2017-02-11 01:58:22 +00:00
0x000F : 1 , /* SIN */
0x0010 : 1 , /* COS */
0x0011 : 1 , /* TAN */
0x0012 : 1 , /* ATAN */
2017-02-19 21:11:48 +00:00
0x0013 : 0 , /* PI */
2017-02-11 01:58:22 +00:00
0x0014 : 1 , /* SQRT */
0x0015 : 1 , /* EXP */
0x0016 : 1 , /* LN */
0x0017 : 1 , /* LOG10 */
0x0018 : 1 , /* ABS */
0x0019 : 1 , /* INT */
0x001A : 1 , /* SIGN */
0x001B : 2 , /* ROUND */
0x001E : 2 , /* REPT */
0x001F : 3 , /* MID */
0x0020 : 1 , /* LEN */
0x0021 : 1 , /* VALUE */
2018-02-28 09:58:43 +00:00
0x0022 : 0 , /* TRUE */
0x0023 : 0 , /* FALSE */
2017-02-11 01:58:22 +00:00
0x0026 : 1 , /* NOT */
0x0027 : 2 , /* MOD */
0x0028 : 3 , /* DCOUNT */
0x0029 : 3 , /* DSUM */
0x002A : 3 , /* DAVERAGE */
0x002B : 3 , /* DMIN */
0x002C : 3 , /* DMAX */
0x002D : 3 , /* DSTDEV */
0x002F : 3 , /* DVAR */
0x0030 : 2 , /* TEXT */
0x0035 : 1 , /* GOTO */
0x003D : 3 , /* MIRR */
2018-02-28 09:58:43 +00:00
0x003F : 0 , /* RAND */
2017-02-11 01:58:22 +00:00
0x0041 : 3 , /* DATE */
0x0042 : 3 , /* TIME */
0x0043 : 1 , /* DAY */
0x0044 : 1 , /* MONTH */
0x0045 : 1 , /* YEAR */
2017-02-19 21:11:48 +00:00
0x0046 : 1 , /* WEEKDAY */
2017-02-11 01:58:22 +00:00
0x0047 : 1 , /* HOUR */
0x0048 : 1 , /* MINUTE */
0x0049 : 1 , /* SECOND */
2018-02-28 09:58:43 +00:00
0x004A : 0 , /* NOW */
2017-02-11 01:58:22 +00:00
0x004B : 1 , /* AREAS */
0x004C : 1 , /* ROWS */
0x004D : 1 , /* COLUMNS */
0x004F : 2 , /* ABSREF */
0x0050 : 2 , /* RELREF */
0x0053 : 1 , /* TRANSPOSE */
2017-02-19 21:11:48 +00:00
0x0055 : 0 , /* STEP */
2017-02-11 01:58:22 +00:00
0x0056 : 1 , /* TYPE */
2018-02-28 09:58:43 +00:00
0x0059 : 0 , /* CALLER */
2017-02-11 01:58:22 +00:00
0x005A : 1 , /* DEREF */
2018-02-28 09:58:43 +00:00
0x005E : 0 , /* ACTIVE.CELL */
0x005F : 0 , /* SELECTION */
2017-02-11 01:58:22 +00:00
0x0061 : 2 , /* ATAN2 */
0x0062 : 1 , /* ASIN */
0x0063 : 1 , /* ACOS */
2017-02-19 21:11:48 +00:00
0x0065 : 3 , /* HLOOKUP */
0x0066 : 3 , /* VLOOKUP */
2017-02-11 01:58:22 +00:00
0x0069 : 1 , /* ISREF */
2018-02-28 09:58:43 +00:00
0x006A : 1 , /* GET.FORMULA */
0x006C : 2 , /* SET.VALUE */
2017-02-11 01:58:22 +00:00
0x006F : 1 , /* CHAR */
0x0070 : 1 , /* LOWER */
0x0071 : 1 , /* UPPER */
0x0072 : 1 , /* PROPER */
0x0075 : 2 , /* EXACT */
0x0076 : 1 , /* TRIM */
0x0077 : 4 , /* REPLACE */
0x0079 : 1 , /* CODE */
0x007E : 1 , /* ISERR */
0x007F : 1 , /* ISTEXT */
0x0080 : 1 , /* ISNUMBER */
0x0081 : 1 , /* ISBLANK */
0x0082 : 1 , /* T */
0x0083 : 1 , /* N */
0x0085 : 1 , /* FCLOSE */
0x0086 : 1 , /* FSIZE */
0x0087 : 1 , /* FREADLN */
0x0088 : 2 , /* FREAD */
0x0089 : 2 , /* FWRITELN */
0x008A : 2 , /* FWRITE */
0x008C : 1 , /* DATEVALUE */
0x008D : 1 , /* TIMEVALUE */
0x008E : 3 , /* SLN */
0x008F : 4 , /* SYD */
2017-02-19 21:11:48 +00:00
0x0090 : 4 , /* DDB */
2018-02-28 09:58:43 +00:00
0x00A1 : 1 , /* DIALOG.BOX */
2017-02-11 01:58:22 +00:00
0x00A2 : 1 , /* CLEAN */
0x00A3 : 1 , /* MDETERM */
0x00A4 : 1 , /* MINVERSE */
0x00A5 : 2 , /* MMULT */
0x00AC : 1 , /* WHILE */
0x00AF : 2 , /* INITIATE */
0x00B0 : 2 , /* REQUEST */
0x00B1 : 3 , /* POKE */
0x00B2 : 2 , /* EXECUTE */
0x00B3 : 1 , /* TERMINATE */
0x00B8 : 1 , /* FACT */
2018-02-28 09:58:43 +00:00
0x00BA : 1 , /* GET.WORKSPACE */
2017-02-11 01:58:22 +00:00
0x00BD : 3 , /* DPRODUCT */
0x00BE : 1 , /* ISNONTEXT */
0x00C3 : 3 , /* DSTDEVP */
0x00C4 : 3 , /* DVARP */
2017-02-19 21:11:48 +00:00
0x00C5 : 1 , /* TRUNC */
2017-02-11 01:58:22 +00:00
0x00C6 : 1 , /* ISLOGICAL */
0x00C7 : 3 , /* DCOUNTA */
0x00C9 : 1 , /* UNREGISTER */
0x00CF : 4 , /* REPLACEB */
0x00D2 : 3 , /* MIDB */
0x00D3 : 1 , /* LENB */
0x00D4 : 2 , /* ROUNDUP */
0x00D5 : 2 , /* ROUNDDOWN */
0x00D6 : 1 , /* ASC */
0x00D7 : 1 , /* DBCS */
2018-02-28 09:58:43 +00:00
0x00E1 : 0 , /* END.IF */
2017-02-11 01:58:22 +00:00
0x00E5 : 1 , /* SINH */
0x00E6 : 1 , /* COSH */
0x00E7 : 1 , /* TANH */
0x00E8 : 1 , /* ASINH */
0x00E9 : 1 , /* ACOSH */
0x00EA : 1 , /* ATANH */
0x00EB : 3 , /* DGET */
0x00F4 : 1 , /* INFO */
2017-02-19 21:11:48 +00:00
0x00F7 : 4 , /* DB */
2017-02-11 01:58:22 +00:00
0x00FC : 2 , /* FREQUENCY */
0x0101 : 1 , /* EVALUATE */
0x0105 : 1 , /* ERROR.TYPE */
0x010F : 1 , /* GAMMALN */
0x0111 : 4 , /* BINOMDIST */
0x0112 : 2 , /* CHIDIST */
0x0113 : 2 , /* CHIINV */
0x0114 : 2 , /* COMBIN */
0x0115 : 3 , /* CONFIDENCE */
0x0116 : 3 , /* CRITBINOM */
0x0117 : 1 , /* EVEN */
0x0118 : 3 , /* EXPONDIST */
0x0119 : 3 , /* FDIST */
0x011A : 3 , /* FINV */
0x011B : 1 , /* FISHER */
0x011C : 1 , /* FISHERINV */
0x011D : 2 , /* FLOOR */
0x011E : 4 , /* GAMMADIST */
0x011F : 3 , /* GAMMAINV */
0x0120 : 2 , /* CEILING */
0x0121 : 4 , /* HYPGEOMDIST */
0x0122 : 3 , /* LOGNORMDIST */
0x0123 : 3 , /* LOGINV */
0x0124 : 3 , /* NEGBINOMDIST */
0x0125 : 4 , /* NORMDIST */
0x0126 : 1 , /* NORMSDIST */
0x0127 : 3 , /* NORMINV */
0x0128 : 1 , /* NORMSINV */
0x0129 : 3 , /* STANDARDIZE */
0x012A : 1 , /* ODD */
0x012B : 2 , /* PERMUT */
0x012C : 3 , /* POISSON */
0x012D : 3 , /* TDIST */
0x012E : 4 , /* WEIBULL */
0x012F : 2 , /* SUMXMY2 */
0x0130 : 2 , /* SUMX2MY2 */
0x0131 : 2 , /* SUMX2PY2 */
0x0132 : 2 , /* CHITEST */
0x0133 : 2 , /* CORREL */
0x0134 : 2 , /* COVAR */
0x0135 : 3 , /* FORECAST */
0x0136 : 2 , /* FTEST */
0x0137 : 2 , /* INTERCEPT */
0x0138 : 2 , /* PEARSON */
0x0139 : 2 , /* RSQ */
0x013A : 2 , /* STEYX */
0x013B : 2 , /* SLOPE */
0x013C : 4 , /* TTEST */
0x0145 : 2 , /* LARGE */
0x0146 : 2 , /* SMALL */
0x0147 : 2 , /* QUARTILE */
0x0148 : 2 , /* PERCENTILE */
0x014B : 2 , /* TRIMMEAN */
0x014C : 2 , /* TINV */
0x0151 : 2 , /* POWER */
0x0156 : 1 , /* RADIANS */
0x0157 : 1 , /* DEGREES */
0x015A : 2 , /* COUNTIF */
0x015B : 1 , /* COUNTBLANK */
0x015E : 4 , /* ISPMT */
0x015F : 3 , /* DATEDIF */
0x0160 : 1 , /* DATESTRING */
0x0161 : 2 , /* NUMBERSTRING */
0x0168 : 1 , /* PHONETIC */
0x0170 : 1 , /* BAHTTEXT */
0x0171 : 1 , /* THAIDAYOFWEEK */
0x0172 : 1 , /* THAIDIGIT */
0x0173 : 1 , /* THAIMONTHOFYEAR */
0x0174 : 1 , /* THAINUMSOUND */
0x0175 : 1 , /* THAINUMSTRING */
0x0176 : 1 , /* THAISTRINGLENGTH */
0x0177 : 1 , /* ISTHAIDIGIT */
0x0178 : 1 , /* ROUNDBAHTDOWN */
0x0179 : 1 , /* ROUNDBAHTUP */
0x017A : 1 , /* THAIYEAR */
2017-03-11 00:01:58 +00:00
0x017E : 3 , /* CUBEMEMBERPROPERTY */
0x0181 : 1 , /* HEX2DEC */
0x0188 : 1 , /* OCT2DEC */
0x0189 : 1 , /* BIN2DEC */
0x018C : 2 , /* IMSUB */
0x018D : 2 , /* IMDIV */
0x018E : 2 , /* IMPOWER */
0x018F : 1 , /* IMABS */
0x0190 : 1 , /* IMSQRT */
0x0191 : 1 , /* IMLN */
0x0192 : 1 , /* IMLOG2 */
0x0193 : 1 , /* IMLOG10 */
0x0194 : 1 , /* IMSIN */
0x0195 : 1 , /* IMCOS */
0x0196 : 1 , /* IMEXP */
0x0197 : 1 , /* IMARGUMENT */
0x0198 : 1 , /* IMCONJUGATE */
0x0199 : 1 , /* IMAGINARY */
0x019A : 1 , /* IMREAL */
0x019E : 4 , /* SERIESSUM */
0x019F : 1 , /* FACTDOUBLE */
2017-02-19 21:11:48 +00:00
0x01A0 : 1 , /* SQRTPI */
2017-03-11 00:01:58 +00:00
0x01A1 : 2 , /* QUOTIENT */
0x01A4 : 1 , /* ISEVEN */
0x01A5 : 1 , /* ISODD */
0x01A6 : 2 , /* MROUND */
0x01A8 : 1 , /* ERFC */
0x01A9 : 2 , /* BESSELJ */
0x01AA : 2 , /* BESSELK */
0x01AB : 2 , /* BESSELY */
0x01AC : 2 , /* BESSELI */
0x01AE : 3 , /* XNPV */
0x01B6 : 3 , /* TBILLEQ */
0x01B7 : 3 , /* TBILLPRICE */
0x01B8 : 3 , /* TBILLYIELD */
0x01BB : 2 , /* DOLLARDE */
0x01BC : 2 , /* DOLLARFR */
0x01BD : 2 , /* NOMINAL */
0x01BE : 2 , /* EFFECT */
0x01BF : 6 , /* CUMPRINC */
0x01C0 : 6 , /* CUMIPMT */
2017-02-19 21:11:48 +00:00
0x01C1 : 2 , /* EDATE */
0x01C2 : 2 , /* EOMONTH */
2017-03-11 00:01:58 +00:00
0x01D0 : 2 , /* RANDBETWEEN */
0x01D4 : 3 , /* CONVERT */
0x01DC : 2 , /* FVSCHEDULE */
0x01DF : 1 , /* CUBESETCOUNT */
0x01E0 : 2 , /* IFERROR */
2017-02-11 01:58:22 +00:00
0xFFFF : 0
2015-04-02 22:14:07 +00:00
} ;
/* [MS-XLSX] 2.2.3 Functions */
2017-02-19 21:11:48 +00:00
/* [MS-XLSB] 2.5.97.10 Ftab */
2015-04-02 22:14:07 +00:00
var XLSXFutureFunctions = {
"_xlfn.ACOT" : "ACOT" ,
"_xlfn.ACOTH" : "ACOTH" ,
"_xlfn.AGGREGATE" : "AGGREGATE" ,
"_xlfn.ARABIC" : "ARABIC" ,
"_xlfn.AVERAGEIF" : "AVERAGEIF" ,
"_xlfn.AVERAGEIFS" : "AVERAGEIFS" ,
"_xlfn.BASE" : "BASE" ,
"_xlfn.BETA.DIST" : "BETA.DIST" ,
"_xlfn.BETA.INV" : "BETA.INV" ,
"_xlfn.BINOM.DIST" : "BINOM.DIST" ,
"_xlfn.BINOM.DIST.RANGE" : "BINOM.DIST.RANGE" ,
"_xlfn.BINOM.INV" : "BINOM.INV" ,
"_xlfn.BITAND" : "BITAND" ,
"_xlfn.BITLSHIFT" : "BITLSHIFT" ,
"_xlfn.BITOR" : "BITOR" ,
"_xlfn.BITRSHIFT" : "BITRSHIFT" ,
"_xlfn.BITXOR" : "BITXOR" ,
"_xlfn.CEILING.MATH" : "CEILING.MATH" ,
"_xlfn.CEILING.PRECISE" : "CEILING.PRECISE" ,
"_xlfn.CHISQ.DIST" : "CHISQ.DIST" ,
"_xlfn.CHISQ.DIST.RT" : "CHISQ.DIST.RT" ,
"_xlfn.CHISQ.INV" : "CHISQ.INV" ,
"_xlfn.CHISQ.INV.RT" : "CHISQ.INV.RT" ,
"_xlfn.CHISQ.TEST" : "CHISQ.TEST" ,
"_xlfn.COMBINA" : "COMBINA" ,
2017-12-30 05:41:41 +00:00
"_xlfn.CONCAT" : "CONCAT" ,
2015-04-02 22:14:07 +00:00
"_xlfn.CONFIDENCE.NORM" : "CONFIDENCE.NORM" ,
"_xlfn.CONFIDENCE.T" : "CONFIDENCE.T" ,
"_xlfn.COT" : "COT" ,
"_xlfn.COTH" : "COTH" ,
"_xlfn.COUNTIFS" : "COUNTIFS" ,
"_xlfn.COVARIANCE.P" : "COVARIANCE.P" ,
"_xlfn.COVARIANCE.S" : "COVARIANCE.S" ,
"_xlfn.CSC" : "CSC" ,
"_xlfn.CSCH" : "CSCH" ,
"_xlfn.DAYS" : "DAYS" ,
"_xlfn.DECIMAL" : "DECIMAL" ,
"_xlfn.ECMA.CEILING" : "ECMA.CEILING" ,
"_xlfn.ERF.PRECISE" : "ERF.PRECISE" ,
"_xlfn.ERFC.PRECISE" : "ERFC.PRECISE" ,
"_xlfn.EXPON.DIST" : "EXPON.DIST" ,
"_xlfn.F.DIST" : "F.DIST" ,
"_xlfn.F.DIST.RT" : "F.DIST.RT" ,
"_xlfn.F.INV" : "F.INV" ,
"_xlfn.F.INV.RT" : "F.INV.RT" ,
"_xlfn.F.TEST" : "F.TEST" ,
"_xlfn.FILTERXML" : "FILTERXML" ,
"_xlfn.FLOOR.MATH" : "FLOOR.MATH" ,
"_xlfn.FLOOR.PRECISE" : "FLOOR.PRECISE" ,
2017-12-30 05:41:41 +00:00
"_xlfn.FORECAST.ETS" : "FORECAST.ETS" ,
"_xlfn.FORECAST.ETS.CONFINT" : "FORECAST.ETS.CONFINT" ,
"_xlfn.FORECAST.ETS.SEASONALITY" : "FORECAST.ETS.SEASONALITY" ,
"_xlfn.FORECAST.ETS.STAT" : "FORECAST.ETS.STAT" ,
"_xlfn.FORECAST.LINEAR" : "FORECAST.LINEAR" ,
2015-04-02 22:14:07 +00:00
"_xlfn.FORMULATEXT" : "FORMULATEXT" ,
"_xlfn.GAMMA" : "GAMMA" ,
"_xlfn.GAMMA.DIST" : "GAMMA.DIST" ,
"_xlfn.GAMMA.INV" : "GAMMA.INV" ,
"_xlfn.GAMMALN.PRECISE" : "GAMMALN.PRECISE" ,
"_xlfn.GAUSS" : "GAUSS" ,
"_xlfn.HYPGEOM.DIST" : "HYPGEOM.DIST" ,
"_xlfn.IFERROR" : "IFERROR" ,
2017-12-30 05:41:41 +00:00
"_xlfn.IFNA" : "IFNA" ,
2018-01-23 09:09:53 +00:00
"_xlfn.IFS" : "IFS" ,
2015-04-02 22:14:07 +00:00
"_xlfn.IMCOSH" : "IMCOSH" ,
"_xlfn.IMCOT" : "IMCOT" ,
"_xlfn.IMCSC" : "IMCSC" ,
"_xlfn.IMCSCH" : "IMCSCH" ,
"_xlfn.IMSEC" : "IMSEC" ,
"_xlfn.IMSECH" : "IMSECH" ,
"_xlfn.IMSINH" : "IMSINH" ,
"_xlfn.IMTAN" : "IMTAN" ,
"_xlfn.ISFORMULA" : "ISFORMULA" ,
"_xlfn.ISO.CEILING" : "ISO.CEILING" ,
"_xlfn.ISOWEEKNUM" : "ISOWEEKNUM" ,
"_xlfn.LOGNORM.DIST" : "LOGNORM.DIST" ,
"_xlfn.LOGNORM.INV" : "LOGNORM.INV" ,
2017-12-30 05:41:41 +00:00
"_xlfn.MAXIFS" : "MAXIFS" ,
"_xlfn.MINIFS" : "MINIFS" ,
2015-04-02 22:14:07 +00:00
"_xlfn.MODE.MULT" : "MODE.MULT" ,
"_xlfn.MODE.SNGL" : "MODE.SNGL" ,
"_xlfn.MUNIT" : "MUNIT" ,
"_xlfn.NEGBINOM.DIST" : "NEGBINOM.DIST" ,
"_xlfn.NETWORKDAYS.INTL" : "NETWORKDAYS.INTL" ,
"_xlfn.NIGBINOM" : "NIGBINOM" ,
"_xlfn.NORM.DIST" : "NORM.DIST" ,
"_xlfn.NORM.INV" : "NORM.INV" ,
"_xlfn.NORM.S.DIST" : "NORM.S.DIST" ,
"_xlfn.NORM.S.INV" : "NORM.S.INV" ,
"_xlfn.NUMBERVALUE" : "NUMBERVALUE" ,
"_xlfn.PDURATION" : "PDURATION" ,
"_xlfn.PERCENTILE.EXC" : "PERCENTILE.EXC" ,
"_xlfn.PERCENTILE.INC" : "PERCENTILE.INC" ,
"_xlfn.PERCENTRANK.EXC" : "PERCENTRANK.EXC" ,
"_xlfn.PERCENTRANK.INC" : "PERCENTRANK.INC" ,
"_xlfn.PERMUTATIONA" : "PERMUTATIONA" ,
"_xlfn.PHI" : "PHI" ,
"_xlfn.POISSON.DIST" : "POISSON.DIST" ,
"_xlfn.QUARTILE.EXC" : "QUARTILE.EXC" ,
"_xlfn.QUARTILE.INC" : "QUARTILE.INC" ,
"_xlfn.QUERYSTRING" : "QUERYSTRING" ,
"_xlfn.RANK.AVG" : "RANK.AVG" ,
"_xlfn.RANK.EQ" : "RANK.EQ" ,
"_xlfn.RRI" : "RRI" ,
"_xlfn.SEC" : "SEC" ,
"_xlfn.SECH" : "SECH" ,
"_xlfn.SHEET" : "SHEET" ,
"_xlfn.SHEETS" : "SHEETS" ,
"_xlfn.SKEW.P" : "SKEW.P" ,
"_xlfn.STDEV.P" : "STDEV.P" ,
"_xlfn.STDEV.S" : "STDEV.S" ,
"_xlfn.SUMIFS" : "SUMIFS" ,
2018-01-23 09:09:53 +00:00
"_xlfn.SWITCH" : "SWITCH" ,
2015-04-02 22:14:07 +00:00
"_xlfn.T.DIST" : "T.DIST" ,
"_xlfn.T.DIST.2T" : "T.DIST.2T" ,
"_xlfn.T.DIST.RT" : "T.DIST.RT" ,
"_xlfn.T.INV" : "T.INV" ,
"_xlfn.T.INV.2T" : "T.INV.2T" ,
"_xlfn.T.TEST" : "T.TEST" ,
2017-12-30 05:41:41 +00:00
"_xlfn.TEXTJOIN" : "TEXTJOIN" ,
2015-04-02 22:14:07 +00:00
"_xlfn.UNICHAR" : "UNICHAR" ,
"_xlfn.UNICODE" : "UNICODE" ,
"_xlfn.VAR.P" : "VAR.P" ,
"_xlfn.VAR.S" : "VAR.S" ,
"_xlfn.WEBSERVICE" : "WEBSERVICE" ,
"_xlfn.WEIBULL.DIST" : "WEIBULL.DIST" ,
"_xlfn.WORKDAY.INTL" : "WORKDAY.INTL" ,
"_xlfn.XOR" : "XOR" ,
"_xlfn.Z.TEST" : "Z.TEST"
} ;
2017-03-10 00:36:03 +00:00
/* Part 3 TODO: actually parse formulae */
function ods _to _csf _formula ( f ) {
2018-01-23 09:09:53 +00:00
if ( f . slice ( 0 , 3 ) == "of:" ) f = f . slice ( 3 ) ;
2017-03-10 00:36:03 +00:00
/* 5.2 Basic Expressions */
if ( f . charCodeAt ( 0 ) == 61 ) {
2018-01-23 09:09:53 +00:00
f = f . slice ( 1 ) ;
if ( f . charCodeAt ( 0 ) == 61 ) f = f . slice ( 1 ) ;
2017-03-10 00:36:03 +00:00
}
2017-03-20 21:57:44 +00:00
f = f . replace ( /COM\.MICROSOFT\./g , "" ) ;
2017-03-10 00:36:03 +00:00
/* Part 3 Section 5.8 References */
2017-03-20 21:57:44 +00:00
f = f . replace ( /\[((?:\.[A-Z]+[0-9]+)(?::\.[A-Z]+[0-9]+)?)\]/g , function ( $$ , $1 ) { return $1 . replace ( /\./g , "" ) ; } ) ;
/* TODO: something other than this */
f = f . replace ( /\[.(#[A-Z]*[?!])\]/g , "$1" ) ;
return f . replace ( /[;~]/g , "," ) . replace ( /\|/g , ";" ) ;
}
function csf _to _ods _formula ( f ) {
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 00:36:03 +00:00
}
2017-04-16 07:35:56 +00:00
2017-12-15 02:01:07 +00:00
function ods _to _csf _3D ( r ) {
2017-04-16 07:35:56 +00:00
var a = r . split ( ":" ) ;
var s = a [ 0 ] . split ( "." ) [ 0 ] ;
2017-12-15 02:01:07 +00:00
return [ s , a [ 0 ] . split ( "." ) [ 1 ] + ( a . length > 1 ? ( ":" + ( a [ 1 ] . split ( "." ) [ 1 ] || a [ 1 ] . split ( "." ) [ 0 ] ) ) : "" ) ] ;
2017-04-16 07:35:56 +00:00
}
2017-12-15 02:01:07 +00:00
function csf _to _ods _3D ( r ) {
return r . replace ( /\./ , "!" ) ;
}
2014-01-28 16:35:26 +00:00
var strs = { } ; // shared strings
var _ssfopts = { } ; // spreadsheet formatting options
2012-12-03 19:47:44 +00:00
2017-03-28 22:07:46 +00:00
RELS . WS = [
"http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet" ,
"http://purl.oclc.org/ooxml/officeDocument/relationships/worksheet"
] ;
2014-05-16 00:16:51 +00:00
2018-06-22 21:40:52 +00:00
/*global Map */
var browser _has _Map = typeof Map !== 'undefined' ;
function get _sst _id ( sst , str , rev ) {
var i = 0 , len = sst . length ;
if ( rev ) {
if ( browser _has _Map ? rev . has ( str ) : rev . hasOwnProperty ( str ) ) {
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 } ) ; sst . Count ++ ; sst . Unique ++ ;
if ( rev ) {
if ( browser _has _Map ) {
if ( ! rev . has ( str ) ) rev . set ( str , [ ] ) ;
rev . get ( str ) . push ( len ) ;
} else {
if ( ! rev . hasOwnProperty ( str ) ) rev [ str ] = [ ] ;
rev [ str ] . push ( len ) ;
}
}
return len ;
2014-05-16 00:16:51 +00:00
}
2017-03-28 22:07:46 +00:00
function col _obj _w ( C , col ) {
var p = ( { min : C + 1 , max : C + 1 } ) ;
/* wch (chars), wpx (pixels) */
2017-04-30 16:28:24 +00:00
var wch = - 1 ;
2017-03-28 22:07:46 +00:00
if ( col . MDW ) MDW = col . MDW ;
if ( col . width != null ) p . customWidth = 1 ;
2017-04-30 16:28:24 +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 ;
2017-03-28 22:07:46 +00:00
return p ;
}
2017-04-16 07:35:56 +00:00
function default _margins ( margins , mode ) {
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 ] ;
}
2014-05-16 00:16:51 +00:00
function get _cell _style ( styles , cell , opts ) {
2014-06-29 18:35:10 +00:00
var z = opts . revssf [ cell . z != null ? cell . z : "General" ] ;
2017-05-09 18:11:15 +00:00
var i = 0x3c , len = styles . length ;
if ( z == null && opts . ssf ) {
for ( ; i < 0x188 ; ++ i ) if ( opts . ssf [ i ] == null ) {
SSF . load ( cell . z , i ) ;
2017-12-30 05:41:41 +00:00
// $FlowIgnore
2017-05-09 18:11:15 +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 ;
2014-07-28 15:32:28 +00:00
styles [ len ] = {
2014-05-16 00:16:51 +00:00
numFmtId : z ,
fontId : 0 ,
fillId : 0 ,
borderId : 0 ,
xfId : 0 ,
applyNumberFormat : 1
} ;
2014-07-28 15:32:28 +00:00
return len ;
2014-05-16 00:16:51 +00:00
}
2014-06-02 05:16:51 +00:00
2017-03-20 21:57:44 +00:00
function safe _format ( p , fmtid , fillid , opts , themes , styles ) {
2017-03-16 04:39:50 +00:00
if ( p . t === 'z' ) return ;
2017-03-23 01:56:21 +00:00
if ( p . t === 'd' && typeof p . v === 'string' ) p . v = parseDate ( p . v ) ;
2014-06-02 05:16:51 +00:00
try {
2017-04-21 22:03:40 +00:00
if ( opts . cellNF ) p . z = SSF . _table [ fmtid ] ;
} catch ( e ) { if ( opts . WTF ) throw e ; }
if ( ! opts || opts . cellText !== false ) try {
2018-02-14 05:26:28 +00:00
if ( SSF . _table [ fmtid ] == null ) SSF . load ( SSFImplicit [ fmtid ] || "General" , fmtid ) ;
2014-10-26 05:09:58 +00:00
if ( p . t === 'e' ) p . w = p . w || BErr [ p . v ] ;
else if ( fmtid === 0 ) {
2014-06-29 18:35:10 +00:00
if ( p . t === 'n' ) {
2017-07-28 23:54:51 +00:00
if ( ( p . v | 0 ) === p . v ) p . w = SSF . _general _int ( p . v ) ;
else p . w = SSF . _general _num ( p . v ) ;
2014-06-29 18:35:10 +00:00
}
2014-10-26 05:09:58 +00:00
else if ( p . t === 'd' ) {
var dd = datenum ( p . v ) ;
2017-07-28 23:54:51 +00:00
if ( ( dd | 0 ) === dd ) p . w = SSF . _general _int ( dd ) ;
else p . w = SSF . _general _num ( dd ) ;
2014-10-26 05:09:58 +00:00
}
2014-06-29 18:35:10 +00:00
else if ( p . v === undefined ) return "" ;
else p . w = SSF . _general ( p . v , _ssfopts ) ;
}
2014-10-26 05:09:58 +00:00
else if ( p . t === 'd' ) p . w = SSF . format ( fmtid , datenum ( p . v ) , _ssfopts ) ;
2014-06-29 18:35:10 +00:00
else p . w = SSF . format ( fmtid , p . v , _ssfopts ) ;
2014-06-02 05:16:51 +00:00
} catch ( e ) { if ( opts . WTF ) throw e ; }
2017-08-05 06:58:40 +00:00
if ( ! opts . cellStyles ) return ;
if ( fillid != null ) try {
2014-06-02 05:16:51 +00:00
p . s = styles . Fills [ fillid ] ;
2017-05-09 18:11:15 +00:00
if ( p . s . fgColor && p . s . fgColor . theme && ! p . s . fgColor . rgb ) {
2014-06-02 05:16:51 +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:58:40 +00:00
} catch ( e ) { if ( opts . WTF && styles . Fills ) throw e ; }
2014-06-02 05:16:51 +00:00
}
2018-04-27 20:12:36 +00:00
function check _ws ( ws , sname , i ) {
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' ] ) ;
}
}
2014-06-29 18:35:10 +00:00
function parse _ws _xml _dim ( ws , s ) {
var d = safe _decode _range ( s ) ;
2014-07-28 15:32:28 +00:00
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 ) ;
2014-06-29 18:35:10 +00:00
}
2017-03-20 21:57:44 +00:00
var mergecregex = /<(?:\w:)?mergeCell ref="[A-Z0-9:]+"\s*[\/]?>/g ;
2017-06-24 06:48:44 +00:00
var sheetdataregex = /<(?:\w+:)?sheetData>([\s\S]*)<\/(?:\w+:)?sheetData>/ ;
2017-04-09 04:07:43 +00:00
var hlinkregex = /<(?:\w:)?hyperlink [^>]*>/mg ;
2014-07-28 15:32:28 +00:00
var dimregex = /"(\w*:\w*)"/ ;
2017-04-09 04:07:43 +00:00
var colregex = /<(?:\w:)?col[^>]*[\/]?>/g ;
2017-06-24 06:48:44 +00:00
var afregex = /<(?:\w:)?autoFilter[^>]*([\/]|>([\s\S]*)<\/(?:\w:)?autoFilter)>/g ;
2017-04-16 07:35:56 +00:00
var marginregex = /<(?:\w:)?pageMargins[^>]*\/>/g ;
2017-11-20 02:13:37 +00:00
var sheetprregex = /<(?:\w:)?sheetPr(?:[^>a-z][^>]*)?\/>/ ;
2017-12-30 05:41:41 +00:00
var svsregex = /<(?:\w:)?sheetViews[^>]*(?:[\/]|>([\s\S]*)<\/(?:\w:)?sheetViews)>/ ;
2014-01-28 16:35:26 +00:00
/* 18.3 Worksheets */
2017-11-20 02:13:37 +00:00
function parse _ws _xml ( data , opts , idx , rels , wb , themes , styles ) {
2014-01-28 16:35:26 +00:00
if ( ! data ) return data ;
2017-04-09 04:07:43 +00:00
if ( DENSE != null && opts . dense == null ) opts . dense = DENSE ;
2017-04-16 07:35:56 +00:00
2014-01-28 16:35:26 +00:00
/* 18.3.1.99 worksheet CT_Worksheet */
2017-04-09 04:07:43 +00:00
var s = opts . dense ? ( [ ] ) : ( { } ) ;
2017-04-16 07:35:56 +00:00
var refguess = ( { s : { r : 2000000 , c : 2000000 } , e : { r : 0 , c : 0 } } ) ;
var data1 = "" , data2 = "" ;
2017-06-10 01:56:23 +00:00
var mtch = data . match ( sheetdataregex ) ;
2017-04-16 07:35:56 +00:00
if ( mtch ) {
2018-01-23 09:09:53 +00:00
data1 = data . slice ( 0 , mtch . index ) ;
data2 = data . slice ( mtch . index + mtch [ 0 ] . length ) ;
2017-04-16 07:35:56 +00:00
} else data1 = data2 = data ;
2014-01-28 16:35:26 +00:00
2017-11-20 02:13:37 +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 ) ;
2017-12-30 05:41:41 +00:00
/* 18.3.1.35 dimension CT_SheetDimension */
2017-02-11 01:58:22 +00:00
// $FlowIgnore
2017-04-16 07:35:56 +00:00
var ridx = ( data1 . match ( /<(?:\w*:)?dimension/ ) || { index : - 1 } ) . index ;
2014-06-29 18:35:10 +00:00
if ( ridx > 0 ) {
2018-01-23 09:09:53 +00:00
var ref = data1 . slice ( ridx , ridx + 50 ) . match ( dimregex ) ;
2017-04-16 07:35:56 +00:00
if ( ref ) parse _ws _xml _dim ( s , ref [ 1 ] ) ;
2014-06-29 18:35:10 +00:00
}
2014-01-28 16:35:26 +00:00
2017-12-30 05:41:41 +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 ) ;
2014-06-02 05:16:51 +00:00
/* 18.3.1.17 cols CT_Cols */
var columns = [ ] ;
2017-02-11 01:58:22 +00:00
if ( opts . cellStyles ) {
2014-06-02 05:16:51 +00:00
/* 18.3.1.13 col CT_Col */
2017-04-16 07:35:56 +00:00
var cols = data1 . match ( colregex ) ;
2017-02-11 01:58:22 +00:00
if ( cols ) parse _ws _xml _cols ( columns , cols ) ;
2014-06-02 05:16:51 +00:00
}
2014-01-28 16:35:26 +00:00
/* 18.3.1.80 sheetData CT_SheetData ? */
2017-03-20 21:57:44 +00:00
if ( mtch ) parse _ws _xml _data ( mtch [ 1 ] , s , opts , refguess , themes , styles ) ;
2014-04-15 08:24:40 +00:00
2017-04-16 07:35:56 +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:41:41 +00:00
var merges = [ ] ;
var _merge = data2 . match ( mergecregex ) ;
if ( _merge ) for ( ridx = 0 ; ridx != _merge . length ; ++ ridx )
2018-01-23 09:09:53 +00:00
merges [ ridx ] = safe _decode _range ( _merge [ ridx ] . slice ( _merge [ ridx ] . indexOf ( "\"" ) + 1 ) ) ;
2017-04-16 07:35:56 +00:00
2014-04-15 08:24:40 +00:00
/* 18.3.1.48 hyperlinks CT_Hyperlinks */
2017-04-16 07:35:56 +00:00
var hlink = data2 . match ( hlinkregex ) ;
2017-02-11 01:58:22 +00:00
if ( hlink ) parse _ws _xml _hlinks ( s , hlink , rels ) ;
2014-04-15 08:24:40 +00:00
2017-04-16 07:35:56 +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 ] ) ) ;
2014-03-29 22:53:44 +00:00
if ( ! s [ "!ref" ] && refguess . e . c >= refguess . s . c && refguess . e . r >= refguess . s . r ) s [ "!ref" ] = encode _range ( refguess ) ;
2014-06-29 18:35:10 +00:00
if ( opts . sheetRows > 0 && s [ "!ref" ] ) {
var tmpref = safe _decode _range ( s [ "!ref" ] ) ;
2018-04-06 06:36:52 +00:00
if ( opts . sheetRows <= + tmpref . e . r ) {
2014-02-19 03:04:34 +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 ) ;
}
}
2014-06-02 05:16:51 +00:00
if ( columns . length > 0 ) s [ "!cols" ] = columns ;
2017-12-30 05:41:41 +00:00
if ( merges . length > 0 ) s [ "!merges" ] = merges ;
2014-01-28 16:35:26 +00:00
return s ;
}
2014-08-26 17:44:30 +00:00
function write _ws _xml _merges ( merges ) {
2017-10-17 00:36:51 +00:00
if ( merges . length === 0 ) return "" ;
2014-08-26 17:44:30 +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>' ;
}
2014-06-02 05:16:51 +00:00
2017-11-20 02:13:37 +00:00
/* 18.3.1.82-3 sheetPr CT_ChartsheetPr / CT_SheetPr */
function parse _ws _xml _sheetpr ( sheetPr , s , wb , idx ) {
var data = parsexmltag ( sheetPr ) ;
if ( ! wb . Sheets [ idx ] ) wb . Sheets [ idx ] = { } ;
if ( data . codeName ) wb . Sheets [ idx ] . CodeName = data . codeName ;
}
/* 18.3.1.85 sheetProtection CT_SheetProtection */
2017-04-09 04:07:43 +00:00
function write _ws _xml _protection ( sp ) {
// algorithmName, hashValue, saltValue, spinCountpassword
var o = ( { sheet : 1 } ) ;
var deffalse = [ "objects" , "scenarios" , "selectLockedCells" , "selectUnlockedCells" ] ;
var deftrue = [
"formatColumns" , "formatRows" , "formatCells" ,
"insertColumns" , "insertRows" , "insertHyperlinks" ,
"deleteColumns" , "deleteRows" ,
"sort" , "autoFilter" , "pivotTables"
] ;
deffalse . forEach ( function ( n ) { if ( sp [ n ] != null && sp [ n ] ) o [ n ] = "1" ; } ) ;
deftrue . forEach ( function ( n ) { if ( sp [ n ] != null && ! sp [ n ] ) o [ n ] = "0" ; } ) ;
/* TODO: algorithm */
if ( sp . password ) o . password = crypto _CreatePasswordVerifier _Method1 ( sp . password ) . toString ( 16 ) . toUpperCase ( ) ;
return writextag ( 'sheetProtection' , null , o ) ;
}
2014-06-29 18:35:10 +00:00
function parse _ws _xml _hlinks ( s , data , rels ) {
2017-04-09 04:07:43 +00:00
var dense = Array . isArray ( s ) ;
2014-06-29 18:35:10 +00:00
for ( var i = 0 ; i != data . length ; ++ i ) {
2017-06-24 06:48:44 +00:00
var val = parsexmltag ( utf8read ( data [ i ] ) , true ) ;
2014-06-05 07:07:10 +00:00
if ( ! val . ref ) return ;
2017-12-15 02:01:07 +00:00
var rel = ( ( rels || { } ) [ '!id' ] || [ ] ) [ val . id ] ;
2014-06-05 07:07:10 +00:00
if ( rel ) {
val . Target = rel . Target ;
if ( val . location ) val . Target += "#" + val . location ;
2015-04-02 22:14:07 +00:00
} else {
2017-12-15 02:01:07 +00:00
val . Target = "#" + val . location ;
rel = { Target : val . Target , TargetMode : 'Internal' } ;
2014-06-05 07:07:10 +00:00
}
2017-12-15 02:01:07 +00:00
val . Rel = rel ;
2017-03-28 22:07:46 +00:00
if ( val . tooltip ) { val . Tooltip = val . tooltip ; delete val . tooltip ; }
2014-06-29 18:35:10 +00:00
var rng = safe _decode _range ( val . ref ) ;
2014-06-05 07:07:10 +00:00
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-09 04:07:43 +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 ;
}
2014-06-05 07:07:10 +00:00
}
2014-06-29 18:35:10 +00:00
}
}
2014-06-05 07:07:10 +00:00
2017-04-16 07:35:56 +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-04-21 22:03:40 +00:00
function write _ws _xml _margins ( margin ) {
default _margins ( margin ) ;
return writextag ( 'pageMargins' , null , margin ) ;
}
2017-04-16 07:35:56 +00:00
2014-06-29 18:35:10 +00:00
function parse _ws _xml _cols ( columns , cols ) {
2014-06-05 07:07:10 +00:00
var seencol = false ;
for ( var coli = 0 ; coli != cols . length ; ++ coli ) {
var coll = parsexmltag ( cols [ coli ] , true ) ;
2017-04-30 16:28:24 +00:00
if ( coll . hidden ) coll . hidden = parsexmlbool ( coll . hidden ) ;
2014-06-29 18:35:10 +00:00
var colm = parseInt ( coll . min , 10 ) - 1 , colM = parseInt ( coll . max , 10 ) - 1 ;
2017-03-20 21:57:44 +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 ) ;
2014-06-05 07:07:10 +00:00
}
2014-06-29 18:35:10 +00:00
}
2014-06-05 07:07:10 +00:00
2014-06-29 18:35:10 +00:00
function write _ws _xml _cols ( ws , cols ) {
2018-01-23 09:09:53 +00:00
var o = [ "<cols>" ] , col ;
2014-06-05 07:07:10 +00:00
for ( var i = 0 ; i != cols . length ; ++ i ) {
if ( ! ( col = cols [ i ] ) ) continue ;
2017-03-28 22:07:46 +00:00
o [ o . length ] = ( writextag ( 'col' , null , col _obj _w ( i , col ) ) ) ;
2014-06-05 07:07:10 +00:00
}
2014-06-29 18:35:10 +00:00
o [ o . length ] = "</cols>" ;
2014-06-05 07:07:10 +00:00
return o . join ( "" ) ;
2014-06-29 18:35:10 +00:00
}
2014-05-16 00:16:51 +00:00
2017-04-16 07:35:56 +00:00
function parse _ws _xml _autofilter ( data ) {
var o = { ref : ( data . match ( /ref="([^"]*)"/ ) || [ ] ) [ 1 ] } ;
return o ;
}
function write _ws _xml _autofilter ( data ) {
return writextag ( "autoFilter" , null , { ref : data . ref } ) ;
}
2017-04-30 16:28:24 +00:00
/* 18.3.1.88 sheetViews CT_SheetViews */
/* 18.3.1.87 sheetView CT_SheetView */
2017-12-30 05:41:41 +00:00
var sviewregex = /<(?:\w:)?sheetView(?:[^>a-z][^>]*)?\/>/ ;
function parse _ws _xml _sheetviews ( data , wb ) {
( data . match ( sviewregex ) || [ ] ) . forEach ( function ( r ) {
var tag = parsexmltag ( r ) ;
if ( parsexmlbool ( tag . rightToLeft ) ) {
if ( ! wb . Views ) wb . Views = [ { } ] ;
if ( ! wb . Views [ 0 ] ) wb . Views [ 0 ] = { } ;
wb . Views [ 0 ] . RTL = true ;
}
} ) ;
}
2017-04-30 16:28:24 +00:00
function write _ws _xml _sheetviews ( ws , opts , idx , wb ) {
2017-12-25 02:44:14 +00:00
var sview = { workbookViewId : "0" } ;
// $FlowIgnore
if ( ( ( ( wb || { } ) . Workbook || { } ) . Views || [ ] ) [ 0 ] ) sview . rightToLeft = wb . Workbook . Views [ 0 ] . RTL ? "1" : "0" ;
return writextag ( "sheetViews" , writextag ( "sheetView" , null , sview ) , { } ) ;
2017-04-30 16:28:24 +00:00
}
2018-01-23 09:09:53 +00:00
function write _ws _xml _cell ( cell , ref , ws , opts ) {
2017-03-20 21:57:44 +00:00
if ( cell . v === undefined && cell . f === undefined || cell . t === 'z' ) return "" ;
2014-06-29 18:35:10 +00:00
var vv = "" ;
2014-10-26 05:09:58 +00:00
var oldt = cell . t , oldv = cell . v ;
2014-06-29 18:35:10 +00:00
switch ( cell . t ) {
case 'b' : vv = cell . v ? "1" : "0" ; break ;
2014-10-26 05:09:58 +00:00
case 'n' : vv = '' + cell . v ; break ;
case 'e' : vv = BErr [ cell . v ] ; break ;
case 'd' :
2017-06-03 07:23:15 +00:00
if ( opts . cellDates ) vv = parseDate ( cell . v , - 1 ) . toISOString ( ) ;
2014-10-26 05:09:58 +00:00
else {
2017-10-17 00:36:51 +00:00
cell = dup ( cell ) ;
2014-10-26 05:09:58 +00:00
cell . t = 'n' ;
2017-03-23 01:56:21 +00:00
vv = '' + ( cell . v = datenum ( parseDate ( cell . v ) ) ) ;
2014-10-26 05:09:58 +00:00
}
2017-05-11 18:57:52 +00:00
if ( typeof cell . z === 'undefined' ) cell . z = SSF . _table [ 14 ] ;
2014-10-26 05:09:58 +00:00
break ;
2014-06-29 18:35:10 +00:00
default : vv = cell . v ; break ;
}
2017-02-11 01:58:22 +00:00
var v = writetag ( 'v' , escapexml ( vv ) ) , o = ( { r : ref } ) ;
2014-05-16 00:16:51 +00:00
/* TODO: cell style */
2014-06-29 18:35:10 +00:00
var os = get _cell _style ( opts . cellXfs , cell , opts ) ;
if ( os !== 0 ) o . s = os ;
2014-05-16 00:16:51 +00:00
switch ( cell . t ) {
2014-07-28 15:32:28 +00:00
case 'n' : break ;
2014-10-26 05:09:58 +00:00
case 'd' : o . t = "d" ; break ;
2014-07-28 15:32:28 +00:00
case 'b' : o . t = "b" ; break ;
case 'e' : o . t = "e" ; break ;
2017-03-20 21:57:44 +00:00
default : if ( cell . v == null ) { delete cell . t ; break ; }
2014-05-16 00:16:51 +00:00
if ( opts . bookSST ) {
2018-06-22 21:40:52 +00:00
v = writetag ( 'v' , '' + get _sst _id ( opts . Strings , cell . v , opts . revStrings ) ) ;
2014-06-29 18:35:10 +00:00
o . t = "s" ; break ;
2014-06-05 07:07:10 +00:00
}
2014-06-29 18:35:10 +00:00
o . t = "str" ; break ;
2014-05-16 00:16:51 +00:00
}
2014-10-26 05:09:58 +00:00
if ( cell . t != oldt ) { cell . t = oldt ; cell . v = oldv ; }
2017-03-20 21:57:44 +00:00
if ( cell . f ) {
2018-01-23 09:09:53 +00:00
var ff = cell . F && cell . F . slice ( 0 , ref . length ) == ref ? { t : "array" , ref : cell . F } : null ;
2017-03-20 21:57:44 +00:00
v = writextag ( 'f' , escapexml ( cell . f ) , ff ) + ( cell . v != null ? v : "" ) ;
}
2017-03-31 21:50:32 +00:00
if ( cell . l ) ws [ '!links' ] . push ( [ ref , cell . l ] ) ;
2017-04-03 06:04:35 +00:00
if ( cell . c ) ws [ '!comments' ] . push ( [ ref , cell . c ] ) ;
2014-06-29 18:35:10 +00:00
return writextag ( 'c' , v , o ) ;
}
2017-12-30 05:41:41 +00:00
var parse _ws _xml _data = ( function ( ) {
2014-10-10 02:12:25 +00:00
var cellregex = /<(?:\w+:)?c[ >]/ , rowregex = /<\/(?:\w+:)?row>/ ;
2017-02-11 01:58:22 +00:00
var rregex = /r=["']([^"']*)["']/ , isregex = /<(?:\w+:)?is>([\S\s]*?)<\/(?:\w+:)?is>/ ;
2017-02-19 21:11:48 +00:00
var refregex = /ref=["']([^"']*)["']/ ;
2014-06-29 18:35:10 +00:00
var match _v = matchtag ( "v" ) , match _f = matchtag ( "f" ) ;
2017-03-20 21:57:44 +00:00
return function parse _ws _xml _data ( sdata , s , opts , guess , themes , styles ) {
2017-04-30 16:28:24 +00:00
var ri = 0 , x = "" , cells = [ ] , cref = [ ] , idx = 0 , i = 0 , cc = 0 , d = "" , p ;
2014-10-10 02:12:25 +00:00
var tag , tagr = 0 , tagc = 0 ;
2017-02-19 21:11:48 +00:00
var sstr , ftag ;
2017-07-05 21:02:14 +00:00
var fmtid = 0 , fillid = 0 ;
var do _format = Array . isArray ( styles . CellXf ) , cf ;
2017-02-19 21:11:48 +00:00
var arrayf = [ ] ;
var sharedf = [ ] ;
2017-04-09 04:07:43 +00:00
var dense = Array . isArray ( s ) ;
2017-04-30 16:28:24 +00:00
var rows = [ ] , rowobj = { } , rowrite = false ;
2014-07-28 15:32:28 +00:00
for ( var marr = sdata . split ( rowregex ) , mt = 0 , marrlen = marr . length ; mt != marrlen ; ++ mt ) {
2014-06-29 18:35:10 +00:00
x = marr [ mt ] . trim ( ) ;
2014-07-28 15:32:28 +00:00
var xlen = x . length ;
if ( xlen === 0 ) continue ;
2014-06-29 18:35:10 +00:00
/* 18.3.1.73 row CT_Row */
2014-07-28 15:32:28 +00:00
for ( ri = 0 ; ri < xlen ; ++ ri ) if ( x . charCodeAt ( ri ) === 62 ) break ; ++ ri ;
2018-01-23 09:09:53 +00:00
tag = parsexmltag ( x . slice ( 0 , ri ) , true ) ;
2017-04-30 16:28:24 +00:00
tagr = tag . r != null ? parseInt ( tag . r , 10 ) : tagr + 1 ; tagc = - 1 ;
2014-07-28 15:32:28 +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 ;
2014-06-29 18:35:10 +00:00
2017-04-30 16:28:24 +00:00
if ( opts && opts . cellStyles ) {
rowobj = { } ; rowrite = false ;
if ( tag . ht ) { rowrite = true ; rowobj . hpt = parseFloat ( tag . ht ) ; rowobj . hpx = pt2px ( rowobj . hpt ) ; }
if ( tag . hidden == "1" ) { rowrite = true ; rowobj . hidden = true ; }
2017-07-10 22:29:24 +00:00
if ( tag . outlineLevel != null ) { rowrite = true ; rowobj . level = + tag . outlineLevel ; }
2017-04-30 16:28:24 +00:00
if ( rowrite ) rows [ tagr - 1 ] = rowobj ;
}
2014-06-29 18:35:10 +00:00
/* 18.3.1.4 c CT_Cell */
2018-01-23 09:09:53 +00:00
cells = x . slice ( ri ) . split ( cellregex ) ;
2017-02-22 07:48:52 +00:00
for ( ri = 0 ; ri != cells . length ; ++ ri ) {
2014-06-29 18:35:10 +00:00
x = cells [ ri ] . trim ( ) ;
if ( x . length === 0 ) continue ;
cref = x . match ( rregex ) ; idx = ri ; i = 0 ; cc = 0 ;
2018-01-23 09:09:53 +00:00
x = "<c " + ( x . slice ( 0 , 1 ) == "<" ? ">" : "" ) + x ;
2017-02-11 01:58:22 +00:00
if ( cref != null && cref . length === 2 ) {
2014-06-29 18:35:10 +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 ;
2014-10-10 02:12:25 +00:00
tagc = idx ;
} else ++ tagc ;
2014-06-29 18:35:10 +00:00
for ( i = 0 ; i != x . length ; ++ i ) if ( x . charCodeAt ( i ) === 62 ) break ; ++ i ;
2018-01-23 09:09:53 +00:00
tag = parsexmltag ( x . slice ( 0 , i ) , true ) ;
2017-04-21 22:03:40 +00:00
if ( ! tag . r ) tag . r = encode _cell ( { r : tagr - 1 , c : tagc } ) ;
2018-01-23 09:09:53 +00:00
d = x . slice ( i ) ;
2017-02-11 01:58:22 +00:00
p = ( { t : "" } ) ;
2014-06-29 18:35:10 +00:00
2017-02-11 01:58:22 +00:00
if ( ( cref = d . match ( match _v ) ) != null && cref [ 1 ] !== '' ) p . v = unescapexml ( cref [ 1 ] ) ;
2017-02-19 21:11:48 +00:00
if ( opts . cellFormula ) {
if ( ( cref = d . match ( match _f ) ) != null && cref [ 1 ] !== '' ) {
2017-03-20 21:57:44 +00:00
/* TODO: match against XLSXFutureFunctions */
2017-12-30 05:41:41 +00:00
p . f = _xlfn ( unescapexml ( utf8read ( cref [ 1 ] ) ) ) ;
2017-02-19 21:11:48 +00:00
if ( 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 [ 0 ] . indexOf ( 't="shared"' ) > - 1 ) {
// TODO: parse formula
ftag = parsexmltag ( cref [ 0 ] ) ;
2017-12-30 05:41:41 +00:00
sharedf [ parseInt ( ftag . si , 10 ) ] = [ ftag , _xlfn ( unescapexml ( utf8read ( cref [ 1 ] ) ) ) ] ;
2017-02-19 21:11:48 +00:00
}
} else if ( ( cref = d . match ( /<f[^>]*\/>/ ) ) ) {
ftag = parsexmltag ( cref [ 0 ] ) ;
if ( sharedf [ ftag . si ] ) p . f = shift _formula _xlsx ( sharedf [ ftag . si ] [ 1 ] , sharedf [ ftag . si ] [ 0 ] . ref , tag . r ) ;
}
/* 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 ] ;
}
2014-06-29 18:35:10 +00:00
2017-04-30 16:28:24 +00:00
if ( tag . t == null && p . v === undefined ) {
2017-05-11 18:57:52 +00:00
if ( p . f || p . F ) {
p . v = 0 ; p . t = "n" ;
} else if ( ! opts . sheetStubs ) continue ;
else p . t = "z" ;
2014-06-29 18:35:10 +00:00
}
else p . t = tag . t || "n" ;
2018-07-25 06:43:29 +00:00
if ( guess . s . c > tagc ) guess . s . c = tagc ;
if ( guess . e . c < tagc ) guess . e . c = tagc ;
2014-06-29 18:35:10 +00:00
/* 18.18.11 t ST_CellType */
switch ( p . t ) {
2017-03-23 01:56:21 +00:00
case 'n' :
2017-11-20 02:13:37 +00:00
if ( p . v == "" || p . v == null ) {
if ( ! opts . sheetStubs ) continue ;
p . t = 'z' ;
} else p . v = parseFloat ( p . v ) ;
2017-03-23 01:56:21 +00:00
break ;
2014-06-29 18:35:10 +00:00
case 's' :
2017-03-10 00:36:03 +00:00
if ( typeof p . v == 'undefined' ) {
if ( ! opts . sheetStubs ) continue ;
2017-03-16 04:39:50 +00:00
p . t = 'z' ;
2017-07-05 21:02:14 +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 00:36:03 +00:00
}
2014-06-29 18:35:10 +00:00
break ;
2014-10-26 05:09:58 +00:00
case 'str' :
p . t = "s" ;
p . v = ( p . v != null ) ? utf8read ( p . v ) : '' ;
2017-04-16 07:35:56 +00:00
if ( opts . cellHTML ) p . h = escapehtml ( p . v ) ;
2014-10-26 05:09:58 +00:00
break ;
2014-06-29 18:35:10 +00:00
case 'inlineStr' :
cref = d . match ( isregex ) ;
2014-10-26 05:09:58 +00:00
p . t = 's' ;
2017-03-13 07:34:05 +00:00
if ( cref != null && ( sstr = parse _si ( cref [ 1 ] ) ) ) p . v = sstr . t ; else p . v = "" ;
2017-04-16 07:35:56 +00:00
break ;
2014-06-29 18:35:10 +00:00
case 'b' : p . v = parsexmlbool ( p . v ) ; break ;
case 'd' :
2017-06-03 07:23:15 +00:00
if ( opts . cellDates ) p . v = parseDate ( p . v , 1 ) ;
else { p . v = datenum ( parseDate ( p . v , 1 ) ) ; p . t = 'n' ; }
2014-06-29 18:35:10 +00:00
break ;
2017-03-23 01:56:21 +00:00
/* error string in .w, number in .v */
2017-04-21 22:03:40 +00:00
case 'e' :
2017-04-30 16:28:24 +00:00
if ( ! opts || opts . cellText !== false ) p . w = p . v ;
2017-04-21 22:03:40 +00:00
p . v = RBErr [ p . v ] ; break ;
2014-06-29 18:35:10 +00:00
}
/* formatting */
fmtid = fillid = 0 ;
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:29:24 +00:00
if ( opts . cellStyles ) {
if ( cf . fillId != null ) fillid = cf . fillId ;
}
2014-06-29 18:35:10 +00:00
}
}
2017-03-20 21:57:44 +00:00
safe _format ( p , fmtid , fillid , opts , themes , styles ) ;
2017-06-03 07:23:15 +00:00
if ( opts . cellDates && do _format && p . t == 'n' && SSF . is _date ( SSF . _table [ fmtid ] ) ) { p . t = 'd' ; p . v = numdate ( p . v ) ; }
2017-04-09 04:07:43 +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 ;
2014-06-29 18:35:10 +00:00
}
}
2017-04-30 16:28:24 +00:00
if ( rows . length > 0 ) s [ '!rows' ] = rows ;
2014-06-29 18:35:10 +00:00
} ; } ) ( ) ;
2014-05-16 00:16:51 +00:00
2018-01-23 09:09:53 +00:00
function write _ws _xml _data ( ws , opts , idx , wb ) {
2017-12-30 05:41:41 +00:00
var o = [ ] , r = [ ] , range = safe _decode _range ( ws [ '!ref' ] ) , cell = "" , ref , rr = "" , cols = [ ] , R = 0 , C = 0 , rows = ws [ '!rows' ] ;
2017-04-09 04:07:43 +00:00
var dense = Array . isArray ( ws ) ;
2017-10-17 00:36:51 +00:00
var params = ( { r : rr } ) , row , height = - 1 ;
2014-07-28 15:32:28 +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 ) {
2014-05-16 00:16:51 +00:00
r = [ ] ;
2014-06-29 18:35:10 +00:00
rr = encode _row ( R ) ;
2014-07-28 15:32:28 +00:00
for ( C = range . s . c ; C <= range . e . c ; ++ C ) {
2014-06-29 18:35:10 +00:00
ref = cols [ C ] + rr ;
2017-04-09 04:07:43 +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 ) ;
2014-05-16 00:16:51 +00:00
}
2018-02-08 19:13:10 +00:00
if ( r . length > 0 || ( rows && rows [ R ] ) ) {
2017-10-17 00:36:51 +00:00
params = ( { r : rr } ) ;
2017-03-31 21:50:32 +00:00
if ( rows && rows [ R ] ) {
2017-10-17 00:36:51 +00:00
row = rows [ R ] ;
2017-03-31 21:50:32 +00:00
if ( row . hidden ) params . hidden = 1 ;
2017-10-17 00:36:51 +00:00
height = - 1 ;
2017-03-31 21:50:32 +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 ; }
2017-07-10 22:29:24 +00:00
if ( row . level ) { params . outlineLevel = row . level ; }
2017-03-31 21:50:32 +00:00
}
o [ o . length ] = ( writextag ( 'row' , r . join ( "" ) , params ) ) ;
}
2014-05-16 00:16:51 +00:00
}
2017-07-10 22:29:24 +00:00
if ( rows ) for ( ; R < rows . length ; ++ R ) {
if ( rows && rows [ R ] ) {
2017-07-28 23:54:51 +00:00
params = ( { r : R + 1 } ) ;
row = rows [ R ] ;
2017-07-10 22:29:24 +00:00
if ( row . hidden ) params . hidden = 1 ;
2017-07-28 23:54:51 +00:00
height = - 1 ;
2017-07-10 22:29:24 +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 ) ) ;
}
}
2014-05-16 00:16:51 +00:00
return o . join ( "" ) ;
2014-06-29 18:35:10 +00:00
}
2014-05-16 00:16:51 +00:00
2014-06-05 07:07:10 +00:00
var WS _XML _ROOT = writextag ( 'worksheet' , null , {
'xmlns' : XMLNS . main [ 0 ] ,
'xmlns:r' : XMLNS . r
} ) ;
2014-06-02 05:16:51 +00:00
2017-03-31 21:50:32 +00:00
function write _ws _xml ( idx , opts , wb , rels ) {
2014-06-29 18:35:10 +00:00
var o = [ XML _HEADER , WS _XML _ROOT ] ;
2014-07-28 15:32:28 +00:00
var s = wb . SheetNames [ idx ] , sidx = 0 , rdata = "" ;
var ws = wb . Sheets [ s ] ;
2017-04-16 07:35:56 +00:00
if ( ws == null ) ws = { } ;
2018-04-27 20:12:36 +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 21:50:32 +00:00
if ( ! rels ) rels = { } ;
2017-04-03 06:04:35 +00:00
ws [ '!comments' ] = [ ] ;
2017-04-09 04:07:43 +00:00
ws [ '!drawing' ] = [ ] ;
2017-03-31 21:50:32 +00:00
2018-02-14 05:26:28 +00:00
if ( opts . bookType !== 'xlsx' && wb . vbaraw ) {
var cname = wb . SheetNames [ idx ] ;
try { if ( wb . Workbook ) cname = wb . Workbook . Sheets [ idx ] . CodeName || cname ; } catch ( e ) { }
o [ o . length ] = ( writextag ( 'sheetPr' , null , { 'codeName' : escapexml ( cname ) } ) ) ;
}
2017-04-16 07:35:56 +00:00
2014-07-28 15:32:28 +00:00
o [ o . length ] = ( writextag ( 'dimension' , null , { 'ref' : ref } ) ) ;
2017-04-30 16:28:24 +00:00
o [ o . length ] = write _ws _xml _sheetviews ( ws , opts , idx , wb ) ;
2017-04-16 07:35:56 +00:00
2017-03-31 21:50:32 +00:00
/* TODO: store in WB, process styles */
2017-07-10 22:29:24 +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 21:50:32 +00:00
2017-04-16 07:35:56 +00:00
if ( ws [ '!cols' ] != null && ws [ '!cols' ] . length > 0 ) o [ o . length ] = ( write _ws _xml _cols ( ws , ws [ '!cols' ] ) ) ;
2014-07-28 15:32:28 +00:00
o [ sidx = o . length ] = '<sheetData/>' ;
2017-03-31 21:50:32 +00:00
ws [ '!links' ] = [ ] ;
2017-03-28 22:07:46 +00:00
if ( ws [ '!ref' ] != null ) {
2017-03-31 21:50:32 +00:00
rdata = write _ws _xml _data ( ws , opts , idx , wb , rels ) ;
2014-07-28 15:32:28 +00:00
if ( rdata . length > 0 ) o [ o . length ] = ( rdata ) ;
}
2014-06-29 18:35:10 +00:00
if ( o . length > sidx + 1 ) { o [ o . length ] = ( '</sheetData>' ) ; o [ sidx ] = o [ sidx ] . replace ( "/>" , ">" ) ; }
2014-05-16 00:16:51 +00:00
2017-04-16 07:35:56 +00:00
/* sheetCalcPr */
2017-04-09 04:07:43 +00:00
if ( ws [ '!protect' ] != null ) o [ o . length ] = write _ws _xml _protection ( ws [ '!protect' ] ) ;
2017-04-16 07:35:56 +00:00
/* protectedRanges */
/* scenarios */
if ( ws [ '!autofilter' ] != null ) o [ o . length ] = write _ws _xml _autofilter ( ws [ '!autofilter' ] ) ;
/* sortState */
/* dataConsolidate */
/* customSheetViews */
2017-03-28 22:07:46 +00:00
if ( ws [ '!merges' ] != null && ws [ '!merges' ] . length > 0 ) o [ o . length ] = ( write _ws _xml _merges ( ws [ '!merges' ] ) ) ;
2014-08-26 17:44:30 +00:00
2017-04-16 07:35:56 +00:00
/* phoneticPr */
/* conditionalFormatting */
/* dataValidations */
2017-04-03 06:04:35 +00:00
var relc = - 1 , rel , rId = - 1 ;
2017-03-31 21:50:32 +00:00
if ( ws [ '!links' ] . length > 0 ) {
o [ o . length ] = "<hyperlinks>" ;
ws [ '!links' ] . forEach ( function ( l ) {
if ( ! l [ 1 ] . Target ) return ;
2017-12-15 02:01:07 +00:00
rel = ( { "ref" : l [ 0 ] } ) ;
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-23 09:09:53 +00:00
if ( ( relc = l [ 1 ] . Target . indexOf ( "#" ) ) > - 1 ) rel . location = escapexml ( l [ 1 ] . Target . slice ( relc + 1 ) ) ;
2017-03-31 21:50:32 +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:07:46 +00:00
delete ws [ '!links' ] ;
2017-04-03 06:04:35 +00:00
2017-04-16 07:35:56 +00:00
/* printOptions */
2017-04-30 16:28:24 +00:00
if ( ws [ '!margins' ] != null ) o [ o . length ] = write _ws _xml _margins ( ws [ '!margins' ] ) ;
2017-04-16 07:35:56 +00:00
/* pageSetup */
2018-01-23 09:09:53 +00:00
//var hfidx = o.length;
2017-04-09 04:07:43 +00:00
o [ o . length ] = "" ;
2017-04-16 07:35:56 +00:00
/* rowBreaks */
/* colBreaks */
/* customProperties */
/* cellWatches */
2018-02-14 05:26:28 +00:00
2018-08-15 20:01:20 +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 05:26:28 +00:00
2017-04-16 07:35:56 +00:00
/* smartTags */
2017-04-09 04:07:43 +00:00
if ( ws [ '!drawing' ] . length > 0 ) {
rId = add _rels ( rels , - 1 , "../drawings/drawing" + ( idx + 1 ) + ".xml" , RELS . DRAW ) ;
o [ o . length ] = writextag ( "drawing" , null , { "r:id" : "rId" + rId } ) ;
}
else delete ws [ '!drawing' ] ;
2017-04-16 07:35:56 +00:00
2017-04-03 06:04:35 +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 ;
}
2017-04-16 07:35:56 +00:00
/* drawingHF */
/* picture */
/* oleObjects */
/* controls */
/* webPublishItems */
/* tableParts */
/* extList */
2017-03-31 21:50:32 +00:00
if ( o . length > 2 ) { o [ o . length ] = ( '</worksheet>' ) ; o [ 1 ] = o [ 1 ] . replace ( "/>" , ">" ) ; }
2014-05-16 00:16:51 +00:00
return o . join ( "" ) ;
2014-06-29 18:35:10 +00:00
}
2014-02-13 06:26:39 +00:00
2018-02-14 05:26:28 +00:00
/* [MS-XLSB] 2.4.726 BrtRowHdr */
2014-06-29 18:35:10 +00:00
function parse _BrtRowHdr ( data , length ) {
2017-04-30 16:28:24 +00:00
var z = ( { } ) ;
var tgt = data . l + length ;
2014-01-28 16:35:26 +00:00
z . r = data . read _shift ( 4 ) ;
2017-04-30 16:28:24 +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-10 22:29:24 +00:00
if ( flags & 0x07 ) z . level = flags & 0x07 ;
2017-04-30 16:28:24 +00:00
if ( flags & 0x10 ) z . hidden = true ;
if ( flags & 0x20 ) z . hpt = miyRw / 20 ;
2014-01-28 16:35:26 +00:00
return z ;
2014-06-29 18:35:10 +00:00
}
2017-02-04 00:14:24 +00:00
function write _BrtRowHdr ( R , range , ws ) {
var o = new _buf ( 17 + 8 * 16 ) ;
2017-04-30 16:28:24 +00:00
var row = ( ws [ '!rows' ] || [ ] ) [ R ] || { } ;
2017-02-04 00:14:24 +00:00
o . write _shift ( 4 , R ) ;
2017-04-30 16:28:24 +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-10 22:29:24 +00:00
if ( row . level ) flags |= row . level ;
2017-04-30 16:28:24 +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-04 00:14:24 +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 19:13:10 +00:00
if ( ( range . s . c > ( ( i + 1 ) << 10 ) ) || ( range . e . c < ( i << 10 ) ) ) continue ;
2017-02-04 00:14:24 +00:00
var first = - 1 , last = - 1 ;
for ( var j = ( i << 10 ) ; j < ( ( i + 1 ) << 10 ) ; ++ j ) {
caddr . c = j ;
2017-04-09 04:07:43 +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-04 00:14:24 +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 ) ;
2018-02-08 19:13:10 +00:00
if ( ( o . length > 17 ) || ( ws [ '!rows' ] || [ ] ) [ R ] ) write _record ( ba , 'BrtRowHdr' , o ) ;
2017-02-04 00:14:24 +00:00
}
2014-01-28 16:35:26 +00:00
2018-02-14 05:26:28 +00:00
/* [MS-XLSB] 2.4.820 BrtWsDim */
2014-01-28 16:35:26 +00:00
var parse _BrtWsDim = parse _UncheckedRfX ;
2014-05-29 22:32:13 +00:00
var write _BrtWsDim = write _UncheckedRfX ;
2014-01-28 16:35:26 +00:00
2018-02-14 05:26:28 +00:00
/* [MS-XLSB] 2.4.821 BrtWsFmtInfo */
2018-01-23 09:09:53 +00:00
function parse _BrtWsFmtInfo ( ) {
2017-07-28 23:54:51 +00:00
}
2017-05-09 18:11:15 +00:00
//function write_BrtWsFmtInfo(ws, o) { }
2018-02-14 05:26:28 +00:00
/* [MS-XLSB] 2.4.823 BrtWsProp */
2014-06-29 18:35:10 +00:00
function parse _BrtWsProp ( data , length ) {
2014-01-28 16:35:26 +00:00
var z = { } ;
/* TODO: pull flags */
data . l += 19 ;
2015-04-02 22:14:07 +00:00
z . name = parse _XLSBCodeName ( data , length - 19 ) ;
2014-01-28 16:35:26 +00:00
return z ;
2014-06-29 18:35:10 +00:00
}
2017-03-31 21:50:32 +00:00
function write _BrtWsProp ( str , o ) {
2017-05-09 18:11:15 +00:00
if ( o == null ) o = new _buf ( 84 + 4 * str . length ) ;
for ( var i = 0 ; i < 3 ; ++ i ) o . write _shift ( 1 , 0 ) ;
write _BrtColor ( { auto : 1 } , o ) ;
2017-03-31 21:50:32 +00:00
o . write _shift ( - 4 , - 1 ) ;
o . write _shift ( - 4 , - 1 ) ;
write _XLSBCodeName ( str , o ) ;
return o . slice ( 0 , o . l ) ;
}
2014-01-28 16:35:26 +00:00
2018-02-14 05:26:28 +00:00
/* [MS-XLSB] 2.4.306 BrtCellBlank */
2018-01-23 09:09:53 +00:00
function parse _BrtCellBlank ( data ) {
2015-04-02 22:14:07 +00:00
var cell = parse _XLSBCell ( data ) ;
2014-03-29 22:53:44 +00:00
return [ cell ] ;
2014-06-29 18:35:10 +00:00
}
2017-02-04 00:14:24 +00:00
function write _BrtCellBlank ( cell , ncell , o ) {
2014-07-28 15:32:28 +00:00
if ( o == null ) o = new _buf ( 8 ) ;
2017-02-04 00:14:24 +00:00
return write _XLSBCell ( ncell , o ) ;
2014-07-28 15:32:28 +00:00
}
2014-02-13 06:26:39 +00:00
2018-02-14 05:26:28 +00:00
/* [MS-XLSB] 2.4.307 BrtCellBool */
2018-01-23 09:09:53 +00:00
function parse _BrtCellBool ( data ) {
2015-04-02 22:14:07 +00:00
var cell = parse _XLSBCell ( data ) ;
2014-01-28 16:35:26 +00:00
var fBool = data . read _shift ( 1 ) ;
return [ cell , fBool , 'b' ] ;
2014-06-29 18:35:10 +00:00
}
2017-02-04 00:14:24 +00:00
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 ;
}
2014-01-28 16:35:26 +00:00
2018-02-14 05:26:28 +00:00
/* [MS-XLSB] 2.4.308 BrtCellError */
2018-01-23 09:09:53 +00:00
function parse _BrtCellError ( data ) {
2015-04-02 22:14:07 +00:00
var cell = parse _XLSBCell ( data ) ;
2017-02-04 00:14:24 +00:00
var bError = data . read _shift ( 1 ) ;
return [ cell , bError , 'e' ] ;
2014-06-29 18:35:10 +00:00
}
2014-01-28 16:35:26 +00:00
2018-02-14 05:26:28 +00:00
/* [MS-XLSB] 2.4.311 BrtCellIsst */
2018-01-23 09:09:53 +00:00
function parse _BrtCellIsst ( data ) {
2015-04-02 22:14:07 +00:00
var cell = parse _XLSBCell ( data ) ;
2014-01-28 16:35:26 +00:00
var isst = data . read _shift ( 4 ) ;
return [ cell , isst , 's' ] ;
2014-06-29 18:35:10 +00:00
}
2017-02-04 00:14:24 +00:00
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 ;
}
2014-01-28 16:35:26 +00:00
2018-02-14 05:26:28 +00:00
/* [MS-XLSB] 2.4.313 BrtCellReal */
2018-01-23 09:09:53 +00:00
function parse _BrtCellReal ( data ) {
2015-04-02 22:14:07 +00:00
var cell = parse _XLSBCell ( data ) ;
2014-01-28 16:35:26 +00:00
var value = parse _Xnum ( data ) ;
return [ cell , value , 'n' ] ;
2014-06-29 18:35:10 +00:00
}
2017-02-04 00:14:24 +00:00
function write _BrtCellReal ( cell , ncell , o ) {
if ( o == null ) o = new _buf ( 16 ) ;
write _XLSBCell ( ncell , o ) ;
write _Xnum ( cell . v , o ) ;
return o ;
}
2014-01-28 16:35:26 +00:00
2018-02-14 05:26:28 +00:00
/* [MS-XLSB] 2.4.314 BrtCellRk */
2018-01-23 09:09:53 +00:00
function parse _BrtCellRk ( data ) {
2015-04-02 22:14:07 +00:00
var cell = parse _XLSBCell ( data ) ;
2014-01-28 16:35:26 +00:00
var value = parse _RkNumber ( data ) ;
return [ cell , value , 'n' ] ;
2014-06-29 18:35:10 +00:00
}
2017-02-04 00:14:24 +00:00
function write _BrtCellRk ( cell , ncell , o ) {
if ( o == null ) o = new _buf ( 12 ) ;
write _XLSBCell ( ncell , o ) ;
write _RkNumber ( cell . v , o ) ;
return o ;
}
2014-01-28 16:35:26 +00:00
2018-02-14 05:26:28 +00:00
/* [MS-XLSB] 2.4.317 BrtCellSt */
2018-01-23 09:09:53 +00:00
function parse _BrtCellSt ( data ) {
2015-04-02 22:14:07 +00:00
var cell = parse _XLSBCell ( data ) ;
2014-01-28 16:35:26 +00:00
var value = parse _XLWideString ( data ) ;
return [ cell , value , 'str' ] ;
2014-06-29 18:35:10 +00:00
}
2017-02-04 00:14:24 +00:00
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 ;
}
2014-01-28 16:35:26 +00:00
2018-02-14 05:26:28 +00:00
/* [MS-XLSB] 2.4.653 BrtFmlaBool */
2014-06-29 18:35:10 +00:00
function parse _BrtFmlaBool ( data , length , opts ) {
2017-02-19 21:11:48 +00:00
var end = data . l + length ;
2015-04-02 22:14:07 +00:00
var cell = parse _XLSBCell ( data ) ;
2017-02-19 21:11:48 +00:00
cell . r = opts [ '!row' ] ;
2014-02-12 06:19:45 +00:00
var value = data . read _shift ( 1 ) ;
2014-02-13 06:26:39 +00:00
var o = [ cell , value , 'b' ] ;
if ( opts . cellFormula ) {
2017-02-19 21:11:48 +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 */
2014-02-13 06:26:39 +00:00
}
2017-02-19 21:11:48 +00:00
else data . l = end ;
2014-02-13 06:26:39 +00:00
return o ;
2014-06-29 18:35:10 +00:00
}
2014-02-12 06:19:45 +00:00
2018-02-14 05:26:28 +00:00
/* [MS-XLSB] 2.4.654 BrtFmlaError */
2014-06-29 18:35:10 +00:00
function parse _BrtFmlaError ( data , length , opts ) {
2017-02-19 21:11:48 +00:00
var end = data . l + length ;
2015-04-02 22:14:07 +00:00
var cell = parse _XLSBCell ( data ) ;
2017-02-19 21:11:48 +00:00
cell . r = opts [ '!row' ] ;
2014-02-13 06:26:39 +00:00
var value = data . read _shift ( 1 ) ;
var o = [ cell , value , 'e' ] ;
if ( opts . cellFormula ) {
2017-02-19 21:11:48 +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 */
2014-02-13 06:26:39 +00:00
}
2017-02-19 21:11:48 +00:00
else data . l = end ;
2014-02-13 06:26:39 +00:00
return o ;
2014-06-29 18:35:10 +00:00
}
2014-01-28 16:35:26 +00:00
2018-02-14 05:26:28 +00:00
/* [MS-XLSB] 2.4.655 BrtFmlaNum */
2014-06-29 18:35:10 +00:00
function parse _BrtFmlaNum ( data , length , opts ) {
2017-02-19 21:11:48 +00:00
var end = data . l + length ;
2015-04-02 22:14:07 +00:00
var cell = parse _XLSBCell ( data ) ;
2017-02-19 21:11:48 +00:00
cell . r = opts [ '!row' ] ;
2014-01-28 16:35:26 +00:00
var value = parse _Xnum ( data ) ;
2014-02-13 06:26:39 +00:00
var o = [ cell , value , 'n' ] ;
if ( opts . cellFormula ) {
2017-02-19 21:11:48 +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 */
2014-02-13 06:26:39 +00:00
}
2017-02-19 21:11:48 +00:00
else data . l = end ;
2014-02-13 06:26:39 +00:00
return o ;
2014-06-29 18:35:10 +00:00
}
2014-01-28 16:35:26 +00:00
2018-02-14 05:26:28 +00:00
/* [MS-XLSB] 2.4.656 BrtFmlaString */
2014-06-29 18:35:10 +00:00
function parse _BrtFmlaString ( data , length , opts ) {
2017-02-19 21:11:48 +00:00
var end = data . l + length ;
2015-04-02 22:14:07 +00:00
var cell = parse _XLSBCell ( data ) ;
2017-02-19 21:11:48 +00:00
cell . r = opts [ '!row' ] ;
2014-02-12 06:19:45 +00:00
var value = parse _XLWideString ( data ) ;
2014-02-13 06:26:39 +00:00
var o = [ cell , value , 'str' ] ;
if ( opts . cellFormula ) {
2017-02-19 21:11:48 +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 */
2014-02-13 06:26:39 +00:00
}
2017-02-19 21:11:48 +00:00
else data . l = end ;
2014-02-13 06:26:39 +00:00
return o ;
2014-06-29 18:35:10 +00:00
}
2014-02-12 06:19:45 +00:00
2018-02-14 05:26:28 +00:00
/* [MS-XLSB] 2.4.682 BrtMergeCell */
2014-03-23 21:32:03 +00:00
var parse _BrtMergeCell = parse _UncheckedRfX ;
2017-03-16 04:39:50 +00:00
var write _BrtMergeCell = write _UncheckedRfX ;
2018-02-14 05:26:28 +00:00
/* [MS-XLSB] 2.4.107 BrtBeginMergeCells */
2017-03-16 04:39:50 +00:00
function write _BrtBeginMergeCells ( cnt , o ) {
if ( o == null ) o = new _buf ( 4 ) ;
o . write _shift ( 4 , cnt ) ;
return o ;
}
2014-03-23 21:32:03 +00:00
2018-02-14 05:26:28 +00:00
/* [MS-XLSB] 2.4.662 BrtHLink */
2018-01-23 09:09:53 +00:00
function parse _BrtHLink ( data , length ) {
2014-04-15 08:24:40 +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:36:51 +00:00
var o = ( { rfx : rfx , relId : relId , loc : loc , display : display } ) ;
if ( tooltip ) o . Tooltip = tooltip ;
return o ;
2014-06-29 18:35:10 +00:00
}
2017-12-15 02:01:07 +00:00
function write _BrtHLink ( l , rId ) {
var o = new _buf ( 50 + 4 * ( l [ 1 ] . Target . length + ( l [ 1 ] . Tooltip || "" ) . length ) ) ;
2017-03-31 21:50:32 +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-23 09:09:53 +00:00
var loc = locidx == - 1 ? "" : l [ 1 ] . Target . slice ( locidx + 1 ) ;
2017-05-09 18:11:15 +00:00
write _XLWideString ( loc || "" , o ) ;
2017-03-31 21:50:32 +00:00
write _XLWideString ( l [ 1 ] . Tooltip || "" , o ) ;
write _XLWideString ( "" , o ) ;
return o . slice ( 0 , o . l ) ;
}
2014-04-15 08:24:40 +00:00
2017-02-19 21:11:48 +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-13 07:34:05 +00:00
var o = [ rfx ] ; o [ 2 ] = fAlwaysCalc ;
2017-02-19 21:11:48 +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 05:26:28 +00:00
/* [MS-XLSB] 2.4.750 BrtShrFmla */
2017-02-19 21:11:48 +00:00
function parse _BrtShrFmla ( data , length , opts ) {
var end = data . l + length ;
var rfx = parse _UncheckedRfX ( data , 16 ) ;
2017-03-13 07:34:05 +00:00
var o = [ rfx ] ;
2017-02-19 21:11:48 +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:07:46 +00:00
/* [MS-XLSB] 2.4.323 BrtColInfo */
/* TODO: once XLS ColInfo is set, combine the functions */
function write _BrtColInfo ( C , 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-30 16:28:24 +00:00
o . write _shift ( 4 , ( p . width || 10 ) * 256 ) ;
2017-03-28 22:07:46 +00:00
o . write _shift ( 4 , 0 /*ixfe*/ ) ; // style
2017-04-30 16:28:24 +00:00
var flags = 0 ;
if ( col . hidden ) flags |= 0x01 ;
if ( typeof p . width == 'number' ) flags |= 0x02 ;
o . write _shift ( 1 , flags ) ; // bit flag
2017-03-28 22:07:46 +00:00
o . write _shift ( 1 , 0 ) ; // bit flag
return o ;
}
2018-02-14 05:26:28 +00:00
/* [MS-XLSB] 2.4.678 BrtMargins */
2017-10-17 00:36:51 +00:00
var BrtMarginKeys = [ "left" , "right" , "top" , "bottom" , "header" , "footer" ] ;
2018-01-23 09:09:53 +00:00
function parse _BrtMargins ( data ) {
2017-10-17 00:36:51 +00:00
var margins = ( { } ) ;
BrtMarginKeys . forEach ( function ( k ) { margins [ k ] = parse _Xnum ( data , 8 ) ; } ) ;
return margins ;
2017-04-16 07:35:56 +00:00
}
function write _BrtMargins ( margins , o ) {
if ( o == null ) o = new _buf ( 6 * 8 ) ;
default _margins ( margins ) ;
2017-10-17 00:36:51 +00:00
BrtMarginKeys . forEach ( function ( k ) { write _Xnum ( ( margins ) [ k ] , o ) ; } ) ;
2017-04-16 07:35:56 +00:00
return o ;
}
2018-02-14 05:26:28 +00:00
/* [MS-XLSB] 2.4.299 BrtBeginWsView */
2018-01-23 09:09:53 +00:00
function parse _BrtBeginWsView ( data ) {
2017-12-30 05:41:41 +00:00
var f = data . read _shift ( 2 ) ;
data . l += 28 ;
return { RTL : f & 0x20 } ;
}
2017-12-25 02:44:14 +00:00
function write _BrtBeginWsView ( ws , Workbook , o ) {
2017-04-30 16:28:24 +00:00
if ( o == null ) o = new _buf ( 30 ) ;
2017-12-25 02:44:14 +00:00
var f = 0x39c ;
if ( ( ( ( Workbook || { } ) . Views || [ ] ) [ 0 ] || { } ) . RTL ) f |= 0x20 ;
o . write _shift ( 2 , f ) ; // bit flag
2017-04-30 16:28:24 +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 05:26:28 +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-16 07:35:56 +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-17 04:27:55 +00:00
if ( n [ 1 ] ) o . write _shift ( 4 , sp [ n [ 0 ] ] != null && ! sp [ n [ 0 ] ] ? 1 : 0 ) ;
2017-04-30 16:28:24 +00:00
else o . write _shift ( 4 , sp [ n [ 0 ] ] != null && sp [ n [ 0 ] ] ? 0 : 1 ) ;
2017-04-16 07:35:56 +00:00
} ) ;
return o ;
}
2014-01-28 16:35:26 +00:00
/* [MS-XLSB] 2.1.7.61 Worksheet */
2017-11-20 02:13:37 +00:00
function parse _ws _bin ( data , _opts , idx , rels , wb , themes , styles ) {
2014-01-28 16:35:26 +00:00
if ( ! data ) return data ;
2017-04-09 04:07:43 +00:00
var opts = _opts || { } ;
2014-04-15 08:24:40 +00:00
if ( ! rels ) rels = { '!id' : { } } ;
2017-04-09 04:07:43 +00:00
if ( DENSE != null && opts . dense == null ) opts . dense = DENSE ;
2017-05-17 04:27:55 +00:00
var s = ( opts . dense ? [ ] : { } ) ;
2014-01-28 16:35:26 +00:00
var ref ;
2017-02-04 00:14:24 +00:00
var refguess = { s : { r : 2000000 , c : 2000000 } , e : { r : 0 , c : 0 } } ;
2014-01-28 16:35:26 +00:00
2014-02-19 03:04:34 +00:00
var pass = false , end = false ;
2017-04-09 04:07:43 +00:00
var row , p , cf , R , C , addr , sstr , rr , cell ;
2017-12-30 05:41:41 +00:00
var merges = [ ] ;
2017-02-19 21:11:48 +00:00
opts . biff = 12 ;
opts [ '!row' ] = 0 ;
var ai = 0 , af = false ;
2017-12-30 05:41:41 +00:00
var arrayf = [ ] ;
var sharedf = { } ;
2017-11-15 18:50:04 +00:00
var supbooks = opts . supbooks || ( [ [ ] ] ) ;
2017-12-30 05:41:41 +00:00
supbooks . sharedf = sharedf ;
supbooks . arrayf = arrayf ;
2017-04-16 07:35:56 +00:00
supbooks . SheetNames = wb . SheetNames || wb . Sheets . map ( function ( x ) { return x . name ; } ) ;
2017-11-15 18:50:04 +00:00
if ( ! opts . supbooks ) {
opts . supbooks = supbooks ;
2017-12-30 05:41:41 +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:50:04 +00:00
}
2017-02-19 21:11:48 +00:00
2017-03-20 21:57:44 +00:00
var colinfo = [ ] , rowinfo = [ ] ;
var seencol = false ;
2017-04-09 04:07:43 +00:00
recordhopper ( data , function ws _parse ( val , R _n , RT ) {
2014-02-19 03:04:34 +00:00
if ( end ) return ;
2017-04-09 04:07:43 +00:00
switch ( RT ) {
case 0x0094 : /* 'BrtWsDim' */
ref = val ; break ;
case 0x0000 : /* 'BrtRowHdr' */
2014-02-19 03:04:34 +00:00
row = val ;
if ( opts . sheetRows && opts . sheetRows <= row . r ) end = true ;
2017-04-09 04:07:43 +00:00
rr = encode _row ( R = row . r ) ;
2017-02-19 21:11:48 +00:00
opts [ '!row' ] = row . r ;
2017-07-10 22:29:24 +00:00
if ( val . hidden || val . hpt || val . level != null ) {
2017-04-30 16:28:24 +00:00
if ( val . hpt ) val . hpx = pt2px ( val . hpt ) ;
rowinfo [ val . r ] = val ;
}
2014-02-19 03:04:34 +00:00
break ;
2014-01-28 16:35:26 +00:00
2017-04-09 04:07:43 +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' */
2017-02-11 01:58:22 +00:00
p = ( { t : val [ 2 ] } ) ;
2014-01-28 16:35:26 +00:00
switch ( val [ 2 ] ) {
case 'n' : p . v = val [ 1 ] ; break ;
2014-06-29 18:35:10 +00:00
case 's' : sstr = strs [ val [ 1 ] ] ; p . v = sstr . t ; p . r = sstr . r ; break ;
2014-01-28 16:35:26 +00:00
case 'b' : p . v = val [ 1 ] ? true : false ; break ;
2017-04-30 16:28:24 +00:00
case 'e' : p . v = val [ 1 ] ; if ( opts . cellText !== false ) p . w = BErr [ p . v ] ; break ;
2017-09-30 06:19:01 +00:00
case 'str' : p . t = 's' ; p . v = val [ 1 ] ; break ;
2014-01-28 16:35:26 +00:00
}
2017-07-28 23:54:51 +00:00
if ( ( cf = styles . CellXf [ val [ 0 ] . iStyleRef ] ) ) safe _format ( p , cf . numFmtId , null , opts , themes , styles ) ;
2017-04-09 04:07:43 +00:00
C = val [ 0 ] . c ;
if ( opts . dense ) { if ( ! s [ R ] ) s [ R ] = [ ] ; s [ R ] [ C ] = p ; }
else s [ encode _col ( C ) + rr ] = p ;
2017-02-19 21:11:48 +00:00
if ( opts . cellFormula ) {
af = false ;
2017-12-30 05:41:41 +00:00
for ( ai = 0 ; ai < arrayf . length ; ++ ai ) {
var aii = arrayf [ ai ] ;
2017-02-19 21:11:48 +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 ] ;
}
2014-02-19 03:04:34 +00:00
if ( refguess . s . r > row . r ) refguess . s . r = row . r ;
2014-06-29 18:35:10 +00:00
if ( refguess . s . c > C ) refguess . s . c = C ;
2014-02-19 03:04:34 +00:00
if ( refguess . e . r < row . r ) refguess . e . r = row . r ;
2014-06-29 18:35:10 +00:00
if ( refguess . e . c < C ) refguess . e . c = C ;
2017-07-28 23:54:51 +00:00
if ( opts . cellDates && cf && p . t == 'n' && SSF . is _date ( SSF . _table [ cf . numFmtId ] ) ) {
2017-06-03 07:23:15 +00:00
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-23 01:56:21 +00:00
}
2014-02-19 03:04:34 +00:00
break ;
2014-01-28 16:35:26 +00:00
2017-04-09 04:07:43 +00:00
case 0x0001 : /* 'BrtCellBlank' */
2017-07-10 22:29:24 +00:00
if ( ! opts . sheetStubs || pass ) break ;
2017-03-16 04:39:50 +00:00
p = ( { t : 'z' , v : undefined } ) ;
2017-04-09 04:07:43 +00:00
C = val [ 0 ] . c ;
if ( opts . dense ) { if ( ! s [ R ] ) s [ R ] = [ ] ; s [ R ] [ C ] = p ; }
else s [ encode _col ( C ) + rr ] = p ;
2014-03-29 22:53:44 +00:00
if ( refguess . s . r > row . r ) refguess . s . r = row . r ;
2014-06-29 18:35:10 +00:00
if ( refguess . s . c > C ) refguess . s . c = C ;
2014-03-29 22:53:44 +00:00
if ( refguess . e . r < row . r ) refguess . e . r = row . r ;
2014-06-29 18:35:10 +00:00
if ( refguess . e . c < C ) refguess . e . c = C ;
2014-03-29 22:53:44 +00:00
break ;
2014-01-28 16:35:26 +00:00
2017-04-09 04:07:43 +00:00
case 0x00B0 : /* 'BrtMergeCell' */
2017-12-30 05:41:41 +00:00
merges . push ( val ) ; break ;
2014-04-15 08:24:40 +00:00
2017-04-09 04:07:43 +00:00
case 0x01EE : /* 'BrtHLink' */
2014-04-15 08:24:40 +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 02:01:07 +00:00
} else if ( val . relId == '' ) {
val . Target = "#" + val . loc ;
2014-04-15 08:24:40 +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-09 04:07:43 +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 ;
}
2014-04-15 08:24:40 +00:00
}
break ;
2017-04-09 04:07:43 +00:00
case 0x01AA : /* 'BrtArrFmla' */
if ( ! opts . cellFormula ) break ;
2017-12-30 05:41:41 +00:00
arrayf . push ( val ) ;
2017-05-17 04:27:55 +00:00
cell = ( ( opts . dense ? s [ R ] [ C ] : s [ encode _col ( C ) + rr ] ) ) ;
2017-04-09 04:07:43 +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 21:11:48 +00:00
break ;
2017-04-09 04:07:43 +00:00
case 0x01AB : /* 'BrtShrFmla' */
if ( ! opts . cellFormula ) break ;
2017-12-30 05:41:41 +00:00
sharedf [ encode _cell ( val [ 0 ] . s ) ] = val [ 1 ] ;
2017-04-09 04:07:43 +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 21:11:48 +00:00
break ;
2017-03-20 21:57:44 +00:00
/* identical to 'ColInfo' in XLS */
2017-04-09 04:07:43 +00:00
case 0x003C : /* 'BrtColInfo' */
2017-03-20 21:57:44 +00:00
if ( ! opts . cellStyles ) break ;
while ( val . e >= val . s ) {
2017-04-30 16:28:24 +00:00
colinfo [ val . e -- ] = { width : val . w / 256 , hidden : ! ! ( val . flags & 0x01 ) } ;
2017-03-20 21:57:44 +00:00
if ( ! seencol ) { seencol = true ; find _mdw _colw ( val . w / 256 ) ; }
process _col ( colinfo [ val . e + 1 ] ) ;
}
2017-04-09 04:07:43 +00:00
break ;
2017-03-20 21:57:44 +00:00
2017-04-16 07:35:56 +00:00
case 0x00A1 : /* 'BrtBeginAFilter' */
s [ '!autofilter' ] = { ref : encode _range ( val ) } ;
break ;
case 0x01DC : /* 'BrtMargins' */
s [ '!margins' ] = val ;
break ;
2017-11-20 02:13:37 +00:00
case 0x0093 : /* 'BrtWsProp' */
if ( ! wb . Sheets [ idx ] ) wb . Sheets [ idx ] = { } ;
if ( val . name ) wb . Sheets [ idx ] . CodeName = val . name ;
break ;
2017-12-30 05:41:41 +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:29:24 +00:00
case 0x01E5 : /* 'BrtWsFmtInfo' */
2018-01-23 09:09:53 +00:00
break ;
2017-04-09 04:07:43 +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 0x0031 : /* 'BrtCellMeta' */
case 0x024D : /* 'BrtCellSmartTagProperty' */
case 0x025F : /* 'BrtCellWatch' */
case 0x0234 : /* 'BrtColor' */
case 0x041F : /* 'BrtColor14' */
case 0x00A8 : /* 'BrtColorFilter' */
case 0x00AE : /* 'BrtCustomFilter' */
case 0x049C : /* 'BrtCustomFilter14' */
case 0x01F3 : /* 'BrtDRef' */
case 0x0040 : /* 'BrtDVal' */
case 0x041D : /* 'BrtDVal14' */
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 0x0097 : /* 'BrtPane' */
case 0x0219 : /* 'BrtPhoneticInfo' */
case 0x01DD : /* 'BrtPrintOptions' */
case 0x0218 : /* 'BrtRangeProtection' */
case 0x044F : /* 'BrtRangeProtection14' */
case 0x02A8 : /* 'BrtRangeProtectionIso' */
case 0x0450 : /* 'BrtRangeProtectionIso14' */
case 0x0400 : /* 'BrtRwDescent' */
case 0x0098 : /* 'BrtSel' */
case 0x0297 : /* 'BrtSheetCalcProp' */
case 0x0217 : /* 'BrtSheetProtection' */
case 0x02A6 : /* 'BrtSheetProtectionIso' */
case 0x01F8 : /* 'BrtSlc' */
case 0x0413 : /* 'BrtSparkline' */
case 0x01AC : /* 'BrtTable' */
case 0x00AA : /* 'BrtTop10Filter' */
2018-03-19 22:14:14 +00:00
case 0x0C00 : /* 'BrtUid' */
2017-04-09 04:07:43 +00:00
case 0x0032 : /* 'BrtValueMeta' */
case 0x0816 : /* 'BrtWebExtension' */
case 0x0415 : /* 'BrtWsFmtInfoEx14' */
break ;
case 0x0023 : /* 'BrtFRTBegin' */
pass = true ; break ;
case 0x0024 : /* 'BrtFRTEnd' */
pass = false ; break ;
case 0x0025 : /* 'BrtACBegin' */ break ;
case 0x0026 : /* 'BrtACEnd' */ break ;
default :
2017-05-09 18:11:15 +00:00
if ( ( R _n || "" ) . indexOf ( "Begin" ) > 0 ) { /* empty */ }
else if ( ( R _n || "" ) . indexOf ( "End" ) > 0 ) { /* empty */ }
2017-04-09 04:07:43 +00:00
else if ( ! pass || opts . WTF ) throw new Error ( "Unexpected record " + RT + " " + R _n ) ;
2014-01-28 16:35:26 +00:00
}
2014-02-13 06:26:39 +00:00
} , opts ) ;
2017-02-19 21:11:48 +00:00
delete opts . supbooks ;
delete opts [ '!row' ] ;
2017-02-11 01:58:22 +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 ) ;
2014-03-29 22:53:44 +00:00
if ( opts . sheetRows && s [ "!ref" ] ) {
2014-06-29 18:35:10 +00:00
var tmpref = safe _decode _range ( s [ "!ref" ] ) ;
2018-04-06 06:36:52 +00:00
if ( opts . sheetRows <= + tmpref . e . r ) {
2014-02-19 03:04:34 +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:41:41 +00:00
if ( merges . length > 0 ) s [ "!merges" ] = merges ;
2017-03-20 21:57:44 +00:00
if ( colinfo . length > 0 ) s [ "!cols" ] = colinfo ;
if ( rowinfo . length > 0 ) s [ "!rows" ] = rowinfo ;
2014-01-28 16:35:26 +00:00
return s ;
2014-06-29 18:35:10 +00:00
}
2014-01-28 16:35:26 +00:00
2014-07-28 15:32:28 +00:00
/* TODO: something useful -- this is a stub */
2017-03-31 21:50:32 +00:00
function write _ws _bin _cell ( ba , cell , R , C , opts , ws ) {
2014-07-28 15:32:28 +00:00
if ( cell . v === undefined ) return "" ;
2017-10-17 00:36:51 +00:00
var vv = "" ;
2014-07-28 15:32:28 +00:00
switch ( cell . t ) {
case 'b' : vv = cell . v ? "1" : "0" ; break ;
2017-03-28 22:07:46 +00:00
case 'd' : // no BrtCellDate :(
2017-10-17 00:36:51 +00:00
cell = dup ( cell ) ;
2017-03-28 22:07:46 +00:00
cell . z = cell . z || SSF . _table [ 14 ] ;
2017-10-17 00:36:51 +00:00
cell . v = datenum ( parseDate ( cell . v ) ) ; cell . t = 'n' ;
2017-03-28 22:07:46 +00:00
break ;
/* falls through */
2014-07-28 15:32:28 +00:00
case 'n' : case 'e' : vv = '' + cell . v ; break ;
default : vv = cell . v ; break ;
}
2017-02-11 01:58:22 +00:00
var o = ( { r : R , c : C } ) ;
2014-07-28 15:32:28 +00:00
/* TODO: cell style */
2017-05-09 18:11:15 +00:00
o . s = get _cell _style ( opts . cellXfs , cell , opts ) ;
2017-03-31 21:50:32 +00:00
if ( cell . l ) ws [ '!links' ] . push ( [ encode _cell ( o ) , cell . l ] ) ;
2017-04-03 06:04:35 +00:00
if ( cell . c ) ws [ '!comments' ] . push ( [ encode _cell ( o ) , cell . c ] ) ;
2014-07-28 15:32:28 +00:00
switch ( cell . t ) {
case 's' : case 'str' :
if ( opts . bookSST ) {
2018-06-22 21:40:52 +00:00
vv = get _sst _id ( opts . Strings , ( cell . v ) , opts . revStrings ) ;
2017-02-04 00:14:24 +00:00
o . t = "s" ; o . v = vv ;
write _record ( ba , "BrtCellIsst" , write _BrtCellIsst ( cell , o ) ) ;
} else {
o . t = "str" ;
write _record ( ba , "BrtCellSt" , write _BrtCellSt ( cell , o ) ) ;
2014-07-28 15:32:28 +00:00
}
2017-02-04 00:14:24 +00:00
return ;
case 'n' :
/* TODO: determine threshold for Real vs RK */
if ( cell . v == ( cell . v | 0 ) && cell . v > - 1000 && cell . v < 1000 ) write _record ( ba , "BrtCellRk" , write _BrtCellRk ( cell , o ) ) ;
else write _record ( ba , "BrtCellReal" , write _BrtCellReal ( cell , o ) ) ;
return ;
case 'b' :
o . t = "b" ;
write _record ( ba , "BrtCellBool" , write _BrtCellBool ( cell , o ) ) ;
return ;
case 'e' : /* TODO: error */ o . t = "e" ; break ;
2014-07-28 15:32:28 +00:00
}
write _record ( ba , "BrtCellBlank" , write _BrtCellBlank ( cell , o ) ) ;
}
2018-01-23 09:09:53 +00:00
function write _CELLTABLE ( ba , ws , idx , opts ) {
2014-07-28 15:32:28 +00:00
var range = safe _decode _range ( ws [ '!ref' ] || "A1" ) , ref , rr = "" , cols = [ ] ;
2014-05-29 22:32:13 +00:00
write _record ( ba , 'BrtBeginSheetData' ) ;
2017-04-09 04:07:43 +00:00
var dense = Array . isArray ( ws ) ;
2017-07-10 22:29:24 +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 ) {
2014-07-28 15:32:28 +00:00
rr = encode _row ( R ) ;
2014-05-29 22:32:13 +00:00
/* [ACCELLTABLE] */
/* BrtRowHdr */
2017-02-04 00:14:24 +00:00
write _row _header ( ba , ws , range , R ) ;
2017-07-10 22:29:24 +00:00
if ( R <= range . e . r ) for ( var C = range . s . c ; C <= range . e . c ; ++ C ) {
2014-07-28 15:32:28 +00:00
/* *16384CELL */
if ( R === range . s . r ) cols [ C ] = encode _col ( C ) ;
ref = cols [ C ] + rr ;
2017-04-09 04:07:43 +00:00
var cell = dense ? ( ws [ R ] || [ ] ) [ C ] : ws [ ref ] ;
if ( ! cell ) continue ;
2014-07-28 15:32:28 +00:00
/* write cell */
2017-04-09 04:07:43 +00:00
write _ws _bin _cell ( ba , cell , R , C , opts , ws ) ;
2014-07-28 15:32:28 +00:00
}
2014-05-29 22:32:13 +00:00
}
write _record ( ba , 'BrtEndSheetData' ) ;
}
2017-03-16 04:39:50 +00:00
function write _MERGECELLS ( ba , ws ) {
if ( ! ws || ! ws [ '!merges' ] ) return ;
write _record ( ba , 'BrtBeginMergeCells' , write _BrtBeginMergeCells ( ws [ '!merges' ] . length ) ) ;
ws [ '!merges' ] . forEach ( function ( m ) { write _record ( ba , 'BrtMergeCell' , write _BrtMergeCell ( m ) ) ; } ) ;
write _record ( ba , 'BrtEndMergeCells' ) ;
}
2018-01-23 09:09:53 +00:00
function write _COLINFOS ( ba , ws ) {
2017-03-28 22:07:46 +00:00
if ( ! ws || ! ws [ '!cols' ] ) return ;
write _record ( ba , 'BrtBeginColInfos' ) ;
ws [ '!cols' ] . forEach ( function ( m , i ) { if ( m ) write _record ( ba , 'BrtColInfo' , write _BrtColInfo ( i , m ) ) ; } ) ;
write _record ( ba , 'BrtEndColInfos' ) ;
}
2018-02-14 05:26:28 +00:00
function write _IGNOREECS ( ba , ws ) {
if ( ! ws || ! ws [ '!ref' ] ) return ;
write _record ( ba , 'BrtBeginCellIgnoreECs' ) ;
write _record ( ba , 'BrtCellIgnoreEC' , write _BrtCellIgnoreEC ( safe _decode _range ( ws [ '!ref' ] ) ) ) ;
write _record ( ba , 'BrtEndCellIgnoreECs' ) ;
}
2017-03-31 21:50:32 +00:00
function write _HLINKS ( ba , ws , rels ) {
/* *BrtHLink */
ws [ '!links' ] . forEach ( function ( l ) {
if ( ! l [ 1 ] . Target ) return ;
var rId = add _rels ( rels , - 1 , l [ 1 ] . Target . replace ( /#.*$/ , "" ) , RELS . HLINK ) ;
write _record ( ba , "BrtHLink" , write _BrtHLink ( l , rId ) ) ;
} ) ;
delete ws [ '!links' ] ;
}
2017-04-03 06:04:35 +00:00
function write _LEGACYDRAWING ( ba , ws , idx , rels ) {
/* [BrtLegacyDrawing] */
if ( ws [ '!comments' ] . length > 0 ) {
var rId = add _rels ( rels , - 1 , "../drawings/vmlDrawing" + ( idx + 1 ) + ".vml" , RELS . VML ) ;
write _record ( ba , "BrtLegacyDrawing" , write _RelID ( "rId" + rId ) ) ;
ws [ '!legacy' ] = rId ;
}
}
2017-03-31 21:50:32 +00:00
2017-04-16 07:35:56 +00:00
function write _AUTOFILTER ( ba , ws ) {
if ( ! ws [ '!autofilter' ] ) return ;
2018-02-14 05:26:28 +00:00
write _record ( ba , "BrtBeginAFilter" , write _UncheckedRfX ( safe _decode _range ( ws [ '!autofilter' ] . ref ) ) ) ;
2017-04-16 07:35:56 +00:00
/* *FILTERCOLUMN */
/* [SORTSTATE] */
/* BrtEndAFilter */
write _record ( ba , "BrtEndAFilter" ) ;
}
2017-12-25 02:44:14 +00:00
function write _WSVIEWS2 ( ba , ws , Workbook ) {
2017-04-30 16:28:24 +00:00
write _record ( ba , "BrtBeginWsViews" ) ;
{ /* 1*WSVIEW2 */
/* [ACUID] */
2017-12-25 02:44:14 +00:00
write _record ( ba , "BrtBeginWsView" , write _BrtBeginWsView ( ws , Workbook ) ) ;
2017-04-30 16:28:24 +00:00
/* [BrtPane] */
/* *4BrtSel */
/* *4SXSELECT */
/* *FRT */
write _record ( ba , "BrtEndWsView" ) ;
}
/* *FRT */
write _record ( ba , "BrtEndWsViews" ) ;
}
2018-01-23 09:09:53 +00:00
function write _WSFMTINFO ( ) {
2017-05-09 18:11:15 +00:00
/* [ACWSFMTINFO] */
//write_record(ba, "BrtWsFmtInfo", write_BrtWsFmtInfo(ws));
}
2017-04-16 07:35:56 +00:00
function write _SHEETPROTECT ( ba , ws ) {
if ( ! ws [ '!protect' ] ) return ;
/* [BrtSheetProtectionIso] */
write _record ( ba , "BrtSheetProtection" , write _BrtSheetProtection ( ws [ '!protect' ] ) ) ;
}
2017-03-31 21:50:32 +00:00
function write _ws _bin ( idx , opts , wb , rels ) {
2014-05-29 22:32:13 +00:00
var ba = buf _array ( ) ;
var s = wb . SheetNames [ idx ] , ws = wb . Sheets [ s ] || { } ;
2017-11-20 02:13:37 +00:00
var c = s ; try { if ( wb && wb . Workbook ) c = wb . Workbook . Sheets [ idx ] . CodeName || c ; } catch ( e ) { }
2014-06-29 18:35:10 +00:00
var r = safe _decode _range ( ws [ '!ref' ] || "A1" ) ;
2018-04-27 20:12:36 +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 21:50:32 +00:00
ws [ '!links' ] = [ ] ;
2017-04-03 06:04:35 +00:00
/* passed back to write_zip and removed there */
ws [ '!comments' ] = [ ] ;
2014-05-29 22:32:13 +00:00
write _record ( ba , "BrtBeginSheet" ) ;
2018-02-14 05:26:28 +00:00
if ( wb . vbaraw ) write _record ( ba , "BrtWsProp" , write _BrtWsProp ( c ) ) ;
2014-05-29 22:32:13 +00:00
write _record ( ba , "BrtWsDim" , write _BrtWsDim ( r ) ) ;
2017-12-25 02:44:14 +00:00
write _WSVIEWS2 ( ba , ws , wb . Workbook ) ;
2017-05-09 18:11:15 +00:00
write _WSFMTINFO ( ba , ws ) ;
2017-03-28 22:07:46 +00:00
write _COLINFOS ( ba , ws , idx , opts , wb ) ;
2014-05-29 22:32:13 +00:00
write _CELLTABLE ( ba , ws , idx , opts , wb ) ;
/* [BrtSheetCalcProp] */
2017-04-16 07:35:56 +00:00
write _SHEETPROTECT ( ba , ws ) ;
2014-05-29 22:32:13 +00:00
/* *([BrtRangeProtectionIso] BrtRangeProtection) */
/* [SCENMAN] */
2017-04-16 07:35:56 +00:00
write _AUTOFILTER ( ba , ws ) ;
2014-05-29 22:32:13 +00:00
/* [SORTSTATE] */
/* [DCON] */
/* [USERSHVIEWS] */
2017-03-16 04:39:50 +00:00
write _MERGECELLS ( ba , ws ) ;
2014-05-29 22:32:13 +00:00
/* [BrtPhoneticInfo] */
/* *CONDITIONALFORMATTING */
/* [DVALS] */
2017-03-31 21:50:32 +00:00
write _HLINKS ( ba , ws , rels ) ;
2014-05-29 22:32:13 +00:00
/* [BrtPrintOptions] */
2017-04-16 07:35:56 +00:00
if ( ws [ '!margins' ] ) write _record ( ba , "BrtMargins" , write _BrtMargins ( ws [ '!margins' ] ) ) ;
2014-05-29 22:32:13 +00:00
/* [BrtPageSetup] */
/* [HEADERFOOTER] */
/* [RWBRK] */
/* [COLBRK] */
/* *BrtBigName */
/* [CELLWATCHES] */
2018-08-15 20:01:20 +00:00
if ( ! opts || opts . ignoreEC || ( opts . ignoreEC == ( void 0 ) ) ) write _IGNOREECS ( ba , ws ) ;
2014-05-29 22:32:13 +00:00
/* [SMARTTAGS] */
/* [BrtDrawing] */
2017-04-03 06:04:35 +00:00
write _LEGACYDRAWING ( ba , ws , idx , rels ) ;
2014-05-29 22:32:13 +00:00
/* [BrtLegacyDrawingHF] */
/* [BrtBkHim] */
/* [OLEOBJECTS] */
/* [ACTIVEXCONTROLS] */
/* [WEBPUBITEMS] */
/* [LISTPARTS] */
/* FRTWORKSHEET */
write _record ( ba , "BrtEndSheet" ) ;
return ba . end ( ) ;
2014-06-29 18:35:10 +00:00
}
2017-03-28 22:07:46 +00:00
function parse _numCache ( data ) {
var col = [ ] ;
/* 21.2.2.150 pt CT_NumVal */
( data . match ( /<c:pt idx="(\d*)">(.*?)<\/c:pt>/mg ) || [ ] ) . forEach ( function ( pt ) {
2018-02-21 06:20:15 +00:00
var q = pt . match ( /<c:pt idx="(\d*?)"><c:v>(.*)<\/c:v><\/c:pt>/ ) ;
2017-03-28 22:07:46 +00:00
if ( ! q ) return ;
col [ + q [ 1 ] ] = + q [ 2 ] ;
} ) ;
/* 21.2.2.71 formatCode CT_Xstring */
2017-07-05 21:02:14 +00:00
var nf = unescapexml ( ( data . match ( /<c:formatCode>([\s\S]*?)<\/c:formatCode>/ ) || [ "" , "General" ] ) [ 1 ] ) ;
2017-03-28 22:07:46 +00:00
return [ col , nf ] ;
}
/* 21.2 DrawingML - Charts */
function parse _chart ( data , name , opts , rels , wb , csheet ) {
var cs = ( ( csheet || { "!type" : "chart" } ) ) ;
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 21:02:14 +00:00
( data . match ( /<c:numCache>[\s\S]*?<\/c:numCache>/gm ) || [ ] ) . forEach ( function ( nc ) {
2017-03-28 22:07:46 +00:00
var cache = parse _numCache ( nc ) ;
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 ;
}
RELS . CS = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/chartsheet" ;
2017-04-09 04:07:43 +00:00
var CS _XML _ROOT = writextag ( 'chartsheet' , null , {
'xmlns' : XMLNS . main [ 0 ] ,
'xmlns:r' : XMLNS . r
} ) ;
2017-03-28 22:07:46 +00:00
/* 18.3 Worksheets also covers Chartsheets */
2018-01-23 09:09:53 +00:00
function parse _cs _xml ( data , opts , idx , rels , wb ) {
2017-03-28 22:07:46 +00:00
if ( ! data ) return data ;
/* 18.3.1.12 chartsheet CT_ChartSheet */
if ( ! rels ) rels = { '!id' : { } } ;
var s = { '!type' : "chart" , '!chart' : null , '!rel' : "" } ;
var m ;
2017-11-20 02:13:37 +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-28 22:07:46 +00:00
/* 18.3.1.36 drawing CT_Drawing */
if ( ( m = data . match ( /drawing r:id="(.*?)"/ ) ) ) s [ '!rel' ] = m [ 1 ] ;
if ( rels [ '!id' ] [ s [ '!rel' ] ] ) s [ '!chart' ] = rels [ '!id' ] [ s [ '!rel' ] ] ;
return s ;
}
2017-04-09 04:07:43 +00:00
function write _cs _xml ( idx , opts , wb , rels ) {
var o = [ XML _HEADER , CS _XML _ROOT ] ;
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-28 22:07:46 +00:00
2017-11-20 02:13:37 +00:00
/* [MS-XLSB] 2.4.331 BrtCsProp */
function parse _BrtCsProp ( data , length ) {
data . l += 10 ;
var name = parse _XLWideString ( data , length - 10 ) ;
return { name : name } ;
}
2017-03-28 22:07:46 +00:00
/* [MS-XLSB] 2.1.7.7 Chart Sheet */
2018-01-23 09:09:53 +00:00
function parse _cs _bin ( data , opts , idx , rels , wb ) {
2017-03-28 22:07:46 +00:00
if ( ! data ) return data ;
if ( ! rels ) rels = { '!id' : { } } ;
var s = { '!type' : "chart" , '!chart' : null , '!rel' : "" } ;
2017-04-09 04:07:43 +00:00
var state = [ ] ;
2017-03-28 22:07:46 +00:00
var pass = false ;
2017-04-09 04:07:43 +00:00
recordhopper ( data , function cs _parse ( val , R _n , RT ) {
switch ( RT ) {
case 0x0226 : /* 'BrtDrawing' */
s [ '!rel' ] = val ; break ;
2017-11-20 02:13:37 +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:07:43 +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 22:14:14 +00:00
case 0x0C00 : /* 'BrtUid' */
2017-04-09 04:07:43 +00:00
break ;
case 0x0023 : /* 'BrtFRTBegin' */
pass = true ; break ;
case 0x0024 : /* 'BrtFRTEnd' */
pass = false ; break ;
case 0x0025 : /* 'BrtACBegin' */
state . push ( R _n ) ; break ;
case 0x0026 : /* 'BrtACEnd' */
state . pop ( ) ; break ;
default :
if ( ( R _n || "" ) . indexOf ( "Begin" ) > 0 ) state . push ( R _n ) ;
else if ( ( R _n || "" ) . indexOf ( "End" ) > 0 ) state . pop ( ) ;
else if ( ! pass || opts . WTF ) throw new Error ( "Unexpected record " + RT + " " + R _n ) ;
2017-03-28 22:07:46 +00:00
}
} , opts ) ;
if ( rels [ '!id' ] [ s [ '!rel' ] ] ) s [ '!chart' ] = rels [ '!id' ] [ s [ '!rel' ] ] ;
return s ;
}
2018-01-23 09:09:53 +00:00
function write _cs _bin ( ) {
2017-04-09 04:07:43 +00:00
var ba = buf _array ( ) ;
write _record ( ba , "BrtBeginSheet" ) ;
/* [BrtCsProp] */
/* CSVIEWS */
/* [[BrtCsProtectionIso] BrtCsProtection] */
/* [USERCSVIEWS] */
/* [BrtMargins] */
/* [BrtCsPageSetup] */
/* [HEADERFOOTER] */
/* BrtDrawing */
/* [BrtLegacyDrawing] */
/* [BrtLegacyDrawingHF] */
/* [BrtBkHim] */
/* [WEBPUBITEMS] */
/* FRTCHARTSHEET */
write _record ( ba , "BrtEndSheet" ) ;
return ba . end ( ) ;
}
2014-01-28 16:35:26 +00:00
/* 18.2.28 (CT_WorkbookProtection) Defaults */
2014-06-29 18:35:10 +00:00
var WBPropsDef = [
2017-06-03 07:23:15 +00:00
[ 'allowRefreshQuery' , false , "bool" ] ,
[ 'autoCompressPictures' , true , "bool" ] ,
[ 'backupFile' , false , "bool" ] ,
[ 'checkCompatibility' , false , "bool" ] ,
2017-11-20 02:13:37 +00:00
[ 'CodeName' , '' ] ,
2017-06-03 07:23:15 +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' ]
2014-06-29 18:35:10 +00:00
] ;
2014-01-28 16:35:26 +00:00
/* 18.2.30 (CT_BookView) Defaults */
2014-06-29 18:35:10 +00:00
var WBViewDef = [
2017-06-03 07:23:15 +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' ]
2014-01-28 16:35:26 +00:00
//window{Height,Width}, {x,y}Window
2014-06-29 18:35:10 +00:00
] ;
2014-01-28 16:35:26 +00:00
/* 18.2.19 (CT_Sheet) Defaults */
2014-06-29 18:35:10 +00:00
var SheetDef = [
2017-03-31 21:50:32 +00:00
//['state', 'visible']
2014-06-29 18:35:10 +00:00
] ;
2014-01-28 16:35:26 +00:00
/* 18.2.2 (CT_CalcPr) Defaults */
2014-06-29 18:35:10 +00:00
var CalcPrDef = [
[ 'calcCompleted' , 'true' ] ,
[ 'calcMode' , 'auto' ] ,
[ 'calcOnSave' , 'true' ] ,
[ 'concurrentCalc' , 'true' ] ,
[ 'fullCalcOnLoad' , 'false' ] ,
[ 'fullPrecision' , 'true' ] ,
[ 'iterate' , 'false' ] ,
[ 'iterateCount' , '100' ] ,
[ 'iterateDelta' , '0.001' ] ,
[ 'refMode' , 'A1' ]
] ;
2014-01-28 16:35:26 +00:00
/* 18.2.3 (CT_CustomWorkbookView) Defaults */
2018-01-23 09:09:53 +00:00
/ * v a r C u s t o m W B V i e w D e f = [
2014-06-29 18:35:10 +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:09:53 +00:00
] ; * /
2014-06-29 18:35:10 +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-03 07:23:15 +00:00
else switch ( z [ 2 ] ) {
2018-01-23 09:09:53 +00:00
case "bool" : if ( typeof w [ z [ 0 ] ] == "string" ) w [ z [ 0 ] ] = parsexmlbool ( w [ z [ 0 ] ] ) ; break ;
2017-06-03 07:23:15 +00:00
case "int" : if ( typeof w [ z [ 0 ] ] == "string" ) w [ z [ 0 ] ] = parseInt ( w [ z [ 0 ] ] , 10 ) ; break ;
}
2014-06-29 18:35:10 +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-03 07:23:15 +00:00
else switch ( z [ 2 ] ) {
2018-01-23 09:09:53 +00:00
case "bool" : if ( typeof target [ z [ 0 ] ] == "string" ) target [ z [ 0 ] ] = parsexmlbool ( target [ z [ 0 ] ] ) ; break ;
2017-06-03 07:23:15 +00:00
case "int" : if ( typeof target [ z [ 0 ] ] == "string" ) target [ z [ 0 ] ] = parseInt ( target [ z [ 0 ] ] , 10 ) ; break ;
}
2014-06-29 18:35:10 +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:09:53 +00:00
_ssfopts . date1904 = parsexmlbool ( wb . WBProps . date1904 ) ;
2014-06-29 18:35:10 +00:00
}
2017-03-11 00:01:58 +00:00
2017-06-03 07:23:15 +00:00
function safe1904 ( wb ) {
/* TODO: store date1904 somewhere else */
if ( ! wb . Workbook ) return "false" ;
if ( ! wb . Workbook . WBProps ) return "false" ;
return parsexmlbool ( wb . Workbook . WBProps . date1904 ) ? "true" : "false" ;
}
2017-05-11 18:57:52 +00:00
var badchars = "][*?\/\\" . split ( "" ) ;
function check _ws _name ( n , safe ) {
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 05:26:28 +00:00
function check _wb _names ( N , S , codes ) {
2017-04-03 06:04:35 +00:00
N . forEach ( function ( n , i ) {
2017-05-11 18:57:52 +00:00
check _ws _name ( n ) ;
2017-04-03 06:04:35 +00:00
for ( var j = 0 ; j < i ; ++ j ) if ( n == N [ j ] ) throw new Error ( "Duplicate Sheet Name: " + n ) ;
2018-02-14 05:26:28 +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 06:04:35 +00:00
} ) ;
}
2017-03-11 00:01:58 +00:00
function check _wb ( wb ) {
if ( ! wb || ! wb . SheetNames || ! wb . Sheets ) throw new Error ( "Invalid Workbook" ) ;
2018-02-03 20:43:07 +00:00
if ( ! wb . SheetNames . length ) throw new Error ( "Workbook is empty" ) ;
2018-02-14 05:26:28 +00:00
var Sheets = ( wb . Workbook && wb . Workbook . Sheets ) || [ ] ;
check _wb _names ( wb . SheetNames , Sheets , ! ! wb . vbaraw ) ;
2018-04-27 20:12:36 +00:00
for ( var i = 0 ; i < wb . SheetNames . length ; ++ i ) check _ws ( wb . Sheets [ wb . SheetNames [ i ] ] , wb . SheetNames [ i ] , i ) ;
2017-04-03 06:04:35 +00:00
/* TODO: validate workbook */
2017-03-11 00:01:58 +00:00
}
2014-01-28 16:35:26 +00:00
/* 18.2 Workbook */
2014-07-28 15:32:28 +00:00
var wbnsregex = /<\w+:workbook/ ;
2014-06-05 07:07:10 +00:00
function parse _wb _xml ( data , opts ) {
2017-02-11 01:58:22 +00:00
if ( ! data ) throw new Error ( "Could not find file" ) ;
2017-04-16 07:35:56 +00:00
var wb = { AppVersion : { } , WBProps : { } , WBView : [ ] , Sheets : [ ] , CalcPr : { } , Names : [ ] , xmlns : "" } ;
2014-04-03 23:24:56 +00:00
var pass = false , xmlns = "xmlns" ;
2017-03-20 21:57:44 +00:00
var dname = { } , dnstart = 0 ;
data . replace ( tagregex , function xml _wb ( x , idx ) {
2014-01-28 16:35:26 +00:00
var y = parsexmltag ( x ) ;
2014-06-29 18:35:10 +00:00
switch ( strip _ns ( y [ 0 ] ) ) {
2014-01-28 16:35:26 +00:00
case '<?xml' : break ;
/* 18.2.27 workbook CT_Workbook 1 */
2014-04-03 23:24:56 +00:00
case '<workbook' :
2014-07-28 15:32:28 +00:00
if ( x . match ( wbnsregex ) ) xmlns = "xmlns" + x . match ( /<(\w+):/ ) [ 1 ] ;
2014-04-03 23:24:56 +00:00
wb . xmlns = y [ xmlns ] ;
break ;
2014-01-28 16:35:26 +00:00
case '</workbook>' : break ;
/* 18.2.13 fileVersion CT_FileVersion ? */
case '<fileVersion' : delete y [ 0 ] ; wb . AppVersion = y ; break ;
2017-03-11 00:01:58 +00:00
case '<fileVersion/>' : case '</fileVersion>' : break ;
2014-01-28 16:35:26 +00:00
/* 18.2.12 fileSharing CT_FileSharing ? */
case '<fileSharing' : case '<fileSharing/>' : break ;
/* 18.2.28 workbookPr CT_WorkbookPr ? */
2017-06-03 07:23:15 +00:00
case '<workbookPr' :
case '<workbookPr/>' :
WBPropsDef . forEach ( function ( w ) {
if ( y [ w [ 0 ] ] == null ) return ;
switch ( w [ 2 ] ) {
2018-01-23 09:09:53 +00:00
case "bool" : wb . WBProps [ w [ 0 ] ] = parsexmlbool ( y [ w [ 0 ] ] ) ; break ;
2017-06-03 07:23:15 +00:00
case "int" : wb . WBProps [ w [ 0 ] ] = parseInt ( y [ w [ 0 ] ] , 10 ) ; break ;
default : wb . WBProps [ w [ 0 ] ] = y [ w [ 0 ] ] ;
}
} ) ;
2017-11-20 02:13:37 +00:00
if ( y . codeName ) wb . WBProps . CodeName = y . codeName ;
2017-06-03 07:23:15 +00:00
break ;
2017-03-11 00:01:58 +00:00
case '</workbookPr>' : break ;
2014-01-28 16:35:26 +00:00
/* 18.2.29 workbookProtection CT_WorkbookProtection ? */
2014-06-05 07:07:10 +00:00
case '<workbookProtection' : break ;
2014-01-28 16:35:26 +00:00
case '<workbookProtection/>' : break ;
/* 18.2.1 bookViews CT_BookViews ? */
2017-07-28 23:54:51 +00:00
case '<bookViews' : case '<bookViews>' : case '</bookViews>' : break ;
2014-01-28 16:35:26 +00:00
/* 18.2.30 workbookView CT_BookView + */
2018-04-27 20:12:36 +00:00
case '<workbookView' : case '<workbookView/>' : delete y [ 0 ] ; wb . WBView . push ( y ) ; break ;
2017-03-11 00:01:58 +00:00
case '</workbookView>' : break ;
2014-01-28 16:35:26 +00:00
/* 18.2.20 sheets CT_Sheets 1 */
2017-07-28 23:54:51 +00:00
case '<sheets' : case '<sheets>' : case '</sheets>' : break ; // aggregate sheet
2014-01-28 16:35:26 +00:00
/* 18.2.19 sheet CT_Sheet + */
2017-03-31 21:50:32 +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-11 00:01:58 +00:00
case '</sheet>' : break ;
2014-01-28 16:35:26 +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 ? */
2014-06-05 07:07:10 +00:00
case '<externalReferences' : case '</externalReferences>' : case '<externalReferences>' : break ;
2014-01-28 16:35:26 +00:00
/* 18.2.8 externalReference CT_ExternalReference + */
case '<externalReference' : break ;
/* 18.2.6 definedNames CT_DefinedNames ? */
case '<definedNames/>' : break ;
2014-06-05 07:07:10 +00:00
case '<definedNames>' : case '<definedNames' : pass = true ; break ;
2014-01-28 16:35:26 +00:00
case '</definedNames>' : pass = false ; break ;
/* 18.2.5 definedName CT_DefinedName + */
2017-03-20 21:57:44 +00:00
case '<definedName' : {
dname = { } ;
2018-08-26 00:09:59 +00:00
dname . Name = utf8read ( y . name ) ;
2017-03-20 21:57:44 +00:00
if ( y . comment ) dname . Comment = y . comment ;
2017-04-16 07:35:56 +00:00
if ( y . localSheetId ) dname . Sheet = + y . localSheetId ;
2017-03-20 21:57:44 +00:00
dnstart = idx + x . length ;
} break ;
case '</definedName>' : {
2018-08-26 00:09:59 +00:00
dname . Ref = unescapexml ( utf8read ( data . slice ( dnstart , idx ) ) ) ;
2017-04-16 07:35:56 +00:00
wb . Names . push ( dname ) ;
2017-03-20 21:57:44 +00:00
} break ;
case '<definedName/>' : break ;
2014-01-28 16:35:26 +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-11 00:01:58 +00:00
case '</calcPr>' : break ;
2014-01-28 16:35:26 +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 ;
/* 18.2.3 customWorkbookView CT_CustomWorkbookView + */
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 ;
/* 18.2.22 smartTagType CT_SmartTagType ? */
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-28 23:54:51 +00:00
case '<extLst' : case '<extLst>' : case '</extLst>' : case '<extLst/>' : break ;
2014-01-28 16:35:26 +00:00
/* 18.2.7 ext CT_Extension + */
case '<ext' : pass = true ; break ; //TODO: check with versions of excel
case '</ext>' : pass = false ; break ;
/* Others */
2014-06-05 07:07:10 +00:00
case '<ArchID' : break ;
2017-10-17 00:36:51 +00:00
case '<AlternateContent' :
case '<AlternateContent>' : pass = true ; break ;
2014-06-05 07:07:10 +00:00
case '</AlternateContent>' : pass = false ; break ;
2017-07-10 22:29:24 +00:00
/* TODO */
case '<revisionPtr' : break ;
2017-03-11 00:01:58 +00:00
default : if ( ! pass && opts . WTF ) throw new Error ( 'unrecognized ' + y [ 0 ] + ' in workbook' ) ;
2014-01-28 16:35:26 +00:00
}
2017-03-20 21:57:44 +00:00
return x ;
2014-01-28 16:35:26 +00:00
} ) ;
2014-05-16 00:16:51 +00:00
if ( XMLNS . main . indexOf ( wb . xmlns ) === - 1 ) throw new Error ( "Unknown Namespace: " + wb . xmlns ) ;
2014-01-28 16:35:26 +00:00
2014-06-29 18:35:10 +00:00
parse _wb _defaults ( wb ) ;
2014-01-28 16:35:26 +00:00
return wb ;
}
2014-05-16 00:16:51 +00:00
var WB _XML _ROOT = writextag ( 'workbook' , null , {
'xmlns' : XMLNS . main [ 0 ] ,
//'xmlns:mx': XMLNS.mx,
//'xmlns:s': XMLNS.main[0],
'xmlns:r' : XMLNS . r
} ) ;
2018-01-23 09:09:53 +00:00
function write _wb _xml ( wb ) {
2014-06-29 18:35:10 +00:00
var o = [ XML _HEADER ] ;
o [ o . length ] = WB _XML _ROOT ;
2017-04-16 07:35:56 +00:00
var write _names = ( wb . Workbook && ( wb . Workbook . Names || [ ] ) . length > 0 ) ;
/* fileVersion */
/* fileSharing */
2017-06-03 07:23:15 +00:00
var workbookPr = ( { codeName : "ThisWorkbook" } ) ;
if ( wb . Workbook && wb . Workbook . WBProps ) {
WBPropsDef . forEach ( function ( x ) {
if ( ( wb . Workbook . WBProps [ x [ 0 ] ] ) == null ) return ;
if ( ( wb . Workbook . WBProps [ x [ 0 ] ] ) == x [ 1 ] ) return ;
workbookPr [ x [ 0 ] ] = ( wb . Workbook . WBProps [ x [ 0 ] ] ) ;
} ) ;
2017-11-20 02:13:37 +00:00
if ( wb . Workbook . WBProps . CodeName ) { workbookPr . codeName = wb . Workbook . WBProps . CodeName ; delete workbookPr . CodeName ; }
2017-06-03 07:23:15 +00:00
}
o [ o . length ] = ( writextag ( 'workbookPr' , null , workbookPr ) ) ;
2017-04-16 07:35:56 +00:00
/* workbookProtection */
/* bookViews */
2014-06-29 18:35:10 +00:00
o [ o . length ] = "<sheets>" ;
2017-03-31 21:50:32 +00:00
var sheets = wb . Workbook && wb . Workbook . Sheets || [ ] ;
for ( var i = 0 ; i != wb . SheetNames . length ; ++ i ) {
2018-01-23 09:09:53 +00:00
var sht = ( { name : escapexml ( wb . SheetNames [ i ] . slice ( 0 , 31 ) ) } ) ;
2017-03-31 21:50:32 +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 ) ) ;
}
2014-06-29 18:35:10 +00:00
o [ o . length ] = "</sheets>" ;
2017-04-16 07:35:56 +00:00
/* functionGroups */
/* externalReferences */
if ( write _names ) {
o [ o . length ] = "<definedNames>" ;
if ( wb . Workbook && wb . Workbook . Names ) wb . Workbook . Names . forEach ( function ( n ) {
var d = { name : n . Name } ;
if ( n . Comment ) d . comment = n . Comment ;
if ( n . Sheet != null ) d . localSheetId = "" + n . Sheet ;
if ( ! n . Ref ) return ;
o [ o . length ] = writextag ( 'definedName' , String ( n . Ref ) , d ) ;
} ) ;
o [ o . length ] = "</definedNames>" ;
}
/* calcPr */
/* oleSize */
/* customWorkbookViews */
/* pivotCaches */
/* smartTagPr */
/* smartTagTypes */
/* webPublishing */
/* fileRecoveryPr */
/* webPublishObjects */
/* extLst */
2014-06-29 18:35:10 +00:00
if ( o . length > 2 ) { o [ o . length ] = '</workbook>' ; o [ 1 ] = o [ 1 ] . replace ( "/>" , ">" ) ; }
2014-05-16 00:16:51 +00:00
return o . join ( "" ) ;
2014-06-29 18:35:10 +00:00
}
2018-02-14 05:26:28 +00:00
/* [MS-XLSB] 2.4.304 BrtBundleSh */
2014-06-29 18:35:10 +00:00
function parse _BrtBundleSh ( data , length ) {
2014-01-28 16:35:26 +00:00
var z = { } ;
2017-03-31 21:50:32 +00:00
z . Hidden = data . read _shift ( 4 ) ; //hsState ST_SheetState
2014-01-28 16:35:26 +00:00
z . iTabID = data . read _shift ( 4 ) ;
z . strRelID = parse _RelID ( data , length - 8 ) ;
z . name = parse _XLWideString ( data ) ;
return z ;
2014-06-29 18:35:10 +00:00
}
function write _BrtBundleSh ( data , o ) {
2014-05-29 22:32:13 +00:00
if ( ! o ) o = new _buf ( 127 ) ;
2017-03-31 21:50:32 +00:00
o . write _shift ( 4 , data . Hidden ) ;
2014-05-29 22:32:13 +00:00
o . write _shift ( 4 , data . iTabID ) ;
write _RelID ( data . strRelID , o ) ;
2018-01-23 09:09:53 +00:00
write _XLWideString ( data . name . slice ( 0 , 31 ) , o ) ;
2017-02-04 00:14:24 +00:00
return o . length > o . l ? o . slice ( 0 , o . l ) : o ;
2014-06-29 18:35:10 +00:00
}
2014-05-29 22:32:13 +00:00
2018-02-14 05:26:28 +00:00
/* [MS-XLSB] 2.4.815 BrtWbProp */
2014-06-29 18:35:10 +00:00
function parse _BrtWbProp ( data , length ) {
2017-06-03 07:23:15 +00:00
var o = ( { } ) ;
var flags = data . read _shift ( 4 ) ;
o . defaultThemeVersion = data . read _shift ( 4 ) ;
2014-05-29 22:32:13 +00:00
var strName = ( length > 8 ) ? parse _XLWideString ( data ) : "" ;
2017-11-20 02:13:37 +00:00
if ( strName . length > 0 ) o . CodeName = strName ;
2017-06-03 07:23:15 +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 ;
2014-06-29 18:35:10 +00:00
}
function write _BrtWbProp ( data , o ) {
2017-05-09 18:11:15 +00:00
if ( ! o ) o = new _buf ( 72 ) ;
2017-06-03 07:23:15 +00:00
var flags = 0 ;
if ( data ) {
/* TODO: mirror parse_BrtWbProp fields */
if ( data . filterPrivacy ) flags |= 0x08 ;
}
o . write _shift ( 4 , flags ) ;
2014-05-29 22:32:13 +00:00
o . write _shift ( 4 , 0 ) ;
2017-11-20 02:13:37 +00:00
write _XLSBCodeName ( data && data . CodeName || "ThisWorkbook" , o ) ;
2017-03-31 21:50:32 +00:00
return o . slice ( 0 , o . l ) ;
2014-06-29 18:35:10 +00:00
}
2014-05-29 22:32:13 +00:00
2014-06-29 18:35:10 +00:00
function parse _BrtFRTArchID$ ( data , length ) {
2014-05-29 22:32:13 +00:00
var o = { } ;
data . read _shift ( 4 ) ;
o . ArchID = data . read _shift ( 4 ) ;
data . l += length - 8 ;
return o ;
2014-06-29 18:35:10 +00:00
}
2014-01-28 16:35:26 +00:00
2018-02-14 05:26:28 +00:00
/* [MS-XLSB] 2.4.687 BrtName */
2017-02-19 21:11:48 +00:00
function parse _BrtName ( data , length , opts ) {
var end = data . l + length ;
2018-01-23 09:09:53 +00:00
data . l += 4 ; //var flags = data.read_shift(4);
data . l += 1 ; //var chKey = data.read_shift(1);
2017-02-19 21:11:48 +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 ) ;
2017-03-31 21:50:32 +00:00
//if(0 /* fProc */) {
2017-02-19 21:11:48 +00:00
// unusedstring1: XLNullableWideString
// description: XLNullableWideString
// helpTopic: XLNullableWideString
// unusedstring2: XLNullableWideString
2017-03-31 21:50:32 +00:00
//}
2017-02-19 21:11:48 +00:00
data . l = end ;
2017-12-15 02:01:07 +00:00
var out = ( { Name : name , Ptg : formula } ) ;
2017-04-16 07:35:56 +00:00
if ( itab < 0xFFFFFFF ) out . Sheet = itab ;
2017-12-15 02:01:07 +00:00
if ( comment ) out . Comment = comment ;
2017-04-16 07:35:56 +00:00
return out ;
2017-02-19 21:11:48 +00:00
}
2018-02-14 05:26:28 +00:00
/* [MS-XLSB] 2.1.7.61 Workbook */
2014-06-29 18:35:10 +00:00
function parse _wb _bin ( data , opts ) {
2014-01-28 16:35:26 +00:00
var wb = { AppVersion : { } , WBProps : { } , WBView : [ ] , Sheets : [ ] , CalcPr : { } , xmlns : "" } ;
2018-01-23 09:09:53 +00:00
var pass = false ;
2014-01-28 16:35:26 +00:00
2017-02-19 21:11:48 +00:00
if ( ! opts ) opts = { } ;
opts . biff = 12 ;
2017-04-16 07:35:56 +00:00
var Names = [ ] ;
2017-11-15 18:50:04 +00:00
var supbooks = ( [ [ ] ] ) ;
2017-04-16 07:35:56 +00:00
supbooks . SheetNames = [ ] ;
2017-11-15 18:50:04 +00:00
supbooks . XTI = [ ] ;
2017-02-19 21:11:48 +00:00
2017-04-09 04:07:43 +00:00
recordhopper ( data , function hopper _wb ( val , R _n , RT ) {
switch ( RT ) {
case 0x009C : /* 'BrtBundleSh' */
2017-04-16 07:35:56 +00:00
supbooks . SheetNames . push ( val . name ) ;
2017-04-09 04:07:43 +00:00
wb . Sheets . push ( val ) ; break ;
2014-01-28 16:35:26 +00:00
2017-07-10 22:29:24 +00:00
case 0x0099 : /* 'BrtWbProp' */
wb . WBProps = val ; break ;
2017-04-09 04:07:43 +00:00
case 0x0027 : /* 'BrtName' */
2017-11-15 18:50:04 +00:00
if ( val . Sheet != null ) opts . SID = val . Sheet ;
2017-04-16 07:35:56 +00:00
val . Ref = stringify _formula ( val . Ptg , null , null , supbooks , opts ) ;
2017-11-15 18:50:04 +00:00
delete opts . SID ;
2017-04-16 07:35:56 +00:00
delete val . Ptg ;
Names . push ( val ) ;
2017-02-19 21:11:48 +00:00
break ;
2017-04-09 04:07:43 +00:00
case 0x040C : /* 'BrtNameExt' */ break ;
2017-07-10 22:29:24 +00:00
case 0x0165 : /* 'BrtSupSelf' */
case 0x0166 : /* 'BrtSupSame' */
case 0x0163 : /* 'BrtSupBookSrc' */
case 0x029B : /* 'BrtSupAddin' */
2017-11-15 18:50:04 +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:29:24 +00:00
case 0x016A : /* 'BrtExternSheet' */
2017-11-15 18:50:04 +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:29:24 +00:00
case 0x0169 : /* 'BrtPlaceholderName' */
break ;
2017-06-03 07:23:15 +00:00
2017-05-09 18:11:15 +00:00
/* case 'BrtModelTimeGroupingCalcCol' */
2018-03-19 22:14:14 +00:00
case 0x0C00 : /* 'BrtUid' */
case 0x0C01 : /* 'BrtRevisionPtr' */
2017-04-09 04:07:43 +00:00
case 0x0817 : /* 'BrtAbsPath15' */
case 0x0216 : /* 'BrtBookProtection' */
case 0x02A5 : /* 'BrtBookProtectionIso' */
case 0x009E : /* 'BrtBookView' */
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' */
pass = true ; break ;
case 0x0024 : /* 'BrtFRTEnd' */
pass = false ; break ;
case 0x0025 : /* 'BrtACBegin' */ break ;
case 0x0026 : /* 'BrtACEnd' */ break ;
case 0x0010 : /* 'BrtFRTArchID$' */ break ;
2017-02-19 21:11:48 +00:00
2017-04-09 04:07:43 +00:00
default :
2017-05-09 18:11:15 +00:00
if ( ( R _n || "" ) . indexOf ( "Begin" ) > 0 ) { /* empty */ }
else if ( ( R _n || "" ) . indexOf ( "End" ) > 0 ) { /* empty */ }
2017-04-09 04:07:43 +00:00
else if ( ! pass || opts . WTF ) throw new Error ( "Unexpected record " + RT + " " + R _n ) ;
2014-01-28 16:35:26 +00:00
}
2017-02-19 21:11:48 +00:00
} , opts ) ;
2014-01-28 16:35:26 +00:00
2014-06-29 18:35:10 +00:00
parse _wb _defaults ( wb ) ;
2014-01-28 16:35:26 +00:00
2017-03-13 07:34:05 +00:00
// $FlowIgnore
2017-02-19 21:11:48 +00:00
wb . Names = Names ;
2017-11-15 18:50:04 +00:00
( wb ) . supbooks = supbooks ;
2014-01-28 16:35:26 +00:00
return wb ;
2014-06-29 18:35:10 +00:00
}
2014-05-16 00:16:51 +00:00
2018-01-23 09:09:53 +00:00
function write _BUNDLESHS ( ba , wb ) {
2014-05-29 22:32:13 +00:00
write _record ( ba , "BrtBeginBundleShs" ) ;
2014-06-29 18:35:10 +00:00
for ( var idx = 0 ; idx != wb . SheetNames . length ; ++ idx ) {
2017-03-31 21:50:32 +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 ] } ;
2014-05-29 22:32:13 +00:00
write _record ( ba , "BrtBundleSh" , write _BrtBundleSh ( d ) ) ;
2014-06-29 18:35:10 +00:00
}
2014-05-29 22:32:13 +00:00
write _record ( ba , "BrtEndBundleShs" ) ;
}
2014-05-16 00:16:51 +00:00
2018-02-14 05:26:28 +00:00
/* [MS-XLSB] 2.4.649 BrtFileVersion */
2014-05-29 22:32:13 +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 ) ;
o . length = o . l ;
2017-02-04 00:14:24 +00:00
return o . length > o . l ? o . slice ( 0 , o . l ) : o ;
2014-05-29 22:32:13 +00:00
}
2018-02-14 05:26:28 +00:00
/* [MS-XLSB] 2.4.301 BrtBookView */
2017-03-31 21:50:32 +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:09:53 +00:00
function write _BOOKVIEWS ( ba , wb ) {
2017-03-31 21:50:32 +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 ;
2014-05-29 22:32:13 +00:00
write _record ( ba , "BrtBeginBookViews" ) ;
2017-03-31 21:50:32 +00:00
write _record ( ba , "BrtBookView" , write _BrtBookView ( vistab ) ) ;
2014-05-29 22:32:13 +00:00
/* 1*(BrtBookView *FRT) */
write _record ( ba , "BrtEndBookViews" ) ;
}
2018-02-14 05:26:28 +00:00
/* [MS-XLSB] 2.4.305 BrtCalcProp */
2018-01-23 09:09:53 +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 ) {
2014-05-29 22:32:13 +00:00
if ( ! o ) o = new _buf ( 26 ) ;
2018-01-23 09:09:53 +00:00
o . write _shift ( 4 , 0 ) ; // force recalc
2014-05-29 22:32:13 +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:09:53 +00:00
} * /
2014-05-29 22:32:13 +00:00
2018-02-14 05:26:28 +00:00
/* [MS-XLSB] 2.4.646 BrtFileRecover */
2018-01-23 09:09:53 +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 ) {
2014-05-29 22:32:13 +00:00
if ( ! o ) o = new _buf ( 1 ) ;
o . write _shift ( 1 , 0 ) ;
return o ;
2018-01-23 09:09:53 +00:00
} * /
2014-05-29 22:32:13 +00:00
2018-02-14 05:26:28 +00:00
/* [MS-XLSB] 2.1.7.61 Workbook */
2014-06-29 18:35:10 +00:00
function write _wb _bin ( wb , opts ) {
2014-05-29 22:32:13 +00:00
var ba = buf _array ( ) ;
write _record ( ba , "BrtBeginBook" ) ;
write _record ( ba , "BrtFileVersion" , write _BrtFileVersion ( ) ) ;
/* [[BrtFileSharingIso] BrtFileSharing] */
2017-06-03 07:23:15 +00:00
write _record ( ba , "BrtWbProp" , write _BrtWbProp ( wb . Workbook && wb . Workbook . WBProps || null ) ) ;
2014-05-29 22:32:13 +00:00
/* [ACABSPATH] */
/* [[BrtBookProtectionIso] BrtBookProtection] */
2017-03-31 21:50:32 +00:00
write _BOOKVIEWS ( ba , wb , opts ) ;
2014-05-29 22:32:13 +00:00
write _BUNDLESHS ( ba , wb , opts ) ;
/* [FNGROUP] */
/* [EXTERNALS] */
/* *BrtName */
2017-03-31 21:50:32 +00:00
/* write_record(ba, "BrtCalcProp", write_BrtCalcProp()); */
2014-05-29 22:32:13 +00:00
/* [BrtOleSize] */
/* *(BrtUserBookView *FRT) */
/* [PIVOTCACHEIDS] */
/* [BrtWbFactoid] */
/* [SMARTTAGTYPES] */
/* [BrtWebOpt] */
2017-03-31 21:50:32 +00:00
/* write_record(ba, "BrtFileRecover", write_BrtFileRecover()); */
2014-05-29 22:32:13 +00:00
/* [WEBPUBITEMS] */
/* [CRERRS] */
/* FRTWORKBOOK */
write _record ( ba , "BrtEndBook" ) ;
return ba . end ( ) ;
2014-06-29 18:35:10 +00:00
}
2014-02-12 06:19:45 +00:00
function parse _wb ( data , name , opts ) {
2017-02-22 07:48:52 +00:00
if ( name . slice ( - 4 ) === ".bin" ) return parse _wb _bin ( ( data ) , opts ) ;
2017-02-11 01:58:22 +00:00
return parse _wb _xml ( ( data ) , opts ) ;
2014-02-12 06:19:45 +00:00
}
2017-11-20 02:13:37 +00:00
function parse _ws ( data , name , idx , opts , rels , wb , themes , styles ) {
if ( name . slice ( - 4 ) === ".bin" ) return parse _ws _bin ( ( data ) , opts , idx , rels , wb , themes , styles ) ;
return parse _ws _xml ( ( data ) , opts , idx , rels , wb , themes , styles ) ;
2012-12-03 19:47:44 +00:00
}
2017-11-20 02:13:37 +00:00
function parse _cs ( data , name , idx , opts , rels , wb , themes , styles ) {
if ( name . slice ( - 4 ) === ".bin" ) return parse _cs _bin ( ( data ) , opts , idx , rels , wb , themes , styles ) ;
return parse _cs _xml ( ( data ) , opts , idx , rels , wb , themes , styles ) ;
2017-03-28 22:07:46 +00:00
}
2017-11-20 02:13:37 +00:00
function parse _ms ( data , name , idx , opts , rels , wb , themes , styles ) {
if ( name . slice ( - 4 ) === ".bin" ) return parse _ms _bin ( ( data ) , opts , idx , rels , wb , themes , styles ) ;
return parse _ms _xml ( ( data ) , opts , idx , rels , wb , themes , styles ) ;
2017-03-28 22:07:46 +00:00
}
2017-11-20 02:13:37 +00:00
function parse _ds ( data , name , idx , opts , rels , wb , themes , styles ) {
if ( name . slice ( - 4 ) === ".bin" ) return parse _ds _bin ( ( data ) , opts , idx , rels , wb , themes , styles ) ;
return parse _ds _xml ( ( data ) , opts , idx , rels , wb , themes , styles ) ;
2017-03-28 22:07:46 +00:00
}
2017-03-20 21:57:44 +00:00
function parse _sty ( data , name , themes , opts ) {
if ( name . slice ( - 4 ) === ".bin" ) return parse _sty _bin ( ( data ) , themes , opts ) ;
return parse _sty _xml ( ( data ) , themes , opts ) ;
2014-01-28 16:35:26 +00:00
}
2014-05-29 22:32:13 +00:00
function parse _theme ( data , name , opts ) {
return parse _theme _xml ( data , opts ) ;
}
2014-02-12 06:19:45 +00:00
function parse _sst ( data , name , opts ) {
2017-02-22 07:48:52 +00:00
if ( name . slice ( - 4 ) === ".bin" ) return parse _sst _bin ( ( data ) , opts ) ;
2017-02-11 01:58:22 +00:00
return parse _sst _xml ( ( data ) , opts ) ;
2014-01-28 16:35:26 +00:00
}
2014-03-29 02:12:07 +00:00
function parse _cmnt ( data , name , opts ) {
2017-02-22 07:48:52 +00:00
if ( name . slice ( - 4 ) === ".bin" ) return parse _comments _bin ( ( data ) , opts ) ;
2017-02-11 01:58:22 +00:00
return parse _comments _xml ( ( data ) , opts ) ;
2014-03-29 02:12:07 +00:00
}
2014-03-29 22:53:44 +00:00
function parse _cc ( data , name , opts ) {
2017-08-19 23:13:21 +00:00
if ( name . slice ( - 4 ) === ".bin" ) return parse _cc _bin ( ( data ) , name , opts ) ;
return parse _cc _xml ( ( data ) , name , opts ) ;
}
function parse _xlink ( data , name , opts ) {
if ( name . slice ( - 4 ) === ".bin" ) return parse _xlink _bin ( ( data ) , name , opts ) ;
return parse _xlink _xml ( ( data ) , name , opts ) ;
2014-03-29 22:53:44 +00:00
}
2014-05-16 00:16:51 +00:00
function write _wb ( wb , name , opts ) {
2017-02-22 07:48:52 +00:00
return ( name . slice ( - 4 ) === ".bin" ? write _wb _bin : write _wb _xml ) ( wb , opts ) ;
2014-05-16 00:16:51 +00:00
}
2017-03-31 21:50:32 +00:00
function write _ws ( data , name , opts , wb , rels ) {
return ( name . slice ( - 4 ) === ".bin" ? write _ws _bin : write _ws _xml ) ( data , opts , wb , rels ) ;
2014-05-16 00:16:51 +00:00
}
2018-01-23 09:09:53 +00:00
// eslint-disable-next-line no-unused-vars
2017-04-09 04:07:43 +00:00
function write _cs ( data , name , opts , wb , rels ) {
return ( name . slice ( - 4 ) === ".bin" ? write _cs _bin : write _cs _xml ) ( data , opts , wb , rels ) ;
}
2014-05-16 00:16:51 +00:00
function write _sty ( data , name , opts ) {
2017-02-22 07:48:52 +00:00
return ( name . slice ( - 4 ) === ".bin" ? write _sty _bin : write _sty _xml ) ( data , opts ) ;
2014-05-16 00:16:51 +00:00
}
function write _sst ( data , name , opts ) {
2017-02-22 07:48:52 +00:00
return ( name . slice ( - 4 ) === ".bin" ? write _sst _bin : write _sst _xml ) ( data , opts ) ;
2014-05-16 00:16:51 +00:00
}
2017-04-03 06:04:35 +00:00
function write _cmnt ( data , name , opts ) {
2017-02-22 07:48:52 +00:00
return ( name . slice ( - 4 ) === ".bin" ? write _comments _bin : write _comments _xml ) ( data , opts ) ;
2014-05-16 00:16:51 +00:00
}
2017-04-03 06:04:35 +00:00
/ *
2017-02-11 01:58:22 +00:00
function write _cc ( data , name : string , opts ) {
2017-02-22 07:48:52 +00:00
return ( name . slice ( - 4 ) === ".bin" ? write _cc _bin : write _cc _xml ) ( data , opts ) ;
2014-05-16 00:16:51 +00:00
}
* /
2015-04-02 22:14:07 +00:00
var attregexg2 = /([\w:]+)=((?:")([^"]*)(?:")|(?:')([^']*)(?:'))/g ;
var attregex2 = /([\w:]+)=((?:")(?:[^"]*)(?:")|(?:')(?:[^']*)(?:'))/ ;
var _chr = function ( c ) { return String . fromCharCode ( c ) ; } ;
function xlml _parsexmltag ( tag , skip _root ) {
var words = tag . split ( /\s+/ ) ;
2017-02-11 01:58:22 +00:00
var z = ( [ ] ) ; if ( ! skip _root ) z [ 0 ] = words [ 0 ] ;
2015-04-02 22:14:07 +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 ) ;
2018-01-23 09:09:53 +00:00
if ( ( j = y [ 1 ] . indexOf ( ":" ) ) === - 1 ) z [ y [ 1 ] ] = y [ 2 ] . slice ( 1 , y [ 2 ] . length - 1 ) ;
2015-04-02 22:14:07 +00:00
else {
2018-01-23 09:09:53 +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 ) ;
2015-04-02 22:14:07 +00:00
}
}
return z ;
}
function xlml _parsexmltagobj ( tag ) {
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 ) ;
2018-01-23 09:09:53 +00:00
if ( ( j = y [ 1 ] . indexOf ( ":" ) ) === - 1 ) z [ y [ 1 ] ] = y [ 2 ] . slice ( 1 , y [ 2 ] . length - 1 ) ;
2015-04-02 22:14:07 +00:00
else {
2018-01-23 09:09:53 +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 ) ;
2015-04-02 22:14:07 +00:00
}
}
return z ;
}
// ----
function xlml _format ( format , value ) {
var fmt = XLMLFormatMap [ format ] || unescapexml ( format ) ;
if ( fmt === "General" ) return SSF . _general ( value ) ;
return SSF . format ( fmt , value ) ;
}
2017-12-30 05:41:41 +00:00
function xlml _set _custprop ( Custprops , key , cp , val ) {
2017-03-13 07:34:05 +00:00
var oval = val ;
2015-04-02 22:14:07 +00:00
switch ( ( cp [ 0 ] . match ( /dt:dt="([\w.]+)"/ ) || [ "" , "" ] ) [ 1 ] ) {
2017-03-13 07:34:05 +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:56:21 +00:00
case "date" : case "dateTime.tz" : oval = parseDate ( val ) ; break ;
2015-04-02 22:14:07 +00:00
case "i8" : case "string" : case "fixed" : case "uuid" : case "bin.base64" : break ;
2017-03-13 07:34:05 +00:00
default : throw new Error ( "bad custprop:" + cp [ 0 ] ) ;
2015-04-02 22:14:07 +00:00
}
2017-12-30 05:41:41 +00:00
Custprops [ unescapexml ( key ) ] = oval ;
2015-04-02 22:14:07 +00:00
}
function safe _format _xlml ( cell , nf , o ) {
2017-03-16 04:39:50 +00:00
if ( cell . t === 'z' ) return ;
2017-04-21 22:03:40 +00:00
if ( ! o || o . cellText !== false ) try {
2015-04-02 22:14:07 +00:00
if ( cell . t === 'e' ) { cell . w = cell . w || BErr [ cell . v ] ; }
else if ( nf === "General" ) {
if ( cell . t === 'n' ) {
if ( ( cell . v | 0 ) === cell . v ) cell . w = SSF . _general _int ( cell . v ) ;
else cell . w = SSF . _general _num ( cell . v ) ;
}
else cell . w = SSF . _general ( cell . v ) ;
}
else cell . w = xlml _format ( nf || "General" , cell . v ) ;
2017-04-21 22:03:40 +00:00
} catch ( e ) { if ( o . WTF ) throw e ; }
try {
2017-03-23 01:56:21 +00:00
var z = XLMLFormatMap [ nf ] || nf || "General" ;
if ( o . cellNF ) cell . z = z ;
if ( o . cellDates && cell . t == 'n' && SSF . is _date ( z ) ) {
2017-06-03 07:23:15 +00:00
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-23 01:56:21 +00:00
}
2015-04-02 22:14:07 +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-02-19 21:11:48 +00:00
function parse _xlml _data ( xml , ss , data , cell , base , styles , csty , row , arrayf , o ) {
2015-04-02 22:14:07 +00:00
var nf = "General" , sid = cell . StyleID , S = { } ; o = o || { } ;
var interiors = [ ] ;
2017-03-10 00:36:03 +00:00
var i = 0 ;
2015-04-02 22:14:07 +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 ) ) ;
2017-02-19 21:11:48 +00:00
cell . v = xml . indexOf ( "<" ) > - 1 ? unescapexml ( ss ) : cell . r ;
2015-04-02 22:14:07 +00:00
break ;
case 'DateTime' :
2017-05-17 04:27:55 +00:00
if ( xml . slice ( - 1 ) != "Z" ) xml += "Z" ;
2017-03-23 01:56:21 +00:00
cell . v = ( parseDate ( xml ) - new Date ( Date . UTC ( 1899 , 11 , 30 ) ) ) / ( 24 * 60 * 60 * 1000 ) ;
2015-04-02 22:14:07 +00:00
if ( cell . v !== cell . v ) cell . v = unescapexml ( xml ) ;
2017-03-20 21:57:44 +00:00
else if ( cell . v < 60 ) cell . v = cell . v - 1 ;
2015-04-02 22:14:07 +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-30 16:28:24 +00:00
case 'Error' : cell . t = 'e' ; cell . v = RBErr [ xml ] ; if ( o . cellText !== false ) cell . w = xml ; break ;
2017-04-03 06:04:35 +00:00
default : cell . t = 's' ; cell . v = xlml _fixstr ( ss || xml ) ; break ;
2015-04-02 22:14:07 +00:00
}
safe _format _xlml ( cell , nf , o ) ;
2017-04-30 16:28:24 +00:00
if ( o . cellFormula !== false ) {
2017-02-19 21:11:48 +00:00
if ( cell . Formula ) {
var fstr = unescapexml ( cell . Formula ) ;
/* strictly speaking, the leading = is required but some writers omit */
2018-01-23 09:09:53 +00:00
if ( fstr . charCodeAt ( 0 ) == 61 /* = */ ) fstr = fstr . slice ( 1 ) ;
2017-02-19 21:11:48 +00:00
cell . f = rc _to _a1 ( fstr , base ) ;
2017-04-03 06:04:35 +00:00
delete cell . Formula ;
2017-02-19 21:11:48 +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 ] ;
}
2015-04-02 22:14:07 +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:50:04 +00:00
if ( cell . StyleID !== undefined ) cell . ixfe = cell . StyleID ;
2015-04-02 22:14:07 +00:00
}
function xlml _clean _comment ( comment ) {
2017-04-03 06:04:35 +00:00
comment . t = comment . v || "" ;
comment . t = comment . t . replace ( /\r\n/g , "\n" ) . replace ( /\r/g , "\n" ) ;
2015-04-02 22:14:07 +00:00
comment . v = comment . w = comment . ixfe = undefined ;
}
function xlml _normalize ( d ) {
if ( has _buf && Buffer . isBuffer ( d ) ) return d . toString ( 'utf8' ) ;
if ( typeof d === 'string' ) return d ;
2018-03-13 01:55:12 +00:00
/* duktape */
if ( typeof Uint8Array !== 'undefined' && d instanceof Uint8Array ) return utf8read ( a2s ( ab2a ( d ) ) ) ;
2017-02-11 01:58:22 +00:00
throw new Error ( "Bad input format: expected Buffer or string" ) ;
2015-04-02 22:14:07 +00:00
}
/* TODO: Everything */
2017-03-10 00:36:03 +00:00
/* UOS uses CJK in tags */
2018-02-21 06:20:15 +00:00
var xlmlregex = /<(\/?)([^\s?>!\/:]*:|)([^\s?>:\/]+)[^>]*>/mg ;
2017-03-10 00:36:03 +00:00
//var xlmlregex = /<(\/?)([a-z0-9]*:|)(\w+)[^>]*>/mg;
2017-06-24 06:48:44 +00:00
function parse _xlml _xml ( d , _opts ) {
var opts = _opts || { } ;
2017-03-25 22:38:26 +00:00
make _ssf ( SSF ) ;
2017-02-24 11:14:53 +00:00
var str = debom ( xlml _normalize ( d ) ) ;
2017-12-30 05:41:41 +00:00
if ( opts . type == 'binary' || opts . type == 'array' || opts . type == 'base64' ) {
2017-09-30 06:19:01 +00:00
if ( typeof cptable !== 'undefined' ) str = cptable . utils . decode ( 65001 , char _codes ( str ) ) ;
else str = utf8read ( str ) ;
}
2017-07-28 23:54:51 +00:00
var opening = str . slice ( 0 , 1024 ) . toLowerCase ( ) , ishtml = false ;
if ( opening . indexOf ( "<?xml" ) == - 1 ) [ "html" , "table" , "head" , "meta" , "script" , "style" , "div" ] . forEach ( function ( tag ) { if ( opening . indexOf ( "<" + tag ) >= 0 ) ishtml = true ; } ) ;
if ( ishtml ) return HTML _ . to _workbook ( str , opts ) ;
2015-04-02 22:14:07 +00:00
var Rn ;
var state = [ ] , tmp ;
2017-04-09 04:07:43 +00:00
if ( DENSE != null && opts . dense == null ) opts . dense = DENSE ;
var sheets = { } , sheetnames = [ ] , cursheet = ( opts . dense ? [ ] : { } ) , sheetname = "" ;
2018-01-23 09:09:53 +00:00
var table = { } , cell = ( { } ) , row = { } ; // eslint-disable-line no-unused-vars
2017-02-11 01:58:22 +00:00
var dtag = xlml _parsexmltag ( '<Data ss:Type="String">' ) , didx = 0 ;
2015-04-02 22:14:07 +00:00
var c = 0 , r = 0 ;
2017-02-04 00:14:24 +00:00
var refguess = { s : { r : 2000000 , c : 2000000 } , e : { r : 0 , c : 0 } } ;
2015-04-02 22:14:07 +00:00
var styles = { } , stag = { } ;
var ss = "" , fidx = 0 ;
2017-12-30 05:41:41 +00:00
var merges = [ ] ;
var Props = { } , Custprops = { } , pidx = 0 , cp = [ ] ;
var comments = [ ] , comment = ( { } ) ;
2017-03-20 21:57:44 +00:00
var cstys = [ ] , csty , seencol = false ;
2017-02-19 21:11:48 +00:00
var arrayf = [ ] ;
2017-10-17 00:36:51 +00:00
var rowinfo = [ ] , rowobj = { } , cc = 0 , rr = 0 ;
2017-06-03 07:23:15 +00:00
var Workbook = ( { Sheets : [ ] , WBProps : { date1904 : false } } ) , wsprops = { } ;
2015-04-02 22:14:07 +00:00
xlmlregex . lastIndex = 0 ;
2017-06-24 06:48:44 +00:00
str = str . replace ( /<!--([\s\S]*?)-->/mg , "" ) ;
2015-04-02 22:14:07 +00:00
while ( ( Rn = xlmlregex . exec ( str ) ) ) switch ( Rn [ 3 ] ) {
case 'Data' :
if ( state [ state . length - 1 ] [ 1 ] ) break ;
2017-02-19 21:11:48 +00:00
if ( Rn [ 1 ] === '/' ) parse _xlml _data ( str . slice ( didx , Rn . index ) , ss , dtag , state [ state . length - 1 ] [ 0 ] == "Comment" ? comment : cell , { c : c , r : r } , styles , cstys [ c ] , row , arrayf , opts ) ;
2015-04-02 22:14:07 +00:00
else { ss = "" ; dtag = xlml _parsexmltag ( Rn [ 0 ] ) ; didx = Rn . index + Rn [ 0 ] . length ; }
break ;
case 'Cell' :
if ( Rn [ 1 ] === '/' ) {
if ( comments . length > 0 ) cell . c = comments ;
2017-04-09 04:07:43 +00:00
if ( ( ! opts . sheetRows || opts . sheetRows > r ) && cell . v !== undefined ) {
if ( opts . dense ) {
if ( ! cursheet [ r ] ) cursheet [ r ] = [ ] ;
cursheet [ r ] [ c ] = cell ;
} else cursheet [ encode _col ( c ) + encode _row ( r ) ] = cell ;
}
2015-04-02 22:14:07 +00:00
if ( cell . HRef ) {
2017-12-15 02:01:07 +00:00
cell . l = ( { Target : cell . HRef } ) ;
if ( cell . HRefScreenTip ) cell . l . Tooltip = cell . HRefScreenTip ;
2017-03-28 22:07:46 +00:00
delete cell . HRef ; delete cell . HRefScreenTip ;
2015-04-02 22:14:07 +00:00
}
if ( cell . MergeAcross || cell . MergeDown ) {
2017-10-17 00:36:51 +00:00
cc = c + ( parseInt ( cell . MergeAcross , 10 ) | 0 ) ;
rr = r + ( parseInt ( cell . MergeDown , 10 ) | 0 ) ;
2017-12-30 05:41:41 +00:00
merges . push ( { s : { c : c , r : r } , e : { c : cc , r : rr } } ) ;
2015-04-02 22:14:07 +00:00
}
2017-03-16 04:39:50 +00:00
if ( ! opts . sheetStubs ) { if ( cell . MergeAcross ) c = cc + 1 ; else ++ c ; }
else if ( cell . MergeAcross || cell . MergeDown ) {
for ( var cma = c ; cma <= cc ; ++ cma ) {
for ( var cmd = r ; cmd <= rr ; ++ cmd ) {
2017-04-09 04:07:43 +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-16 04:39:50 +00:00
}
}
c = cc + 1 ;
}
else ++ c ;
2015-04-02 22:14:07 +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 07:48:52 +00:00
if ( Rn [ 0 ] . slice ( - 2 ) === "/>" ) ++ c ;
2015-04-02 22:14:07 +00:00
comments = [ ] ;
}
break ;
case 'Row' :
2017-02-22 07:48:52 +00:00
if ( Rn [ 1 ] === '/' || Rn [ 0 ] . slice ( - 2 ) === "/>" ) {
2015-04-02 22:14:07 +00:00
if ( r < refguess . s . r ) refguess . s . r = r ;
if ( r > refguess . e . r ) refguess . e . r = r ;
2017-02-22 07:48:52 +00:00
if ( Rn [ 0 ] . slice ( - 2 ) === "/>" ) {
2015-04-02 22:14:07 +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-30 16:28:24 +00:00
rowobj = { } ;
2017-06-10 01:56:23 +00:00
if ( row . AutoFitHeight == "0" || row . Height ) {
2017-04-30 16:28:24 +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 ; }
2015-04-02 22:14:07 +00:00
}
break ;
case 'Worksheet' : /* TODO: read range from FullRows/FullColumns */
if ( Rn [ 1 ] === '/' ) {
2017-03-13 07:34:05 +00:00
if ( ( tmp = state . pop ( ) ) [ 0 ] !== Rn [ 3 ] ) throw new Error ( "Bad state: " + tmp . join ( "|" ) ) ;
2015-04-02 22:14:07 +00:00
sheetnames . push ( sheetname ) ;
2018-04-06 06:36:52 +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:41:41 +00:00
if ( merges . length ) cursheet [ "!merges" ] = merges ;
2017-03-20 21:57:44 +00:00
if ( cstys . length > 0 ) cursheet [ "!cols" ] = cstys ;
if ( rowinfo . length > 0 ) cursheet [ "!rows" ] = rowinfo ;
2015-04-02 22:14:07 +00:00
sheets [ sheetname ] = cursheet ;
} else {
2017-02-04 00:14:24 +00:00
refguess = { s : { r : 2000000 , c : 2000000 } , e : { r : 0 , c : 0 } } ;
2015-04-02 22:14:07 +00:00
r = c = 0 ;
state . push ( [ Rn [ 3 ] , false ] ) ;
tmp = xlml _parsexmltag ( Rn [ 0 ] ) ;
2017-03-13 07:34:05 +00:00
sheetname = unescapexml ( tmp . Name ) ;
2017-04-09 04:07:43 +00:00
cursheet = ( opts . dense ? [ ] : { } ) ;
2017-12-30 05:41:41 +00:00
merges = [ ] ;
2017-03-20 21:57:44 +00:00
arrayf = [ ] ;
rowinfo = [ ] ;
2017-03-31 21:50:32 +00:00
wsprops = { name : sheetname , Hidden : 0 } ;
Workbook . Sheets . push ( wsprops ) ;
2015-04-02 22:14:07 +00:00
}
break ;
case 'Table' :
2017-03-13 07:34:05 +00:00
if ( Rn [ 1 ] === '/' ) { if ( ( tmp = state . pop ( ) ) [ 0 ] !== Rn [ 3 ] ) throw new Error ( "Bad state: " + tmp . join ( "|" ) ) ; }
2015-04-02 22:14:07 +00:00
else if ( Rn [ 0 ] . slice ( - 2 ) == "/>" ) break ;
else {
table = xlml _parsexmltag ( Rn [ 0 ] ) ;
state . push ( [ Rn [ 3 ] , false ] ) ;
2017-03-20 21:57:44 +00:00
cstys = [ ] ; seencol = false ;
2015-04-02 22:14:07 +00:00
}
break ;
case 'Style' :
if ( Rn [ 1 ] === '/' ) process _style _xlml ( styles , stag , opts ) ;
else stag = xlml _parsexmltag ( Rn [ 0 ] ) ;
break ;
case 'NumberFormat' :
2017-03-25 22:38:26 +00:00
stag . nf = unescapexml ( xlml _parsexmltag ( Rn [ 0 ] ) . Format || "General" ) ;
if ( XLMLFormatMap [ stag . nf ] ) stag . nf = XLMLFormatMap [ stag . nf ] ;
for ( var ssfidx = 0 ; ssfidx != 0x188 ; ++ ssfidx ) if ( SSF . _table [ ssfidx ] == stag . nf ) break ;
if ( ssfidx == 0x188 ) for ( ssfidx = 0x39 ; ssfidx != 0x188 ; ++ ssfidx ) if ( SSF . _table [ ssfidx ] == null ) { SSF . load ( stag . nf , ssfidx ) ; break ; }
2015-04-02 22:14:07 +00:00
break ;
case 'Column' :
if ( state [ state . length - 1 ] [ 0 ] !== 'Table' ) break ;
csty = xlml _parsexmltag ( Rn [ 0 ] ) ;
2017-04-30 16:28:24 +00:00
if ( csty . Hidden ) { csty . hidden = true ; delete csty . Hidden ; }
if ( csty . Width ) csty . wpx = parseInt ( csty . Width , 10 ) ;
2017-03-20 21:57:44 +00:00
if ( ! seencol && csty . wpx > 10 ) {
2017-04-30 16:28:24 +00:00
seencol = true ; MDW = DEF _MDW ; //find_mdw_wpx(csty.wpx);
2017-03-20 21:57:44 +00:00
for ( var _col = 0 ; _col < cstys . length ; ++ _col ) if ( cstys [ _col ] ) process _col ( cstys [ _col ] ) ;
}
if ( seencol ) process _col ( csty ) ;
2015-04-02 22:14:07 +00:00
cstys [ ( csty . Index - 1 || cstys . length ) ] = csty ;
2017-03-20 21:57:44 +00:00
for ( var i = 0 ; i < + csty . Span ; ++ i ) cstys [ cstys . length ] = dup ( csty ) ;
2015-04-02 22:14:07 +00:00
break ;
2017-04-16 07:35:56 +00:00
case 'NamedRange' :
if ( ! Workbook . Names ) Workbook . Names = [ ] ;
var _NamedRange = parsexmltag ( Rn [ 0 ] ) ;
2017-05-17 04:27:55 +00:00
var _DefinedName = ( {
2017-04-16 07:35:56 +00:00
Name : _NamedRange . Name ,
2018-01-23 09:09:53 +00:00
Ref : rc _to _a1 ( _NamedRange . RefersTo . slice ( 1 ) , { r : 0 , c : 0 } )
2017-05-17 04:27:55 +00:00
} ) ;
2017-04-16 07:35:56 +00:00
if ( Workbook . Sheets . length > 0 ) _DefinedName . Sheet = Workbook . Sheets . length - 1 ;
2017-05-17 04:27:55 +00:00
Workbook . Names . push ( _DefinedName ) ;
2017-04-16 07:35:56 +00:00
break ;
2015-04-02 22:14:07 +00:00
case 'NamedCell' : break ;
case 'B' : break ;
case 'I' : break ;
case 'U' : break ;
case 'S' : break ;
case 'Sub' : break ;
case 'Sup' : break ;
case 'Span' : break ;
case 'Border' : break ;
case 'Alignment' : break ;
case 'Borders' : break ;
case 'Font' :
2017-02-22 07:48:52 +00:00
if ( Rn [ 0 ] . slice ( - 2 ) === "/>" ) break ;
2015-04-02 22:14:07 +00:00
else if ( Rn [ 1 ] === "/" ) ss += str . slice ( fidx , Rn . index ) ;
else fidx = Rn . index + Rn [ 0 ] . length ;
break ;
case 'Interior' :
if ( ! opts . cellStyles ) break ;
stag . Interior = xlml _parsexmltag ( Rn [ 0 ] ) ;
break ;
case 'Protection' : break ;
case 'Author' :
case 'Title' :
case 'Description' :
case 'Created' :
case 'Keywords' :
case 'Subject' :
case 'Category' :
case 'Company' :
case 'LastAuthor' :
case 'LastSaved' :
case 'LastPrinted' :
case 'Version' :
case 'Revision' :
case 'TotalTime' :
case 'HyperlinkBase' :
case 'Manager' :
2017-04-16 07:35:56 +00:00
case 'ContentStatus' :
case 'Identifier' :
case 'Language' :
2017-08-19 23:13:21 +00:00
case 'AppName' :
2017-02-22 07:48:52 +00:00
if ( Rn [ 0 ] . slice ( - 2 ) === "/>" ) break ;
2015-04-02 22:14:07 +00:00
else if ( Rn [ 1 ] === "/" ) xlml _set _prop ( Props , Rn [ 3 ] , str . slice ( pidx , Rn . index ) ) ;
else pidx = Rn . index + Rn [ 0 ] . length ;
break ;
case 'Paragraphs' : break ;
case 'Styles' :
case 'Workbook' :
2017-03-13 07:34:05 +00:00
if ( Rn [ 1 ] === '/' ) { if ( ( tmp = state . pop ( ) ) [ 0 ] !== Rn [ 3 ] ) throw new Error ( "Bad state: " + tmp . join ( "|" ) ) ; }
2015-04-02 22:14:07 +00:00
else state . push ( [ Rn [ 3 ] , false ] ) ;
break ;
case 'Comment' :
if ( Rn [ 1 ] === '/' ) {
2017-03-13 07:34:05 +00:00
if ( ( tmp = state . pop ( ) ) [ 0 ] !== Rn [ 3 ] ) throw new Error ( "Bad state: " + tmp . join ( "|" ) ) ;
2015-04-02 22:14:07 +00:00
xlml _clean _comment ( comment ) ;
comments . push ( comment ) ;
} else {
state . push ( [ Rn [ 3 ] , false ] ) ;
tmp = xlml _parsexmltag ( Rn [ 0 ] ) ;
2017-12-30 05:41:41 +00:00
comment = ( { a : tmp . Author } ) ;
2015-04-02 22:14:07 +00:00
}
break ;
2017-04-16 07:35:56 +00:00
case 'AutoFilter' :
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 ;
2015-04-02 22:14:07 +00:00
case 'Name' : break ;
case 'ComponentOptions' :
case 'DocumentProperties' :
case 'CustomDocumentProperties' :
case 'OfficeDocumentSettings' :
case 'PivotTable' :
case 'PivotCache' :
case 'Names' :
case 'MapInfo' :
case 'PageBreaks' :
case 'QueryTable' :
case 'DataValidation' :
case 'Sorting' :
case 'Schema' :
case 'data' :
case 'ConditionalFormatting' :
case 'SmartTagType' :
case 'SmartTags' :
case 'ExcelWorkbook' :
case 'WorkbookOptions' :
case 'WorksheetOptions' :
2017-03-13 07:34:05 +00:00
if ( Rn [ 1 ] === '/' ) { if ( ( tmp = state . pop ( ) ) [ 0 ] !== Rn [ 3 ] ) throw new Error ( "Bad state: " + tmp . join ( "|" ) ) ; }
2015-04-02 22:14:07 +00:00
else if ( Rn [ 0 ] . charAt ( Rn [ 0 ] . length - 2 ) !== '/' ) state . push ( [ Rn [ 3 ] , true ] ) ;
break ;
default :
2017-02-22 07:48:52 +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> */
if ( state . length == 0 && Rn [ 3 ] == "UOF" ) return parse _fods ( str , opts ) ;
2015-04-02 22:14:07 +00:00
var seen = true ;
switch ( state [ state . length - 1 ] [ 0 ] ) {
/* OfficeDocumentSettings */
case 'OfficeDocumentSettings' : switch ( Rn [ 3 ] ) {
case 'AllowPNG' : break ;
case 'RemovePersonalInformation' : break ;
case 'DownloadComponents' : break ;
case 'LocationOfComponents' : break ;
case 'Colors' : break ;
case 'Color' : break ;
case 'Index' : break ;
case 'RGB' : break ;
2017-04-30 16:28:24 +00:00
case 'PixelsPerInch' : break ; // TODO: set PPI
2015-04-02 22:14:07 +00:00
case 'TargetScreenSize' : break ;
case 'ReadOnlyRecommended' : break ;
default : seen = false ;
} break ;
/* ComponentOptions */
case 'ComponentOptions' : switch ( Rn [ 3 ] ) {
case 'Toolbar' : break ;
case 'HideOfficeLogo' : break ;
case 'SpreadsheetAutoFit' : break ;
case 'Label' : break ;
case 'Caption' : break ;
case 'MaxHeight' : break ;
case 'MaxWidth' : break ;
case 'NextSheetNumber' : break ;
default : seen = false ;
} break ;
/* ExcelWorkbook */
case 'ExcelWorkbook' : switch ( Rn [ 3 ] ) {
2017-06-03 07:23:15 +00:00
case 'Date1904' :
Workbook . WBProps . date1904 = true ;
break ;
2015-04-02 22:14:07 +00:00
case 'WindowHeight' : break ;
case 'WindowWidth' : break ;
case 'WindowTopX' : break ;
case 'WindowTopY' : break ;
case 'TabRatio' : break ;
case 'ProtectStructure' : break ;
case 'ProtectWindows' : break ;
case 'ActiveSheet' : break ;
case 'DisplayInkNotes' : break ;
case 'FirstVisibleSheet' : break ;
case 'SupBook' : break ;
case 'SheetName' : break ;
case 'SheetIndex' : break ;
case 'SheetIndexFirst' : break ;
case 'SheetIndexLast' : break ;
case 'Dll' : break ;
case 'AcceptLabelsInFormulas' : break ;
case 'DoNotSaveLinkValues' : break ;
case 'Iteration' : break ;
case 'MaxIterations' : break ;
case 'MaxChange' : break ;
case 'Path' : break ;
case 'Xct' : break ;
case 'Count' : break ;
case 'SelectedSheets' : break ;
case 'Calculation' : break ;
case 'Uncalced' : break ;
case 'StartupPrompt' : break ;
case 'Crn' : break ;
case 'ExternName' : break ;
case 'Formula' : break ;
case 'ColFirst' : break ;
case 'ColLast' : break ;
case 'WantAdvise' : break ;
case 'Boolean' : break ;
case 'Error' : break ;
case 'Text' : break ;
case 'OLE' : break ;
case 'NoAutoRecover' : break ;
case 'PublishObjects' : break ;
case 'DoNotCalculateBeforeSave' : break ;
case 'Number' : break ;
case 'RefModeR1C1' : break ;
case 'EmbedSaveSmartTags' : break ;
default : seen = false ;
} break ;
/* WorkbookOptions */
case 'WorkbookOptions' : switch ( Rn [ 3 ] ) {
case 'OWCVersion' : break ;
case 'Height' : break ;
case 'Width' : break ;
default : seen = false ;
} break ;
/* WorksheetOptions */
case 'WorksheetOptions' : switch ( Rn [ 3 ] ) {
2017-03-31 21:50:32 +00:00
case 'Visible' :
2017-05-09 18:11:15 +00:00
if ( Rn [ 0 ] . slice ( - 2 ) === "/>" ) { /* empty */ }
2017-03-31 21:50:32 +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 ;
2017-04-16 07:35:56 +00:00
case 'Header' :
if ( ! cursheet [ '!margins' ] ) default _margins ( cursheet [ '!margins' ] = { } , 'xlml' ) ;
cursheet [ '!margins' ] . header = parsexmltag ( Rn [ 0 ] ) . Margin ;
break ;
case 'Footer' :
if ( ! cursheet [ '!margins' ] ) default _margins ( cursheet [ '!margins' ] = { } , 'xlml' ) ;
cursheet [ '!margins' ] . footer = parsexmltag ( Rn [ 0 ] ) . Margin ;
break ;
case 'PageMargins' :
var pagemargins = parsexmltag ( Rn [ 0 ] ) ;
if ( ! cursheet [ '!margins' ] ) default _margins ( cursheet [ '!margins' ] = { } , 'xlml' ) ;
if ( pagemargins . Top ) cursheet [ '!margins' ] . top = pagemargins . Top ;
if ( pagemargins . Left ) cursheet [ '!margins' ] . left = pagemargins . Left ;
if ( pagemargins . Right ) cursheet [ '!margins' ] . right = pagemargins . Right ;
if ( pagemargins . Bottom ) cursheet [ '!margins' ] . bottom = pagemargins . Bottom ;
break ;
2017-12-30 05:41:41 +00:00
case 'DisplayRightToLeft' :
if ( ! Workbook . Views ) Workbook . Views = [ ] ;
if ( ! Workbook . Views [ 0 ] ) Workbook . Views [ 0 ] = { } ;
Workbook . Views [ 0 ] . RTL = true ;
break ;
2015-04-02 22:14:07 +00:00
case 'Unsynced' : break ;
case 'Print' : break ;
case 'Panes' : break ;
case 'Scale' : break ;
case 'Pane' : break ;
case 'Number' : break ;
case 'Layout' : break ;
case 'PageSetup' : break ;
case 'Selected' : break ;
case 'ProtectObjects' : break ;
case 'EnableSelection' : break ;
case 'ProtectScenarios' : break ;
case 'ValidPrinterInfo' : break ;
case 'HorizontalResolution' : break ;
case 'VerticalResolution' : break ;
case 'NumberofCopies' : break ;
case 'ActiveRow' : break ;
case 'ActiveCol' : break ;
case 'ActivePane' : break ;
case 'TopRowVisible' : break ;
case 'TopRowBottomPane' : break ;
case 'LeftColumnVisible' : break ;
case 'LeftColumnRightPane' : break ;
case 'FitToPage' : break ;
case 'RangeSelection' : break ;
case 'PaperSizeIndex' : break ;
case 'PageLayoutZoom' : break ;
case 'PageBreakZoom' : break ;
case 'FilterOn' : break ;
case 'DoNotDisplayGridlines' : break ;
case 'SplitHorizontal' : break ;
case 'SplitVertical' : break ;
case 'FreezePanes' : break ;
case 'FrozenNoSplit' : break ;
case 'FitWidth' : break ;
case 'FitHeight' : break ;
case 'CommentsLayout' : break ;
case 'Zoom' : break ;
case 'LeftToRight' : break ;
case 'Gridlines' : break ;
case 'AllowSort' : break ;
case 'AllowFilter' : break ;
case 'AllowInsertRows' : break ;
case 'AllowDeleteRows' : break ;
case 'AllowInsertCols' : break ;
case 'AllowDeleteCols' : break ;
case 'AllowInsertHyperlinks' : break ;
case 'AllowFormatCells' : break ;
case 'AllowSizeCols' : break ;
case 'AllowSizeRows' : break ;
case 'NoSummaryRowsBelowDetail' : break ;
case 'TabColorIndex' : break ;
case 'DoNotDisplayHeadings' : break ;
case 'ShowPageLayoutZoom' : break ;
case 'NoSummaryColumnsRightDetail' : break ;
case 'BlackAndWhite' : break ;
case 'DoNotDisplayZeros' : break ;
case 'DisplayPageBreak' : break ;
case 'RowColHeadings' : break ;
case 'DoNotDisplayOutline' : break ;
case 'NoOrientation' : break ;
case 'AllowUsePivotTables' : break ;
case 'ZeroHeight' : break ;
case 'ViewableRange' : break ;
case 'Selection' : break ;
case 'ProtectContents' : break ;
default : seen = false ;
} break ;
/* PivotTable */
case 'PivotTable' : case 'PivotCache' : switch ( Rn [ 3 ] ) {
case 'ImmediateItemsOnDrop' : break ;
case 'ShowPageMultipleItemLabel' : break ;
case 'CompactRowIndent' : break ;
case 'Location' : break ;
case 'PivotField' : break ;
case 'Orientation' : break ;
case 'LayoutForm' : break ;
case 'LayoutSubtotalLocation' : break ;
case 'LayoutCompactRow' : break ;
case 'Position' : break ;
case 'PivotItem' : break ;
case 'DataType' : break ;
case 'DataField' : break ;
case 'SourceName' : break ;
case 'ParentField' : break ;
case 'PTLineItems' : break ;
case 'PTLineItem' : break ;
case 'CountOfSameItems' : break ;
case 'Item' : break ;
case 'ItemType' : break ;
case 'PTSource' : break ;
case 'CacheIndex' : break ;
case 'ConsolidationReference' : break ;
case 'FileName' : break ;
case 'Reference' : break ;
case 'NoColumnGrand' : break ;
case 'NoRowGrand' : break ;
case 'BlankLineAfterItems' : break ;
case 'Hidden' : break ;
case 'Subtotal' : break ;
case 'BaseField' : break ;
case 'MapChildItems' : break ;
case 'Function' : break ;
case 'RefreshOnFileOpen' : break ;
case 'PrintSetTitles' : break ;
case 'MergeLabels' : break ;
case 'DefaultVersion' : break ;
case 'RefreshName' : break ;
case 'RefreshDate' : break ;
case 'RefreshDateCopy' : break ;
case 'VersionLastRefresh' : break ;
case 'VersionLastUpdate' : break ;
case 'VersionUpdateableMin' : break ;
case 'VersionRefreshableMin' : break ;
case 'Calculation' : break ;
default : seen = false ;
} break ;
/* PageBreaks */
case 'PageBreaks' : switch ( Rn [ 3 ] ) {
case 'ColBreaks' : break ;
case 'ColBreak' : break ;
case 'RowBreaks' : break ;
case 'RowBreak' : break ;
case 'ColStart' : break ;
case 'ColEnd' : break ;
case 'RowEnd' : break ;
default : seen = false ;
} break ;
/* AutoFilter */
case 'AutoFilter' : switch ( Rn [ 3 ] ) {
case 'AutoFilterColumn' : break ;
case 'AutoFilterCondition' : break ;
case 'AutoFilterAnd' : break ;
case 'AutoFilterOr' : break ;
default : seen = false ;
} break ;
/* QueryTable */
case 'QueryTable' : switch ( Rn [ 3 ] ) {
case 'Id' : break ;
case 'AutoFormatFont' : break ;
case 'AutoFormatPattern' : break ;
case 'QuerySource' : break ;
case 'QueryType' : break ;
case 'EnableRedirections' : break ;
case 'RefreshedInXl9' : break ;
case 'URLString' : break ;
case 'HTMLTables' : break ;
case 'Connection' : break ;
case 'CommandText' : break ;
case 'RefreshInfo' : break ;
case 'NoTitles' : break ;
case 'NextId' : break ;
case 'ColumnInfo' : break ;
case 'OverwriteCells' : break ;
case 'DoNotPromptForFile' : break ;
case 'TextWizardSettings' : break ;
case 'Source' : break ;
case 'Number' : break ;
case 'Decimal' : break ;
case 'ThousandSeparator' : break ;
case 'TrailingMinusNumbers' : break ;
case 'FormatSettings' : break ;
case 'FieldType' : break ;
case 'Delimiters' : break ;
case 'Tab' : break ;
case 'Comma' : break ;
case 'AutoFormatName' : break ;
case 'VersionLastEdit' : break ;
case 'VersionLastRefresh' : break ;
default : seen = false ;
} break ;
case 'Sorting' :
case 'ConditionalFormatting' :
2017-05-09 18:11:15 +00:00
case 'DataValidation' :
switch ( Rn [ 3 ] ) {
2015-04-02 22:14:07 +00:00
case 'Range' : break ;
case 'Type' : break ;
case 'Min' : break ;
case 'Max' : break ;
case 'Sort' : break ;
case 'Descending' : break ;
case 'Order' : break ;
case 'CaseSensitive' : break ;
case 'Value' : break ;
case 'ErrorStyle' : break ;
case 'ErrorMessage' : break ;
case 'ErrorTitle' : break ;
case 'CellRangeList' : break ;
case 'InputMessage' : break ;
case 'InputTitle' : break ;
case 'ComboHide' : break ;
case 'InputHide' : break ;
case 'Condition' : break ;
case 'Qualifier' : break ;
case 'UseBlank' : break ;
case 'Value1' : break ;
case 'Value2' : break ;
case 'Format' : break ;
default : seen = false ;
} break ;
/* MapInfo (schema) */
case 'MapInfo' : case 'Schema' : case 'data' : switch ( Rn [ 3 ] ) {
case 'Map' : break ;
case 'Entry' : break ;
case 'Range' : break ;
case 'XPath' : break ;
case 'Field' : break ;
case 'XSDType' : break ;
case 'FilterOn' : break ;
case 'Aggregate' : break ;
case 'ElementType' : break ;
case 'AttributeType' : break ;
/* These are from xsd (XML Schema Definition) */
case 'schema' :
case 'element' :
case 'complexType' :
case 'datatype' :
case 'all' :
case 'attribute' :
case 'extends' : break ;
case 'row' : break ;
default : seen = false ;
} break ;
/* SmartTags (can be anything) */
case 'SmartTags' : break ;
default : seen = false ; break ;
}
if ( seen ) break ;
/* CustomDocumentProperties */
if ( ! state [ state . length - 1 ] [ 1 ] ) throw 'Unrecognized tag: ' + Rn [ 3 ] + "|" + state . join ( "|" ) ;
if ( state [ state . length - 1 ] [ 0 ] === 'CustomDocumentProperties' ) {
2017-02-22 07:48:52 +00:00
if ( Rn [ 0 ] . slice ( - 2 ) === "/>" ) break ;
2017-12-30 05:41:41 +00:00
else if ( Rn [ 1 ] === "/" ) xlml _set _custprop ( Custprops , Rn [ 3 ] , cp , str . slice ( pidx , Rn . index ) ) ;
2015-04-02 22:14:07 +00:00
else { cp = Rn ; pidx = Rn . index + Rn [ 0 ] . length ; }
break ;
}
if ( opts . WTF ) throw 'Unrecognized tag: ' + Rn [ 3 ] + "|" + state . join ( "|" ) ;
}
2017-02-11 01:58:22 +00:00
var out = ( { } ) ;
2015-04-02 22:14:07 +00:00
if ( ! opts . bookSheets && ! opts . bookProps ) out . Sheets = sheets ;
out . SheetNames = sheetnames ;
2017-03-31 21:50:32 +00:00
out . Workbook = Workbook ;
2015-04-02 22:14:07 +00:00
out . SSF = SSF . get _table ( ) ;
out . Props = Props ;
out . Custprops = Custprops ;
return out ;
}
function parse _xlml ( data , opts ) {
fix _read _opts ( opts = opts || { } ) ;
switch ( opts . type || "base64" ) {
case "base64" : return parse _xlml _xml ( Base64 . decode ( data ) , opts ) ;
case "binary" : case "buffer" : case "file" : return parse _xlml _xml ( data , opts ) ;
2018-02-03 20:43:07 +00:00
case "array" : return parse _xlml _xml ( a2s ( data ) , opts ) ;
2015-04-02 22:14:07 +00:00
}
}
2017-02-22 07:48:52 +00:00
/* TODO */
2017-03-16 04:39:50 +00:00
function write _props _xlml ( wb , opts ) {
var o = [ ] ;
/* DocumentProperties */
2017-04-16 07:35:56 +00:00
if ( wb . Props ) o . push ( xlml _write _docprops ( wb . Props , opts ) ) ;
2017-03-16 04:39:50 +00:00
/* CustomDocumentProperties */
2017-04-16 07:35:56 +00:00
if ( wb . Custprops ) o . push ( xlml _write _custprops ( wb . Props , wb . Custprops , opts ) ) ;
2017-02-11 01:58:22 +00:00
return o . join ( "" ) ;
}
2017-03-16 04:39:50 +00:00
/* TODO */
2018-01-23 09:09:53 +00:00
function write _wb _xlml ( ) {
2017-03-16 04:39:50 +00:00
/* OfficeDocumentSettings */
/* ExcelWorkbook */
return "" ;
}
/* TODO */
function write _sty _xlml ( wb , opts ) {
/* Styles */
2017-12-30 05:41:41 +00:00
var styles = [ '<Style ss:ID="Default" ss:Name="Normal"><NumberFormat/></Style>' ] ;
opts . cellXfs . forEach ( function ( xf , id ) {
var payload = [ ] ;
payload . push ( writextag ( 'NumberFormat' , null , { "ss:Format" : escapexml ( SSF . _table [ xf . numFmtId ] ) } ) ) ;
styles . push ( writextag ( 'Style' , payload . join ( "" ) , { "ss:ID" : "s" + ( 21 + id ) } ) ) ;
} ) ;
return writextag ( "Styles" , styles . join ( "" ) ) ;
2017-03-16 04:39:50 +00:00
}
2018-01-09 07:40:54 +00:00
function write _name _xlml ( n ) { return writextag ( "NamedRange" , null , { "ss:Name" : n . Name , "ss:RefersTo" : "=" + a1 _to _rc ( n . Ref , { r : 0 , c : 0 } ) } ) ; }
2018-01-23 09:09:53 +00:00
function write _names _xlml ( wb ) {
2018-01-09 07:40:54 +00:00
if ( ! ( ( wb || { } ) . Workbook || { } ) . Names ) return "" ;
var names = wb . Workbook . Names ;
var out = [ ] ;
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 , opts , idx , wb ) {
if ( ! ws ) return "" ;
if ( ! ( ( wb || { } ) . Workbook || { } ) . Names ) return "" ;
var names = wb . Workbook . Names ;
var out = [ ] ;
2018-08-26 00:09:59 +00:00
for ( var i = 0 ; i < names . length ; ++ i ) {
2018-01-09 07:40:54 +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 21:50:32 +00:00
/* WorksheetOptions */
function write _ws _xlml _wsopts ( ws , opts , idx , wb ) {
2017-04-30 16:28:24 +00:00
if ( ! ws ) return "" ;
2017-03-31 21:50:32 +00:00
var o = [ ] ;
2017-04-30 16:28:24 +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 21:50:32 +00:00
/* PageSetup */
2017-04-30 16:28:24 +00:00
/* DisplayPageBreak */
/* TransitionExpressionEvaluation */
/* TransitionFormulaEntry */
/* Print */
/* Zoom */
/* PageLayoutZoom */
/* PageBreakZoom */
/* ShowPageBreakZoom */
/* DefaultRowHeight */
/* DefaultColumnWidth */
/* StandardWidth */
2017-03-31 21:50:32 +00:00
if ( wb && wb . Workbook && wb . Workbook . Sheets && wb . Workbook . Sheets [ idx ] ) {
/* Visible */
2017-05-09 18:11:15 +00:00
if ( wb . Workbook . Sheets [ idx ] . Hidden ) o . push ( writextag ( "Visible" , ( wb . Workbook . Sheets [ idx ] . Hidden == 1 ? "SheetHidden" : "SheetVeryHidden" ) , { } ) ) ;
2017-03-31 21:50:32 +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-30 16:28:24 +00:00
/* LeftColumnVisible */
2017-12-30 05:41:41 +00:00
if ( ( ( ( ( wb || { } ) . Workbook || { } ) . Views || [ ] ) [ 0 ] || { } ) . RTL ) o . push ( "<DisplayRightToLeft/>" ) ;
2017-04-30 16:28:24 +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-17 00:36:51 +00:00
[ "formatCells" , "AllowFormatCells" ] ,
[ "formatColumns" , "AllowSizeCols" ] ,
[ "formatRows" , "AllowSizeRows" ] ,
2017-04-30 16:28:24 +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 21:50:32 +00:00
if ( o . length == 0 ) return "" ;
return writextag ( "WorksheetOptions" , o . join ( "" ) , { xmlns : XLMLNS . x } ) ;
}
2017-04-03 06:04:35 +00:00
function write _ws _xlml _comment ( comments ) {
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-03-16 04:39:50 +00:00
function write _ws _xlml _cell ( cell , ref , ws , opts , idx , wb , addr ) {
2018-02-08 19:13:10 +00:00
if ( ! cell || ( cell . v == undefined && cell . f == undefined ) ) return "" ;
2017-03-16 04:39:50 +00:00
var attr = { } ;
if ( cell . f ) attr [ "ss:Formula" ] = "=" + escapexml ( a1 _to _rc ( cell . f , addr ) ) ;
2018-01-23 09:09:53 +00:00
if ( cell . F && cell . F . slice ( 0 , ref . length ) == ref ) {
var end = decode _cell ( cell . F . slice ( ref . length + 1 ) ) ;
2017-03-20 21:57:44 +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-16 04:39:50 +00:00
2017-03-28 22:07:46 +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 04:39:50 +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 ;
}
}
var t = "" , p = "" ;
switch ( cell . t ) {
case 'z' : return "" ;
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 ;
2017-12-30 05:41:41 +00:00
case 'd' : t = 'DateTime' ; p = new Date ( cell . v ) . toISOString ( ) ; if ( cell . z == null ) cell . z = cell . z || SSF . _table [ 14 ] ; break ;
2018-01-09 07:40:54 +00:00
case 's' : t = 'String' ; p = escapexlml ( cell . v || "" ) ; break ;
2017-03-20 21:57:44 +00:00
}
2017-12-30 05:41:41 +00:00
/* TODO: cell style */
var os = get _cell _style ( opts . cellXfs , cell , opts ) ;
attr [ "ss:StyleID" ] = "s" + ( 21 + os ) ;
2018-01-09 07:40:54 +00:00
attr [ "ss:Index" ] = addr . c + 1 ;
2017-03-20 21:57:44 +00:00
var _v = ( cell . v != null ? p : "" ) ;
var m = '<Data ss:Type="' + t + '">' + _v + '</Data>' ;
2017-03-16 04:39:50 +00:00
2017-04-03 06:04:35 +00:00
if ( ( cell . c || [ ] ) . length > 0 ) m += write _ws _xlml _comment ( cell . c ) ;
2017-03-16 04:39:50 +00:00
return writextag ( "Cell" , m , attr ) ;
}
2017-04-30 16:28:24 +00:00
function write _ws _xlml _row ( R , row ) {
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-16 04:39:50 +00:00
/* TODO */
function write _ws _xlml _table ( ws , opts , idx , wb ) {
if ( ! ws [ '!ref' ] ) return "" ;
var range = safe _decode _range ( ws [ '!ref' ] ) ;
var marr = ws [ '!merges' ] || [ ] , mi = 0 ;
var o = [ ] ;
2017-03-28 22:07:46 +00:00
if ( ws [ '!cols' ] ) ws [ '!cols' ] . forEach ( function ( n , i ) {
2017-04-30 16:28:24 +00:00
process _col ( n ) ;
var w = ! ! n . width ;
2017-03-28 22:07:46 +00:00
var p = col _obj _w ( i , n ) ;
2017-04-30 16:28:24 +00:00
var k = { "ss:Index" : i + 1 } ;
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:07:46 +00:00
} ) ;
2017-04-09 04:07:43 +00:00
var dense = Array . isArray ( ws ) ;
2017-03-16 04:39:50 +00:00
for ( var R = range . s . r ; R <= range . e . r ; ++ R ) {
2017-04-30 16:28:24 +00:00
var row = [ write _ws _xlml _row ( R , ( ws [ '!rows' ] || [ ] ) [ R ] ) ] ;
2017-03-16 04:39:50 +00:00
for ( var C = range . s . c ; C <= range . e . c ; ++ C ) {
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 ;
var addr = { r : R , c : C } ;
2017-04-09 04:07:43 +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-16 04:39:50 +00:00
}
row . push ( "</Row>" ) ;
if ( row . length > 2 ) o . push ( row . join ( "" ) ) ;
}
return o . join ( "" ) ;
}
function write _ws _xlml ( idx , opts , wb ) {
var o = [ ] ;
var s = wb . SheetNames [ idx ] ;
var ws = wb . Sheets [ s ] ;
2018-01-09 07:40:54 +00:00
var t = ws ? write _ws _xlml _names ( ws , opts , idx , wb ) : "" ;
if ( t . length > 0 ) o . push ( "<Names>" + t + "</Names>" ) ;
2017-03-16 04:39:50 +00:00
/* Table */
2018-01-09 07:40:54 +00:00
t = ws ? write _ws _xlml _table ( ws , opts , idx , wb ) : "" ;
2017-03-16 04:39:50 +00:00
if ( t . length > 0 ) o . push ( "<Table>" + t + "</Table>" ) ;
2017-03-31 21:50:32 +00:00
2017-03-16 04:39:50 +00:00
/* WorksheetOptions */
2017-03-31 21:50:32 +00:00
o . push ( write _ws _xlml _wsopts ( ws , opts , idx , wb ) ) ;
2017-03-16 04:39:50 +00:00
return o . join ( "" ) ;
}
function write _xlml ( wb , opts ) {
2017-12-30 05:41:41 +00:00
if ( ! opts ) opts = { } ;
if ( ! wb . SSF ) wb . SSF = SSF . get _table ( ) ;
if ( wb . SSF ) {
make _ssf ( SSF ) ; SSF . load _table ( wb . SSF ) ;
// $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 } } ) ;
}
2017-03-16 04:39:50 +00:00
var d = [ ] ;
d . push ( write _props _xlml ( wb , opts ) ) ;
d . push ( write _wb _xlml ( wb , opts ) ) ;
2017-12-30 05:41:41 +00:00
d . push ( "" ) ;
2018-01-09 07:40:54 +00:00
d . push ( "" ) ;
2017-03-16 04:39:50 +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:41:41 +00:00
d [ 2 ] = write _sty _xlml ( wb , opts ) ;
2018-01-09 07:40:54 +00:00
d [ 3 ] = write _names _xlml ( wb , opts ) ;
2017-03-16 04:39:50 +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
} ) ;
}
2015-04-02 22:14:07 +00:00
/* [MS-OLEDS] 2.3.8 CompObjStream */
function parse _compobj ( obj ) {
var v = { } ;
var o = obj . content ;
2017-09-30 06:19:01 +00:00
/* [MS-OLEDS] 2.3.7 CompObjHeader -- All fields MUST be ignored */
2017-12-30 05:41:41 +00:00
o . l = 28 ;
2015-04-02 22:14:07 +00:00
2017-12-30 05:41:41 +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 = o . read _shift ( 4 ) ;
if ( m == 0 || m > 40 ) return v ;
o . l -= 4 ; v . Reserved1 = o . read _shift ( 0 , "lpstr-ansi" ) ;
2015-04-02 22:14:07 +00:00
2017-12-30 05:41:41 +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 ) ;
2015-04-02 22:14:07 +00:00
2017-12-30 05:41:41 +00:00
m = o . read _shift ( 4 ) ;
if ( m == 0 || m > 40 ) return v ;
o . l -= 4 ; v . Reserved2 = o . read _shift ( 0 , "lpwstr" ) ;
2015-04-02 22:14:07 +00:00
}
2017-07-28 23:54:51 +00:00
/ *
Continue logic for :
- 2.4 . 58 Continue
- 2.4 . 59 ContinueBigName
- 2.4 . 60 ContinueFrt
- 2.4 . 61 ContinueFrt11
- 2.4 . 62 ContinueFrt12
* /
2015-04-02 22:14:07 +00:00
function slurp ( R , blob , length , opts ) {
var l = length ;
var bufs = [ ] ;
var d = blob . slice ( blob . l , blob . l + l ) ;
2017-10-17 00:36:51 +00:00
if ( opts && opts . enc && opts . enc . insitu ) switch ( R . n ) {
2015-04-02 22:14:07 +00:00
case 'BOF' : case 'FilePass' : case 'FileLock' : case 'InterfaceHdr' : case 'RRDInfo' : case 'RRDHead' : case 'UsrExcl' : break ;
default :
if ( d . length === 0 ) break ;
2017-10-17 00:36:51 +00:00
opts . enc . insitu ( d ) ;
2015-04-02 22:14:07 +00:00
}
bufs . push ( d ) ;
blob . l += l ;
var next = ( XLSRecordEnum [ _ _readUInt16LE ( blob , blob . l ) ] ) ;
2017-07-28 23:54:51 +00:00
var start = 0 ;
while ( next != null && next . n . slice ( 0 , 8 ) === 'Continue' ) {
2015-04-02 22:14:07 +00:00
l = _ _readUInt16LE ( blob , blob . l + 2 ) ;
2017-07-28 23:54:51 +00:00
start = blob . l + 4 ;
if ( next . n == 'ContinueFrt' ) start += 4 ;
else if ( next . n . slice ( 0 , 11 ) == 'ContinueFrt' ) start += 12 ;
bufs . push ( blob . slice ( start , blob . l + 4 + l ) ) ;
2015-04-02 22:14:07 +00:00
blob . l += 4 + l ;
next = ( XLSRecordEnum [ _ _readUInt16LE ( blob , blob . l ) ] ) ;
}
2017-02-11 01:58:22 +00:00
var b = ( bconcat ( bufs ) ) ;
2015-04-02 22:14:07 +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 ; }
return R . f ( b , b . length , opts ) ;
}
function safe _format _xf ( p , opts , date1904 ) {
2017-03-16 04:39:50 +00:00
if ( p . t === 'z' ) return ;
2015-04-02 22:14:07 +00:00
if ( ! p . XF ) return ;
2017-05-17 04:27:55 +00:00
var fmtid = 0 ;
2015-04-02 22:14:07 +00:00
try {
2017-07-28 23:54:51 +00:00
fmtid = p . z || p . XF . numFmtId || 0 ;
2017-04-21 22:03:40 +00:00
if ( opts . cellNF ) p . z = SSF . _table [ fmtid ] ;
2017-04-30 16:28:24 +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-28 23:54:51 +00:00
else if ( fmtid === 0 || fmtid == "General" ) {
2015-04-02 22:14:07 +00:00
if ( p . t === 'n' ) {
if ( ( p . v | 0 ) === p . v ) p . w = SSF . _general _int ( p . v ) ;
else p . w = SSF . _general _num ( p . v ) ;
}
else p . w = SSF . _general ( p . v ) ;
}
2017-03-13 07:34:05 +00:00
else p . w = SSF . format ( fmtid , p . v , { date1904 : ! ! date1904 } ) ;
2015-04-02 22:14:07 +00:00
} catch ( e ) { if ( opts . WTF ) throw e ; }
2017-10-27 19:55:07 +00:00
if ( opts . cellDates && fmtid && p . t == 'n' && SSF . is _date ( SSF . _table [ 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 ) ; }
}
2015-04-02 22:14:07 +00:00
}
function make _cell ( val , ixfe , t ) {
2017-02-11 01:58:22 +00:00
return ( { v : val , ixfe : ixfe , t : t } ) ;
2015-04-02 22:14:07 +00:00
}
// 2.3.2
function parse _workbook ( blob , options ) {
2017-02-11 01:58:22 +00:00
var wb = ( { opts : { } } ) ;
2015-04-02 22:14:07 +00:00
var Sheets = { } ;
2017-04-09 04:07:43 +00:00
if ( DENSE != null && options . dense == null ) options . dense = DENSE ;
2017-05-17 04:27:55 +00:00
var out = ( ( options . dense ? [ ] : { } ) ) ;
2015-04-02 22:14:07 +00:00
var Directory = { } ;
2017-03-25 22:38:26 +00:00
var range = ( { } ) ;
2015-04-02 22:14:07 +00:00
var last _formula = null ;
2017-12-30 05:41:41 +00:00
var sst = ( [ ] ) ;
2015-04-02 22:14:07 +00:00
var cur _sheet = "" ;
var Preamble = { } ;
2017-12-30 05:41:41 +00:00
var lastcell , last _cell = "" , cc , cmnt , rngC , rngR ;
2018-01-09 07:40:54 +00:00
var sharedf = { } ;
2017-12-30 05:41:41 +00:00
var arrayf = [ ] ;
2015-04-02 22:14:07 +00:00
var temp _val ;
var country ;
var cell _valid = true ;
var XFs = [ ] ; /* XF records */
var palette = [ ] ;
2017-12-30 05:41:41 +00:00
var Workbook = ( { Sheets : [ ] , WBProps : { date1904 : false } , Views : [ { } ] } ) , wsprops = { } ;
2015-04-02 22:14:07 +00:00
var get _rgb = function getrgb ( icv ) {
if ( icv < 8 ) return XLSIcv [ icv ] ;
if ( icv < 64 ) return palette [ icv - 8 ] || XLSIcv [ icv ] ;
return XLSIcv [ icv ] ;
} ;
2017-03-20 21:57:44 +00:00
var process _cell _style = function pcs ( cell , line , options ) {
2015-04-02 22:14:07 +00:00
var xfd = line . XF . data ;
2017-03-20 21:57:44 +00:00
if ( ! xfd || ! xfd . patternType || ! options || ! options . cellStyles ) return ;
2017-03-13 07:34:05 +00:00
line . s = ( { } ) ;
2015-04-02 22:14:07 +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 } ; }
} ;
var addcell = function addcell ( cell , line , options ) {
2017-03-20 21:57:44 +00:00
if ( file _depth > 1 ) return ;
2018-04-06 06:36:52 +00:00
if ( options . sheetRows && cell . r >= options . sheetRows ) cell _valid = false ;
2015-04-02 22:14:07 +00:00
if ( ! cell _valid ) return ;
2017-03-20 21:57:44 +00:00
if ( options . cellStyles && line . XF && line . XF . data ) process _cell _style ( cell , line , options ) ;
2017-08-19 23:13:21 +00:00
delete line . ixfe ; delete line . XF ;
2015-04-02 22:14:07 +00:00
lastcell = cell ;
last _cell = encode _cell ( cell ) ;
if ( range . s ) {
if ( cell . r < range . s . r ) range . s . r = cell . r ;
if ( cell . c < range . s . c ) range . s . c = cell . c ;
}
if ( range . e ) {
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-20 21:57:44 +00:00
if ( options . cellFormula && line . f ) {
2017-12-30 05:41:41 +00:00
for ( var afi = 0 ; afi < arrayf . length ; ++ afi ) {
2018-01-09 07:40:54 +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:41:41 +00:00
line . F = encode _range ( arrayf [ afi ] [ 0 ] ) ;
2018-01-09 07:40:54 +00:00
if ( arrayf [ afi ] [ 0 ] . s . c != cell . c || arrayf [ afi ] [ 0 ] . s . r != cell . r ) delete line . f ;
2017-12-30 05:41:41 +00:00
if ( line . f ) line . f = "" + stringify _formula ( arrayf [ afi ] [ 1 ] , range , cell , supbooks , opts ) ;
2017-03-20 21:57:44 +00:00
break ;
}
}
2018-04-06 06:36:52 +00:00
{
2017-04-09 04:07:43 +00:00
if ( options . dense ) {
if ( ! out [ cell . r ] ) out [ cell . r ] = [ ] ;
out [ cell . r ] [ cell . c ] = line ;
} else out [ last _cell ] = line ;
}
2015-04-02 22:14:07 +00:00
} ;
2017-02-11 01:58:22 +00:00
var opts = ( {
2015-04-02 22:14:07 +00:00
enc : false , // encrypted
sbcch : 0 , // cch in the preceding SupBook
snames : [ ] , // sheetnames
2018-01-09 07:40:54 +00:00
sharedf : sharedf , // shared formulae by address
2017-12-30 05:41:41 +00:00
arrayf : arrayf , // array formulae array
2015-04-02 22:14:07 +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 21:57:44 +00:00
cellStyles : ! ! options && ! ! options . cellStyles ,
WTF : ! ! options && ! ! options . wtf
2017-02-11 01:58:22 +00:00
} ) ;
2015-04-02 22:14:07 +00:00
if ( options . password ) opts . password = options . password ;
2017-12-30 05:41:41 +00:00
var themes ;
var merges = [ ] ;
2015-04-02 22:14:07 +00:00
var objects = [ ] ;
2017-03-20 21:57:44 +00:00
var colinfo = [ ] , rowinfo = [ ] ;
2018-01-23 09:09:53 +00:00
// eslint-disable-next-line no-unused-vars
2017-03-20 21:57:44 +00:00
var defwidth = 0 , defheight = 0 ; // twips / MDW respectively
var seencol = false ;
2017-04-16 07:35:56 +00:00
var supbooks = ( [ ] ) ; // 1-indexed, will hold extern names
2015-04-02 22:14:07 +00:00
supbooks . SheetNames = opts . snames ;
supbooks . sharedf = opts . sharedf ;
supbooks . arrayf = opts . arrayf ;
2017-04-16 07:35:56 +00:00
supbooks . names = [ ] ;
supbooks . XTI = [ ] ;
2015-04-02 22:14:07 +00:00
var last _Rn = '' ;
var file _depth = 0 ; /* TODO: make a real stack */
2017-12-30 05:41:41 +00:00
var BIFF2Fmt = 0 , BIFF2FmtTable = [ ] ;
2017-04-16 07:35:56 +00:00
var FilterDatabases = [ ] ; /* TODO: sort out supbooks and process elsewhere */
var last _lbl ;
2015-04-02 22:14:07 +00:00
/* explicit override for some broken writers */
opts . codepage = 1200 ;
set _cp ( 1200 ) ;
2017-12-09 07:23:04 +00:00
var seen _codepage = false ;
2015-04-02 22:14:07 +00:00
while ( blob . l < blob . length - 1 ) {
var s = blob . l ;
var RecordType = blob . read _shift ( 2 ) ;
if ( RecordType === 0 && last _Rn === 'EOF' ) break ;
2018-01-23 09:09:53 +00:00
var length = ( blob . l === blob . length ? 0 : blob . read _shift ( 2 ) ) ;
2015-04-02 22:14:07 +00:00
var R = XLSRecordEnum [ RecordType ] ;
2017-02-11 01:58:22 +00:00
//console.log(RecordType.toString(16), RecordType, R, blob.l, length, blob.length);
2017-03-05 01:44:52 +00:00
//if(!R) console.log(blob.slice(blob.l, blob.l + length));
2015-04-02 22:14:07 +00:00
if ( R && R . f ) {
if ( options . bookSheets ) {
if ( last _Rn === 'BoundSheet8' && R . n !== 'BoundSheet8' ) break ;
}
last _Rn = R . n ;
if ( R . r === 2 || R . r == 12 ) {
var rt = blob . read _shift ( 2 ) ; length -= 2 ;
2018-02-21 06:20:15 +00:00
if ( ! opts . enc && rt !== RecordType && ( ( ( rt & 0xFF ) << 8 ) | ( rt >> 8 ) ) !== RecordType ) throw new Error ( "rt mismatch: " + rt + "!=" + RecordType ) ;
2015-04-02 22:14:07 +00:00
if ( R . r == 12 ) { blob . l += 10 ; length -= 10 ; } // skip FRT
}
//console.error(R,blob.l,length,blob.length);
var val ;
if ( R . n === 'EOF' ) val = R . f ( blob , length , opts ) ;
else val = slurp ( R , blob , length , opts ) ;
var Rn = R . n ;
2018-01-09 07:40:54 +00:00
if ( file _depth == 0 && Rn != 'BOF' ) continue ;
2015-04-02 22:14:07 +00:00
/* nested switch statements to workaround V8 128 limit */
switch ( Rn ) {
/* Workbook Options */
2017-06-03 07:23:15 +00:00
case 'Date1904' :
wb . opts . Date1904 = Workbook . WBProps . date1904 = val ; break ;
2015-04-02 22:14:07 +00:00
case 'WriteProtect' : wb . opts . WriteProtect = true ; break ;
case 'FilePass' :
if ( ! opts . enc ) blob . l = 0 ;
opts . enc = val ;
if ( ! options . password ) throw new Error ( "File is password-protected" ) ;
2017-05-11 18:57:52 +00:00
if ( val . valid == null ) throw new Error ( "Encryption scheme unsupported" ) ;
2015-04-02 22:14:07 +00:00
if ( ! val . valid ) throw new Error ( "Password is incorrect" ) ;
break ;
case 'WriteAccess' : opts . lastuser = val ; break ;
case 'FileSharing' : break ; //TODO
case 'CodePage' :
/* overrides based on test cases */
2017-08-19 23:13:21 +00:00
switch ( val ) {
case 0x5212 : val = 1200 ; break ;
case 0x8000 : val = 10000 ; break ;
case 0x8001 : val = 1252 ; break ;
}
2017-12-09 07:23:04 +00:00
set _cp ( opts . codepage = val ) ;
seen _codepage = true ;
2015-04-02 22:14:07 +00:00
break ;
case 'RRTabId' : opts . rrtabid = val ; break ;
case 'WinProtect' : opts . winlocked = val ; break ;
case 'Template' : break ; // TODO
case 'BookBool' : break ; // TODO
2017-05-11 18:57:52 +00:00
case 'UsesELFs' : break ;
2017-03-11 00:01:58 +00:00
case 'MTRSettings' : break ;
2018-01-09 07:40:54 +00:00
case 'RefreshAll' :
case 'CalcCount' :
case 'CalcDelta' :
case 'CalcIter' :
case 'CalcMode' :
case 'CalcPrecision' :
case 'CalcSaveRecalc' :
wb . opts [ Rn ] = val ; break ;
2015-04-02 22:14:07 +00:00
case 'CalcRefMode' : opts . CalcRefMode = val ; break ; // TODO: implement R1C1
case 'Uncalced' : break ;
case 'ForceFullCalculation' : wb . opts . FullCalc = val ; break ;
2017-11-20 02:13:37 +00:00
case 'WsBool' :
if ( val . fDialog ) out [ "!type" ] = "dialog" ;
break ; // TODO
2015-04-02 22:14:07 +00:00
case 'XF' : XFs . push ( val ) ; break ;
case 'ExtSST' : break ; // TODO
case 'BookExt' : break ; // TODO
case 'RichTextStream' : break ;
case 'BkHim' : break ;
2017-04-16 07:35:56 +00:00
case 'SupBook' :
supbooks . push ( [ val ] ) ;
supbooks [ supbooks . length - 1 ] . XTI = [ ] ;
break ;
case 'ExternName' :
supbooks [ supbooks . length - 1 ] . push ( val ) ;
break ;
2015-04-02 22:14:07 +00:00
case 'Index' : break ; // TODO
2017-04-16 07:35:56 +00:00
case 'Lbl' :
2017-05-17 04:27:55 +00:00
last _lbl = ( {
2017-04-16 07:35:56 +00:00
Name : val . Name ,
Ref : stringify _formula ( val . rgce , range , null , supbooks , opts )
2017-05-17 04:27:55 +00:00
} ) ;
2017-04-16 07:35:56 +00:00
if ( val . itab > 0 ) last _lbl . Sheet = val . itab - 1 ;
supbooks . names . push ( last _lbl ) ;
2017-12-30 05:41:41 +00:00
if ( ! supbooks [ 0 ] ) { supbooks [ 0 ] = [ ] ; supbooks [ 0 ] . XTI = [ ] ; }
2017-04-16 07:35:56 +00:00
supbooks [ supbooks . length - 1 ] . push ( val ) ;
2017-06-10 01:56:23 +00:00
if ( val . Name == "_xlnm._FilterDatabase" && val . itab > 0 )
2017-04-16 07:35:56 +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 ;
2017-07-28 23:54:51 +00:00
case 'ExternCount' : opts . ExternCount = val ; break ;
2017-04-16 07:35:56 +00:00
case 'ExternSheet' :
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 ;
case 'NameCmt' :
/* TODO: search for correct name */
if ( opts . biff < 8 ) break ;
2017-05-17 04:27:55 +00:00
if ( last _lbl != null ) last _lbl . Comment = val [ 1 ] ;
2017-04-16 07:35:56 +00:00
break ;
2015-04-02 22:14:07 +00:00
case 'Protect' : out [ "!protect" ] = val ; break ; /* for sheet or book */
case 'Password' : if ( val !== 0 && opts . WTF ) console . error ( "Password verifier: " + val ) ; break ;
case 'Prot4Rev' : case 'Prot4RevPass' : break ; /*TODO: Revision Control*/
case 'BoundSheet8' : {
Directory [ val . pos ] = val ;
opts . snames . push ( val . name ) ;
} break ;
case 'EOF' : {
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:36:52 +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 ;
}
2015-04-02 22:14:07 +00:00
range . e . r ++ ; range . e . c ++ ;
}
2017-12-30 05:41:41 +00:00
if ( merges . length > 0 ) out [ "!merges" ] = merges ;
2015-04-02 22:14:07 +00:00
if ( objects . length > 0 ) out [ "!objects" ] = objects ;
2017-03-20 21:57:44 +00:00
if ( colinfo . length > 0 ) out [ "!cols" ] = colinfo ;
if ( rowinfo . length > 0 ) out [ "!rows" ] = rowinfo ;
2017-03-31 21:50:32 +00:00
Workbook . Sheets . push ( wsprops ) ;
2015-04-02 22:14:07 +00:00
}
if ( cur _sheet === "" ) Preamble = out ; else Sheets [ cur _sheet ] = out ;
2017-05-17 04:27:55 +00:00
out = ( ( options . dense ? [ ] : { } ) ) ;
2015-04-02 22:14:07 +00:00
} break ;
case 'BOF' : {
2017-12-30 05:41:41 +00:00
if ( opts . biff === 8 ) opts . biff = {
0x0009 : 2 ,
0x0209 : 3 ,
0x0409 : 4
} [ RecordType ] || {
2018-02-21 06:20:15 +00:00
0x0200 : 2 ,
0x0300 : 3 ,
0x0400 : 4 ,
2017-12-30 05:41:41 +00:00
0x0500 : 5 ,
0x0600 : 8 ,
0x0002 : 2 ,
0x0007 : 2
} [ val . BIFFVer ] || 8 ;
2018-08-15 20:01:20 +00:00
if ( opts . biff == 8 && val . BIFFVer == 0 && val . dt == 16 ) opts . biff = 2 ;
2015-04-02 22:14:07 +00:00
if ( file _depth ++ ) break ;
cell _valid = true ;
2017-05-17 04:27:55 +00:00
out = ( ( options . dense ? [ ] : { } ) ) ;
2017-03-31 21:50:32 +00:00
2017-12-09 07:23:04 +00:00
if ( opts . biff < 8 && ! seen _codepage ) { seen _codepage = true ; set _cp ( opts . codepage = options . codepage || 1252 ) ; }
2017-02-11 01:58:22 +00:00
if ( opts . biff < 5 ) {
2015-04-02 22:14:07 +00:00
if ( cur _sheet === "" ) cur _sheet = "Sheet1" ;
range = { s : { r : 0 , c : 0 } , e : { r : 0 , c : 0 } } ;
2017-02-11 01:58:22 +00:00
/* fake BoundSheet8 */
var fakebs8 = { pos : blob . l - length , name : cur _sheet } ;
Directory [ fakebs8 . pos ] = fakebs8 ;
opts . snames . push ( cur _sheet ) ;
2015-04-02 22:14:07 +00:00
}
else cur _sheet = ( Directory [ s ] || { name : "" } ) . name ;
2017-03-28 22:07:46 +00:00
if ( val . dt == 0x20 ) out [ "!type" ] = "chart" ;
2017-11-20 02:13:37 +00:00
if ( val . dt == 0x40 ) out [ "!type" ] = "macro" ;
2017-12-30 05:41:41 +00:00
merges = [ ] ;
2015-04-02 22:14:07 +00:00
objects = [ ] ;
2017-12-30 05:41:41 +00:00
opts . arrayf = arrayf = [ ] ;
2017-03-20 21:57:44 +00:00
colinfo = [ ] ; rowinfo = [ ] ;
defwidth = defheight = 0 ;
seencol = false ;
2017-03-31 21:50:32 +00:00
wsprops = { Hidden : ( Directory [ s ] || { hs : 0 } ) . hs , name : cur _sheet } ;
2015-04-02 22:14:07 +00:00
} break ;
2017-03-20 21:57:44 +00:00
2017-02-11 01:58:22 +00:00
case 'Number' : case 'BIFF2NUM' : case 'BIFF2INT' : {
2017-04-09 04:07:43 +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-17 04:27:55 +00:00
temp _val = ( { ixfe : val . ixfe , XF : XFs [ val . ixfe ] || { } , v : val . val , t : 'n' } ) ;
2017-05-09 18:11:15 +00:00
if ( BIFF2Fmt > 0 ) temp _val . z = BIFF2FmtTable [ ( temp _val . ixfe >> 8 ) & 0x1F ] ;
2017-02-11 01:58:22 +00:00
safe _format _xf ( temp _val , options , wb . opts . Date1904 ) ;
2015-04-02 22:14:07 +00:00
addcell ( { c : val . c , r : val . r } , temp _val , options ) ;
} break ;
case 'BoolErr' : {
2017-05-17 04:27:55 +00:00
temp _val = ( { ixfe : val . ixfe , XF : XFs [ val . ixfe ] , v : val . val , t : val . t } ) ;
2017-05-09 18:11:15 +00:00
if ( BIFF2Fmt > 0 ) temp _val . z = BIFF2FmtTable [ ( temp _val . ixfe >> 8 ) & 0x1F ] ;
2017-02-11 01:58:22 +00:00
safe _format _xf ( temp _val , options , wb . opts . Date1904 ) ;
2015-04-02 22:14:07 +00:00
addcell ( { c : val . c , r : val . r } , temp _val , options ) ;
} break ;
case 'RK' : {
2017-05-17 04:27:55 +00:00
temp _val = ( { ixfe : val . ixfe , XF : XFs [ val . ixfe ] , v : val . rknum , t : 'n' } ) ;
2017-05-09 18:11:15 +00:00
if ( BIFF2Fmt > 0 ) temp _val . z = BIFF2FmtTable [ ( temp _val . ixfe >> 8 ) & 0x1F ] ;
2017-02-11 01:58:22 +00:00
safe _format _xf ( temp _val , options , wb . opts . Date1904 ) ;
2015-04-02 22:14:07 +00:00
addcell ( { c : val . c , r : val . r } , temp _val , options ) ;
} break ;
case 'MulRk' : {
for ( var j = val . c ; j <= val . C ; ++ j ) {
var ixfe = val . rkrec [ j - val . c ] [ 0 ] ;
2017-05-17 04:27:55 +00:00
temp _val = ( { ixfe : ixfe , XF : XFs [ ixfe ] , v : val . rkrec [ j - val . c ] [ 1 ] , t : 'n' } ) ;
2017-05-09 18:11:15 +00:00
if ( BIFF2Fmt > 0 ) temp _val . z = BIFF2FmtTable [ ( temp _val . ixfe >> 8 ) & 0x1F ] ;
2017-02-11 01:58:22 +00:00
safe _format _xf ( temp _val , options , wb . opts . Date1904 ) ;
2015-04-02 22:14:07 +00:00
addcell ( { c : j , r : val . r } , temp _val , options ) ;
}
} break ;
case 'Formula' : {
2017-03-20 21:57:44 +00:00
if ( val . val == 'String' ) { last _formula = val ; break ; }
2017-05-17 04:27:55 +00:00
temp _val = make _cell ( val . val , val . cell . ixfe , val . tt ) ;
2017-03-20 21:57:44 +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:40:54 +00:00
if ( sharedf [ _fe ] ) temp _val . f = "" + stringify _formula ( val . formula , range , val . cell , supbooks , opts ) ;
2017-04-09 04:07:43 +00:00
else temp _val . F = ( ( options . dense ? ( out [ _fr ] || [ ] ) [ _fc ] : out [ _fe ] ) || { } ) . F ;
2017-03-20 21:57:44 +00:00
} else temp _val . f = "" + stringify _formula ( val . formula , range , val . cell , supbooks , opts ) ;
2015-04-02 22:14:07 +00:00
}
2017-05-09 18:11:15 +00:00
if ( BIFF2Fmt > 0 ) temp _val . z = BIFF2FmtTable [ ( temp _val . ixfe >> 8 ) & 0x1F ] ;
2017-03-20 21:57:44 +00:00
safe _format _xf ( temp _val , options , wb . opts . Date1904 ) ;
addcell ( val . cell , temp _val , options ) ;
last _formula = val ;
2015-04-02 22:14:07 +00:00
} break ;
case 'String' : {
2017-03-20 21:57:44 +00:00
if ( last _formula ) { /* technically always true */
2015-04-02 22:14:07 +00:00
last _formula . val = val ;
2017-05-17 04:27:55 +00:00
temp _val = make _cell ( val , last _formula . cell . ixfe , 's' ) ;
2015-04-02 22:14:07 +00:00
temp _val . XF = XFs [ temp _val . ixfe ] ;
2017-03-20 21:57:44 +00:00
if ( options . cellFormula ) {
temp _val . f = "" + stringify _formula ( last _formula . formula , range , last _formula . cell , supbooks , opts ) ;
}
2017-05-09 18:11:15 +00:00
if ( BIFF2Fmt > 0 ) temp _val . z = BIFF2FmtTable [ ( temp _val . ixfe >> 8 ) & 0x1F ] ;
2017-02-11 01:58:22 +00:00
safe _format _xf ( temp _val , options , wb . opts . Date1904 ) ;
2015-04-02 22:14:07 +00:00
addcell ( last _formula . cell , temp _val , options ) ;
last _formula = null ;
2017-03-20 21:57:44 +00:00
} else throw new Error ( "String record expects Formula" ) ;
2015-04-02 22:14:07 +00:00
} break ;
case 'Array' : {
2017-12-30 05:41:41 +00:00
arrayf . push ( val ) ;
2017-03-20 21:57:44 +00:00
var _arraystart = encode _cell ( val [ 0 ] . s ) ;
2017-04-09 04:07:43 +00:00
cc = options . dense ? ( out [ val [ 0 ] . s . r ] || [ ] ) [ val [ 0 ] . s . c ] : out [ _arraystart ] ;
if ( options . cellFormula && cc ) {
2017-03-13 07:34:05 +00:00
if ( ! last _formula ) break ; /* technically unreachable */
2017-04-09 04:07:43 +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 21:11:48 +00:00
}
2015-04-02 22:14:07 +00:00
} break ;
case 'ShrFmla' : {
if ( ! cell _valid ) break ;
2017-02-19 21:11:48 +00:00
if ( ! options . cellFormula ) break ;
if ( last _cell ) {
/* TODO: capture range */
2017-03-13 07:34:05 +00:00
if ( ! last _formula ) break ; /* technically unreachable */
2018-01-09 07:40:54 +00:00
sharedf [ encode _cell ( last _formula . cell ) ] = val [ 0 ] ;
2017-04-09 04:07:43 +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 21:11:48 +00:00
}
2015-04-02 22:14:07 +00:00
} break ;
case 'LabelSst' :
temp _val = make _cell ( sst [ val . isst ] . t , val . ixfe , 's' ) ;
temp _val . XF = XFs [ temp _val . ixfe ] ;
2017-05-09 18:11:15 +00:00
if ( BIFF2Fmt > 0 ) temp _val . z = BIFF2FmtTable [ ( temp _val . ixfe >> 8 ) & 0x1F ] ;
2017-02-11 01:58:22 +00:00
safe _format _xf ( temp _val , options , wb . opts . Date1904 ) ;
2015-04-02 22:14:07 +00:00
addcell ( { c : val . c , r : val . r } , temp _val , options ) ;
break ;
2017-03-16 04:39:50 +00:00
case 'Blank' : if ( options . sheetStubs ) {
2017-05-17 04:27:55 +00:00
temp _val = ( { ixfe : val . ixfe , XF : XFs [ val . ixfe ] , t : 'z' } ) ;
2017-05-09 18:11:15 +00:00
if ( BIFF2Fmt > 0 ) temp _val . z = BIFF2FmtTable [ ( temp _val . ixfe >> 8 ) & 0x1F ] ;
2017-03-16 04:39:50 +00:00
safe _format _xf ( temp _val , options , wb . opts . Date1904 ) ;
addcell ( { c : val . c , r : val . r } , temp _val , options ) ;
} break ;
case 'MulBlank' : if ( options . sheetStubs ) {
for ( var _j = val . c ; _j <= val . C ; ++ _j ) {
var _ixfe = val . ixfe [ _j - val . c ] ;
2017-05-17 04:27:55 +00:00
temp _val = ( { ixfe : _ixfe , XF : XFs [ _ixfe ] , t : 'z' } ) ;
2017-05-09 18:11:15 +00:00
if ( BIFF2Fmt > 0 ) temp _val . z = BIFF2FmtTable [ ( temp _val . ixfe >> 8 ) & 0x1F ] ;
2017-03-16 04:39:50 +00:00
safe _format _xf ( temp _val , options , wb . opts . Date1904 ) ;
addcell ( { c : _j , r : val . r } , temp _val , options ) ;
}
} break ;
2017-02-19 21:11:48 +00:00
case 'RString' :
2015-04-02 22:14:07 +00:00
case 'Label' : case 'BIFF2STR' :
temp _val = make _cell ( val . val , val . ixfe , 's' ) ;
temp _val . XF = XFs [ temp _val . ixfe ] ;
2017-05-09 18:11:15 +00:00
if ( BIFF2Fmt > 0 ) temp _val . z = BIFF2FmtTable [ ( temp _val . ixfe >> 8 ) & 0x1F ] ;
2017-02-11 01:58:22 +00:00
safe _format _xf ( temp _val , options , wb . opts . Date1904 ) ;
2015-04-02 22:14:07 +00:00
addcell ( { c : val . c , r : val . r } , temp _val , options ) ;
break ;
2017-03-20 21:57:44 +00:00
2015-04-02 22:14:07 +00:00
case 'Dimensions' : {
if ( file _depth === 1 ) range = val ; /* TODO: stack */
} break ;
case 'SST' : {
sst = val ;
} break ;
case 'Format' : { /* val = [id, fmt] */
2017-12-01 05:51:31 +00:00
if ( opts . biff == 4 ) {
BIFF2FmtTable [ BIFF2Fmt ++ ] = val [ 1 ] ;
for ( var b4idx = 0 ; b4idx < BIFF2Fmt + 163 ; ++ b4idx ) if ( SSF . _table [ b4idx ] == val [ 1 ] ) break ;
if ( b4idx >= 163 ) SSF . load ( val [ 1 ] , BIFF2Fmt + 163 ) ;
}
else SSF . load ( val [ 1 ] , val [ 0 ] ) ;
2015-04-02 22:14:07 +00:00
} break ;
2017-02-11 01:58:22 +00:00
case 'BIFF2FORMAT' : {
2017-05-09 18:11:15 +00:00
BIFF2FmtTable [ BIFF2Fmt ++ ] = val ;
for ( var b2idx = 0 ; b2idx < BIFF2Fmt + 163 ; ++ b2idx ) if ( SSF . _table [ b2idx ] == val ) break ;
if ( b2idx >= 163 ) SSF . load ( val , BIFF2Fmt + 163 ) ;
2017-02-11 01:58:22 +00:00
} break ;
2015-04-02 22:14:07 +00:00
2017-12-30 05:41:41 +00:00
case 'MergeCells' : merges = merges . concat ( val ) ; break ;
2015-04-02 22:14:07 +00:00
case 'Obj' : objects [ val . cmo [ 0 ] ] = opts . lastobj = val ; break ;
case 'TxO' : opts . lastobj . TxO = val ; break ;
2017-05-09 18:11:15 +00:00
case 'ImData' : opts . lastobj . ImData = val ; break ;
2015-04-02 22:14:07 +00:00
case 'HLink' : {
for ( rngR = val [ 0 ] . s . r ; rngR <= val [ 0 ] . e . r ; ++ rngR )
2017-04-09 04:07:43 +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:11:15 +00:00
}
2015-04-02 22:14:07 +00:00
} break ;
case 'HLinkTooltip' : {
for ( rngR = val [ 0 ] . s . r ; rngR <= val [ 0 ] . e . r ; ++ rngR )
2017-04-09 04:07:43 +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 06:20:15 +00:00
if ( cc && cc . l ) cc . l . Tooltip = val [ 1 ] ;
2017-04-09 04:07:43 +00:00
}
2015-04-02 22:14:07 +00:00
} break ;
/* Comments */
case 'Note' : {
if ( opts . biff <= 5 && opts . biff >= 2 ) break ; /* TODO: BIFF5 */
2017-04-09 04:07:43 +00:00
cc = options . dense ? ( out [ val [ 0 ] . r ] || [ ] ) [ val [ 0 ] . c ] : out [ encode _cell ( val [ 0 ] ) ] ;
2015-04-02 22:14:07 +00:00
var noteobj = objects [ val [ 2 ] ] ;
if ( ! cc ) break ;
if ( ! cc . c ) cc . c = [ ] ;
cmnt = { a : val [ 1 ] , t : noteobj . TxO . t } ;
cc . c . push ( cmnt ) ;
} break ;
default : switch ( R . n ) { /* nested */
case 'ClrtClient' : break ;
case 'XFExt' : update _xfext ( XFs [ val . ixfe ] , val . ext ) ; break ;
2017-03-20 21:57:44 +00:00
case 'DefColWidth' : defwidth = val ; break ;
case 'DefaultRowHeight' : defheight = val [ 1 ] ; break ; // TODO: flags
case 'ColInfo' : {
if ( ! opts . cellStyles ) break ;
while ( val . e >= val . s ) {
colinfo [ val . e -- ] = { width : val . w / 256 } ;
if ( ! seencol ) { seencol = true ; find _mdw _colw ( val . w / 256 ) ; }
process _col ( colinfo [ val . e + 1 ] ) ;
}
} break ;
2017-04-30 16:28:24 +00:00
case 'Row' : {
var rowobj = { } ;
2017-07-10 22:29:24 +00:00
if ( val . level != null ) { rowinfo [ val . r ] = rowobj ; rowobj . level = val . level ; }
2017-04-30 16:28:24 +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 ;
2017-03-20 21:57:44 +00:00
2017-04-16 07:35:56 +00:00
case 'LeftMargin' :
case 'RightMargin' :
case 'TopMargin' :
case 'BottomMargin' :
if ( ! out [ '!margins' ] ) default _margins ( out [ '!margins' ] = { } ) ;
2017-05-17 04:27:55 +00:00
out [ '!margins' ] [ Rn . slice ( 0 , - 6 ) . toLowerCase ( ) ] = val ;
2017-04-16 07:35:56 +00:00
break ;
case 'Setup' : // TODO
if ( ! out [ '!margins' ] ) default _margins ( out [ '!margins' ] = { } ) ;
out [ '!margins' ] . header = val . header ;
out [ '!margins' ] . footer = val . footer ;
break ;
2017-12-30 05:41:41 +00:00
case 'Window2' : // TODO
// $FlowIgnore
if ( val . RTL ) Workbook . Views [ 0 ] . RTL = true ;
break ;
2015-04-02 22:14:07 +00:00
case 'Header' : break ; // TODO
case 'Footer' : break ; // TODO
case 'HCenter' : break ; // TODO
case 'VCenter' : break ; // TODO
case 'Pls' : break ; // TODO
case 'GCW' : break ;
case 'LHRecord' : break ;
case 'DBCell' : break ; // TODO
case 'EntExU2' : break ; // TODO
case 'SxView' : break ; // TODO
case 'Sxvd' : break ; // TODO
case 'SXVI' : break ; // TODO
case 'SXVDEx' : break ; // TODO
case 'SxIvd' : break ; // TODO
2017-07-28 23:54:51 +00:00
case 'SXString' : break ; // TODO
case 'Sync' : break ;
case 'Addin' : break ;
2015-04-02 22:14:07 +00:00
case 'SXDI' : break ; // TODO
case 'SXLI' : break ; // TODO
case 'SXEx' : break ; // TODO
case 'QsiSXTag' : break ; // TODO
case 'Selection' : break ;
case 'Feat' : break ;
case 'FeatHdr' : case 'FeatHdr11' : break ;
case 'Feature11' : case 'Feature12' : case 'List12' : break ;
case 'Country' : country = val ; break ;
case 'RecalcId' : break ;
2017-03-20 21:57:44 +00:00
case 'DxGCol' : break ; // TODO: htmlify
2015-04-02 22:14:07 +00:00
case 'Fbi' : case 'Fbi2' : case 'GelFrame' : break ;
case 'Font' : break ; // TODO
case 'XFCRC' : break ; // TODO
case 'Style' : break ; // TODO
case 'StyleExt' : break ; // TODO
2017-12-30 05:41:41 +00:00
case 'Palette' : palette = val ; break ;
case 'Theme' : themes = val ; break ;
2015-04-02 22:14:07 +00:00
/* Protection */
case 'ScenarioProtect' : break ;
case 'ObjProtect' : break ;
/* Conditional Formatting */
case 'CondFmt12' : break ;
/* Table */
case 'Table' : break ; // TODO
case 'TableStyles' : break ; // TODO
case 'TableStyle' : break ; // TODO
case 'TableStyleElement' : break ; // TODO
/* PivotTable */
case 'SXStreamID' : break ; // TODO
case 'SXVS' : break ; // TODO
case 'DConRef' : break ; // TODO
case 'SXAddl' : break ; // TODO
case 'DConBin' : break ; // TODO
case 'DConName' : break ; // TODO
case 'SXPI' : break ; // TODO
case 'SxFormat' : break ; // TODO
case 'SxSelect' : break ; // TODO
case 'SxRule' : break ; // TODO
case 'SxFilt' : break ; // TODO
case 'SxItm' : break ; // TODO
case 'SxDXF' : break ; // TODO
/* Scenario Manager */
case 'ScenMan' : break ;
/* Data Consolidation */
case 'DCon' : break ;
/* Watched Cell */
case 'CellWatch' : break ;
/* Print Settings */
case 'PrintRowCol' : break ;
case 'PrintGrid' : break ;
case 'PrintSize' : break ;
case 'XCT' : break ;
case 'CRN' : break ;
case 'Scl' : {
//console.log("Zoom Level:", val[0]/val[1],val);
} break ;
case 'SheetExt' : {
2017-05-09 18:11:15 +00:00
/* empty */
2015-04-02 22:14:07 +00:00
} break ;
case 'SheetExtOptional' : {
2017-05-09 18:11:15 +00:00
/* empty */
2015-04-02 22:14:07 +00:00
} break ;
/* VBA */
case 'ObNoMacros' : {
2017-05-09 18:11:15 +00:00
/* empty */
2015-04-02 22:14:07 +00:00
} break ;
case 'ObProj' : {
2017-05-09 18:11:15 +00:00
/* empty */
2015-04-02 22:14:07 +00:00
} break ;
case 'CodeName' : {
2017-11-20 02:13:37 +00:00
if ( ! cur _sheet ) Workbook . WBProps . CodeName = val || "ThisWorkbook" ;
else wsprops . CodeName = val || wsprops . name ;
2015-04-02 22:14:07 +00:00
} break ;
case 'GUIDTypeLib' : {
2017-05-09 18:11:15 +00:00
/* empty */
2015-04-02 22:14:07 +00:00
} break ;
case 'WOpt' : break ; // TODO: WTF?
case 'PhoneticInfo' : break ;
case 'OleObjectSize' : break ;
/* Differential Formatting */
case 'DXF' : case 'DXFN' : case 'DXFN12' : case 'DXFN12List' : case 'DXFN12NoCB' : break ;
/* Data Validation */
case 'Dv' : case 'DVal' : break ;
/* Data Series */
case 'BRAI' : case 'Series' : case 'SeriesText' : break ;
/* Data Connection */
case 'DConn' : break ;
case 'DbOrParamQry' : break ;
case 'DBQueryExt' : break ;
2017-07-28 23:54:51 +00:00
case 'OleDbConn' : break ;
case 'ExtString' : break ;
2015-04-02 22:14:07 +00:00
/* Formatting */
case 'IFmtRecord' : break ;
case 'CondFmt' : case 'CF' : case 'CF12' : case 'CFEx' : break ;
/* Explicitly Ignored */
case 'Excel9File' : break ;
case 'Units' : break ;
2017-09-22 22:40:09 +00:00
case 'InterfaceHdr' : case 'Mms' : case 'InterfaceEnd' : case 'DSF' : break ;
case 'BuiltInFnGroupCount' : /* 2.4.30 0x0E or 0x10 but excel 2011 generates 0x11? */ break ;
2015-04-02 22:14:07 +00:00
/* View Stuff */
2017-12-30 05:41:41 +00:00
case 'Window1' : case 'HideObj' : case 'GridSet' : case 'Guts' :
2015-04-02 22:14:07 +00:00
case 'UserBView' : case 'UserSViewBegin' : case 'UserSViewEnd' :
case 'Pane' : break ;
default : switch ( R . n ) { /* nested */
/* Chart */
case 'Dat' :
case 'Begin' : case 'End' :
case 'StartBlock' : case 'EndBlock' :
case 'Frame' : case 'Area' :
case 'Axis' : case 'AxisLine' : case 'Tick' : break ;
case 'AxesUsed' :
case 'CrtLayout12' : case 'CrtLayout12A' : case 'CrtLink' : case 'CrtLine' : case 'CrtMlFrt' : case 'CrtMlFrtContinue' : break ;
case 'LineFormat' : case 'AreaFormat' :
case 'Chart' : case 'Chart3d' : case 'Chart3DBarShape' : case 'ChartFormat' : case 'ChartFrtInfo' : break ;
case 'PlotArea' : case 'PlotGrowth' : break ;
case 'SeriesList' : case 'SerParent' : case 'SerAuxTrend' : break ;
case 'DataFormat' : case 'SerToCrt' : case 'FontX' : break ;
case 'CatSerRange' : case 'AxcExt' : case 'SerFmt' : break ;
case 'ShtProps' : break ;
case 'DefaultText' : case 'Text' : case 'CatLab' : break ;
case 'DataLabExtContents' : break ;
case 'Legend' : case 'LegendException' : break ;
case 'Pie' : case 'Scatter' : break ;
case 'PieFormat' : case 'MarkerFormat' : break ;
case 'StartObject' : case 'EndObject' : break ;
case 'AlRuns' : case 'ObjectLink' : break ;
case 'SIIndex' : break ;
case 'AttachedLabel' : case 'YMult' : break ;
/* Chart Group */
case 'Line' : case 'Bar' : break ;
case 'Surf' : break ;
/* Axis Group */
case 'AxisParent' : break ;
case 'Pos' : break ;
case 'ValueRange' : break ;
/* Pivot Chart */
case 'SXViewEx9' : break ; // TODO
case 'SXViewLink' : break ;
case 'PivotChartBits' : break ;
case 'SBaseRef' : break ;
case 'TextPropsStream' : break ;
/* Chart Misc */
case 'LnExt' : break ;
case 'MkrExt' : break ;
case 'CrtCoopt' : break ;
/* Query Table */
case 'Qsi' : case 'Qsif' : case 'Qsir' : case 'QsiSXTag' : break ;
case 'TxtQry' : break ;
/* Filter */
case 'FilterMode' : break ;
case 'AutoFilter' : case 'AutoFilterInfo' : break ;
case 'AutoFilter12' : break ;
case 'DropDownObjIds' : break ;
case 'Sort' : break ;
case 'SortData' : break ;
/* Drawing */
case 'ShapePropsStream' : break ;
case 'MsoDrawing' : case 'MsoDrawingGroup' : case 'MsoDrawingSelection' : break ;
/* Pub Stuff */
2017-05-09 18:11:15 +00:00
case 'WebPub' : case 'AutoWebPub' : break ;
2015-04-02 22:14:07 +00:00
/* Print Stuff */
case 'HeaderFooter' : case 'HFPicture' : case 'PLV' :
2017-05-09 18:11:15 +00:00
case 'HorizontalPageBreaks' : case 'VerticalPageBreaks' : break ;
2015-04-02 22:14:07 +00:00
/* Behavioral */
case 'Backup' : case 'CompressPictures' : case 'Compat12' : break ;
/* Should not Happen */
case 'Continue' : case 'ContinueFrt12' : break ;
/* Future Records */
case 'FrtFontList' : case 'FrtWrapper' : break ;
2017-02-11 01:58:22 +00:00
default : switch ( R . n ) { /* nested */
2015-04-02 22:14:07 +00:00
/* BIFF5 records */
case 'TabIdConf' : case 'Radar' : case 'RadarArea' : case 'DropBar' : case 'Intl' : case 'CoordList' : case 'SerAuxErrBar' : break ;
2017-02-11 01:58:22 +00:00
/* BIFF2-4 records */
2017-02-19 21:11:48 +00:00
case 'BIFF2FONTCLR' : case 'BIFF2FMTCNT' : case 'BIFF2FONTXTRA' : break ;
2017-02-11 01:58:22 +00:00
case 'BIFF2XF' : case 'BIFF3XF' : case 'BIFF4XF' : break ;
case 'BIFF4FMTCNT' : case 'BIFF2ROW' : case 'BIFF2WINDOW2' : break ;
2015-04-02 22:14:07 +00:00
/* Miscellaneous */
case 'SCENARIO' : case 'DConBin' : case 'PicF' : case 'DataLabExt' :
case 'Lel' : case 'BopPop' : case 'BopPopCustom' : case 'RealTimeData' :
case 'Name' : break ;
2017-07-28 23:54:51 +00:00
case 'LHNGraph' : case 'FnGroupName' : case 'AddMenu' : case 'LPr' : break ;
case 'ListObj' : case 'ListField' : break ;
case 'RRSort' : break ;
case 'BigName' : break ;
2017-09-22 22:40:09 +00:00
case 'ToolbarHdr' : case 'ToolbarEnd' : break ;
case 'DDEObjName' : break ;
case 'FRTArchId$' : break ;
2015-04-02 22:14:07 +00:00
default : if ( options . WTF ) throw 'Unrecognized Record ' + R . n ;
} } } }
} else blob . l += length ;
}
2018-01-23 09:09:53 +00:00
wb . SheetNames = keys ( Directory ) . sort ( function ( a , b ) { return Number ( a ) - Number ( b ) ; } ) . map ( function ( x ) { return Directory [ x ] . name ; } ) ;
2015-04-02 22:14:07 +00:00
if ( ! options . bookSheets ) wb . Sheets = Sheets ;
2017-04-16 07:35:56 +00:00
if ( wb . Sheets ) FilterDatabases . forEach ( function ( r , i ) { wb . Sheets [ wb . SheetNames [ i ] ] [ '!autofilter' ] = r ; } ) ;
2015-04-02 22:14:07 +00:00
wb . Preamble = Preamble ;
wb . Strings = sst ;
wb . SSF = SSF . get _table ( ) ;
if ( opts . enc ) wb . Encryption = opts . enc ;
2017-12-30 05:41:41 +00:00
if ( themes ) wb . Themes = themes ;
2015-04-02 22:14:07 +00:00
wb . Metadata = { } ;
if ( country !== undefined ) wb . Metadata . Country = country ;
2017-04-16 07:35:56 +00:00
if ( supbooks . names . length > 0 ) Workbook . Names = supbooks . names ;
2017-03-31 21:50:32 +00:00
wb . Workbook = Workbook ;
2015-04-02 22:14:07 +00:00
return wb ;
}
2018-05-05 06:42:56 +00:00
/* TODO: split props*/
var PSCLSID = {
SI : "e0859ff2f94f6810ab9108002b27b3d9" ,
DSI : "02d5cdd59c2e1b10939708002b2cf9ae" ,
UDI : "05d5cdd59c2e1b10939708002b2cf9ae"
} ;
function parse _xls _props ( cfb , props , o ) {
2017-04-30 16:28:24 +00:00
/* [MS-OSHARED] 2.3.3.2.2 Document Summary Information Property Set */
2017-08-10 23:55:45 +00:00
var DSI = CFB . find ( cfb , '!DocumentSummaryInformation' ) ;
2018-02-14 05:26:28 +00:00
if ( DSI && DSI . size > 0 ) try {
2018-05-05 06:42:56 +00:00
var DocSummary = parse _PropertySetStream ( DSI , DocSummaryPIDDSI , PSCLSID . DSI ) ;
2017-09-30 06:19:01 +00:00
for ( var d in DocSummary ) props [ d ] = DocSummary [ d ] ;
2017-12-30 05:41:41 +00:00
} catch ( e ) { if ( o . WTF ) throw e ; /* empty */ }
2017-04-30 16:28:24 +00:00
/* [MS-OSHARED] 2.3.3.2.1 Summary Information Property Set*/
2017-08-10 23:55:45 +00:00
var SI = CFB . find ( cfb , '!SummaryInformation' ) ;
2018-02-14 05:26:28 +00:00
if ( SI && SI . size > 0 ) try {
2018-05-05 06:42:56 +00:00
var Summary = parse _PropertySetStream ( SI , SummaryPIDSI , PSCLSID . SI ) ;
2017-09-30 06:19:01 +00:00
for ( var s in Summary ) if ( props [ s ] == null ) props [ s ] = Summary [ s ] ;
2017-12-30 05:41:41 +00:00
} catch ( e ) { if ( o . WTF ) throw e ; /* empty */ }
2018-05-05 06:42:56 +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 , cfb ) {
var DSEntries = [ ] , SEntries = [ ] , CEntries = [ ] ;
var i = 0 , Keys ;
if ( wb . Props ) {
Keys = keys ( wb . Props ) ;
2018-05-20 03:03:23 +00:00
// $FlowIgnore
2018-05-05 06:42:56 +00:00
for ( i = 0 ; i < Keys . length ; ++ i ) ( DocSummaryRE . hasOwnProperty ( Keys [ i ] ) ? DSEntries : SummaryRE . hasOwnProperty ( Keys [ i ] ) ? SEntries : CEntries ) . push ( [ Keys [ i ] , wb . Props [ Keys [ i ] ] ] ) ;
}
if ( wb . Custprops ) {
Keys = keys ( wb . Custprops ) ;
2018-05-20 03:03:23 +00:00
// $FlowIgnore
for ( i = 0 ; i < Keys . length ; ++ i ) if ( ! ( wb . Props || { } ) . hasOwnProperty ( Keys [ i ] ) ) ( DocSummaryRE . hasOwnProperty ( Keys [ i ] ) ? DSEntries : SummaryRE . hasOwnProperty ( Keys [ i ] ) ? SEntries : CEntries ) . push ( [ Keys [ i ] , wb . Custprops [ Keys [ i ] ] ] ) ;
2018-05-05 06:42:56 +00:00
}
var CEntries2 = [ ] ;
for ( i = 0 ; i < CEntries . length ; ++ i ) {
if ( XLSPSSkip . indexOf ( CEntries [ i ] [ 0 ] ) > - 1 ) continue ;
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:28:24 +00:00
}
2015-04-02 22:14:07 +00:00
function parse _xlscfb ( cfb , options ) {
if ( ! options ) options = { } ;
fix _read _opts ( options ) ;
reset _cp ( ) ;
2017-12-30 05:41:41 +00:00
if ( options . codepage ) set _ansi ( options . codepage ) ;
2018-01-23 09:09:53 +00:00
var CompObj , WB ;
2017-02-11 01:58:22 +00:00
if ( cfb . FullPaths ) {
2017-12-30 05:41:41 +00:00
if ( CFB . find ( cfb , '/encryption' ) ) throw new Error ( "File is password-protected" ) ;
2017-08-10 23:55:45 +00:00
CompObj = CFB . find ( cfb , '!CompObj' ) ;
2017-09-30 06:19:01 +00:00
WB = CFB . find ( cfb , '/Workbook' ) || CFB . find ( cfb , '/Book' ) ;
2015-04-02 22:14:07 +00:00
} else {
2017-08-19 23:13:21 +00:00
switch ( options . type ) {
case 'base64' : cfb = s2a ( Base64 . decode ( cfb ) ) ; break ;
case 'binary' : cfb = s2a ( cfb ) ; break ;
case 'buffer' : break ;
case 'array' : if ( ! Array . isArray ( cfb ) ) cfb = Array . prototype . slice . call ( cfb ) ; break ;
}
2015-04-02 22:14:07 +00:00
prep _blob ( cfb , 0 ) ;
2017-08-10 23:55:45 +00:00
WB = ( { content : cfb } ) ;
2015-04-02 22:14:07 +00:00
}
2018-01-23 09:09:53 +00:00
var WorkbookP ;
2015-04-02 22:14:07 +00:00
2017-08-10 23:55:45 +00:00
var _data ;
2018-01-23 09:09:53 +00:00
if ( CompObj ) parse _compobj ( CompObj ) ;
2017-03-13 07:34:05 +00:00
if ( options . bookProps && ! options . bookSheets ) WorkbookP = ( { } ) ;
2015-04-02 22:14:07 +00:00
else {
2017-09-30 06:19:01 +00:00
var T = has _buf ? 'buffer' : 'array' ;
2017-08-10 23:55:45 +00:00
if ( WB && WB . content ) WorkbookP = parse _workbook ( WB . content , options ) ;
2017-04-09 04:07:43 +00:00
/* Quattro Pro 7-8 */
2017-09-30 06:19:01 +00:00
else if ( ( _data = CFB . find ( cfb , 'PerfectOffice_MAIN' ) ) && _data . content ) WorkbookP = WK _ . to _workbook ( _data . content , ( options . type = T , options ) ) ;
2017-04-09 04:07:43 +00:00
/* Quattro Pro 9 */
2017-09-30 06:19:01 +00:00
else if ( ( _data = CFB . find ( cfb , 'NativeContent_MAIN' ) ) && _data . content ) WorkbookP = WK _ . to _workbook ( _data . content , ( options . type = T , options ) ) ;
2015-04-02 22:14:07 +00:00
else throw new Error ( "Cannot find Workbook stream" ) ;
2017-11-15 18:50:04 +00:00
if ( options . bookVBA && cfb . FullPaths && CFB . find ( cfb , '/_VBA_PROJECT_CUR/VBA/dir' ) ) WorkbookP . vbaraw = make _vba _xls ( cfb ) ;
2015-04-02 22:14:07 +00:00
}
var props = { } ;
2018-05-05 06:42:56 +00:00
if ( cfb . FullPaths ) parse _xls _props ( cfb , props , options ) ;
2017-09-30 06:19:01 +00:00
2015-04-02 22:14:07 +00:00
WorkbookP . Props = WorkbookP . Custprops = props ; /* TODO: split up properties */
if ( options . bookFiles ) WorkbookP . cfb = cfb ;
2017-03-13 07:34:05 +00:00
/*WorkbookP.CompObjP = CompObjP; // TODO: storage? */
2015-04-02 22:14:07 +00:00
return WorkbookP ;
}
2017-09-22 22:40:09 +00:00
function write _xlscfb ( wb , opts ) {
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:41:41 +00:00
case "xla" : if ( ! o . bookType ) o . bookType = "xla" ;
/* falls through */
2017-09-22 22:40:09 +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:42:56 +00:00
if ( o . biff == 8 && ( wb . Props || wb . Custprops ) ) write _xls _props ( wb , cfb ) ;
2017-09-22 22:40:09 +00:00
// TODO: SI, DSI, CO
2017-10-27 19:55:07 +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:40:09 +00:00
return cfb ;
}
2014-01-28 16:35:26 +00:00
/* [MS-XLSB] 2.3 Record Enumeration */
2015-04-02 22:14:07 +00:00
var XLSBRecordEnum = {
2017-02-11 01:58:22 +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 } ,
0x0010 : { n : "BrtFRTArchID$" , f : parse _BrtFRTArchID$ } ,
0x0013 : { n : "BrtSSTItem" , f : parse _RichStr } ,
2017-09-22 22:40:09 +00:00
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" } ,
0x0024 : { n : "BrtFRTEnd" } ,
0x0025 : { n : "BrtACBegin" } ,
0x0026 : { n : "BrtACEnd" } ,
2017-02-19 21:11:48 +00:00
0x0027 : { n : "BrtName" , f : parse _BrtName } ,
2017-09-22 22:40:09 +00:00
0x0028 : { n : "BrtIndexRowBlock" } ,
0x002A : { n : "BrtIndexBlock" } ,
2017-02-11 01:58:22 +00:00
0x002B : { n : "BrtFont" , f : parse _BrtFont } ,
0x002C : { n : "BrtFmt" , f : parse _BrtFmt } ,
2017-08-05 06:58:40 +00:00
0x002D : { n : "BrtFill" , f : parse _BrtFill } ,
0x002E : { n : "BrtBorder" , f : parse _BrtBorder } ,
2017-02-11 01:58:22 +00:00
0x002F : { n : "BrtXF" , f : parse _BrtXF } ,
2017-09-22 22:40:09 +00:00
0x0030 : { n : "BrtStyle" } ,
0x0031 : { n : "BrtCellMeta" } ,
0x0032 : { n : "BrtValueMeta" } ,
0x0033 : { n : "BrtMdb" } ,
0x0034 : { n : "BrtBeginFmd" } ,
0x0035 : { n : "BrtEndFmd" } ,
0x0036 : { n : "BrtBeginMdx" } ,
0x0037 : { n : "BrtEndMdx" } ,
0x0038 : { n : "BrtBeginMdxTuple" } ,
0x0039 : { n : "BrtEndMdxTuple" } ,
0x003A : { n : "BrtMdxMbrIstr" } ,
0x003B : { n : "BrtStr" } ,
2017-03-20 21:57:44 +00:00
0x003C : { n : "BrtColInfo" , f : parse _ColInfo } ,
2017-09-22 22:40:09 +00:00
0x003E : { n : "BrtCellRString" } ,
2017-02-11 01:58:22 +00:00
0x003F : { n : "BrtCalcChainItem$" , f : parse _BrtCalcChainItem$ } ,
2017-09-22 22:40:09 +00:00
0x0040 : { n : "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" } ,
0x0082 : { n : "BrtEndSheet" } ,
2017-02-11 01:58:22 +00:00
0x0083 : { n : "BrtBeginBook" , f : parsenoop , p : 0 } ,
2017-09-22 22:40:09 +00:00
0x0084 : { n : "BrtEndBook" } ,
0x0085 : { n : "BrtBeginWsViews" } ,
0x0086 : { n : "BrtEndWsViews" } ,
0x0087 : { n : "BrtBeginBookViews" } ,
0x0088 : { n : "BrtEndBookViews" } ,
2017-12-30 05:41:41 +00:00
0x0089 : { n : "BrtBeginWsView" , f : parse _BrtBeginWsView } ,
2017-09-22 22:40:09 +00:00
0x008A : { n : "BrtEndWsView" } ,
0x008B : { n : "BrtBeginCsViews" } ,
0x008C : { n : "BrtEndCsViews" } ,
0x008D : { n : "BrtBeginCsView" } ,
0x008E : { n : "BrtEndCsView" } ,
0x008F : { n : "BrtBeginBundleShs" } ,
0x0090 : { n : "BrtEndBundleShs" } ,
0x0091 : { n : "BrtBeginSheetData" } ,
0x0092 : { n : "BrtEndSheetData" } ,
2017-02-11 01:58:22 +00:00
0x0093 : { n : "BrtWsProp" , f : parse _BrtWsProp } ,
0x0094 : { n : "BrtWsDim" , f : parse _BrtWsDim , p : 16 } ,
2017-09-22 22:40:09 +00:00
0x0097 : { n : "BrtPane" } ,
0x0098 : { n : "BrtSel" } ,
2017-02-11 01:58:22 +00:00
0x0099 : { n : "BrtWbProp" , f : parse _BrtWbProp } ,
2017-09-22 22:40:09 +00:00
0x009A : { n : "BrtWbFactoid" } ,
0x009B : { n : "BrtFileRecover" } ,
2017-02-11 01:58:22 +00:00
0x009C : { n : "BrtBundleSh" , f : parse _BrtBundleSh } ,
2017-09-22 22:40:09 +00:00
0x009D : { n : "BrtCalcProp" } ,
0x009E : { n : "BrtBookView" } ,
2017-02-11 01:58:22 +00:00
0x009F : { n : "BrtBeginSst" , f : parse _BrtBeginSst } ,
2017-09-22 22:40:09 +00:00
0x00A0 : { n : "BrtEndSst" } ,
2017-04-16 07:35:56 +00:00
0x00A1 : { n : "BrtBeginAFilter" , f : parse _UncheckedRfX } ,
2017-09-22 22:40:09 +00:00
0x00A2 : { n : "BrtEndAFilter" } ,
0x00A3 : { n : "BrtBeginFilterColumn" } ,
0x00A4 : { n : "BrtEndFilterColumn" } ,
0x00A5 : { n : "BrtBeginFilters" } ,
0x00A6 : { n : "BrtEndFilters" } ,
0x00A7 : { n : "BrtFilter" } ,
0x00A8 : { n : "BrtColorFilter" } ,
0x00A9 : { n : "BrtIconFilter" } ,
0x00AA : { n : "BrtTop10Filter" } ,
0x00AB : { n : "BrtDynamicFilter" } ,
0x00AC : { n : "BrtBeginCustomFilters" } ,
0x00AD : { n : "BrtEndCustomFilters" } ,
0x00AE : { n : "BrtCustomFilter" } ,
0x00AF : { n : "BrtAFilterDateGroupItem" } ,
2017-02-11 01:58:22 +00:00
0x00B0 : { n : "BrtMergeCell" , f : parse _BrtMergeCell } ,
2017-09-22 22:40:09 +00:00
0x00B1 : { n : "BrtBeginMergeCells" } ,
0x00B2 : { n : "BrtEndMergeCells" } ,
0x00B3 : { n : "BrtBeginPivotCacheDef" } ,
0x00B4 : { n : "BrtEndPivotCacheDef" } ,
0x00B5 : { n : "BrtBeginPCDFields" } ,
0x00B6 : { n : "BrtEndPCDFields" } ,
0x00B7 : { n : "BrtBeginPCDField" } ,
0x00B8 : { n : "BrtEndPCDField" } ,
0x00B9 : { n : "BrtBeginPCDSource" } ,
0x00BA : { n : "BrtEndPCDSource" } ,
0x00BB : { n : "BrtBeginPCDSRange" } ,
0x00BC : { n : "BrtEndPCDSRange" } ,
0x00BD : { n : "BrtBeginPCDFAtbl" } ,
0x00BE : { n : "BrtEndPCDFAtbl" } ,
0x00BF : { n : "BrtBeginPCDIRun" } ,
0x00C0 : { n : "BrtEndPCDIRun" } ,
0x00C1 : { n : "BrtBeginPivotCacheRecords" } ,
0x00C2 : { n : "BrtEndPivotCacheRecords" } ,
0x00C3 : { n : "BrtBeginPCDHierarchies" } ,
0x00C4 : { n : "BrtEndPCDHierarchies" } ,
0x00C5 : { n : "BrtBeginPCDHierarchy" } ,
0x00C6 : { n : "BrtEndPCDHierarchy" } ,
0x00C7 : { n : "BrtBeginPCDHFieldsUsage" } ,
0x00C8 : { n : "BrtEndPCDHFieldsUsage" } ,
0x00C9 : { n : "BrtBeginExtConnection" } ,
0x00CA : { n : "BrtEndExtConnection" } ,
0x00CB : { n : "BrtBeginECDbProps" } ,
0x00CC : { n : "BrtEndECDbProps" } ,
0x00CD : { n : "BrtBeginECOlapProps" } ,
0x00CE : { n : "BrtEndECOlapProps" } ,
0x00CF : { n : "BrtBeginPCDSConsol" } ,
0x00D0 : { n : "BrtEndPCDSConsol" } ,
0x00D1 : { n : "BrtBeginPCDSCPages" } ,
0x00D2 : { n : "BrtEndPCDSCPages" } ,
0x00D3 : { n : "BrtBeginPCDSCPage" } ,
0x00D4 : { n : "BrtEndPCDSCPage" } ,
0x00D5 : { n : "BrtBeginPCDSCPItem" } ,
0x00D6 : { n : "BrtEndPCDSCPItem" } ,
0x00D7 : { n : "BrtBeginPCDSCSets" } ,
0x00D8 : { n : "BrtEndPCDSCSets" } ,
0x00D9 : { n : "BrtBeginPCDSCSet" } ,
0x00DA : { n : "BrtEndPCDSCSet" } ,
0x00DB : { n : "BrtBeginPCDFGroup" } ,
0x00DC : { n : "BrtEndPCDFGroup" } ,
0x00DD : { n : "BrtBeginPCDFGItems" } ,
0x00DE : { n : "BrtEndPCDFGItems" } ,
0x00DF : { n : "BrtBeginPCDFGRange" } ,
0x00E0 : { n : "BrtEndPCDFGRange" } ,
0x00E1 : { n : "BrtBeginPCDFGDiscrete" } ,
0x00E2 : { n : "BrtEndPCDFGDiscrete" } ,
0x00E3 : { n : "BrtBeginPCDSDTupleCache" } ,
0x00E4 : { n : "BrtEndPCDSDTupleCache" } ,
0x00E5 : { n : "BrtBeginPCDSDTCEntries" } ,
0x00E6 : { n : "BrtEndPCDSDTCEntries" } ,
0x00E7 : { n : "BrtBeginPCDSDTCEMembers" } ,
0x00E8 : { n : "BrtEndPCDSDTCEMembers" } ,
0x00E9 : { n : "BrtBeginPCDSDTCEMember" } ,
0x00EA : { n : "BrtEndPCDSDTCEMember" } ,
0x00EB : { n : "BrtBeginPCDSDTCQueries" } ,
0x00EC : { n : "BrtEndPCDSDTCQueries" } ,
0x00ED : { n : "BrtBeginPCDSDTCQuery" } ,
0x00EE : { n : "BrtEndPCDSDTCQuery" } ,
0x00EF : { n : "BrtBeginPCDSDTCSets" } ,
0x00F0 : { n : "BrtEndPCDSDTCSets" } ,
0x00F1 : { n : "BrtBeginPCDSDTCSet" } ,
0x00F2 : { n : "BrtEndPCDSDTCSet" } ,
0x00F3 : { n : "BrtBeginPCDCalcItems" } ,
0x00F4 : { n : "BrtEndPCDCalcItems" } ,
0x00F5 : { n : "BrtBeginPCDCalcItem" } ,
0x00F6 : { n : "BrtEndPCDCalcItem" } ,
0x00F7 : { n : "BrtBeginPRule" } ,
0x00F8 : { n : "BrtEndPRule" } ,
0x00F9 : { n : "BrtBeginPRFilters" } ,
0x00FA : { n : "BrtEndPRFilters" } ,
0x00FB : { n : "BrtBeginPRFilter" } ,
0x00FC : { n : "BrtEndPRFilter" } ,
0x00FD : { n : "BrtBeginPNames" } ,
0x00FE : { n : "BrtEndPNames" } ,
0x00FF : { n : "BrtBeginPName" } ,
0x0100 : { n : "BrtEndPName" } ,
0x0101 : { n : "BrtBeginPNPairs" } ,
0x0102 : { n : "BrtEndPNPairs" } ,
0x0103 : { n : "BrtBeginPNPair" } ,
0x0104 : { n : "BrtEndPNPair" } ,
0x0105 : { n : "BrtBeginECWebProps" } ,
0x0106 : { n : "BrtEndECWebProps" } ,
0x0107 : { n : "BrtBeginEcWpTables" } ,
0x0108 : { n : "BrtEndECWPTables" } ,
0x0109 : { n : "BrtBeginECParams" } ,
0x010A : { n : "BrtEndECParams" } ,
0x010B : { n : "BrtBeginECParam" } ,
0x010C : { n : "BrtEndECParam" } ,
0x010D : { n : "BrtBeginPCDKPIs" } ,
0x010E : { n : "BrtEndPCDKPIs" } ,
0x010F : { n : "BrtBeginPCDKPI" } ,
0x0110 : { n : "BrtEndPCDKPI" } ,
0x0111 : { n : "BrtBeginDims" } ,
0x0112 : { n : "BrtEndDims" } ,
0x0113 : { n : "BrtBeginDim" } ,
0x0114 : { n : "BrtEndDim" } ,
0x0115 : { n : "BrtIndexPartEnd" } ,
0x0116 : { n : "BrtBeginStyleSheet" } ,
0x0117 : { n : "BrtEndStyleSheet" } ,
0x0118 : { n : "BrtBeginSXView" } ,
0x0119 : { n : "BrtEndSXVI" } ,
0x011A : { n : "BrtBeginSXVI" } ,
0x011B : { n : "BrtBeginSXVIs" } ,
0x011C : { n : "BrtEndSXVIs" } ,
0x011D : { n : "BrtBeginSXVD" } ,
0x011E : { n : "BrtEndSXVD" } ,
0x011F : { n : "BrtBeginSXVDs" } ,
0x0120 : { n : "BrtEndSXVDs" } ,
0x0121 : { n : "BrtBeginSXPI" } ,
0x0122 : { n : "BrtEndSXPI" } ,
0x0123 : { n : "BrtBeginSXPIs" } ,
0x0124 : { n : "BrtEndSXPIs" } ,
0x0125 : { n : "BrtBeginSXDI" } ,
0x0126 : { n : "BrtEndSXDI" } ,
0x0127 : { n : "BrtBeginSXDIs" } ,
0x0128 : { n : "BrtEndSXDIs" } ,
0x0129 : { n : "BrtBeginSXLI" } ,
0x012A : { n : "BrtEndSXLI" } ,
0x012B : { n : "BrtBeginSXLIRws" } ,
0x012C : { n : "BrtEndSXLIRws" } ,
0x012D : { n : "BrtBeginSXLICols" } ,
0x012E : { n : "BrtEndSXLICols" } ,
0x012F : { n : "BrtBeginSXFormat" } ,
0x0130 : { n : "BrtEndSXFormat" } ,
0x0131 : { n : "BrtBeginSXFormats" } ,
0x0132 : { n : "BrtEndSxFormats" } ,
0x0133 : { n : "BrtBeginSxSelect" } ,
0x0134 : { n : "BrtEndSxSelect" } ,
0x0135 : { n : "BrtBeginISXVDRws" } ,
0x0136 : { n : "BrtEndISXVDRws" } ,
0x0137 : { n : "BrtBeginISXVDCols" } ,
0x0138 : { n : "BrtEndISXVDCols" } ,
0x0139 : { n : "BrtEndSXLocation" } ,
0x013A : { n : "BrtBeginSXLocation" } ,
0x013B : { n : "BrtEndSXView" } ,
0x013C : { n : "BrtBeginSXTHs" } ,
0x013D : { n : "BrtEndSXTHs" } ,
0x013E : { n : "BrtBeginSXTH" } ,
0x013F : { n : "BrtEndSXTH" } ,
0x0140 : { n : "BrtBeginISXTHRws" } ,
0x0141 : { n : "BrtEndISXTHRws" } ,
0x0142 : { n : "BrtBeginISXTHCols" } ,
0x0143 : { n : "BrtEndISXTHCols" } ,
0x0144 : { n : "BrtBeginSXTDMPS" } ,
0x0145 : { n : "BrtEndSXTDMPs" } ,
0x0146 : { n : "BrtBeginSXTDMP" } ,
0x0147 : { n : "BrtEndSXTDMP" } ,
0x0148 : { n : "BrtBeginSXTHItems" } ,
0x0149 : { n : "BrtEndSXTHItems" } ,
0x014A : { n : "BrtBeginSXTHItem" } ,
0x014B : { n : "BrtEndSXTHItem" } ,
0x014C : { n : "BrtBeginMetadata" } ,
0x014D : { n : "BrtEndMetadata" } ,
0x014E : { n : "BrtBeginEsmdtinfo" } ,
0x014F : { n : "BrtMdtinfo" } ,
0x0150 : { n : "BrtEndEsmdtinfo" } ,
0x0151 : { n : "BrtBeginEsmdb" } ,
0x0152 : { n : "BrtEndEsmdb" } ,
0x0153 : { n : "BrtBeginEsfmd" } ,
0x0154 : { n : "BrtEndEsfmd" } ,
0x0155 : { n : "BrtBeginSingleCells" } ,
0x0156 : { n : "BrtEndSingleCells" } ,
0x0157 : { n : "BrtBeginList" } ,
0x0158 : { n : "BrtEndList" } ,
0x0159 : { n : "BrtBeginListCols" } ,
0x015A : { n : "BrtEndListCols" } ,
0x015B : { n : "BrtBeginListCol" } ,
0x015C : { n : "BrtEndListCol" } ,
0x015D : { n : "BrtBeginListXmlCPr" } ,
0x015E : { n : "BrtEndListXmlCPr" } ,
0x015F : { n : "BrtListCCFmla" } ,
0x0160 : { n : "BrtListTrFmla" } ,
0x0161 : { n : "BrtBeginExternals" } ,
0x0162 : { n : "BrtEndExternals" } ,
2017-07-10 22:29:24 +00:00
0x0163 : { n : "BrtSupBookSrc" , f : parse _RelID } ,
2017-09-22 22:40:09 +00:00
0x0165 : { n : "BrtSupSelf" } ,
0x0166 : { n : "BrtSupSame" } ,
0x0167 : { n : "BrtSupTabs" } ,
0x0168 : { n : "BrtBeginSupBook" } ,
0x0169 : { n : "BrtPlaceholderName" } ,
2017-07-28 23:54:51 +00:00
0x016A : { n : "BrtExternSheet" , f : parse _ExternSheet } ,
2017-09-22 22:40:09 +00:00
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" } ,
0x0175 : { n : "BrtEndEsmdx" } ,
0x0176 : { n : "BrtBeginMdxSet" } ,
0x0177 : { n : "BrtEndMdxSet" } ,
0x0178 : { n : "BrtBeginMdxMbrProp" } ,
0x0179 : { n : "BrtEndMdxMbrProp" } ,
0x017A : { n : "BrtBeginMdxKPI" } ,
0x017B : { n : "BrtEndMdxKPI" } ,
0x017C : { n : "BrtBeginEsstr" } ,
0x017D : { n : "BrtEndEsstr" } ,
0x017E : { n : "BrtBeginPRFItem" } ,
0x017F : { n : "BrtEndPRFItem" } ,
0x0180 : { n : "BrtBeginPivotCacheIDs" } ,
0x0181 : { n : "BrtEndPivotCacheIDs" } ,
0x0182 : { n : "BrtBeginPivotCacheID" } ,
0x0183 : { n : "BrtEndPivotCacheID" } ,
0x0184 : { n : "BrtBeginISXVIs" } ,
0x0185 : { n : "BrtEndISXVIs" } ,
0x0186 : { n : "BrtBeginColInfos" } ,
0x0187 : { n : "BrtEndColInfos" } ,
0x0188 : { n : "BrtBeginRwBrk" } ,
0x0189 : { n : "BrtEndRwBrk" } ,
0x018A : { n : "BrtBeginColBrk" } ,
0x018B : { n : "BrtEndColBrk" } ,
0x018C : { n : "BrtBrk" } ,
0x018D : { n : "BrtUserBookView" } ,
0x018E : { n : "BrtInfo" } ,
0x018F : { n : "BrtCUsr" } ,
0x0190 : { n : "BrtUsr" } ,
0x0191 : { n : "BrtBeginUsers" } ,
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" } ,
0x01A7 : { n : "BrtBeginUserShView" } ,
0x01A8 : { n : "BrtEndUserShView" } ,
0x01A9 : { n : "BrtEndUserShViews" } ,
2017-02-19 21:11:48 +00:00
0x01AA : { n : "BrtArrFmla" , f : parse _BrtArrFmla } ,
0x01AB : { n : "BrtShrFmla" , f : parse _BrtShrFmla } ,
2017-09-22 22:40:09 +00:00
0x01AC : { n : "BrtTable" } ,
0x01AD : { n : "BrtBeginExtConnections" } ,
0x01AE : { n : "BrtEndExtConnections" } ,
0x01AF : { n : "BrtBeginPCDCalcMems" } ,
0x01B0 : { n : "BrtEndPCDCalcMems" } ,
0x01B1 : { n : "BrtBeginPCDCalcMem" } ,
0x01B2 : { n : "BrtEndPCDCalcMem" } ,
0x01B3 : { n : "BrtBeginPCDHGLevels" } ,
0x01B4 : { n : "BrtEndPCDHGLevels" } ,
0x01B5 : { n : "BrtBeginPCDHGLevel" } ,
0x01B6 : { n : "BrtEndPCDHGLevel" } ,
0x01B7 : { n : "BrtBeginPCDHGLGroups" } ,
0x01B8 : { n : "BrtEndPCDHGLGroups" } ,
0x01B9 : { n : "BrtBeginPCDHGLGroup" } ,
0x01BA : { n : "BrtEndPCDHGLGroup" } ,
0x01BB : { n : "BrtBeginPCDHGLGMembers" } ,
0x01BC : { n : "BrtEndPCDHGLGMembers" } ,
0x01BD : { n : "BrtBeginPCDHGLGMember" } ,
0x01BE : { n : "BrtEndPCDHGLGMember" } ,
0x01BF : { n : "BrtBeginQSI" } ,
0x01C0 : { n : "BrtEndQSI" } ,
0x01C1 : { n : "BrtBeginQSIR" } ,
0x01C2 : { n : "BrtEndQSIR" } ,
0x01C3 : { n : "BrtBeginDeletedNames" } ,
0x01C4 : { n : "BrtEndDeletedNames" } ,
0x01C5 : { n : "BrtBeginDeletedName" } ,
0x01C6 : { n : "BrtEndDeletedName" } ,
0x01C7 : { n : "BrtBeginQSIFs" } ,
0x01C8 : { n : "BrtEndQSIFs" } ,
0x01C9 : { n : "BrtBeginQSIF" } ,
0x01CA : { n : "BrtEndQSIF" } ,
0x01CB : { n : "BrtBeginAutoSortScope" } ,
0x01CC : { n : "BrtEndAutoSortScope" } ,
0x01CD : { n : "BrtBeginConditionalFormatting" } ,
0x01CE : { n : "BrtEndConditionalFormatting" } ,
0x01CF : { n : "BrtBeginCFRule" } ,
0x01D0 : { n : "BrtEndCFRule" } ,
0x01D1 : { n : "BrtBeginIconSet" } ,
0x01D2 : { n : "BrtEndIconSet" } ,
0x01D3 : { n : "BrtBeginDatabar" } ,
0x01D4 : { n : "BrtEndDatabar" } ,
0x01D5 : { n : "BrtBeginColorScale" } ,
0x01D6 : { n : "BrtEndColorScale" } ,
0x01D7 : { n : "BrtCFVO" } ,
0x01D8 : { n : "BrtExternValueMeta" } ,
0x01D9 : { n : "BrtBeginColorPalette" } ,
0x01DA : { n : "BrtEndColorPalette" } ,
0x01DB : { n : "BrtIndexedColor" } ,
2017-04-16 07:35:56 +00:00
0x01DC : { n : "BrtMargins" , f : parse _BrtMargins } ,
2017-09-22 22:40:09 +00:00
0x01DD : { n : "BrtPrintOptions" } ,
0x01DE : { n : "BrtPageSetup" } ,
0x01DF : { n : "BrtBeginHeaderFooter" } ,
0x01E0 : { n : "BrtEndHeaderFooter" } ,
0x01E1 : { n : "BrtBeginSXCrtFormat" } ,
0x01E2 : { n : "BrtEndSXCrtFormat" } ,
0x01E3 : { n : "BrtBeginSXCrtFormats" } ,
0x01E4 : { n : "BrtEndSXCrtFormats" } ,
2017-07-28 23:54:51 +00:00
0x01E5 : { n : "BrtWsFmtInfo" , f : parse _BrtWsFmtInfo } ,
2017-09-22 22:40:09 +00:00
0x01E6 : { n : "BrtBeginMgs" } ,
0x01E7 : { n : "BrtEndMGs" } ,
0x01E8 : { n : "BrtBeginMGMaps" } ,
0x01E9 : { n : "BrtEndMGMaps" } ,
0x01EA : { n : "BrtBeginMG" } ,
0x01EB : { n : "BrtEndMG" } ,
0x01EC : { n : "BrtBeginMap" } ,
0x01ED : { n : "BrtEndMap" } ,
2017-02-11 01:58:22 +00:00
0x01EE : { n : "BrtHLink" , f : parse _BrtHLink } ,
2017-09-22 22:40:09 +00:00
0x01EF : { n : "BrtBeginDCon" } ,
0x01F0 : { n : "BrtEndDCon" } ,
0x01F1 : { n : "BrtBeginDRefs" } ,
0x01F2 : { n : "BrtEndDRefs" } ,
0x01F3 : { n : "BrtDRef" } ,
0x01F4 : { n : "BrtBeginScenMan" } ,
0x01F5 : { n : "BrtEndScenMan" } ,
0x01F6 : { n : "BrtBeginSct" } ,
0x01F7 : { n : "BrtEndSct" } ,
0x01F8 : { n : "BrtSlc" } ,
0x01F9 : { n : "BrtBeginDXFs" } ,
0x01FA : { n : "BrtEndDXFs" } ,
0x01FB : { n : "BrtDXF" } ,
0x01FC : { n : "BrtBeginTableStyles" } ,
0x01FD : { n : "BrtEndTableStyles" } ,
0x01FE : { n : "BrtBeginTableStyle" } ,
0x01FF : { n : "BrtEndTableStyle" } ,
0x0200 : { n : "BrtTableStyleElement" } ,
0x0201 : { n : "BrtTableStyleClient" } ,
0x0202 : { n : "BrtBeginVolDeps" } ,
0x0203 : { n : "BrtEndVolDeps" } ,
0x0204 : { n : "BrtBeginVolType" } ,
0x0205 : { n : "BrtEndVolType" } ,
0x0206 : { n : "BrtBeginVolMain" } ,
0x0207 : { n : "BrtEndVolMain" } ,
0x0208 : { n : "BrtBeginVolTopic" } ,
0x0209 : { n : "BrtEndVolTopic" } ,
0x020A : { n : "BrtVolSubtopic" } ,
0x020B : { n : "BrtVolRef" } ,
0x020C : { n : "BrtVolNum" } ,
0x020D : { n : "BrtVolErr" } ,
0x020E : { n : "BrtVolStr" } ,
0x020F : { n : "BrtVolBool" } ,
0x0210 : { n : "BrtBeginCalcChain$" } ,
0x0211 : { n : "BrtEndCalcChain$" } ,
0x0212 : { n : "BrtBeginSortState" } ,
0x0213 : { n : "BrtEndSortState" } ,
0x0214 : { n : "BrtBeginSortCond" } ,
0x0215 : { n : "BrtEndSortCond" } ,
0x0216 : { n : "BrtBookProtection" } ,
0x0217 : { n : "BrtSheetProtection" } ,
0x0218 : { n : "BrtRangeProtection" } ,
0x0219 : { n : "BrtPhoneticInfo" } ,
0x021A : { n : "BrtBeginECTxtWiz" } ,
0x021B : { n : "BrtEndECTxtWiz" } ,
0x021C : { n : "BrtBeginECTWFldInfoLst" } ,
0x021D : { n : "BrtEndECTWFldInfoLst" } ,
0x021E : { n : "BrtBeginECTwFldInfo" } ,
0x0224 : { n : "BrtFileSharing" } ,
0x0225 : { n : "BrtOleSize" } ,
2017-03-28 22:07:46 +00:00
0x0226 : { n : "BrtDrawing" , f : parse _RelID } ,
2017-09-22 22:40:09 +00:00
0x0227 : { n : "BrtLegacyDrawing" } ,
0x0228 : { n : "BrtLegacyDrawingHF" } ,
0x0229 : { n : "BrtWebOpt" } ,
0x022A : { n : "BrtBeginWebPubItems" } ,
0x022B : { n : "BrtEndWebPubItems" } ,
0x022C : { n : "BrtBeginWebPubItem" } ,
0x022D : { n : "BrtEndWebPubItem" } ,
0x022E : { n : "BrtBeginSXCondFmt" } ,
0x022F : { n : "BrtEndSXCondFmt" } ,
0x0230 : { n : "BrtBeginSXCondFmts" } ,
0x0231 : { n : "BrtEndSXCondFmts" } ,
0x0232 : { n : "BrtBkHim" } ,
0x0234 : { n : "BrtColor" } ,
0x0235 : { n : "BrtBeginIndexedColors" } ,
0x0236 : { n : "BrtEndIndexedColors" } ,
0x0239 : { n : "BrtBeginMRUColors" } ,
0x023A : { n : "BrtEndMRUColors" } ,
0x023C : { n : "BrtMRUColor" } ,
0x023D : { n : "BrtBeginDVals" } ,
0x023E : { n : "BrtEndDVals" } ,
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" } ,
0x024D : { n : "BrtCellSmartTagProperty" } ,
0x024E : { n : "BrtBeginCellSmartTag" } ,
0x024F : { n : "BrtEndCellSmartTag" } ,
0x0250 : { n : "BrtBeginCellSmartTags" } ,
0x0251 : { n : "BrtEndCellSmartTags" } ,
0x0252 : { n : "BrtBeginSmartTags" } ,
0x0253 : { n : "BrtEndSmartTags" } ,
0x0254 : { n : "BrtSmartTagType" } ,
0x0255 : { n : "BrtBeginSmartTagTypes" } ,
0x0256 : { n : "BrtEndSmartTagTypes" } ,
0x0257 : { n : "BrtBeginSXFilters" } ,
0x0258 : { n : "BrtEndSXFilters" } ,
0x0259 : { n : "BrtBeginSXFILTER" } ,
0x025A : { n : "BrtEndSXFilter" } ,
0x025B : { n : "BrtBeginFills" } ,
0x025C : { n : "BrtEndFills" } ,
0x025D : { n : "BrtBeginCellWatches" } ,
0x025E : { n : "BrtEndCellWatches" } ,
0x025F : { n : "BrtCellWatch" } ,
0x0260 : { n : "BrtBeginCRErrs" } ,
0x0261 : { n : "BrtEndCRErrs" } ,
0x0262 : { n : "BrtCrashRecErr" } ,
0x0263 : { n : "BrtBeginFonts" } ,
0x0264 : { n : "BrtEndFonts" } ,
0x0265 : { n : "BrtBeginBorders" } ,
0x0266 : { n : "BrtEndBorders" } ,
0x0267 : { n : "BrtBeginFmts" } ,
0x0268 : { n : "BrtEndFmts" } ,
0x0269 : { n : "BrtBeginCellXFs" } ,
0x026A : { n : "BrtEndCellXFs" } ,
0x026B : { n : "BrtBeginStyles" } ,
0x026C : { n : "BrtEndStyles" } ,
0x0271 : { n : "BrtBigName" } ,
0x0272 : { n : "BrtBeginCellStyleXFs" } ,
0x0273 : { n : "BrtEndCellStyleXFs" } ,
0x0274 : { n : "BrtBeginComments" } ,
0x0275 : { n : "BrtEndComments" } ,
0x0276 : { n : "BrtBeginCommentAuthors" } ,
0x0277 : { n : "BrtEndCommentAuthors" } ,
2017-02-11 01:58:22 +00:00
0x0278 : { n : "BrtCommentAuthor" , f : parse _BrtCommentAuthor } ,
2017-09-22 22:40:09 +00:00
0x0279 : { n : "BrtBeginCommentList" } ,
0x027A : { n : "BrtEndCommentList" } ,
2017-02-11 01:58:22 +00:00
0x027B : { n : "BrtBeginComment" , f : parse _BrtBeginComment } ,
2017-09-22 22:40:09 +00:00
0x027C : { n : "BrtEndComment" } ,
2017-02-11 01:58:22 +00:00
0x027D : { n : "BrtCommentText" , f : parse _BrtCommentText } ,
2017-09-22 22:40:09 +00:00
0x027E : { n : "BrtBeginOleObjects" } ,
0x027F : { n : "BrtOleObject" } ,
0x0280 : { n : "BrtEndOleObjects" } ,
0x0281 : { n : "BrtBeginSxrules" } ,
0x0282 : { n : "BrtEndSxRules" } ,
0x0283 : { n : "BrtBeginActiveXControls" } ,
0x0284 : { n : "BrtActiveX" } ,
0x0285 : { n : "BrtEndActiveXControls" } ,
0x0286 : { n : "BrtBeginPCDSDTCEMembersSortBy" } ,
0x0288 : { n : "BrtBeginCellIgnoreECs" } ,
0x0289 : { n : "BrtCellIgnoreEC" } ,
0x028A : { n : "BrtEndCellIgnoreECs" } ,
2017-11-20 02:13:37 +00:00
0x028B : { n : "BrtCsProp" , f : parse _BrtCsProp } ,
2017-09-22 22:40:09 +00:00
0x028C : { n : "BrtCsPageSetup" } ,
0x028D : { n : "BrtBeginUserCsViews" } ,
0x028E : { n : "BrtEndUserCsViews" } ,
0x028F : { n : "BrtBeginUserCsView" } ,
0x0290 : { n : "BrtEndUserCsView" } ,
0x0291 : { n : "BrtBeginPcdSFCIEntries" } ,
0x0292 : { n : "BrtEndPCDSFCIEntries" } ,
0x0293 : { n : "BrtPCDSFCIEntry" } ,
0x0294 : { n : "BrtBeginListParts" } ,
0x0295 : { n : "BrtListPart" } ,
0x0296 : { n : "BrtEndListParts" } ,
0x0297 : { n : "BrtSheetCalcProp" } ,
0x0298 : { n : "BrtBeginFnGroup" } ,
0x0299 : { n : "BrtFnGroup" } ,
0x029A : { n : "BrtEndFnGroup" } ,
0x029B : { n : "BrtSupAddin" } ,
0x029C : { n : "BrtSXTDMPOrder" } ,
0x029D : { n : "BrtCsProtection" } ,
0x029F : { n : "BrtBeginWsSortMap" } ,
0x02A0 : { n : "BrtEndWsSortMap" } ,
0x02A1 : { n : "BrtBeginRRSort" } ,
0x02A2 : { n : "BrtEndRRSort" } ,
0x02A3 : { n : "BrtRRSortItem" } ,
0x02A4 : { n : "BrtFileSharingIso" } ,
0x02A5 : { n : "BrtBookProtectionIso" } ,
0x02A6 : { n : "BrtSheetProtectionIso" } ,
0x02A7 : { n : "BrtCsProtectionIso" } ,
0x02A8 : { n : "BrtRangeProtectionIso" } ,
0x0400 : { n : "BrtRwDescent" } ,
0x0401 : { n : "BrtKnownFonts" } ,
0x0402 : { n : "BrtBeginSXTupleSet" } ,
0x0403 : { n : "BrtEndSXTupleSet" } ,
0x0404 : { n : "BrtBeginSXTupleSetHeader" } ,
0x0405 : { n : "BrtEndSXTupleSetHeader" } ,
0x0406 : { n : "BrtSXTupleSetHeaderItem" } ,
0x0407 : { n : "BrtBeginSXTupleSetData" } ,
0x0408 : { n : "BrtEndSXTupleSetData" } ,
0x0409 : { n : "BrtBeginSXTupleSetRow" } ,
0x040A : { n : "BrtEndSXTupleSetRow" } ,
0x040B : { n : "BrtSXTupleSetRowItem" } ,
0x040C : { n : "BrtNameExt" } ,
0x040D : { n : "BrtPCDH14" } ,
0x040E : { n : "BrtBeginPCDCalcMem14" } ,
0x040F : { n : "BrtEndPCDCalcMem14" } ,
0x0410 : { n : "BrtSXTH14" } ,
0x0411 : { n : "BrtBeginSparklineGroup" } ,
0x0412 : { n : "BrtEndSparklineGroup" } ,
0x0413 : { n : "BrtSparkline" } ,
0x0414 : { n : "BrtSXDI14" } ,
0x0415 : { n : "BrtWsFmtInfoEx14" } ,
0x0416 : { n : "BrtBeginConditionalFormatting14" } ,
0x0417 : { n : "BrtEndConditionalFormatting14" } ,
0x0418 : { n : "BrtBeginCFRule14" } ,
0x0419 : { n : "BrtEndCFRule14" } ,
0x041A : { n : "BrtCFVO14" } ,
0x041B : { n : "BrtBeginDatabar14" } ,
0x041C : { n : "BrtBeginIconSet14" } ,
0x041D : { n : "BrtDVal14" } ,
0x041E : { n : "BrtBeginDVals14" } ,
0x041F : { n : "BrtColor14" } ,
0x0420 : { n : "BrtBeginSparklines" } ,
0x0421 : { n : "BrtEndSparklines" } ,
0x0422 : { n : "BrtBeginSparklineGroups" } ,
0x0423 : { n : "BrtEndSparklineGroups" } ,
0x0425 : { n : "BrtSXVD14" } ,
2018-02-14 05:26:28 +00:00
0x0426 : { n : "BrtBeginSXView14" } ,
0x0427 : { n : "BrtEndSXView14" } ,
0x0428 : { n : "BrtBeginSXView16" } ,
0x0429 : { n : "BrtEndSXView16" } ,
2017-09-22 22:40:09 +00:00
0x042A : { n : "BrtBeginPCD14" } ,
0x042B : { n : "BrtEndPCD14" } ,
0x042C : { n : "BrtBeginExtConn14" } ,
0x042D : { n : "BrtEndExtConn14" } ,
0x042E : { n : "BrtBeginSlicerCacheIDs" } ,
0x042F : { n : "BrtEndSlicerCacheIDs" } ,
0x0430 : { n : "BrtBeginSlicerCacheID" } ,
0x0431 : { n : "BrtEndSlicerCacheID" } ,
0x0433 : { n : "BrtBeginSlicerCache" } ,
0x0434 : { n : "BrtEndSlicerCache" } ,
0x0435 : { n : "BrtBeginSlicerCacheDef" } ,
0x0436 : { n : "BrtEndSlicerCacheDef" } ,
0x0437 : { n : "BrtBeginSlicersEx" } ,
0x0438 : { n : "BrtEndSlicersEx" } ,
0x0439 : { n : "BrtBeginSlicerEx" } ,
0x043A : { n : "BrtEndSlicerEx" } ,
0x043B : { n : "BrtBeginSlicer" } ,
0x043C : { n : "BrtEndSlicer" } ,
0x043D : { n : "BrtSlicerCachePivotTables" } ,
0x043E : { n : "BrtBeginSlicerCacheOlapImpl" } ,
0x043F : { n : "BrtEndSlicerCacheOlapImpl" } ,
0x0440 : { n : "BrtBeginSlicerCacheLevelsData" } ,
0x0441 : { n : "BrtEndSlicerCacheLevelsData" } ,
0x0442 : { n : "BrtBeginSlicerCacheLevelData" } ,
0x0443 : { n : "BrtEndSlicerCacheLevelData" } ,
0x0444 : { n : "BrtBeginSlicerCacheSiRanges" } ,
0x0445 : { n : "BrtEndSlicerCacheSiRanges" } ,
0x0446 : { n : "BrtBeginSlicerCacheSiRange" } ,
0x0447 : { n : "BrtEndSlicerCacheSiRange" } ,
0x0448 : { n : "BrtSlicerCacheOlapItem" } ,
0x0449 : { n : "BrtBeginSlicerCacheSelections" } ,
0x044A : { n : "BrtSlicerCacheSelection" } ,
0x044B : { n : "BrtEndSlicerCacheSelections" } ,
0x044C : { n : "BrtBeginSlicerCacheNative" } ,
0x044D : { n : "BrtEndSlicerCacheNative" } ,
0x044E : { n : "BrtSlicerCacheNativeItem" } ,
0x044F : { n : "BrtRangeProtection14" } ,
0x0450 : { n : "BrtRangeProtectionIso14" } ,
0x0451 : { n : "BrtCellIgnoreEC14" } ,
0x0457 : { n : "BrtList14" } ,
0x0458 : { n : "BrtCFIcon" } ,
0x0459 : { n : "BrtBeginSlicerCachesPivotCacheIDs" } ,
0x045A : { n : "BrtEndSlicerCachesPivotCacheIDs" } ,
0x045B : { n : "BrtBeginSlicers" } ,
0x045C : { n : "BrtEndSlicers" } ,
0x045D : { n : "BrtWbProp14" } ,
0x045E : { n : "BrtBeginSXEdit" } ,
0x045F : { n : "BrtEndSXEdit" } ,
0x0460 : { n : "BrtBeginSXEdits" } ,
0x0461 : { n : "BrtEndSXEdits" } ,
0x0462 : { n : "BrtBeginSXChange" } ,
0x0463 : { n : "BrtEndSXChange" } ,
0x0464 : { n : "BrtBeginSXChanges" } ,
0x0465 : { n : "BrtEndSXChanges" } ,
0x0466 : { n : "BrtSXTupleItems" } ,
0x0468 : { n : "BrtBeginSlicerStyle" } ,
0x0469 : { n : "BrtEndSlicerStyle" } ,
0x046A : { n : "BrtSlicerStyleElement" } ,
0x046B : { n : "BrtBeginStyleSheetExt14" } ,
0x046C : { n : "BrtEndStyleSheetExt14" } ,
0x046D : { n : "BrtBeginSlicerCachesPivotCacheID" } ,
0x046E : { n : "BrtEndSlicerCachesPivotCacheID" } ,
0x046F : { n : "BrtBeginConditionalFormattings" } ,
0x0470 : { n : "BrtEndConditionalFormattings" } ,
0x0471 : { n : "BrtBeginPCDCalcMemExt" } ,
0x0472 : { n : "BrtEndPCDCalcMemExt" } ,
0x0473 : { n : "BrtBeginPCDCalcMemsExt" } ,
0x0474 : { n : "BrtEndPCDCalcMemsExt" } ,
0x0475 : { n : "BrtPCDField14" } ,
0x0476 : { n : "BrtBeginSlicerStyles" } ,
0x0477 : { n : "BrtEndSlicerStyles" } ,
0x0478 : { n : "BrtBeginSlicerStyleElements" } ,
0x0479 : { n : "BrtEndSlicerStyleElements" } ,
0x047A : { n : "BrtCFRuleExt" } ,
0x047B : { n : "BrtBeginSXCondFmt14" } ,
0x047C : { n : "BrtEndSXCondFmt14" } ,
0x047D : { n : "BrtBeginSXCondFmts14" } ,
0x047E : { n : "BrtEndSXCondFmts14" } ,
0x0480 : { n : "BrtBeginSortCond14" } ,
0x0481 : { n : "BrtEndSortCond14" } ,
0x0482 : { n : "BrtEndDVals14" } ,
0x0483 : { n : "BrtEndIconSet14" } ,
0x0484 : { n : "BrtEndDatabar14" } ,
0x0485 : { n : "BrtBeginColorScale14" } ,
0x0486 : { n : "BrtEndColorScale14" } ,
0x0487 : { n : "BrtBeginSxrules14" } ,
0x0488 : { n : "BrtEndSxrules14" } ,
0x0489 : { n : "BrtBeginPRule14" } ,
0x048A : { n : "BrtEndPRule14" } ,
0x048B : { n : "BrtBeginPRFilters14" } ,
0x048C : { n : "BrtEndPRFilters14" } ,
0x048D : { n : "BrtBeginPRFilter14" } ,
0x048E : { n : "BrtEndPRFilter14" } ,
0x048F : { n : "BrtBeginPRFItem14" } ,
0x0490 : { n : "BrtEndPRFItem14" } ,
0x0491 : { n : "BrtBeginCellIgnoreECs14" } ,
0x0492 : { n : "BrtEndCellIgnoreECs14" } ,
0x0493 : { n : "BrtDxf14" } ,
0x0494 : { n : "BrtBeginDxF14s" } ,
0x0495 : { n : "BrtEndDxf14s" } ,
0x0499 : { n : "BrtFilter14" } ,
0x049A : { n : "BrtBeginCustomFilters14" } ,
0x049C : { n : "BrtCustomFilter14" } ,
0x049D : { n : "BrtIconFilter14" } ,
0x049E : { n : "BrtPivotCacheConnectionName" } ,
0x0800 : { n : "BrtBeginDecoupledPivotCacheIDs" } ,
0x0801 : { n : "BrtEndDecoupledPivotCacheIDs" } ,
0x0802 : { n : "BrtDecoupledPivotCacheID" } ,
0x0803 : { n : "BrtBeginPivotTableRefs" } ,
0x0804 : { n : "BrtEndPivotTableRefs" } ,
0x0805 : { n : "BrtPivotTableRef" } ,
0x0806 : { n : "BrtSlicerCacheBookPivotTables" } ,
0x0807 : { n : "BrtBeginSxvcells" } ,
0x0808 : { n : "BrtEndSxvcells" } ,
0x0809 : { n : "BrtBeginSxRow" } ,
0x080A : { n : "BrtEndSxRow" } ,
0x080C : { n : "BrtPcdCalcMem15" } ,
0x0813 : { n : "BrtQsi15" } ,
0x0814 : { n : "BrtBeginWebExtensions" } ,
0x0815 : { n : "BrtEndWebExtensions" } ,
0x0816 : { n : "BrtWebExtension" } ,
0x0817 : { n : "BrtAbsPath15" } ,
0x0818 : { n : "BrtBeginPivotTableUISettings" } ,
0x0819 : { n : "BrtEndPivotTableUISettings" } ,
0x081B : { n : "BrtTableSlicerCacheIDs" } ,
0x081C : { n : "BrtTableSlicerCacheID" } ,
0x081D : { n : "BrtBeginTableSlicerCache" } ,
0x081E : { n : "BrtEndTableSlicerCache" } ,
0x081F : { n : "BrtSxFilter15" } ,
0x0820 : { n : "BrtBeginTimelineCachePivotCacheIDs" } ,
0x0821 : { n : "BrtEndTimelineCachePivotCacheIDs" } ,
0x0822 : { n : "BrtTimelineCachePivotCacheID" } ,
0x0823 : { n : "BrtBeginTimelineCacheIDs" } ,
0x0824 : { n : "BrtEndTimelineCacheIDs" } ,
0x0825 : { n : "BrtBeginTimelineCacheID" } ,
0x0826 : { n : "BrtEndTimelineCacheID" } ,
0x0827 : { n : "BrtBeginTimelinesEx" } ,
0x0828 : { n : "BrtEndTimelinesEx" } ,
0x0829 : { n : "BrtBeginTimelineEx" } ,
0x082A : { n : "BrtEndTimelineEx" } ,
0x082B : { n : "BrtWorkBookPr15" } ,
0x082C : { n : "BrtPCDH15" } ,
0x082D : { n : "BrtBeginTimelineStyle" } ,
0x082E : { n : "BrtEndTimelineStyle" } ,
0x082F : { n : "BrtTimelineStyleElement" } ,
0x0830 : { n : "BrtBeginTimelineStylesheetExt15" } ,
0x0831 : { n : "BrtEndTimelineStylesheetExt15" } ,
0x0832 : { n : "BrtBeginTimelineStyles" } ,
0x0833 : { n : "BrtEndTimelineStyles" } ,
0x0834 : { n : "BrtBeginTimelineStyleElements" } ,
0x0835 : { n : "BrtEndTimelineStyleElements" } ,
0x0836 : { n : "BrtDxf15" } ,
0x0837 : { n : "BrtBeginDxfs15" } ,
0x0838 : { n : "brtEndDxfs15" } ,
0x0839 : { n : "BrtSlicerCacheHideItemsWithNoData" } ,
0x083A : { n : "BrtBeginItemUniqueNames" } ,
0x083B : { n : "BrtEndItemUniqueNames" } ,
0x083C : { n : "BrtItemUniqueName" } ,
0x083D : { n : "BrtBeginExtConn15" } ,
0x083E : { n : "BrtEndExtConn15" } ,
0x083F : { n : "BrtBeginOledbPr15" } ,
0x0840 : { n : "BrtEndOledbPr15" } ,
0x0841 : { n : "BrtBeginDataFeedPr15" } ,
0x0842 : { n : "BrtEndDataFeedPr15" } ,
0x0843 : { n : "BrtTextPr15" } ,
0x0844 : { n : "BrtRangePr15" } ,
0x0845 : { n : "BrtDbCommand15" } ,
0x0846 : { n : "BrtBeginDbTables15" } ,
0x0847 : { n : "BrtEndDbTables15" } ,
0x0848 : { n : "BrtDbTable15" } ,
0x0849 : { n : "BrtBeginDataModel" } ,
0x084A : { n : "BrtEndDataModel" } ,
0x084B : { n : "BrtBeginModelTables" } ,
0x084C : { n : "BrtEndModelTables" } ,
0x084D : { n : "BrtModelTable" } ,
0x084E : { n : "BrtBeginModelRelationships" } ,
0x084F : { n : "BrtEndModelRelationships" } ,
0x0850 : { n : "BrtModelRelationship" } ,
0x0851 : { n : "BrtBeginECTxtWiz15" } ,
0x0852 : { n : "BrtEndECTxtWiz15" } ,
0x0853 : { n : "BrtBeginECTWFldInfoLst15" } ,
0x0854 : { n : "BrtEndECTWFldInfoLst15" } ,
0x0855 : { n : "BrtBeginECTWFldInfo15" } ,
0x0856 : { n : "BrtFieldListActiveItem" } ,
0x0857 : { n : "BrtPivotCacheIdVersion" } ,
0x0858 : { n : "BrtSXDI15" } ,
2018-02-14 05:26:28 +00:00
0x0859 : { n : "BrtBeginModelTimeGroupings" } ,
0x085A : { n : "BrtEndModelTimeGroupings" } ,
0x085B : { n : "BrtBeginModelTimeGrouping" } ,
0x085C : { n : "BrtEndModelTimeGrouping" } ,
0x085D : { n : "BrtModelTimeGroupingCalcCol" } ,
2018-03-19 22:14:14 +00:00
0x0C00 : { n : "BrtUid" } ,
2018-02-14 05:26:28 +00:00
0x0C01 : { n : "BrtRevisionPtr" } ,
2017-09-22 22:40:09 +00:00
0xFFFF : { n : "" }
2014-01-28 16:35:26 +00:00
} ;
2017-09-22 22:40:09 +00:00
var XLSBRE = evert _key ( XLSBRecordEnum , 'n' ) ;
2015-04-02 22:14:07 +00:00
/* [MS-XLS] 2.3 Record Enumeration */
var XLSRecordEnum = {
2017-02-11 01:58:22 +00:00
0x0003 : { n : "BIFF2NUM" , f : parse _BIFF2NUM } ,
0x0004 : { n : "BIFF2STR" , f : parse _BIFF2STR } ,
0x0006 : { n : "Formula" , f : parse _Formula } ,
0x0009 : { n : 'BOF' , f : parse _BOF } ,
2017-09-22 22:40:09 +00:00
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 } ,
2017-02-11 01:58:22 +00:00
0x0017 : { n : "ExternSheet" , f : parse _ExternSheet } ,
0x0018 : { n : "Lbl" , f : parse _Lbl } ,
2017-09-22 22:40:09 +00:00
0x0019 : { n : "WinProtect" , f : parsebool } ,
0x001a : { n : "VerticalPageBreaks" } ,
0x001b : { n : "HorizontalPageBreaks" } ,
2017-02-11 01:58:22 +00:00
0x001c : { n : "Note" , f : parse _Note } ,
2017-09-22 22:40:09 +00:00
0x001d : { n : "Selection" } ,
0x0022 : { n : "Date1904" , f : parsebool } ,
2017-02-11 01:58:22 +00:00
0x0023 : { n : "ExternName" , f : parse _ExternName } ,
2017-09-22 22:40:09 +00:00
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 } ,
2017-02-11 01:58:22 +00:00
0x002f : { n : "FilePass" , f : parse _FilePass } ,
0x0031 : { n : "Font" , f : parse _Font } ,
2017-09-22 22:40:09 +00:00
0x0033 : { n : "PrintSize" , f : parseuint16 } ,
0x003c : { n : "Continue" } ,
2017-02-11 01:58:22 +00:00
0x003d : { n : "Window1" , f : parse _Window1 } ,
2017-09-22 22:40:09 +00:00
0x0040 : { n : "Backup" , f : parsebool } ,
0x0041 : { n : "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" } ,
2017-02-11 01:58:22 +00:00
0x005c : { n : 'WriteAccess' , f : parse _WriteAccess } ,
0x005d : { n : "Obj" , f : parse _Obj } ,
2017-09-22 22:40:09 +00:00
0x005e : { n : "Uncalced" } ,
0x005f : { n : "CalcSaveRecalc" , f : parsebool } ,
0x0060 : { n : "Template" } ,
0x0061 : { n : "Intl" } ,
0x0063 : { n : "ObjProtect" , f : parsebool } ,
2017-02-11 01:58:22 +00:00
0x007d : { n : "ColInfo" , f : parse _ColInfo } ,
0x0080 : { n : "Guts" , f : parse _Guts } ,
2017-11-20 02:13:37 +00:00
0x0081 : { n : "WsBool" , f : parse _WsBool } ,
2017-09-22 22:40:09 +00:00
0x0082 : { n : "GridSet" , f : parseuint16 } ,
0x0083 : { n : "HCenter" , f : parsebool } ,
0x0084 : { n : "VCenter" , f : parsebool } ,
2017-02-11 01:58:22 +00:00
0x0085 : { n : 'BoundSheet8' , f : parse _BoundSheet8 } ,
2017-09-22 22:40:09 +00:00
0x0086 : { n : "WriteProtect" } ,
2017-02-11 01:58:22 +00:00
0x008c : { n : "Country" , f : parse _Country } ,
2017-09-22 22:40:09 +00:00
0x008d : { n : "HideObj" , f : parseuint16 } ,
0x0090 : { n : "Sort" } ,
2017-02-11 01:58:22 +00:00
0x0092 : { n : "Palette" , f : parse _Palette } ,
2017-09-22 22:40:09 +00:00
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" } ,
2017-02-11 01:58:22 +00:00
0x00a0 : { n : "Scl" , f : parse _Scl } ,
0x00a1 : { n : "Setup" , f : parse _Setup } ,
2017-09-22 22:40:09 +00:00
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" } ,
2017-02-11 01:58:22 +00:00
0x00bd : { n : "MulRk" , f : parse _MulRk } ,
0x00be : { n : "MulBlank" , f : parse _MulBlank } ,
2017-09-22 22:40:09 +00:00
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" } ,
2017-02-11 01:58:22 +00:00
0x00e0 : { n : "XF" , f : parse _XF } ,
0x00e1 : { n : 'InterfaceHdr' , f : parse _InterfaceHdr } ,
2017-09-22 22:40:09 +00:00
0x00e2 : { n : 'InterfaceEnd' , f : parsenoop2 } ,
0x00e3 : { n : "SXVS" } ,
2017-02-11 01:58:22 +00:00
0x00e5 : { n : "MergeCells" , f : parse _MergeCells } ,
2017-09-22 22:40:09 +00:00
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" } ,
2017-02-11 01:58:22 +00:00
0x00fc : { n : "SST" , f : parse _SST } ,
0x00fd : { n : "LabelSst" , f : parse _LabelSst } ,
0x00ff : { n : "ExtSST" , f : parse _ExtSST } ,
2017-09-22 22:40:09 +00:00
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" } ,
2017-02-11 01:58:22 +00:00
0x01ae : { n : "SupBook" , f : parse _SupBook } ,
2017-09-22 22:40:09 +00:00
0x01af : { n : "Prot4Rev" , f : parsebool } ,
0x01b0 : { n : "CondFmt" } ,
0x01b1 : { n : "CF" } ,
0x01b2 : { n : "DVal" } ,
0x01b5 : { n : "DConBin" } ,
2017-02-11 01:58:22 +00:00
0x01b6 : { n : "TxO" , f : parse _TxO } ,
2017-09-22 22:40:09 +00:00
0x01b7 : { n : "RefreshAll" , f : parsebool } ,
2017-02-11 01:58:22 +00:00
0x01b8 : { n : "HLink" , f : parse _HLink } ,
2017-09-22 22:40:09 +00:00
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 } ,
2017-02-11 01:58:22 +00:00
0x01c1 : { n : "RecalcId" , f : parse _RecalcId , r : 2 } ,
2017-09-22 22:40:09 +00:00
0x01c2 : { n : "EntExU2" , f : parsenoop2 } ,
2017-02-11 01:58:22 +00:00
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 } ,
2017-02-19 21:11:48 +00:00
0x0206 : { n : "Formula" , f : parse _Formula } ,
2017-02-11 01:58:22 +00:00
0x0207 : { n : "String" , f : parse _String } ,
0x0208 : { n : 'Row' , f : parse _Row } ,
2017-09-22 22:40:09 +00:00
0x020b : { n : "Index" } ,
2017-02-11 01:58:22 +00:00
0x0221 : { n : "Array" , f : parse _Array } ,
0x0225 : { n : "DefaultRowHeight" , f : parse _DefaultRowHeight } ,
2017-09-22 22:40:09 +00:00
0x0236 : { n : "Table" } ,
2017-12-30 05:41:41 +00:00
0x023e : { n : "Window2" , f : parse _Window2 } ,
2017-02-11 01:58:22 +00:00
0x027e : { n : "RK" , f : parse _RK } ,
2017-11-20 02:13:37 +00:00
0x0293 : { n : "Style" } ,
2017-02-19 21:11:48 +00:00
0x0406 : { n : "Formula" , f : parse _Formula } ,
2017-09-22 22:40:09 +00:00
0x0418 : { n : "BigName" } ,
2017-02-11 01:58:22 +00:00
0x041e : { n : "Format" , f : parse _Format } ,
2017-09-22 22:40:09 +00:00
0x043c : { n : "ContinueBigName" } ,
2017-02-11 01:58:22 +00:00
0x04bc : { n : "ShrFmla" , f : parse _ShrFmla } ,
0x0800 : { n : "HLinkTooltip" , f : parse _HLinkTooltip } ,
2017-09-22 22:40:09 +00:00
0x0801 : { n : "WebPub" } ,
0x0802 : { n : "QsiSXTag" } ,
0x0803 : { n : "DBQueryExt" } ,
0x0804 : { n : "ExtString" } ,
0x0805 : { n : "TxtQry" } ,
0x0806 : { n : "Qsir" } ,
0x0807 : { n : "Qsif" } ,
0x0808 : { n : "RRDTQSIF" } ,
2017-02-11 01:58:22 +00:00
0x0809 : { n : 'BOF' , f : parse _BOF } ,
2017-09-22 22:40:09 +00:00
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" } ,
2017-02-11 01:58:22 +00:00
0x087c : { n : "XFCRC" , f : parse _XFCRC , r : 12 } ,
0x087d : { n : "XFExt" , f : parse _XFExt , r : 12 } ,
2017-09-22 22:40:09 +00:00
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" } ,
2017-11-20 02:13:37 +00:00
0x0892 : { n : "StyleExt" } ,
2017-09-22 22:40:09 +00:00
0x0893 : { n : "NamePublish" } ,
2017-04-16 07:35:56 +00:00
0x0894 : { n : "NameCmt" , f : parse _NameCmt , r : 12 } ,
2017-09-22 22:40:09 +00:00
0x0895 : { n : "SortData" } ,
2017-02-11 01:58:22 +00:00
0x0896 : { n : "Theme" , f : parse _Theme , r : 12 } ,
2017-09-22 22:40:09 +00:00
0x0897 : { n : "GUIDTypeLib" } ,
0x0898 : { n : "FnGrp12" } ,
0x0899 : { n : "NameFnGrp12" } ,
2017-02-11 01:58:22 +00:00
0x089a : { n : "MTRSettings" , f : parse _MTRSettings , r : 12 } ,
2017-09-22 22:40:09 +00:00
0x089b : { n : "CompressPictures" , f : parsenoop2 } ,
0x089c : { n : "HeaderFooter" } ,
0x089d : { n : "CrtLayout12" } ,
0x089e : { n : "CrtMlFrt" } ,
0x089f : { n : "CrtMlFrtContinue" } ,
2017-02-11 01:58:22 +00:00
0x08a3 : { n : "ForceFullCalculation" , f : parse _ForceFullCalculation } ,
2017-09-22 22:40:09 +00:00
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" } ,
2017-02-11 01:58:22 +00:00
0x1044 : { n : "ShtProps" , f : parse _ShtProps } ,
2017-09-22 22:40:09 +00:00
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" } ,
2017-02-11 01:58:22 +00:00
0x105c : { n : "ClrtClient" , f : parse _ClrtClient } ,
2017-09-22 22:40:09 +00:00
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" } ,
2017-02-19 21:11:48 +00:00
0x0000 : { n : "Dimensions" , f : parse _Dimensions } ,
2017-02-11 01:58:22 +00:00
0x0002 : { n : "BIFF2INT" , f : parse _BIFF2INT } ,
0x0005 : { n : "BoolErr" , f : parse _BoolErr } ,
0x0007 : { n : "String" , f : parse _BIFF2STRING } ,
2017-09-22 22:40:09 +00:00
0x0008 : { n : "BIFF2ROW" } ,
0x000b : { n : "Index" } ,
0x0016 : { n : "ExternCount" , f : parseuint16 } ,
2017-02-11 01:58:22 +00:00
0x001e : { n : "BIFF2FORMAT" , f : parse _BIFF2Format } ,
2017-09-22 22:40:09 +00:00
0x001f : { n : "BIFF2FMTCNT" } , /* 16-bit cnt of BIFF2FORMAT records */
0x0020 : { n : "BIFF2COLINFO" } ,
2017-02-19 21:11:48 +00:00
0x0021 : { n : "Array" , f : parse _Array } ,
2017-02-11 01:58:22 +00:00
0x0025 : { n : "DefaultRowHeight" , f : parse _DefaultRowHeight } ,
0x0032 : { n : "BIFF2FONTXTRA" , f : parse _BIFF2FONTXTRA } ,
2017-09-22 22:40:09 +00:00
0x0034 : { n : "DDEObjName" } ,
0x003e : { n : "BIFF2WINDOW2" } ,
0x0043 : { n : "BIFF2XF" } ,
0x0045 : { n : "BIFF2FONTCLR" } ,
0x0056 : { n : "BIFF4FMTCNT" } , /* 16-bit cnt, similar to BIFF2 */
0x007e : { n : "RK" } , /* Not necessarily same as 0x027e */
2017-05-09 18:11:15 +00:00
0x007f : { n : "ImData" , f : parse _ImData } ,
2017-09-22 22:40:09 +00:00
0x0087 : { n : "Addin" } ,
0x0088 : { n : "Edg" } ,
0x0089 : { n : "Pub" } ,
0x0091 : { n : "Sub" } ,
0x0094 : { n : "LHRecord" } ,
0x0095 : { n : "LHNGraph" } ,
0x0096 : { n : "Sound" } ,
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" } ,
2017-02-19 21:11:48 +00:00
0x00d6 : { n : "RString" , f : parse _RString } ,
2017-09-22 22:40:09 +00:00
0x00df : { n : "UDDesc" } ,
0x00ea : { n : "TabIdConf" } ,
0x0162 : { n : "XL5Modify" } ,
0x01a5 : { n : "FileSharing2" } ,
2017-02-11 01:58:22 +00:00
0x0209 : { n : 'BOF' , f : parse _BOF } ,
0x0218 : { n : "Lbl" , f : parse _Lbl } ,
0x0223 : { n : "ExternName" , f : parse _ExternName } ,
2017-09-22 22:40:09 +00:00
0x0231 : { n : "Font" } ,
0x0243 : { n : "BIFF3XF" } ,
2017-02-11 01:58:22 +00:00
0x0409 : { n : 'BOF' , f : parse _BOF } ,
2017-09-22 22:40:09 +00:00
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-11 01:58:22 +00:00
0x7262 : { }
2015-04-02 22:14:07 +00:00
} ;
2017-09-22 22:40:09 +00:00
var XLSRE = evert _key ( XLSRecordEnum , 'n' ) ;
function write _biff _rec ( ba , type , payload , length ) {
var t = + type || + XLSRE [ type ] ;
if ( isNaN ( t ) ) return ;
var len = length || ( payload || [ ] ) . length || 0 ;
2017-12-30 05:41:41 +00:00
var o = ba . next ( 4 ) ;
2017-02-11 01:58:22 +00:00
o . write _shift ( 2 , t ) ;
o . write _shift ( 2 , len ) ;
if ( len > 0 && is _buf ( payload ) ) ba . push ( payload ) ;
}
function write _BIFF2Cell ( out , r , c ) {
if ( ! out ) out = new _buf ( 7 ) ;
out . write _shift ( 2 , r ) ;
out . write _shift ( 2 , c ) ;
2017-12-30 05:41:41 +00:00
out . write _shift ( 2 , 0 ) ;
2017-02-11 01:58:22 +00:00
out . write _shift ( 1 , 0 ) ;
return out ;
}
function write _BIFF2BERR ( r , c , val , t ) {
var out = new _buf ( 9 ) ;
write _BIFF2Cell ( out , r , c ) ;
if ( t == 'e' ) { out . write _shift ( 1 , val ) ; out . write _shift ( 1 , 1 ) ; }
else { out . write _shift ( 1 , val ? 1 : 0 ) ; out . write _shift ( 1 , 0 ) ; }
return out ;
}
/* TODO: codepage, large strings */
function write _BIFF2LABEL ( r , c , val ) {
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:09:53 +00:00
function write _ws _biff2 _cell ( ba , cell , R , C ) {
2017-03-20 21:57:44 +00:00
if ( cell . v != null ) switch ( cell . t ) {
2017-04-03 06:04:35 +00:00
case 'd' : case 'n' :
2017-10-17 00:36:51 +00:00
var v = cell . t == 'd' ? datenum ( parseDate ( cell . v ) ) : cell . v ;
2017-04-03 06:04:35 +00:00
if ( ( v == ( v | 0 ) ) && ( v >= 0 ) && ( v < 65536 ) )
write _biff _rec ( ba , 0x0002 , write _BIFF2INT ( R , C , v ) ) ;
2017-02-11 01:58:22 +00:00
else
2017-09-22 22:40:09 +00:00
write _biff _rec ( ba , 0x0003 , write _BIFF2NUM ( R , C , v ) ) ;
2017-03-20 21:57:44 +00:00
return ;
case 'b' : case 'e' : write _biff _rec ( ba , 0x0005 , write _BIFF2BERR ( R , C , cell . v , cell . t ) ) ; return ;
2017-02-11 01:58:22 +00:00
/* TODO: codepage, sst */
case 's' : case 'str' :
write _biff _rec ( ba , 0x0004 , write _BIFF2LABEL ( R , C , cell . v ) ) ;
2017-03-20 21:57:44 +00:00
return ;
2017-02-11 01:58:22 +00:00
}
2017-03-20 21:57:44 +00:00
write _biff _rec ( ba , 0x0001 , write _BIFF2Cell ( null , R , C ) ) ;
2017-02-11 01:58:22 +00:00
}
2018-01-23 09:09:53 +00:00
function write _ws _biff2 ( ba , ws , idx , opts ) {
2017-04-09 04:07:43 +00:00
var dense = Array . isArray ( ws ) ;
2017-02-11 01:58:22 +00:00
var range = safe _decode _range ( ws [ '!ref' ] || "A1" ) , ref , rr = "" , cols = [ ] ;
2018-04-27 20:12:36 +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-11 01:58:22 +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:56:23 +00:00
var cell = dense ? ( ws [ R ] || [ ] ) [ C ] : ws [ ref ] ;
2017-04-09 04:07:43 +00:00
if ( ! cell ) continue ;
2017-02-11 01:58:22 +00:00
/* write cell */
2017-09-22 22:40:09 +00:00
write _ws _biff2 _cell ( ba , cell , R , C , opts ) ;
2017-02-11 01:58:22 +00:00
}
}
}
/* Based on test files */
2017-09-22 22:40:09 +00:00
function write _biff2 _buf ( wb , opts ) {
2017-04-09 04:07:43 +00:00
var o = opts || { } ;
if ( DENSE != null && o . dense == null ) o . dense = DENSE ;
2017-02-11 01:58:22 +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 ) ;
2017-09-22 22:40:09 +00:00
write _biff _rec ( ba , 0x0009 , write _BOF ( wb , 0x10 , o ) ) ;
2017-02-11 01:58:22 +00:00
/* ... */
2017-09-22 22:40:09 +00:00
write _ws _biff2 ( ba , wb . Sheets [ wb . SheetNames [ idx ] ] , idx , o , wb ) ;
2017-02-11 01:58:22 +00:00
/* ... */
2017-09-22 22:40:09 +00:00
write _biff _rec ( ba , 0x000A ) ;
2017-02-11 01:58:22 +00:00
return ba . end ( ) ;
}
2017-09-22 22:40:09 +00:00
2018-02-14 05:26:28 +00:00
function write _FONTS _biff8 ( ba , data , opts ) {
write _biff _rec ( ba , "Font" , write _Font ( {
sz : 12 ,
color : { theme : 1 } ,
name : "Arial" ,
family : 2 ,
scheme : "minor"
} , opts ) ) ;
}
function write _FMTS _biff8 ( ba , NF , opts ) {
2018-02-08 19:13:10 +00:00
if ( ! NF ) return ;
[ [ 5 , 8 ] , [ 23 , 26 ] , [ 41 , 44 ] , [ /*63*/ 50 , /*66],[164,*/ 392 ] ] . forEach ( function ( r ) {
2018-02-14 05:26:28 +00:00
for ( var i = r [ 0 ] ; i <= r [ 1 ] ; ++ i ) if ( NF [ i ] != null ) write _biff _rec ( ba , "Format" , write _Format ( i , NF [ i ] , opts ) ) ;
2018-02-08 19:13:10 +00:00
} ) ;
}
2018-02-14 05:26:28 +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 ) ;
write _biff _rec ( ba , "FeatHdr" , o ) ;
/* [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:42:56 +00:00
write _Ref8U ( safe _decode _range ( ws [ '!ref' ] || "A1" ) , o ) ;
2018-02-14 05:26:28 +00:00
o . write _shift ( 4 , 4 ) ;
write _biff _rec ( ba , "Feat" , o ) ;
}
function write _CELLXFS _biff8 ( ba , opts ) {
for ( var i = 0 ; i < 16 ; ++ i ) write _biff _rec ( ba , "XF" , write _XF ( { numFmtId : 0 , style : true } , 0 , opts ) ) ;
opts . cellXfs . forEach ( function ( c ) {
write _biff _rec ( ba , "XF" , write _XF ( c , 0 , opts ) ) ;
2018-02-08 19:13:10 +00:00
} ) ;
}
2017-12-15 02:01:07 +00:00
function write _ws _biff8 _hlinks ( ba , ws ) {
for ( var R = 0 ; R < ws [ '!links' ] . length ; ++ R ) {
var HL = ws [ '!links' ] [ R ] ;
write _biff _rec ( ba , "HLink" , write _HLink ( HL ) ) ;
if ( HL [ 1 ] . Tooltip ) write _biff _rec ( ba , "HLinkTooltip" , write _HLinkTooltip ( HL ) ) ;
}
delete ws [ '!links' ] ;
}
2017-09-22 22:40:09 +00:00
function write _ws _biff8 _cell ( ba , cell , R , C , opts ) {
2018-02-14 05:26:28 +00:00
var os = 16 + get _cell _style ( opts . cellXfs , cell , opts ) ;
2017-09-22 22:40:09 +00:00
if ( cell . v != null ) switch ( cell . t ) {
case 'd' : case 'n' :
2017-10-17 00:36:51 +00:00
var v = cell . t == 'd' ? datenum ( parseDate ( cell . v ) ) : cell . v ;
2017-09-22 22:40:09 +00:00
/* TODO: emit RK as appropriate */
2018-02-08 19:13:10 +00:00
write _biff _rec ( ba , "Number" , write _Number ( R , C , v , os , opts ) ) ;
2017-09-22 22:40:09 +00:00
return ;
2018-02-14 05:26:28 +00:00
case 'b' : case 'e' : write _biff _rec ( ba , 0x0205 , write _BoolErr ( R , C , cell . v , os , opts , cell . t ) ) ; return ;
2017-09-22 22:40:09 +00:00
/* TODO: codepage, sst */
case 's' : case 'str' :
2018-02-08 19:13:10 +00:00
write _biff _rec ( ba , "Label" , write _Label ( R , C , cell . v , os , opts ) ) ;
2017-09-22 22:40:09 +00:00
return ;
}
2018-02-08 19:13:10 +00:00
write _biff _rec ( ba , "Blank" , write _XLSCell ( R , C , os ) ) ;
2017-09-22 22:40:09 +00:00
}
/* [MS-XLS] 2.1.7.20.5 */
function write _ws _biff8 ( idx , opts , wb ) {
var ba = buf _array ( ) ;
var s = wb . SheetNames [ idx ] , ws = wb . Sheets [ s ] || { } ;
2017-12-30 05:41:41 +00:00
var _WB = ( ( wb || { } ) . Workbook || { } ) ;
var _sheet = ( ( _WB . Sheets || [ ] ) [ idx ] || { } ) ;
2017-09-22 22:40:09 +00:00
var dense = Array . isArray ( ws ) ;
2018-04-27 20:12:36 +00:00
var b8 = opts . biff == 8 ;
2017-09-22 22:40:09 +00:00
var ref , rr = "" , cols = [ ] ;
var range = safe _decode _range ( ws [ '!ref' ] || "A1" ) ;
2018-04-27 20:12:36 +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:40:09 +00:00
write _biff _rec ( ba , 0x0809 , write _BOF ( wb , 0x10 , opts ) ) ;
/* ... */
write _biff _rec ( ba , "CalcMode" , writeuint16 ( 1 ) ) ;
write _biff _rec ( ba , "CalcCount" , writeuint16 ( 100 ) ) ;
write _biff _rec ( ba , "CalcRefMode" , writebool ( true ) ) ;
write _biff _rec ( ba , "CalcIter" , writebool ( false ) ) ;
write _biff _rec ( ba , "CalcDelta" , write _Xnum ( 0.001 ) ) ;
write _biff _rec ( ba , "CalcSaveRecalc" , writebool ( true ) ) ;
write _biff _rec ( ba , "PrintRowCol" , writebool ( false ) ) ;
write _biff _rec ( ba , "PrintGrid" , writebool ( false ) ) ;
write _biff _rec ( ba , "GridSet" , writeuint16 ( 1 ) ) ;
write _biff _rec ( ba , "Guts" , write _Guts ( [ 0 , 0 ] ) ) ;
/* ... */
write _biff _rec ( ba , "HCenter" , writebool ( false ) ) ;
write _biff _rec ( ba , "VCenter" , writebool ( false ) ) ;
/* ... */
write _biff _rec ( ba , "Dimensions" , write _Dimensions ( range , opts ) ) ;
/* ... */
2017-12-15 02:01:07 +00:00
if ( b8 ) ws [ '!links' ] = [ ] ;
2017-09-22 22:40:09 +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 02:01:07 +00:00
if ( b8 && cell . l ) ws [ '!links' ] . push ( [ ref , cell . l ] ) ;
2017-09-22 22:40:09 +00:00
}
}
2017-11-20 02:13:37 +00:00
var cname = _sheet . CodeName || _sheet . name || s ;
2017-12-15 02:01:07 +00:00
/* ... */
2017-12-30 05:41:41 +00:00
if ( b8 && _WB . Views ) write _biff _rec ( ba , "Window2" , write _Window2 ( _WB . Views [ 0 ] ) ) ;
/* ... */
2018-02-14 05:26:28 +00:00
if ( b8 && ( ws [ '!merges' ] || [ ] ) . length ) write _biff _rec ( ba , "MergeCells" , write _MergeCells ( ws [ '!merges' ] ) ) ;
2017-12-30 05:41:41 +00:00
/* ... */
2017-12-15 02:01:07 +00:00
if ( b8 ) write _ws _biff8 _hlinks ( ba , ws ) ;
/* ... */
2017-10-27 19:55:07 +00:00
write _biff _rec ( ba , "CodeName" , write _XLUnicodeString ( cname , opts ) ) ;
2017-09-22 22:40:09 +00:00
/* ... */
2018-02-14 05:26:28 +00:00
if ( b8 ) write _FEAT ( ba , ws ) ;
/* ... */
2017-09-22 22:40:09 +00:00
write _biff _rec ( ba , "EOF" ) ;
return ba . end ( ) ;
}
/* [MS-XLS] 2.1.7.20.3 */
function write _biff8 _global ( wb , bufs , opts ) {
var A = buf _array ( ) ;
2018-02-14 05:26:28 +00:00
var _WB = ( ( wb || { } ) . Workbook || { } ) ;
var _sheets = ( _WB . Sheets || [ ] ) ;
var _wb = _WB . WBProps || { } ;
2017-09-22 22:40:09 +00:00
var b8 = opts . biff == 8 , b5 = opts . biff == 5 ;
write _biff _rec ( A , 0x0809 , write _BOF ( wb , 0x05 , opts ) ) ;
2017-12-30 05:41:41 +00:00
if ( opts . bookType == "xla" ) write _biff _rec ( A , "Addin" ) ;
2017-10-17 00:36:51 +00:00
write _biff _rec ( A , "InterfaceHdr" , b8 ? writeuint16 ( 0x04b0 ) : null ) ;
2017-09-22 22:40:09 +00:00
write _biff _rec ( A , "Mms" , writezeroes ( 2 ) ) ;
if ( b5 ) write _biff _rec ( A , "ToolbarHdr" ) ;
if ( b5 ) write _biff _rec ( A , "ToolbarEnd" ) ;
write _biff _rec ( A , "InterfaceEnd" ) ;
write _biff _rec ( A , "WriteAccess" , write _WriteAccess ( "SheetJS" , opts ) ) ;
2017-10-17 00:36:51 +00:00
write _biff _rec ( A , "CodePage" , writeuint16 ( b8 ? 0x04b0 : 0x04E4 ) ) ;
2017-09-22 22:40:09 +00:00
if ( b8 ) write _biff _rec ( A , "DSF" , writeuint16 ( 0 ) ) ;
2018-02-14 05:26:28 +00:00
if ( b8 ) write _biff _rec ( A , "Excel9File" ) ;
2017-10-17 00:36:51 +00:00
write _biff _rec ( A , "RRTabId" , write _RRTabId ( wb . SheetNames . length ) ) ;
2017-10-27 19:55:07 +00:00
if ( b8 && wb . vbaraw ) {
write _biff _rec ( A , "ObProj" ) ;
2017-11-20 02:13:37 +00:00
var cname = _wb . CodeName || "ThisWorkbook" ;
2017-10-27 19:55:07 +00:00
write _biff _rec ( A , "CodeName" , write _XLUnicodeString ( cname , opts ) ) ;
}
2017-10-17 00:36:51 +00:00
write _biff _rec ( A , "BuiltInFnGroupCount" , writeuint16 ( 0x11 ) ) ;
2017-09-22 22:40:09 +00:00
write _biff _rec ( A , "WinProtect" , writebool ( false ) ) ;
write _biff _rec ( A , "Protect" , writebool ( false ) ) ;
write _biff _rec ( A , "Password" , writeuint16 ( 0 ) ) ;
if ( b8 ) write _biff _rec ( A , "Prot4Rev" , writebool ( false ) ) ;
if ( b8 ) write _biff _rec ( A , "Prot4RevPass" , writeuint16 ( 0 ) ) ;
write _biff _rec ( A , "Window1" , write _Window1 ( opts ) ) ;
write _biff _rec ( A , "Backup" , writebool ( false ) ) ;
write _biff _rec ( A , "HideObj" , writeuint16 ( 0 ) ) ;
write _biff _rec ( A , "Date1904" , writebool ( safe1904 ( wb ) == "true" ) ) ;
write _biff _rec ( A , "CalcPrecision" , writebool ( true ) ) ;
2017-10-17 00:36:51 +00:00
if ( b8 ) write _biff _rec ( A , "RefreshAll" , writebool ( false ) ) ;
2017-09-22 22:40:09 +00:00
write _biff _rec ( A , "BookBool" , writeuint16 ( 0 ) ) ;
/* ... */
2018-02-14 05:26:28 +00:00
write _FONTS _biff8 ( A , wb , opts ) ;
write _FMTS _biff8 ( A , wb . SSF , opts ) ;
write _CELLXFS _biff8 ( A , opts ) ;
2018-02-08 19:13:10 +00:00
/* ... */
2017-10-17 00:36:51 +00:00
if ( b8 ) write _biff _rec ( A , "UsesELFs" , writebool ( false ) ) ;
2017-09-22 22:40:09 +00:00
var a = A . end ( ) ;
var C = buf _array ( ) ;
2017-10-17 00:36:51 +00:00
if ( b8 ) write _biff _rec ( C , "Country" , write _Country ( ) ) ;
2017-09-22 22:40:09 +00:00
/* BIFF8: [SST *Continue] ExtSST */
write _biff _rec ( C , "EOF" ) ;
var c = C . end ( ) ;
var B = buf _array ( ) ;
var blen = 0 , j = 0 ;
2017-10-17 00:36:51 +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:40:09 +00:00
var start = a . length + blen + c . length ;
for ( j = 0 ; j < wb . SheetNames . length ; ++ j ) {
2018-02-14 05:26:28 +00:00
var _sheet = _sheets [ j ] || ( { } ) ;
write _biff _rec ( B , "BoundSheet8" , write _BoundSheet8 ( { pos : start , hs : _sheet . Hidden || 0 , dt : 0 , name : wb . SheetNames [ j ] } , opts ) ) ;
2017-09-22 22:40:09 +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 ) ;
return _ _toBuffer ( [ out ] ) ;
}
/* [MS-XLS] 2.1.7.20 Workbook Stream */
function write _biff8 _buf ( wb , opts ) {
var o = opts || { } ;
var bufs = [ ] ;
2018-02-08 19:13:10 +00:00
if ( wb && ! wb . SSF ) {
wb . SSF = SSF . get _table ( ) ;
}
if ( wb && wb . SSF ) {
make _ssf ( SSF ) ; SSF . load _table ( wb . SSF ) ;
// $FlowIgnore
o . revssf = evert _num ( wb . SSF ) ; o . revssf [ wb . SSF [ 65535 ] ] = 0 ;
o . ssf = wb . SSF ;
}
o . cellXfs = [ ] ;
o . Strings = [ ] ; o . Strings . Count = 0 ; o . Strings . Unique = 0 ;
get _cell _style ( o . cellXfs , { } , { revssf : { "General" : 0 } } ) ;
2017-09-22 22:40:09 +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 ) ) ;
return _ _toBuffer ( [ bufs ] ) ;
}
function write _biff _buf ( wb , opts ) {
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:27:55 +00:00
/* note: browser DOM element cannot see mso- style attrs, must parse */
2017-04-16 07:35:56 +00:00
var HTML _ = ( function ( ) {
function html _to _sheet ( str , _opts ) {
var opts = _opts || { } ;
if ( DENSE != null && opts . dense == null ) opts . dense = DENSE ;
var ws = opts . dense ? ( [ ] ) : ( { } ) ;
2017-07-28 23:54:51 +00:00
var mtch = str . match ( /<table/i ) ;
if ( ! mtch ) throw new Error ( "Invalid HTML: could not find <table>" ) ;
var mtch2 = str . match ( /<\/table/i ) ;
var i = mtch . index , j = mtch2 && mtch2 . index || str . length ;
2017-08-10 23:55:45 +00:00
var rows = split _regex ( str . slice ( i , j ) , /(:?<tr[^>]*>)/i , "<tr>" ) ;
2017-04-16 07:35:56 +00:00
var R = - 1 , C = 0 , RS = 0 , CS = 0 ;
var range = { s : { r : 10000000 , c : 10000000 } , e : { r : 0 , c : 0 } } ;
2018-01-23 09:09:53 +00:00
var merges = [ ] ;
2017-04-16 07:35:56 +00:00
for ( i = 0 ; i < rows . length ; ++ i ) {
var row = rows [ i ] . trim ( ) ;
2018-01-23 09:09:53 +00:00
var hd = row . slice ( 0 , 3 ) . toLowerCase ( ) ;
2018-04-06 06:36:52 +00:00
if ( hd == "<tr" ) { ++ R ; if ( opts . sheetRows && opts . sheetRows <= R ) { -- R ; break ; } C = 0 ; continue ; }
2018-05-05 06:42:56 +00:00
if ( hd != "<td" && hd != "<th" ) continue ;
var cells = row . split ( /<\/t[dh]>/i ) ;
2017-04-16 07:35:56 +00:00
for ( j = 0 ; j < cells . length ; ++ j ) {
var cell = cells [ j ] . trim ( ) ;
2018-05-05 06:42:56 +00:00
if ( ! cell . match ( /<t[dh]/i ) ) continue ;
2017-04-16 07:35:56 +00:00
var m = cell , cc = 0 ;
/* TODO: parse styles etc */
while ( m . charAt ( 0 ) == "<" && ( cc = m . indexOf ( ">" ) ) > - 1 ) m = m . slice ( cc + 1 ) ;
var tag = parsexmltag ( cell . slice ( 0 , cell . indexOf ( ">" ) ) ) ;
CS = tag . colspan ? + tag . colspan : 1 ;
2018-06-22 21:40:52 +00:00
if ( ( RS = + tag . rowspan ) > 1 || CS > 1 ) merges . push ( { s : { r : R , c : C } , e : { r : R + ( RS || 1 ) - 1 , c : C + CS - 1 } } ) ;
2017-12-15 02:01:07 +00:00
var _t = tag . t || "" ;
2017-04-16 07:35:56 +00:00
/* TODO: generate stub cells */
if ( ! m . length ) { C += CS ; continue ; }
2018-07-25 06:43:29 +00:00
m = htmldecode ( m ) ;
2017-12-15 02:01:07 +00:00
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 ) continue ;
var o = { 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 ) } ) ;
if ( ! opts . cellDates ) o = ( { t : 'n' , v : datenum ( o . v ) } ) ;
o . z = opts . dateNF || SSF . _table [ 14 ] ;
2017-04-16 07:35:56 +00:00
}
2017-12-15 02:01:07 +00:00
if ( opts . dense ) { if ( ! ws [ R ] ) ws [ R ] = [ ] ; ws [ R ] [ C ] = o ; }
else ws [ encode _cell ( { r : R , c : C } ) ] = o ;
2017-04-16 07:35:56 +00:00
C += CS ;
2017-04-09 04:07:43 +00:00
}
2017-03-09 05:49:24 +00:00
}
2017-04-16 07:35:56 +00:00
ws [ '!ref' ] = encode _range ( range ) ;
return ws ;
2017-03-09 05:49:24 +00:00
}
2017-04-16 07:35:56 +00:00
function html _to _book ( str , opts ) {
return sheet _to _workbook ( html _to _sheet ( str , opts ) , opts ) ;
}
function make _html _row ( ws , r , R , o ) {
var M = ( ws [ '!merges' ] || [ ] ) ;
var oo = [ ] ;
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 ] ;
var sp = { } ;
if ( RS > 1 ) sp . rowspan = RS ;
if ( CS > 1 ) sp . colspan = CS ;
2018-08-26 00:09:59 +00:00
/* TODO: html entities */
var w = ( cell && cell . v != null ) && ( cell . h || escapehtml ( cell . w || ( format _cell ( cell ) , cell . w ) || "" ) ) || "" ;
sp . t = cell && cell . t || 'z' ;
2017-11-20 02:13:37 +00:00
if ( o . editable ) w = '<span contenteditable="true">' + w + '</span>' ;
2017-06-10 01:56:23 +00:00
sp . id = "sjs-" + coord ;
2017-04-16 07:35:56 +00:00
oo . push ( writextag ( 'td' , w , sp ) ) ;
}
2017-06-10 01:56:23 +00:00
var preamble = "<tr>" ;
return preamble + oo . join ( "" ) + "</tr>" ;
2017-04-16 07:35:56 +00:00
}
2018-02-03 20:43:07 +00:00
function make _html _preamble ( ws , R , o ) {
2017-05-17 04:27:55 +00:00
var out = [ ] ;
2018-02-03 20:43:07 +00:00
return out . join ( "" ) + '<table' + ( o && o . id ? ' id="' + o . id + '"' : "" ) + '>' ;
2017-06-10 01:56:23 +00:00
}
var _BEGIN = '<html><head><meta charset="utf-8"/><title>SheetJS Table Export</title></head><body>' ;
var _END = '</body></html>' ;
2018-01-23 09:09:53 +00:00
function sheet _to _html ( ws , opts /*, wb:?Workbook*/ ) {
2017-06-10 01:56:23 +00:00
var o = opts || { } ;
var header = o . header != null ? o . header : _BEGIN ;
var footer = o . footer != null ? o . footer : _END ;
var out = [ header ] ;
2017-04-16 07:35:56 +00:00
var r = decode _range ( ws [ '!ref' ] ) ;
o . dense = Array . isArray ( ws ) ;
2017-06-10 01:56:23 +00:00
out . push ( make _html _preamble ( ws , r , o ) ) ;
2017-05-17 04:27:55 +00:00
for ( var R = r . s . r ; R <= r . e . r ; ++ R ) out . push ( make _html _row ( ws , r , R , o ) ) ;
2017-06-10 01:56:23 +00:00
out . push ( "</table>" + footer ) ;
return out . join ( "" ) ;
2017-04-16 07:35:56 +00:00
}
return {
to _workbook : html _to _book ,
to _sheet : html _to _sheet ,
_row : make _html _row ,
2017-05-17 04:27:55 +00:00
BEGIN : _BEGIN ,
END : _END ,
2017-06-10 01:56:23 +00:00
_preamble : make _html _preamble ,
2017-04-16 07:35:56 +00:00
from _sheet : sheet _to _html
} ;
} ) ( ) ;
2017-03-31 21:50:32 +00:00
2017-04-09 04:07:43 +00:00
function parse _dom _table ( table , _opts ) {
var opts = _opts || { } ;
if ( DENSE != null ) opts . dense = DENSE ;
var ws = opts . dense ? ( [ ] ) : ( { } ) ;
2017-03-31 21:50:32 +00:00
var rows = table . getElementsByTagName ( 'tr' ) ;
2018-06-01 16:34:26 +00:00
var sheetRows = opts . sheetRows || 10000000 ;
var range = { s : { r : 0 , c : 0 } , e : { r : 0 , c : 0 } } ;
2017-03-31 21:50:32 +00:00
var merges = [ ] , midx = 0 ;
2018-06-01 16:34:26 +00:00
var rowinfo = [ ] ;
var _R = 0 , R = 0 , _C , C , RS , CS ;
for ( ; _R < rows . length && R < sheetRows ; ++ _R ) {
var row = rows [ _R ] ;
if ( is _dom _element _hidden ( row ) ) {
if ( opts . display ) continue ;
rowinfo [ R ] = { hidden : true } ;
}
2017-12-30 05:41:41 +00:00
var elts = ( row . children ) ;
2017-03-31 21:50:32 +00:00
for ( _C = C = 0 ; _C < elts . length ; ++ _C ) {
2018-06-01 16:34:26 +00:00
var elt = elts [ _C ] ;
if ( opts . display && is _dom _element _hidden ( elt ) ) continue ;
var v = htmldecode ( elt . innerHTML ) ;
2017-03-31 21:50:32 +00:00
for ( midx = 0 ; midx < merges . length ; ++ midx ) {
var m = merges [ midx ] ;
if ( m . s . c == C && m . s . r <= R && R <= m . e . r ) { C = m . e . c + 1 ; midx = - 1 ; }
}
/* TODO: figure out how to extract nonstandard mso- style */
CS = + elt . getAttribute ( "colspan" ) || 1 ;
2017-04-16 07:35:56 +00:00
if ( ( RS = + elt . getAttribute ( "rowspan" ) ) > 0 || CS > 1 ) merges . push ( { s : { r : R , c : C } , e : { r : R + ( RS || 1 ) - 1 , c : C + CS - 1 } } ) ;
2017-03-31 21:50:32 +00:00
var o = { t : 's' , v : v } ;
2017-12-15 02:01:07 +00:00
var _t = elt . getAttribute ( "t" ) || "" ;
2017-08-19 23:13:21 +00:00
if ( v != null ) {
2017-12-15 02:01:07 +00:00
if ( v . length == 0 ) o . t = _t || 'z' ;
else if ( opts . raw || v . trim ( ) . length == 0 || _t == "s" ) { }
2017-08-19 23:13:21 +00:00
else if ( v === 'TRUE' ) o = { t : 'b' , v : true } ;
else if ( v === 'FALSE' ) o = { t : 'b' , v : false } ;
2017-08-10 23:55:45 +00:00
else if ( ! isNaN ( fuzzynum ( v ) ) ) o = { t : 'n' , v : fuzzynum ( v ) } ;
2017-05-17 04:27:55 +00:00
else if ( ! isNaN ( fuzzydate ( v ) . getDate ( ) ) ) {
o = ( { t : 'd' , v : parseDate ( v ) } ) ;
if ( ! opts . cellDates ) o = ( { t : 'n' , v : datenum ( o . v ) } ) ;
o . z = opts . dateNF || SSF . _table [ 14 ] ;
}
}
2017-04-09 04:07:43 +00:00
if ( opts . dense ) { if ( ! ws [ R ] ) ws [ R ] = [ ] ; ws [ R ] [ C ] = o ; }
else ws [ encode _cell ( { c : C , r : R } ) ] = o ;
if ( range . e . c < C ) range . e . c = C ;
2017-03-31 21:50:32 +00:00
C += CS ;
}
2018-06-01 16:34:26 +00:00
++ R ;
2017-03-31 21:50:32 +00:00
}
2018-05-05 06:42:56 +00:00
if ( merges . length ) ws [ '!merges' ] = merges ;
2018-06-01 16:34:26 +00:00
if ( rowinfo . length ) ws [ '!rows' ] = rowinfo ;
range . e . r = R - 1 ;
2017-04-03 06:04:35 +00:00
ws [ '!ref' ] = encode _range ( range ) ;
2018-06-01 16:34:26 +00:00
if ( R >= sheetRows ) ws [ '!fullref' ] = encode _range ( ( range . e . r = rows . length - _R + R - 1 , range ) ) ; // We can count the real number of rows to parse but we don't to improve the performance
2017-03-31 21:50:32 +00:00
return ws ;
}
function table _to _book ( table , opts ) {
return sheet _to _workbook ( parse _dom _table ( table , opts ) , opts ) ;
}
2018-06-01 16:34:26 +00:00
function is _dom _element _hidden ( element ) {
var display = '' ;
var get _computed _style = get _get _computed _style _function ( element ) ;
if ( get _computed _style ) display = get _computed _style ( element ) . getPropertyValue ( 'display' ) ;
if ( ! display ) display = element . style . display ; // Fallback for cases when getComputedStyle is not available (e.g. an old browser or some Node.js environments) or doesn't work (e.g. if the element is not inserted to a document)
return display === 'none' ;
}
/* global getComputedStyle */
function get _get _computed _style _function ( element ) {
// 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 ;
}
2017-05-11 18:57:52 +00:00
/* OpenDocument */
2017-03-10 00:36:03 +00:00
var parse _content _xml = ( function ( ) {
2017-10-17 00:36:51 +00:00
/* 6.1.2 White Space Characters */
2018-01-23 09:09:53 +00:00
var parse _text _p = function ( text ) {
2017-10-17 00:36:51 +00:00
return unescapexml ( 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" )
. replace ( /<[^>]*>/g , "" )
) ;
2017-03-10 00:36:03 +00:00
} ;
var number _formats = {
/* ods name: [short ssf fmt, long ssf fmt] */
2017-10-17 00:36:51 +00:00
day : [ "d" , "dd" ] ,
month : [ "m" , "mm" ] ,
year : [ "y" , "yy" ] ,
hours : [ "h" , "hh" ] ,
minutes : [ "m" , "mm" ] ,
seconds : [ "s" , "ss" ] ,
"am-pm" : [ "A/P" , "AM/PM" ] ,
"day-of-week" : [ "ddd" , "dddd" ] ,
era : [ "e" , "ee" ] ,
/* there is no native representation of LO "Q" format */
quarter : [ "\\Qm" , "m\\\"th quarter\"" ]
2017-03-10 00:36:03 +00:00
} ;
return function pcx ( d , _opts ) {
var opts = _opts || { } ;
2017-04-09 04:07:43 +00:00
if ( DENSE != null && opts . dense == null ) opts . dense = DENSE ;
2017-03-10 00:36:03 +00:00
var str = xlml _normalize ( d ) ;
var state = [ ] , tmp ;
var tag ;
var NFtag = { name : "" } , NF = "" , pidx = 0 ;
var sheetag ;
var rowtag ;
2017-04-09 04:07:43 +00:00
var Sheets = { } , SheetNames = [ ] ;
var ws = opts . dense ? ( [ ] ) : ( { } ) ;
2017-03-10 00:36:03 +00:00
var Rn , q ;
2017-10-17 00:36:51 +00:00
var ctag = ( { value : "" } ) ;
2017-03-10 00:36:03 +00:00
var textp = "" , textpidx = 0 , textptag ;
var R = - 1 , C = - 1 , range = { s : { r : 1000000 , c : 10000000 } , e : { r : 0 , c : 0 } } ;
2017-10-17 00:36:51 +00:00
var row _ol = 0 ;
2017-03-10 00:36:03 +00:00
var number _format _map = { } ;
var merges = [ ] , mrange = { } , mR = 0 , mC = 0 ;
2017-10-17 00:36:51 +00:00
var rowinfo = [ ] , rowpeat = 1 , colpeat = 1 ;
2017-03-10 00:36:03 +00:00
var arrayf = [ ] ;
2017-12-15 02:01:07 +00:00
var WB = { Names : [ ] } ;
var atag = ( { } ) ;
var _Ref = [ "" , "" ] ;
2017-12-30 05:41:41 +00:00
var comments = [ ] , comment = ( { } ) ;
2017-04-03 06:04:35 +00:00
var creator = "" , creatoridx = 0 ;
2017-12-15 02:01:07 +00:00
var isstub = false , intable = false ;
2017-03-10 00:36:03 +00:00
var i = 0 ;
xlmlregex . lastIndex = 0 ;
2017-06-24 06:48:44 +00:00
str = str . replace ( /<!--([\s\S]*?)-->/mg , "" ) . replace ( /<!DOCTYPE[^\[]*\[[^\]]*\]>/gm , "" ) ;
2017-03-10 00:36:03 +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 ) ;
2018-04-06 06:36:52 +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 00:36:03 +00:00
if ( merges . length ) ws [ '!merges' ] = merges ;
2017-10-17 00:36:51 +00:00
if ( rowinfo . length ) ws [ "!rows" ] = rowinfo ;
2018-08-26 00:09:59 +00:00
sheetag . name = sheetag [ '名称' ] || sheetag . name ;
2018-02-28 09:58:43 +00:00
if ( typeof JSON !== 'undefined' ) JSON . stringify ( sheetag ) ;
2017-03-10 00:36:03 +00:00
SheetNames . push ( sheetag . name ) ;
Sheets [ sheetag . name ] = ws ;
2017-12-15 02:01:07 +00:00
intable = false ;
2017-03-10 00:36:03 +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-09 04:07:43 +00:00
ws = opts . dense ? ( [ ] ) : ( { } ) ; merges = [ ] ;
2017-10-17 00:36:51 +00:00
rowinfo = [ ] ;
2017-12-15 02:01:07 +00:00
intable = true ;
2017-03-10 00:36:03 +00:00
}
break ;
2017-10-17 00:36:51 +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 00:36:03 +00:00
case 'table-row' : case '行' : // 9.1.3 <table:table-row>
2017-10-17 00:36:51 +00:00
if ( Rn [ 1 ] === '/' ) { R += rowpeat ; rowpeat = 1 ; break ; }
2017-03-10 00:36:03 +00:00
rowtag = parsexmltag ( Rn [ 0 ] , false ) ;
2017-10-17 00:36:51 +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 00:36:03 +00:00
C = - 1 ; break ;
2017-03-16 04:39:50 +00:00
case 'covered-table-cell' : // 9.1.5 <table:covered-table-cell>
++ C ;
2017-04-09 04:07:43 +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' } ;
}
2017-03-16 04:39:50 +00:00
break ; /* stub */
2017-03-10 00:36:03 +00:00
case 'table-cell' : case '数据' :
if ( Rn [ 0 ] . charAt ( Rn [ 0 ] . length - 2 ) === '/' ) {
2017-10-17 00:36:51 +00:00
++ C ;
2017-03-10 00:36:03 +00:00
ctag = parsexmltag ( Rn [ 0 ] , false ) ;
2017-10-17 00:36:51 +00:00
colpeat = parseInt ( ctag [ 'number-columns-repeated' ] || "1" , 10 ) ;
q = ( { t : 'z' , v : null } ) ;
if ( ctag . formula && opts . cellFormula != false ) q . f = ods _to _csf _formula ( unescapexml ( ctag . formula ) ) ;
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 00:36:03 +00:00
++ C ;
2017-10-17 00:36:51 +00:00
colpeat = 1 ;
2018-01-23 09:09:53 +00:00
var rptR = rowpeat ? R + rowpeat - 1 : R ;
2017-03-10 00:36:03 +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:09:53 +00:00
if ( rptR > range . e . r ) range . e . r = rptR ;
2017-03-10 00:36:03 +00:00
ctag = parsexmltag ( Rn [ 0 ] , false ) ;
2017-12-30 05:41:41 +00:00
comments = [ ] ; comment = ( { } ) ;
2017-03-10 00:36:03 +00:00
q = ( { t : ctag [ '数据类型' ] || ctag [ 'value-type' ] , v : null } ) ;
if ( opts . cellFormula ) {
2017-03-20 21:57:44 +00:00
if ( ctag . formula ) ctag . formula = unescapexml ( ctag . formula ) ;
2017-03-10 00:36:03 +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:36:51 +00:00
if ( ctag [ 'number-columns-repeated' ] ) colpeat = parseInt ( ctag [ 'number-columns-repeated' ] , 10 ) ;
2017-03-10 00:36:03 +00:00
/* 19.385 office:value-type */
switch ( q . t ) {
case 'boolean' : q . t = 'b' ; q . v = parsexmlbool ( ctag [ 'boolean-value' ] ) ; break ;
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:56:21 +00:00
case 'date' : q . t = 'd' ; q . v = parseDate ( ctag [ 'date-value' ] ) ;
2017-03-16 04:39:50 +00:00
if ( ! opts . cellDates ) { q . t = 'n' ; q . v = datenum ( q . v ) ; }
q . z = 'm/d/yy' ; break ;
2017-03-10 00:36:03 +00:00
case 'time' : q . t = 'n' ; q . v = parse _isodur ( ctag [ 'time-value' ] ) / 86400 ; break ;
case 'number' : q . t = 'n' ; q . v = parseFloat ( ctag [ '数据数值' ] ) ; break ;
default :
if ( q . t === 'string' || q . t === 'text' || ! q . t ) {
q . t = 's' ;
2017-03-16 04:39:50 +00:00
if ( ctag [ 'string-value' ] != null ) textp = unescapexml ( ctag [ 'string-value' ] ) ;
2017-03-10 00:36:03 +00:00
} else throw new Error ( 'Unsupported value type ' + q . t ) ;
}
} else {
isstub = false ;
if ( q . t === 's' ) {
q . v = textp || '' ;
isstub = textpidx == 0 ;
}
2017-12-15 02:01:07 +00:00
if ( atag . Target ) q . l = atag ;
2017-04-03 06:04:35 +00:00
if ( comments . length > 0 ) { q . c = comments ; comments = [ ] ; }
2017-04-30 16:28:24 +00:00
if ( textp && opts . cellText !== false ) q . w = textp ;
2017-03-16 04:39:50 +00:00
if ( ! isstub || opts . sheetStubs ) {
2018-04-06 06:36:52 +00:00
if ( ! ( opts . sheetRows && opts . sheetRows <= R ) ) {
2017-10-17 00:36:51 +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-09 04:07:43 +00:00
}
2017-03-10 00:36:03 +00:00
}
2017-10-17 00:36:51 +00:00
}
colpeat = parseInt ( ctag [ 'number-columns-repeated' ] || "1" , 10 ) ;
C += colpeat - 1 ; colpeat = 0 ;
2017-03-10 00:36:03 +00:00
q = { } ;
textp = "" ;
}
2017-12-15 02:01:07 +00:00
atag = ( { } ) ;
2017-03-10 00:36:03 +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>
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-03 06:04:35 +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 ;
comment . a = creator ;
comments . push ( comment ) ;
}
else if ( Rn [ 0 ] . charAt ( Rn [ 0 ] . length - 2 ) !== '/' ) { state . push ( [ Rn [ 3 ] , false ] ) ; }
creator = "" ; creatoridx = 0 ;
textp = "" ; textpidx = 0 ;
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 00:36:03 +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:36:51 +00:00
case 'chart' : // TODO
2017-03-10 00:36:03 +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 ] ) ;
textp = "" ; textpidx = 0 ;
break ;
case 'scientific-number' : // TODO: <number:scientific-number>
break ;
case 'currency-symbol' : // TODO: <number:currency-symbol>
break ;
case 'currency-style' : // TODO: <number:currency-style>
break ;
case 'number-style' : // 16.27.2 <number:number-style>
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 ] === '/' ) {
number _format _map [ NFtag . name ] = NF ;
if ( ( tmp = state . pop ( ) ) [ 0 ] !== Rn [ 3 ] ) throw "Bad state: " + tmp ;
} else if ( Rn [ 0 ] . charAt ( Rn [ 0 ] . length - 2 ) !== '/' ) {
NF = "" ;
NFtag = parsexmltag ( Rn [ 0 ] , false ) ;
state . push ( [ Rn [ 3 ] , true ] ) ;
} break ;
case 'script' : break ; // 3.13 <office:script>
case 'libraries' : break ; // TODO: <ooo:libraries>
case 'automatic-styles' : break ; // 3.15.3 <office:automatic-styles>
2017-10-17 00:36:51 +00:00
case 'master-styles' : break ; // TODO: <office:master-styles>
2017-03-10 00:36:03 +00:00
case 'default-style' : // TODO: <style:default-style>
case 'page-layout' : break ; // TODO: <style:page-layout>
case 'style' : break ; // 16.2 <style:style>
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>
switch ( state [ state . length - 1 ] [ 0 ] ) {
case 'time-style' :
case 'date-style' :
tag = parsexmltag ( Rn [ 0 ] , false ) ;
NF += number _formats [ Rn [ 3 ] ] [ tag . style === 'long' ? 1 : 0 ] ; break ;
} break ;
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>
switch ( state [ state . length - 1 ] [ 0 ] ) {
case 'time-style' :
case 'date-style' :
tag = parsexmltag ( Rn [ 0 ] , false ) ;
NF += number _formats [ Rn [ 3 ] ] [ tag . style === 'long' ? 1 : 0 ] ; break ;
} break ;
case 'boolean-style' : break ; // 16.27.23 <number:boolean-style>
case 'boolean' : break ; // 16.27.24 <number:boolean>
case 'text-style' : break ; // 16.27.25 <number:text-style>
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 02:01:07 +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 ] } ) ;
if ( intable ) nrange . Sheet = SheetNames . length ;
WB . Names . push ( nrange ) ;
break ;
2017-03-10 00:36:03 +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:36:51 +00:00
case 'embedded-text' : break ; // 16.27.4 <number:embedded-text>
2017-03-10 00:36:03 +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-28 23:54:51 +00:00
case 'table-header-rows' : break ; // 9.1.7 <table:table-header-rows>
2017-10-17 00:36:51 +00:00
case 'table-rows' : break ; // 9.1.12 <table:table-rows>
2017-07-10 22:29:24 +00:00
/* TODO: outline levels */
case 'table-column-group' : break ; // 9.1.10 <table:table-column-group>
2017-07-28 23:54:51 +00:00
case 'table-header-columns' : break ; // 9.1.11 <table:table-header-columns>
2017-10-17 00:36:51 +00:00
case 'table-columns' : break ; // 9.1.12 <table:table-columns>
2017-03-10 00:36:03 +00:00
case 'null-date' : break ; // 9.4.2 <table:null-date> TODO: date1904
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-28 23:54:51 +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 00:36:03 +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-28 23:54:51 +00:00
case 'tab' : break ; // 6.1.4 <text:tab>
2017-03-10 00:36:03 +00:00
case 'line-break' : break ; // 6.1.5 <text:line-break>
2017-07-28 23:54:51 +00:00
case 'span' : break ; // 6.1.7 <text:span>
case 'p' : case '文本串' : // 5.1.3 <text:p>
2017-10-17 00:36:51 +00:00
if ( Rn [ 1 ] === '/' && ( ! ctag || ! ctag [ 'string-value' ] ) ) textp = ( textp . length > 0 ? textp + "\n" : "" ) + parse _text _p ( str . slice ( textpidx , Rn . index ) , textptag ) ;
2017-03-10 00:36:03 +00:00
else { textptag = parsexmltag ( Rn [ 0 ] , false ) ; textpidx = Rn . index + Rn [ 0 ] . length ; }
break ; // <text:p>
2017-10-17 00:36:51 +00:00
case 's' : break ; // <text:s>
2017-04-16 07:35:56 +00:00
case 'database-range' : // 9.4.15 <table:database-range>
if ( Rn [ 1 ] === '/' ) break ;
try {
2017-12-15 02:01:07 +00:00
_Ref = ods _to _csf _3D ( parsexmltag ( Rn [ 0 ] ) [ 'target-range-address' ] ) ;
Sheets [ _Ref [ 0 ] ] [ '!autofilter' ] = { ref : _Ref [ 1 ] } ;
2017-05-09 18:11:15 +00:00
} catch ( e ) { /* empty */ }
2017-04-16 07:35:56 +00:00
break ;
2017-03-10 00:36:03 +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:36:51 +00:00
case 'binary-data' : break ; // 10.4.5 TODO: b64 blob
2017-03-10 00:36:03 +00:00
2017-07-28 23:54:51 +00:00
/* 9.2 Advanced Tables */
2017-03-10 00:36:03 +00:00
case 'table-source' : break ; // 9.2.6
2017-07-28 23:54:51 +00:00
case 'scenario' : break ; // 9.2.6
2017-03-10 00:36:03 +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-28 23:54:51 +00:00
case 'help-message' : break ; // 9.4.6 <table:
2017-03-10 00:36:03 +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:11:15 +00:00
case 'event-listener' :
break ;
2017-03-10 00:36:03 +00:00
/* TODO: FODS Properties */
case 'initial-creator' :
case 'creation-date' :
2017-10-17 00:36:51 +00:00
case 'print-date' :
2017-03-10 00:36:03 +00:00
case 'generator' :
case 'document-statistic' :
case 'user-defined' :
2017-10-17 00:36:51 +00:00
case 'editing-duration' :
case 'editing-cycles' :
2017-03-10 00:36:03 +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-28 23:54:51 +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 00:36:03 +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 02:01:07 +00:00
case 'a' : // 6.1.8 hyperlink
if ( Rn [ 1 ] !== '/' ) {
atag = parsexmltag ( Rn [ 0 ] , false ) ;
if ( ! atag . href ) break ;
atag . Target = atag . href ; delete atag . href ;
if ( atag . Target . charAt ( 0 ) == "#" && atag . Target . indexOf ( "." ) > - 1 ) {
_Ref = ods _to _csf _3D ( atag . Target . slice ( 1 ) ) ;
atag . Target = "#" + _Ref [ 0 ] + "!" + _Ref [ 1 ] ;
}
}
break ;
2017-03-10 00:36:03 +00:00
/* non-standard */
case 'table-protection' : break ;
case 'data-pilot-grand-total' : break ; // <table:
2017-07-28 23:54:51 +00:00
case 'office-document-common-attrs' : break ; // bare
2017-10-17 00:36:51 +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 00:36:03 +00:00
}
2017-12-15 02:01:07 +00:00
var out = ( {
2017-03-10 00:36:03 +00:00
Sheets : Sheets ,
2017-12-15 02:01:07 +00:00
SheetNames : SheetNames ,
Workbook : WB
} ) ;
2017-10-17 00:36:51 +00:00
if ( opts . bookSheets ) delete out . Sheets ;
2017-03-10 00:36:03 +00:00
return out ;
} ;
} ) ( ) ;
2017-05-11 18:57:52 +00:00
function parse _ods ( zip , opts ) {
opts = opts || ( { } ) ;
var ods = ! ! safegetzipfile ( zip , 'objectdata' ) ;
2018-01-23 09:09:53 +00:00
if ( ods ) parse _manifest ( getzipdata ( zip , 'META-INF/manifest.xml' ) , opts ) ;
2017-05-11 18:57:52 +00:00
var content = getzipstr ( zip , 'content.xml' ) ;
if ( ! content ) throw new Error ( "Missing content.xml in " + ( ods ? "ODS" : "UOF" ) + " file" ) ;
2017-09-30 06:19:01 +00:00
var wb = parse _content _xml ( ods ? content : utf8read ( content ) , opts ) ;
if ( safegetzipfile ( zip , 'meta.xml' ) ) wb . Props = parse _core _props ( getzipdata ( zip , 'meta.xml' ) ) ;
return wb ;
2017-05-11 18:57:52 +00:00
}
function parse _fods ( data , opts ) {
return parse _content _xml ( data , opts ) ;
}
/* OpenDocument */
var write _styles _ods = ( function ( ) {
2017-10-17 00:36:51 +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"
} ) + '></office:document-styles>' ;
2018-01-23 09:09:53 +00:00
return function wso ( ) {
2017-10-17 00:36:51 +00:00
return XML _HEADER + payload ;
2017-05-11 18:57:52 +00:00
} ;
} ) ( ) ;
var write _content _ods = ( function ( ) {
2017-10-17 00:36:51 +00:00
/* 6.1.2 White Space Characters */
var write _text _p = function ( text ) {
return escapexml ( text )
. replace ( / +/g , function ( $$ ) { return '<text:s text:c="' + $$ . length + '"/>' ; } )
. replace ( /\t/g , "<text:tab/>" )
. replace ( /\n/g , "<text:line-break/>" )
. replace ( /^ / , "<text:s/>" ) . replace ( / $/ , "<text:s/>" ) ;
} ;
2017-03-10 00:36:03 +00:00
var null _cell _xml = ' <table:table-cell />\n' ;
2017-03-16 04:39:50 +00:00
var covered _cell _xml = ' <table:covered-table-cell/>\n' ;
2018-01-23 09:09:53 +00:00
var write _ws = function ( ws , wb , i ) {
2017-03-10 00:36:03 +00:00
/* Section 9 Tables */
var o = [ ] ;
o . push ( ' <table:table table:name="' + escapexml ( wb . SheetNames [ i ] ) + '">\n' ) ;
var R = 0 , C = 0 , range = decode _range ( ws [ '!ref' ] ) ;
2017-03-16 04:39:50 +00:00
var marr = ws [ '!merges' ] || [ ] , mi = 0 ;
2017-04-09 04:07:43 +00:00
var dense = Array . isArray ( ws ) ;
2017-03-10 00:36:03 +00:00
for ( R = 0 ; R < range . s . r ; ++ R ) o . push ( ' <table:table-row></table:table-row>\n' ) ;
for ( ; R <= range . e . r ; ++ R ) {
o . push ( ' <table:table-row>\n' ) ;
for ( C = 0 ; C < range . s . c ; ++ C ) o . push ( null _cell _xml ) ;
for ( ; C <= range . e . c ; ++ C ) {
2017-04-30 16:28:24 +00:00
var skip = false , ct = { } , textp = "" ;
2017-03-16 04:39:50 +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:28:24 +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 04:39:50 +00:00
break ;
}
if ( skip ) { o . push ( covered _cell _xml ) ; continue ; }
2017-04-09 04:07:43 +00:00
var ref = encode _cell ( { r : R , c : C } ) , cell = dense ? ( ws [ R ] || [ ] ) [ C ] : ws [ ref ] ;
2017-03-20 21:57:44 +00:00
if ( cell && cell . f ) {
2017-04-30 16:28:24 +00:00
ct [ 'table:formula' ] = escapexml ( csf _to _ods _formula ( cell . f ) ) ;
2017-03-20 21:57:44 +00:00
if ( cell . F ) {
2018-01-23 09:09:53 +00:00
if ( cell . F . slice ( 0 , ref . length ) == ref ) {
2017-03-20 21:57:44 +00:00
var _Fref = decode _range ( cell . F ) ;
2017-04-30 16:28:24 +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-20 21:57:44 +00:00
}
}
2017-04-30 16:28:24 +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' :
2017-10-17 00:36:51 +00:00
textp = cell . v ;
2017-04-30 16:28:24 +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 00:36:03 +00:00
//case 'e':
2017-04-30 16:28:24 +00:00
default : o . push ( null _cell _xml ) ; continue ;
}
2017-12-15 02:01:07 +00:00
var text _p = write _text _p ( textp ) ;
if ( cell . l && cell . l . Target ) {
var _tgt = cell . l . Target ; _tgt = _tgt . charAt ( 0 ) == "#" ? "#" + csf _to _ods _3D ( _tgt . slice ( 1 ) ) : _tgt ;
text _p = writextag ( 'text:a' , text _p , { 'xlink:href' : _tgt } ) ;
}
o . push ( ' ' + writextag ( 'table:table-cell' , writextag ( 'text:p' , text _p , { } ) , ct ) + '\n' ) ;
2017-03-10 00:36:03 +00:00
}
o . push ( ' </table:table-row>\n' ) ;
}
o . push ( ' </table:table>\n' ) ;
return o . join ( "" ) ;
} ;
2017-04-30 16:28:24 +00:00
var write _automatic _styles _ods = function ( o ) {
o . push ( ' <office:automatic-styles>\n' ) ;
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' ) ;
o . push ( ' <style:style style:name="ce1" style:family="table-cell" style:parent-style-name="Default" style:data-style-name="N37"/>\n' ) ;
o . push ( ' </office:automatic-styles>\n' ) ;
} ;
2017-03-10 00:36:03 +00:00
return function wcx ( wb , opts ) {
var o = [ XML _HEADER ] ;
/* 3.1.3.2 */
2017-04-30 16:28:24 +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:36:51 +00:00
'xmlns:config' : "urn:oasis:names:tc:opendocument:xmlns:config:1.0" ,
'office:mimetype' : "application/vnd.oasis.opendocument.spreadsheet"
2017-04-30 16:28:24 +00:00
} ) ;
if ( opts . bookType == "fods" ) o . push ( '<office:document' + attr + fods + '>\n' ) ;
else o . push ( '<office:document-content' + attr + '>\n' ) ;
write _automatic _styles _ods ( o ) ;
2017-03-10 00:36:03 +00:00
o . push ( ' <office:body>\n' ) ;
o . push ( ' <office:spreadsheet>\n' ) ;
for ( var i = 0 ; i != wb . SheetNames . length ; ++ i ) o . push ( write _ws ( wb . Sheets [ wb . SheetNames [ i ] ] , wb , i , opts ) ) ;
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 , opts ) {
2017-05-11 18:57:52 +00:00
if ( opts . bookType == "fods" ) return write _content _ods ( wb , opts ) ;
2017-03-10 00:36:03 +00:00
var zip = new jszip ( ) ;
var f = "" ;
var manifest = [ ] ;
var rdf = [ ] ;
2017-10-17 00:36:51 +00:00
/* Part 3 Section 3.3 MIME Media Type */
2017-03-10 00:36:03 +00:00
f = "mimetype" ;
zip . file ( f , "application/vnd.oasis.opendocument.spreadsheet" ) ;
/* Part 1 Section 2.2 Documents */
f = "content.xml" ;
2017-05-11 18:57:52 +00:00
zip . file ( f , write _content _ods ( wb , opts ) ) ;
2017-03-10 00:36:03 +00:00
manifest . push ( [ f , "text/xml" ] ) ;
rdf . push ( [ f , "ContentFile" ] ) ;
2017-05-11 18:57:52 +00:00
/* TODO: these are hard-coded styles to satiate excel */
f = "styles.xml" ;
zip . file ( f , write _styles _ods ( wb , opts ) ) ;
manifest . push ( [ f , "text/xml" ] ) ;
rdf . push ( [ f , "StylesFile" ] ) ;
/* TODO: this is hard-coded to satiate excel */
f = "meta.xml" ;
2018-01-23 09:09:53 +00:00
zip . file ( f , write _meta _ods ( ) ) ;
2017-05-11 18:57:52 +00:00
manifest . push ( [ f , "text/xml" ] ) ;
rdf . push ( [ f , "MetadataFile" ] ) ;
2017-10-17 00:36:51 +00:00
/* Part 3 Section 6 Metadata Manifest File */
f = "manifest.rdf" ;
2018-01-23 09:09:53 +00:00
zip . file ( f , write _rdf ( rdf /*, opts*/ ) ) ;
2017-10-17 00:36:51 +00:00
manifest . push ( [ f , "application/rdf+xml" ] ) ;
2017-03-10 00:36:03 +00:00
/* Part 3 Section 4 Manifest File */
f = "META-INF/manifest.xml" ;
2018-01-23 09:09:53 +00:00
zip . file ( f , write _manifest ( manifest /*, opts*/ ) ) ;
2017-03-10 00:36:03 +00:00
return zip ;
2017-02-22 07:48:52 +00:00
}
2017-05-11 18:57:52 +00:00
2017-10-27 19:55:07 +00:00
function write _sheet _index ( wb , sheet ) {
if ( ! sheet ) return 0 ;
var idx = wb . SheetNames . indexOf ( sheet ) ;
if ( idx == - 1 ) throw new Error ( "Sheet not found: " + sheet ) ;
return idx ;
}
2017-05-11 18:57:52 +00:00
function write _obj _str ( factory ) {
return function write _str ( wb , o ) {
2017-10-27 19:55:07 +00:00
var idx = write _sheet _index ( wb , o . sheet ) ;
2017-06-10 01:56:23 +00:00
return factory . from _sheet ( wb . Sheets [ wb . SheetNames [ idx ] ] , o , wb ) ;
2017-05-11 18:57:52 +00:00
} ;
}
var write _htm _str = write _obj _str ( HTML _ ) ;
var write _csv _str = write _obj _str ( { from _sheet : sheet _to _csv } ) ;
var write _slk _str = write _obj _str ( SYLK ) ;
var write _dif _str = write _obj _str ( DIF ) ;
var write _prn _str = write _obj _str ( PRN ) ;
2017-08-05 06:58:40 +00:00
var write _rtf _str = write _obj _str ( RTF ) ;
2017-05-11 18:57:52 +00:00
var write _txt _str = write _obj _str ( { from _sheet : sheet _to _txt } ) ;
2017-10-27 19:55:07 +00:00
var write _dbf _buf = write _obj _str ( DBF ) ;
2017-12-04 05:21:43 +00:00
var write _eth _str = write _obj _str ( ETH ) ;
2017-10-27 19:55:07 +00:00
2014-06-29 18:35:10 +00:00
function fix _opts _func ( defaults ) {
return function fix _opts ( opts ) {
for ( var i = 0 ; i != defaults . length ; ++ i ) {
var d = defaults [ i ] ;
2014-07-28 15:32:28 +00:00
if ( opts [ d [ 0 ] ] === undefined ) opts [ d [ 0 ] ] = d [ 1 ] ;
2014-05-16 00:16:51 +00:00
if ( d [ 2 ] === 'n' ) opts [ d [ 0 ] ] = Number ( opts [ d [ 0 ] ] ) ;
2014-06-29 18:35:10 +00:00
}
2014-05-16 00:16:51 +00:00
} ;
2014-02-12 06:19:45 +00:00
}
2014-05-16 00:16:51 +00:00
2014-06-29 18:35:10 +00:00
var fix _read _opts = fix _opts _func ( [
2014-05-16 00:16:51 +00:00
[ 'cellNF' , false ] , /* emit cell number format string as .z */
[ 'cellHTML' , true ] , /* emit html string as .h */
[ 'cellFormula' , true ] , /* emit formulae as .f */
2014-05-29 22:32:13 +00:00
[ 'cellStyles' , false ] , /* emits style/theme as .s */
2017-04-21 22:03:40 +00:00
[ 'cellText' , true ] , /* emit formatted text as .w */
2014-10-26 05:09:58 +00:00
[ 'cellDates' , false ] , /* emit date cells with type `d` */
2014-05-16 00:16:51 +00:00
[ '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) */
2015-04-02 22:14:07 +00:00
[ 'bookFiles' , false ] , /* include raw file structure (keys, files, cfb) */
2014-05-16 00:16:51 +00:00
[ 'bookVBA' , false ] , /* include vba raw data (vbaraw) */
2015-04-02 22:14:07 +00:00
[ 'password' , '' ] , /* password */
2014-05-16 00:16:51 +00:00
[ 'WTF' , false ] /* WTF mode (throws errors) */
] ) ;
2014-06-29 18:35:10 +00:00
var fix _write _opts = fix _opts _func ( [
2014-10-26 05:09:58 +00:00
[ 'cellDates' , false ] , /* write date cells with type `d` */
2014-05-16 00:16:51 +00:00
[ 'bookSST' , false ] , /* Generate Shared String Table */
[ 'bookType' , 'xlsx' ] , /* Type of workbook (xlsx/m/b) */
2017-02-04 00:14:24 +00:00
[ 'compression' , false ] , /* Use file compression */
2014-05-16 00:16:51 +00:00
[ 'WTF' , false ] /* WTF mode (throws errors) */
] ) ;
2017-03-28 22:07:46 +00:00
function get _sheet _type ( n ) {
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:19:01 +00:00
return ( n && n . length ) ? n : "sheet" ;
2017-03-28 22:07:46 +00:00
}
2014-06-05 07:07:10 +00:00
function safe _parse _wbrels ( wbrels , sheets ) {
if ( ! wbrels ) return 0 ;
try {
2017-03-28 22:07:46 +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 ) ] ; } ) ;
2014-06-05 07:07:10 +00:00
} catch ( e ) { return null ; }
return ! wbrels || wbrels . length === 0 ? null : wbrels ;
}
2017-11-20 02:13:37 +00:00
function safe _parse _sheet ( zip , path , relsPath , sheet , idx , sheetRels , sheets , stype , opts , wb , themes , styles ) {
2014-06-05 07:07:10 +00:00
try {
2017-02-11 01:58:22 +00:00
sheetRels [ sheet ] = parse _rels ( getzipstr ( zip , relsPath , true ) , path ) ;
2017-03-28 22:07:46 +00:00
var data = getzipdata ( zip , path ) ;
2018-06-22 21:40:52 +00:00
var _ws ;
2017-03-28 22:07:46 +00:00
switch ( stype ) {
2018-06-22 21:40:52 +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 ) ;
if ( ! _ws || ! _ws [ '!chart' ] ) break ;
var dfile = resolve _path ( _ws [ '!chart' ] . Target , path ) ;
2017-03-28 22:07:46 +00:00
var drelsp = get _rels _path ( dfile ) ;
2017-11-20 02:13:37 +00:00
var draw = parse _drawing ( getzipstr ( zip , dfile , true ) , parse _rels ( getzipstr ( zip , drelsp , true ) , dfile ) ) ;
2017-03-28 22:07:46 +00:00
var chartp = resolve _path ( draw , dfile ) ;
var crelsp = get _rels _path ( chartp ) ;
2018-06-22 21:40:52 +00:00
_ws = parse _chart ( getzipstr ( zip , chartp , true ) , chartp , opts , parse _rels ( getzipstr ( zip , crelsp , true ) , chartp ) , wb , _ws ) ;
2017-03-28 22:07:46 +00:00
break ;
2018-06-22 21:40:52 +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 ;
2017-03-28 22:07:46 +00:00
}
2018-06-22 21:40:52 +00:00
sheets [ sheet ] = _ws ;
2014-06-05 07:07:10 +00:00
} catch ( e ) { if ( opts . WTF ) throw e ; }
}
2017-08-19 23:13:21 +00:00
function strip _front _slash ( x ) { return x . charAt ( 0 ) == '/' ? x . slice ( 1 ) : x ; }
2014-05-16 00:16:51 +00:00
function parse _zip ( zip , opts ) {
make _ssf ( SSF ) ;
2014-02-12 06:19:45 +00:00
opts = opts || { } ;
2014-05-16 00:16:51 +00:00
fix _read _opts ( opts ) ;
2014-10-10 02:12:25 +00:00
/* OpenDocument Part 3 Section 2.2.1 OpenDocument Package */
if ( safegetzipfile ( zip , 'META-INF/manifest.xml' ) ) return parse _ods ( zip , opts ) ;
2017-02-22 07:48:52 +00:00
/* UOC */
if ( safegetzipfile ( zip , 'objectdata.xml' ) ) return parse _ods ( zip , opts ) ;
2017-10-17 00:36:51 +00:00
/* Numbers */
if ( safegetzipfile ( zip , 'Index/Document.iwa' ) ) throw new Error ( 'Unsupported NUMBERS file' ) ;
2014-10-10 02:12:25 +00:00
2018-02-28 09:58:43 +00:00
var entries = zipentries ( zip ) ;
2018-01-23 09:09:53 +00:00
var dir = parse _ct ( ( getzipstr ( zip , '[Content_Types].xml' ) ) ) ;
2014-01-28 16:35:26 +00:00
var xlsb = false ;
2014-04-03 23:24:56 +00:00
var sheets , binname ;
if ( dir . workbooks . length === 0 ) {
binname = "xl/workbook.xml" ;
if ( getzipdata ( zip , binname , true ) ) dir . workbooks . push ( binname ) ;
}
2014-01-28 16:35:26 +00:00
if ( dir . workbooks . length === 0 ) {
2014-04-03 23:24:56 +00:00
binname = "xl/workbook.bin" ;
2017-07-05 21:02:14 +00:00
if ( ! getzipdata ( zip , binname , true ) ) throw new Error ( "Could not find workbook" ) ;
2014-01-28 16:35:26 +00:00
dir . workbooks . push ( binname ) ;
xlsb = true ;
}
2017-02-22 07:48:52 +00:00
if ( dir . workbooks [ 0 ] . slice ( - 3 ) == "bin" ) xlsb = true ;
2012-12-03 19:47:44 +00:00
2017-03-20 21:57:44 +00:00
var themes = ( { } ) ;
var styles = ( { } ) ;
2014-02-14 06:27:51 +00:00
if ( ! opts . bookSheets && ! opts . bookProps ) {
2014-05-16 00:16:51 +00:00
strs = [ ] ;
2018-05-05 06:42:56 +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 ; }
2014-02-13 06:26:39 +00:00
2017-03-13 07:34:05 +00:00
if ( opts . cellStyles && dir . themes . length ) themes = parse _theme ( getzipstr ( zip , dir . themes [ 0 ] . replace ( /^\// , '' ) , true ) || "" , dir . themes [ 0 ] , opts ) ;
2017-03-20 21:57:44 +00:00
2017-08-19 23:13:21 +00:00
if ( dir . style ) styles = parse _sty ( getzipdata ( zip , strip _front _slash ( dir . style ) ) , dir . style , themes , opts ) ;
2014-02-13 06:26:39 +00:00
}
2018-01-23 09:09:53 +00:00
/*var externbooks = */ dir . links . map ( function ( link ) {
2017-08-19 23:13:21 +00:00
return parse _xlink ( getzipdata ( zip , strip _front _slash ( link ) ) , link , opts ) ;
} ) ;
var wb = parse _wb ( getzipdata ( zip , strip _front _slash ( dir . workbooks [ 0 ] ) ) , dir . workbooks [ 0 ] , opts ) ;
2012-12-03 19:47:44 +00:00
2014-02-04 15:26:21 +00:00
var props = { } , propdata = "" ;
2014-05-16 00:16:51 +00:00
2017-08-19 23:13:21 +00:00
if ( dir . coreprops . length ) {
2017-09-30 06:19:01 +00:00
propdata = getzipdata ( zip , strip _front _slash ( dir . coreprops [ 0 ] ) , true ) ;
2014-05-16 00:16:51 +00:00
if ( propdata ) props = parse _core _props ( propdata ) ;
if ( dir . extprops . length !== 0 ) {
2017-09-30 06:19:01 +00:00
propdata = getzipdata ( zip , strip _front _slash ( dir . extprops [ 0 ] ) , true ) ;
2017-08-05 06:58:40 +00:00
if ( propdata ) parse _ext _props ( propdata , props , opts ) ;
2014-05-16 00:16:51 +00:00
}
}
2014-02-13 06:26:39 +00:00
2014-02-14 06:27:51 +00:00
var custprops = { } ;
if ( ! opts . bookSheets || opts . bookProps ) {
2014-02-15 05:10:56 +00:00
if ( dir . custprops . length !== 0 ) {
2017-08-19 23:13:21 +00:00
propdata = getzipstr ( zip , strip _front _slash ( dir . custprops [ 0 ] ) , true ) ;
2014-05-16 00:16:51 +00:00
if ( propdata ) custprops = parse _cust _props ( propdata , opts ) ;
2014-02-15 05:10:56 +00:00
}
2014-02-14 06:27:51 +00:00
}
2017-03-13 07:34:05 +00:00
var out = ( { } ) ;
2014-02-14 06:27:51 +00:00
if ( opts . bookSheets || opts . bookProps ) {
2017-03-28 22:07:46 +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 ;
2014-02-14 06:27:51 +00:00
if ( opts . bookProps ) { out . Props = props ; out . Custprops = custprops ; }
2017-03-13 07:34:05 +00:00
if ( opts . bookSheets && typeof sheets !== 'undefined' ) out . SheetNames = sheets ;
2014-02-14 06:27:51 +00:00
if ( opts . bookSheets ? out . SheetNames : opts . bookProps ) return out ;
2014-02-13 06:26:39 +00:00
}
2014-02-15 05:10:56 +00:00
sheets = { } ;
2014-02-13 06:26:39 +00:00
2012-12-03 19:47:44 +00:00
var deps = { } ;
2017-08-19 23:13:21 +00:00
if ( opts . bookDeps && dir . calcchain ) deps = parse _cc ( getzipdata ( zip , strip _front _slash ( dir . calcchain ) ) , dir . calcchain , opts ) ;
2014-02-15 05:10:56 +00:00
var i = 0 ;
2017-02-11 01:58:22 +00:00
var sheetRels = ( { } ) ;
2014-01-29 06:03:34 +00:00
var path , relsPath ;
2017-03-31 21:50:32 +00:00
2017-04-09 04:07:43 +00:00
{
2012-12-03 19:47:44 +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-09 04:07:43 +00:00
}
2014-05-22 12:09:29 +00:00
2014-05-29 22:32:13 +00:00
var wbext = xlsb ? "bin" : "xml" ;
2018-04-13 04:49:43 +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' ;
2017-02-11 01:58:22 +00:00
var wbrels = parse _rels ( getzipstr ( zip , wbrelsfile , true ) , wbrelsfile ) ;
2014-06-05 07:07:10 +00:00
if ( wbrels ) wbrels = safe _parse _wbrels ( wbrels , wb . Sheets ) ;
2018-04-13 04:49:43 +00:00
2014-05-22 12:09:29 +00:00
/* Numbers iOS hack */
2014-02-21 16:50:59 +00:00
var nmode = ( getzipdata ( zip , "xl/worksheets/sheet.xml" , true ) ) ? 1 : 0 ;
for ( i = 0 ; i != props . Worksheets ; ++ i ) {
2017-03-28 22:07:46 +00:00
var stype = "sheet" ;
if ( wbrels && wbrels [ i ] ) {
path = 'xl/' + ( wbrels [ i ] [ 1 ] ) . replace ( /[\/]?xl\// , "" ) ;
2018-04-13 04:49:43 +00:00
if ( ! safegetzipfile ( zip , path ) ) path = wbrels [ i ] [ 1 ] ;
if ( ! safegetzipfile ( zip , path ) ) path = wbrelsfile . replace ( /_rels\/.*$/ , "" ) + wbrels [ i ] [ 1 ] ;
2017-03-28 22:07:46 +00:00
stype = wbrels [ i ] [ 2 ] ;
} else {
2014-06-05 07:07:10 +00:00
path = 'xl/worksheets/sheet' + ( i + 1 - nmode ) + "." + wbext ;
path = path . replace ( /sheet0\./ , "sheet." ) ;
}
relsPath = path . replace ( /^(.*)(\/)([^\/]*)$/ , "$1/_rels/$3.rels" ) ;
2017-11-20 02:13:37 +00:00
safe _parse _sheet ( zip , path , relsPath , props . SheetNames [ i ] , i , sheetRels , sheets , stype , opts , wb , themes , styles ) ;
2012-12-03 19:47:44 +00:00
}
2014-01-22 05:02:45 +00:00
2014-02-12 06:19:45 +00:00
if ( dir . comments ) parse _comments ( zip , dir . comments , sheets , sheetRels , opts ) ;
2014-01-22 05:02:45 +00:00
2017-02-11 01:58:22 +00:00
out = ( {
2012-12-03 19:47:44 +00:00
Directory : dir ,
Workbook : wb ,
Props : props ,
2014-02-14 06:27:51 +00:00
Custprops : custprops ,
2012-12-03 19:47:44 +00:00
Deps : deps ,
Sheets : sheets ,
SheetNames : props . SheetNames ,
Strings : strs ,
Styles : styles ,
2014-05-29 22:32:13 +00:00
Themes : themes ,
2014-05-16 00:16:51 +00:00
SSF : SSF . get _table ( )
2017-02-11 01:58:22 +00:00
} ) ;
2014-02-17 08:51:25 +00:00
if ( opts . bookFiles ) {
2014-05-16 00:16:51 +00:00
out . keys = entries ;
2014-02-21 16:50:59 +00:00
out . files = zip . files ;
2014-02-17 08:51:25 +00:00
}
2014-04-03 23:24:56 +00:00
if ( opts . bookVBA ) {
2017-08-19 23:13:21 +00:00
if ( dir . vba . length > 0 ) out . vbaraw = getzipdata ( zip , strip _front _slash ( dir . vba [ 0 ] ) , true ) ;
2018-02-08 19:13:10 +00:00
else if ( dir . defaults && dir . defaults . bin === CT _VBA ) out . vbaraw = getzipdata ( zip , 'xl/vbaProject.bin' , true ) ;
2014-04-03 23:24:56 +00:00
}
2014-02-17 08:51:25 +00:00
return out ;
2012-12-03 19:47:44 +00:00
}
2017-04-16 07:35:56 +00:00
2017-12-01 05:51:31 +00:00
/* [MS-OFFCRYPTO] 2.1.1 */
function parse _xlsxcfb ( cfb , _opts ) {
var opts = _opts || { } ;
2018-06-22 21:40:52 +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:09:53 +00:00
/*var version = */ parse _DataSpaceVersionInfo ( data . content ) ;
2017-04-16 07:35:56 +00:00
/* 2.3.4.1 */
2017-12-01 05:51:31 +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-16 07:35:56 +00:00
var dsm = parse _DataSpaceMap ( data . content ) ;
2017-10-17 00:36:51 +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-16 07:35:56 +00:00
throw new Error ( "ECMA-376 Encrypted file bad " + f ) ;
2017-12-01 05:51:31 +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-16 07:35:56 +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:51:31 +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:09:53 +00:00
/*var hdr = */ parse _Primary ( data . content ) ;
2018-06-22 21:40:52 +00:00
} catch ( e ) { }
2017-04-16 07:35:56 +00:00
2017-12-01 05:51:31 +00:00
f = '/EncryptionInfo' ;
data = CFB . find ( cfb , f ) ; if ( ! data || ! data . content ) throw new Error ( "ECMA-376 Encrypted file missing " + f ) ;
2017-04-16 07:35:56 +00:00
var einfo = parse _EncryptionInfo ( data . content ) ;
2017-12-01 05:51:31 +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:09:53 +00:00
/*global decrypt_agile */
2017-12-01 05:51:31 +00:00
if ( einfo [ 0 ] == 0x04 && typeof decrypt _agile !== 'undefined' ) return decrypt _agile ( einfo [ 1 ] , data . content , opts . password || "" , opts ) ;
2018-01-23 09:09:53 +00:00
/*global decrypt_std76 */
2017-12-15 02:01:07 +00:00
if ( einfo [ 0 ] == 0x02 && typeof decrypt _std76 !== 'undefined' ) return decrypt _std76 ( einfo [ 1 ] , data . content , opts . password || "" , opts ) ;
2017-04-16 07:35:56 +00:00
throw new Error ( "File is password-protected" ) ;
}
2014-05-16 00:16:51 +00:00
function write _zip ( wb , opts ) {
2017-04-03 06:04:35 +00:00
_shapeid = 1024 ;
2017-02-04 00:14:24 +00:00
if ( opts . bookType == "ods" ) return write _ods ( wb , opts ) ;
2014-05-22 12:09:29 +00:00
if ( wb && ! wb . SSF ) {
wb . SSF = SSF . get _table ( ) ;
}
2014-05-16 00:16:51 +00:00
if ( wb && wb . SSF ) {
make _ssf ( SSF ) ; SSF . load _table ( wb . SSF ) ;
2017-03-13 07:34:05 +00:00
// $FlowIgnore
2014-06-29 18:35:10 +00:00
opts . revssf = evert _num ( wb . SSF ) ; opts . revssf [ wb . SSF [ 65535 ] ] = 0 ;
2017-05-09 18:11:15 +00:00
opts . ssf = wb . SSF ;
2014-05-16 00:16:51 +00:00
}
opts . rels = { } ; opts . wbrels = { } ;
opts . Strings = [ ] ; opts . Strings . Count = 0 ; opts . Strings . Unique = 0 ;
2018-06-22 21:40:52 +00:00
if ( browser _has _Map ) opts . revStrings = new Map ( ) ;
else { opts . revStrings = { } ; opts . revStrings . foo = [ ] ; delete opts . revStrings . foo ; }
2014-05-16 00:16:51 +00:00
var wbext = opts . bookType == "xlsb" ? "bin" : "xml" ;
2017-12-30 05:41:41 +00:00
var vbafmt = VBAFMTS . indexOf ( opts . bookType ) > - 1 ;
2017-07-28 23:54:51 +00:00
var ct = new _ct ( ) ;
2014-05-16 00:16:51 +00:00
fix _write _opts ( opts = opts || { } ) ;
2017-02-11 01:58:22 +00:00
var zip = new jszip ( ) ;
2014-05-16 00:16:51 +00:00
var f = "" , rId = 0 ;
opts . cellXfs = [ ] ;
2014-05-22 12:09:29 +00:00
get _cell _style ( opts . cellXfs , { } , { revssf : { "General" : 0 } } ) ;
2014-05-16 00:16:51 +00:00
2017-02-11 01:58:22 +00:00
if ( ! wb . Props ) wb . Props = { } ;
2014-05-16 00:16:51 +00:00
f = "docProps/core.xml" ;
zip . file ( f , write _core _props ( wb . Props , opts ) ) ;
ct . coreprops . push ( f ) ;
2014-05-22 12:09:29 +00:00
add _rels ( opts . rels , 2 , f , RELS . CORE _PROPS ) ;
2014-05-16 00:16:51 +00:00
2017-03-13 07:34:05 +00:00
f = "docProps/app.xml" ;
2017-05-09 18:11:15 +00:00
if ( wb . Props && wb . Props . SheetNames ) { /* empty */ }
2017-04-03 06:04:35 +00:00
else if ( ! wb . Workbook || ! wb . Workbook . Sheets ) wb . Props . SheetNames = wb . SheetNames ;
2018-02-28 09:58:43 +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 21:50:32 +00:00
wb . Props . Worksheets = wb . Props . SheetNames . length ;
2014-05-16 00:16:51 +00:00
zip . file ( f , write _ext _props ( wb . Props , opts ) ) ;
ct . extprops . push ( f ) ;
2014-05-22 12:09:29 +00:00
add _rels ( opts . rels , 3 , f , RELS . EXT _PROPS ) ;
2014-05-16 00:16:51 +00:00
2014-05-29 22:32:13 +00:00
if ( wb . Custprops !== wb . Props && keys ( wb . Custprops || { } ) . length > 0 ) {
2014-05-16 00:16:51 +00:00
f = "docProps/custom.xml" ;
zip . file ( f , write _cust _props ( wb . Custprops , opts ) ) ;
ct . custprops . push ( f ) ;
2014-05-22 12:09:29 +00:00
add _rels ( opts . rels , 4 , f , RELS . CUST _PROPS ) ;
2014-05-16 00:16:51 +00:00
}
2014-06-29 18:35:10 +00:00
for ( rId = 1 ; rId <= wb . SheetNames . length ; ++ rId ) {
2017-03-31 21:50:32 +00:00
var wsrels = { '!id' : { } } ;
2017-04-03 06:04:35 +00:00
var ws = wb . Sheets [ wb . SheetNames [ rId - 1 ] ] ;
2017-04-09 04:07:43 +00:00
var _type = ( ws || { } ) [ "!type" ] || "sheet" ;
switch ( _type ) {
case "chart" : / *
f = "xl/chartsheets/sheet" + rId + "." + wbext ;
zip . file ( f , write _cs ( rId - 1 , f , opts , wb , wsrels ) ) ;
ct . charts . push ( f ) ;
add _rels ( wsrels , - 1 , "chartsheets/sheet" + rId + "." + wbext , RELS . CS ) ;
break ; * /
/* falls through */
default :
f = "xl/worksheets/sheet" + rId + "." + wbext ;
zip . file ( f , write _ws ( rId - 1 , f , opts , wb , wsrels ) ) ;
ct . sheets . push ( f ) ;
add _rels ( opts . wbrels , - 1 , "worksheets/sheet" + rId + "." + wbext , RELS . WS [ 0 ] ) ;
}
2017-04-03 06:04:35 +00:00
if ( ws ) {
var comments = ws [ '!comments' ] ;
if ( comments && comments . length > 0 ) {
var cf = "xl/comments" + rId + "." + wbext ;
zip . file ( cf , write _cmnt ( comments , cf , opts ) ) ;
ct . comments . push ( cf ) ;
add _rels ( wsrels , - 1 , "../comments" + rId + "." + wbext , RELS . CMNT ) ;
}
if ( ws [ '!legacy' ] ) {
zip . file ( "xl/drawings/vmlDrawing" + ( rId ) + ".vml" , write _comments _vml ( rId , ws [ '!comments' ] ) ) ;
}
delete ws [ '!comments' ] ;
delete ws [ '!legacy' ] ;
}
2017-04-09 04:07:43 +00:00
if ( wsrels [ '!id' ] . rId1 ) zip . file ( get _rels _path ( f ) , write _rels ( wsrels ) ) ;
2014-06-29 18:35:10 +00:00
}
2014-05-16 00:16:51 +00:00
2014-06-29 18:35:10 +00:00
if ( opts . Strings != null && opts . Strings . length > 0 ) {
2014-05-16 00:16:51 +00:00
f = "xl/sharedStrings." + wbext ;
zip . file ( f , write _sst ( opts . Strings , f , opts ) ) ;
ct . strs . push ( f ) ;
2017-04-03 06:04:35 +00:00
add _rels ( opts . wbrels , - 1 , "sharedStrings." + wbext , RELS . SST ) ;
2014-05-16 00:16:51 +00:00
}
2018-06-22 21:40:52 +00:00
f = "xl/workbook." + wbext ;
zip . file ( f , write _wb ( wb , f , opts ) ) ;
ct . workbooks . push ( f ) ;
add _rels ( opts . rels , 1 , f , RELS . WB ) ;
2014-05-16 00:16:51 +00:00
/* TODO: something more intelligent with themes */
2014-05-16 03:03:55 +00:00
2014-05-22 12:09:29 +00:00
f = "xl/theme/theme1.xml" ;
2017-03-20 21:57:44 +00:00
zip . file ( f , write _theme ( wb . Themes , opts ) ) ;
2014-05-16 00:16:51 +00:00
ct . themes . push ( f ) ;
2017-04-03 06:04:35 +00:00
add _rels ( opts . wbrels , - 1 , "theme/theme1.xml" , RELS . THEME ) ;
2014-05-16 00:16:51 +00:00
/* TODO: something more intelligent with styles */
2014-05-29 22:32:13 +00:00
f = "xl/styles." + wbext ;
2014-05-16 00:16:51 +00:00
zip . file ( f , write _sty ( wb , f , opts ) ) ;
ct . styles . push ( f ) ;
2017-04-03 06:04:35 +00:00
add _rels ( opts . wbrels , - 1 , "styles." + wbext , RELS . STY ) ;
2014-05-16 00:16:51 +00:00
2017-03-28 22:07:46 +00:00
if ( wb . vbaraw && vbafmt ) {
f = "xl/vbaProject.bin" ;
zip . file ( f , wb . vbaraw ) ;
ct . vba . push ( f ) ;
2017-04-03 06:04:35 +00:00
add _rels ( opts . wbrels , - 1 , "vbaProject.bin" , RELS . VBA ) ;
2017-03-28 22:07:46 +00:00
}
2014-05-16 00:16:51 +00:00
zip . file ( "[Content_Types].xml" , write _ct ( ct , opts ) ) ;
2017-04-09 04:07:43 +00:00
zip . file ( '_rels/.rels' , write _rels ( opts . rels ) ) ;
zip . file ( 'xl/_rels/workbook.' + wbext + '.rels' , write _rels ( opts . wbrels ) ) ;
2017-05-09 18:11:15 +00:00
delete opts . revssf ; delete opts . ssf ;
2014-05-16 00:16:51 +00:00
return zip ;
}
2015-04-02 22:14:07 +00:00
function firstbyte ( f , o ) {
2017-03-23 01:56:21 +00:00
var x = "" ;
2015-04-02 22:14:07 +00:00
switch ( ( o || { } ) . type || "base64" ) {
2017-03-23 01:56:21 +00:00
case 'buffer' : return [ f [ 0 ] , f [ 1 ] , f [ 2 ] , f [ 3 ] ] ;
2018-01-23 09:09:53 +00:00
case 'base64' : x = Base64 . decode ( f . slice ( 0 , 24 ) ) ; break ;
2017-03-23 01:56:21 +00:00
case 'binary' : x = f ; break ;
case 'array' : return [ f [ 0 ] , f [ 1 ] , f [ 2 ] , f [ 3 ] ] ;
2017-07-28 23:54:51 +00:00
default : throw new Error ( "Unrecognized type " + ( o && o . type || "undefined" ) ) ;
2015-04-02 22:14:07 +00:00
}
2017-03-23 01:56:21 +00:00
return [ x . charCodeAt ( 0 ) , x . charCodeAt ( 1 ) , x . charCodeAt ( 2 ) , x . charCodeAt ( 3 ) ] ;
2015-04-02 22:14:07 +00:00
}
2017-04-16 07:35:56 +00:00
function read _cfb ( cfb , opts ) {
2017-08-10 23:55:45 +00:00
if ( CFB . find ( cfb , "EncryptedPackage" ) ) return parse _xlsxcfb ( cfb , opts ) ;
2017-04-16 07:35:56 +00:00
return parse _xlscfb ( cfb , opts ) ;
}
2015-04-02 22:14:07 +00:00
function read _zip ( data , opts ) {
2017-02-11 01:58:22 +00:00
var zip , d = data ;
2014-05-16 00:16:51 +00:00
var o = opts || { } ;
2014-07-28 15:32:28 +00:00
if ( ! o . type ) o . type = ( has _buf && Buffer . isBuffer ( data ) ) ? "buffer" : "base64" ;
2014-05-16 00:16:51 +00:00
switch ( o . type ) {
2012-12-03 19:47:44 +00:00
case "base64" : zip = new jszip ( d , { base64 : true } ) ; break ;
2015-04-02 22:14:07 +00:00
case "binary" : case "array" : zip = new jszip ( d , { base64 : false } ) ; break ;
2014-05-16 00:16:51 +00:00
case "buffer" : zip = new jszip ( d ) ; break ;
default : throw new Error ( "Unrecognized type " + o . type ) ;
2012-12-03 19:47:44 +00:00
}
2014-05-16 00:16:51 +00:00
return parse _zip ( zip , o ) ;
2012-12-03 19:47:44 +00:00
}
2017-07-28 23:54:51 +00:00
function read _plaintext ( data , o ) {
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 , o ) {
var str = "" , bytes = firstbyte ( data , o ) ;
switch ( o . type ) {
case 'base64' : str = Base64 . decode ( data ) ; break ;
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 ) ;
return read _plaintext ( str , o ) ;
}
2017-04-03 06:04:35 +00:00
function read _utf16 ( data , o ) {
var d = data ;
if ( o . type == 'base64' ) d = Base64 . decode ( d ) ;
2017-07-28 23:54:51 +00:00
d = cptable . utils . decode ( 1200 , d . slice ( 2 ) , 'str' ) ;
2017-04-03 06:04:35 +00:00
o . type = "binary" ;
2017-07-28 23:54:51 +00:00
return read _plaintext ( d , o ) ;
2017-04-03 06:04:35 +00:00
}
2017-09-30 06:19:01 +00:00
function bstrify ( data ) {
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 ) ;
}
2015-04-02 22:14:07 +00:00
function readSync ( data , opts ) {
2017-12-30 05:41:41 +00:00
reset _cp ( ) ;
if ( typeof ArrayBuffer !== 'undefined' && data instanceof ArrayBuffer ) return readSync ( new Uint8Array ( data ) , opts ) ;
var d = data , n = [ 0 , 0 , 0 , 0 ] , str = false ;
2015-04-02 22:14:07 +00:00
var o = opts || { } ;
2017-04-30 16:28:24 +00:00
_ssfopts = { } ;
if ( o . dateNF ) _ssfopts . dateNF = o . dateNF ;
2015-04-02 22:14:07 +00:00
if ( ! o . type ) o . type = ( has _buf && Buffer . isBuffer ( data ) ) ? "buffer" : "base64" ;
2018-02-08 19:13:10 +00:00
if ( o . type == "file" ) { o . type = has _buf ? "buffer" : "binary" ; d = read _binary ( data ) ; }
2018-05-20 03:03:23 +00:00
if ( o . type == "string" ) { str = true ; o . type = "binary" ; o . codepage = 65001 ; d = bstrify ( data ) ; }
2018-01-23 09:09:53 +00:00
if ( o . type == 'array' && typeof Uint8Array !== 'undefined' && data instanceof Uint8Array && typeof ArrayBuffer !== 'undefined' ) {
// $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-23 01:56:21 +00:00
switch ( ( n = firstbyte ( d , o ) ) [ 0 ] ) {
2017-04-16 07:35:56 +00:00
case 0xD0 : return read _cfb ( CFB . read ( d , o ) , o ) ;
2017-08-19 23:13:21 +00:00
case 0x09 : return parse _xlscfb ( d , o ) ;
2015-04-02 22:14:07 +00:00
case 0x3C : return parse _xlml ( d , o ) ;
2017-10-17 00:36:51 +00:00
case 0x49 : if ( n [ 1 ] === 0x44 ) return read _wb _ID ( d , o ) ; break ;
case 0x54 : if ( n [ 1 ] === 0x41 && n [ 2 ] === 0x42 && n [ 3 ] === 0x4C ) return DIF . to _workbook ( d , o ) ; break ;
2018-03-06 01:09:57 +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:36:51 +00:00
case 0xEF : return n [ 3 ] === 0x3C ? parse _xlml ( d , o ) : read _prn ( data , d , o , str ) ;
case 0xFF : if ( n [ 1 ] === 0xFE ) { return read _utf16 ( d , o ) ; } break ;
case 0x00 : if ( n [ 1 ] === 0x00 && n [ 2 ] >= 0x02 && n [ 3 ] === 0x00 ) return WK _ . to _workbook ( d , o ) ; break ;
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-28 23:54:51 +00:00
case 0x0A : case 0x0D : case 0x20 : return read _plaintext _raw ( d , o ) ;
2015-04-02 22:14:07 +00:00
}
2017-04-03 06:04:35 +00:00
if ( n [ 2 ] <= 12 && n [ 3 ] <= 31 ) return DBF . to _workbook ( d , o ) ;
2017-09-30 06:19:01 +00:00
return read _prn ( data , d , o , str ) ;
2015-04-02 22:14:07 +00:00
}
2017-02-11 01:58:22 +00:00
function readFileSync ( filename , opts ) {
2014-05-16 00:16:51 +00:00
var o = opts || { } ; o . type = 'file' ;
2017-02-11 01:58:22 +00:00
return readSync ( filename , o ) ;
2012-12-03 19:47:44 +00:00
}
2018-06-22 21:40:52 +00:00
function write _cfb _ctr ( cfb , o ) {
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 ) ;
}
/*global encrypt_agile */
2015-04-02 22:14:07 +00:00
function write _zip _type ( wb , opts ) {
2014-05-16 00:16:51 +00:00
var o = opts || { } ;
var z = write _zip ( wb , o ) ;
2017-02-04 00:14:24 +00:00
var oopts = { } ;
2017-02-11 01:58:22 +00:00
if ( o . compression ) oopts . compression = 'DEFLATE' ;
2018-06-22 21:40:52 +00:00
if ( o . password ) oopts . type = has _buf ? "nodebuffer" : "string" ;
else switch ( o . type ) {
2017-02-04 00:14:24 +00:00
case "base64" : oopts . type = "base64" ; break ;
case "binary" : oopts . type = "string" ; break ;
2018-02-03 20:43:07 +00:00
case "string" : throw new Error ( "'string' output type invalid for '" + o . bookType + "' files" ) ;
2017-02-04 00:14:24 +00:00
case "buffer" :
2018-02-03 20:43:07 +00:00
case "file" : oopts . type = has _buf ? "nodebuffer" : "string" ; break ;
2014-05-16 00:16:51 +00:00
default : throw new Error ( "Unrecognized type " + o . type ) ;
}
2017-09-30 06:19:01 +00:00
var out = z . generate ( oopts ) ;
2018-06-22 21:40:52 +00:00
if ( o . password && typeof encrypt _agile !== 'undefined' ) return write _cfb _ctr ( encrypt _agile ( out , o . password ) , o ) ;
if ( o . type === "file" ) return write _dl ( o . file , out ) ;
2017-09-30 06:19:01 +00:00
return o . type == "string" ? utf8read ( out ) : out ;
2014-05-16 00:16:51 +00:00
}
2017-09-22 22:40:09 +00:00
function write _cfb _type ( wb , opts ) {
var o = opts || { } ;
var cfb = write _xlscfb ( wb , o ) ;
2018-06-22 21:40:52 +00:00
return write _cfb _ctr ( cfb , o ) ;
2017-09-22 22:40:09 +00:00
}
2017-09-30 06:19:01 +00:00
function write _string _type ( out , opts , bom ) {
if ( ! bom ) bom = "" ;
var o = bom + out ;
2017-04-03 06:04:35 +00:00
switch ( opts . type ) {
2017-09-30 06:19:01 +00:00
case "base64" : return Base64 . encode ( utf8write ( o ) ) ;
case "binary" : return utf8write ( o ) ;
case "string" : return out ;
2018-02-03 20:43:07 +00:00
case "file" : return write _dl ( opts . file , o , 'utf8' ) ;
2017-04-03 06:04:35 +00:00
case "buffer" : {
2018-07-09 07:07:59 +00:00
// $FlowIgnore
if ( has _buf ) return Buffer _from ( o , 'utf8' ) ;
2017-09-30 06:19:01 +00:00
else return write _string _type ( o , { type : 'binary' } ) . split ( "" ) . map ( function ( c ) { return c . charCodeAt ( 0 ) ; } ) ;
2017-04-03 06:04:35 +00:00
}
}
throw new Error ( "Unrecognized type " + opts . type ) ;
}
2017-09-30 06:19:01 +00:00
function write _stxt _type ( out , opts ) {
2017-02-22 07:48:52 +00:00
switch ( opts . type ) {
2017-02-24 11:14:53 +00:00
case "base64" : return Base64 . encode ( out ) ;
case "binary" : return out ;
2017-09-30 06:19:01 +00:00
case "string" : return out ; /* override in sheet_to_txt */
2018-02-03 20:43:07 +00:00
case "file" : return write _dl ( opts . file , out , 'binary' ) ;
2017-02-24 11:14:53 +00:00
case "buffer" : {
2018-07-09 07:07:59 +00:00
// $FlowIgnore
if ( has _buf ) return Buffer _from ( out , 'binary' ) ;
2017-02-24 11:14:53 +00:00
else return out . split ( "" ) . map ( function ( c ) { return c . charCodeAt ( 0 ) ; } ) ;
2017-03-13 07:34:05 +00:00
}
2017-02-22 07:48:52 +00:00
}
2017-03-13 07:34:05 +00:00
throw new Error ( "Unrecognized type " + opts . type ) ;
2017-02-22 07:48:52 +00:00
}
2017-02-24 11:14:53 +00:00
/* TODO: test consistency */
2017-02-22 07:48:52 +00:00
function write _binary _type ( out , opts ) {
switch ( opts . type ) {
2017-09-30 06:19:01 +00:00
case "string" :
2017-02-24 11:14:53 +00:00
case "base64" :
2017-02-22 07:48:52 +00:00
case "binary" :
var bstr = "" ;
2017-11-20 02:13:37 +00:00
// $FlowIgnore
2017-02-22 07:48:52 +00:00
for ( var i = 0 ; i < out . length ; ++ i ) bstr += String . fromCharCode ( out [ i ] ) ;
2017-09-30 06:19:01 +00:00
return opts . type == 'base64' ? Base64 . encode ( bstr ) : opts . type == 'string' ? utf8read ( bstr ) : bstr ;
2018-02-03 20:43:07 +00:00
case "file" : return write _dl ( opts . file , out ) ;
2017-02-22 07:48:52 +00:00
case "buffer" : return out ;
default : throw new Error ( "Unrecognized type " + opts . type ) ;
}
}
2015-04-02 22:14:07 +00:00
function writeSync ( wb , opts ) {
2017-03-11 00:01:58 +00:00
check _wb ( wb ) ;
2015-04-02 22:14:07 +00:00
var o = opts || { } ;
2017-12-30 05:41:41 +00:00
if ( o . type == "array" ) { o . type = "binary" ; var out = ( writeSync ( wb , o ) ) ; o . type = "array" ; return s2ab ( out ) ; }
2017-04-03 06:04:35 +00:00
switch ( o . bookType || 'xlsb' ) {
2017-03-16 04:39:50 +00:00
case 'xml' :
case 'xlml' : return write _string _type ( write _xlml ( wb , o ) , o ) ;
2017-04-03 06:04:35 +00:00
case 'slk' :
case 'sylk' : return write _string _type ( write _slk _str ( wb , o ) , o ) ;
2018-02-08 19:13:10 +00:00
case 'htm' :
2017-04-16 07:35:56 +00:00
case 'html' : return write _string _type ( write _htm _str ( wb , o ) , o ) ;
2017-09-30 06:19:01 +00:00
case 'txt' : return write _stxt _type ( write _txt _str ( wb , o ) , o ) ;
case 'csv' : return write _string _type ( write _csv _str ( wb , o ) , o , "\ufeff" ) ;
2017-04-03 06:04:35 +00:00
case 'dif' : return write _string _type ( write _dif _str ( wb , o ) , o ) ;
2017-10-27 19:55:07 +00:00
case 'dbf' : return write _binary _type ( write _dbf _buf ( wb , o ) , o ) ;
2017-04-03 06:04:35 +00:00
case 'prn' : return write _string _type ( write _prn _str ( wb , o ) , o ) ;
2017-08-05 06:58:40 +00:00
case 'rtf' : return write _string _type ( write _rtf _str ( wb , o ) , o ) ;
2017-12-04 05:21:43 +00:00
case 'eth' : return write _string _type ( write _eth _str ( wb , o ) , o ) ;
2017-02-22 07:48:52 +00:00
case 'fods' : return write _string _type ( write _ods ( wb , o ) , o ) ;
2017-09-30 06:19:01 +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:40:09 +00:00
case 'biff4' : if ( ! o . biff ) o . biff = 4 ; return write _binary _type ( write _biff _buf ( wb , o ) , o ) ;
2017-10-27 19:55:07 +00:00
case 'biff5' : if ( ! o . biff ) o . biff = 5 ; /* falls through */
2017-09-22 22:40:09 +00:00
case 'biff8' :
2017-12-30 05:41:41 +00:00
case 'xla' :
2017-09-22 22:40:09 +00:00
case 'xls' : if ( ! o . biff ) o . biff = 8 ; return write _cfb _type ( wb , o ) ;
2017-02-24 11:14:53 +00:00
case 'xlsx' :
case 'xlsm' :
2017-12-30 05:41:41 +00:00
case 'xlam' :
2017-02-24 11:14:53 +00:00
case 'xlsb' :
case 'ods' : return write _zip _type ( wb , o ) ;
default : throw new Error ( "Unrecognized bookType |" + o . bookType + "|" ) ;
2015-04-02 22:14:07 +00:00
}
}
2017-10-27 19:55:07 +00:00
function resolve _book _type ( o ) {
if ( o . bookType ) return ;
var _BT = {
"xls" : "biff8" ,
"htm" : "html" ,
"slk" : "sylk" ,
2017-12-04 05:21:43 +00:00
"socialcalc" : "eth" ,
2017-10-27 19:55:07 +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 22:38:26 +00:00
}
function writeFileSync ( wb , filename , opts ) {
var o = opts || { } ; o . type = 'file' ;
o . file = filename ;
resolve _book _type ( o ) ;
2014-05-16 00:16:51 +00:00
return writeSync ( wb , o ) ;
}
2017-03-25 22:38:26 +00:00
function writeFileAsync ( filename , wb , opts , cb ) {
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 ) ;
return _fs . writeFile ( filename , writeSync ( wb , o ) , _cb ) ;
}
2018-07-09 07:07:59 +00:00
function make _json _row ( sheet , r , R , cols , header , hdr , dense , o ) {
var rr = encode _row ( R ) ;
var defval = o . defval , raw = o . raw ;
var isempty = true ;
var row = ( 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 ;
case 'e' : v = void 0 ; break ;
case 's' : case 'd' : case 'b' : case 'n' : break ;
default : throw new Error ( 'unrecognized type ' + val . t ) ;
}
if ( hdr [ C ] != null ) {
if ( v == null ) {
if ( defval !== undefined ) row [ hdr [ C ] ] = defval ;
else if ( raw && v === null ) row [ hdr [ C ] ] = null ;
else continue ;
} else {
row [ hdr [ C ] ] = raw ? v : format _cell ( val , v , o ) ;
}
if ( v != null ) isempty = false ;
}
}
return { row : row , isempty : isempty } ;
}
2017-08-10 23:55:45 +00:00
function sheet _to _json ( sheet , opts ) {
2017-04-09 04:07:43 +00:00
if ( sheet == null || sheet [ "!ref" ] == null ) return [ ] ;
2018-07-09 07:07:59 +00:00
var val = { t : 'n' , v : 0 } , header = 0 , offset = 1 , hdr = [ ] , v = 0 , vv = "" ;
2017-04-09 04:07:43 +00:00
var r = { s : { r : 0 , c : 0 } , e : { r : 0 , c : 0 } } ;
2017-08-10 23:55:45 +00:00
var o = opts || { } ;
2017-04-09 04:07:43 +00:00
var range = o . range != null ? o . range : sheet [ "!ref" ] ;
2014-06-29 18:35:10 +00:00
if ( o . header === 1 ) header = 1 ;
else if ( o . header === "A" ) header = 2 ;
else if ( Array . isArray ( o . header ) ) header = 3 ;
2014-05-29 22:32:13 +00:00
switch ( typeof range ) {
2014-06-29 18:35:10 +00:00
case 'string' : r = safe _decode _range ( range ) ; break ;
case 'number' : r = safe _decode _range ( sheet [ "!ref" ] ) ; r . s . r = range ; break ;
2014-05-29 22:32:13 +00:00
default : r = range ;
}
2014-06-29 18:35:10 +00:00
if ( header > 0 ) offset = 0 ;
var rr = encode _row ( r . s . r ) ;
2017-08-10 23:55:45 +00:00
var cols = [ ] ;
var out = [ ] ;
2017-04-09 04:07:43 +00:00
var outi = 0 , counter = 0 ;
var dense = Array . isArray ( sheet ) ;
var R = r . s . r , C = 0 , CC = 0 ;
2017-05-11 18:57:52 +00:00
if ( dense && ! sheet [ R ] ) sheet [ R ] = [ ] ;
2014-06-29 18:35:10 +00:00
for ( C = r . s . c ; C <= r . e . c ; ++ C ) {
cols [ C ] = encode _col ( C ) ;
2017-04-09 04:07:43 +00:00
val = dense ? sheet [ R ] [ C ] : sheet [ cols [ C ] + rr ] ;
2014-06-29 18:35:10 +00:00
switch ( header ) {
2017-04-30 16:28:24 +00:00
case 1 : hdr [ C ] = C - r . s . c ; break ;
2014-06-29 18:35:10 +00:00
case 2 : hdr [ C ] = cols [ C ] ; break ;
case 3 : hdr [ C ] = o . header [ C - r . s . c ] ; break ;
default :
2017-12-25 02:44:14 +00:00
if ( val == null ) val = { w : "__EMPTY" , t : "s" } ;
2017-03-25 22:38:26 +00:00
vv = v = format _cell ( val , null , o ) ;
2017-04-09 04:07:43 +00:00
counter = 0 ;
for ( CC = 0 ; CC < hdr . length ; ++ CC ) if ( hdr [ CC ] == vv ) vv = v + "_" + ( ++ counter ) ;
2017-03-11 00:01:58 +00:00
hdr [ C ] = vv ;
2014-06-29 18:35:10 +00:00
}
2014-01-23 06:21:21 +00:00
}
2014-05-29 22:32:13 +00:00
for ( R = r . s . r + offset ; R <= r . e . r ; ++ R ) {
2018-07-09 07:07:59 +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 ;
2012-12-03 19:47:44 +00:00
}
2014-07-28 15:32:28 +00:00
out . length = outi ;
2014-01-23 06:21:21 +00:00
return out ;
2012-12-03 19:47:44 +00:00
}
2017-04-16 07:35:56 +00:00
var qreg = /"/g ;
function make _csv _row ( sheet , r , R , cols , fs , rs , FS , o ) {
var isempty = true ;
2017-08-05 06:58:40 +00:00
var row = [ ] , txt = "" , rr = encode _row ( R ) ;
2017-04-16 07:35:56 +00:00
for ( var C = r . s . c ; C <= r . e . c ; ++ C ) {
2017-08-05 06:58:40 +00:00
if ( ! cols [ C ] ) continue ;
2017-04-16 07:35:56 +00:00
var val = o . dense ? ( sheet [ R ] || [ ] ) [ C ] : sheet [ cols [ C ] + rr ] ;
if ( val == null ) txt = "" ;
else if ( val . v != null ) {
isempty = false ;
txt = '' + format _cell ( val , null , o ) ;
2017-05-11 18:57:52 +00:00
for ( var i = 0 , cc = 0 ; i !== txt . length ; ++ i ) if ( ( cc = txt . charCodeAt ( i ) ) === fs || cc === rs || cc === 34 ) { txt = "\"" + txt . replace ( qreg , '""' ) + "\"" ; break ; }
if ( txt == "ID" ) txt = '"ID"' ;
2017-04-16 07:35:56 +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-05 06:58:40 +00:00
row . push ( txt ) ;
2017-04-16 07:35:56 +00:00
}
if ( o . blankrows === false && isempty ) return null ;
2017-08-05 06:58:40 +00:00
return row . join ( FS ) ;
2017-04-16 07:35:56 +00:00
}
2014-01-23 06:21:21 +00:00
function sheet _to _csv ( sheet , opts ) {
2017-04-21 22:03:40 +00:00
var out = [ ] ;
2014-06-29 18:35:10 +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 22:38:26 +00:00
var endregex = new RegExp ( ( FS == "|" ? "\\|" : FS ) + "+$" ) ;
2017-04-16 07:35:56 +00:00
var row = "" , cols = [ ] ;
o . dense = Array . isArray ( sheet ) ;
2017-12-30 05:41:41 +00:00
var colinfo = o . skipHidden && sheet [ "!cols" ] || [ ] ;
var 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 ) ;
2017-04-16 07:35:56 +00:00
for ( var R = r . s . r ; R <= r . e . r ; ++ R ) {
2017-12-30 05:41:41 +00:00
if ( ( rowinfo [ R ] || { } ) . hidden ) continue ;
2017-04-16 07:35:56 +00:00
row = make _csv _row ( sheet , r , R , cols , fs , rs , FS , o ) ;
if ( row == null ) { continue ; }
2017-03-23 01:56:21 +00:00
if ( o . strip ) row = row . replace ( endregex , "" ) ;
2017-04-21 22:03:40 +00:00
out . push ( row + RS ) ;
2012-12-03 19:47:44 +00:00
}
2017-04-16 07:35:56 +00:00
delete o . dense ;
2017-04-21 22:03:40 +00:00
return out . join ( "" ) ;
2012-12-03 19:47:44 +00:00
}
2017-04-09 04:07:43 +00:00
2017-04-03 06:04:35 +00:00
function sheet _to _txt ( sheet , opts ) {
if ( ! opts ) opts = { } ; opts . FS = "\t" ; opts . RS = "\n" ;
var s = sheet _to _csv ( sheet , opts ) ;
2017-09-30 06:19:01 +00:00
if ( typeof cptable == 'undefined' || opts . type == 'string' ) return s ;
var o = cptable . utils . encode ( 1200 , s , 'str' ) ;
2018-02-03 20:43:07 +00:00
return String . fromCharCode ( 255 ) + String . fromCharCode ( 254 ) + o ;
2017-04-03 06:04:35 +00:00
}
2012-12-03 19:47:44 +00:00
2014-06-29 18:35:10 +00:00
function sheet _to _formulae ( sheet ) {
2017-02-19 21:11:48 +00:00
var y = "" , x , val = "" ;
if ( sheet == null || sheet [ "!ref" ] == null ) return [ ] ;
2014-07-28 15:32:28 +00:00
var r = safe _decode _range ( sheet [ '!ref' ] ) , rr = "" , cols = [ ] , C ;
2017-07-05 21:02:14 +00:00
var cmds = [ ] ;
2017-04-09 04:07:43 +00:00
var dense = Array . isArray ( sheet ) ;
2014-07-28 15:32:28 +00:00
for ( C = r . s . c ; C <= r . e . c ; ++ C ) cols [ C ] = encode _col ( C ) ;
2014-06-29 18:35:10 +00:00
for ( var R = r . s . r ; R <= r . e . r ; ++ R ) {
rr = encode _row ( R ) ;
2014-07-28 15:32:28 +00:00
for ( C = r . s . c ; C <= r . e . c ; ++ C ) {
2014-06-29 18:35:10 +00:00
y = cols [ C ] + rr ;
2017-04-09 04:07:43 +00:00
x = dense ? ( sheet [ R ] || [ ] ) [ C ] : sheet [ y ] ;
2014-06-29 18:35:10 +00:00
val = "" ;
if ( x === undefined ) continue ;
2017-02-19 21:11:48 +00:00
else if ( x . F != null ) {
y = x . F ;
if ( ! x . f ) continue ;
val = x . f ;
if ( y . indexOf ( ":" ) == - 1 ) y = y + ":" + y ;
}
2014-06-29 18:35:10 +00:00
if ( x . f != null ) val = x . f ;
2017-03-16 04:39:50 +00:00
else if ( x . t == 'z' ) continue ;
2017-02-19 21:11:48 +00:00
else if ( x . t == 'n' && x . v != null ) val = "" + x . v ;
else if ( x . t == 'b' ) val = x . v ? "TRUE" : "FALSE" ;
2014-06-29 18:35:10 +00:00
else if ( x . w !== undefined ) val = "'" + x . w ;
else if ( x . v === undefined ) continue ;
2017-02-19 21:11:48 +00:00
else if ( x . t == 's' ) val = "'" + x . v ;
2014-06-29 18:35:10 +00:00
else val = "" + x . v ;
2017-07-05 21:02:14 +00:00
cmds [ cmds . length ] = y + "=" + val ;
2014-06-29 18:35:10 +00:00
}
2012-12-03 19:47:44 +00:00
}
return cmds ;
}
2018-01-09 07:40:54 +00:00
function sheet _add _json ( _ws , js , opts ) {
2017-05-11 18:57:52 +00:00
var o = opts || { } ;
2018-01-09 07:40:54 +00:00
var offset = + ! o . skipHeader ;
var ws = _ws || ( { } ) ;
var _R = 0 , _C = 0 ;
if ( ws && o . origin != null ) {
if ( typeof o . origin == 'number' ) _R = o . origin ;
else {
var _origin = typeof o . origin == "string" ? decode _cell ( o . origin ) : o . origin ;
_R = _origin . r ; _C = _origin . c ;
}
}
2017-05-17 04:27:55 +00:00
var cell ;
2018-01-09 07:40:54 +00:00
var range = ( { s : { c : 0 , r : 0 } , e : { c : _C , r : _R + js . length - 1 + offset } } ) ;
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 ) ;
if ( _R == - 1 ) { _R = range . e . r + 1 ; range . e . r = _R + js . length - 1 + offset ; }
}
2017-05-11 18:57:52 +00:00
var hdr = o . header || [ ] , C = 0 ;
2017-10-17 00:36:51 +00:00
js . forEach ( function ( JS , R ) {
2018-02-28 09:58:43 +00:00
keys ( JS ) . forEach ( function ( k ) {
2017-05-11 18:57:52 +00:00
if ( ( C = hdr . indexOf ( k ) ) == - 1 ) hdr [ C = hdr . length ] = k ;
2017-10-17 00:36:51 +00:00
var v = JS [ k ] ;
2017-05-11 18:57:52 +00:00
var t = 'z' ;
2017-05-17 04:27:55 +00:00
var z = "" ;
2018-07-09 07:07:59 +00:00
if ( v && typeof v === 'object' && ! ( v instanceof Date ) ) {
ws [ encode _cell ( { c : _C + C , r : _R + R + offset } ) ] = v ;
} 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 ) ; }
z = o . dateNF || SSF . _table [ 14 ] ;
}
ws [ encode _cell ( { c : _C + C , r : _R + R + offset } ) ] = cell = ( { t : t , v : v } ) ;
if ( z ) cell . z = z ;
2017-05-17 04:27:55 +00:00
}
2017-05-11 18:57:52 +00:00
} ) ;
2017-10-17 00:36:51 +00:00
} ) ;
2018-01-09 07:40:54 +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:57:52 +00:00
ws [ '!ref' ] = encode _range ( range ) ;
return ws ;
}
2018-01-09 07:40:54 +00:00
function json _to _sheet ( js , opts ) { return sheet _add _json ( null , js , opts ) ; }
2017-05-11 18:57:52 +00:00
2014-05-03 18:52:00 +00:00
var utils = {
2012-12-03 19:47:44 +00:00
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 ,
2014-06-29 18:35:10 +00:00
format _cell : format _cell ,
get _formulae : sheet _to _formulae ,
2012-12-03 19:47:44 +00:00
make _csv : sheet _to _csv ,
2014-05-29 22:32:13 +00:00
make _json : sheet _to _json ,
2014-06-29 18:35:10 +00:00
make _formulae : sheet _to _formulae ,
2018-01-09 07:40:54 +00:00
sheet _add _aoa : sheet _add _aoa ,
sheet _add _json : sheet _add _json ,
2017-03-25 22:38:26 +00:00
aoa _to _sheet : aoa _to _sheet ,
2017-05-11 18:57:52 +00:00
json _to _sheet : json _to _sheet ,
2017-03-31 21:50:32 +00:00
table _to _sheet : parse _dom _table ,
table _to _book : table _to _book ,
2014-06-29 18:35:10 +00:00
sheet _to _csv : sheet _to _csv ,
2017-12-01 05:51:31 +00:00
sheet _to _txt : sheet _to _txt ,
2014-05-29 22:32:13 +00:00
sheet _to _json : sheet _to _json ,
2017-05-17 04:27:55 +00:00
sheet _to _html : HTML _ . from _sheet ,
2017-12-04 05:21:43 +00:00
sheet _to _dif : DIF . from _sheet ,
sheet _to _slk : SYLK . from _sheet ,
sheet _to _eth : ETH . from _sheet ,
2014-06-29 18:35:10 +00:00
sheet _to _formulae : sheet _to _formulae ,
2017-03-25 22:38:26 +00:00
sheet _to _row _object _array : sheet _to _json
2012-12-03 19:47:44 +00:00
} ;
2017-05-11 18:57:52 +00:00
( function ( utils ) {
utils . consts = utils . consts || { } ;
2017-05-17 04:27:55 +00:00
function add _consts ( R /*Array<any>*/ ) { R . forEach ( function ( a ) { utils . consts [ a [ 0 ] ] = a [ 1 ] ; } ) ; }
2017-05-11 18:57:52 +00:00
function get _default ( x , y , z ) { return x [ y ] != null ? x [ y ] : ( x [ y ] = z ) ; }
/* get cell, creating a stub if necessary */
function ws _get _cell _stub ( ws , R , C ) {
/* A1 cell address */
if ( typeof R == "string" ) return ws [ R ] || ( ws [ R ] = { t : 'z' } ) ;
/* 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-17 04:27:55 +00:00
return ws _get _cell _stub ( ws , encode _cell ( { r : R , c : C || 0 } ) ) ;
2017-05-11 18:57:52 +00:00
}
/* find sheet index for given name / validate index */
function wb _sheet _idx ( wb , sh ) {
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 */
utils . book _new = function ( ) {
return { SheetNames : [ ] , Sheets : { } } ;
} ;
/* add a worksheet to the end of a given workbook */
utils . book _append _sheet = function ( wb , ws , name ) {
2017-05-17 04:27:55 +00:00
if ( ! name ) for ( var i = 1 ; i <= 0xFFFF ; ++ i ) if ( wb . SheetNames . indexOf ( name = "Sheet" + i ) == - 1 ) break ;
if ( ! name ) throw new Error ( "Too many worksheets" ) ;
2017-05-11 18:57:52 +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 ;
} ;
/* set sheet visibility (visible/hidden/very hidden) */
utils . book _set _sheet _visibility = function ( wb , sh , vis ) {
get _default ( wb , "Workbook" , { } ) ;
get _default ( wb . Workbook , "Sheets" , [ ] ) ;
var idx = wb _sheet _idx ( wb , sh ) ;
2017-05-17 04:27:55 +00:00
// $FlowIgnore
2017-05-11 18:57:52 +00:00
get _default ( wb . Workbook . Sheets , idx , { } ) ;
switch ( vis ) {
case 0 : case 1 : case 2 : break ;
default : throw new Error ( "Bad sheet visibility setting " + vis ) ;
}
2017-05-17 04:27:55 +00:00
// $FlowIgnore
2017-05-11 18:57:52 +00:00
wb . Workbook . Sheets [ idx ] . Hidden = vis ;
} ;
add _consts ( [
[ "SHEET_VISIBLE" , 0 ] ,
[ "SHEET_HIDDEN" , 1 ] ,
[ "SHEET_VERY_HIDDEN" , 2 ]
] ) ;
/* set number format */
utils . cell _set _number _format = function ( cell , fmt ) {
cell . z = fmt ;
return cell ;
} ;
/* set cell hyperlink */
utils . cell _set _hyperlink = function ( cell , target , tooltip ) {
if ( ! target ) {
delete cell . l ;
} else {
2017-05-17 04:27:55 +00:00
cell . l = ( { Target : target } ) ;
2017-05-11 18:57:52 +00:00
if ( tooltip ) cell . l . Tooltip = tooltip ;
}
return cell ;
} ;
2017-12-15 02:01:07 +00:00
utils . cell _set _internal _link = function ( cell , range , tooltip ) { return utils . cell _set _hyperlink ( cell , "#" + range , tooltip ) ; } ;
2017-05-11 18:57:52 +00:00
/* add to cell comments */
utils . cell _add _comment = function ( cell , text , author ) {
if ( ! cell . c ) cell . c = [ ] ;
cell . c . push ( { t : text , a : author || "SheetJS" } ) ;
} ;
/* set array formula and flush related cells */
utils . sheet _set _array _formula = function ( ws , range , formula ) {
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 ;
delete cell . v ;
if ( R == rng . s . r && C == rng . s . c ) cell . f = formula ;
}
return ws ;
} ;
return utils ;
} ) ( utils ) ;
2017-04-09 04:07:43 +00:00
if ( has _buf && typeof require != 'undefined' ) ( function ( ) {
var Readable = require ( 'stream' ) . Readable ;
var write _csv _stream = function ( sheet , opts ) {
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 ) + "+$" ) ;
2017-04-16 07:35:56 +00:00
var row = "" , cols = [ ] ;
o . dense = Array . isArray ( sheet ) ;
2017-12-30 05:41:41 +00:00
var colinfo = o . skipHidden && sheet [ "!cols" ] || [ ] ;
var 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 ) ;
2017-04-16 07:35:56 +00:00
var R = r . s . r ;
2018-03-13 01:55:12 +00:00
var BOM = false ;
2017-04-09 04:07:43 +00:00
stream . _read = function ( ) {
2018-03-13 01:55:12 +00:00
if ( ! BOM ) { BOM = true ; return stream . push ( "\uFEFF" ) ; }
2017-04-09 04:07:43 +00:00
if ( R > r . e . r ) return stream . push ( null ) ;
2017-04-16 07:35:56 +00:00
while ( R <= r . e . r ) {
++ R ;
2017-12-30 05:41:41 +00:00
if ( ( rowinfo [ R - 1 ] || { } ) . hidden ) continue ;
2017-08-05 06:58:40 +00:00
row = make _csv _row ( sheet , r , R - 1 , cols , fs , rs , FS , o ) ;
2017-05-17 04:27:55 +00:00
if ( row != null ) {
if ( o . strip ) row = row . replace ( endregex , "" ) ;
stream . push ( row + RS ) ;
break ;
}
2017-04-09 04:07:43 +00:00
}
} ;
return stream ;
} ;
2017-06-10 01:56:23 +00:00
var write _html _stream = function ( ws , opts ) {
2017-04-16 07:35:56 +00:00
var stream = Readable ( ) ;
2017-06-10 01:56:23 +00:00
var o = opts || { } ;
var header = o . header != null ? o . header : HTML _ . BEGIN ;
var footer = o . footer != null ? o . footer : HTML _ . END ;
stream . push ( header ) ;
var r = decode _range ( ws [ '!ref' ] ) ;
o . dense = Array . isArray ( ws ) ;
stream . push ( HTML _ . _preamble ( ws , r , o ) ) ;
2017-04-16 07:35:56 +00:00
var R = r . s . r ;
var end = false ;
stream . _read = function ( ) {
if ( R > r . e . r ) {
2017-06-10 01:56:23 +00:00
if ( ! end ) { end = true ; stream . push ( "</table>" + footer ) ; }
2017-04-16 07:35:56 +00:00
return stream . push ( null ) ;
}
while ( R <= r . e . r ) {
2017-06-10 01:56:23 +00:00
stream . push ( HTML _ . _row ( ws , r , R , o ) ) ;
2017-04-16 07:35:56 +00:00
++ R ;
break ;
}
} ;
return stream ;
} ;
2017-04-09 04:07:43 +00:00
2018-07-09 07:07:59 +00:00
var write _json _stream = function ( sheet , opts ) {
var stream = Readable ( { objectMode : true } ) ;
if ( sheet == null || sheet [ "!ref" ] == null ) { stream . push ( null ) ; return stream ; }
var val = { t : 'n' , v : 0 } , header = 0 , offset = 1 , hdr = [ ] , 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 = [ ] ;
var counter = 0 ;
var dense = Array . isArray ( sheet ) ;
var R = r . s . r , C = 0 , CC = 0 ;
if ( dense && ! sheet [ R ] ) sheet [ R ] = [ ] ;
for ( C = r . s . c ; C <= r . e . c ; ++ C ) {
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 ) ;
counter = 0 ;
for ( CC = 0 ; CC < hdr . length ; ++ CC ) if ( hdr [ CC ] == vv ) vv = v + "_" + ( ++ counter ) ;
hdr [ C ] = vv ;
}
}
R = r . s . r + offset ;
stream . _read = function ( ) {
if ( R > r . e . r ) return stream . push ( null ) ;
while ( R <= r . e . r ) {
++ R ;
//if ((rowinfo[R-1]||{}).hidden) continue;
var row = make _json _row ( sheet , r , R , cols , header , hdr , dense , o ) ;
if ( ( row . isempty === false ) || ( header === 1 ? o . blankrows !== false : ! ! o . blankrows ) ) {
stream . push ( row . row ) ;
break ;
}
}
} ;
return stream ;
} ;
2017-04-09 04:07:43 +00:00
XLSX . stream = {
2018-07-09 07:07:59 +00:00
to _json : write _json _stream ,
2017-04-16 07:35:56 +00:00
to _html : write _html _stream ,
2017-04-09 04:07:43 +00:00
to _csv : write _csv _stream
} ;
} ) ( ) ;
2017-05-11 18:57:52 +00:00
2015-04-02 22:14:07 +00:00
XLSX . parse _xlscfb = parse _xlscfb ;
2017-03-10 00:36:03 +00:00
XLSX . parse _ods = parse _ods ;
XLSX . parse _fods = parse _fods ;
XLSX . write _ods = write _ods ;
2015-04-02 22:14:07 +00:00
XLSX . parse _zip = parse _zip ;
XLSX . read = readSync ; //xlsread
XLSX . readFile = readFileSync ; //readFile
XLSX . readFileSync = readFileSync ;
2014-05-16 00:16:51 +00:00
XLSX . write = writeSync ;
XLSX . writeFile = writeFileSync ;
2015-04-02 22:14:07 +00:00
XLSX . writeFileSync = writeFileSync ;
2017-03-25 22:38:26 +00:00
XLSX . writeFileAsync = writeFileAsync ;
2014-05-03 18:52:00 +00:00
XLSX . utils = utils ;
2014-04-15 08:24:40 +00:00
XLSX . SSF = SSF ;
2017-11-20 02:13:37 +00:00
XLSX . CFB = CFB ;
2018-06-01 16:34:26 +00:00
}
/*global define */
if ( typeof exports !== 'undefined' ) make _xlsx _lib ( exports ) ;
else if ( typeof module !== 'undefined' && module . exports ) make _xlsx _lib ( module . exports ) ;
else if ( typeof define === 'function' && define . amd ) define ( 'xlsx' , function ( ) { if ( ! XLSX . version ) make _xlsx _lib ( XLSX ) ; return XLSX ; } ) ;
else make _xlsx _lib ( XLSX ) ;
2017-12-30 05:41:41 +00:00
/*exported XLS, ODS */
var XLS = XLSX , ODS = XLSX ;