Changeset 2107932
- Timestamp:
- 06/18/2019 09:32:28 AM (7 years ago)
- Location:
- easycoder/trunk
- Files:
-
- 1 added
- 8 edited
-
easycoder-min.js (modified) (1 diff)
-
easycoder.js (modified) (29 diffs)
-
easycoder.php (modified) (2 diffs)
-
plugins/browser.js (modified) (16 diffs)
-
plugins/json.js (modified) (4 diffs)
-
plugins/rest.js (modified) (2 diffs)
-
readme.txt (modified) (2 diffs)
-
rest.php (modified) (16 diffs)
-
scripted (added)
Legend:
- Unmodified
- Added
- Removed
-
easycoder/trunk/easycoder-min.js
r2102119 r2107932 3 3 $jscomp.initSymbolIterator=function(){$jscomp.initSymbol();var d=$jscomp.global.Symbol.iterator;d||(d=$jscomp.global.Symbol.iterator=$jscomp.global.Symbol("iterator"));"function"!=typeof Array.prototype[d]&&$jscomp.defineProperty(Array.prototype,d,{configurable:!0,writable:!0,value:function(){return $jscomp.arrayIterator(this)}});$jscomp.initSymbolIterator=function(){}};$jscomp.arrayIterator=function(d){var h=0;return $jscomp.iteratorPrototype(function(){return h<d.length?{done:!1,value:d[h++]}:{done:!0}})}; 4 4 $jscomp.iteratorPrototype=function(d){$jscomp.initSymbolIterator();d={next:d};d[$jscomp.global.Symbol.iterator]=function(){return this};return d};$jscomp.makeIterator=function(d){$jscomp.initSymbolIterator();var h=d[Symbol.iterator];return h?h.call(d):$jscomp.arrayIterator(d)};$jscomp.owns=function(d,h){return Object.prototype.hasOwnProperty.call(d,h)}; 5 $jscomp.assign="function"==typeof Object.assign?Object.assign:function(d,h){for(var g=1;g<arguments.length;g++){var e=arguments[g];if(e)for(var b in e)$jscomp.owns(e,b)&&(d[b]=e[b])}return d};$jscomp.polyfill=function(d,h,g,e){if(h){g=$jscomp.global;d=d.split(".");for(e=0;e<d.length-1;e++){var b=d[e];b in g||(g[b]={});g=g[b]}d=d[d.length-1];e=g[d];h=h(e);h!=e&&null!=h&&$jscomp.defineProperty(g,d,{configurable:!0,writable:!0,value:h})}};6 $jscomp.polyfill("Object.assign",function(d){return d||$jscomp.assign},"es6","es3");$jscomp.iteratorFromArray=function(d,h){$jscomp.initSymbolIterator();d instanceof String&&(d+="");var g=0, e={next:function(){if(g<d.length){var b=g++;return{value:h(b,d[b]),done:!1}}e.next=function(){return{done:!0,value:void 0}};return e.next()}};e[Symbol.iterator]=function(){return e};return e};5 $jscomp.assign="function"==typeof Object.assign?Object.assign:function(d,h){for(var g=1;g<arguments.length;g++){var f=arguments[g];if(f)for(var b in f)$jscomp.owns(f,b)&&(d[b]=f[b])}return d};$jscomp.polyfill=function(d,h,g,f){if(h){g=$jscomp.global;d=d.split(".");for(f=0;f<d.length-1;f++){var b=d[f];b in g||(g[b]={});g=g[b]}d=d[d.length-1];f=g[d];h=h(f);h!=f&&null!=h&&$jscomp.defineProperty(g,d,{configurable:!0,writable:!0,value:h})}}; 6 $jscomp.polyfill("Object.assign",function(d){return d||$jscomp.assign},"es6","es3");$jscomp.iteratorFromArray=function(d,h){$jscomp.initSymbolIterator();d instanceof String&&(d+="");var g=0,f={next:function(){if(g<d.length){var b=g++;return{value:h(b,d[b]),done:!1}}f.next=function(){return{done:!0,value:void 0}};return f.next()}};f[Symbol.iterator]=function(){return f};return f}; 7 7 $jscomp.polyfill("Array.prototype.keys",function(d){return d?d:function(){return $jscomp.iteratorFromArray(this,function(d){return d})}},"es6","es3");$jscomp.checkStringArgs=function(d,h,g){if(null==d)throw new TypeError("The 'this' value for String.prototype."+g+" must not be null or undefined");if(h instanceof RegExp)throw new TypeError("First argument to String.prototype."+g+" must not be a regular expression");return d+""}; 8 $jscomp.polyfill("String.prototype.endsWith",function(d){return d?d:function(d,g){var e=$jscomp.checkStringArgs(this,d,"endsWith");d+="";void 0===g&&(g=e.length);g=Math.max(0,Math.min(g|0,e.length));for(var b=d.length;0<b&&0<g;)if(e[--g]!=d[--b])return!1;return 0>=b}},"es6","es3");$jscomp.polyfill("Object.is",function(d){return d?d:function(d,g){return d===g?0!==d||1/d===1/g:d!==d&&g!==g}},"es6","es3");9 $jscomp.polyfill("Array.prototype.includes",function(d){return d?d:function(d,g){var e=this;e instanceof String&&(e=String(e));var b=e.length;g=g||0;for(0>g&&(g=Math.max(g+b,0));g<b;g++){var a=e[g];if(a===d||Object.is(a,d))return!0}return!1}},"es7","es3");$jscomp.polyfill("String.prototype.includes",function(d){return d?d:function(d,g){return-1!==$jscomp.checkStringArgs(this,d,"includes").indexOf(d,g||0)}},"es6","es3");10 $jscomp.polyfill("Math.trunc",function(d){return d?d:function(d){d=Number(d);if(isNaN(d)||Infinity===d||-Infinity===d||0===d)return d;var h=Math.floor(Math.abs(d));return 0>d?-h:h}},"es6","es3");$jscomp.polyfill("String.prototype.repeat",function(d){return d?d:function(d){var h=$jscomp.checkStringArgs(this,null,"repeat");if(0>d||1342177279<d)throw new RangeError("Invalid count value");d|=0;for(var e="";d;)if(d&1&&(e+=h),d>>>=1)h+=h;return e}},"es6","es3");11 $jscomp.stringPadding=function(d,h){d=void 0!==d?String(d):" ";return 0<h&&d?d.repeat(Math.ceil(h/d.length)).substring(0,h):""};$jscomp.polyfill("String.prototype.padStart",function(d){return d?d:function(d,g){var e=$jscomp.checkStringArgs(this,null,"padStart");return $jscomp.stringPadding(g,d-e.length)+e}},"es8","es3");$jscomp.polyfill("Number.isFinite",function(d){return d?d:function(d){return"number"!==typeof d?!1:!isNaN(d)&&Infinity!==d&&-Infinity!==d}},"es6","es3");8 $jscomp.polyfill("String.prototype.endsWith",function(d){return d?d:function(d,g){var f=$jscomp.checkStringArgs(this,d,"endsWith");d+="";void 0===g&&(g=f.length);g=Math.max(0,Math.min(g|0,f.length));for(var b=d.length;0<b&&0<g;)if(f[--g]!=d[--b])return!1;return 0>=b}},"es6","es3");$jscomp.polyfill("Object.is",function(d){return d?d:function(d,g){return d===g?0!==d||1/d===1/g:d!==d&&g!==g}},"es6","es3"); 9 $jscomp.polyfill("Array.prototype.includes",function(d){return d?d:function(d,g){var f=this;f instanceof String&&(f=String(f));var b=f.length;g=g||0;for(0>g&&(g=Math.max(g+b,0));g<b;g++){var a=f[g];if(a===d||Object.is(a,d))return!0}return!1}},"es7","es3");$jscomp.polyfill("String.prototype.includes",function(d){return d?d:function(d,g){return-1!==$jscomp.checkStringArgs(this,d,"includes").indexOf(d,g||0)}},"es6","es3"); 10 $jscomp.polyfill("Math.trunc",function(d){return d?d:function(d){d=Number(d);if(isNaN(d)||Infinity===d||-Infinity===d||0===d)return d;var h=Math.floor(Math.abs(d));return 0>d?-h:h}},"es6","es3");$jscomp.polyfill("String.prototype.repeat",function(d){return d?d:function(d){var h=$jscomp.checkStringArgs(this,null,"repeat");if(0>d||1342177279<d)throw new RangeError("Invalid count value");d|=0;for(var f="";d;)if(d&1&&(f+=h),d>>>=1)h+=h;return f}},"es6","es3"); 11 $jscomp.stringPadding=function(d,h){d=void 0!==d?String(d):" ";return 0<h&&d?d.repeat(Math.ceil(h/d.length)).substring(0,h):""};$jscomp.polyfill("String.prototype.padStart",function(d){return d?d:function(d,g){var f=$jscomp.checkStringArgs(this,null,"padStart");return $jscomp.stringPadding(g,d-f.length)+f}},"es8","es3");$jscomp.polyfill("Number.isFinite",function(d){return d?d:function(d){return"number"!==typeof d?!1:!isNaN(d)&&Infinity!==d&&-Infinity!==d}},"es6","es3"); 12 12 $jscomp.polyfill("Number.isInteger",function(d){return d?d:function(d){return Number.isFinite(d)?d===Math.floor(d):!1}},"es6","es3"); 13 (function(){function d(h,g, e){function b(c,m){if(!g[c]){if(!h[c]){var f="function"==typeof require&&require;if(!m&&f)return f(c,!0);if(a)return a(c,!0);m=Error("Cannot find module '"+c+"'");throw m.code="MODULE_NOT_FOUND",m;}m=g[c]={exports:{}};h[c][0].call(m.exports,function(a){return b(h[c][1][a]||a)},m,m.exports,d,h,g,e)}return g[c].exports}for(var a="function"==typeof require&&require,c=0;c<e.length;c++)b(e[c]);return b}return d})()({1:[function(d,h,g){var e=d("./easycoder/Main");e.version="2.3.1";14 e.timestamp=Date.now();console.log("EasyCoder loaded; waiting for page");window.onload=function(){console.log(Date.now()-e.timestamp+" ms: Page loaded; reset timer & start EasyCoder");e.timestamp=Date.now();e.scripts={};window.EasyCoder=e;var b=document.getElementById("easycoder-script");if(b){b.style.display="none";try{e.start(b.innerText)}catch(a){e.reportError(a)}}}},{"./easycoder/Main":6}],2:[function(d,h,g){h.exports=function(d,b,a){b=d.value.evaluate(d,b);d=d.value.evaluate(d,a);a=b.content;15 var c=d.content; b.numeric&&!d.numeric&&(a=a.toString());!b.numeric&&d.numeric&&(c=c.toString());b.numeric||"undefined"!==typeof a||(a="");d.numeric||"undefined"!==typeof c||(c="");return a>c?1:a<c?-1:0}},{}],3:[function(d,h,g){var e=Object.assign||function(a){for(var c=1;c<arguments.length;c++){var b=arguments[c],d;for(d in b)Object.prototype.hasOwnProperty.call(b,d)&&(a[d]=b[d])}return a},b=this,a={getTokens:function(){return b.tokens},addWarning:function(a){b.warnings.push(a)},warning:function(c){a.addWarning(c)},13 (function(){function d(h,g,f){function b(c,m){if(!g[c]){if(!h[c]){var e="function"==typeof require&&require;if(!m&&e)return e(c,!0);if(a)return a(c,!0);m=Error("Cannot find module '"+c+"'");throw m.code="MODULE_NOT_FOUND",m;}m=g[c]={exports:{}};h[c][0].call(m.exports,function(a){return b(h[c][1][a]||a)},m,m.exports,d,h,g,f)}return g[c].exports}for(var a="function"==typeof require&&require,c=0;c<f.length;c++)b(f[c]);return b}return d})()({1:[function(d,h,g){var f=d("./easycoder/Main");f.version="2.4.0"; 14 f.timestamp=Date.now();console.log("EasyCoder loaded; waiting for page");window.onload=function(){console.log(Date.now()-f.timestamp+" ms: Page loaded; reset timer & start EasyCoder");f.timestamp=Date.now();f.scripts={};window.EasyCoder=f;var b=document.getElementById("easycoder-script");if(b){b.style.display="none";try{f.start(b.innerText)}catch(a){f.reportError(a)}}}},{"./easycoder/Main":6}],2:[function(d,h,g){h.exports=function(d,b,a){b=d.value.evaluate(d,b);d=d.value.evaluate(d,a);a=b.content; 15 var c=d.content;a&&b.numeric?d.numeric||(c="undefined"===typeof c?0:parseInt(c)):(c&&d.numeric&&(c=c.toString()),"undefined"===typeof a&&(a=""),"undefined"===typeof c&&(c=""));return a>c?1:a<c?-1:0}},{}],3:[function(d,h,g){var f=Object.assign||function(a){for(var c=1;c<arguments.length;c++){var b=arguments[c],d;for(d in b)Object.prototype.hasOwnProperty.call(b,d)&&(a[d]=b[d])}return a},b=this,a={getTokens:function(){return b.tokens},addWarning:function(a){b.warnings.push(a)},warning:function(c){a.addWarning(c)}, 16 16 unrecognisedSymbol:function(c){a.addWarning("Unrecognised symbol '"+c+"'")},getWarnings:function(){return b.warnings},getIndex:function(){return b.index},next:function(a){b.index+=void 0===a?1:a},peek:function(){return b.tokens[b.index+1].token},more:function(){return b.index<b.tokens.length},getToken:function(){return b.index>=b.tokens.length?null:b.tokens[b.index]?b.tokens[b.index].token:null},nextToken:function(){a.next();return a.getToken()},tokenIs:function(a){return b.index>=b.tokens.length? 17 17 !1:a===b.tokens[b.index].token},nextTokenIs:function(c){a.next();return a.tokenIs(c)},skip:function(c){if(b.index>=b.tokens.length)return null;a.next();a.tokenIs(c)&&a.next()},prev:function(){b.index--},getLino:function(){return b.index>=b.tokens.length?0:b.tokens[b.index].lino},getTarget:function(a){a=void 0===a?b.index:a;return b.tokens[a].token},getTargetPc:function(c){c=void 0===c?b.index:c;return b.symbols[a.getTarget(c)].pc},getCommandAt:function(a){return b.program[a]},isSymbol:function(c){c= 18 18 void 0===c?!1:c;if(a.getTarget()in b.symbols)return!0;if(c)throw Error("Unknown symbol: '"+a.getTarget()+"'");return!1},nextIsSymbol:function(c){c=void 0===c?!1:c;a.next();return a.isSymbol(c)},getSymbol:function(){return b.symbols[a.getToken()]},getSymbolPc:function(){return a.getSymbol().pc},getSymbolRecord:function(){var c=b.program[a.getSymbolPc()];c.used=!0;return c},getSymbols:function(){return b.symbols},getProgram:function(){return b.program},getPc:function(){return b.program.length},getValue:function(){return a.value.compile(a)}, 19 getNextValue:function(){a.next();return a.getValue()},getCondition:function(){return a.condition.compile(a)},constant:function(c,f){return a.value.constant(c,void 0===f?!1:f)},addCommand:function(a){b.program.push(e({pc:b.program.length},a))},addSymbol:function(a,f){b.symbols[a]={pc:f}},mark:function(){b.savedMark=b.index},rewind:function(){b.index=b.savedMark},rewindTo:function(a){b.index=a},completeHandler:function(){var c=a.getLino(),f=a.getPc();a.addCommand({domain:"core",keyword:"goto",lino:c, 20 goto:0});a.compileOne();a.addCommand({domain:"core",keyword:"stop",lino:c,next:0});a.getCommandAt(f).goto=a.getPc();return!0},compileVariable:function(c,f,m,d){m=void 0===m?!1:m;d=void 0===d?null:d;a.next();var p=a.getLino(),l=a.getTokens()[a.getIndex()];if(b.symbols[l.token])throw Error("Duplicate variable name '"+l.token+"'");var n=a.getPc();a.next();a.addSymbol(l.token,n);c={domain:c,keyword:f,lino:p,isSymbol:!0,used:!1,isValueHolder:m,name:l.token,elements:1,index:0,value:[{}],element:[],extra:d}; 21 "dom"===d&&(c.element=[]);a.addCommand(c);return c},compileToken:function(){var c=a.getToken();if(c){a.mark();for(var f=$jscomp.makeIterator(Object.keys(a.domain)),b=f.next();!b.done;b=f.next()){if((b=a.domain[b.value])&&(b=b.getHandler(c))&&b.compile(a))return;a.rewind()}console.log("No handler found");throw Error("I don't understand '"+c+"...'");}},compileOne:function(){var c=a.getToken();if(c){b.warnings=[];var f=b.program.length;if(c.endsWith(":")){c=c.substring(0,c.length-1);if(b.symbols[c])throw Error("Duplicate symbol: '"+ 22 c+"'");b.symbols[c]={pc:f};b.index++}else a.compileToken()}},compileFromHere:function(c){for(;b.index<b.tokens.length;){var f=b.tokens[b.index].token;if("else"===f)return b.program;a.compileOne();if(-1<c.indexOf(f))break}},compile:function(c){b.tokens=c;b.index=0;b.program=[];b.symbols={};b.warnings=[];a.compileFromHere([]);a.addCommand({domain:"core",keyword:"exit",lino:a.getLino(),next:0});for(var f in b.symbols)c=b.program[b.symbols[f].pc],c.isSymbol&&!c.used&&console.log("Symbol '"+c.name+"' has not been used."); 23 return b.program}};h.exports=a},{}],4:[function(d,h,g){var e=Object.assign||function(b){for(var a=1;a<arguments.length;a++){var c=arguments[a],f;for(f in c)Object.prototype.hasOwnProperty.call(c,f)&&(b[f]=c[f])}return b};h.exports={compile:function(b){b.mark();for(var a=$jscomp.makeIterator(Object.keys(b.domain)),c=a.next();!c.done;c=a.next()){if(c=b.domain[c.value].condition.compile(b))return e({domain:name},c);b.rewind()}},test:function(b,a){return b.domain[a.domain].condition.test(b,a)}}},{}], 24 5:[function(d,h,g){var e=this,b={Add:{compile:function(a){var c=a.getLino();a.next();var f=a.getValue();if(a.tokenIs("to"))if(a.next(),a.isSymbol()){var b=a.getSymbol();if(a.getCommandAt(b.pc).isValueHolder){if("giving"===a.peek()){b=a.getValue();a.next();var d=a.getToken();a.next();a.addCommand({domain:"core",keyword:"add",lino:c,value1:f,value2:b,target:d})}else b=a.getToken(),a.next(),a.addCommand({domain:"core",keyword:"add",lino:c,value1:f,target:b});return!0}a.warning("core "+e.name+": Expected value holder")}else{b= 25 a.getValue();if(a.tokenIs("giving"))return a.next(),d=a.getToken(),a.next(),a.addCommand({domain:"core",keyword:"add",lino:c,value1:f,value2:b,target:d}),!0;a.warning("core "+e.name+': Expected "giving"')}return!1},run:function(a){var c=a[a.pc],f=c.value1,b=c.value2,d=a.getSymbolRecord(c.target);if(d.isValueHolder){var e=d.value[d.index];b?(a=a.getValue(b)+a.getValue(f),d.value[d.index]={type:"constant",numeric:!0,content:a}):(!e.numeric&&isNaN(e.content)&&a.nonNumericValueError(c.lino),a=parseInt(e.content)+ 26 parseInt(a.getValue(f)),d.value[d.index]={type:"constant",numeric:!0,content:a})}else a.variableDoesNotHoldAValueError(c.lino,d.name);return c.pc+1}},Alias:{compile:function(a){var c=a.getLino();a.next();if(a.isSymbol()){var f=a.getToken();a.next();if(a.tokenIs("to")&&(a.next(),a.isSymbol())){var b=a.getSymbolRecord();b.used=!0;a.next();a.addCommand({domain:"core",keyword:"alias",lino:c,alias:f,symbol:b.name});return!0}}return!1},run:function(a){var c=a[a.pc],f=a.symbols[c.alias].pc,b=a[f],d=a.getSymbolRecord(c.symbol); 27 a[f]={pc:b.pc,domain:d.domain,keyword:d.keyword,lino:b.lino,name:b.name,alias:c.symbol};return c.pc+1}},Begin:{compile:function(a){a.next();a.compileFromHere(["end"]);return!0},run:function(a){return a[a.pc].pc+1}},Callback:{compile:function(a){a.compileVariable("core","callback");return!0},run:function(a){return a[a.pc].pc+1}},Clear:{compile:function(a){var c=a.getLino();a.next();if(a.isSymbol()){var f=a.getSymbolRecord();if(f.isValueHolder)return f=a.getToken(),a.next(),a.addCommand({domain:"core", 28 keyword:"clear",lino:c,symbol:f}),!0;a.warning("'Variable '"+f.name+"' does not hold a value")}return!1},run:function(a){var c=a[a.pc],f=a.getSymbolRecord(c.symbol);f.isValueHolder?(a.domain[f.domain].value.put(f,{type:"boolean",content:!1}),c.numeric=!1):a.variableDoesNotHoldAValueError(c.lino,f.name);return c.pc+1}},Close:{compile:function(a){var c=a.getLino();if(a.nextIsSymbol()){var f=a.getSymbolRecord();if("module"===f.keyword)return a.next(),a.addCommand({domain:"core",keyword:"close",lino:c, 29 module:f.name}),!0}return!1},run:function(a){var c=a[a.pc];a=a.getSymbolRecord(c.module).program;a.run(a.onClose);return c.pc+1}},Debug:{compile:function(a){var c=a.getLino();if(a.nextTokenIs("program")){a.next();if(["item","pc"].includes(a.getToken())){var f=a.getNextValue();a.addCommand({domain:"core",keyword:"debug",lino:c,item:f});return!0}a.addCommand({domain:"core",keyword:"debug",lino:c,item:"program"});return!0}return a.tokenIs("symbols")?(a.next(),a.addCommand({domain:"core",keyword:"debug", 30 lino:c,item:"symbols"}),!0):a.tokenIs("symbol")?(f=a.nextToken(),a.next(),a.addCommand({domain:"core",keyword:"debug",lino:c,item:"symbol",name:f}),!0):a.tokenIs("step")?(a.next(),a.addCommand({domain:"core",keyword:"debug",lino:c,item:"step"}),!0):!1},run:function(a){var c=a[a.pc],f=c.item;switch(f){case "symbols":console.log("Symbols: "+JSON.stringify(a.symbols,null,2));break;case "symbol":a=a.getSymbolRecord(c.name);f=a.exporter;delete a.exporter;console.log("Symbol: "+JSON.stringify(a,null,2)); 31 a.exporter=f;break;case "step":a.debugStep=!0;break;case "program":console.log("Debug program: "+JSON.stringify(a,null,2));break;default:0<=f.content&&console.log("Debug item "+f.content+": "+JSON.stringify(a[f.content],null,2))}return c.pc+1}},Decode:{compile:function(a){var c=a.getLino();if(a.nextIsSymbol()){var f=a.getToken();a.next();a.addCommand({domain:"core",keyword:"decode",lino:c,symbol:f});return!0}return!1},run:function(a){var c=a[a.pc],f=a.getSymbolRecord(c.symbol);if(f.isValueHolder){var b= 32 a.getValue(f.value[f.index]);f.value[f.index]={type:"constant",numeric:!1,content:a.decode(b)};c.numeric=!1}else a.variableDoesNotHoldAValueError(c.lino,f.name);return c.pc+1}},Divide:{compile:function(a){var c=a.getLino();if(a.nextIsSymbol()){var f=a.getSymbol();var b=a.getCommandAt(f.pc).name}f=a.getValue();a.tokenIs("by")&&a.next();var d=a.getValue();if(a.tokenIs("giving")){a.next();if(a.isSymbol())return b=a.getSymbol(),b=a.getCommandAt(b.pc).name,a.next(),a.addCommand({domain:"core",keyword:"divide", 33 lino:c,value1:f,value2:d,target:b}),!0;a.warning("core "+e.name+": Expected value holder")}else return"undefined"===typeof b&&a.warning("core "+e.name+": No target variable given"),a.addCommand({domain:"core",keyword:"divide",lino:c,value2:d,target:b}),!0;return!1},run:function(a){var c=a[a.pc],f=c.value1,b=c.value2,d=a.getSymbolRecord(c.target);if(d.isValueHolder){var e=d.value[d.index];f?(a=a.getValue(f)/a.getValue(b),d.value[d.index]={type:"constant",numeric:!0,content:Math.trunc(a)}):(!e.numeric&& 34 isNaN(e.content)&&a.nonNumericValueError(c,lino),a=parseInt(e.content)/parseInt(a.getValue(b)),d.value[d.index]={type:"constant",numeric:!0,content:Math.trunc(a)})}else a.variableDoesNotHoldAValueError(c.lino,d.name);return c.pc+1}},Encode:{compile:function(a){var c=a.getLino();a.next();if(a.isSymbol()){var f=a.getToken();a.next();a.addCommand({domain:"core",keyword:"encode",lino:c,symbol:f});return!0}return!1},run:function(a){var c=a[a.pc],f=a.getSymbolRecord(c.symbol);if(f.isValueHolder){var b= 35 a.getValue(f.value[f.index]);f.value[f.index]={type:"constant",numeric:!1,content:a.encode(b)};c.numeric=!1}else a.variableDoesNotHoldAValueError(c.lino,f.name);return c.pc+1}},End:{compile:function(a){a.next();return!0},run:function(){return 0}},Exit:{compile:function(a){a.next();a.addCommand({domain:"core",keyword:"exit"});return!0},run:function(a){a.exit();return 0}},Fork:{compile:function(a){var c=a.getLino();a.next();a.nextTokenIs("to")&&a.next();var f=a.getToken();a.next();a.addCommand({domain:"core", 36 keyword:"fork",lino:c,label:f});return!0},run:function(a){var c=a[a.pc];try{a.run(a.symbols[c.label].pc)}catch(f){console.log(f.message),alert(f.message)}return c.pc+1}},Go:{compile:function(a){var c=a.getLino();a.nextTokenIs("to")&&a.next();var f=a.getToken();a.next();a.addCommand({domain:"core",keyword:"go",lino:c,label:f});return!0},run:function(a){var c=a[a.pc];if(c.label){if(a.verifySymbol(c.label)){var f=a.symbols[c.label];if(f)return f.pc}a.runtimeError(c.lino,"Unknown symbol '"+c.label+"'"); 37 return 0}return c.goto}},Gosub:{compile:function(a){var c=a.getLino();a.nextTokenIs("to")&&a.next();var f=a.getToken();a.next();a.addCommand({domain:"core",keyword:"gosub",lino:c,label:f});return!0},run:function(a){var c=a[a.pc];if(a.verifySymbol(c.label))return a.stack.push(a.pc+1),a.symbols[c.label].pc;a.runtimeError(c.lino,"Unknown symbol '"+c.label+"'");return 0}},If:{compile:function(a){var c=a.getLino();a.next();var f=a.condition.compile(a),b=a.getPc();a.addCommand({domain:"core",keyword:"if", 38 lino:c,condition:f});a.compileOne();if(!a.getToken())return a.getCommandAt(b).else=a.getPc(),!0;a.tokenIs("else")?(c=a.getPc(),a.addCommand({domain:"core",keyword:"goto",goto:0}),a.getCommandAt(b).else=a.getPc(),a.next(),a.compileOne(!0),a.getCommandAt(c).goto=a.getPc()):a.getCommandAt(b).else=a.getPc();return!0},run:function(a){var c=a[a.pc];return a.condition.test(a,c.condition)?c.pc+1:c.else}},Import:{compile:function(a){var c=a.imports,f=a.getProgram();c=$jscomp.makeIterator(c);for(var b=c.next();!b.done;b= 39 c.next()){b=b.value;var d=a.nextToken(),e=b.keyword;if(d===e){if(d=a.compileVariable(b.domain,e,!0),d=f[a.getSymbols()[d.name].pc],d.element=b.element,d.exporter=b.exporter,d.exportedName=b.name,d.extra=b.extra,d.isValueHolder=b.isValueHolder,d.imported=!0,!a.tokenIs("and"))break}else throw Error("Mismatched import variable type for '"+b.name+"'");}if(a.tokenIs("and"))throw Error("Imports do not match exports");return!0},run:function(a){return a[a.pc].pc+1}},Index:{compile:function(a){var c=a.getLino(); 40 if(a.nextIsSymbol(!0)){var b=a.getToken();if(a.nextTokenIs("to")){var d=a.getNextValue();a.addCommand({domain:"core",keyword:"index",lino:c,symbol:b,value:d});return!0}}return!1},run:function(a){var c=a[a.pc],b=a.getSymbolRecord(c.symbol),d=a.getValue(c.value);d>=b.elements&&a.runtimeError(c.lino,"Array index "+d+" is out of range for '"+b.name+"'");b.index=d;b.imported&&(b.exporter.getSymbolRecord(b.exportedName).index=d);return c.pc+1}},Load:{compile:function(a){var c=a.getLino();switch(a.nextToken()){case "plugin":var b= 41 a.getNextValue();a.addCommand({domain:"core",keyword:"load",lino:c,name:b});return!0}return!1},run:function(a){var c=a[a.pc],b=a.getValue(c.name);switch(c.keyword){case "load":if(a.checkPlugin(b))return c.pc+1;EasyCoder_Plugins.getLocalPlugin(a.getPluginsPath,b,a.getPlugin,a.addLocalPlugin,function(){a.run(c.pc+1)});return 0}}},Module:{compile:function(a){a.compileVariable("core","module");return!0},run:function(a){a=a[a.pc];a.program=null;return a.pc+1}},Multiply:{compile:function(a){var c=a.getLino(); 42 a.next();if(a.isSymbol()){var b=a.getSymbol();var d=a.getCommandAt(b.pc).name}b=a.getValue();a.tokenIs("by")&&a.next();var e=a.getValue();if(a.tokenIs("giving")){a.next();if(a.isSymbol())return d=a.getSymbol(),d=a.getCommandAt(d.pc).name,a.next(),a.addCommand({domain:"core",keyword:"multiply",lino:c,value1:b,value2:e,target:d}),!0;a.warning("core multiply: Expected value holder")}else return"undefined"===typeof d&&a.warning("core multiply: No target variable given"),a.addCommand({domain:"core",keyword:"multiply", 43 lino:c,value2:e,target:d}),!0;return!1},run:function(a){var c=a[a.pc],b=c.value1,d=c.value2,e=a.getSymbolRecord(c.target);if(e.isValueHolder){var g=e.value[e.index];b?(a=a.getValue(b)*a.getValue(d),e.value[e.index]={type:"constant",numeric:!0,content:a}):(!g.numeric&&isNaN(g.content)&&a.nonNumericValueError(c,lino),a=parseInt(g.content)*parseInt(a.getValue(d)),e.value[e.index]={type:"constant",numeric:!0,content:a})}else a.variableDoesNotHoldAValueError(c.lino,e.name);return c.pc+1}},Negate:{compile:function(a){var c= 44 a.getLino();a.next();if(a.isSymbol()){var b=a.getToken();a.next();a.addCommand({domain:"core",keyword:"negate",lino:c,symbol:b});return!0}return!1},run:function(a){var c=a[a.pc],b=a.getSymbolRecord(c.symbol);b.isValueHolder?b.value[b.index]={type:"constant",numeric:!0,content:-b.value[b.index].content}:a.variableDoesNotHoldAValueError(c.lino,b.name);return c.pc+1}},On:{compile:function(a){var c=a.getLino(),b=a.nextToken();switch(b){case "close":case "restore":case "message":return a.next(),a.addCommand({domain:"core", 45 keyword:"on",lino:c,action:b}),a.completeHandler()}return a.isSymbol()&&(b=a.getSymbolRecord(),"callback"===b.keyword)?(a.next(),a.addCommand({domain:"core",keyword:"on",lino:c,action:b.name}),a.completeHandler()):!1},run:function(a){var c=a[a.pc],b=c.pc+2;switch(c.action){case "close":a.onClose=b;break;case "restore":a.onRestore=b;break;case "message":a.onMessage=b;break;default:var d=a.getSymbolRecord(c.action);if(d)d.cb=b;else return a.runtimeError(c.lino,"Unknown action '"+c.action+"'"),0}return c.pc+ 46 1}},Print:{compile:function(a){var c=a.getLino();a.next();var b=a.getValue();a.addCommand({domain:"core",keyword:"print",lino:c,value:b});return!0},run:function(a){var c=a[a.pc];a=a.getFormattedValue(c.value);console.log("-> "+a);return c.pc+1}},Put:{compile:function(a){var c=a.getLino(),b=a.getNextValue();if(a.tokenIs("into")){if(a.nextIsSymbol()){var d=a.getToken();a.next();a.addCommand({domain:"core",keyword:"put",lino:c,value:b,target:d});return!0}a.warning("core:put: No such variable: '"+a.getToken()+ 47 "'")}return!1},run:function(a){var c=a[a.pc],b=a.getSymbolRecord(c.target);b.isValueHolder||a.variableDoesNotHoldAValueError(c.lino,b.name);a=a.evaluate(c.value);b.value[b.index]=a;b.imported&&(b=b.exporter.getSymbolRecord(b.exportedName),b.value[b.index]=a);return c.pc+1}},Replace:{compile:function(a){var c=a.getLino(),b=a.getNextValue();if(a.tokenIs("with")){var d=a.getNextValue();if(a.tokenIs("in")&&a.nextIsSymbol()){var e=a.getSymbolRecord();a.next();if(e.isValueHolder)return a.addCommand({domain:"core", 48 keyword:"replace",lino:c,original:b,replacement:d,target:e.name}),!0;throw Error("'"+e.name+"' does not hold a value");}}return!1},run:function(a){var c=a[a.pc],b=a.getValue(c.original),d=a.getValue(c.replacement),e=a.getSymbolRecord(c.target);a=a.getValue(e.value[e.index]).split(b).join(d);e.value[e.index]={type:"constant",numeric:!1,content:a};return c.pc+1}},Require:{compile:function(a){var c=a.getLino(),b=a.nextToken();if(["css","js"].includes(b)){var d=a.getNextValue();a.addCommand({domain:"core", 49 keyword:"require",lino:c,type:b,url:d});return!0}throw Error("File type must be 'css' or 'js'");},run:function(a){var c=a[a.pc];a.require(c.type,a.getValue(c.url),function(){a.run(c.pc+1)});return 0}},Return:{compile:function(a){var c=a.getLino();a.next();a.addCommand({domain:"core",keyword:"return",lino:c});return!0},run:function(a){return a.stack.pop()}},Run:{compile:function(a){var c=a.getLino(),b=a.getNextValue(),d=[];if(a.tokenIs("with"))for(;;)if(a.nextIsSymbol(!0)){var e=a.getSymbolRecord(); 50 e.exporter=a.getProgram();d.push(e);a.next();if(!a.tokenIs("and"))break}if(a.tokenIs("as")&&a.nextIsSymbol(!0)){var g=a.getSymbolRecord();a.next();if("module"!==g.keyword)throw Error("'"+g.name+"' is not a module");g=g.name}var l=!1;a.tokenIs("nowait")&&(a.next(),l=!0);e=a.getPc();a.addCommand({domain:"core",keyword:"run",lino:c,script:b,imports:d,module:g,nowait:l,then:0});a.tokenIs("then")&&(c=a.getPc(),a.addCommand({domain:"core",keyword:"goto",goto:0}),a.getCommandAt(e).then=a.getPc(),a.next(), 51 a.compileOne(!0),a.addCommand({domain:"core",keyword:"stop"}),a.getCommandAt(c).goto=a.getPc());return!0},run:function(a){a.nextPc=a.pc+1;a.runScript(a);return 0}},Sanitize:{compile:function(a){var c=a.getLino();if(a.nextIsSymbol()){var b=a.getToken();a.next();a.addCommand({domain:"core",keyword:"sanitize",lino:c,name:b});return!0}return!1},run:function(a){var c=a[a.pc];a=a.getSymbolRecord(c.name);a=a.value[a.index];a.content=JSON.stringify(JSON.parse(a.content));return c.pc+1}},Script:{compile:function(a){var c= 52 a.getLino(),b=a.nextToken();a.next();a.addCommand({domain:"core",keyword:"script",lino:c,name:b});return!0},run:function(a){var c=a[a.pc];a.script=c.name;EasyCoder.scripts[c.name]=a;console.log(Date.now()-EasyCoder.timestamp+" ms: Script: "+c.name);return c.pc+1}},Send:{compile:function(a){var c=a.getLino(),b="";a.nextTokenIs("to")||(b=a.getValue());if(a.tokenIs("to")){if(a.nextTokenIs("parent"))var d="parent";else if(a.isSymbol){d=a.getSymbolRecord();if("module"!==d.keyword)throw Error("'"+d.name+ 53 "' is not a module");d=d.name}a.next();a.addCommand({domain:"core",keyword:"send",lino:c,message:b,recipient:d})}return!0},run:function(a){var c=a[a.pc],b=a.getValue(c.message);if("parent"===c.recipient){var d=a.parent;d&&a.parent.onMessage&&(d.message=b,d.run(d.onMessage))}else a=a.getSymbolRecord(c.recipient),a.program&&(a.program.message=b,a.program.run(a.program.onMessage));return c.pc+1}},Set:{compile:function(a){var c=a.getLino();if(a.nextIsSymbol()){var b=a.getSymbolRecord();if(!b.isValueHolder)return!1; 54 if(a.nextTokenIs("to")){a.next();for(var d=[];;){a.mark();try{d.push(a.getValue())}catch(k){a.rewind();break}}a.addCommand({domain:"core",keyword:"set",lino:c,request:"setArray",target:b.name,value:d});return!0}a.addCommand({domain:"core",keyword:"set",lino:c,request:"setBoolean",target:b.name});return!0}if(a.tokenIs("ready"))return a.next(),a.addCommand({domain:"core",keyword:"set",lino:c,request:"setReady"}),!0;if(a.tokenIs("property")&&(b=a.getNextValue(),a.tokenIs("of")&&a.nextIsSymbol()&&(d= 55 a.getSymbolRecord(),"variable"===d.keyword&&a.nextTokenIs("to")))){var e=a.getNextValue();a.addCommand({domain:"core",keyword:"set",lino:c,request:"setProperty",target:d.name,name:b,value:e});return!0}a.tokenIs("the")&&a.next();if(a.tokenIs("elements")&&(a.next(),a.tokenIs("of"))){a.next();if(!a.isSymbol())throw Error("Unknown variable '"+a.getToken()+"'");b=a.getToken();a.next();if(a.tokenIs("to"))return a.next(),d=a.getValue(),a.addCommand({domain:"core",keyword:"set",lino:c,request:"setElements", 56 symbol:b,value:d}),!0}if(a.tokenIs("encoding")){if(a.nextTokenIs("to"))return b=a.getNextValue(),a.addCommand({domain:"core",keyword:"set",request:"encoding",lino:c,encoding:b}),!0;a.addWarning("Unknown encoding option");return!1}return a.tokenIs("payload")&&a.nextTokenIs("of")&&a.nextIsSymbol()&&(b=a.getSymbolRecord(),"callback"===b.keyword&&a.nextTokenIs("to"))?(d=a.getNextValue(),a.addCommand({domain:"core",keyword:"set",request:"setPayload",lino:c,callback:b.name,payload:d}),!0):!1},run:function(a){var c= 57 a[a.pc];switch(c.request){case "setBoolean":var b=a.getSymbolRecord(c.target);b.isValueHolder?(b.value[b.index]={type:"boolean",content:!0},c.numeric=!1):a.variableDoesNotHoldAValueError(c.lino,b.name);break;case "setReady":a.parent.run(a.parent.nextPc);a.parent.nextPc=0;break;case "setElements":b=a.getSymbolRecord(c.symbol);b.elements=a.getValue(c.value);b.index=0;b.value=[];b.element=[];for(a=0;a<b.elements;a++)b.value.push({}),b.element.push({});break;case "setArray":b=a.getSymbolRecord(c.target); 58 b.elements=c.value.length;b.value=c.value;break;case "encoding":a.encoding=a.getValue(c.encoding);break;case "setProperty":b=a.getSymbolRecord(c.target);var d=a.getValue(b.value[b.index]);d||(d="{}");var e="";try{e=JSON.parse(d)}catch(k){return a.runtimeError(c.lino,"Can't parse "+b.name),0}d=a.getValue(c.name);if(a=a.evaluate(c.value))e[d]=a.content instanceof Array?JSON.stringify(a.content):"boolean"===a.type?a.content:a.numeric?a.content:'{"'===a.content.substr(0,2)?JSON.parse(a.content):a.content.split('"').join('\\"'), 59 b.value[b.index]={type:"constant",numeric:!1,content:JSON.stringify(e)};break;case "setPayload":a.getSymbolRecord(c.callback).payload=a.getValue(c.payload)}return c.pc+1}},Stop:{compile:function(a){var c=a.getLino();a.next();if(a.more()&&a.isSymbol()){var b=a.getSymbolRecord();return"module"===b.keyword?(a.next(),a.addCommand({domain:"core",keyword:"stop",lino:c,name:b.name}),!0):!1}a.addCommand({domain:"core",keyword:"stop",lino:c,next:0});return!0},run:function(a){var c=a[a.pc];if(c.name)a.getSymbolRecord(c.name).program.exit(); 60 else return 0;return c.pc+1}},Take:{compile:function(a){var c=a.getLino();a.next();var b=a.getValue();if(a.tokenIs("from"))if(a.next(),a.isSymbol()){var d=a.getSymbol();if(a.getCommandAt(d.pc).isValueHolder){if("giving"===a.peek()){d=a.getValue();a.next();var g=a.getToken();a.next();a.addCommand({domain:"core",keyword:"take",lino:c,value1:b,value2:d,target:g})}else d=a.getToken(),a.next(),a.addCommand({domain:"core",keyword:"take",lino:c,value1:b,target:d});return!0}a.warning("core "+e.name+": Expected value holder")}else{d= 61 a.getValue();if(a.tokenIs("giving"))return a.next(),g=a.getToken(),a.next(),a.addCommand({domain:"core",keyword:"take",lino:c,value1:b,value2:d,target:g}),!0;a.warning("core "+e.name+': Expected "giving"')}return!1},run:function(a){var c=a[a.pc],b=c.value1,d=c.value2,e=a.getSymbolRecord(c.target);if(e.isValueHolder){var g=e.value[e.index];d?(a=a.getValue(d)-a.getValue(b),e.value[e.index]={type:"constant",numeric:!0,content:a}):(!g.numeric&&isNaN(g.content)&&a.nonNumericValueError(c.lino),a=parseInt(a.getValue(g))- 62 parseInt(a.getValue(b)),e.value[e.index]={type:"constant",numeric:!0,content:a})}else a.variableDoesNotHoldAValueError(c.lino,e.name);return c.pc+1}},Toggle:{compile:function(a){var c=a.getLino();a.next();if(a.isSymbol()){var b=a.getSymbolPc();a.next();a.addCommand({domain:"core",keyword:"toggle",lino:c,symbol:b});return!0}return!1},run:function(a){var c=a[a.pc],b=a[c.symbol];if(b.isValueHolder){var d=a.domain[b.domain];a=d.value.get(a,b.value[b.index]).content;d.value.put(b,{type:"boolean",content:!a})}else a.variableDoesNotHoldAValueError(c.lino, 63 b.name);return c.pc+1}},Variable:{compile:function(a){a.compileVariable("core","variable",!0);return!0},run:function(a){return a[a.pc].pc+1}},Wait:{compile:function(a){var c=a.getLino();a.next();var b=a.getValue(a),d=1E3;switch(a.getToken()){case "milli":case "millis":a.next();d=1;break;case "tick":case "ticks":a.next();d=10;break;case "second":case "seconds":a.next();d=1E3;break;case "minute":case "minutes":a.next(),d=6E4}a.addCommand({domain:"core",keyword:"wait",lino:c,value:b,multiplier:d});return!0}, 64 run:function(a){var c=a[a.pc],b=a.getValue(c.value);setTimeout(function(){a.run(c.pc+1)},b*c.multiplier);return 0}},While:{compile:function(a){var c=a.getLino();a.next();var b=a.getCondition(),d=a.getPc();a.addCommand({domain:"core",keyword:"while",lino:c,condition:b});c=a.getPc();a.addCommand({domain:"core",keyword:"goto",goto:0});a.compileOne();a.addCommand({domain:"core",keyword:"goto",goto:d});a.getCommandAt(c).goto=a.getPc();return!0},run:function(a){return a.condition.test(a,a[a.pc].condition)? 65 a.pc+2:a.pc+1}},getHandler:function(a){switch(a){case "add":return b.Add;case "alias":return b.Alias;case "begin":return b.Begin;case "callback":return b.Callback;case "clear":return b.Clear;case "close":return b.Close;case "debug":return b.Debug;case "decode":return b.Decode;case "divide":return b.Divide;case "encode":return b.Encode;case "end":return b.End;case "exit":return b.Exit;case "fork":return b.Fork;case "go":case "goto":return b.Go;case "gosub":return b.Gosub;case "if":return b.If;case "import":return b.Import; 66 case "index":return b.Index;case "load":return b.Load;case "module":return b.Module;case "multiply":return b.Multiply;case "negate":return b.Negate;case "on":return b.On;case "print":return b.Print;case "put":return b.Put;case "replace":return b.Replace;case "require":return b.Require;case "return":return b.Return;case "run":return b.Run;case "sanitize":return b.Sanitize;case "script":return b.Script;case "send":return b.Send;case "set":return b.Set;case "stop":return b.Stop;case "take":return b.Take; 67 case "toggle":return b.Toggle;case "variable":return b.Variable;case "wait":return b.Wait;case "while":return b.While;default:return!1}},run:function(a){var c=a[a.pc],d=b.getHandler(c.keyword);d||a.runtimeError(c.lino,"Unknown keyword '"+c.keyword+"' in 'core' package");return d.run(a)},isNegate:function(a){return"not"===a.getToken()?(a.next(),!0):!1},value:{compile:function(a){if(a.isSymbol()){var c=a.getToken();switch(a.getSymbolRecord().keyword){case "module":return a.next(),{domain:"core",type:"module", 68 name:c};case "variable":var b=a.nextToken();return["format","modulo"].includes(b)?(a=a.getNextValue(),{domain:"core",type:b,name:c,value:a}):{domain:"core",type:"symbol",name:c}}return null}c=a.getToken();if("true"===c)return a.next(),{domain:"core",type:"boolean",content:!0};if("false"===c)return a.next(),{domain:"core",type:"boolean",content:!1};if("random"===c)return a.next(),{domain:"core",type:"random",range:a.getValue()};if("cos"===c)return a.next(),c=a.getValue(),a.skip("radius"),a=a.getValue(), 69 {domain:"core",type:"cos",angle_c:c,radius_c:a};if("sin"===c)return a.next(),c=a.getValue(),a.skip("radius"),a=a.getValue(),{domain:"core",type:"sin",angle_s:c,radius_s:a};if("tan"===c)return a.next(),c=a.getValue(),a.skip("radius"),a=a.getValue(),{domain:"core",type:"tan",angle_t:c,radius_t:a};if("empty"===c)return a.next(),{domain:"core",type:"empty"};if(["now","today"].includes(c))return a.next(),{domain:"core",type:c};if("newline"===c)return a.next(),{domain:"core",type:"newline"};if("break"=== 70 c)return a.next(),{domain:"core",type:"break"};if(["encode","decode","lowercase","hash"].includes(c))return a.next(),a=a.getValue(),{domain:"core",type:c,value:a};if("element"===c)return c=a.getNextValue(),a.tokenIs("of")&&a.nextIsSymbol()&&(b=a.getSymbolRecord(),a.next(),"variable"===b.keyword)?{domain:"core",type:"element",element:c,symbol:b.name}:null;if("property"===c)return c=a.getNextValue(),a.tokenIs("of")&&a.nextIsSymbol()&&(b=a.getSymbolRecord(),a.next(),"variable"===b.keyword)?{domain:"core", 71 type:"property",property:c,symbol:b.name}:null;a.tokenIs("the")&&a.next();c=a.getToken();switch(c){case "elements":case "index":if(a.nextTokenIs("of")&&a.nextIsSymbol())return b=a.getToken(),a.next(),{domain:"core",type:c,name:b};break;case "value":if(a.nextTokenIs("of"))return a.next(),{domain:"core",type:"valueOf",value:a.getValue()};break;case "length":if(a.nextTokenIs("of"))return a.next(),{domain:"core",type:"lengthOf",value:a.getValue()};break;case "left":case "right":b=a.getNextValue();if(a.tokenIs("of"))return a= 72 a.getNextValue(),{domain:"core",type:c,count:b,value:a};break;case "from":b=a.getNextValue();var d=a.tokenIs("to")?a.getNextValue():null;if(a.tokenIs("of"))return a=a.getNextValue(),{domain:"core",type:c,from:b,to:d,value:a};break;case "position":if(a.nextTokenIs("of")&&(c=!1,a.nextTokenIs("the")&&a.nextTokenIs("last")&&(a.next(),c=!0),b=a.getValue(),a.tokenIs("in")))return a=a.getNextValue(),{domain:"core",type:"position",needle:b,haystack:a,last:c};break;case "payload":if(a.nextTokenIs("of")&&a.nextIsSymbol()&& 73 (c=a.getSymbolRecord(),"callback"===c.keyword))return a.next(),{domain:"core",type:"payload",callback:c.name};break;case "message":case "error":return a.next(),{domain:"core",type:c}}return null},get:function(a,c){switch(c.type){case "boolean":return{type:"boolean",numeric:!1,content:c.content};case "elements":return{type:"constant",numeric:!0,content:a.getSymbolRecord(c.name).elements};case "index":return{type:"constant",numeric:!0,content:a.getSymbolRecord(c.name).index};case "random":return a= 74 a.evaluate(c.range),{type:"constant",numeric:!0,content:Math.floor(Math.random()*a.content)};case "cos":var b=a.getValue(c.angle_c);a=a.getValue(c.radius_c);return{type:"constant",numeric:!0,content:parseInt(Math.cos(.01745329*parseFloat(b))*a,10)};case "sin":return b=a.getValue(c.angle_s),a=a.getValue(c.radius_s),{type:"constant",numeric:!0,content:parseInt(Math.sin(.01745329*parseFloat(b))*a,10)};case "tan":return b=a.getValue(c.angle_t),a=a.getValue(c.radius_t),{type:"constant",numeric:!0,content:parseInt(Math.tan(.01745329* 75 parseFloat(b))*a,10)};case "valueOf":return a=parseInt(a.getValue(c.value)),{type:"constant",numeric:!0,content:a?a:0};case "lengthOf":return{type:"constant",numeric:!0,content:a.getValue(c.value).length};case "left":return{type:"constant",numeric:!1,content:a.getValue(c.value).substr(0,a.getValue(c.count))};case "right":return b=a.getValue(c.value),{type:"constant",numeric:!1,content:b.substr(b.length-a.getValue(c.count))};case "from":b=a.getValue(c.from);var d=c.to?a.getValue(c.to):null;a=a.getValue(c.value); 76 return{type:"constant",numeric:!1,content:d?a.substr(b,d):a.substr(b)};case "position":return b=a.getValue(c.needle),a=a.getValue(c.haystack),{type:"constant",numeric:!0,content:c.last?a.lastIndexOf(b):a.indexOf(b)};case "payload":return{type:"constant",numeric:!1,content:a.getSymbolRecord(c.callback).payload};case "modulo":return b=a.getSymbolRecord(c.name),a=a.evaluate(c.value),{type:"constant",numeric:!0,content:b.value[b.index].content%a.content};case "format":d=a.getSymbolRecord(c.name);d=1E3* 77 a.getValue(d.value[d.index]);try{switch(b=JSON.parse(a.getValue(c.value)),b.mode){case "time":return{type:"constant",numeric:!0,content:(new Date(d)).toLocaleTimeString(b.locale,b.options)};default:return{type:"constant",numeric:!0,content:(new Date(d)).toLocaleDateString(b.locale,b.options)}}}catch(p){a.runtimeError(a[a.pc].lino,"Can't parse "+c.value);break}case "empty":return{type:"constant",numeric:!1,content:""};case "now":return{type:"constant",numeric:!0,content:Math.floor(Date.now()/1E3)}; 78 case "today":return a=new Date,a.setHours(0,0,0,0),{type:"constant",numeric:!0,content:Math.floor(a.getTime()/1E3)};case "newline":return{type:"constant",numeric:!1,content:"\n"};case "break":return{type:"constant",numeric:!1,content:"<br />"};case "encode":return{type:"constant",numeric:!1,content:a.encode(a.getValue(c.value))};case "decode":return{type:"constant",numeric:!1,content:a.decode(a.getValue(c.value))};case "lowercase":return{type:"constant",numeric:!1,content:a.getValue(c.value).toLowerCase()}; 79 case "hash":a=a.getValue(c.value);c=0;if(0===a.length)return c;for(b=0;b<a.length;b++)d=a.charCodeAt(b),c=(c<<5)-c+d;return{type:"constant",numeric:!0,content:c};case "element":b=a.getValue(c.element);c=a.getSymbolRecord(c.symbol);d="";try{d=JSON.parse(a.getValue(c.value[c.index]))[b]}catch(p){a.runtimeError(command.lino,"Can't parse JSON");break}return{type:"constant",numeric:!1,content:"object"===typeof d?JSON.stringify(d):d};case "property":b=a.getValue(c.property);c=a.getSymbolRecord(c.symbol); 80 a=a.getValue(c.value[c.index]);c="";if(b&&a)if("object"===typeof a)c=a[b];else if("{"===a.charAt(0))try{c=JSON.parse(a)[b]}catch(p){console.log("Can't parse '"+a+"': "+p.message)}return{type:"constant",numeric:!isNaN(c),content:"object"===typeof c?JSON.stringify(c):c};case "module":return{type:"boolean",numeric:!1,content:a.getSymbolRecord(c.name).program};case "message":return c=a.message,{type:"constant",numeric:!1,content:c};case "error":return c=a.errorMessage,{type:"constant",numeric:!1,content:c}}return null}, 81 put:function(a,c){a.value[a.index]=c}},condition:{compile:function(a){if(a.isSymbol()){var c=a.getSymbolRecord();if("module"===c.keyword){if(a.nextTokenIs("is")){var d=!0;a.nextTokenIs("not")&&(a.next(),d=!1);if(a.tokenIs("running"))return a.next(),{domain:"core",type:"moduleRunning",name:c.name,sense:d}}return null}}if(a.tokenIs("not"))return{domain:"core",type:"not",value:a.getNextValue()};try{if(d=a.getValue(),"is"===a.getToken()){a.next();var e=b.isNegate(a);switch(a.getToken()){case "numeric":return a.next(), 82 {domain:"core",type:"numeric",value1:d};case "even":return a.next(),{domain:"core",type:"even",value1:d};case "odd":return a.next(),{domain:"core",type:"odd",value1:d};case "greater":a.next();if(a.tokenIs("than")){a.next();var g=a.getValue();return{domain:"core",type:"greater",value1:d,value2:g,negate:e}}break;case "less":a.next();if(a.tokenIs("than")){a.next();var h=a.getValue();return{domain:"core",type:"less",value1:d,value2:h,negate:e}}break;default:var l=a.getValue();return{domain:"core",type:"is", 83 value1:d,value2:l,negate:e}}}else if(d)return{domain:"core",type:"boolean",value:d}}catch(n){return a.warning("Can't get a value"),0}return null},test:function(a,c){switch(c.type){case "boolean":return a.getValue(c.value);case "numeric":return!isNaN(a.getValue(c.value1));case "even":return 0===a.getValue(c.value1)%2;case "odd":return 1===a.getValue(c.value1)%2;case "is":return a=a.compare(a,c.value1,c.value2),c.negate?0!==a:0===a;case "greater":return a=a.compare(a,c.value1,c.value2),c.negate?0>= 84 a:0<a;case "less":return a=a.compare(a,c.value1,c.value2),c.negate?0<=a:0>a;case "not":return!a.getValue(c.value);case "moduleRunning":return a=a.getSymbolRecord(c.name).program,c.sense?a:!a}return!1}}};h.exports=b},{}],6:[function(d,h,g){var e=this,b=d("./Tokenise"),a=d("./Compile"),c=d("./Run"),f=d("./Value"),m=d("./Condition"),p=d("./Compare"),k={domain:{core:d("./Core")},setupTracer:function(){var a=document.getElementById("easycoder-tracer");a&&(a.innerHTML='<div><input id="easycoder-run-button" type="button" value="Run" /><input id="easycoder-step-button" type="button" value="Step" /><div id="easycoder-tracer-content" style="border:1px solid black;padding:4px";width:100%></div>', 85 a.style.display="none")},runtimeError:function(a,c){this.lino=a;this.reportError({message:"Line "+(0<=a?a:"")+": "+c},k.program);program.aborted=!0},nonNumericValueError:function(a){this.runtimeError(a,"Non-numeric value")},variableDoesNotHoldAValueError:function(a,c){this.runtimeError(a,"Variable '"+c+"' does not hold a value")},reportError:function(c,b,d){if(c.message)if(this.compiling||b){d=d?d:b.source;var e=d.tokens;d=d.scriptLines;e=this.compiling?e[a.getIndex()].lino:b[b.pc].lino;b=this.compiling? 86 "Compile error":"Runtime error in '"+b.script+"'";b+=":\n";var f=e-5;for(f=0>f?0:f;f<e;f++){var l=(""+(f+1)).padStart(4," ");b+=l+" "+d[f].line.split("\\s").join(" ")+"\n"}b+=c.message+"\n";c=a.getWarnings();if(c.length)for(b+="Warnings:\n",c=$jscomp.makeIterator(c),d=c.next();!d.done;d=c.next())b+=d.value+"\n";console.log(b);alert(b)}else c="Error: "+c.message,alert(c),console.log(c);else console.log("An error occurred - origin was "+c.path[0])},getSymbolRecord:function(a){a=this[this.symbols[a].pc]; 87 return a.alias?this.getSymbolRecord(a.alias):a.exporter&&a.exporter!=this?a.exporter.getSymbolRecord(a.exportedName):a},verifySymbol:function(a){return this.symbols.hasOwnProperty(a)},encode:function(a){return f.encode(a,this.encoding)},decode:function(a){return f.decode(a,this.encoding)},evaluate:function(a){return f.evaluate(this,a)},getValue:function(a){return f.getValue(this,a)},getFormattedValue:function(a){a=f.evaluate(this,a);return a.numeric?a.content:'{"'===a.content.substr(0,2)||"["===a.content.charAt(0)? 88 JSON.stringify(JSON.parse(a.content),null,2):a.content},getSimpleValue:function(a){return!0===a||!1===a?{type:"boolean",content:a}:{type:"constant",numeric:Number.isInteger(a),content:a}},run:function(a){a&&(k.program=this,c.run(this,a))},exit:function(){c.exit(this)},register:function(a){k.program=a},require:function(a,c,b){var d=document.createElement("css"===a?"link":"script");switch(a){case "css":d.type="text/css";d.href=c;d.rel="stylesheet";break;case "js":d.type="text/javascript";d.src=c;break; 89 default:return}d.onload=function(){console.log(Date.now()-k.timestamp+" ms: Library "+c+" loaded");b()};document.head.appendChild(d)},isUndefined:function(a){return"undefined"===typeof a},runScript:function(a){var c=a[a.pc],b=a.getValue(c.script),d=c.imports,e=c.module?a.getSymbolRecord(c.module):null;k.tokeniseScript(b.split("\n"),d,e,this,c.then);c.nowait&&this.run(a.nextPc)},close:function(){},compileScript:function(c,b,d,e){var g=c.tokens;this.compiling=!0;var h=Date.now();a.value=f;a.condition= 90 m;a.domain=k.domain;a.imports=b;b=a.compile(g);var l=Date.now();console.log(l-k.timestamp+" ms: Compiled "+g.length+" tokens in "+(l-h+" ms"));this.compiling=!1;b.EasyCoder=k;b.value=f;b.condition=m;b.compare=p;b.source=c;b.run=this.run;b.exit=this.exit;b.runScript=this.runScript;b.evaluate=this.evaluate;b.getValue=this.getValue;b.getFormattedValue=this.getFormattedValue;b.getSimpleValue=this.getSimpleValue;b.encode=this.encode;b.decode=this.decode;b.domain=this.domain;b.require=this.require;b.isUndefined= 91 this.isUndefined;b.checkPlugin=this.checkPlugin;b.getPlugin=this.getPlugin;b.addLocalPlugin=this.addLocalPlugin;b.getPluginsPath=this.getPluginsPath;b.getSymbolRecord=this.getSymbolRecord;b.verifySymbol=this.verifySymbol;b.runtimeError=this.runtimeError;b.nonNumericValueError=this.nonNumericValueError;b.variableDoesNotHoldAValueError=this.variableDoesNotHoldAValueError;b.reportError=this.reportError;b.register=this.register;b.symbols=a.getSymbols();b.encoding="ec";b.popups=[];b.stack=[];b.queue=[0]; 92 b.module=d;b.parent=e;d&&(d.program=b);return b},tokeniseScript:function(a,d,e,f,g){var h=null,l=Date.now();a=b.tokenise(a);var m=Date.now();console.log(m-k.timestamp+" ms: Tokenised "+a.scriptLines.length+" lines in "+(m-l+" ms"));try{h=k.compileScript(a,d,e,f)}catch(u){"stop"!==u.message&&this.reportError(u,k.program,a)}this.setupTracer();h&&(h.onExit=g,c.run(h,0))},tokenize:function(a){var b=a.split("\n");if(!e.tokenising){try{k.tokeniseScript(b)}catch(q){k.reportError(q,null,a)}e.tokenising=!0}}, 93 setPluginCount:function(a){e.plugins=[];e.pluginCount=a},checkPlugin:function(a){return k.domain[a]},getPlugin:function(a,b,c){k.domain[a]?c():(a=document.createElement("script"),a.type="text/javascript",a.src=b+"?ver="+k.version,a.onload=function(){console.log(Date.now()-k.timestamp+" ms: Plugin "+b+" loaded");c()},document.head.appendChild(a))},addGlobalPlugin:function(a,b){e.plugins.push({name:a,handler:b});e.plugins.length===e.pluginCount&&(e.plugins.forEach(function(a){k.domain[a.name]=a.handler}), 94 k.tokenize(e.source))},addLocalPlugin:function(a,b,c){k.domain[a]=b;c()},getPluginsPath:function(){return k.pluginsPath},loadPluginJs:function(a){console.log(Date.now()-k.timestamp+" ms: Load "+a+"/easycoder/plugins.js");var b=document.createElement("script");b.src=""+window.location.origin+a+"/easycoder/plugins.js?ver="+k.version;b.type="text/javascript";b.onload=function(){EasyCoder_Plugins.getGlobalPlugins(k.timestamp,a,k.setPluginCount,k.getPlugin,k.addGlobalPlugin)};b.onerror=function(){a?k.loadPluginJs(a.slice(0, 95 a.lastIndexOf("/"))):k.reportError({message:"Can't load plugins.js"},k.program,e.source)};document.head.appendChild(b);k.pluginsPath=a},start:function(a){e.source=a;a=window.location.pathname;a=a.endsWith("/")?a.slice(0,-1):"";k.loadPluginJs(a)}};h.exports=k},{"./Compare":2,"./Compile":3,"./Condition":4,"./Core":5,"./Run":7,"./Tokenise":8,"./Value":9}],7:[function(d,h,g){var e={run:function(b,a){var c=[],d=function(a){var b=9999;a.forEach(function(a){a=a.line;for(var c=0;c<a.length&&" "===a[c];)c++; 96 0<c&&c<b&&(b=c)});return 0};if(c.length)c.push(a);else for(b.register(b),c.push(a);0<c.length;)for(b.pc=c.shift(),b.watchdog=0,a={};;){if(1E6<b.watchdog){b.lino=b[b.pc].lino;b.reportError(Error("Program runaway intercepted.\nHave you forgotten to increment a loop counter?",b),b);break}b.watchdog++;var g=b[b.pc].domain;b.debugStep&&console.log(b.script+" "+b.pc+" "+g+":"+b[b.pc].keyword);var h=b.domain[g];if(!h){b.runtimeError(b[b.pc].lino,"Unknown domain '"+g+"'");break}b.pc=h.run(b);if(!b.pc)break; 97 if(b.stop){b.tracing=!1;break}if(b.tracing){g=b[b.pc];h=b.source.scriptLines;var k=d(h),l=document.getElementById("easycoder-tracer");if(!l){b.runtimeError(g.lino,"Element 'easycoder-tracer' was not found");return}l.style.display="block";l.style.visibility="visible";var n="";if(b.tracer){if(l=document.getElementById("easycoder-tracer-content")){b.tracer.variables.forEach(function(a,c,d){var e=b.getSymbolRecord(a);if(1<e.elements)for(n+=a+": "+e.index+"/"+e.elements+": ",a=0;a<e.elements;a++){var f= 98 e.value[a];n=f?n+(f.content+" "):n+"undefined "}else n=(e=e.value[e.index])?n+(a+": "+e.content):n+(a+": undefined");switch(b.tracer.alignment){case "horizontal":c<d.length-1&&(n+=", ");break;case "vertical":n+="<br>"}});n+="<hr>";for(var q="",r=5;0<r;r--)g.lino&&(q+='<input type="text" name="'+r+'"'+('value="'+h[g.lino-r].line.substr(k)+'"')+'style="width:100%;border:none;enabled:false">'),q+="<br>";l.innerHTML=n+" "+q;l.style.display="block";a.run=document.getElementById("easycoder-run-button"); 99 a.step=document.getElementById("easycoder-step-button");a.run.onclick=function(a){return function(){a.run.blur();b.tracing=!1;document.getElementById("easycoder-tracer-content").style.display="none";try{e.run(b,b.resume)}catch(t){var c="Error in run handler: "+t.message;console.log(c);alert(c)}}}(a);a.step.onclick=function(a){return function(){console.log("step");a.step.blur();b.tracing=!0;document.getElementById("easycoder-tracer-content").style.display="block";try{b.run(b.resume)}catch(t){var c= 100 "Error in step handler: "+t.message;console.log(c);alert(c)}}}(a)}b.resume=b.pc;b.pc=0}break}a={run:a.run,step:a.step}}},exit:function(b){b.onExit&&(b.parent.run(b.onExit),b.module.program=null)}};h.exports=e},{}],8:[function(d,h,g){var e={markComments:function(b){var a=b.list,c=void 0===b.index?0:b.index,d=void 0===b.inComment?!1:b.inComment,g=void 0===b.newList?[]:b.newList;if(c>=a.length)return g;var h=a[c];b=h.lino;h=h.token;var k={list:a,index:c+1,inComment:!1,newList:g.concat({lino:b,index:c, 101 token:h})};g={list:a,index:c+1,inComment:!0,newList:g.concat({lino:b,index:c,comment:!0,token:h})};return d&&0<c&&b===a[c-1].lino?e.markComments(g):"!"===h.charAt(0)?e.markComments(g):e.markComments(k)},findStrings:function(b){var a=b.original,c=b.line,d=void 0===b.inComment?!1:b.inComment;b=void 0===b.inQuote?!1:b.inQuote;var g=c.charAt(0),h=b&&[" ","\\t"].includes(g)?"\\s":g;if(1===c.length)return h;c=c.substring(1);if("!"===g&&!b)return g+e.findStrings({original:a,line:c,inComment:!0,inQuote:!1}); 102 if("`"===g&&!d&&!b)return g+e.findStrings({original:a,line:c,inComment:d,inQuote:!0});if("`"===g&&b)return g+e.findStrings({original:a,line:c,inComment:d,inQuote:!1});if(!d&&!b&&!g.match(/[A-z0-9_\-+*/\- \t]/)){if(["'",'"'].includes(g))throw Error('Bad syntax in "'+a+'":\nStrings in EasyCoder must be enclosed in backticks.');throw Error('Unrecognised character "'+g+'" in\n"'+a+'".');}return h+e.findStrings({original:a,line:c,inComment:d,inQuote:b})},tokenise:function(b){b=b.map(function(a){var b= 103 a.trim();return b.length?e.findStrings({original:a,line:b}):""}).map(function(a,b){return{lino:b+1,line:a}});var a=b.map(function(a){return a.line.trim().split(/\s+/).map(function(b,c){return{lino:a.lino,index:c,token:b}})});a=[].concat.apply([],a).filter(function(a){return a.token}).map(function(a){return{lino:a.lino,index:a.index,token:a.token.split("\\s").join(" ")}});a=e.markComments({list:a}).filter(function(a){return!a.comment});return{scriptLines:b,tokens:a}}};h.exports=e},{}],9:[function(d, 104 h,g){var e={getItem:function(b){var a=b.getToken();if(!a)return null;if("true"===a)return b.next(),{type:"boolean",content:!0};if("false"===a)return b.next(),{type:"boolean",content:!1};if("`"===a.charAt(0))return b.next(),{type:"constant",numeric:!1,content:a.substring(1,a.length-1)};if(a.charAt(0).match(/[0-9-]/)){var c=eval(a);if(Number.isInteger(c))return b.next(),{type:"constant",numeric:!0,content:c};throw Error("'"+a+"' is not an integer");}a=b.getIndex();c=$jscomp.makeIterator(Object.keys(b.domain)); 105 for(var d=c.next();!d.done;d=c.next())if(d=d.value,b.rewindTo(a),d=b.domain[d].value.compile(b))return d;return null},compile:function(b){var a=b.getToken(),c=e.getItem(b);if(!c)throw Error("Undefined value: '"+a+"'");if("cat"===b.getToken()){for(a={type:"cat",numeric:!1,parts:[c]};b.tokenIs("cat");)b.next(),a.parts.push(b.value.getItem(b));return a}return c},doValue:function(b,a){if("undefined"===typeof a.type)return b.runtimeError(b[b.pc].lino,"Undefined value (variable not initialized?)"),null; 106 switch(a.type){case "cat":return{type:"constant",numeric:!1,content:a.parts.reduce(function(a,c){return a+e.doValue(b,c).content},"")};case "boolean":case "constant":return a;case "symbol":var c=b.getSymbolRecord(a.name);if(c.isValueHolder){if(a=c.value[c.index]){c=a.content;if(null===c||"undefined"===typeof c)a.content=a.numeric?0:"";return a}return null}return b.domain[c.domain].value.get(b,a)}return b.domain[a.domain].value.get(b,a)},constant:function(b,a){return{type:"constant",numeric:a,content:b}}, 107 evaluate:function(b,a){if(!a)return{type:"constant",numeric:!1,content:""};var c=e.doValue(b,a);if(c)return c;b.runtimeError(b[b.pc].lino,"Can't decode value: "+a)},getValue:function(b,a){return e.evaluate(b,a).content},encode:function(b,a){if(b)switch(a){case "ec":return b.replace(/'/g,"~sq~").replace(/"/g,"~dq~").replace(/\n/g,"%0a").replace(/\r/g,"%0d");case "url":return encodeURIComponent(b.replace(/\s/g,"+"));case "sanitize":return b.normalize("NFD").replace(/[\u0300-\u036f]/g,"")}return b}, 108 decode:function(b,a){if(b)switch(a){case "ec":return b.replace(/~dq~/g,'"').replace(/~sq~/g,"'").replace(/%0a/g,"\n").replace(/%0d/g,"\r");case "url":return decodeURIComponent(b).replace(/\+/g," ")}return b}};h.exports=e},{}]},{},[1]); 19 getNextValue:function(){a.next();return a.getValue()},getCondition:function(){return a.condition.compile(a)},constant:function(c,e){return a.value.constant(c,void 0===e?!1:e)},addCommand:function(a){b.program.push(f({pc:b.program.length},a))},addSymbol:function(a,e){b.symbols[a]={pc:e}},mark:function(){b.savedMark=b.index},rewind:function(){b.index=b.savedMark},rewindTo:function(a){b.index=a},completeHandler:function(){var c=a.getLino(),e=a.getPc();a.addCommand({domain:"core",keyword:"goto",lino:c, 20 goto:0});a.compileOne();a.addCommand({domain:"core",keyword:"stop",lino:c,next:0});a.getCommandAt(e).goto=a.getPc();return!0},compileVariable:function(c,e,m,d){m=void 0===m?!1:m;d=void 0===d?null:d;a.next();var p=a.getLino(),l=a.getTokens()[a.getIndex()];if(b.symbols[l.token])throw Error("Duplicate variable name '"+l.token+"'");var n=a.getPc();a.next();a.addSymbol(l.token,n);c={domain:c,keyword:e,lino:p,isSymbol:!0,used:!1,isValueHolder:m,name:l.token,elements:1,index:0,value:[{}],element:[],extra:d}; 21 "dom"===d&&(c.element=[]);a.addCommand(c);return c},compileToken:function(){var c=a.getToken();if(c){a.mark();for(var e=$jscomp.makeIterator(Object.keys(a.domain)),b=e.next();!b.done;b=e.next()){if((b=a.domain[b.value])&&(b=b.getHandler(c))&&b.compile(a))return;a.rewind()}console.log("No handler found");throw Error("I don't understand '"+c+"...'");}},compileOne:function(){var c=a.getToken();if(c){b.warnings=[];var e=b.program.length;if(c.endsWith(":")){c=c.substring(0,c.length-1);if(b.symbols[c])throw Error("Duplicate symbol: '"+ 22 c+"'");b.symbols[c]={pc:e};b.index++}else a.compileToken()}},compileFromHere:function(c){for(;b.index<b.tokens.length;){var e=b.tokens[b.index].token;if("else"===e)return b.program;a.compileOne();if(-1<c.indexOf(e))break}},compile:function(c){b.tokens=c;b.index=0;b.program=[];b.symbols={};b.warnings=[];a.compileFromHere([]);a.addCommand({domain:"core",keyword:"exit",lino:a.getLino(),next:0});for(var e in b.symbols)c=b.program[b.symbols[e].pc],c.isSymbol&&!c.used&&console.log("Symbol '"+c.name+"' has not been used."); 23 return b.program}};h.exports=a},{}],4:[function(d,h,g){var f=Object.assign||function(b){for(var a=1;a<arguments.length;a++){var c=arguments[a],e;for(e in c)Object.prototype.hasOwnProperty.call(c,e)&&(b[e]=c[e])}return b};h.exports={compile:function(b){b.mark();for(var a=$jscomp.makeIterator(Object.keys(b.domain)),c=a.next();!c.done;c=a.next()){if(c=b.domain[c.value].condition.compile(b))return f({domain:name},c);b.rewind()}},test:function(b,a){return b.domain[a.domain].condition.test(b,a)}}},{}], 24 5:[function(d,h,g){var f=this,b={Add:{compile:function(a){var c=a.getLino();a.next();var e=a.getValue();if(a.tokenIs("to"))if(a.next(),a.isSymbol()){var b=a.getSymbol();if(a.getCommandAt(b.pc).isValueHolder){if("giving"===a.peek()){b=a.getValue();a.next();var d=a.getToken();a.next();a.addCommand({domain:"core",keyword:"add",lino:c,value1:e,value2:b,target:d})}else b=a.getToken(),a.next(),a.addCommand({domain:"core",keyword:"add",lino:c,value1:e,target:b});return!0}a.warning("core "+f.name+": Expected value holder")}else{b= 25 a.getValue();if(a.tokenIs("giving"))return a.next(),d=a.getToken(),a.next(),a.addCommand({domain:"core",keyword:"add",lino:c,value1:e,value2:b,target:d}),!0;a.warning("core "+f.name+': Expected "giving"')}return!1},run:function(a){var c=a[a.pc],e=c.value1,b=c.value2,d=a.getSymbolRecord(c.target);if(d.isValueHolder){var f=d.value[d.index];b?(a=a.getValue(b)+a.getValue(e),d.value[d.index]={type:"constant",numeric:!0,content:a}):(!f.numeric&&isNaN(f.content)&&a.nonNumericValueError(c.lino),a=parseInt(f.content)+ 26 parseInt(a.getValue(e)),d.value[d.index]={type:"constant",numeric:!0,content:a})}else a.variableDoesNotHoldAValueError(c.lino,d.name);return c.pc+1}},Alias:{compile:function(a){var c=a.getLino();a.next();if(a.isSymbol()){var e=a.getToken();a.next();if(a.tokenIs("to")&&(a.next(),a.isSymbol())){var b=a.getSymbolRecord();b.used=!0;a.next();a.addCommand({domain:"core",keyword:"alias",lino:c,alias:e,symbol:b.name});return!0}}return!1},run:function(a){var c=a[a.pc],e=a.symbols[c.alias].pc,b=a[e],d=a.getSymbolRecord(c.symbol); 27 a[e]={pc:b.pc,domain:d.domain,keyword:d.keyword,lino:b.lino,name:b.name,alias:c.symbol};return c.pc+1}},Append:{compile:function(a){var c=a.getLino(),e=a.getNextValue();if(a.tokenIs("to")&&a.nextIsSymbol()){var b=a.getSymbolRecord();if(b.isValueHolder)return a.next(),a.addCommand({domain:"core",keyword:"append",lino:c,value:e,select:b.name}),!0}return!1},run:function(a){var c=a[a.pc],e=a.getSymbolRecord(c.select);try{var b=a.getValue(c.value),d=["{","["].includes(b[0])?JSON.parse(b):b,f=e.value[e.index], 28 l=f.content;l=l?JSON.parse(l):[];l.push(d);f.content=JSON.stringify(l);return c.pc+1}catch(n){return a.runtimeError(c.lino,"JSON: Unable to parse value"),!1}}},Begin:{compile:function(a){a.next();a.compileFromHere(["end"]);return!0},run:function(a){return a[a.pc].pc+1}},Callback:{compile:function(a){a.compileVariable("core","callback");return!0},run:function(a){return a[a.pc].pc+1}},Clear:{compile:function(a){var c=a.getLino();a.next();if(a.isSymbol()){var e=a.getSymbolRecord();if(e.isValueHolder)return e= 29 a.getToken(),a.next(),a.addCommand({domain:"core",keyword:"clear",lino:c,symbol:e}),!0;a.warning("'Variable '"+e.name+"' does not hold a value")}return!1},run:function(a){var c=a[a.pc],e=a.getSymbolRecord(c.symbol);e.isValueHolder?(a.domain[e.domain].value.put(e,{type:"boolean",content:!1}),c.numeric=!1):a.variableDoesNotHoldAValueError(c.lino,e.name);return c.pc+1}},Close:{compile:function(a){var c=a.getLino();if(a.nextIsSymbol()){var e=a.getSymbolRecord();if("module"===e.keyword)return a.next(), 30 a.addCommand({domain:"core",keyword:"close",lino:c,module:e.name}),!0}return!1},run:function(a){var c=a[a.pc];a=a.getSymbolRecord(c.module).program;a.run(a.onClose);return c.pc+1}},Debug:{compile:function(a){var c=a.getLino();if(a.nextTokenIs("program")){a.next();if(["item","pc"].includes(a.getToken())){var e=a.getNextValue();a.addCommand({domain:"core",keyword:"debug",lino:c,item:e});return!0}a.addCommand({domain:"core",keyword:"debug",lino:c,item:"program"});return!0}return a.tokenIs("symbols")? 31 (a.next(),a.addCommand({domain:"core",keyword:"debug",lino:c,item:"symbols"}),!0):a.tokenIs("symbol")?(e=a.nextToken(),a.next(),a.addCommand({domain:"core",keyword:"debug",lino:c,item:"symbol",name:e}),!0):a.tokenIs("step")?(a.next(),a.addCommand({domain:"core",keyword:"debug",lino:c,item:"step"}),!0):!1},run:function(a){var c=a[a.pc],e=c.item;switch(e){case "symbols":console.log("Symbols: "+JSON.stringify(a.symbols,null,2));break;case "symbol":a=a.getSymbolRecord(c.name);e=a.exporter;delete a.exporter; 32 console.log("Symbol: "+JSON.stringify(a,null,2));a.exporter=e;break;case "step":a.debugStep=!0;break;case "program":console.log("Debug program: "+JSON.stringify(a,null,2));break;default:0<=e.content&&console.log("Debug item "+e.content+": "+JSON.stringify(a[e.content],null,2))}return c.pc+1}},Decode:{compile:function(a){var c=a.getLino();if(a.nextIsSymbol()){var e=a.getToken();a.next();a.addCommand({domain:"core",keyword:"decode",lino:c,symbol:e});return!0}return!1},run:function(a){var c=a[a.pc], 33 e=a.getSymbolRecord(c.symbol);if(e.isValueHolder){var b=a.getValue(e.value[e.index]);e.value[e.index]={type:"constant",numeric:!1,content:a.decode(b)};c.numeric=!1}else a.variableDoesNotHoldAValueError(c.lino,e.name);return c.pc+1}},Divide:{compile:function(a){var c=a.getLino();if(a.nextIsSymbol()){var e=a.getSymbol();var b=a.getCommandAt(e.pc).name}e=a.getValue();a.tokenIs("by")&&a.next();var d=a.getValue();if(a.tokenIs("giving")){a.next();if(a.isSymbol())return b=a.getSymbol(),b=a.getCommandAt(b.pc).name, 34 a.next(),a.addCommand({domain:"core",keyword:"divide",lino:c,value1:e,value2:d,target:b}),!0;a.warning("core "+f.name+": Expected value holder")}else return"undefined"===typeof b&&a.warning("core "+f.name+": No target variable given"),a.addCommand({domain:"core",keyword:"divide",lino:c,value2:d,target:b}),!0;return!1},run:function(a){var c=a[a.pc],e=c.value1,b=c.value2,d=a.getSymbolRecord(c.target);if(d.isValueHolder){var f=d.value[d.index];e?(a=a.getValue(e)/a.getValue(b),d.value[d.index]={type:"constant", 35 numeric:!0,content:Math.trunc(a)}):(!f.numeric&&isNaN(f.content)&&a.nonNumericValueError(c,lino),a=parseInt(f.content)/parseInt(a.getValue(b)),d.value[d.index]={type:"constant",numeric:!0,content:Math.trunc(a)})}else a.variableDoesNotHoldAValueError(c.lino,d.name);return c.pc+1}},Dummy:{compile:function(a){var c=a.getLino();a.next();a.addCommand({domain:"core",keyword:"dummy",lino:c});return!0},run:function(a){return a[a.pc].pc+1}},Encode:{compile:function(a){var c=a.getLino();a.next();if(a.isSymbol()){var e= 36 a.getToken();a.next();a.addCommand({domain:"core",keyword:"encode",lino:c,symbol:e});return!0}return!1},run:function(a){var c=a[a.pc],e=a.getSymbolRecord(c.symbol);if(e.isValueHolder){var b=a.getValue(e.value[e.index]);e.value[e.index]={type:"constant",numeric:!1,content:a.encode(b)};c.numeric=!1}else a.variableDoesNotHoldAValueError(c.lino,e.name);return c.pc+1}},End:{compile:function(a){a.next();return!0},run:function(){return 0}},Exit:{compile:function(a){a.next();a.addCommand({domain:"core",keyword:"exit"}); 37 return!0},run:function(a){a.exit();return 0}},Filter:{compile:function(a){var c=a.getLino();if(a.nextIsSymbol()){var e=a.getSymbolRecord();if(a.nextTokenIs("with")){var b=a.nextToken();a.next();a.addCommand({domain:"core",keyword:"filter",lino:c,array:e.name,func:b});return!0}}return!1},run:function(a){var c=a[a.pc],e=a.getSymbolRecord(c.array),b=e.value[e.index].content,d=a.getSymbolRecord(c.func).pc;try{var f=JSON.parse(b).filter(function(c){e.a=c;a.run(d);return e.v});e.value[e.index].content= 38 JSON.stringify(f)}catch(l){a.runtimeError(c.lino,"Can't parse this array")}return c.pc+1}},Fork:{compile:function(a){var c=a.getLino();a.next();a.nextTokenIs("to")&&a.next();var e=a.getToken();a.next();a.addCommand({domain:"core",keyword:"fork",lino:c,label:e});return!0},run:function(a){var c=a[a.pc];try{a.run(a.symbols[c.label].pc)}catch(e){console.log(e.message),alert(e.message)}return c.pc+1}},Go:{compile:function(a){var c=a.getLino();a.nextTokenIs("to")&&a.next();var e=a.getToken();a.next();a.addCommand({domain:"core", 39 keyword:"go",lino:c,label:e});return!0},run:function(a){var c=a[a.pc];if(c.label){if(a.verifySymbol(c.label)){var e=a.symbols[c.label];if(e)return e.pc}a.runtimeError(c.lino,"Unknown symbol '"+c.label+"'");return 0}return c.goto}},Gosub:{compile:function(a){var c=a.getLino();a.nextTokenIs("to")&&a.next();var e=a.getToken();a.next();a.addCommand({domain:"core",keyword:"gosub",lino:c,label:e});return!0},run:function(a){var c=a[a.pc];if(a.verifySymbol(c.label))return a.stack.push(a.pc+1),a.symbols[c.label].pc; 40 a.runtimeError(c.lino,"Unknown symbol '"+c.label+"'");return 0}},If:{compile:function(a){var c=a.getLino();a.next();var e=a.condition.compile(a),b=a.getPc();a.addCommand({domain:"core",keyword:"if",lino:c,condition:e});a.compileOne();if(!a.getToken())return a.getCommandAt(b).else=a.getPc(),!0;a.tokenIs("else")?(c=a.getPc(),a.addCommand({domain:"core",keyword:"goto",goto:0}),a.getCommandAt(b).else=a.getPc(),a.next(),a.compileOne(!0),a.getCommandAt(c).goto=a.getPc()):a.getCommandAt(b).else=a.getPc(); 41 return!0},run:function(a){var c=a[a.pc];return a.condition.test(a,c.condition)?c.pc+1:c.else}},Import:{compile:function(a){var c=a.imports,e=a.getProgram();c=$jscomp.makeIterator(c);for(var b=c.next();!b.done;b=c.next()){b=b.value;var d=a.nextToken(),f=b.keyword;if(d===f){if(d=a.compileVariable(b.domain,f,!0),d=e[a.getSymbols()[d.name].pc],d.element=b.element,d.exporter=b.exporter,d.exportedName=b.name,d.extra=b.extra,d.isValueHolder=b.isValueHolder,d.imported=!0,!a.tokenIs("and"))break}else throw Error("Mismatched import variable type for '"+ 42 b.name+"'");}if(a.tokenIs("and"))throw Error("Imports do not match exports");return!0},run:function(a){return a[a.pc].pc+1}},Index:{compile:function(a){var c=a.getLino();if(a.nextIsSymbol(!0)){var e=a.getToken();if(a.nextTokenIs("to")){var b=a.getNextValue();a.addCommand({domain:"core",keyword:"index",lino:c,symbol:e,value:b});return!0}}return!1},run:function(a){var c=a[a.pc],e=a.getSymbolRecord(c.symbol),b=a.getValue(c.value);b>=e.elements&&a.runtimeError(c.lino,"Array index "+b+" is out of range for '"+ 43 e.name+"'");e.index=b;e.imported&&(e.exporter.getSymbolRecord(e.exportedName).index=b);return c.pc+1}},Load:{compile:function(a){var c=a.getLino();switch(a.nextToken()){case "plugin":var e=a.getNextValue();a.addCommand({domain:"core",keyword:"load",lino:c,name:e});return!0}return!1},run:function(a){var c=a[a.pc],e=a.getValue(c.name);switch(c.keyword){case "load":if(a.checkPlugin(e))return c.pc+1;EasyCoder_Plugins.getLocalPlugin(a.getPluginsPath,e,a.getPlugin,a.addLocalPlugin,function(){a.run(c.pc+ 44 1)});return 0}}},Module:{compile:function(a){a.compileVariable("core","module");return!0},run:function(a){a=a[a.pc];a.program=null;return a.pc+1}},Multiply:{compile:function(a){var c=a.getLino();a.next();if(a.isSymbol()){var e=a.getSymbol();var b=a.getCommandAt(e.pc).name}e=a.getValue();a.tokenIs("by")&&a.next();var d=a.getValue();if(a.tokenIs("giving")){a.next();if(a.isSymbol())return b=a.getSymbol(),b=a.getCommandAt(b.pc).name,a.next(),a.addCommand({domain:"core",keyword:"multiply",lino:c,value1:e, 45 value2:d,target:b}),!0;a.warning("core multiply: Expected value holder")}else return"undefined"===typeof b&&a.warning("core multiply: No target variable given"),a.addCommand({domain:"core",keyword:"multiply",lino:c,value2:d,target:b}),!0;return!1},run:function(a){var c=a[a.pc],e=c.value1,b=c.value2,d=a.getSymbolRecord(c.target);if(d.isValueHolder){var f=d.value[d.index];e?(a=a.getValue(e)*a.getValue(b),d.value[d.index]={type:"constant",numeric:!0,content:a}):(!f.numeric&&isNaN(f.content)&&a.nonNumericValueError(c, 46 lino),a=parseInt(f.content)*parseInt(a.getValue(b)),d.value[d.index]={type:"constant",numeric:!0,content:a})}else a.variableDoesNotHoldAValueError(c.lino,d.name);return c.pc+1}},Negate:{compile:function(a){var c=a.getLino();a.next();if(a.isSymbol()){var e=a.getToken();a.next();a.addCommand({domain:"core",keyword:"negate",lino:c,symbol:e});return!0}return!1},run:function(a){var c=a[a.pc],e=a.getSymbolRecord(c.symbol);e.isValueHolder?e.value[e.index]={type:"constant",numeric:!0,content:-e.value[e.index].content}: 47 a.variableDoesNotHoldAValueError(c.lino,e.name);return c.pc+1}},On:{compile:function(a){var c=a.getLino(),e=a.nextToken();switch(e){case "close":case "restore":case "message":case "error":return a.next(),a.addCommand({domain:"core",keyword:"on",lino:c,action:e}),a.completeHandler()}return a.isSymbol()&&(e=a.getSymbolRecord(),"callback"===e.keyword)?(a.next(),a.addCommand({domain:"core",keyword:"on",lino:c,action:e.name}),a.completeHandler()):!1},run:function(a){var c=a[a.pc],e=c.pc+2;switch(c.action){case "close":a.onClose= 48 e;break;case "restore":a.onRestore=e;break;case "message":a.onMessage=e;break;case "error":a.onError=e;break;default:var b=a.getSymbolRecord(c.action);if(b)b.cb=e;else return a.runtimeError(c.lino,"Unknown action '"+c.action+"'"),0}return c.pc+1}},Print:{compile:function(a){var c=a.getLino();a.next();var e=a.getValue();a.addCommand({domain:"core",keyword:"print",lino:c,value:e});return!0},run:function(a){var c=a[a.pc];a=a.getFormattedValue(c.value);console.log("-> "+a);return c.pc+1}},Put:{compile:function(a){var c= 49 a.getLino(),e=a.getNextValue();if(a.tokenIs("into")){if(a.nextIsSymbol()){var b=a.getToken();a.next();a.addCommand({domain:"core",keyword:"put",lino:c,value:e,target:b});return!0}a.warning("core:put: No such variable: '"+a.getToken()+"'")}return!1},run:function(a){var c=a[a.pc],e=a.getSymbolRecord(c.target);e.isValueHolder||a.variableDoesNotHoldAValueError(c.lino,e.name);a=a.evaluate(c.value);e.value[e.index]=a;e.imported&&(e=e.exporter.getSymbolRecord(e.exportedName),e.value[e.index]=a);return c.pc+ 50 1}},Replace:{compile:function(a){var c=a.getLino(),e=a.getNextValue();if(a.tokenIs("with")){var b=a.getNextValue();if(a.tokenIs("in")&&a.nextIsSymbol()){var d=a.getSymbolRecord();a.next();if(d.isValueHolder)return a.addCommand({domain:"core",keyword:"replace",lino:c,original:e,replacement:b,target:d.name}),!0;throw Error("'"+d.name+"' does not hold a value");}}return!1},run:function(a){var c=a[a.pc],e=a.getValue(c.original),b=a.getValue(c.replacement),d=a.getSymbolRecord(c.target);a=a.getValue(d.value[d.index]).split(e).join(b); 51 d.value[d.index]={type:"constant",numeric:!1,content:a};return c.pc+1}},Require:{compile:function(a){var c=a.getLino(),e=a.nextToken();if(["css","js"].includes(e)){var b=a.getNextValue();a.addCommand({domain:"core",keyword:"require",lino:c,type:e,url:b});return!0}throw Error("File type must be 'css' or 'js'");},run:function(a){var c=a[a.pc];a.require(c.type,a.getValue(c.url),function(){a.run(c.pc+1)});return 0}},Return:{compile:function(a){var c=a.getLino();a.next();a.addCommand({domain:"core",keyword:"return", 52 lino:c});return!0},run:function(a){return a.stack.pop()}},Run:{compile:function(a){var c=a.getLino(),e=a.getNextValue(),b=[];if(a.tokenIs("with"))for(;;)if(a.nextIsSymbol(!0)){var d=a.getSymbolRecord();d.exporter=a.getProgram();b.push(d);a.next();if(!a.tokenIs("and"))break}if(a.tokenIs("as")&&a.nextIsSymbol(!0)){var f=a.getSymbolRecord();a.next();if("module"!==f.keyword)throw Error("'"+f.name+"' is not a module");f=f.name}var l=!1;a.tokenIs("nowait")&&(a.next(),l=!0);d=a.getPc();a.addCommand({domain:"core", 53 keyword:"run",lino:c,script:e,imports:b,module:f,nowait:l,then:0});a.tokenIs("then")&&(c=a.getPc(),a.addCommand({domain:"core",keyword:"goto",goto:0}),a.getCommandAt(d).then=a.getPc(),a.next(),a.compileOne(!0),a.addCommand({domain:"core",keyword:"stop"}),a.getCommandAt(c).goto=a.getPc());return!0},run:function(a){a.nextPc=a.pc+1;a.runScript(a);return 0}},Sanitize:{compile:function(a){var c=a.getLino();if(a.nextIsSymbol()){var b=a.getToken();a.next();a.addCommand({domain:"core",keyword:"sanitize", 54 lino:c,name:b});return!0}return!1},run:function(a){var c=a[a.pc];a=a.getSymbolRecord(c.name);a=a.value[a.index];a.content=JSON.stringify(JSON.parse(a.content));return c.pc+1}},Script:{compile:function(a){var c=a.getLino(),b=a.nextToken();a.next();a.addCommand({domain:"core",keyword:"script",lino:c,name:b});return!0},run:function(a){var c=a[a.pc];a.script=c.name;EasyCoder.scripts[c.name]=a;console.log(Date.now()-EasyCoder.timestamp+" ms: Script: "+c.name);return c.pc+1}},Send:{compile:function(a){var c= 55 a.getLino(),b="";a.nextTokenIs("to")||(b=a.getValue());if(a.tokenIs("to")){if(a.nextTokenIs("parent"))var d="parent";else if(a.isSymbol){d=a.getSymbolRecord();if("module"!==d.keyword)throw Error("'"+d.name+"' is not a module");d=d.name}a.next();a.addCommand({domain:"core",keyword:"send",lino:c,message:b,recipient:d})}return!0},run:function(a){var c=a[a.pc],b=a.getValue(c.message);if("parent"===c.recipient){var d=a.parent;d&&a.parent.onMessage&&(d.message=b,d.run(d.onMessage))}else a=a.getSymbolRecord(c.recipient), 56 a.program&&(a.program.message=b,a.program.run(a.program.onMessage));return c.pc+1}},Set:{compile:function(a){var c=a.getLino();if(a.nextIsSymbol()){var b=a.getSymbolRecord();if(!b.isValueHolder)return!1;if(a.nextTokenIs("to")){a.next();for(var d=[];;){a.mark();try{d.push(a.getValue())}catch(k){a.rewind();break}}a.addCommand({domain:"core",keyword:"set",lino:c,request:"setArray",target:b.name,value:d});return!0}a.addCommand({domain:"core",keyword:"set",lino:c,request:"setBoolean",target:b.name});return!0}switch(a.getToken()){case "ready":return a.next(), 57 a.addCommand({domain:"core",keyword:"set",lino:c,request:"setReady"}),!0;case "property":b=a.getNextValue();if(a.tokenIs("of")&&a.nextIsSymbol()&&(d=a.getSymbolRecord(),"variable"===d.keyword&&a.nextTokenIs("to"))){var f=a.getNextValue();a.addCommand({domain:"core",keyword:"set",lino:c,request:"setProperty",target:d.name,name:b,value:f});return!0}break;case "arg":if(b=a.getNextValue(),a.tokenIs("of")&&a.nextIsSymbol()&&(d=a.getSymbolRecord(),a.nextTokenIs("to")))return f=a.getNextValue(),a.addCommand({domain:"core", 58 keyword:"set",lino:c,request:"setArg",target:d.name,name:b,value:f}),!0}a.tokenIs("the")&&a.next();switch(a.getToken()){case "elements":a.next();if(a.tokenIs("of")){a.next();if(!a.isSymbol())throw Error("Unknown variable '"+a.getToken()+"'");b=a.getToken();a.next();if(a.tokenIs("to"))return a.next(),d=a.getValue(),a.addCommand({domain:"core",keyword:"set",lino:c,request:"setElements",symbol:b,value:d}),!0}break;case "encoding":if(a.nextTokenIs("to"))return b=a.getNextValue(),a.addCommand({domain:"core", 59 keyword:"set",request:"encoding",lino:c,encoding:b}),!0;a.addWarning("Unknown encoding option");break;case "payload":if(a.nextTokenIs("of")&&a.nextIsSymbol()&&(b=a.getSymbolRecord(),"callback"===b.keyword&&a.nextTokenIs("to")))return d=a.getNextValue(),a.addCommand({domain:"core",keyword:"set",request:"setPayload",lino:c,callback:b.name,payload:d}),!0}return!1},run:function(a){var c=a[a.pc];switch(c.request){case "setBoolean":var b=a.getSymbolRecord(c.target);b.isValueHolder?(b.value[b.index]={type:"boolean", 60 content:!0},c.numeric=!1):a.variableDoesNotHoldAValueError(c.lino,b.name);break;case "setReady":a.parent.run(a.parent.nextPc);a.parent.nextPc=0;break;case "setElements":b=a.getSymbolRecord(c.symbol);var d=b.elements;b.elements=a.getValue(c.value);b.index=0;if(b.elements>d)for(a=d;a<b.elements;a++)b.value.push({}),b.element.push({});else b.value=b.value.slice(0,b.elements),b.element=b.element.slice(0,b.elements);break;case "setArray":b=a.getSymbolRecord(c.target);b.elements=c.value.length;b.value= 61 c.value;break;case "encoding":a.encoding=a.getValue(c.encoding);break;case "setProperty":b=a.getSymbolRecord(c.target);var f=a.getValue(b.value[b.index]);f||(f="{}");d="";try{d=JSON.parse(f)}catch(n){return a.runtimeError(c.lino,"Can't parse "+b.name),0}f=a.getValue(c.name);var k=a.evaluate(c.value);if(k){if(["{","["].includes(k.content[0]))try{var l=JSON.parse(k.content);d[f]=l}catch(n){a.runtimeError(c.lino,"Can't parse "+b.name)}else k.content instanceof Array?d[f]=k.content:"boolean"===k.type? 62 d[f]=k.content:k.numeric?d[f]=k.content:'{"'===k.content.substr(0,2)?d[f]=JSON.parse(k.content):d[f]=k.content.split('"').join('\\"');b.value[b.index]={type:"constant",numeric:!1,content:JSON.stringify(d)}}break;case "setPayload":a.getSymbolRecord(c.callback).payload=a.getValue(c.payload);break;case "setArg":d=a.getValue(c.name),b=a.getSymbolRecord(c.target),b[d]=a.getValue(c.value)}return c.pc+1}},Sort:{compile:function(a){var c=a.getLino();if(a.nextIsSymbol()){var b=a.getSymbolRecord();if(a.nextTokenIs("with")){var d= 63 a.nextToken();a.next();a.addCommand({domain:"core",keyword:"sort",lino:c,array:b.name,func:d});return!0}}return!1},run:function(a){var c=a[a.pc],b=a.getSymbolRecord(c.array),d=b.value[b.index].content,f=a.getSymbolRecord(c.func).pc;try{var k=JSON.parse(d);k.sort(function(c,e){b.a=c;b.b=e;a.run(f);return b.v});b.value[b.index].content=JSON.stringify(k)}catch(l){a.runtimeError(c.lino,"Can't parse this array")}return c.pc+1}},Stop:{compile:function(a){var c=a.getLino();a.next();if(a.more()&&a.isSymbol()){var b= 64 a.getSymbolRecord();return"module"===b.keyword?(a.next(),a.addCommand({domain:"core",keyword:"stop",lino:c,name:b.name}),!0):!1}a.addCommand({domain:"core",keyword:"stop",lino:c,next:0});return!0},run:function(a){var c=a[a.pc];if(c.name)a.getSymbolRecord(c.name).program.exit();else return 0;return c.pc+1}},Take:{compile:function(a){var c=a.getLino();a.next();var b=a.getValue();if(a.tokenIs("from"))if(a.next(),a.isSymbol()){var d=a.getSymbol();if(a.getCommandAt(d.pc).isValueHolder){if("giving"===a.peek()){d= 65 a.getValue();a.next();var g=a.getToken();a.next();a.addCommand({domain:"core",keyword:"take",lino:c,value1:b,value2:d,target:g})}else d=a.getToken(),a.next(),a.addCommand({domain:"core",keyword:"take",lino:c,value1:b,target:d});return!0}a.warning("core "+f.name+": Expected value holder")}else{d=a.getValue();if(a.tokenIs("giving"))return a.next(),g=a.getToken(),a.next(),a.addCommand({domain:"core",keyword:"take",lino:c,value1:b,value2:d,target:g}),!0;a.warning("core "+f.name+': Expected "giving"')}return!1}, 66 run:function(a){var c=a[a.pc],b=c.value1,d=c.value2,f=a.getSymbolRecord(c.target);if(f.isValueHolder){var g=f.value[f.index];d?(a=a.getValue(d)-a.getValue(b),f.value[f.index]={type:"constant",numeric:!0,content:a}):(!g.numeric&&isNaN(g.content)&&a.nonNumericValueError(c.lino),a=parseInt(a.getValue(g))-parseInt(a.getValue(b)),f.value[f.index]={type:"constant",numeric:!0,content:a})}else a.variableDoesNotHoldAValueError(c.lino,f.name);return c.pc+1}},Toggle:{compile:function(a){var c=a.getLino();a.next(); 67 if(a.isSymbol()){var b=a.getSymbolPc();a.next();a.addCommand({domain:"core",keyword:"toggle",lino:c,symbol:b});return!0}return!1},run:function(a){var c=a[a.pc],b=a[c.symbol];if(b.isValueHolder){var d=a.domain[b.domain];a=d.value.get(a,b.value[b.index]).content;d.value.put(b,{type:"boolean",content:!a})}else a.variableDoesNotHoldAValueError(c.lino,b.name);return c.pc+1}},Variable:{compile:function(a){a.compileVariable("core","variable",!0);return!0},run:function(a){return a[a.pc].pc+1}},Wait:{compile:function(a){var c= 68 a.getLino();a.next();var b=a.getValue(a),d=1E3;switch(a.getToken()){case "milli":case "millis":a.next();d=1;break;case "tick":case "ticks":a.next();d=10;break;case "second":case "seconds":a.next();d=1E3;break;case "minute":case "minutes":a.next(),d=6E4}a.addCommand({domain:"core",keyword:"wait",lino:c,value:b,multiplier:d});return!0},run:function(a){var c=a[a.pc],b=a.getValue(c.value);setTimeout(function(){a.run(c.pc+1)},b*c.multiplier);return 0}},While:{compile:function(a){var c=a.getLino();a.next(); 69 var b=a.getCondition(),d=a.getPc();a.addCommand({domain:"core",keyword:"while",lino:c,condition:b});c=a.getPc();a.addCommand({domain:"core",keyword:"goto",goto:0});a.compileOne();a.addCommand({domain:"core",keyword:"goto",goto:d});a.getCommandAt(c).goto=a.getPc();return!0},run:function(a){return a.condition.test(a,a[a.pc].condition)?a.pc+2:a.pc+1}},getHandler:function(a){switch(a){case "add":return b.Add;case "alias":return b.Alias;case "append":return b.Append;case "begin":return b.Begin;case "callback":return b.Callback; 70 case "clear":return b.Clear;case "close":return b.Close;case "debug":return b.Debug;case "decode":return b.Decode;case "divide":return b.Divide;case "dummy":return b.Dummy;case "encode":return b.Encode;case "end":return b.End;case "exit":return b.Exit;case "filter":return b.Filter;case "fork":return b.Fork;case "go":case "goto":return b.Go;case "gosub":return b.Gosub;case "if":return b.If;case "import":return b.Import;case "index":return b.Index;case "load":return b.Load;case "module":return b.Module; 71 case "multiply":return b.Multiply;case "negate":return b.Negate;case "on":return b.On;case "print":return b.Print;case "put":return b.Put;case "replace":return b.Replace;case "require":return b.Require;case "return":return b.Return;case "run":return b.Run;case "sanitize":return b.Sanitize;case "script":return b.Script;case "send":return b.Send;case "set":return b.Set;case "sort":return b.Sort;case "stop":return b.Stop;case "take":return b.Take;case "toggle":return b.Toggle;case "variable":return b.Variable; 72 case "wait":return b.Wait;case "while":return b.While;default:return!1}},run:function(a){var c=a[a.pc],d=b.getHandler(c.keyword);d||a.runtimeError(c.lino,"Unknown keyword '"+c.keyword+"' in 'core' package");return d.run(a)},isNegate:function(a){return"not"===a.getToken()?(a.next(),!0):!1},value:{compile:function(a){if(a.isSymbol()){var c=a.getToken();switch(a.getSymbolRecord().keyword){case "module":return a.next(),{domain:"core",type:"module",name:c};case "variable":var b=a.nextToken();return["format", 73 "modulo"].includes(b)?(a=a.getNextValue(),{domain:"core",type:b,name:c,value:a}):{domain:"core",type:"symbol",name:c}}return null}c=a.getToken();if("true"===c)return a.next(),{domain:"core",type:"boolean",content:!0};if("false"===c)return a.next(),{domain:"core",type:"boolean",content:!1};if("random"===c)return a.next(),{domain:"core",type:"random",range:a.getValue()};if("cos"===c)return a.next(),c=a.getValue(),a.skip("radius"),a=a.getValue(),{domain:"core",type:"cos",angle_c:c,radius_c:a};if("sin"=== 74 c)return a.next(),c=a.getValue(),a.skip("radius"),a=a.getValue(),{domain:"core",type:"sin",angle_s:c,radius_s:a};if("tan"===c)return a.next(),c=a.getValue(),a.skip("radius"),a=a.getValue(),{domain:"core",type:"tan",angle_t:c,radius_t:a};if("empty"===c)return a.next(),{domain:"core",type:"empty"};if(["now","today"].includes(c))return a.next(),{domain:"core",type:c};if("newline"===c)return a.next(),{domain:"core",type:"newline"};if("break"===c)return a.next(),{domain:"core",type:"break"};if(["encode", 75 "decode","lowercase","hash"].includes(c))return a.next(),a=a.getValue(),{domain:"core",type:c,value:a};if("element"===c)return c=a.getNextValue(),a.tokenIs("of")&&a.nextIsSymbol()&&(b=a.getSymbolRecord(),a.next(),"variable"===b.keyword)?{domain:"core",type:"element",element:c,symbol:b.name}:null;if("property"===c)return c=a.getNextValue(),a.tokenIs("of")&&a.nextIsSymbol()&&(b=a.getSymbolRecord(),a.next(),"variable"===b.keyword)?{domain:"core",type:"property",property:c,symbol:b.name}:null;if("arg"=== 76 c&&(c=a.getNextValue(),a.tokenIs("of")&&a.nextIsSymbol()))return b=a.getSymbolRecord(),a.next(),{domain:"core",type:"arg",value:c,target:b.name};a.tokenIs("the")&&a.next();c=a.getToken();switch(c){case "elements":if(a.nextTokenIs("of")&&a.nextIsSymbol())return b=a.getToken(),a.next(),{domain:"core",type:c,name:b};break;case "index":if(a.nextTokenIs("of")){if(a.nextIsSymbol()){if("in"===a.peek())return c=a.getValue(),a=a.getNextValue(),{domain:"core",type:"indexOf",value1:c,value2:a};b=a.getToken(); 77 a.next();return{domain:"core",type:c,name:b}}c=a.getValue();if(a.tokenIs("in"))return a=a.getNextValue(),{domain:"core",type:"indexOf",value1:c,value2:a}}break;case "value":if(a.nextTokenIs("of"))return a.next(),{domain:"core",type:"valueOf",value:a.getValue()};break;case "length":if(a.nextTokenIs("of"))return a.next(),{domain:"core",type:"lengthOf",value:a.getValue()};break;case "left":case "right":b=a.getNextValue();if(a.tokenIs("of"))return a=a.getNextValue(),{domain:"core",type:c,count:b,value:a}; 78 break;case "from":b=a.getNextValue();var d=a.tokenIs("to")?a.getNextValue():null;if(a.tokenIs("of"))return a=a.getNextValue(),{domain:"core",type:c,from:b,to:d,value:a};break;case "position":if(a.nextTokenIs("of")&&(c=!1,a.nextTokenIs("the")&&a.nextTokenIs("last")&&(a.next(),c=!0),b=a.getValue(),a.tokenIs("in")))return a=a.getNextValue(),{domain:"core",type:"position",needle:b,haystack:a,last:c};break;case "payload":if(a.nextTokenIs("of")&&a.nextIsSymbol()&&(c=a.getSymbolRecord(),"callback"===c.keyword))return a.next(), 79 {domain:"core",type:"payload",callback:c.name};break;case "message":case "error":return a.next(),{domain:"core",type:c}}return null},get:function(a,c){switch(c.type){case "boolean":return{type:"boolean",numeric:!1,content:c.content};case "elements":return{type:"constant",numeric:!0,content:a.getSymbolRecord(c.name).elements};case "index":return{type:"constant",numeric:!0,content:a.getSymbolRecord(c.name).index};case "random":return a=a.evaluate(c.range),{type:"constant",numeric:!0,content:Math.floor(Math.random()* 80 a.content)};case "cos":var b=a.getValue(c.angle_c);a=a.getValue(c.radius_c);return{type:"constant",numeric:!0,content:parseInt(Math.cos(.01745329*parseFloat(b))*a,10)};case "sin":return b=a.getValue(c.angle_s),a=a.getValue(c.radius_s),{type:"constant",numeric:!0,content:parseInt(Math.sin(.01745329*parseFloat(b))*a,10)};case "tan":return b=a.getValue(c.angle_t),a=a.getValue(c.radius_t),{type:"constant",numeric:!0,content:parseInt(Math.tan(.01745329*parseFloat(b))*a,10)};case "valueOf":return a=parseInt(a.getValue(c.value)), 81 {type:"constant",numeric:!0,content:a?a:0};case "lengthOf":return{type:"constant",numeric:!0,content:a.getValue(c.value).length};case "left":return{type:"constant",numeric:!1,content:a.getValue(c.value).substr(0,a.getValue(c.count))};case "right":return b=a.getValue(c.value),{type:"constant",numeric:!1,content:b.substr(b.length-a.getValue(c.count))};case "from":b=a.getValue(c.from);var d=c.to?a.getValue(c.to):null;a=a.getValue(c.value);return{type:"constant",numeric:!1,content:d?a.substr(b,d):a.substr(b)}; 82 case "position":return b=a.getValue(c.needle),a=a.getValue(c.haystack),{type:"constant",numeric:!0,content:c.last?a.lastIndexOf(b):a.indexOf(b)};case "payload":return{type:"constant",numeric:!1,content:a.getSymbolRecord(c.callback).payload};case "modulo":return b=a.getSymbolRecord(c.name),a=a.evaluate(c.value),{type:"constant",numeric:!0,content:b.value[b.index].content%a.content};case "format":b=a.getSymbolRecord(c.name);b=1E3*a.getValue(b.value[b.index]);try{switch(d=JSON.parse(a.getValue(c.value)), 83 d.mode){case "time":return{type:"constant",numeric:!0,content:(new Date(b)).toLocaleTimeString(d.locale,d.options)};default:return{type:"constant",numeric:!0,content:(new Date(b)).toLocaleDateString(d.locale,d.options)}}}catch(p){a.runtimeError(a[a.pc].lino,"Can't parse "+c.value);break}case "empty":return{type:"constant",numeric:!1,content:""};case "now":return{type:"constant",numeric:!0,content:Math.floor(Date.now()/1E3)};case "today":return a=new Date,a.setHours(0,0,0,0),{type:"constant",numeric:!0, 84 content:Math.floor(a.getTime()/1E3)};case "newline":return{type:"constant",numeric:!1,content:"\n"};case "break":return{type:"constant",numeric:!1,content:"<br />"};case "encode":return{type:"constant",numeric:!1,content:a.encode(a.getValue(c.value))};case "decode":return{type:"constant",numeric:!1,content:a.decode(a.getValue(c.value))};case "lowercase":return{type:"constant",numeric:!1,content:a.getValue(c.value).toLowerCase()};case "hash":a=a.getValue(c.value);c=0;if(0===a.length)return c;for(b= 85 0;b<a.length;b++)d=a.charCodeAt(b),c=(c<<5)-c+d;return{type:"constant",numeric:!0,content:c};case "element":b=a.getValue(c.element);c=a.getSymbolRecord(c.symbol);d="";try{d=JSON.parse(a.getValue(c.value[c.index]))[b]}catch(p){a.runtimeError(a[a.pc].lino,"Can't parse JSON");break}return{type:"constant",numeric:!1,content:"object"===typeof d?JSON.stringify(d):d};case "property":d=a.getValue(c.property);c=a.getSymbolRecord(c.symbol);a=a.getValue(c.value[c.index]);b="";if(d&&a)if("object"===typeof a)b= 86 a[d];else if("{"===a.charAt(0))try{b=JSON.parse(a)[d]}catch(p){console.log("Can't parse '"+a+"': "+p.message)}return{type:"constant",numeric:!isNaN(b),content:"object"===typeof b?JSON.stringify(b):b};case "module":return{type:"boolean",numeric:!1,content:a.getSymbolRecord(c.name).program};case "message":return b=a.message,{type:"constant",numeric:!1,content:b};case "error":return b=a.errorMessage,{type:"constant",numeric:!1,content:b};case "indexOf":d=a.getValue(c.value1);c=a.getValue(c.value2);try{return b= 87 JSON.parse(c).indexOf(d),{type:"constant",numeric:!0,content:b}}catch(p){a.runtimeError(a[a.pc].lino,"Can't parse "+c)}break;case "arg":return b=a.getValue(c.value),b=a.getSymbolRecord(c.target)[b],{type:"constant",numeric:!isNaN(b),content:b}}return null},put:function(a,c){a.value[a.index]=c}},condition:{compile:function(a){if(a.isSymbol()){var c=a.getSymbolRecord();if("module"===c.keyword){if(a.nextTokenIs("is")){var d=!0;a.nextTokenIs("not")&&(a.next(),d=!1);if(a.tokenIs("running"))return a.next(), 88 {domain:"core",type:"moduleRunning",name:c.name,sense:d}}return null}}if(a.tokenIs("not"))return{domain:"core",type:"not",value:a.getNextValue()};try{if(d=a.getValue(),"is"===a.getToken()){a.next();var f=b.isNegate(a);switch(a.getToken()){case "numeric":return a.next(),{domain:"core",type:"numeric",value1:d};case "even":return a.next(),{domain:"core",type:"even",value1:d};case "odd":return a.next(),{domain:"core",type:"odd",value1:d};case "greater":a.next();if(a.tokenIs("than")){a.next();var g=a.getValue(); 89 return{domain:"core",type:"greater",value1:d,value2:g,negate:f}}break;case "less":a.next();if(a.tokenIs("than")){a.next();var k=a.getValue();return{domain:"core",type:"less",value1:d,value2:k,negate:f}}break;default:var l=a.getValue();return{domain:"core",type:"is",value1:d,value2:l,negate:f}}}else if(d)return{domain:"core",type:"boolean",value:d}}catch(n){return a.warning("Can't get a value"),0}return null},test:function(a,c){switch(c.type){case "boolean":return a.getValue(c.value);case "numeric":return!isNaN(a.getValue(c.value1)); 90 case "even":return 0===a.getValue(c.value1)%2;case "odd":return 1===a.getValue(c.value1)%2;case "is":return a=a.compare(a,c.value1,c.value2),c.negate?0!==a:0===a;case "greater":return a=a.compare(a,c.value1,c.value2),c.negate?0>=a:0<a;case "less":return a=a.compare(a,c.value1,c.value2),c.negate?0<=a:0>a;case "not":return!a.getValue(c.value);case "moduleRunning":return a=a.getSymbolRecord(c.name).program,c.sense?a:!a}return!1}}};h.exports=b},{}],6:[function(d,h,g){var f=this,b=d("./Tokenise"),a=d("./Compile"), 91 c=d("./Run"),e=d("./Value"),m=d("./Condition"),p=d("./Compare"),k={domain:{core:d("./Core")},runtimeError:function(a,c){this.lino=a;this.reportError({message:"Line "+(0<=a?a:"")+": "+c},k.program);k.program.aborted=!0},nonNumericValueError:function(a){this.runtimeError(a,"Non-numeric value")},variableDoesNotHoldAValueError:function(a,c){this.runtimeError(a,"Variable '"+c+"' does not hold a value")},reportError:function(c,b,d){if(c.message)if(this.compiling||b){d=d?d:b.source;var e=d.tokens;d=d.scriptLines; 92 e=this.compiling?e[a.getIndex()].lino:b[b.pc].lino;b=this.compiling?"Compile error":"Runtime error in '"+b.script+"'";b+=":\n";var f=e-5;for(f=0>f?0:f;f<e;f++){var l=(""+(f+1)).padStart(4," ");b+=l+" "+d[f].line.split("\\s").join(" ")+"\n"}b+=c.message+"\n";c=a.getWarnings();if(c.length)for(b+="Warnings:\n",c=$jscomp.makeIterator(c),d=c.next();!d.done;d=c.next())b+=d.value+"\n";console.log(b);alert(b)}else c="Error: "+c.message,alert(c),console.log(c);else console.log("An error occurred - origin was "+ 93 c.path[0])},getSymbolRecord:function(a){a=this[this.symbols[a].pc];return a.alias?this.getSymbolRecord(a.alias):a.exporter&&a.exporter!=this?a.exporter.getSymbolRecord(a.exportedName):a},verifySymbol:function(a){return this.symbols.hasOwnProperty(a)},encode:function(a){return e.encode(a,this.encoding)},decode:function(a){return e.decode(a,this.encoding)},evaluate:function(a){return e.evaluate(this,a)},getValue:function(a){return e.getValue(this,a)},getFormattedValue:function(a){a=e.evaluate(this, 94 a);if(a.numeric)return a.content;if('{"'===a.content.substr(0,2)||"["===a.content[0])try{var c=JSON.parse(a.content);return JSON.stringify(c,null,2)}catch(q){return this.reportError(q),"{}"}return a.content},getSimpleValue:function(a){return!0===a||!1===a?{type:"boolean",content:a}:{type:"constant",numeric:Number.isInteger(a),content:a}},run:function(a){a&&(k.program=this,c.run(this,a))},exit:function(){c.exit(this)},register:function(a){k.program=a},require:function(a,c,b){var d=document.createElement("css"=== 95 a?"link":"script");switch(a){case "css":d.type="text/css";d.href=c;d.rel="stylesheet";break;case "js":d.type="text/javascript";d.src=c;break;default:return}d.onload=function(){console.log(Date.now()-k.timestamp+" ms: Library "+c+" loaded");b()};document.head.appendChild(d)},isUndefined:function(a){return"undefined"===typeof a},runScript:function(a){var c=a[a.pc],b=a.getValue(c.script),d=c.imports,e=c.module?a.getSymbolRecord(c.module):null;try{k.tokeniseScript(b.split("\n"),d,e,this,c.then)}catch(w){this.reportError(w, 96 k.program,a.source);a.onError?a.run(a.onError):a.parent&&a.parent.onError&&a.parent.run(a.parent.onError);return}c.nowait&&this.run(a.nextPc)},close:function(){},compileScript:function(c,b,d,f){var g=c.tokens;this.compiling=!0;var l=Date.now();a.value=e;a.condition=m;a.domain=k.domain;a.imports=b;b=a.compile(g);var h=Date.now();console.log(h-k.timestamp+" ms: Compiled "+g.length+" tokens in "+(h-l+" ms"));this.compiling=!1;b.EasyCoder=k;b.value=e;b.condition=m;b.compare=p;b.source=c;b.run=this.run; 97 b.exit=this.exit;b.runScript=this.runScript;b.evaluate=this.evaluate;b.getValue=this.getValue;b.getFormattedValue=this.getFormattedValue;b.getSimpleValue=this.getSimpleValue;b.encode=this.encode;b.decode=this.decode;b.domain=this.domain;b.require=this.require;b.isUndefined=this.isUndefined;b.checkPlugin=this.checkPlugin;b.getPlugin=this.getPlugin;b.addLocalPlugin=this.addLocalPlugin;b.getPluginsPath=this.getPluginsPath;b.getSymbolRecord=this.getSymbolRecord;b.verifySymbol=this.verifySymbol;b.runtimeError= 98 this.runtimeError;b.nonNumericValueError=this.nonNumericValueError;b.variableDoesNotHoldAValueError=this.variableDoesNotHoldAValueError;b.reportError=this.reportError;b.register=this.register;b.symbols=a.getSymbols();b.encoding="ec";b.popups=[];b.stack=[];b.queue=[0];b.module=d;b.parent=f;d&&(d.program=b);return b},tokeniseScript:function(a,d,e,f,g){var l=null,h=Date.now();a=b.tokenise(a);var m=Date.now();console.log(m-k.timestamp+" ms: Tokenised "+a.scriptLines.length+" lines in "+(m-h+" ms"));try{l= 99 k.compileScript(a,d,e,f)}catch(u){"stop"!==u.message&&(d=k.program,this.reportError(u,d,a),d.onError&&d.run(d.onError))}l&&(l.onExit=g,c.run(l,0))},tokenize:function(a){var b=a.split("\n");if(!f.tokenising){try{k.tokeniseScript(b)}catch(q){k.reportError(q,null,a)}f.tokenising=!0}},setPluginCount:function(a){f.plugins=[];f.pluginCount=a},checkPlugin:function(a){return k.domain[a]},getPlugin:function(a,b,c){k.domain[a]?c():(a=document.createElement("script"),a.type="text/javascript",a.src=b+"?ver="+ 100 k.version,a.onload=function(){console.log(Date.now()-k.timestamp+" ms: Plugin "+b+" loaded");c()},document.head.appendChild(a))},addGlobalPlugin:function(a,b){f.plugins.push({name:a,handler:b});f.plugins.length===f.pluginCount&&(f.plugins.forEach(function(a){k.domain[a.name]=a.handler}),k.tokenize(f.source))},addLocalPlugin:function(a,b,c){k.domain[a]=b;c()},getPluginsPath:function(){return k.pluginsPath},loadPluginJs:function(a){console.log(Date.now()-k.timestamp+" ms: Load "+a+"/easycoder/plugins.js"); 101 var b=document.createElement("script");b.src=""+window.location.origin+a+"/easycoder/plugins.js?ver="+k.version;b.type="text/javascript";b.onload=function(){EasyCoder_Plugins.getGlobalPlugins(k.timestamp,a,k.setPluginCount,k.getPlugin,k.addGlobalPlugin)};b.onerror=function(){a?k.loadPluginJs(a.slice(0,a.lastIndexOf("/"))):k.reportError({message:"Can't load plugins.js"},k.program,f.source)};document.head.appendChild(b);k.pluginsPath=a},start:function(a){f.source=a;a=window.location.pathname;a=a.endsWith("/")? 102 a.slice(0,-1):"";k.loadPluginJs(a)}};h.exports=k},{"./Compare":2,"./Compile":3,"./Condition":4,"./Core":5,"./Run":7,"./Tokenise":8,"./Value":9}],7:[function(d,h,g){var f={run:function(b,a){var c=[],d=function(a){var b=9999;a.forEach(function(a){a=a.line;for(var c=0;c<a.length&&" "===a[c];)c++;0<c&&c<b&&(b=c)});return 0};if(c.length)c.push(a);else for(b.register(b),c.push(a);0<c.length;)for(b.pc=c.shift(),b.watchdog=0,a={};;){if(1E6<b.watchdog){b.lino=b[b.pc].lino;b.reportError(Error("Program runaway intercepted.\nHave you forgotten to increment a loop counter?", 103 b),b);break}b.watchdog++;var g=b[b.pc].domain;b.debugStep&&console.log(b.script+" "+b.pc+" "+g+":"+b[b.pc].keyword);var h=b.domain[g];if(!h){b.runtimeError(b[b.pc].lino,"Unknown domain '"+g+"'");break}b.pc=h.run(b);if(!b.pc)break;if(b.stop){b.tracing=!1;break}if(b.tracing){g=b[b.pc];h=b.source.scriptLines;var k=d(h),l=document.getElementById("easycoder-tracer");if(!l){b.runtimeError(g.lino,"Element 'easycoder-tracer' was not found");return}l.style.display="block";l.style.visibility="visible";var n= 104 "";if(b.tracer){if(l=document.getElementById("easycoder-tracer-content")){b.tracer.variables.forEach(function(a,c,d){var e=b.getSymbolRecord(a);if(1<e.elements)for(n+=a+": "+e.index+"/"+e.elements+": ",a=0;a<e.elements;a++){var f=e.value[a];n=f?n+(f.content+" "):n+"undefined "}else n=(e=e.value[e.index])?n+(a+": "+e.content):n+(a+": undefined");switch(b.tracer.alignment){case "horizontal":c<d.length-1&&(n+=", ");break;case "vertical":n+="<br>"}});n+="<hr>";for(var q="",r=5;0<r;r--){if(g.lino){var v= 105 h[g.lino-r].line.substr(k);q+='<input type="text" name="'+r+'"'+('value="'+(g.lino-r+1)+": "+v.split("\\s").join(" ")+'"')+'style="width:100%;border:none;enabled:false">'}q+="<br>"}l.innerHTML=n+" "+q;l.style.display="block";a.run=document.getElementById("easycoder-run-button");a.step=document.getElementById("easycoder-step-button");a.run.onclick=function(a){return function(){a.run.blur();b.tracing=!1;document.getElementById("easycoder-tracer-content").style.display="none";try{f.run(b,b.resume)}catch(t){var c= 106 "Error in run handler: "+t.message;console.log(c);alert(c)}}}(a);a.step.onclick=function(a){return function(){console.log("step");a.step.blur();b.tracing=!0;document.getElementById("easycoder-tracer-content").style.display="block";try{b.run(b.resume)}catch(t){var c="Error in step handler: "+t.message;console.log(c);alert(c)}}}(a)}b.resume=b.pc;b.pc=0}break}a={run:a.run,step:a.step}}},exit:function(b){b.onExit&&(b.parent.run(b.onExit),b.module.program=null)}};h.exports=f},{}],8:[function(d,h,g){var f= 107 {markComments:function(b){var a=b.list,c=void 0===b.index?0:b.index,d=void 0===b.inComment?!1:b.inComment,g=void 0===b.newList?[]:b.newList;if(c>=a.length)return g;var h=a[c];b=h.lino;h=h.token;var k={list:a,index:c+1,inComment:!1,newList:g.concat({lino:b,index:c,token:h})};g={list:a,index:c+1,inComment:!0,newList:g.concat({lino:b,index:c,comment:!0,token:h})};return d&&0<c&&b===a[c-1].lino?f.markComments(g):"!"===h.charAt(0)?f.markComments(g):f.markComments(k)},findStrings:function(b){var a=b.original, 108 c=b.line,d=void 0===b.inComment?!1:b.inComment;b=void 0===b.inQuote?!1:b.inQuote;var g=c.charAt(0),h=b&&[" ","\\t"].includes(g)?"\\s":g;if(1===c.length)return h;c=c.substring(1);if("!"===g&&!b)return g+f.findStrings({original:a,line:c,inComment:!0,inQuote:!1});if("`"===g&&!d&&!b)return g+f.findStrings({original:a,line:c,inComment:d,inQuote:!0});if("`"===g&&b)return g+f.findStrings({original:a,line:c,inComment:d,inQuote:!1});if(!d&&!b&&!g.match(/[A-z0-9_\-+*/\- \t]/)){if(["'",'"'].includes(g))throw Error('Bad syntax in "'+ 109 a+'":\nStrings in EasyCoder must be enclosed in backticks.');throw Error('Unrecognised character "'+g+'" in\n"'+a+'".');}return h+f.findStrings({original:a,line:c,inComment:d,inQuote:b})},tokenise:function(b){b=b.map(function(a){var b=a.trim();return b.length?f.findStrings({original:a,line:b}):""}).map(function(a,b){return{lino:b+1,line:a}});var a=b.map(function(a){return a.line.trim().split(/\s+/).map(function(b,c){return{lino:a.lino,index:c,token:b}})});a=[].concat.apply([],a).filter(function(a){return a.token}).map(function(a){return{lino:a.lino, 110 index:a.index,token:a.token.split("\\s").join(" ")}});a=f.markComments({list:a}).filter(function(a){return!a.comment});return{scriptLines:b,tokens:a}}};h.exports=f},{}],9:[function(d,h,g){var f={getItem:function(b){var a=b.getToken();if(!a)return null;if("true"===a)return b.next(),{type:"boolean",content:!0};if("false"===a)return b.next(),{type:"boolean",content:!1};if("`"===a.charAt(0))return b.next(),{type:"constant",numeric:!1,content:a.substring(1,a.length-1)};if(a.charAt(0).match(/[0-9-]/)){var c= 111 eval(a);if(Number.isInteger(c))return b.next(),{type:"constant",numeric:!0,content:c};throw Error("'"+a+"' is not an integer");}a=b.getIndex();c=$jscomp.makeIterator(Object.keys(b.domain));for(var d=c.next();!d.done;d=c.next())if(d=d.value,b.rewindTo(a),d=b.domain[d].value.compile(b))return d;return null},compile:function(b){var a=b.getToken(),c=f.getItem(b);if(!c)throw Error("Undefined value: '"+a+"'");if("cat"===b.getToken()){for(a={type:"cat",numeric:!1,parts:[c]};b.tokenIs("cat");)b.next(),a.parts.push(b.value.getItem(b)); 112 return a}return c},doValue:function(b,a){if("undefined"===typeof a.type)return b.runtimeError(b[b.pc].lino,"Undefined value (variable not initialized?)"),null;switch(a.type){case "cat":return{type:"constant",numeric:!1,content:a.parts.reduce(function(a,c){return a+f.doValue(b,c).content},"")};case "boolean":case "constant":return a;case "symbol":var c=b.getSymbolRecord(a.name);if(c.isValueHolder){if(a=c.value[c.index]){c=a.content;if(null===c||"undefined"===typeof c)a.content=a.numeric?0:"";return a}return null}return b.domain[c.domain].value.get(b, 113 a)}return b.domain[a.domain].value.get(b,a)},constant:function(b,a){return{type:"constant",numeric:a,content:b}},evaluate:function(b,a){if(!a)return{type:"constant",numeric:!1,content:""};var c=f.doValue(b,a);if(c)return c;b.runtimeError(b[b.pc].lino,"Can't decode value: "+a)},getValue:function(b,a){return f.evaluate(b,a).content},encode:function(b,a){if(b)switch(a){case "ec":return b.replace(/'/g,"~sq~").replace(/"/g,"~dq~").replace(/\n/g,"%0a").replace(/\r/g,"%0d");case "url":return encodeURIComponent(b.replace(/\s/g, 114 "+"));case "sanitize":return b.normalize("NFD").replace(/[\u0300-\u036f]/g,"")}return b},decode:function(b,a){if(b)switch(a){case "ec":return b.replace(/~dq~/g,'"').replace(/~sq~/g,"'").replace(/%0a/g,"\n").replace(/%0d/g,"\r");case "url":return decodeURIComponent(b).replace(/\+/g," ")}return b}};h.exports=f},{}]},{},[1]); -
easycoder/trunk/easycoder.js
r2102119 r2107932 4 4 const EasyCoder = require(`./easycoder/Main`); 5 5 6 EasyCoder.version = `2. 3.1`;6 EasyCoder.version = `2.4.0`; 7 7 EasyCoder.timestamp = Date.now(); 8 8 console.log(`EasyCoder loaded; waiting for page`); … … 30 30 var v1 = val1.content; 31 31 var v2 = val2.content; 32 if (val1.numeric && !val2.numeric) { 33 v1 = v1.toString(); 34 } 35 if (!val1.numeric && val2.numeric) { 36 v2 = v2.toString(); 37 } 38 if (!val1.numeric && typeof v1 === `undefined`) { 39 v1 = ``; 40 } 41 if (!val2.numeric && typeof v2 === `undefined`) { 42 v2 = ``; 32 if (v1 && val1.numeric) { 33 if (!val2.numeric) { 34 v2 = typeof v2 === `undefined` ? 0 : parseInt(v2); 35 } 36 } else { 37 if (v2 && val2.numeric) { 38 v2 = v2.toString(); 39 } 40 if (typeof v1 === `undefined`) { 41 v1 = ``; 42 } 43 if (typeof v2 === `undefined`) { 44 v2 = ``; 45 } 43 46 } 44 47 if (v1 > v2) { … … 556 559 }, 557 560 561 Append: { 562 563 compile: compiler => { 564 const lino = compiler.getLino(); 565 const value = compiler.getNextValue(); 566 if (compiler.tokenIs(`to`)) { 567 if (compiler.nextIsSymbol()) { 568 const symbolRecord = compiler.getSymbolRecord(); 569 if (symbolRecord.isValueHolder) { 570 compiler.next(); 571 compiler.addCommand({ 572 domain: `core`, 573 keyword: `append`, 574 lino, 575 value, 576 select: symbolRecord.name 577 }); 578 return true; 579 } 580 } 581 } 582 return false; 583 }, 584 585 run: program => { 586 const command = program[program.pc]; 587 const array = program.getSymbolRecord(command.select); 588 try { 589 const v = program.getValue(command.value); 590 const value = [`{`, `[`].includes(v[0]) ? JSON.parse(v) : v; 591 const item = array.value[array.index]; 592 let a = item.content; 593 if (a) { 594 a = JSON.parse(a); 595 } else { 596 a = []; 597 } 598 a.push(value); 599 item.content = JSON.stringify(a); 600 return command.pc + 1; 601 } catch (err) { 602 program.runtimeError(command.lino, `JSON: Unable to parse value`); 603 return false; 604 } 605 } 606 }, 607 558 608 Begin: { 559 609 … … 857 907 }, 858 908 909 Dummy: { 910 911 compile: compiler => { 912 const lino = compiler.getLino(); 913 compiler.next(); 914 compiler.addCommand({ 915 domain: `core`, 916 keyword: `dummy`, 917 lino 918 }); 919 return true; 920 }, 921 922 run: program => { 923 return program[program.pc].pc + 1; 924 } 925 }, 926 859 927 Encode: { 860 928 … … 920 988 program.exit(); 921 989 return 0; 990 } 991 }, 992 993 Filter: { 994 995 compile: compiler => { 996 const lino = compiler.getLino(); 997 if (compiler.nextIsSymbol()) { 998 const arrayRecord = compiler.getSymbolRecord(); 999 if (compiler.nextTokenIs(`with`)) { 1000 const func = compiler.nextToken(); 1001 compiler.next(); 1002 compiler.addCommand({ 1003 domain: `core`, 1004 keyword: `filter`, 1005 lino, 1006 array: arrayRecord.name, 1007 func 1008 }); 1009 return true; 1010 } 1011 } 1012 return false; 1013 }, 1014 1015 run: program => { 1016 const command = program[program.pc]; 1017 const variable = program.getSymbolRecord(command.array); 1018 const value = variable.value[variable.index].content; 1019 const func = program.getSymbolRecord(command.func).pc; 1020 try { 1021 const array = JSON.parse(value); 1022 const result = array.filter(function (a) { 1023 variable.a = a; 1024 program.run(func); 1025 return variable.v; 1026 }); 1027 variable.value[variable.index].content = JSON.stringify(result); 1028 } catch (err) { 1029 program.runtimeError(command.lino, `Can't parse this array`); 1030 } 1031 return command.pc + 1; 922 1032 } 923 1033 }, … … 1324 1434 case `restore`: 1325 1435 case `message`: 1436 case `error`: 1326 1437 compiler.next(); 1327 1438 compiler.addCommand({ … … 1361 1472 case `message`: 1362 1473 program.onMessage = cb; 1474 break; 1475 case `error`: 1476 program.onError = cb; 1363 1477 break; 1364 1478 default: … … 1726 1840 1727 1841 compile: compiler => { 1842 let name; 1728 1843 const lino = compiler.getLino(); 1729 1844 if (compiler.nextIsSymbol()) { … … 1763 1878 return true; 1764 1879 } 1765 if (compiler.tokenIs(`ready`)) { 1766 compiler.next(); 1767 compiler.addCommand({ 1768 domain: `core`, 1769 keyword: `set`, 1770 lino, 1771 request: `setReady` 1772 }); 1773 return true; 1774 } 1775 if (compiler.tokenIs(`property`)) { 1776 const name = compiler.getNextValue(); 1777 if (compiler.tokenIs(`of`)) { 1778 if (compiler.nextIsSymbol()) { 1779 const targetRecord = compiler.getSymbolRecord(); 1780 if (targetRecord.keyword === `variable`) { 1880 switch (compiler.getToken()) { 1881 case `ready`: 1882 compiler.next(); 1883 compiler.addCommand({ 1884 domain: `core`, 1885 keyword: `set`, 1886 lino, 1887 request: `setReady` 1888 }); 1889 return true; 1890 case `property`: 1891 name = compiler.getNextValue(); 1892 if (compiler.tokenIs(`of`)) { 1893 if (compiler.nextIsSymbol()) { 1894 const targetRecord = compiler.getSymbolRecord(); 1895 if (targetRecord.keyword === `variable`) { 1896 if (compiler.nextTokenIs(`to`)) { 1897 const value = compiler.getNextValue(); 1898 compiler.addCommand({ 1899 domain: `core`, 1900 keyword: `set`, 1901 lino, 1902 request: `setProperty`, 1903 target: targetRecord.name, 1904 name, 1905 value 1906 }); 1907 return true; 1908 } 1909 } 1910 } 1911 } 1912 break; 1913 case `arg`: 1914 name = compiler.getNextValue(); 1915 if (compiler.tokenIs(`of`)) { 1916 if (compiler.nextIsSymbol()) { 1917 const targetRecord = compiler.getSymbolRecord(); 1781 1918 if (compiler.nextTokenIs(`to`)) { 1782 1919 const value = compiler.getNextValue(); … … 1785 1922 keyword: `set`, 1786 1923 lino, 1787 request: `set Property`,1924 request: `setArg`, 1788 1925 target: targetRecord.name, 1789 1926 name, … … 1794 1931 } 1795 1932 } 1796 }1797 1933 } 1798 1934 if (compiler.tokenIs(`the`)) { 1799 1935 compiler.next(); 1800 1936 } 1801 if (compiler.tokenIs(`elements`)) { 1802 compiler.next(); 1803 if (compiler.tokenIs(`of`)) { 1937 switch (compiler.getToken()) { 1938 case `elements`: 1804 1939 compiler.next(); 1805 if (!compiler.isSymbol()) { 1806 throw new Error(`Unknown variable '${compiler.getToken()}'`); 1807 } 1808 const symbol = compiler.getToken(); 1809 compiler.next(); 1810 if (compiler.tokenIs(`to`)) { 1940 if (compiler.tokenIs(`of`)) { 1811 1941 compiler.next(); 1812 // get the value 1813 const value = compiler.getValue(); 1942 if (!compiler.isSymbol()) { 1943 throw new Error(`Unknown variable '${compiler.getToken()}'`); 1944 } 1945 const symbol = compiler.getToken(); 1946 compiler.next(); 1947 if (compiler.tokenIs(`to`)) { 1948 compiler.next(); 1949 // get the value 1950 const value = compiler.getValue(); 1951 compiler.addCommand({ 1952 domain: `core`, 1953 keyword: `set`, 1954 lino, 1955 request: `setElements`, 1956 symbol, 1957 value 1958 }); 1959 return true; 1960 } 1961 } 1962 break; 1963 case `encoding`: 1964 if (compiler.nextTokenIs(`to`)) { 1965 const encoding = compiler.getNextValue(); 1814 1966 compiler.addCommand({ 1815 1967 domain: `core`, 1816 1968 keyword: `set`, 1969 request: `encoding`, 1817 1970 lino, 1818 request: `setElements`, 1819 symbol, 1820 value 1971 encoding 1821 1972 }); 1822 1973 return true; 1823 1974 } 1824 } 1825 } 1826 if (compiler.tokenIs(`encoding`)) { 1827 if (compiler.nextTokenIs(`to`)) { 1828 const encoding = compiler.getNextValue(); 1829 compiler.addCommand({ 1830 domain: `core`, 1831 keyword: `set`, 1832 request: `encoding`, 1833 lino, 1834 encoding 1835 }); 1836 return true; 1837 } 1838 compiler.addWarning(`Unknown encoding option`); 1839 return false; 1840 } 1841 if (compiler.tokenIs(`payload`)) { 1842 if (compiler.nextTokenIs(`of`)) { 1843 if (compiler.nextIsSymbol()) { 1844 const callbackRecord = compiler.getSymbolRecord(); 1845 if (callbackRecord.keyword === `callback`) { 1846 if (compiler.nextTokenIs(`to`)) { 1847 const payload = compiler.getNextValue(); 1848 compiler.addCommand({ 1849 domain: `core`, 1850 keyword: `set`, 1851 request: `setPayload`, 1852 lino, 1853 callback: callbackRecord.name, 1854 payload 1855 }); 1856 return true; 1975 compiler.addWarning(`Unknown encoding option`); 1976 break; 1977 case `payload`: 1978 if (compiler.nextTokenIs(`of`)) { 1979 if (compiler.nextIsSymbol()) { 1980 const callbackRecord = compiler.getSymbolRecord(); 1981 if (callbackRecord.keyword === `callback`) { 1982 if (compiler.nextTokenIs(`to`)) { 1983 const payload = compiler.getNextValue(); 1984 compiler.addCommand({ 1985 domain: `core`, 1986 keyword: `set`, 1987 request: `setPayload`, 1988 lino, 1989 callback: callbackRecord.name, 1990 payload 1991 }); 1992 return true; 1993 } 1857 1994 } 1858 1995 } 1859 1996 } 1860 }1861 1997 } 1862 1998 return false; … … 1885 2021 case `setElements`: 1886 2022 const symbol = program.getSymbolRecord(command.symbol); 2023 const oldCount = symbol.elements; 1887 2024 symbol.elements = program.getValue(command.value); 1888 2025 symbol.index = 0; 1889 symbol.value = []; 1890 symbol.element = []; 1891 for (var n = 0; n < symbol.elements; n++) { 1892 symbol.value.push({}); 1893 symbol.element.push({}); 2026 if (symbol.elements > oldCount) { 2027 for (var n = oldCount; n < symbol.elements; n++) { 2028 symbol.value.push({}); 2029 symbol.element.push({}); 2030 } 2031 } else { 2032 symbol.value = symbol.value.slice(0, symbol.elements); 2033 symbol.element = symbol.element.slice(0, symbol.elements); 1894 2034 } 1895 2035 break; … … 1918 2058 const itemValue = program.evaluate(command.value); 1919 2059 if (itemValue) { 1920 if (itemValue.content instanceof Array) { 1921 targetJSON[itemName] = JSON.stringify(itemValue.content); 1922 } else if (itemValue.type === `boolean`) { 1923 targetJSON[itemName] = itemValue.content; 2060 if ([`{`, `[`].includes(itemValue.content[0])) { 2061 try { 2062 const parsed = JSON.parse(itemValue.content); 2063 targetJSON[itemName] = parsed; 2064 } catch (err) { 2065 program.runtimeError(command.lino, `Can't parse ${targetRecord.name}`); 2066 } 1924 2067 } else { 1925 targetJSON[itemName] = itemValue.numeric ? itemValue.content : itemValue.content.substr(0, 2) === `{"` ? JSON.parse(itemValue.content) : itemValue.content.split(`"`).join(`\\"`); 2068 if (itemValue.content instanceof Array) { 2069 targetJSON[itemName] = itemValue.content; 2070 } else if (itemValue.type === `boolean`) { 2071 targetJSON[itemName] = itemValue.content; 2072 } else if (itemValue.numeric) { 2073 targetJSON[itemName] = itemValue.content; 2074 } else if (itemValue.content.substr(0, 2) === `{"`) { 2075 targetJSON[itemName] = JSON.parse(itemValue.content); 2076 } else { 2077 targetJSON[itemName] = itemValue.content.split(`"`).join(`\\"`); 2078 } 1926 2079 } 1927 2080 targetRecord.value[targetRecord.index] = { … … 1935 2088 program.getSymbolRecord(command.callback).payload = program.getValue(command.payload); 1936 2089 break; 2090 case `setArg`: 2091 const name = program.getValue(command.name); 2092 targetRecord = program.getSymbolRecord(command.target); 2093 targetRecord[name] = program.getValue(command.value); 2094 break; 1937 2095 default: 1938 2096 break; 2097 } 2098 return command.pc + 1; 2099 } 2100 }, 2101 2102 Sort: { 2103 2104 compile: compiler => { 2105 const lino = compiler.getLino(); 2106 if (compiler.nextIsSymbol()) { 2107 const arrayRecord = compiler.getSymbolRecord(); 2108 if (compiler.nextTokenIs(`with`)) { 2109 const func = compiler.nextToken(); 2110 compiler.next(); 2111 compiler.addCommand({ 2112 domain: `core`, 2113 keyword: `sort`, 2114 lino, 2115 array: arrayRecord.name, 2116 func 2117 }); 2118 return true; 2119 } 2120 } 2121 return false; 2122 }, 2123 2124 run: program => { 2125 const command = program[program.pc]; 2126 const variable = program.getSymbolRecord(command.array); 2127 const value = variable.value[variable.index].content; 2128 const func = program.getSymbolRecord(command.func).pc; 2129 try { 2130 const array = JSON.parse(value); 2131 array.sort(function (a, b) { 2132 variable.a = a; 2133 variable.b = b; 2134 program.run(func); 2135 return variable.v; 2136 }); 2137 variable.value[variable.index].content = JSON.stringify(array); 2138 } catch (err) { 2139 program.runtimeError(command.lino, `Can't parse this array`); 1939 2140 } 1940 2141 return command.pc + 1; … … 2230 2431 case `alias`: 2231 2432 return EasyCoder_Core.Alias; 2433 case `append`: 2434 return EasyCoder_Core.Append; 2232 2435 case `begin`: 2233 2436 return EasyCoder_Core.Begin; … … 2244 2447 case `divide`: 2245 2448 return EasyCoder_Core.Divide; 2449 case `dummy`: 2450 return EasyCoder_Core.Dummy; 2246 2451 case `encode`: 2247 2452 return EasyCoder_Core.Encode; … … 2250 2455 case `exit`: 2251 2456 return EasyCoder_Core.Exit; 2457 case `filter`: 2458 return EasyCoder_Core.Filter; 2252 2459 case `fork`: 2253 2460 return EasyCoder_Core.Fork; … … 2293 2500 case `set`: 2294 2501 return EasyCoder_Core.Set; 2502 case `sort`: 2503 return EasyCoder_Core.Sort; 2295 2504 case `stop`: 2296 2505 return EasyCoder_Core.Stop; … … 2499 2708 return null; 2500 2709 } 2710 if (token === `arg`) { 2711 const value = compiler.getNextValue(); 2712 if (compiler.tokenIs(`of`)) { 2713 if (compiler.nextIsSymbol()) { 2714 const target = compiler.getSymbolRecord(); 2715 compiler.next(); 2716 return { 2717 domain: `core`, 2718 type: `arg`, 2719 value, 2720 target: target.name 2721 }; 2722 } 2723 } 2724 } 2501 2725 if (compiler.tokenIs(`the`)) { 2502 2726 compiler.next(); … … 2505 2729 switch (type) { 2506 2730 case `elements`: 2507 case `index`:2508 2731 if (compiler.nextTokenIs(`of`)) { 2509 2732 if (compiler.nextIsSymbol()) { … … 2515 2738 name 2516 2739 }; 2740 } 2741 } 2742 break; 2743 case `index`: 2744 if (compiler.nextTokenIs(`of`)) { 2745 if (compiler.nextIsSymbol()) { 2746 if (compiler.peek() === `in`) { 2747 const value1 = compiler.getValue(); 2748 const value2 = compiler.getNextValue(); 2749 return { 2750 domain: `core`, 2751 type: `indexOf`, 2752 value1, 2753 value2 2754 }; 2755 } else { 2756 const name = compiler.getToken(); 2757 compiler.next(); 2758 return { 2759 domain: `core`, 2760 type, 2761 name 2762 }; 2763 } 2764 } else { 2765 const value1 = compiler.getValue(); 2766 if (compiler.tokenIs(`in`)) { 2767 const value2 = compiler.getNextValue(); 2768 return { 2769 domain: `core`, 2770 type: `indexOf`, 2771 value1, 2772 value2 2773 }; 2774 } 2517 2775 } 2518 2776 } … … 2818 3076 elementContent = JSON.parse(program.getValue(elementRecord.value[elementRecord.index]))[element]; 2819 3077 } catch (err) { 2820 program.runtimeError( command.lino, `Can't parse JSON`);3078 program.runtimeError(program[program.pc].lino, `Can't parse JSON`); 2821 3079 return null; 2822 3080 } … … 2868 3126 content 2869 3127 }; 3128 case `indexOf`: 3129 const value1 = program.getValue(value.value1); 3130 const value2 = program.getValue(value.value2); 3131 try { 3132 content = JSON.parse(value2).indexOf(value1); 3133 return { 3134 type: `constant`, 3135 numeric: true, 3136 content 3137 }; 3138 } catch (err) { 3139 program.runtimeError(program[program.pc].lino, `Can't parse ${value2}`); 3140 } 3141 break; 3142 case `arg`: 3143 const name = program.getValue(value.value); 3144 const target = program.getSymbolRecord(value.target); 3145 content = target[name]; 3146 return { 3147 type: `constant`, 3148 numeric: !isNaN(content), 3149 content 3150 }; 2870 3151 } 2871 3152 return null; 2872 3153 }, 3154 2873 3155 put: (symbol, value) => { 2874 3156 symbol.value[symbol.index] = value; … … 3040 3322 }, 3041 3323 3042 setupTracer: function () {3043 const tracer = document.getElementById(`easycoder-tracer`);3044 if (tracer) {3045 tracer.innerHTML = `<div><input id="easycoder-run-button" type="button" value="Run" />` + `<input id="easycoder-step-button" type="button" value="Step" />` + `<div id="easycoder-tracer-content" style="border:1px solid black;padding:4px";width:100%>` + `</div>`;3046 tracer.style.display = `none`;3047 }3048 },3049 3050 3324 runtimeError: function (lino, message) { 3051 3325 this.lino = lino; … … 3053 3327 message: `Line ${lino >= 0 ? lino : ``}: ${message}` 3054 3328 }, EasyCoder.program); 3055 program.aborted = true;3329 EasyCoder.program.aborted = true; 3056 3330 }, 3057 3331 nonNumericValueError: function (lino) { … … 3137 3411 return v.content; 3138 3412 } 3139 if (v.content.substr(0, 2) === `{"` || v.content.charAt(0) === `[`) { 3140 return JSON.stringify(JSON.parse(v.content), null, 2); 3413 if (v.content.substr(0, 2) === `{"` || v.content[0] === `[`) { 3414 try { 3415 const parsed = JSON.parse(v.content); 3416 return JSON.stringify(parsed, null, 2); 3417 } catch (err) { 3418 this.reportError(err); 3419 return `{}`; 3420 } 3141 3421 } 3142 3422 return v.content; … … 3203 3483 const imports = command.imports; 3204 3484 const moduleRecord = command.module ? program.getSymbolRecord(command.module) : null; 3205 EasyCoder.tokeniseScript(script.split(`\n`), imports, moduleRecord, this, command.then); 3485 try { 3486 EasyCoder.tokeniseScript(script.split(`\n`), imports, moduleRecord, this, command.then); 3487 } catch (err) { 3488 this.reportError(err, EasyCoder.program, program.source); 3489 if (program.onError) { 3490 program.run(program.onError); 3491 } else if (program.parent && program.parent.onError) { 3492 program.parent.run(program.parent.onError); 3493 } 3494 return; 3495 } 3206 3496 if (command.nowait) { 3207 3497 this.run(program.nextPc); … … 3281 3571 } catch (err) { 3282 3572 if (err.message !== `stop`) { 3283 this.reportError(err, EasyCoder.program, source); 3284 } 3285 } 3286 this.setupTracer(); 3573 const p = EasyCoder.program; 3574 this.reportError(err, p, source); 3575 if (p.onError) { 3576 p.run(p.onError); 3577 } 3578 } 3579 } 3287 3580 if (program) { 3288 3581 program.onExit = then; … … 3491 3784 for (var n = 5; n > 0; n--) { 3492 3785 if (command.lino) { 3493 trace += `<input type="text" name="${n}"` + `value="${scriptLines[command.lino - n].line.substr(minSpace)}"` + `style="width:100%;border:none;enabled:false">`; 3786 const text = scriptLines[command.lino - n].line.substr(minSpace); 3787 trace += `<input type="text" name="${n}"` + `value="${command.lino - n + 1}: ${text.split(`\\s`).join(` `)}"` + `style="width:100%;border:none;enabled:false">`; 3494 3788 } 3495 3789 trace += `<br>`; -
easycoder/trunk/easycoder.php
r2102119 r2107932 4 4 * Plugin URI: https://easycoder.software 5 5 * Description: Control the appearance and behavior of your posts and pages by embedding simple English-like scripts, without the need to learn JavaScript. 6 * Version: 2. 3.16 * Version: 2.4.0 7 7 * Author: EasyCoder Software 8 8 * Author URI: https://easycoder.software … … 17 17 function easycoder_enqueue_script() { 18 18 wp_enqueue_script('easycoder_script', plugin_dir_url( __FILE__ ) 19 . 'easycoder-min.js', array(), '2. 3.1');19 . 'easycoder-min.js', array(), '2.4.0'); 20 20 } 21 21 -
easycoder/trunk/plugins/browser.js
r2102119 r2107932 167 167 compile: (compiler) => { 168 168 const lino = compiler.getLino(); 169 if (compiler.nextIsSymbol()) { 169 if (compiler.nextTokenIs(`body`)) { 170 compiler.next(); 171 compiler.addCommand({ 172 domain: `browser`, 173 keyword: `clear`, 174 lino, 175 name: null 176 }); 177 return true; 178 } 179 if (compiler.isSymbol()) { 170 180 const symbolRecord = compiler.getSymbolRecord(); 171 181 if (symbolRecord.extra === `dom`) { … … 185 195 run: (program) => { 186 196 const command = program[program.pc]; 187 const targetRecord = program.getSymbolRecord(command.name); 188 const target = targetRecord.element[targetRecord.index]; 189 target.innerHTML = ``; 197 if (command.name) { 198 const targetRecord = program.getSymbolRecord(command.name); 199 const target = targetRecord.element[targetRecord.index]; 200 target.innerHTML = ``; 201 } else { 202 document.body.innerHTML = ``; 203 } 190 204 return command.pc + 1; 191 205 } … … 293 307 ].includes(keyword)) { 294 308 if (compiler.nextTokenIs(`in`)) { 295 if (compiler.nextIsSymbol()) { 309 if (compiler.nextTokenIs(`body`)) { 310 compiler.next(); 311 compiler.addCommand({ 312 domain: `browser`, 313 keyword: `create`, 314 lino, 315 name: symbolRecord.name, 316 parent: `body` 317 }); 318 return true; 319 } 320 if (compiler.isSymbol()) { 296 321 const parentRecord = compiler.getSymbolRecord(); 297 322 compiler.next(); … … 1261 1286 } 1262 1287 } 1263 const key = compiler.getValue(); 1264 if (compiler.tokenIs(`from`)) { 1265 if (compiler.nextTokenIs(`storage`)) { 1266 compiler.next(); 1267 compiler.addCommand({ 1268 domain: `browser`, 1269 keyword: `remove`, 1270 type: `removeStorage`, 1271 key 1272 }); 1273 return true; 1274 } 1288 try { 1289 const key = compiler.getValue(); 1290 if (compiler.tokenIs(`from`)) { 1291 if (compiler.nextTokenIs(`storage`)) { 1292 compiler.next(); 1293 compiler.addCommand({ 1294 domain: `browser`, 1295 keyword: `remove`, 1296 type: `removeStorage`, 1297 key 1298 }); 1299 return true; 1300 } 1301 } 1302 } catch (err) { 1303 return false; 1275 1304 } 1276 1305 return false; … … 1366 1395 const lino = compiler.getLino(); 1367 1396 if (compiler.nextIsSymbol()) { 1397 const targetRecord = compiler.getSymbolRecord(); 1398 if (targetRecord.keyword === `select`) { 1399 if (compiler.nextTokenIs(`from`)) { 1400 if (compiler.nextIsSymbol()) { 1401 const sourceRecord = compiler.getSymbolRecord(); 1402 if (sourceRecord.keyword === `variable`) { 1403 var display = null; 1404 if (compiler.nextTokenIs(`as`)) { 1405 display = compiler.getNextValue(); 1406 } 1407 compiler.addCommand({ 1408 domain: `browser`, 1409 keyword: `set`, 1410 lino, 1411 type: `setSelect`, 1412 select: targetRecord.name, 1413 source: sourceRecord.name, 1414 display 1415 }); 1416 return true; 1417 } 1418 } 1419 } 1420 return false; 1421 } 1368 1422 const target = compiler.getToken(); 1369 1423 if (compiler.nextTokenIs(`from`)) { … … 1621 1675 let targetId; 1622 1676 let cssId; 1677 let selectRecord; 1623 1678 switch (command.type) { 1624 1679 case `setContentVar`: … … 1658 1713 target.innerHTML = value; 1659 1714 break; 1715 } 1716 break; 1717 case `setSelect`: 1718 // The source is assumed to be an array 1719 sourceRecord = program.getSymbolRecord(command.source); 1720 const sourceData = program.getValue(sourceRecord.value[sourceRecord.index]); 1721 var itemArray = ``; 1722 try { 1723 itemArray = JSON.parse(sourceData); 1724 } catch (err) { 1725 program.runtimeError(command.lino, `Can't parse JSON`); 1726 return 0; 1727 } 1728 // The target is assumed to be a SELECT 1729 selectRecord = program.getSymbolRecord(command.select); 1730 const select = selectRecord.element[selectRecord.index]; 1731 select.options.length = 0; 1732 // Get the name of the display field 1733 const display = program.getValue(command.display); 1734 // For each item, set the title and inner HTML 1735 itemArray.forEach(function (item) { 1736 const title = display ? program.decode(item[display]) : null; 1737 const opt = document.createElement(`option`); 1738 const innerHTML = title ? title : item; 1739 opt.innerHTML = innerHTML; 1740 const value = title ? JSON.stringify(item) : item; 1741 opt.value = value; 1742 select.appendChild(opt); 1743 }); 1744 if (display) { 1745 select.selectedIndex = itemArray.indexOf(display); 1746 } else { 1747 select.selectedIndex = -1; 1660 1748 } 1661 1749 break; … … 1753 1841 break; 1754 1842 case `setDefault`: 1755 constselectRecord = program.getSymbolRecord(command.name);1843 selectRecord = program.getSymbolRecord(command.name); 1756 1844 value = program.getValue(command.value); 1757 1845 const element = selectRecord.element[selectRecord.index]; … … 1882 1970 }; 1883 1971 } 1884 program.tracing = true; 1972 if (!program.tracing) { 1973 const tracer = document.getElementById(`easycoder-tracer`); 1974 if (tracer) { 1975 tracer.innerHTML = 1976 `<div><input id="easycoder-run-button" type="button" value="Run" />` + 1977 `<input id="easycoder-step-button" type="button" value="Step" />` + 1978 `<div id="easycoder-tracer-content" style="border:1px solid black;padding:4px";width:100%>` + 1979 `</div>`; 1980 tracer.style.display = `none`; 1981 } 1982 program.tracing = true; 1983 } 1885 1984 program.stop = false; 1886 1985 break; … … 1939 2038 const command = program[program.pc]; 1940 2039 const fileSpec = program.getSymbolRecord(command.file); 1941 const path = program.getValue(command.path).replace(/~/g, `/`); 2040 // const path = program.getValue(command.path).replace(/~/g, `/`); 2041 const path = program.getValue(command.path); 1942 2042 const progressSpec = program.getSymbolRecord(command.progress); 1943 2043 const statusSpec = program.getSymbolRecord(command.status); … … 1986 2086 if (this.readyState === 4) { 1987 2087 const command = program.ajaxCommand; 1988 switch (this.status) { 2088 const status = this.status; 2089 switch (status) { 1989 2090 case 200: 1990 2091 program.run(command.pc + 1); … … 1993 2094 break; 1994 2095 default: 1995 let error = ``;1996 2096 try { 1997 error = JSON.parse(this.responseText ? this.responseText : `{}`); 1998 } catch (err) { 1999 program.runtimeError(command.lino, `Can't parse JSON`); 2000 return 0; 2001 } 2002 try { 2003 program.runtimeError(command.lino, error.message); 2097 program.runtimeError(command.lino, `Error ${status}`); 2004 2098 } catch (err) { 2005 2099 program.reportError(err, program); … … 2010 2104 }; 2011 2105 program.ajaxCommand = command; 2012 ajax.open(`POST`, `${window.location.origin}/wp-content/plugins/easycoder/rest.php/_upload`); 2106 const postpath = path.startsWith(`http`) ? path : `${window.location.origin}/${EasyCoder_Plugins.rest()}/${path}`; 2107 ajax.open(`POST`, postpath); 2013 2108 ajax.send(formData); 2014 2109 } … … 2085 2180 case `on`: 2086 2181 return EasyCoder_Browser.On; 2182 case `option`: 2183 return EasyCoder_Browser.Option; 2087 2184 case `p`: 2088 2185 return EasyCoder_Browser.P; … … 2170 2267 2171 2268 let type = compiler.getToken(); 2172 if ([`mobile`, `portrait`, `landscape`, `br`, `location`, `key` ].includes(type)) {2269 if ([`mobile`, `portrait`, `landscape`, `br`, `location`, `key`, `hostname`].includes(type)) { 2173 2270 compiler.next(); 2174 2271 return { … … 2511 2608 content: program.key 2512 2609 }; 2610 case `hostname`: 2611 return { 2612 type: `constant`, 2613 numeric: false, 2614 content: location.hostname 2615 }; 2513 2616 } 2514 2617 } -
easycoder/trunk/plugins/json.js
r2102119 r2107932 96 96 break; 97 97 case `delete`: 98 const name = compiler.getNextValue(); 99 if (compiler.tokenIs(`from`)) { 100 if (compiler.nextIsSymbol()) { 101 const targetRecord = compiler.getSymbolRecord(); 102 if (targetRecord.keyword === `variable`) { 103 compiler.next(); 104 compiler.addCommand({ 105 domain: `json`, 106 keyword: `json`, 107 lino, 108 request, 109 name, 110 target: targetRecord.name 111 }); 112 return true; 98 const what = compiler.nextToken(); 99 if ([`property`, `element`].includes(what)) { 100 const value = compiler.getNextValue(); 101 if ([`from`, `of`].includes(compiler.getToken())) { 102 if (compiler.nextIsSymbol()) { 103 const targetRecord = compiler.getSymbolRecord(); 104 if (targetRecord.keyword === `variable`) { 105 compiler.next(); 106 compiler.addCommand({ 107 domain: `json`, 108 keyword: `json`, 109 lino, 110 request, 111 what, 112 value, 113 target: targetRecord.name 114 }); 115 return true; 116 } 113 117 } 114 118 } … … 161 165 case `split`: 162 166 item = compiler.getNextValue(); 163 if (compiler.tokenIs(`into`)) {167 if (compiler.tokenIs(`into`)) { 164 168 if (compiler.nextIsSymbol()) { 165 169 const targetRecord = compiler.getSymbolRecord(); … … 291 295 break; 292 296 case `delete`: 293 const name = program.getValue(command.name); 294 targetRecord = program.getSymbolRecord(command.target); 295 record = JSON.parse(targetRecord.value[targetRecord.index].content); 296 delete record[name]; 297 targetRecord.value[targetRecord.index].content = JSON.stringify(record); 297 switch (command.what) { 298 case `property`: 299 const name = program.getValue(command.value); 300 targetRecord = program.getSymbolRecord(command.target); 301 record = JSON.parse(targetRecord.value[targetRecord.index].content); 302 delete record[name]; 303 targetRecord.value[targetRecord.index].content = JSON.stringify(record); 304 break; 305 case `element`: 306 const element = program.getValue(command.value); 307 targetRecord = program.getSymbolRecord(command.target); 308 record = JSON.parse(targetRecord.value[targetRecord.index].content); 309 record.splice(element, 1); 310 targetRecord.value[targetRecord.index].content = JSON.stringify(record); 311 break; 312 } 298 313 break; 299 314 case `rename`: … … 414 429 const item = program.getValue(value.item); 415 430 const list = JSON.parse(program.getValue(value.list)); 416 content = list.findIndex(function (value) {431 content = list.findIndex(function (value) { 417 432 return value === item; 418 433 }); -
easycoder/trunk/plugins/rest.js
r2102119 r2107932 91 91 var content = request.responseText; 92 92 if (content.length > 0 && ![`[`, `{`].includes(content.charAt(0))) { 93 content = program.decode(content);93 // content = program.decode(content); 94 94 } 95 95 if (command.target) { … … 131 131 } else { 132 132 request.setRequestHeader(`Content-Type`, `application/text; charset=UTF-8`); 133 // console.log(`value=${program.encode(value)}`); 134 request.send(program.encode(value)); 133 request.send(value); 135 134 } 136 135 break; -
easycoder/trunk/readme.txt
r2102119 r2107932 32 32 *EasyCoder* scripts are embedded in your page or post, inside a special "preformatted" tag. When the page loads, *EasyCoder* looks for this element then compiles and runs the script it contains. When it interacts with HTML elements it attaches their IDs to its own variables, so your HTML and its controlling script are in the same file. 33 33 34 The *EasyCoder* core module is currently about 5 1k bytes in its minimised form and it downloads its own plugin modules from a growing library. Its performance is good because it precompiles scripts - a process that takes only tens of milliseconds - and the compiled code for each command is only a thin wrapper around the corresponding JavaScript functionality.34 The *EasyCoder* core module is currently about 56k bytes in its minimised form and it downloads its own plugin modules from a growing library. Its performance is good because it precompiles scripts - a process that takes only tens of milliseconds - and the compiled code for each command is only a thin wrapper around the corresponding JavaScript functionality. 35 35 36 36 When *EasyCoder* detects an error, either in compilation or at runtime, it opens a popup window with a friendly error message that tries to tell you what went wrong and where in the script it happened. … … 53 53 54 54 == Changelog == 55 56 = 2.4.0 18-jun-2019 = 57 * Sorting & filtering; added the script editor 55 58 56 59 = 2.3.1 7-jun-2019 = -
easycoder/trunk/rest.php
r2102119 r2107932 21 21 22 22 // The properties file is best kept above the site root to prevent access by browsers. 23 // For WordPress, that's 4 levels up from our current location ,the 'plugins/easycoder' folder.23 // For WordPress, that's 4 levels up from our current location in the 'plugins/easycoder' folder. 24 24 $props = array(); 25 25 $filename = '../../../../' . $_SERVER['HTTP_HOST'] . '.txt'; … … 38 38 fclose($file); 39 39 } 40 $resources = $props['resources'] ? $props['resources'] : 'easycoder'; 41 $scripts = $props['scripts'] ? $props['scripts'] : 'easycoder/scripts'; 42 $upload = $props['upload'] ? $props['upload'] : 'easycoder/upload'; 40 43 41 44 // First, the commands that don't require a database connection. … … 46 49 // Endpoint: {site root}/wp-content/plugins/easycoder/rest.php/_list/[{path}] 47 50 // List the contents of a directory 48 if (count($request) ) {51 if (count($request) && $request[0]) { 49 52 $path = '/' . str_replace('~', '/', $request[0]); 50 53 } 51 // Start at the resourcesfolder52 $path = "../../../ resources$path";54 // Start at the easycoder folder 55 $path = "../../../$resources$path"; 53 56 $files = scandir($path); 54 57 print '['; … … 83 86 switch (strtolower($ext)) { 84 87 case 'jpg': 88 case 'jpeg': 85 89 case 'png': 86 90 case 'gif': … … 89 93 } 90 94 } 95 print "{\"name\":\"$file\",\"type\":\"$type\"}"; 91 96 } 92 print "{\"name\":\"$file\",\"type\":\"$type\"}";93 97 } 94 98 } … … 100 104 exit; 101 105 case '_verify': 102 // Endpoint: {site root}/wp-content/plugins/easycoder/rest.php/_verify/{value-to-verify} 103 print password_verify($request[0], $props['password']) ? 'yes' : 'no'; 104 exit; 105 case '_validate': 106 // Endpoint: {site root}/wp-content/plugins/easycoder/rest.php/_verify/{value-to-verify} 107 print password_verify($request[0], $props['password']) ? 'yes' : 'no'; 108 exit; 109 case '_verify2': 110 // Endpoint: {site root}/wp-content/plugins/easycoder/rest.php/_verify/{value-to-verify}/{hash} 111 print password_verify($request[0], $request[1]) ? 'yes' : 'no'; 112 exit; 113 case '_validate': 106 114 // Endpoint: {site root}/wp-content/plugins/easycoder/rest.php/_validate/{value-to-validate}/{encrypted-value} 107 115 print password_verify($request[0], str_replace('~', '/', $request[1])) ? 'yes' : 'no'; … … 109 117 case '_load': 110 118 // Endpoint: {site root}/wp-content/plugins/easycoder/rest.php/_load/{path} 111 $path = '../../../resources/'. str_replace('~', '/', $request[0]);119 $path = "../../../$resources/" . str_replace('~', '/', $request[0]); 112 120 print file_get_contents($path); 121 exit; 122 case '_loadall': 123 // Load all the files in the named folder 124 // Endpoint: {site root}/easycoder/rest.php/_loadall/{path} 125 $path = "../../../$resources/" . str_replace('~', '/', $request[0]); 126 $files = scandir($path); 127 print '['; 128 $flag = false; 129 foreach ($files as $file) { 130 if (strpos($file, '.') !== 0) { 131 if (!is_dir("$path/$file")) { 132 if ($flag) { 133 print ','; 134 } else { 135 $flag = true; 136 } 137 print file_get_contents("$path/$file"); 138 } 139 } 140 } 141 print ']'; 142 exit; 143 case '_scripted': 144 // Endpoint: {site root}/wp-content/plugins/easycoder/rest.php/_scripted 145 print file_get_contents('scripted'); 113 146 exit; 114 147 break; … … 117 150 switch ($table) { 118 151 case '_mkdir': 119 // Endpoint: {site root}/wp-content/plugins/easycoder/rest.php/_mkdir 120 header("Content-Type: application/text"); 121 $path = stripslashes(file_get_contents("php://input")); 122 logger("Create directory $path"); 123 mkdir($path); 152 // Endpoint: {site root}/wp-content/plugins/easycoder/rest.php/_mkdir/{path} 153 $path = "../../../$resources/" . str_replace('~', '/', $request[0]); 154 mkdir($path, 0777, true); 124 155 exit; 125 156 case '_upload': … … 127 158 // Upload a file (an image) to the current directory 128 159 $path = $_POST['path']; 160 $pathsegs = explode("/", $path); 161 $path = str_replace('~', '/', $pathsegs[1]); 129 162 $fileName = $_FILES['source']['name']; 130 163 $tempName = $_FILES['source']['tmp_name']; … … 132 165 $fileSize = $_FILES['source']['size']; 133 166 $fileError = $_FILES['source']['error']; 134 if (!move_uploaded_file($tempName, " $path/$fileName")) {167 if (!move_uploaded_file($tempName, "../../../$path/$fileName")) { 135 168 unlink($tempName); 136 169 http_response_code(400); … … 147 180 exit; 148 181 case '_delete': 149 // Endpoint: {site root}/wp-content/plugins/easycoder/rest.php/_delete 150 header("Content-Type: application/text"); 151 $path = stripslashes(file_get_contents("php://input")); 182 // Endpoint: {site root}/wp-content/plugins/easycoder/rest.php/_delete/{path} 183 $path = "../../../$resources/" . str_replace('~', '/', $request[0]); 152 184 if (is_dir($path)) { 153 rmdir($path);154 } else {155 unlink($path);156 }185 rmdir($path); 186 } else { 187 unlink($path); 188 } 157 189 exit; 158 190 case '_email': … … 173 205 case '_save': 174 206 // Endpoint: {site root}/wp-content/plugins/easycoder/rest.php/_save/{path} 175 $path = '../../../resources/'. str_replace('~', '/', $request[0]);207 $path = "../../../$resources/" . str_replace('~', '/', $request[0]); 176 208 $p = strrpos($path, '/'); 177 209 $dir = substr($path, 0, $p); … … 185 217 unlink($backup); 186 218 copy($path, $backup); 219 file_put_contents($path, $content); 220 exit; 221 case '_ecsave': 222 // Endpoint: {site root}/wp-content/plugins/easycoder/rest.php/_ecsave/{path} 223 $path = str_replace('~', '/', $request[0]); 224 $p = strrpos($path, '/'); 225 if ($p > 0) { 226 $dir = substr($path, 0, $p); 227 mkdir($dir, 0777, true); 228 } 229 header("Content-Type: application/text"); 230 $content = stripslashes(file_get_contents("php://input")); 187 231 file_put_contents($path, $content); 188 232 exit; … … 398 442 print "{\"message\":\"Cannot set record $id of $table.\"}"; 399 443 } 400 mysqli_free_result($result);401 break;444 mysqli_free_result($result); 445 break; 402 446 403 447 case 'name': … … 417 461 http_response_code(201); 418 462 } 419 mysqli_free_result($result);420 break;463 mysqli_free_result($result); 464 break; 421 465 422 466 default: … … 479 523 } 480 524 } 481 mysqli_free_result($result);482 } 483 break;525 mysqli_free_result($result); 526 } 527 break; 484 528 485 529 default:
Note: See TracChangeset
for help on using the changeset viewer.