Use heatshrink/imageconverter from webtools - see https://github.com/espruino/BangleApps/pull/2299

pull/2303/head
Gordon Williams 2022-11-21 12:16:27 +00:00
parent 22db965863
commit bf6e0ed5ca
10 changed files with 161 additions and 161 deletions

View File

@ -170,10 +170,10 @@
</div>
</footer>
<script src="https://www.puck-js.com/puck.js"></script>
<script src="webtools/puck.js"></script>
<script src="webtools/heatshrink.js"></script>
<script src="core/lib/marked.min.js"></script>
<script src="core/lib/espruinotools.js"></script>
<script src="core/lib/heatshrink.js"></script>
<script src="core/js/utils.js"></script>
<script src="loader.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jszip/3.7.1/jszip.min.js"></script> <!-- for backup.js -->

View File

@ -4,8 +4,8 @@
</head>
<body>
<script src="../../core/lib/heatshrink.js"></script>
<script src="../../core/lib/imageconverter.js"></script>
<script src="../../webtools/heatshrink.js"></script>
<script src="../../webtools/imageconverter.js"></script>
<script src="../../core/lib/customize.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jszip/3.7.1/jszip.js"></script>
@ -32,7 +32,7 @@
<p>Select watchface folder:</br><input type="file" id="fileLoader" name="files[]" multiple directory="" webkitdirectory="" moxdirectory="" /></p>
<p><b>or</b></p>
<p>Select watchface zip file: </br><input type="file" id="zipLoader" name="zip"/></p><br/>
<button id="btnUpload" class="btn btn-primary">Upload to watch</button></br>
<button id="btnSave" class="btn btn-secondary">Save resources file</button></br>
<button id="btnSaveFace" class="btn btn-secondary">Save face file</button></br>
@ -43,7 +43,7 @@
<a href="simpleanalog.zip">simpleanalog.zip</a></br>
</p>
<script>
<script>
var result = "";
var resultJson = {};
var infoJson;
@ -55,15 +55,15 @@
var expectedFiles = 0;
var rootZip = new JSZip();
var resourcesZip = rootZip.folder("resources");
function isNativeFormat(){
return document.getElementById("useNative").checked;
}
function addDebug(){
return document.getElementById("debugprints").checked;
}
function convertAmazfitTime(time){
var result = {};
if (time.Hours){
@ -88,7 +88,7 @@
}
return result;
}
function convertAmazfitDate(date){
var result = {};
if (date.MonthAndDay.Separate.Day) result.Day = convertAmazfitNumber(date.MonthAndDay.Separate.Day, "Day");
@ -98,11 +98,11 @@
}
return result;
}
var filesToMove={};
var zipChangePromise = Promise.resolve();
function performFileChanges(){
var promise = Promise.resolve();
//rename all files to just numbers without leading zeroes
@ -111,7 +111,7 @@
var tmp = resultJson[c];
delete resultJson[c];
resultJson[Number(c)] = tmp;
async function modZip(c){
console.log("Async modification of ", c)
var fileRegex = new RegExp(c + ".*");
@ -120,27 +120,27 @@
console.log("Filedata is", fileData);
var extension = resourcesZip.file(fileRegex)[0].name.match(/\.[^.]*$/);
var newName = Number(c) + extension;
console.log("Renaming to", newName);
resourcesZip.remove(c + extension);
resourcesZip.file(newName, fileData);
}
promise = promise.then(modZip(c));
}
console.log("File moves:", filesToMove);
for (var c in filesToMove){
var tmp = resultJson[c];
console.log("Handle filemove", c, filesToMove[c], tmp);
var element = resultJson;
var path = filesToMove[c];
async function modZip(c){
console.log("Async modification of ", c)
var fileRegex = new RegExp(c + ".*");
@ -149,13 +149,13 @@
console.log("Filedata is", fileData);
var extension = resourcesZip.file(fileRegex)[0].name.match(/\.[^.]*$/);
var newName = Number(c) + extension;
console.log("Copying to", newName);
resourcesZip.file(filesToMove[c].join("/") + extension, fileData);
}
promise = promise.then(modZip(c));
for (var i = 0; i< path.length; i++){
if (!element[path[i]]) element[path[i]] = {};
if (i == path.length - 1){
@ -164,15 +164,15 @@
element = element[path[i]];
}
}
}
promise.then(()=>{
document.getElementById('btnUpload').disabled = true;
document.getElementById('btnUpload').disabled = true;
});
console.log("After moves", resultJson);
return promise;
};
function convertAmazfitMultistate(multistate, value, minValue, maxValue){
var result = {
MultiState: {
@ -188,18 +188,18 @@
if (multistate.ImageIndexOff) filesToMove[multistate.ImageIndexOff] = ["status", value, "off"];
return result;
}
function convertAmazfitStatus(status){
var result = {};
if (status.Alarm) result.Alarm = convertAmazfitMultistate(status.Alarm,"Alarm");
if (status.Bluetooth) result.Bluetooth = convertAmazfitMultistate(status.Bluetooth,"Bluetooth");
if (status.DoNotDisturb) result.DoNotDisturb = convertAmazfitMultistate(status.DoNotDisturb,"Notifications");
if (status.Lock) result.Lock = convertAmazfitMultistate(status.Lock,"Lock");
return result;
}
function convertAmazfitNumber(element, value, minValue, maxValue){
var number = {};
var result = {
@ -233,10 +233,10 @@
if (maxValue !== undefined) number.MinValue = minValue;
return result;
}
function moveWeatherIcons(icon){
filesToMove[icon.ImageIndex + 0] = ["weather", "fallback"];
// Light clouds
filesToMove[icon.ImageIndex + 1] = ["weather", 801];
// Cloudy, possible rain
@ -282,7 +282,7 @@
// Very heavy shower
filesToMove[icon.ImageIndex + 22] = ["weather", 531];
}
function convertAmazfitTemperature(temp){
var result = {};
result = convertAmazfitNumber(temp.Number, "WeatherTemperature");
@ -294,17 +294,17 @@
}
return result;
}
function convertAmazfitWeather(weather){
var result = {};
if (weather.Temperature && weather.Temperature.Current){
if (!result.Temperature) result.Temperature = {};
result.Temperature.Current = convertAmazfitTemperature(weather.Temperature.Current);
}
if (weather.Temperature && weather.Temperature.Today){
if (!result.Temperature) result.Temperature = {};
if (!result.Temperature) result.Temperature = {};
if (weather.Temperature.Today.Separate){
if (weather.Temperature.Today.Separate.Day){
result.Temperature.Day = convertAmazfitTemperature(weather.Temperature.Today.Separate.Day);
@ -327,10 +327,10 @@
}
return result;
}
function convertAmazfitActivity(activity){
var result = {};
if (activity.Steps){
result.Steps = convertAmazfitNumber(activity.Steps, "Steps");
}
@ -339,7 +339,7 @@
}
return result;
}
function convertAmazfitScale(scale, value, minValue, maxValue){
var result = {};
result.Scale = {
@ -356,10 +356,10 @@
Y: c.Y
});
}
return result;
}
function convertAmazfitStepsProgress(steps){
var result = {};
if (steps.GoalImage){
@ -378,7 +378,7 @@
}
return result;
}
function convertAmazfitBattery(battery){
var result = {};
if (battery.Scale){
@ -389,7 +389,7 @@
}
return result;
}
function convertAmazfitImage(image){
var result = {
Image: {
@ -401,11 +401,11 @@
};
return result;
}
function convertAmazfitColor(color){
return "#" + color.substring(2);
}
function convertAmazfitHand(hand, rotationValue, minRotationValue, maxRotationValue){
var result = {
Filled: !hand.OnlyBorder,
@ -418,18 +418,18 @@
MaxRotationValue: maxRotationValue,
MinRotationValue: minRotationValue
};
result.Vertices = []
for (var c of hand.Shape){
result.Vertices.push(c);
}
return { Poly: result };
}
function convertAmazfitAnalog(analog, face){
var result = {
};
if (analog.Hours){
result.Hours = {};
result.Hours.Hand = convertAmazfitHand(analog.Hours, "Hour12Analog", 0, 12);
@ -464,14 +464,14 @@
}
return result;
}
function restructureAmazfitFormat(dataString){
console.log("Amazfit data:", dataString);
var json = JSON.parse(dataString);
faceJson = json;
var result = {};
result.Properties = {};
@ -479,8 +479,8 @@
result.Properties.Redraw.Unlocked = 60000;
result.Properties.Redraw.Locked = 60000;
result.Properties.Redraw.Clear = true;
if (json.Background){
result.Background = json.Background;
result.Background.Image.ImagePath = [];
@ -491,32 +491,32 @@
result.Time = convertAmazfitTime(json.Time);
if (json.AnalogDialFace) result.Time.Plane = 1;
}
if (json.Date){
result.Date = convertAmazfitDate(json.Date);
if (json.AnalogDialFace) result.Date.Plane = 1;
}
if (json.Status){
result.Status = convertAmazfitStatus(json.Status);
if (json.AnalogDialFace) result.Status.Plane = 1;
}
if (json.Weather){
result.Weather = convertAmazfitWeather(json.Weather);
if (json.AnalogDialFace) result.Weather.Plane = 1;
}
if (json.Activity){
result.Activity = convertAmazfitActivity(json.Activity);
if (json.AnalogDialFace) result.Activity.Plane = 1;
}
if (json.StepsProgress){
result.StepsProgress = convertAmazfitStepsProgress(json.StepsProgress);
if (json.AnalogDialFace) result.StepsProgress.Plane = 1;
}
if (json.Battery){
result.Battery = convertAmazfitBattery(json.Battery);
if (json.AnalogDialFace) result.Battery.Plane = 1;
@ -529,7 +529,7 @@
return result;
}
function parseFaceJson(jsonString){
if (isNativeFormat()){
return JSON.parse(jsonString);
@ -537,7 +537,7 @@
return restructureAmazfitFormat(jsonString);
}
}
function combineProperty(name, source, target){
if (source[name] && target[name]){
if (Array.isArray(target[name])){
@ -556,7 +556,7 @@
if (typeof element == "string" || typeof element == "number") return [];
for (var c in element){
var next = element[c];
combineProperty("X",element,next);
combineProperty("Y",element,next);
combineProperty("Width",element,next);
@ -571,7 +571,7 @@
combineProperty("MaxRotationValue",element,next);
if (typeof element.Plane == "number") next.Plane = element.Plane;
next.Layer = element.Layer ? (element.Layer) : "" + c;
if (["MultiState","Image","CodedImage","Number","Circle","Poly","Rect","Scale"].includes(c)){
result.push({type:c, value: next});
} else {
@ -580,12 +580,12 @@
}
return result;
}
function convertToCode(elements, properties, wrapInTimeouts, forceUseOrigPlane){
function convertToCode(elements, properties, wrapInTimeouts, forceUseOrigPlane){
var code = "(function (wr, wf) {\n";
code += "var lc;\n";
code += "var p = Promise.resolve();\n";
code += "var p = Promise.resolve();\n";
//get mapped by layer
var counter = 0;
var planes = {};
@ -606,20 +606,20 @@
}
if (!planeNumbers.includes(0)) planeNumbers.push(0);
planeNumbers.sort().reverse();
console.log("Found planes", planes, "with numbers", planeNumbers)
code += "p0 = g;\n";
for (var planeIndex = 0; planeIndex < planeNumbers.length; planeIndex++){
var layers = planes[planeNumbers[planeIndex]];
var plane = planeNumbers[planeIndex];
var lastSetColor;
var lastSetBgColor;
if (plane != 0) code += "if (!p" + plane + ") p" + plane + " = Graphics.createArrayBuffer(g.getWidth(),g.getHeight(),4,{msb:true});\n";
if (properties.Redraw && properties.Redraw.Clear){
if (wrapInTimeouts && (plane != 0 || forceUseOrigPlane)){
code += "p = p.then(()=>delay(0)).then(()=>{\n";
@ -632,29 +632,29 @@
code += 'endPerfLog("initialDraw_g.clear");'+ "\n";
code += "});\n";
}
var previousPlane = plane + 1;
if (previousPlane < planeNumbers.length){
code += "p = p.then(()=>{\n";
if (addDebug()) code += 'print("Copying of plane ' + previousPlane + ' to display");'+"\n";
//code += "g.drawImage(p" + i + ".asImage());";
code += "p0.drawImage({width: p" + previousPlane + ".getWidth(), height: p" + previousPlane + ".getHeight(), bpp: p" + previousPlane + ".getBPP(), buffer: p" + previousPlane + ".buffer, palette: palette});\n";
code += "});\n";
}
console.log("Got layers", layers);
for (var layername in layers){
var layerElements = layers[layername];
console.log("Layer elements", layername, layerElements);
//code for whole layer
if (addDebug()) code += 'print("Starting layer ' + layername + '");' + "\n";
var checkForLayerChange = false;
var checkcode = "";
if (!(properties.Redraw && properties.Redraw.Clear)){
checkcode = 'firstDraw';
for (var i = 0; i< layerElements.length; i++){
@ -672,30 +672,30 @@
}
}
}
//code for elements
for (var i = 0; i< layerElements.length; i++){
var elementIndex = layerElements[i].index;
var c = elements[elementIndex];
console.log("convert to code", c);
var condition = "";
if (checkcode.length > 0 && checkForLayerChange){
if (condition.length > 0) condition += " && ";
condition = '(' + checkcode + ')';
}
if (c.value.HideOn && c.value.HideOn.includes("Lock")){
if (condition.length > 0) condition += " && ";
condition = '!Bangle.isLocked()';
}
if (c.value.Type == "Once"){
if (condition.length > 0) condition += " && ";
condition += "firstDraw";
}
var planeName = "p" + plane;
var colorsetting = "";
if (c.value.ForegroundColor && lastSetColor != c.value.ForegroundColor){
@ -712,14 +712,14 @@
else
colorsetting += planeName + ".setBgColor(\"" + c.value.BackgroundColor + "\");\n";
}
if (addDebug()) code += 'print("Element condition is ' + condition + '");' + "\n";
code += (condition.length > 0 ? "if (" + condition + "){\n" : "");
if (wrapInTimeouts && (plane != 0 || forceUseOrigPlane)){
code += "p = p.then(()=>delay(0)).then(()=>{\n";
} else {
code += "p = p.then(()=>{\n";
}
}
code += "" + colorsetting;
if (addDebug()) code += 'print("Drawing element ' + elementIndex + ' with type ' + c.type + ' on plane ' + planeName + '");' + "\n";
code += "draw" + c.type + "(" + planeName + ", wr, wf.Collapsed[" + elementIndex + "].value);\n";
@ -729,11 +729,11 @@
}
}
console.log("Current plane is", plane);
}
code += "return p;})";
console.log("Code:", code);
return code
@ -742,14 +742,14 @@
function postProcess(){
moveData(resultJson);
console.log("Created data file", resourceDataString, resourceDataOffset, resultJson);
var properties = faceJson.Properties;
var properties = faceJson.Properties;
faceJson = { Properties: properties, Collapsed: collapseTree(faceJson,{X:0,Y:0})};
console.log("After collapsing", faceJson);
precompiledJs = convertToCode(faceJson.Collapsed, properties, document.getElementById('timeoutwrap').checked, document.getElementById('forceOrigPlane').checked);
console.log("After precompiling", precompiledJs);
}
function convertJsToJson(imgstr){
var E = {};
E.toArrayBuffer = (s)=>s;
@ -768,7 +768,7 @@
function imageLoaded() {
var options = {};
options.diffusion = infoJson.diffusion ? infoJson.diffusion : "none";
options.compression = false;
options.alphaToColor = false;
@ -779,12 +779,12 @@
options.contrast = 0;
options.mode = infoJson.color ? infoJson.color : "1bit";
options.output = "object";
console.log("Loaded image has path", this.path);
var jsonPath = this.path.split("/");
var forcedTransparentColorMatch = jsonPath[jsonPath.length-1].match(/.*\.t([^.]+)\..*/)
var forcedTransparentColorMatch = jsonPath[jsonPath.length-1].match(/.*\.t([^.]+)\..*/)
var forcedTransparentColor;
if (jsonPath[jsonPath.length-1].includes(".t.")){
options.transparent = true;
@ -792,13 +792,13 @@
options.transparent = false;
forcedTransparentColor = forcedTransparentColorMatch[1];
}
console.log("image has transparency", options.transparent);
console.log("image has forced transparent color", forcedTransparentColor);
jsonPath[jsonPath.length-1] = jsonPath[jsonPath.length-1].replace(/([^.]*)\..*/, "$1");
console.log("Loaded image has json path", jsonPath);
var canvas = document.getElementById("canvas")
canvas.width = this.width*2;
canvas.height = this.height;
@ -819,7 +819,7 @@
imgstr = imageconverter.RGBAtoString(rgba, options);
var outputImageData = new ImageData(options.rgbaOut, options.width, options.height);
ctx.putImageData(outputImageData,this.width,0);
imgstr = convertJsToJson(imgstr);
// checkerboard for transparency on original image
@ -827,9 +827,9 @@
imageconverter.RGBAtoCheckerboard(imageData.data, {width:this.width,height:this.height});
ctx.putImageData(imageData,0,0);
var currentElement = resultJson;
for (var i = 0; i < jsonPath.length; i++){
if (i == jsonPath.length - 1){
var resultingObject = JSON.parse(imgstr);
@ -841,18 +841,18 @@
currentElement = currentElement[jsonPath[i]];
}
}
handledFiles++;
console.log("Expected:", expectedFiles, " handled:", handledFiles);
if (handledFiles == expectedFiles){
if (!isNativeFormat()) {
performFileChanges().then(()=>{
postProcess();
rootZip.file("face.json", JSON.stringify(faceJson, null, 2));
rootZip.file("info.json", JSON.stringify(infoJson, null, 2));
document.getElementById('btnSave').disabled = false;
document.getElementById('btnSaveFace').disabled = false;
document.getElementById('btnSaveZip').disabled = false;
@ -860,21 +860,21 @@
});
} else {
postProcess();
document.getElementById('btnSave').disabled = false;
document.getElementById('btnSaveFace').disabled = false;
document.getElementById('btnUpload').disabled = false;
}
}
}
function handleWatchFace(infoFile, faceFile, resourceFiles){
if (isNativeFormat()){
var reader = new FileReader();
reader.path = infoFile.webkitRelativePath;
reader.onload = function(event) {
infoJson = JSON.parse(reader.result);
handleFaceJson(faceFile, resourceFiles);
};
reader.readAsText(infoFile);
@ -883,18 +883,18 @@
handleFaceJson(faceFile, resourceFiles);
}
}
function handleFaceJson(faceFile, resourceFiles){
var reader = new FileReader();
reader.path = faceFile.webkitRelativePath;
reader.onload = function(event) {
faceJson = parseFaceJson(reader.result);
handleResourceFiles(resourceFiles);
};
reader.readAsText(faceFile);
}
function handleResourceFiles(files){
for (var current of files){
console.log('Handle resource file ', current);
@ -913,29 +913,29 @@
img.path = this.path;
img.onload = imageLoaded;
img.src = event.target.result;
};
};
reader.readAsDataURL(current);
}
}
function handleFileSelect(event) {
handledFiles = 0;
expectedFiles = undefined;
document.getElementById('btnSave').disabled = true;
document.getElementById('btnSaveZip').disabled = true;
document.getElementById('btnSaveFace').disabled = true;
document.getElementById('btnUpload').disabled = true;
console.log("File select event", event);
if (event.target.files.length == 0) return;
result = "";
resultJson= {};
var resourceFiles = [];
var faceFile;
var infoFile;
for (var current of event.target.files){
console.log('Handle file ', current);
if (isNativeFormat()){
@ -970,10 +970,10 @@
}
}
handleWatchFace(infoFile, faceFile, resourceFiles);
};
document.getElementById('fileLoader').addEventListener('change', handleFileSelect, false);
function moveData(json){
console.log("MoveData for", json);
for (var k in json){
@ -997,20 +997,20 @@
}
}
}
document.getElementById("timeoutwrap").addEventListener("click", function() {
document.getElementById("forceOrigPlane").disabled = !document.getElementById("timeoutwrap").checked;
});
document.getElementById("btnSave").addEventListener("click", function() {
var h = document.createElement('a');
h.href = 'data:text/json;charset=utf-8,' + encodeURI(JSON.stringify(resultJson));
h.href = 'data:text/json;charset=utf-8,' + encodeURI(JSON.stringify(resultJson));
h.target = '_blank';
h.download = "imageclock.resources.json";
h.click();
});
document.getElementById("btnUpload").addEventListener("click", function() {
var appDef = {
id : "imageclock",
storage:[
@ -1025,10 +1025,10 @@
appDef.storage.push({name:"imageclock.draw.js", content: precompiledJs.length > 0 ? precompiledJs : "//empty"});
appDef.storage.push({name:"imageclock.face.json", content: JSON.stringify(faceJson)});
console.log("Uploading app:", appDef);
console.log("Uploading app:", appDef);
sendCustomizedApp(appDef);
});
function handleZipSelect(evt) {
@ -1040,18 +1040,18 @@
document.getElementById('btnSaveZip').disabled = true;
document.getElementById('btnUpload').disabled = true;
JSZip.loadAsync(f).then(function(zip) {
console.log("Zip loaded", zip);
result = "";
resultJson= {};
var resourceFiles = [];
var promise = zip.file("face.json").async("string").then((data)=>{
console.log("face.json data", data);
faceJson = parseFaceJson(data);
});
if (isNativeFormat()){
promise = promise.then(zip.file("info.json").async("string").then((data)=>{
console.log("info.json data", data);
@ -1062,12 +1062,12 @@
"color": "3bit",
"transparent": true
};
}
zip.folder("resources").forEach(function (relativePath, file){
console.log("iterating over", relativePath);
if (!file.dir){
expectedFiles++;
promise = promise.then(file.async("blob").then(function (blob) {
@ -1079,14 +1079,14 @@
img.path = this.path;
img.onload = imageLoaded;
img.src = event.target.result;
};
};
reader.readAsDataURL(blob);
}));
}
});
}, function (e) {
console.log("Error reading " + f.name + ": " + e.message);
});
@ -1095,11 +1095,11 @@
console.log("Zip select event", evt);
var files = evt.target.files;
if (files.length > 1){
alert("Only one file allowed");
}
handleFile(files[0]);
}
@ -1113,22 +1113,22 @@
});
}
document.getElementById("btnSaveFace").addEventListener("click", function() {
var h = document.createElement('a');
h.href = 'data:text/json;charset=utf-8,' + encodeURI(JSON.stringify(faceJson));
h.href = 'data:text/json;charset=utf-8,' + encodeURI(JSON.stringify(faceJson));
h.target = '_blank';
h.download = "face.json";
h.click();
});
document.getElementById('zipLoader').addEventListener('change', handleZipSelect, false);
document.getElementById('btnSaveZip').addEventListener('click', handleZipExport, false);
document.getElementById('btnSave').disabled = true;
document.getElementById('btnSaveFace').disabled = true;
document.getElementById('btnSaveZip').disabled = true;
document.getElementById('btnUpload').disabled = true;
</script>
</body>

View File

@ -10,7 +10,7 @@
</div>
<script src="../../core/lib/customize.js"></script>
<script src="../../core/lib/imageconverter.js"></script>
<script src="../../webtools/imageconverter.js"></script>
<script>
var faces = [];

View File

@ -39,8 +39,8 @@
<script src="../../core/lib/customize.js"></script>
<script src="https://unpkg.com/leaflet@1.0.3/dist/leaflet.js"></script>
<script src="https://code.jquery.com/jquery-3.2.1.min.js"></script>
<script src="../../core/lib/heatshrink.js"></script>
<script src="../../core/lib/imageconverter.js"></script>
<script src="../../webtools/heatshrink.js"></script>
<script src="../../webtools/imageconverter.js"></script>
<script src="https://unpkg.com/leaflet-geosearch@3.6.0/dist/bundle.min.js"></script>
<script>

View File

@ -43,8 +43,8 @@
<script src="../../core/lib/customize.js"></script>
<script src="https://unpkg.com/leaflet@1.0.3/dist/leaflet.js"></script>
<script src="https://code.jquery.com/jquery-3.2.1.min.js"></script>
<script src="../../core/lib/heatshrink.js"></script>
<script src="../../core/lib/imageconverter.js"></script>
<script src="../../webtools/heatshrink.js"></script>
<script src="../../webtools/imageconverter.js"></script>
<script src="https://unpkg.com/leaflet-geosearch@3.6.0/dist/bundle.min.js"></script>
<script>

View File

@ -106,8 +106,8 @@
<script src="../../core/lib/customize.js"></script>
<script src="../../core/lib/qrcode.min.js"></script><!-- https://davidshimjs.github.io/qrcodejs/ -->
<script src="../../core/lib/heatshrink.js"></script>
<script src="../../core/lib/imageconverter.js"></script>
<script src="../../webtools/heatshrink.js"></script>
<script src="../../webtools/imageconverter.js"></script>
<script src="./qr-scanner.umd.min.js"></script><!-- https://github.com/nimiq/qr-scanner -->
<script>
var targetSize = 200;

View File

@ -114,7 +114,7 @@ function evaluateFile(file) {
var hsStart = 'require("heatshrink").decompress(atob("';
var hsEnd = '"))';
if (file.content.startsWith(hsStart) && file.content.endsWith(hsEnd)) {
var heatshrink = require(ROOTDIR+"/core/lib/heatshrink.js");
var heatshrink = require(ROOTDIR+"/webtools/heatshrink.js");
var b64 = file.content.slice(hsStart.length, -hsEnd.length);
var decompressed = heatshrink.decompress(atob(b64));
file.content = "";

View File

@ -3,7 +3,7 @@
*/
var fs = require("fs");
var heatshrink = require("../core/lib/heatshrink");
var heatshrink = require("../webtools/heatshrink");
var acorn;
try {
acorn = require("acorn");

2
core

@ -1 +1 @@
Subproject commit aae64595cf0b42e9c72003921ffd2e0bde5e8f88
Subproject commit 052b072fb745934cceff568c743717330b7e5b32

View File

@ -186,9 +186,9 @@
</footer>
<script src="webtools/puck.js"></script>
<script src="webtools/heatshrink.js"></script>
<script src="core/lib/marked.min.js"></script>
<script src="core/lib/espruinotools.js"></script>
<script src="core/lib/heatshrink.js"></script>
<script src="core/js/utils.js"></script>
<script src="loader.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jszip/3.7.1/jszip.min.js"></script> <!-- for backup.js -->