mirror of
https://github.com/arfct/itty-bitty.git
synced 2026-03-11 08:54:33 +00:00
79 lines
2.5 KiB
JavaScript
79 lines
2.5 KiB
JavaScript
var BASE64_MARKER = ';base64,';
|
|
var LZMA64_MARKER = ';bxze64,';
|
|
|
|
function compressDataURI(dataURI, callback) {
|
|
var base64Index = dataURI.indexOf(BASE64_MARKER);
|
|
var base64 = dataURI.substring(base64Index + BASE64_MARKER.length);
|
|
stringToZip(base64ToByteArray(base64), function(result) {
|
|
callback(dataURI.substring(0, base64Index) + LZMA64_MARKER + result)
|
|
})
|
|
}
|
|
|
|
function base64ToByteArray(base64) {
|
|
var raw = window.atob(base64);
|
|
var rawLength = raw.length;
|
|
var array = new Uint8Array(new ArrayBuffer(rawLength));
|
|
for(i = 0; i < rawLength; i++) {
|
|
array[i] = raw.charCodeAt(i);
|
|
}
|
|
return array;
|
|
}
|
|
|
|
function stringToZip(string, callback) {
|
|
LZMA.compress(string, 9, function(result, error) {
|
|
if (error) console.error(error);
|
|
var base64String = btoa(String.fromCharCode.apply(null, new Uint8Array(result)));
|
|
return callback(base64String);
|
|
});
|
|
}
|
|
|
|
function decompressDataURI(dataURI, preamble, callback) {
|
|
var base64Index = dataURI.indexOf(LZMA64_MARKER);
|
|
if (base64Index > 0) {
|
|
var base64 = dataURI.substring(base64Index + LZMA64_MARKER.length);
|
|
zipToString(base64, function(result) {
|
|
stringToData(result, function(data) {
|
|
if (!data) return callback(undefined);
|
|
callback(dataURI.substring(0, base64Index) + BASE64_MARKER + (preamble || '') + data.split(',')[1])
|
|
})
|
|
})
|
|
} else {
|
|
callback(dataURI)
|
|
}
|
|
}
|
|
|
|
function zipToString(data, callback) {
|
|
var array = base64ToByteArray(data);
|
|
LZMA.decompress(array, function(result, error) {
|
|
if (!(typeof result === 'string')) result = new Uint8Array(result)
|
|
if (error) console.error(error);
|
|
callback(result);
|
|
});
|
|
}
|
|
|
|
function stringToData(string, callback) {
|
|
if (!string.length) return callback("");
|
|
var a = new FileReader();
|
|
a.onload = function(e) { callback(e.target.result.replace()) }
|
|
a.readAsDataURL(new Blob([string], {encoding:"UTF-8",type:"text/html;charset=UTF-8"}));
|
|
}
|
|
|
|
function dataToString(data, callback) {
|
|
var blob = dataURItoBlob(data)
|
|
var reader = new FileReader();
|
|
reader.onload = function(e) { callback(reader.result) }
|
|
reader.readAsText(blob);
|
|
}
|
|
|
|
function dataURItoBlob(dataURI) {
|
|
var byteString = atob(dataURI.split(',')[1]);
|
|
var mimeString = dataURI.split(',')[0].split(':')[1].split(';')[0];
|
|
var arrayBuffer = new ArrayBuffer(byteString.length);
|
|
var _ia = new Uint8Array(arrayBuffer);
|
|
for (var i = 0; i < byteString.length; i++) {
|
|
_ia[i] = byteString.charCodeAt(i);
|
|
}
|
|
var dataView = new DataView(arrayBuffer);
|
|
var blob = new Blob([dataView.buffer], { type: mimeString });
|
|
return blob;
|
|
}
|