diff --git a/src/decompressors.js b/src/decompressors.js new file mode 100644 index 0000000..feee49a --- /dev/null +++ b/src/decompressors.js @@ -0,0 +1,24 @@ +/* +* Decompression of gzipped files using ukyo's jsziptools.js (jz) +* Requires ukyo's jsziptools.js to be in global scope when decompressing gzipped files +* https://github.com/ukyo/jsziptools +* http://ukyo.github.io/jsziptools/jsziptools.js +*/ +var gzip = (function () { + return { + decompress: function(arrayBuffer) { + var hexarr = jz.gz.decompress(arrayBuffer); + return _hextostring(hexarr); + }, + }; + function _hextostring(hexarr){ + for (var w = '', i = 0, l = hexarr.length; i < l; i++) { + w += String.fromCharCode(hexarr[i]) + } + return decodeURIComponent(escape(w)); + } +})(); + +var DECOMPRESSORS = { + gz: function (x) {return gzip.decompress(x);} +}; diff --git a/src/leaflet.filelayer.js b/src/leaflet.filelayer.js index 19b6ae7..a9130a1 100644 --- a/src/leaflet.filelayer.js +++ b/src/leaflet.filelayer.js @@ -56,8 +56,11 @@ gpx: this._convertToGeoJSON, kml: this._convertToGeoJSON }; + + this._decompressors = typeof(DECOMPRESSORS)==='undefined'?{}:DECOMPRESSORS; }, + load: function (file, ext) { var parser, reader; @@ -84,7 +87,11 @@ var layer; try { this.fire('data:loading', { filename: file.name, format: parser.ext }); - layer = parser.processor.call(this, e.target.result, parser.ext); + var result = e.target.result; + if (parser.decompressor) { + result = parser.decompressor(result); + } + layer = parser.processor.call(this, result, parser.ext); this.fire('data:loaded', { layer: layer, filename: file.name, @@ -98,7 +105,11 @@ // but an object with file.testing set to true. // This object cannot be read by reader, just skip it. if (!file.testing) { - reader.readAsText(file); + if (parser.decompressor) { + reader.readAsArrayBuffer(file); + } else { + reader.readAsText(file, 'utf-8'); + } } // We return this to ease testing return reader; @@ -163,8 +174,15 @@ }, _getParser: function (name, ext) { - var parser; - ext = ext || name.split('.').pop(); + var parser, decompressor; + if (!ext) { + name = name.split('.'); + ext = name.pop(); + decompressor = this._decompressors[ext]; + if (decompressor) { + ext = name.pop(); + } + } parser = this._parsers[ext]; if (!parser) { this.fire('data:error', { @@ -174,6 +192,7 @@ } return { processor: parser, + decompressor: decompressor, ext: ext }; },