diff --git a/.npmignore b/.npmignore index 3f10ac230a16680db839c7d42a42e4ce5a34f71e..dfb5f49b40d57c5affc20e601d96a4fc43af0be1 100644 --- a/.npmignore +++ b/.npmignore @@ -31,6 +31,7 @@ tmp *.exe *.img .gitignore +.gitattributes .fossaignore .spelling .eslintrc diff --git a/.travis.yml b/.travis.yml index fa7077670e404c05f7586853c0487ef702921b46..f2809b7b18ae088ac223e283af9a6311c6f79c27 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,5 +1,6 @@ language: node_js node_js: + - "9" - "8" - "7" - "6" @@ -9,16 +10,18 @@ matrix: env: TZ="America/New_York" FMTS=misc - node_js: "8" env: TZ="America/Los_Angeles" - - node_js: "6" - env: TZ="Europe/London" FMTS=misc - node_js: "8" + env: TZ="Europe/London" FMTS=misc + - node_js: "6" env: TZ="Europe/Berlin" - node_js: "6" env: TZ="Asia/Kolkata" FMTS=misc - - node_js: "7" + - node_js: "9" env: TZ="Asia/Shanghai" - node_js: "8" env: TZ="Asia/Seoul" FMTS=misc + - node_js: "7" + env: TZ="America/Cancun" FMTS=misc - node_js: "5" env: TZ="America/Anchorage" FMTS=misc diff --git a/README.md b/README.md index 25f7fbc340aa874ab8969c3a9fe0b428250de97f..9fbbbacbd06fb0a20f225d1bad4a2008b374d697 100644 --- a/README.md +++ b/README.md @@ -188,7 +188,7 @@ The [`demos` directory](demos/) includes sample projects for: **Frameworks and APIs** - [`angular 1.x`](demos/angular/) -- [`angular 2.x / 4.x`](demos/angular2/) +- [`angular 2.x / 4.x / 5.x`](demos/angular2/) - [`meteor`](demos/meteor/) - [`react and react-native`](demos/react/) - [`vue 2.x and weex`](demos/vue/) diff --git a/bits/01_version.js b/bits/01_version.js index ecd864311aea808ab795e99c61917c3bd415e556..afcc55debe78577a6955deafee383be3e1cb059a 100644 --- a/bits/01_version.js +++ b/bits/01_version.js @@ -1 +1 @@ -XLSX.version = '0.11.7'; +XLSX.version = '0.11.8'; diff --git a/bits/18_cfb.js b/bits/18_cfb.js index c46d5ab203fd8b9d13a2fa51e994dd6107d0f68f..91909335dff57157fce9d75f61b0ee33c5dbe14a 100644 --- a/bits/18_cfb.js +++ b/bits/18_cfb.js @@ -38,7 +38,7 @@ type CFBFiles = {[n:string]:CFBEntry}; /* [MS-CFB] v20130118 */ var CFB = (function _CFB(){ var exports/*:CFBModule*/ = /*::(*/{}/*:: :any)*/; -exports.version = '0.13.2'; +exports.version = '1.0.0'; /* [MS-CFB] 2.6.4 */ function namecmp(l/*:string*/, r/*:string*/)/*:number*/ { var L = l.split("/"), R = r.split("/"); @@ -141,16 +141,15 @@ sector_list.fat_addrs = fat_addrs; sector_list.ssz = ssz; /* [MS-CFB] 2.6.1 Compound File Directory Entry */ -var files/*:CFBFiles*/ = {}, Paths/*:Array*/ = [], FileIndex/*:CFBFileIndex*/ = [], FullPaths/*:Array*/ = [], FullPathDir = {}; -read_directory(dir_start, sector_list, sectors, Paths, nmfs, files, FileIndex); +var files/*:CFBFiles*/ = {}, Paths/*:Array*/ = [], FileIndex/*:CFBFileIndex*/ = [], FullPaths/*:Array*/ = []; +read_directory(dir_start, sector_list, sectors, Paths, nmfs, files, FileIndex, minifat_start); -build_full_paths(FileIndex, FullPathDir, FullPaths, Paths); +build_full_paths(FileIndex, FullPaths, Paths); Paths.shift(); var o = { FileIndex: FileIndex, - FullPaths: FullPaths, - FullPathDir: FullPathDir + FullPaths: FullPaths }; // $FlowIgnore @@ -202,7 +201,7 @@ function sectorify(file/*:RawBytes*/, ssz/*:number*/)/*:Array*/ { } /* [MS-CFB] 2.6.4 Red-Black Tree */ -function build_full_paths(FI/*:CFBFileIndex*/, FPD/*:CFBFullPathDir*/, FP/*:Array*/, Paths/*:Array*/)/*:void*/ { +function build_full_paths(FI/*:CFBFileIndex*/, FP/*:Array*/, Paths/*:Array*/)/*:void*/ { var i = 0, L = 0, R = 0, C = 0, j = 0, pl = Paths.length; var dad/*:Array*/ = [], q/*:Array*/ = []; @@ -238,10 +237,23 @@ function build_full_paths(FI/*:CFBFileIndex*/, FPD/*:CFBFullPathDir*/, FP/*:Arra FP[0] += "/"; for(i=1; i < pl; ++i) { if(FI[i].type !== 2 /* stream */) FP[i] += "/"; - FPD[FP[i]] = FI[i]; } } +function get_mfat_entry(entry/*:CFBEntry*/, payload/*:RawBytes*/, mini/*:?RawBytes*/)/*:CFBlob*/ { + var start = entry.start, size = entry.size; + //return (payload.slice(start*MSSZ, start*MSSZ + size)/*:any*/); + var o = []; + var idx = start; + while(mini && size > 0 && idx >= 0) { + o.push(payload.slice(idx * MSSZ, idx * MSSZ + MSSZ)); + size -= MSSZ; + idx = __readInt32LE(mini, idx * 4); + } + if(o.length === 0) return (new_buf(0)/*:any*/); + return (bconcat(o).slice(0, entry.size)/*:any*/); +} + /** Chase down the rest of the DIFAT chain to build a comprehensive list DIFAT chains by storing the next sector number as the last 32 bits */ function sleuth_fat(idx/*:number*/, cnt/*:number*/, sectors/*:Array*/, ssz/*:number*/, fat_addrs)/*:void*/ { @@ -303,7 +315,7 @@ function make_sector_list(sectors/*:Array*/, dir_start/*:number*/, fat } /* [MS-CFB] 2.6.1 Compound File Directory Entry */ -function read_directory(dir_start/*:number*/, sector_list/*:SectorList*/, sectors/*:Array*/, Paths/*:Array*/, nmfs, files, FileIndex) { +function read_directory(dir_start/*:number*/, sector_list/*:SectorList*/, sectors/*:Array*/, Paths/*:Array*/, nmfs, files, FileIndex, mini) { var minifat_store = 0, pl = (Paths.length?2:0); var sector = sector_list[dir_start].data; var i = 0, namelen = 0, name; @@ -345,7 +357,7 @@ function read_directory(dir_start/*:number*/, sector_list/*:SectorList*/, sector } else { o.storage = 'minifat'; if(minifat_store !== ENDOFCHAIN && o.start !== ENDOFCHAIN && sector_list[minifat_store]) { - o.content = (sector_list[minifat_store].data.slice(o.start*MSSZ,o.start*MSSZ+o.size)/*:any*/); + o.content = get_mfat_entry(o, sector_list[minifat_store].data, (sector_list[mini]||{}).data); prep_blob(o.content, 0); } } diff --git a/demos/README.md b/demos/README.md index 6f1bd26647ed00dffcb77b4d737d2754b8bd84c1..951c921e74b2f584a960bc6e0c70828be734fa9f 100644 --- a/demos/README.md +++ b/demos/README.md @@ -19,7 +19,7 @@ can be installed with Bash on Windows or with `cygwin`. **Frameworks and APIs** - [`angular 1.x`](angular/) -- [`angular 2.x / 4.x`](angular2/) +- [`angular 2.x / 4.x / 5.x`](angular2/) - [`meteor`](meteor/) - [`react and react-native`](react/) - [`vue 2.x and weex`](vue/) diff --git a/demos/angular2/Makefile b/demos/angular2/Makefile index a970dcbb7a810e2b405fc466049c9b5be2895bd0..74ddf0d6a7d31230143be7d7d457336d3dce8fa9 100644 --- a/demos/angular2/Makefile +++ b/demos/angular2/Makefile @@ -14,3 +14,10 @@ angular: if [ ! -e node_modules/xlsx ]; then cd node_modules; ln -s ../../../ xlsx; cd -; fi ng build + # Test Angular5 build + cp package.json-angular5 package.json + npm install + if [ ! -e node_modules ]; then mkdir node_modules; fi + if [ ! -e node_modules/xlsx ]; then cd node_modules; ln -s ../../../ xlsx; cd -; fi + ng build + diff --git a/demos/angular2/README.md b/demos/angular2/README.md index 28caf90480bc631b7ac9d8b43bff3d6462b6ffa4..eed24ec9da370c9a1ba6a0f38fb8032b72bdff75 100644 --- a/demos/angular2/README.md +++ b/demos/angular2/README.md @@ -67,27 +67,20 @@ saveAs(new Blob([s2ab(wbout)]), 'SheetJS.xlsx'); ## Switching between Angular versions -Modules that work with Angular 2 largely work as-is with Angular 4. Switching +Modules that work with Angular 2 largely work as-is with Angular 4+. Switching between versions is mostly a matter of installing the correct version of the -core and associated modules. This demo includes a `package.json` for Angular 2 -and another `package.json` for Angular 4. +core and associated modules. This demo includes `package.json-angular#` files +for Angular 2, Angular 4, and Angular 5 -Switching to Angular 2 is as simple as: +To test a particular Angular version, overwrite `package.json`: ```bash +# switch to Angular 2 $ cp package.json-angular2 package.json $ npm install $ ng serve ``` -Switching to Angular 4 is as simple as: - -```bash -$ cp package.json-angular4 package.json -$ npm install -$ ng serve -``` - ## XLSX Symbolic Link In this tree, `node_modules/xlsx` is a link pointing back to the root. This diff --git a/demos/angular2/package.json b/demos/angular2/package.json index 42fbebfd8616866b0da873861ab89df87fb5953c..4ac455fe1c520cb6d8e075cc854492c58c982f97 100644 --- a/demos/angular2/package.json +++ b/demos/angular2/package.json @@ -1,5 +1,5 @@ { - "name": "angular2", + "name": "angular5", "version": "0.0.0", "license": "MIT", "scripts": { @@ -9,27 +9,31 @@ }, "private": true, "dependencies": { - "@angular/animations": "^4.0.0", - "@angular/common": "^4.0.0", - "@angular/compiler": "^4.0.0", - "@angular/core": "^4.0.0", - "@angular/forms": "^4.0.0", - "@angular/http": "^4.0.0", - "@angular/platform-browser": "^4.0.0", - "@angular/platform-browser-dynamic": "^4.0.0", - "@angular/router": "^4.0.0", + "@angular/animations": "^5.0.0", + "@angular/common": "^5.0.0", + "@angular/compiler": "^5.0.0", + + "@angular/core": "^5.0.0", + "@angular/forms": "^5.0.0", + "@angular/http": "^5.0.0", + "@angular/platform-browser": "^5.0.0", + "@angular/platform-browser-dynamic": "^5.0.0", + + "@angular/router": "^5.0.0", "core-js": "^2.4.1", - "rxjs": "^5.1.0", - "zone.js": "^0.8.4", + + "rxjs": "^5.5.2", + + "zone.js": "^0.8.14", "file-saver": "^1.3.3" }, "devDependencies": { - "@angular/cli": "1.1.2", - "@angular/compiler-cli": "^4.0.0", - "@angular/language-service": "^4.0.0", + "@angular/cli": "1.5.0", + "@angular/compiler-cli": "^5.0.0", + "@angular/language-service": "^5.0.0", "@types/node": "~6.0.60", - "ts-node": "~3.0.4", - "tslint": "~5.3.2", - "typescript": "~2.3.3" + "ts-node": "~3.2.0", + "tslint": "~5.7.0", + "typescript": "~2.4.2" } } diff --git a/demos/angular2/package.json-angular4 b/demos/angular2/package.json-angular4 index b2867a6b53932da878a89cacaf8494ffb6a162ed..52a3c5ac51dca78ae5b7142b974bb9436cad4069 100644 --- a/demos/angular2/package.json-angular4 +++ b/demos/angular2/package.json-angular4 @@ -1,5 +1,5 @@ { - "name": "angular2", + "name": "angular4", "version": "0.0.0", "license": "MIT", "scripts": { diff --git a/demos/angular2/package.json-angular5 b/demos/angular2/package.json-angular5 new file mode 100644 index 0000000000000000000000000000000000000000..4ac455fe1c520cb6d8e075cc854492c58c982f97 --- /dev/null +++ b/demos/angular2/package.json-angular5 @@ -0,0 +1,39 @@ +{ + "name": "angular5", + "version": "0.0.0", + "license": "MIT", + "scripts": { + "ng": "ng", + "start": "ng serve", + "build": "ng build" + }, + "private": true, + "dependencies": { + "@angular/animations": "^5.0.0", + "@angular/common": "^5.0.0", + "@angular/compiler": "^5.0.0", + + "@angular/core": "^5.0.0", + "@angular/forms": "^5.0.0", + "@angular/http": "^5.0.0", + "@angular/platform-browser": "^5.0.0", + "@angular/platform-browser-dynamic": "^5.0.0", + + "@angular/router": "^5.0.0", + "core-js": "^2.4.1", + + "rxjs": "^5.5.2", + + "zone.js": "^0.8.14", + "file-saver": "^1.3.3" + }, + "devDependencies": { + "@angular/cli": "1.5.0", + "@angular/compiler-cli": "^5.0.0", + "@angular/language-service": "^5.0.0", + "@types/node": "~6.0.60", + "ts-node": "~3.2.0", + "tslint": "~5.7.0", + "typescript": "~2.4.2" + } +} diff --git a/demos/react/README.md b/demos/react/README.md index 58c0f36b5f694072bb13946480f18ff00a66012f..05b548b5884acabd3ca270ef9b9766bd4b74914f 100644 --- a/demos/react/README.md +++ b/demos/react/README.md @@ -10,7 +10,7 @@ into web pages with script tags: The library can also be imported directly from JSX code with: ```js -import * as XLSX from 'xlsx'; +import XLSX from 'xlsx'; ``` This demo shows a simple JSX component transpiled in the browser using the babel diff --git a/demos/react/nexthdr.js b/demos/react/nexthdr.js index 103fdecfd88650dd4a2d09d77e4ccbeb1a1bee73..18594afe0601aa522848ea88823be1b48c9692e0 100644 --- a/demos/react/nexthdr.js +++ b/demos/react/nexthdr.js @@ -1,3 +1,3 @@ /* xlsx.js (C) 2013-present SheetJS -- http://sheetjs.com */ -import * as XLSX from 'xlsx'; +import XLSX from 'xlsx'; import { saveAs } from 'file-saver'; diff --git a/demos/react/react-native.js b/demos/react/react-native.js index 682ad7d3c58e2cf202d07fe6a405459cfd335845..dd9ec934522fc5bc0fe77a3a826e46df00a1374b 100644 --- a/demos/react/react-native.js +++ b/demos/react/react-native.js @@ -1,5 +1,5 @@ /* xlsx.js (C) 2013-present SheetJS -- http://sheetjs.com */ -import * as XLSX from 'xlsx'; +import XLSX from 'xlsx'; import React, { Component } from 'react'; import { AppRegistry, StyleSheet, Text, View, Button, Alert, Image } from 'react-native'; diff --git a/dist/xlsx.core.min.js b/dist/xlsx.core.min.js index 547708997dc0850b18cbd7f1b54cf645e82fbc1e..c179835ff4bc2339a2b857b11e9e46f7e3ec3361 100644 Binary files a/dist/xlsx.core.min.js and b/dist/xlsx.core.min.js differ diff --git a/dist/xlsx.core.min.map b/dist/xlsx.core.min.map index 67d751b9ddfdf8a871dd2a097cc9530448420626..89a08674d96ec15e5b2bba768e17c681986fc561 100644 Binary files a/dist/xlsx.core.min.map and b/dist/xlsx.core.min.map differ diff --git a/dist/xlsx.full.min.js b/dist/xlsx.full.min.js index d28dcf7f1d28224be5717fdef7c837cda7e7209c..31f5b21b7837e787b73799334fd189ab215f9d0b 100644 Binary files a/dist/xlsx.full.min.js and b/dist/xlsx.full.min.js differ diff --git a/dist/xlsx.full.min.map b/dist/xlsx.full.min.map index a00065451f1ddd050f56a4ee542cf795ace0a757..4f627b1cdc5857357072480962578018f1343aa3 100644 Binary files a/dist/xlsx.full.min.map and b/dist/xlsx.full.min.map differ diff --git a/dist/xlsx.js b/dist/xlsx.js index 0a17ddc8cf31ac942cd414b1ac5263807754fd70..dd6a8d5aa37d1ad15d2c5b89d4b8c1db63dd2d2a 100644 Binary files a/dist/xlsx.js and b/dist/xlsx.js differ diff --git a/dist/xlsx.min.js b/dist/xlsx.min.js index 94574d489e79191742a3bf26d48282564fbef2b8..df44d18635969c4469a8efb18d23823919182d91 100644 Binary files a/dist/xlsx.min.js and b/dist/xlsx.min.js differ diff --git a/dist/xlsx.min.map b/dist/xlsx.min.map index 81f5a6195510c472f5183b580db87777587fb296..9669405916e51577f68bce9c34ff0a80a3941769 100644 Binary files a/dist/xlsx.min.map and b/dist/xlsx.min.map differ diff --git a/docbits/11_demos.md b/docbits/11_demos.md index fc5915d100b93724caeb8854ae881daeb38f26f5..11bfd5454c8ab9a7685483a2479518e545f0a5e7 100644 --- a/docbits/11_demos.md +++ b/docbits/11_demos.md @@ -4,7 +4,7 @@ The [`demos` directory](demos/) includes sample projects for: **Frameworks and APIs** - [`angular 1.x`](demos/angular/) -- [`angular 2.x / 4.x`](demos/angular2/) +- [`angular 2.x / 4.x / 5.x`](demos/angular2/) - [`meteor`](demos/meteor/) - [`react and react-native`](demos/react/) - [`vue 2.x and weex`](demos/vue/) diff --git a/misc/docs/README.md b/misc/docs/README.md index 85446805314de46a5f04d5f002bac7f15a9c8cc6..f0b5029df4c5f632b9050df598517ee3756f5ac0 100644 --- a/misc/docs/README.md +++ b/misc/docs/README.md @@ -179,7 +179,7 @@ The [`demos` directory](demos/) includes sample projects for: **Frameworks and APIs** - [`angular 1.x`](demos/angular/) -- [`angular 2.x / 4.x`](demos/angular2/) +- [`angular 2.x / 4.x / 5.x`](demos/angular2/) - [`meteor`](demos/meteor/) - [`react and react-native`](demos/react/) - [`vue 2.x and weex`](demos/vue/) diff --git a/misc/flowdeps.js b/misc/flowdeps.js index 1ff0c5879d5c3f89dc0594f3988bbedf5e90c7e2..2099b415a34e2238e9fdd72944d68eb8daeea3f4 100644 --- a/misc/flowdeps.js +++ b/misc/flowdeps.js @@ -55,10 +55,6 @@ type CFBModule = { utils:CFBUtils; }; -type CFBFullPathDir = { - [n:string]: CFBEntry; -} - type CFBUtils = any; type CheckFieldFunc = {(hexstr:string, fld:string):void;}; @@ -114,7 +110,6 @@ type CFBContainer = { sectors:Array; }; FileIndex:CFBFileIndex; - FullPathDir:CFBFullPathDir; FullPaths:Array; } diff --git a/package.json b/package.json index 8fab3711232ad69ffe3ee5bfdd22ec9b770a88aa..eacd2cb1d88965a6a472f74bafabe07abb87e17c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "xlsx", - "version": "0.11.7", + "version": "0.11.8", "author": "sheetjs", "description": "SheetJS Spreadsheet data parser and writer", "keywords": [ "excel", "xls", "xlsx", "xlsb", "xlsm", "ods", "csv", "dbf", "dif", "sylk", "office", "spreadsheet" ], @@ -20,7 +20,7 @@ "exit-on-epipe": "~1.0.1", "ssf": "~0.10.1", "codepage": "~1.11.0", - "cfb": "~0.13.2", + "cfb": "~1.0.0", "crc-32": "~1.1.1", "adler-32": "~1.1.0", "commander": "~2.11.0" diff --git a/test.js b/test.js index 79cfde5e6a5c0a515a2427fcda54861bfaf84022..d0e167a678a584f235383ddf7d32805bb7c97015 100644 --- a/test.js +++ b/test.js @@ -1863,7 +1863,7 @@ describe('HTML', function() { it('should generate strings if raw option is passed', function() { plaintext_test(X.utils.table_to_book(get_dom_element(html_str), {raw:true}), true, true); }); it('should handle newlines correctly', function() { var table = get_dom_element("
foo
bar
baz
"); - var wb = X.utils.table_to_book(table) + var wb = X.utils.table_to_book(table); assert.equal(get_cell(wb.Sheets.Sheet1, "A1").v, "foo\nbar"); }); }); diff --git a/tests/core.js b/tests/core.js index 2f665f4a20331d5d839d6c200bd82d10536f7585..d0e167a678a584f235383ddf7d32805bb7c97015 100644 Binary files a/tests/core.js and b/tests/core.js differ diff --git a/xlsx.flow.js b/xlsx.flow.js index 7a2a44f9d93fa5ef9c052398873df7aaa793f8ab..4eb21f1edc0e95ad445b7954a554c2b53e98ef36 100644 --- a/xlsx.flow.js +++ b/xlsx.flow.js @@ -4,7 +4,7 @@ /*global global, exports, module, require:false, process:false, Buffer:false */ var XLSX = {}; (function make_xlsx(XLSX){ -XLSX.version = '0.11.7'; +XLSX.version = '0.11.8'; var current_codepage = 1200; /*:: declare var cptable:any; */ /*global cptable:true */ @@ -1089,7 +1089,7 @@ type CFBFiles = {[n:string]:CFBEntry}; /* [MS-CFB] v20130118 */ var CFB = (function _CFB(){ var exports/*:CFBModule*/ = /*::(*/{}/*:: :any)*/; -exports.version = '0.13.2'; +exports.version = '1.0.0'; /* [MS-CFB] 2.6.4 */ function namecmp(l/*:string*/, r/*:string*/)/*:number*/ { var L = l.split("/"), R = r.split("/"); @@ -1192,16 +1192,15 @@ sector_list.fat_addrs = fat_addrs; sector_list.ssz = ssz; /* [MS-CFB] 2.6.1 Compound File Directory Entry */ -var files/*:CFBFiles*/ = {}, Paths/*:Array*/ = [], FileIndex/*:CFBFileIndex*/ = [], FullPaths/*:Array*/ = [], FullPathDir = {}; -read_directory(dir_start, sector_list, sectors, Paths, nmfs, files, FileIndex); +var files/*:CFBFiles*/ = {}, Paths/*:Array*/ = [], FileIndex/*:CFBFileIndex*/ = [], FullPaths/*:Array*/ = []; +read_directory(dir_start, sector_list, sectors, Paths, nmfs, files, FileIndex, minifat_start); -build_full_paths(FileIndex, FullPathDir, FullPaths, Paths); +build_full_paths(FileIndex, FullPaths, Paths); Paths.shift(); var o = { FileIndex: FileIndex, - FullPaths: FullPaths, - FullPathDir: FullPathDir + FullPaths: FullPaths }; // $FlowIgnore @@ -1253,7 +1252,7 @@ function sectorify(file/*:RawBytes*/, ssz/*:number*/)/*:Array*/ { } /* [MS-CFB] 2.6.4 Red-Black Tree */ -function build_full_paths(FI/*:CFBFileIndex*/, FPD/*:CFBFullPathDir*/, FP/*:Array*/, Paths/*:Array*/)/*:void*/ { +function build_full_paths(FI/*:CFBFileIndex*/, FP/*:Array*/, Paths/*:Array*/)/*:void*/ { var i = 0, L = 0, R = 0, C = 0, j = 0, pl = Paths.length; var dad/*:Array*/ = [], q/*:Array*/ = []; @@ -1289,10 +1288,23 @@ function build_full_paths(FI/*:CFBFileIndex*/, FPD/*:CFBFullPathDir*/, FP/*:Arra FP[0] += "/"; for(i=1; i < pl; ++i) { if(FI[i].type !== 2 /* stream */) FP[i] += "/"; - FPD[FP[i]] = FI[i]; } } +function get_mfat_entry(entry/*:CFBEntry*/, payload/*:RawBytes*/, mini/*:?RawBytes*/)/*:CFBlob*/ { + var start = entry.start, size = entry.size; + //return (payload.slice(start*MSSZ, start*MSSZ + size)/*:any*/); + var o = []; + var idx = start; + while(mini && size > 0 && idx >= 0) { + o.push(payload.slice(idx * MSSZ, idx * MSSZ + MSSZ)); + size -= MSSZ; + idx = __readInt32LE(mini, idx * 4); + } + if(o.length === 0) return (new_buf(0)/*:any*/); + return (bconcat(o).slice(0, entry.size)/*:any*/); +} + /** Chase down the rest of the DIFAT chain to build a comprehensive list DIFAT chains by storing the next sector number as the last 32 bits */ function sleuth_fat(idx/*:number*/, cnt/*:number*/, sectors/*:Array*/, ssz/*:number*/, fat_addrs)/*:void*/ { @@ -1354,7 +1366,7 @@ function make_sector_list(sectors/*:Array*/, dir_start/*:number*/, fat } /* [MS-CFB] 2.6.1 Compound File Directory Entry */ -function read_directory(dir_start/*:number*/, sector_list/*:SectorList*/, sectors/*:Array*/, Paths/*:Array*/, nmfs, files, FileIndex) { +function read_directory(dir_start/*:number*/, sector_list/*:SectorList*/, sectors/*:Array*/, Paths/*:Array*/, nmfs, files, FileIndex, mini) { var minifat_store = 0, pl = (Paths.length?2:0); var sector = sector_list[dir_start].data; var i = 0, namelen = 0, name; @@ -1396,7 +1408,7 @@ function read_directory(dir_start/*:number*/, sector_list/*:SectorList*/, sector } else { o.storage = 'minifat'; if(minifat_store !== ENDOFCHAIN && o.start !== ENDOFCHAIN && sector_list[minifat_store]) { - o.content = (sector_list[minifat_store].data.slice(o.start*MSSZ,o.start*MSSZ+o.size)/*:any*/); + o.content = get_mfat_entry(o, sector_list[minifat_store].data, (sector_list[mini]||{}).data); prep_blob(o.content, 0); } } diff --git a/xlsx.js b/xlsx.js index 475215e3a1b432b1a42c7189055e91531aba406f..2017644a8ce886050bee7d37e82d15affb3c7cbb 100644 Binary files a/xlsx.js and b/xlsx.js differ