From d837ab11208ed69c8a62e39e3898a5a25c27521e Mon Sep 17 00:00:00 2001 From: oc Date: Tue, 5 Mar 2019 21:46:45 +0800 Subject: [PATCH] Use lzw_encode instead of LZString.compress --- libs/actions.js | 8 +++--- libs/core.js | 4 +-- libs/ui.js | 4 +-- libs/utils.js | 70 ++++++++++++++++++++++++++++++++++++++++++++----- 4 files changed, 72 insertions(+), 14 deletions(-) diff --git a/libs/actions.js b/libs/actions.js index d94daf11..718d490e 100644 --- a/libs/actions.js +++ b/libs/actions.js @@ -2679,7 +2679,7 @@ actions.prototype.onupPaint = function () { core.status.event.data.x = null; core.status.event.data.y = null; // 保存 - core.paint[core.status.floorId] = LZString.compress(core.utils.encodeCanvas(core.dymCanvas.paint).join(",")); + core.paint[core.status.floorId] = lzw_encode(core.utils.encodeCanvas(core.dymCanvas.paint).join(",")); } actions.prototype.setPaintMode = function (mode) { @@ -2700,7 +2700,7 @@ actions.prototype.savePaint = function () { var data = {}; for (var floorId in core.paint) { if (core.isset(core.paint[floorId])) - data[floorId] = LZString.decompress(core.paint[floorId]); + data[floorId] = lzw_decode(core.paint[floorId]); } core.download(core.firstData.name+".h5paint", JSON.stringify({ 'name': core.firstData.name, @@ -2721,12 +2721,12 @@ actions.prototype.loadPaint = function () { core.paint = {}; for (var floorId in obj.paint) { if (core.isset(obj.paint[floorId])) - core.paint[floorId] = LZString.compress(obj.paint[floorId]); + core.paint[floorId] = lzw_encode(obj.paint[floorId]); } core.clearMap('paint'); var value = core.paint[core.status.floorId]; - if (core.isset(value)) value = LZString.decompress(value).split(","); + if (core.isset(value)) value = lzw_decode(value).split(","); core.utils.decodeCanvas(value, 32*core.bigmap.width, 32*core.bigmap.height); core.drawImage('paint', core.bigmap.tempCanvas.canvas, 0, 0); diff --git a/libs/core.js b/libs/core.js index e1a03f86..64475e2c 100644 --- a/libs/core.js +++ b/libs/core.js @@ -276,11 +276,11 @@ core.prototype.init = function (coreData, callback) { core.platform.useLocalForage = core.getLocalStorage('useLocalForage', !core.platform.isIOS); if (core.platform.useLocalForage) { try { - core.setLocalForage("__test__", LZString.compress("__test__"), function() { + core.setLocalForage("__test__", lzw_encode("__test__"), function() { try { core.getLocalForage("__test__", null, function(data) { try { - if (LZString.decompress(data)!="__test__") { + if (lzw_decode(data)!="__test__") { console.log("localForage unsupported!"); core.platform.useLocalForage=false; } diff --git a/libs/ui.js b/libs/ui.js index 7f1a24b9..80dcd2c7 100644 --- a/libs/ui.js +++ b/libs/ui.js @@ -1690,7 +1690,7 @@ ui.prototype.drawMaps = function (index, x, y) { if (core.status.event.data.paint) { var offsetX = core.clamp(x-6, 0, mw-13), offsetY = core.clamp(y-6, 0, mh-13); var value = core.paint[floorId]; - if (core.isset(value)) value = LZString.decompress(value).split(","); + if (core.isset(value)) value = lzw_decode(value).split(","); core.utils.decodeCanvas(value, 32*mw, 32*mh); core.drawImage('ui', core.bigmap.tempCanvas.canvas, offsetX*32, offsetY*32, 416, 416, 0, 0, 416, 416); } @@ -2582,7 +2582,7 @@ ui.prototype.drawPaint = function () { // 将已有的内容绘制到route上 var value = core.paint[core.status.floorId]; - if (core.isset(value)) value = LZString.decompress(value).split(","); + if (core.isset(value)) value = lzw_decode(value).split(","); core.utils.decodeCanvas(value, 32*core.bigmap.width, 32*core.bigmap.height); core.drawImage('paint', core.bigmap.tempCanvas.canvas, 0, 0); diff --git a/libs/utils.js b/libs/utils.js index f51ca99b..94cfd340 100644 --- a/libs/utils.js +++ b/libs/utils.js @@ -136,12 +136,14 @@ utils.prototype.setLocalStorage = function(key, value) { return; } - var str = JSON.stringify(value); - var compressed = LZString.compress(str); + var str = JSON.stringify(value).replace(/[\u007F-\uFFFF]/g, function(chr) { + return "\\u" + ("0000" + chr.charCodeAt(0).toString(16)).substr(-4) + }); + var compressed = lzw_encode(str); // test if we can save to localStorage localStorage.setItem("__tmp__", compressed); - if (LZString.decompress(localStorage.getItem("__tmp__"))==str) { + if (lzw_decode(localStorage.getItem("__tmp__"))==str) { localStorage.setItem(core.firstData.name + "_" + key, compressed); } else { @@ -166,7 +168,7 @@ utils.prototype.getLocalStorage = function(key, defaultValue) { try { var value = localStorage.getItem(core.firstData.name+"_"+key); if (core.isset(value)) { - var output = LZString.decompress(value); + var output = lzw_decode(value); if (core.isset(output) && output.length>0) { try { return JSON.parse(output); @@ -210,7 +212,9 @@ utils.prototype.setLocalForage = function (key, value, successCallback, errorCal } // Save to localforage - var compressed = LZString.compress(JSON.stringify(value)); + var compressed = lzw_encode(JSON.stringify(value).replace(/[\u007F-\uFFFF]/g, function(chr) { + return "\\u" + ("0000" + chr.charCodeAt(0).toString(16)).substr(-4) + })); localforage.setItem(core.firstData.name+"_"+key, compressed, function (err) { if (core.isset(err)) { if (core.isset(errorCallback)) errorCallback(err); @@ -241,7 +245,7 @@ utils.prototype.getLocalForage = function (key, defaultValue, successCallback, e if (!core.isset(successCallback)) return; if (core.isset(value)) { try { - var output = LZString.decompress(value); + var output = lzw_decode(value); if (core.isset(output) && output.length>0) { try { successCallback(JSON.parse(output)); @@ -1043,3 +1047,57 @@ utils.prototype.http = function (type, url, formData, success, error, mimeType, xhr.send(formData); else xhr.send(); } + +// LZW-compress +// https://gist.github.com/revolunet/843889 +function lzw_encode(s) { + var dict = {}; + var data = (s + "").split(""); + var out = []; + var currChar; + var phrase = data[0]; + var code = 256; + for (var i=1; i 1 ? dict[phrase] : phrase.charCodeAt(0)); + dict[phrase + currChar] = code; + code++; + phrase=currChar; + } + } + out.push(phrase.length > 1 ? dict[phrase] : phrase.charCodeAt(0)); + for (var i=0; i