Skip to content

Commit 12f95c0

Browse files
authored
Merge pull request #307 from rdvincent/rdv-unzip
Use pako.js to inflate gzipped files through loadFromFile().
2 parents ef00737 + ec20d36 commit 12f95c0

File tree

3 files changed

+52
-9
lines changed

3 files changed

+52
-9
lines changed

Gruntfile.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,8 @@ module.exports = function(grunt) {
122122
BrainBrowser: true,
123123
alert: true,
124124
console: true,
125-
pako: true
125+
pako: true,
126+
TextDecoder: true
126127
}
127128
},
128129
src: [

examples/surface-viewer-demo.html

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -218,6 +218,7 @@ <h4>Views:</h4>
218218
<script src="js/jquery-1.6.4.min.js"></script>
219219
<script src="js/jquery-ui-1.8.10.custom.min.js"></script>
220220
<script src="js/ui.js"></script>
221+
<script src="js/pako.js"></script>
221222
<script src="js/brainbrowser/brainbrowser.js"></script>
222223
<script src="js/brainbrowser/core/tree-store.js"></script>
223224
<script src="js/brainbrowser/lib/config.js"></script>

src/brainbrowser/lib/loader.js

Lines changed: 49 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -127,11 +127,56 @@
127127
var reader = new FileReader();
128128
var parts = file_input.value.split("\\");
129129
var filename = parts[parts.length-1];
130-
130+
131131
reader.file = files[0];
132-
132+
133133
reader.onloadend = function(event) {
134-
callback(event.target.result, filename, options);
134+
var result = event.target.result;
135+
try {
136+
/* See if the data can be inflated.
137+
*/
138+
var unzipped = pako.inflate(result);
139+
result = unzipped.buffer;
140+
} catch(e) {
141+
/* pako probably didn't recognize this as gzip.
142+
*/
143+
} finally {
144+
/* At this point, we have a binary hunk of data that may
145+
* have been inflated.
146+
*/
147+
if (result_type !== 'arraybuffer') {
148+
/* The caller requested the data as a string, so we have
149+
* to perform an additional step to convert the
150+
* arraybuffer we have into the string the caller wants.
151+
*/
152+
if (typeof TextDecoder !== 'function') {
153+
/* Use the slightly slower blob-to-filereader conversion
154+
* to string.
155+
*/
156+
var blob = new Blob([result]);
157+
var rdr2 = new FileReader();
158+
rdr2.onload = function(event) {
159+
callback(event.target.result, filename, options);
160+
};
161+
rdr2.readAsText(blob);
162+
}
163+
else {
164+
/* Simpler but newer conversion using TextDecoder, this
165+
* might not work on some browsers.
166+
*/
167+
var dv = new DataView(result);
168+
var decoder = new TextDecoder();
169+
result = decoder.decode(dv);
170+
callback(result, filename, options);
171+
}
172+
}
173+
else {
174+
/* The caller requested an arraybuffer, so we just pass it
175+
* back now.
176+
*/
177+
callback(result, filename, options);
178+
}
179+
}
135180
};
136181

137182
reader.onerror = function() {
@@ -141,11 +186,7 @@
141186
throw new Error(error_message);
142187
};
143188

144-
if (result_type === "arraybuffer") {
145-
reader.readAsArrayBuffer(files[0]);
146-
} else {
147-
reader.readAsText(files[0]);
148-
}
189+
reader.readAsArrayBuffer(files[0]);
149190
},
150191

151192
/**

0 commit comments

Comments
 (0)