Skip to content

Commit 6c5588c

Browse files
committed
Added jBinary.load for loading jBinary with auto-detected or manually specified type set.
Fixed dynamic script loading when cached version exists in IE. Stripped path and filename when extracting extension.
1 parent 6ed44a5 commit 6c5588c

File tree

3 files changed

+122
-14
lines changed

3 files changed

+122
-14
lines changed

src/jBinary.js

Lines changed: 54 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -610,6 +610,38 @@ proto.slice = function (start, end, forceCopy) {
610610
return new jBinary(this.view.slice(start, end, forceCopy), this.typeSet);
611611
};
612612

613+
jBinary.load = function (source, typeSet, callback) {
614+
function withTypeSet(typeSet) {
615+
jBinary.loadData(source, function (err, data) {
616+
err ? callback(err) : callback(null, new jBinary(data, typeSet));
617+
});
618+
}
619+
620+
if (arguments.length < 3) {
621+
callback = typeSet;
622+
var srcInfo;
623+
624+
if ('Blob' in global && source instanceof Blob) {
625+
srcInfo = {mimeType: source.type};
626+
if (source instanceof File) {
627+
srcInfo.fileName = source.name;
628+
}
629+
} else
630+
if (typeof source === 'string') {
631+
var dataParts = source.match(/^data:(.+?)(;base64)?,/);
632+
srcInfo = dataParts ? {mimeType: dataParts[1]} : {fileName: source};
633+
}
634+
635+
if (srcInfo) {
636+
repo.getAssociation(srcInfo, withTypeSet);
637+
} else {
638+
withTypeSet();
639+
}
640+
} else {
641+
typeof typeSet === 'string' ? repo(typeSet, withTypeSet) : withTypeSet(typeSet);
642+
}
643+
};
644+
613645
jBinary.loadData = function (source, callback) {
614646
if ('Blob' in global && source instanceof Blob) {
615647
var reader = new FileReader();
@@ -635,7 +667,7 @@ jBinary.loadData = function (source, callback) {
635667

636668
var dataParts = source.match(/^data:(.+?)(;base64)?,(.*)$/);
637669
if (dataParts) {
638-
var isBase64 = dataParts[2] !== undefined,
670+
var isBase64 = dataParts[2],
639671
content = dataParts[3];
640672

641673
try {
@@ -723,17 +755,20 @@ var getScript = (function () {
723755
script.defer = true;
724756

725757
if (callback) {
726-
if (!('onload' in script)) {
758+
if ('onreadystatechange' in script) {
727759
script.onreadystatechange = function () {
728-
console.log(this.src, ' ', this.readyState);
729760
if (this.readyState === 'loaded' || this.readyState === 'complete') {
730761
this.onreadystatechange = null;
731-
this.onload();
762+
763+
// delay to wait until script is executed
764+
setTimeout(function () { callback.call(script) }, 0);
732765
}
733766
};
734-
}
735767

736-
script.onload = script.onerror = callback;
768+
script.onreadystatechange();
769+
} else {
770+
script.onload = script.onerror = callback;
771+
}
737772
}
738773

739774
head.appendChild(script);
@@ -807,14 +842,19 @@ repo.getAssociation = function (source, _callback) {
807842

808843
repo.getAssociations(function (assoc) {
809844
if (source.fileName) {
810-
var fileParts = source.fileName.toLowerCase().split('.').slice(1);
811-
// trying everything from longest possible extension to shortest one
812-
for (var i = 0, length = fileParts.length; i < length; i++) {
813-
var extension = fileParts.slice(i).join('.'),
814-
typeSetName = assoc.extensions[extension];
815-
816-
if (typeSetName) {
817-
return callback(typeSetName);
845+
// extracting only longest extension part
846+
var longExtension = source.fileName.match(/^(.*\/)?.*?(\.|$)(.*)$/)[3].toLowerCase();
847+
848+
if (longExtension) {
849+
var fileParts = longExtension.split('.');
850+
// trying everything from longest possible extension to shortest one
851+
for (var i = 0, length = fileParts.length; i < length; i++) {
852+
var extension = fileParts.slice(i).join('.'),
853+
typeSetName = assoc.extensions[extension];
854+
855+
if (typeSetName) {
856+
return callback(typeSetName);
857+
}
818858
}
819859
}
820860
}

test/123.tar

512 Bytes
Binary file not shown.

test/test.js

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -238,6 +238,8 @@ asyncTest('Cached type', function () {
238238
});
239239
});
240240

241+
//-----------------------------------------------------------------
242+
241243
module('File associations');
242244

243245
asyncTest('Loading list', function () {
@@ -272,6 +274,72 @@ asyncTest('By mime-type', function () {
272274

273275
//-----------------------------------------------------------------
274276

277+
module('Loading data');
278+
279+
asyncTest('loadData from data-URI', function () {
280+
jBinary.loadData('data:text/plain,123', function (err, data) {
281+
start();
282+
ok(!err);
283+
equal(new jDataView(data).getString(), '123');
284+
});
285+
});
286+
287+
asyncTest('loadData from base-64 data-URI', function () {
288+
jBinary.loadData('data:text/plain;base64,MTIz', function (err, data) {
289+
start();
290+
ok(!err);
291+
equal(new jDataView(data).getString(), '123');
292+
});
293+
});
294+
295+
if ('Blob' in this) {
296+
asyncTest('loadData from HTML5 Blob', function () {
297+
var blob = new Blob(['123']);
298+
jBinary.loadData(blob, function (err, data) {
299+
start();
300+
ok(!err);
301+
equal(new jDataView(data).getString(), '123');
302+
});
303+
});
304+
}
305+
306+
asyncTest('loadData from local file', function () {
307+
jBinary.loadData('123.tar', function (err, data) {
308+
start();
309+
ok(!err);
310+
equal(data.byteLength || data.length, 512);
311+
});
312+
});
313+
314+
asyncTest('load with given typeSet', function () {
315+
jBinary.load('123.tar', 'tar', function (err, binary) {
316+
start();
317+
ok(!err);
318+
equal(binary.view.byteLength, 512);
319+
equal(binary.typeSet.File, jBinary.Repo.TAR.File);
320+
});
321+
});
322+
323+
asyncTest('load with auto-detection by file name extension', function () {
324+
jBinary.load('123.tar', function (err, binary) {
325+
start();
326+
ok(!err);
327+
equal(binary.view.byteLength, 512);
328+
equal(binary.typeSet.File, jBinary.Repo.TAR.File);
329+
});
330+
});
331+
332+
asyncTest('load with auto-detection by mime-type', function () {
333+
jBinary.load('data:application/x-tar;base64,MTIzLnR4dAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAwMDA2NDQAMDAwMDc2NAAwMDAxMDQwADAwMDAwMDAwMDAwADEyMTY0MTY0NzUzADAxMzYyMwAgMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB1c3RhciAgAFJSZXZlcnNlcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQWRtaW5pc3RyYXRvcnMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=', function (err, binary) {
334+
start();
335+
ok(!err);
336+
equal(binary.view.byteLength, 512);
337+
equal(binary.typeSet.File, jBinary.Repo.TAR.File);
338+
});
339+
});
340+
341+
//-----------------------------------------------------------------
342+
275343
module('Value Read', {
276344
teardown: function () {
277345
binary.seek(0);

0 commit comments

Comments
 (0)