2019-10-30 17:33:58 +00:00
|
|
|
function escapeHtml(text) {
|
2020-05-28 07:20:41 +00:00
|
|
|
let map = {
|
2019-10-30 17:33:58 +00:00
|
|
|
'&': '&',
|
|
|
|
'<': '<',
|
|
|
|
'>': '>',
|
|
|
|
'"': '"',
|
|
|
|
"'": '''
|
|
|
|
};
|
|
|
|
return text.replace(/[&<>"']/g, function(m) { return map[m]; });
|
|
|
|
}
|
2020-04-11 22:26:08 +00:00
|
|
|
// simple glob to regex conversion, only supports "*" and "?" wildcards
|
|
|
|
function globToRegex(pattern) {
|
|
|
|
const ESCAPE = '.*+-?^${}()|[]\\';
|
|
|
|
const regex = pattern.replace(/./g, c => {
|
|
|
|
switch (c) {
|
|
|
|
case '?': return '.';
|
|
|
|
case '*': return '.*';
|
|
|
|
default: return ESCAPE.includes(c) ? ('\\' + c) : c;
|
|
|
|
}
|
|
|
|
});
|
|
|
|
return new RegExp('^'+regex+'$');
|
|
|
|
}
|
2019-10-30 17:33:58 +00:00
|
|
|
function htmlToArray(collection) {
|
|
|
|
return [].slice.call(collection);
|
|
|
|
}
|
|
|
|
function htmlElement(str) {
|
2020-05-28 07:20:41 +00:00
|
|
|
let div = document.createElement('div');
|
2019-10-30 17:33:58 +00:00
|
|
|
div.innerHTML = str.trim();
|
|
|
|
return div.firstChild;
|
|
|
|
}
|
|
|
|
function httpGet(url) {
|
2020-05-29 12:27:27 +00:00
|
|
|
let isBinary = !(url.endsWith(".js") || url.endsWith(".json") || url.endsWith(".csv") || url.endsWith(".txt"));
|
2019-10-30 17:33:58 +00:00
|
|
|
return new Promise((resolve,reject) => {
|
2020-05-28 07:20:41 +00:00
|
|
|
let oReq = new XMLHttpRequest();
|
2019-11-10 12:16:28 +00:00
|
|
|
oReq.addEventListener("load", () => {
|
2020-05-29 12:27:27 +00:00
|
|
|
if (oReq.status!=200) {
|
|
|
|
resolve(oReq.status+" - "+oReq.statusText)
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
if (!isBinary) {
|
|
|
|
resolve(oReq.responseText)
|
|
|
|
} else {
|
|
|
|
// ensure we actually load the data as a raw 8 bit string (not utf-8/etc)
|
2020-05-28 13:33:37 +00:00
|
|
|
let a = new FileReader();
|
|
|
|
a.onloadend = function() {
|
|
|
|
let bytes = new Uint8Array(a.result);
|
|
|
|
let str = "";
|
|
|
|
for (let i=0;i<bytes.length;i++)
|
|
|
|
str += String.fromCharCode(bytes[i]);
|
|
|
|
resolve(str)
|
|
|
|
};
|
|
|
|
a.readAsArrayBuffer(oReq.response);
|
2020-05-29 12:27:27 +00:00
|
|
|
}
|
2019-11-10 12:16:28 +00:00
|
|
|
});
|
2019-10-30 17:33:58 +00:00
|
|
|
oReq.addEventListener("error", () => reject());
|
|
|
|
oReq.addEventListener("abort", () => reject());
|
2020-05-12 21:01:22 +00:00
|
|
|
oReq.open("GET", url, true);
|
|
|
|
oReq.onerror = function () {
|
|
|
|
reject("HTTP Request failed");
|
|
|
|
};
|
2020-05-29 12:27:27 +00:00
|
|
|
if (isBinary)
|
|
|
|
oReq.responseType = 'blob';
|
2019-10-30 17:33:58 +00:00
|
|
|
oReq.send();
|
|
|
|
});
|
|
|
|
}
|
|
|
|
function toJS(txt) {
|
|
|
|
return JSON.stringify(txt);
|
|
|
|
}
|
|
|
|
// callback for sorting apps
|
|
|
|
function appSorter(a,b) {
|
|
|
|
if (a.unknown || b.unknown)
|
|
|
|
return (a.unknown)? 1 : -1;
|
2020-05-28 07:20:41 +00:00
|
|
|
let sa = 0|a.sortorder;
|
|
|
|
let sb = 0|b.sortorder;
|
2019-11-07 08:43:56 +00:00
|
|
|
if (sa<sb) return -1;
|
|
|
|
if (sa>sb) return 1;
|
2019-10-30 17:33:58 +00:00
|
|
|
return (a.name==b.name) ? 0 : ((a.name<b.name) ? -1 : 1);
|
|
|
|
}
|
2020-02-07 14:51:31 +00:00
|
|
|
|
|
|
|
/* Given 2 JSON structures (1st from apps.json, 2nd from an installed app)
|
|
|
|
work out what to display re: versions and if we can update */
|
|
|
|
function getVersionInfo(appListing, appInstalled) {
|
2020-05-28 07:20:41 +00:00
|
|
|
let versionText = "";
|
|
|
|
let canUpdate = false;
|
2020-02-13 10:12:49 +00:00
|
|
|
function clicky(v) {
|
2020-04-20 07:27:57 +00:00
|
|
|
return `<a class="c-hand" onclick="showChangeLog('${appListing.id}')">${v}</a>`;
|
2020-02-13 10:12:49 +00:00
|
|
|
}
|
|
|
|
|
2020-02-07 14:51:31 +00:00
|
|
|
if (!appInstalled) {
|
|
|
|
if (appListing.version)
|
2020-02-13 10:12:49 +00:00
|
|
|
versionText = clicky("v"+appListing.version);
|
2020-02-07 14:51:31 +00:00
|
|
|
} else {
|
2020-04-14 15:15:43 +00:00
|
|
|
versionText = (appInstalled.version ? (clicky("v"+appInstalled.version)) : "Unknown version");
|
2020-02-07 14:51:31 +00:00
|
|
|
if (appListing.version != appInstalled.version) {
|
2020-02-13 10:12:49 +00:00
|
|
|
if (appListing.version) versionText += ", latest "+clicky("v"+appListing.version);
|
2020-02-07 14:51:31 +00:00
|
|
|
canUpdate = true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return {
|
|
|
|
text : versionText,
|
|
|
|
canUpdate : canUpdate
|
|
|
|
}
|
|
|
|
}
|